以编程方式创建 Excel 2007 表格
Posted
技术标签:
【中文标题】以编程方式创建 Excel 2007 表格【英文标题】:Programmatically creating Excel 2007 Sheets 【发布时间】:2008-09-30 14:21:26 【问题描述】:我正在尝试以编程方式创建 Excel 2007 文档。现在,我找到了两种方法:
手动创建 XML,如 this post 中所述 使用第三方库,例如 ExcelPackage。目前,我使用 ExcelPackage,它有一些非常严重的缺点和问题。由于我不需要创建过于复杂的 Excel 工作表(最“复杂”的事情是我明确需要将单元格类型设置为数字或文本),我接下来正在寻找选项 1,但我只是想知道是否有生成 Excel 2007 表格的任何其他良好且受支持的方法?如果可以创建它们而无需将它们保存到硬盘驱动器,即生成并直接将它们输出到流中,则可以获得奖励积分。
.net 3.0 是这里的目标,没有 3.5 的好处 :(
编辑:到目前为止谢谢。 XML SDK 确实只是 3.5,但俄罗斯轮盘...呃... COM 互操作也是我想尽可能避免的事情,特别是因为 Excel 2007 有一些复杂但仍然很容易创建文档格式。我会看看发布的各种链接和提示。
【问题讨论】:
【参考方案1】:您可以尝试使用Office Open XML SDK。这将允许您使用MemoryStream
在内存中创建 Excel 文件,并且比手动生成所有 XML 更容易。
正如 Brian Kim 所指出的,SDK 的 2.0 版需要 .NET 3.5,而您说它不可用。支持 .NET 3.0 的 SDK 的Version 1 也可用。它并不完整,但至少可以帮助您管理文档的 XML 部分以及它们之间的关系。
【讨论】:
这似乎需要 .net 3.5。【参考方案2】:我只是生成html表格,可以用Excel打开:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Wnioski</title>
<style type="text/css">
<!--
br mso-data-placement: same-cell;
td mso-number-format: \@; mso-displayed-decimal-separator: ".";
-->
</style>
<table>
<tr style="height:15.0pt">
<td style="mso-number-format: general">474</td>
<td>474</td>
<tr>
<td>data2</td>
<td>data3</td>
<tr>
<td style="mso-number-format: "yyyy-mm-dd"">2008-10-01</td>
<td style="mso-number-format: standard">0.00</td>
<tr>
<td style="mso-number-format: general">line1<br>line2<br>line3</td>
<td></td>
</table>
这也可以作为 Word 中序列字母的数据源,适用于 OpenOffice calc 等。而且生成起来非常简单。
【讨论】:
看起来您可能在该示例中缺少一些 标记... ;-) 不是必需的。将此代码粘贴到validator.w3.org/#validate_by_input,以便您自己查看。 也不是必需的,但 Excel 可以更好地使用它们。【参考方案3】:我本来打算对 BKimmel 的帖子发表评论,但显然我还没有足够酷的点数。
如果 Excel 已经打开,您会收到烦人的“personal.xls 已打开”消息。我尝试先获取应用程序。如果失败,则创建它:
On Error Resume Next
Set myxlApp = GetObject(, "Excel.Application")
If Err.Number <> 0 Then
Err.Clear
Set myxlApp = CreateObject("Excel.Application")
If Err.Number <> 0 Then
' return False, show message, etc.
End If
End If
【讨论】:
【参考方案4】:我在SpreadsheetGear for .NET 中完成了大部分 Open XML (xlsx) 工作,这绝非易事。我建议使用 Office Open XML SDK 或其他 3rd 方库,例如 SpreadsheetGear 或我们的竞争对手之一(只需谷歌“SpreadsheetGear”即可查看我们的竞争对手是谁)。
SpreadsheetGear for .NET 似乎可以满足您的需求:
适用于 .NET 2.0、.NET 3.0 和 .NET 3.5。 支持使用 IWorkbook.SaveToStream 写入流或使用 IWorkbook.SaveToMemory 写入字节数组。 支持 Excel 97-2003 (xls) 工作簿,如果您需要支持非常多的用户,这很可能是您接下来需要做的事情。您可以下载免费的全功能评估版here。
【讨论】:
【参考方案5】:Excel 通过 COM 对象非常可编写脚本。我没有尝试过,但这应该是一个可靠的解决方案,虽然既不快速也不轻量级。
无论您最终做什么,请检查您的解决方案是否支持 Unicode。我在使用现有解决方案编写 xls 文件(即 2007 年之前的文件)时遇到了一些严重问题。
【讨论】:
服务器上 Excel 的 COM 自动化可能非常不稳定。 Microsoft 仅在桌面上支持它。【参考方案6】:您可以使用主互操作程序集(Office API)以编程方式生成 Excel 文档——我不想使用它们做任何过于复杂的事情,但这听起来不是您的要求。
这种方法也适用于在内存中生成文档。
这里有一些资源:
Installing the Primary Interop Assemblies How to create new Excel workbooks(来自 MSDN)【讨论】:
避免 PIA... 是的,.ss 中的痛苦和主要的互操作组件之间并非巧合。相信我,我仍然能感受到伤害。【参考方案7】:我曾经使用函数库为表格和段落创建正确的 XML 来生成 Wordprocessing Markup 文档。
然后,我将 Response 标头的 MIME 类型更改为 word 文档,并将 XML 作为响应发送给客户端。它要么在他们的浏览器中打开,要么另存为文件。
虽然有MS Open XML SDK,但似乎没有相同的 2003 SDK for Excel
【讨论】:
【参考方案8】:每个活着的代码势利小人都讨厌 vbscript,但它很简单而且很有效:
Set myxlapp = CreateObject("Excel.Application")
Set mywb = myxlapp.Workbooks.Add
myxlapp.Visible = true
把它放在一个文本文件中,在末尾附加一个“.vbs”并presto。
【讨论】:
以上是关于以编程方式创建 Excel 2007 表格的主要内容,如果未能解决你的问题,请参考以下文章