导入和导出Excel - 最好的库是什么?

184
在我们的ASP.NET应用程序中,我们采用了一种特定的数据集合(SubSonic集合)并将其导出到Excel中。我们还想以特定格式导入Excel文件。我正在寻找可用于此目的的库。
要求:
- Excel 2007文件(Excel 2003是否支持超过64k行?我需要更多。) - 不需要在服务器上安装Excel - 接受一个类型化的集合,并尝试将数字字段作为数字放入Excel中(如果可以的话) - 在处理大文件时效率高(100k至10M) - 导出GUID时不会崩溃! - 不要花费太多钱(没有像aspose这样的企业库)。免费总是好的,但也可以是商业库。
您推荐哪个库?您是否已经使用它处理过大量数据?是否有其他解决方案?
目前,我正在使用一个简单的工具生成HTML,稍后由Excel加载,但我失去了一些功能,而且Excel在加载时会出现问题。我不需要生成图表或其他任何东西,只需要导出原始数据。
我考虑使用平面CSV文件,但Excel是客户需求。如果我有一个转换为和从Excel的工具,我可以直接使用CSV。鉴于Excel 2007是基于XML的(和压缩的)文件格式,我猜这种库应该很容易找到。然而,对我来说最重要的是您的评论和意见。
编辑:具有最高选票答案的讽刺是,在我看来,最好的Excel导入/导出库不需要导出。这并非对所有情况都适用,但对于我的情况是这样。XLS文件仅支持64k行。XLSX支持高达1M。我试过的免费库性能很差(当你有20万行时,每秒加载一行)。我没有尝试付费版,因为我觉得它们在价值方面过高,当你只需要一个快速的XLSX < - > CSV转换例程时。

18
“鉴于Excel 2007是基于XML(和压缩)的文件格式,我猜想这种库应该很容易找到”——哈!这就像说“Excel 97是基于字节的,所以这种库应该很容易找到”。XML并不意味着简单,而OOXML是如何使XML变得不明确和复杂难懂的典型案例。 :-) - Ken
实际上,你在做那个假设时并不完全正确。有一些工具可用于使用C#.NET构建格式良好的OOXML文档,至少对于XLSX来说非常容易。 - Anonymous Type
3
我已经创建了一个网站方案,为像这样的问题提供一个不在 Stack Overflow 的官方家园。它叫做 Code Recommendations。加入并立即提问,帮助实现这个想法! - daviewales
Spire.xls怎么样?Pro版只需800美元。您可以获得所有的转换以及Excel导入或导出功能。http://www.e-iceblue.com/Introduce/excel-for-net-introduce.html#.VsM4xObNKtY - DotNet Programmer
GemBox.Spreadsheet 是另一个值得一试的解决方案,速度超快,同时拥有免费和专业版本。此外,专业版价格相当便宜,没有像大多数其他软件那样存在部署时的隐藏糟糕成本。 - NixonUposseen
20个回答

42

我在原始回答后发现了Open XML SDK。它提供了用于电子表格对象的强类型类,似乎相当容易使用。 我打算在我的一个项目中将其用于报告。 遗憾的是,版本2.0不会在2009年底或2010年发布。


非常有趣!你用大量的数据测试过吗? - Jason Kealey
我还没有进行任何性能测试。我主要会使用图表和单页报告,因此吞吐量对我来说不是问题。虽然它似乎已经尽可能快地运行了托管代码。 - cdonner
1
@Jason Kealey:这是这篇帖子中最好的答案——使用SpreadsheetML,导出变得不再重要。所有数据都可以从文件内部访问。如果您需要以不同格式获取数据,请通过XSLT或Linq提供转换。 - Todd Main
1
这对于“.xls”文件根本不起作用。 - quillbreaker
https://github.com/OfficeDev/Open-XML-SDK 现在已经开源并托管在GitHub上(我喜欢微软最近的发展方向)。 - Alex from Jitbit
Open XML SDK有一个类似于XmlWriter的前向只写API,速度快且使用的内存非常少,因此非常适合处理大量数据。所有遵循DOM方式的库都会在内存中创建xlsx文件,因此如果您需要导出许多行,则可能会影响应用程序服务器的性能——但这可能不是独立桌面应用程序的问题。http://blogs.msdn.com/b/brian_jones/archive/2010/06/22/writing-large-excel-files-with-the-open-xml-sdk.aspx 正如其名称所示,它仅适用于xlsx,不支持xls。但是,xlsx适配器对于Excel是免费的,并且会自动下载。 - user3285954

40

我倾向于使用平面的CSV文件,因为你可以更好地控制代码。只需确保逐行读取和处理数据(将整个文档读入并拆分会消耗全部内存 - 写入时也是如此,请按流方式输出)。

是的,在处理前需要先在Excel中另存为CSV格式,但通过培训和提供清晰的操作说明,这种限制可能可以克服。

最后,当你将数据导出给客户时,如果将MIME类型设置为text/csv,Excel通常会将其映射到该类型,因此对用户来说看起来像是“Excel文件”。


