以编程方式创建Excel 2007表格

时间:2020-03-06 14:55:29  来源:igfitidea点击:

我正在尝试以编程方式创建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: &quot;yyyy-mm-dd&quot;">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)工作簿,如果需要支持很多用户,这可能是接下来的工作。

我们可以在此处下载免费的功能齐全的评估版。