以编程方式创建 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: &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 等。而且生成起来非常简单。

【讨论】:

看起来您可能在该示例中缺少一些 标记... ;-) 不是必需的。将此代码粘贴到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 表格的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式创建表格视图单元格内容

以编程方式从 Excel 电子表格中提取数据

如何从 android 设备上传以编程方式创建的 excel 文件到 PHP 服务器或 MYSQL 数据库

EPPlus生成Excel表格(只支持2007及以上)

如何在android中以编程方式创建表格行和列边框

iOS 以编程方式为表格视图单元格内容创建 NSLayoutConstraint