4
我尝试了CSV的方法,但是它有一些问题。例如,如果你想在单元格内有多行文本,该怎么办?我无法让Excel导入这样的CSV文件。 - Igor Brejc
26
CSV有其应用价值,但是发问者问的是Excel,我猜他一定想要的是Excel,而不是CSV。 - John Scipione
7
当导出像0345这样的列时,CSV就会出现问题。Excel会自动将其修剪为345,这对于重要的前导数字一点也不有帮助。 - NotMe
2
HTML表格使用Excel文件扩展名似乎非常有效...它会以一种奇特的方式解析一些CSS,例如格式化多行、颜色等等——而无需创建本机Excel文件。 - Oskar Duveborn
3
“另存为”?不。如果客户正在使用Excel,那么为什么他们要保存第二个更加有限的文件来与你的产品交互呢? - mlibby
显示剩余5条评论

36

3
功能正常,但它是根据GPL许可证授权的 - 例如,使用它的任何软件也必须以明文源代码的形式提供...这并不总是一个好选择... - marc_s
1
以您方便的本地格式进行导出,编写一个使用EPPlus将其转换为Excel的程序,并使其免费。使您的主要程序默认使用它,但允许其他“插件”,嘿,您的真正代码就不受GPL的限制了。 - user159335
7
看起来现在这个已经获得了LGPL许可,因此您可以将其用作链接库而不受版权限制的影响。 - Brad R
请注意,如果您需要生成一个包含大字符串的 Excel 文件,这个库有时会在 Excel 中随机产生“无法读取内容”的错误。 - Kevin Laity
2
请注意,EPPlus会泄漏内存,在处理大量数据时并不是很好。 - user3285954

20

我一直在使用ClosedXML,效果非常好!

ClosedXML让开发人员更容易地创建Excel 2007/2010文件。它提供了一个很好的面向对象的方式来操作文件(类似于VBA),而不必处理XML文档的麻烦。它可以被任何.NET语言如C#和Visual Basic(VB)所使用。


8
我喜欢这个名字中的讽刺意味... - Jagd
1
也使用过它,感受相同。功能强大且非常灵活。 - AnthonyVO

14

SpreadsheetGear for .NET 可以读写 CSV / XLS / XLSX 等格式,还具备更多功能。

您可以在这里查看使用 C# 和 VB 编写的 ASP.NET 案例和源代码,并且可以在这里免费下载试用版。

当然,我认为 SpreadsheetGear 是在 ASP.NET 中导入/导出 Excel 工作簿的最佳库——但我有偏见。您可以在此页面的右侧看到一些客户的评价。

声明:我拥有 SpreadsheetGear LLC。


@Joe Erickson:您能告诉我们如何使用Spreadsheet Gear读取CSV文件并生成一个包含该结构的XML文件吗?或者我们可以直接使用Spreadsheet Gear从CSV生成XML吗?同时,我们可以使用那个XLS文件来生成结果XML文件吗? - AnkitSablok

13

我前几天使用了这个库来研究这个问题。它是一个非常优秀的库! - Dillie-O

5

我以前使用过Flexcel,效果非常好。但它更适用于通过编程创建和更新Excel工作表。


我看不到它支持Excel 2007(xlsx)格式。由于xls只支持64k行,这对我来说是一个限制。 - Jason Kealey
@Jason Kealey - Flexcel 现在已经支持 Excel 2007 和 2010。 - Pauk

5
CSV导出简单易实现且速度快。不过,有一个潜在的问题值得注意。 Excel(至2007年)不会保留CSV文件中的前导零。这将破坏包含数字值的邮政编码、产品ID和其他文本数据。 有一个技巧可以使Excel正确导入这些值(使用分隔符并在前缀值加上=符号,如果我没记错的话,例如..,="02052",...)。 如果你的用户将使用CSV进行后处理任务,他们需要知道他们需要将格式更改为XLS而不是将文件保存回CSV。如果他们这样做,前导零将永久丢失。

1
对于任何应该保留为文本的内容,只需在开头加上一个'(撇号)。 - phuclv
另一个有趣的事实是:在很多语言环境下,比如德语,我无法打开逗号分隔的文件。这使得 CSV 成为与国际联系人共享数据的不良格式。 - Christian Sauer

4
多年来,我一直使用JExcel这个优秀的开源Java项目。通过使用J#进行编译,它也可以在.NET上运行,并且我在这种情况下也取得了很好的成功。然而,最近我需要将代码迁移到本机.NET以支持一个64位IIS应用程序,其中我创建Excel输出。32位的J#版本无法加载。
CSharpJExcel的代码采用LGPL协议,当前可在this页面获取,同时我们正在准备将其部署到JExcel SourceForge网站上。它可以使用VS2005或VS2008进行编译。原始JExcel文档中的示例在.NET版本中也非常适用。
希望对大家有所帮助。

这两个链接已经失效了...但我找到了一些片段,看起来更适合Java,而不是.NET开发人员。然而,我找到了另一个相反的库,它是一个原生的.NET库(GemBox.Spreadsheet),也被移植到了Java(GemBox.Spreadsheet for Java). - Hazel Patton

3

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