C# 以编程方式创建Excel 2007工作表

C# 以编程方式创建Excel 2007工作表,c#,.net,excel,C#,.net,Excel,我正在尝试以编程方式创建Excel2007文档。现在,我发现了两种方法: 手动创建XML,如中所述 使用第三方库,如 目前,我使用ExcelPackage,它有一些非常严重的缺点和问题。由于我不需要创建过于复杂的Excel工作表(最“复杂”的是,我明确地需要将单元格类型设置为数字或文本),因此我下一步将考虑选项1,但我只是想知道是否有其他好的和受支持的方法来生成Excel 2007工作表?如果无需将其保存到硬盘即可创建,即生成并直接输出到流中,则可获得额外积分 这里的目标是.net 3.0,

我正在尝试以编程方式创建Excel2007文档。现在,我发现了两种方法:

  • 手动创建XML,如中所述
  • 使用第三方库,如
目前,我使用ExcelPackage,它有一些非常严重的缺点和问题。由于我不需要创建过于复杂的Excel工作表(最“复杂”的是,我明确地需要将单元格类型设置为数字或文本),因此我下一步将考虑选项1,但我只是想知道是否有其他好的和受支持的方法来生成Excel 2007工作表?如果无需将其保存到硬盘即可创建,即生成并直接输出到流中,则可获得额外积分

这里的目标是.net 3.0,第3.5条:(

编辑:谢谢。XML SDK确实只有3.5版,但我也希望尽可能避免使用俄语Roulet…呃…COM互操作,特别是因为Excel 2007的文档格式有点复杂,但仍然很容易创建。我将查看发布的各种链接和提示。

您可以试试我们这将允许您使用
MemoryStream
在内存中创建Excel文件,这比手动生成所有XML要容易得多

正如Brian Kim所指出的,SDK的2.0版需要.NET 3.5,而您所说的是.NET 3.5不可用。SDK的另一个版本也支持.NET 3.0。它并不完整,但至少可以帮助您管理文档的XML部分以及它们之间的关系。

我曾经使用r为表和段落创建正确的XML

然后,我将响应头的MIME类型更改为word文档,并将XML作为响应发送给客户端。它可以在浏览器中打开,也可以另存为文件


2003年的Excel SDK似乎并不相同,尽管有一些是可以通过COM对象编写脚本的。我没有尝试过,但这应该是一个可靠的解决方案,尽管既不快速也不轻量级


无论您最终做什么,请检查您的解决方案是否支持Unicode。我在使用现有解决方案编写xls文件(即2007年以前的文件)时遇到了一些严重问题。

您可以使用主互操作程序集(Office API)以编程方式生成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
出错时继续下一步
设置myxlApp=GetObject(,“Excel.Application”)
如果错误号为0,则
呃,明白了
设置myxlApp=CreateObject(“Excel.Application”)
如果错误号为0,则
'返回错误、显示消息等。
如果结束
如果结束

我正在生成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>

维尼奥斯基
474
474
数据2
数据3
2008-10-01
0
第1行
第2行
第3行

它还可以作为Word中序列字母的数据源,与OpenOffice calc等一起使用,而且生成起来非常简单。

我在中完成了大部分开放XML(xlsx)工作,这绝非一个简单的练习。我建议使用Office开放XML SDK或其他第三方库,如SpreadsheetGear或我们的竞争对手之一(只需谷歌“SpreadsheetGear”就可以知道我们的竞争对手是谁)

SpreadsheetGear for.NET似乎可以满足您的需要:

  • 与.NET2.0、.NET3.0和.NET3.5配合使用
  • 支持使用IWorkbook.SaveToStream写入流,或使用IWorkbook.SaveToMemory写入字节数组
  • 支持Excel 97-2003(xls)工作簿,如果您需要支持很多用户,它很可能是您下一个需要的东西

您可以下载一个免费的、功能齐全的评估。

COM服务器上Excel的自动化可能非常脆弱。Microsoft只在桌面上支持它。这似乎需要.net 3.5。避免PIA…是的,这不是.ss和主互操作组件中的痛苦的巧合。相信我,我仍然能感觉到伤害。看起来在该示例中,您可能缺少一些标记…;-)不是必需的。请粘贴此代码以便自己查看。也不是必需的,但Excel可以更好地使用它们。