以编程方式创建Excel 2007表格
我正在尝试以编程方式创建Excel 2007文档。现在,有两种发现方法:
- 手动创建XML,如本文所述
- 使用第三方库,例如ExcelPackage。
当前,我使用ExcelPackage,它具有一些非常严重的缺点和问题。由于我不需要创建过于复杂的Excel工作表(最"复杂"的事情是我明确地需要将单元格类型设置为数字或者文本),因此我接下来要考虑选项1,但我只是想知道是否存在还有其他生成Excel 2007表格的良好且受支持的方法吗?如果可以创建奖励积分而不必将其保存到硬盘驱动器,即生成它们并将其直接输出到流中。
.net 3.0是这里的目标,没有3.5的优点:(
编辑:到目前为止,谢谢。 XML SDK确实仅是3.5,但我希望尽可能避免使用俄罗斯Roulet ... erm ... COM Interop,特别是因为Excel 2007具有稍微复杂但仍然很容易创建的文档格式。我将看看发布的各种链接和提示。
解决方案
我们可以尝试使用Office Open XML SDK。这将使我们可以使用" MemoryStream"在内存中创建Excel文件,并且比手动生成所有XML更加容易。
正如Brian Kim所指出的那样,SDK的2.0版需要.NET 3.5,而我们所说的该版本不可用。该SDK的第1版也可用,它支持.NET 3.0。它还不完整,但是至少可以管理文档的XML部分以及它们之间的关系。
我曾经使用用于为表和段落创建正确的XML的函数库来生成Wordprocessing Markup文档。
然后,我只是将Response标头的MIME类型更改为Word文档,并将XML作为响应发送给客户端。它可以在他们的浏览器中打开或者另存为文件。
尽管有MS Open XML SDK,但似乎没有与Excel 2003相同的SDK。
Excel通过COM对象非常容易编写脚本。我没有尝试过,但这应该是一个可靠的解决方案,尽管它既不快速也不轻巧。
无论我们最终要做什么,请检查解决方案是否支持Unicode。使用现有的解决方案来编写xls文件(即2007年前的文件)时,我遇到了一些严重的问题。
我们可以使用主要互操作程序集(Office API)以编程方式生成Excel文档-我不想使用它们来做任何过于复杂的事情,但这听起来并不是要求。
这种方法也应该适用于在内存中生成文档。
以下是一些资源:
- 安装主要互操作程序集
- 如何创建新的Excel工作簿(来自MSDN)
每个活着的代码标记都讨厌vbscript,但是它很简单并且可以正常工作:
Set myxlapp = CreateObject("Excel.Application") Set mywb = myxlapp.Workbooks.Add myxlapp.Visible = true
将其放在文本文件中,并在末尾添加" .vbs"。
我本来打算对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
我只是生成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等一起使用。而且生成起来非常简单。
我在SpreadsheetGear for .NET中完成了大部分的Open XML(xlsx)工作,这绝非易事。我建议使用Office Open XML SDK或者另一个第三方库(例如SpreadsheetGear)或者我们的竞争对手之一(只需使用Google" SpreadsheetGear"即可查看我们的竞争对手是谁)。
.NET的SpreadsheetGear似乎可以满足需求:
- 适用于.NET 2.0,.NET 3.0和.NET 3.5.
- 支持使用IWorkbook.SaveToStream写入流或者使用IWorkbook.SaveToMemory写入字节数组。
- 支持Excel 97-2003(xls)工作簿,如果需要支持很多用户,这可能是接下来的工作。
我们可以在此处下载免费的功能齐全的评估版。