用C#创建Excel文件而不需要安装Office

75

我正在编写一个生成Excel报告的程序,目前使用Microsoft.Interop.Excel引用。我的开发计算机上安装了Excel,但最终用户可能没有安装Office。如果最终用户的计算机上没有安装Office,这个工具会失败吗?还是这个交互服务与实际应用程序是分开的?


我已经发布了一个免费使用的C#库来完成这个任务:http://www.mikesknowledgebase.com/pages/CSharp/ExportToExcel.htm - Mike Gledhill
Gledhill,那个链接不起作用。尽管如此,我找到了GemBox.Spreadsheet,它可以创建任何Excel文件(XLS、XLSX、ODS、CSV等),而无需MS Office,并且有一个可在任何地方使用的免费版本。 - hertzogth
7个回答

43

如果您想要制作 .xlsx(Office 2007及以上版本)文件,那么您很幸运。Office 2007+使用OpenXML,它的描述更恰当地说是 .xlsx 文件中嵌入了 XML 文件的 zip 压缩包。

拿一个 Excel 文件(2007+版本)并将其重命名为 .zip,您可以打开它并查看其中的内容。如果您正在使用 .NET 3.5,则可以使用 System.IO.Packaging 库来操作关系和压缩包本身,并且使用 linq to xml 来处理 xml(或者如果您更熟悉的话,也可以使用 DOM)。

否则我建议使用DotNetZip,这是一个强大的操作 zip 文件的库。

OpenXMLDeveloper上有许多关于 OpenXML 的资源,您可以在那里找到更多信息。

如果您想要 .xls (2003及以下版本),则需要研究第三方库或学习文件格式以在没有安装 Excel 的情况下实现此目标。


1
OpenXMLDeveloper在2018年关闭。根据该页面,许多内容已转移到EricWhite.com - CarenRose

40

除非在服务器/个人电脑上安装了Excel或使用外部工具(即使不使用Excel Interop,也是可能的,参见从C#创建Excel(.XLS和.XLSX)文件),否则会失败。 使用Interop需要安装Excel。


31

如果您使用Excel 2007,请尝试EPPlus。它支持范围、单元格样式、图表、形状、图片等许多其他功能。


也可用于较新版本的Excel,不要被“2007年”吓到。可以在NuGet上获得。文档的更新链接在这里:https://github.com/JanKallman/EPPlus/wiki/Getting-Started - Savage
此软件包由发布者Jan Kallman开发。 - Savage

13

有几个选项:

  • NPOI - 免费且开源。
  • Aspose - 不免费但功能强大。
  • Spreadsheet ML - 基本上是用于创建电子表格的 XML。

使用Interop需要在运行Excel的机器上安装Excel。在服务器端解决方案中,这将很糟糕。相反,您应该使用像上面提到的工具之一,可以在没有安装Excel的情况下构建Excel文件。

如果用户没有安装Excel但拥有可以读取Excel的工具(如Open Office),那么他们显然能够打开它。Microsoft为那些没有安装Excel的用户提供了一个免费的Excel查看器


1
你真的很幸运。我使用Aspose时遇到了无尽的烦恼。质量控制极差,有许多未记录的更改,经常出现愚蠢的错误,API设计也值得商榷(将属性设置为null时出现NullReferenceException..什么鬼?!)。他们唯一的救赎是修复速度比较快,但每次发布修复程序都意味着要浪费数小时来测试它们的补丁,因为不可能相信他们给你的东西。 - Krypes
1
@Kyrpes - 我不确定您上次使用Aspose.Cells是什么时候,但它在我正在从事的项目中使用了几年,并且除了高昂的成本外,它一直运行得非常完美。我们从未遇到过任何问题。 - Thomas
@匿名类型 - 不幸的是,OOXML不能制作Excel 97-2003二进制文件,而NPOI可以。我同意OOXML具有更多功能,但无法制作真正的二进制Excel文件的限制通常是一个致命缺陷。 - Thomas
@匿名类型 - OP 还建议用户可能有 Excel,因此结果需要与这些版本兼容(尽管我们并没有得知支持的最低版本)。我也发现 Excel 查看器在打开 OOXML 或 Speadsheet ML 文件时会很挑剔。 - Thomas
@Thomas,是的,我同意关于观众的评论。 - Anonymous Type
显示剩余5条评论

11

Interop指的是调用其他的东西,这是一种互操作性程序集,所以你正在与其他东西进行互操作...在本例中是Excel,实际安装的Excel。

在这种情况下,是的,它将无法运行,因为它依赖于Excel,你只是调用Excel函数。如果他们没有安装它...就没办法了。

有一些方法可以生成不需要Excel的内容,只要2007文件格式可以使用,以下是其中几种:

正如我所说,这是2007格式,通常情况下,这可能是不能接受的。


1
+1 是指出“交互操作”需要与其他内容进行交互的评价。 - John M Gant

8
使用OleDB,可以相当容易地创建、读取和编辑Excel文件。详细信息请参阅MSDN文档:http://msdn.microsoft.com/en-us/library/aa288452(VS.71).aspx。 我已经使用OleDB从Excel文件中读取过数据,而且我知道你可以创建它们,但我自己没有实际操作过。

4
您可以使用FileHelpers库的ExcelStorage类,非常简单易用...您需要在计算机上安装Excel 2000或更高版本。

FileHelpers是一个免费且易于使用的.NET库,可从文件、字符串或流中导入/导出定长或分隔记录的数据。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接