导入和导出 Excel - 啥是最好的库? [关闭]

Posted

技术标签:

【中文标题】导入和导出 Excel - 啥是最好的库? [关闭]【英文标题】:Import and Export Excel - What is the best library? [closed]导入和导出 Excel - 什么是最好的库? [关闭] 【发布时间】:2009-01-14 20:20:08 【问题描述】:

在我们的一个 C# ASP.NET 应用程序中,我们采用特定的数据集合(SubSonic 集合)并将其导出到 Excel。我们还想以特定格式导入 Excel 文件。我正在寻找可以用于此目的的库。

要求:

Excel 2007 文件(Excel 2003 是否支持超过 64k 行?我需要的不止这些。) 服务器上不需要 Excel 采用类型化集合,如果可以,尝试将数字字段作为数字字段放入​​ Excel 中。 适用于大文件(100k 到 10M) - 足够快。 导出 GUID 时不会崩溃! 不花一大笔钱(没有像 aspose 这样的企业库)。免费总是很棒,但也可以是商业图书馆。

你推荐什么库?您是否将其用于大量数据?还有其他解决方案吗?

现在,我正在使用一个简单的工具来生成稍后由 Excel 加载的 html,但是我失去了一些功能,而且当我们加载它时 Excel 会抱怨。我不需要生成图表或类似的东西,只需导出原始数据。

我正在考虑平面 CSV 文件,但 Excel 是客户的要求。如果我有一个工具可以与 Excel 相互转换,我可以直接使用 CSV。鉴于 Excel 2007 是一种基于 xml(和压缩)的文件格式,我猜这种库应该很容易找到。但是,对我来说最重要的是您的cmets和意见。


编辑:具有讽刺意味的是,在我看来,按照投票最多的答案,最好的 Excel 导入和导出库根本就没有导出。并非所有情况都如此,但它适用于我的情况。 XLS 文件仅支持 64k 行。 XLSX 最多支持 1M。我尝试过的免费库的性能很差(当你有 200k 行时加载一行需要一秒钟)。我没有尝试过付费的,因为我觉得当您需要的只是快速的 XLSXCSV 转换程序时,它们提供的价值被高估了。

【问题讨论】:

“鉴于 Excel 2007 是一种基于 xml(和压缩)的文件格式,我猜这种库应该很容易找到”——哈哈!这就像说“Excel 97 是基于字节的,所以这种库应该很容易找到”。 XML 并不意味着简单,而 OOXML 是如何使 XML 指定不足和难以理解的复杂性的典型代表。 :-) 实际上你做出这个假设并不完全正确。有一些可用的工具可以至少为 XLSX 构建格式良好的 OOXML 文档,使用 C#.NET 很容易做到。 我已经创建了一个网站提案,以便为此类问题提供远离 Stack Overflow 的官方主页。它被称为Code Recommendations 现在加入并提出问题,帮助实现它! Spire.xls 怎么样。专业版只需 800 美元。您可以获得所有转换以及您的 excel 导入或导出器。 e-iceblue.com/Introduce/… GemBox.Spreadsheet 是另一个值得一试的解决方案,速度超快,有免费版和专业版。此外,专业版相当便宜,并且没有像大多数那样隐藏的糟糕的部署成本。 【参考方案1】:

我将投入到平面 csv 文件中,如果只是因为您对代码有最大的控制权。只需确保您逐行读取并一次处理一个(将文档读取到最后并拆分会占用您所有的内存 - 与写入相同,将其流出)。

是的,用户必须先在 Excel 中保存为 CSV,然后才能处理它,但也许可以通过培训和在页面上提供明确的说明来克服这个限制?

最后,当您向客户导出时,如果您将 mime 类型设置为 text/csv,Excel 通常会映射到该类型,因此在用户看来它是“一个 Excel 文件”。

【讨论】:

我也尝试过 CSV 方法,但它有几个问题。例如,如果您想在单元格中包含多行文本怎么办?我无法让 Excel 导入这样的 CSV。 CSV 有它的位置,但发帖人问到 Excel,我认为他一定想要 Excel,而不是 CSV。 CSV 在导出 0345 之类的列时会下降。Excel 会自动将其修剪为 345。当前导数字很重要时,这根本没有帮助。 带有 excel 文件扩展名的 HTML 表格似乎工作得很好......它会以一种特殊的方式解析一些 CSS 来处理诸如格式化多行、颜色等内容 - 而实际上不必创建一个本机 Excel 文件 “另存为”?不。如果客户使用的是 Excel,那么他们为什么要节省第二个更有限的文件来与您的产品交互?【参考方案2】:

自从我最初的回答以来,我发现了Open XML SDK。它为电子表格对象提供了强类型类,除其他外,而且似乎相当容易使用。 我将在我的一个项目中将其用于报告。唉,2.0 版应该要到 2009 年底或 2010 年才能发布。

【讨论】:

非常有趣!您是否使用大量数据对其进行了测试? 我没有做过任何性能测试。我将主要使用图表和单页报告,因此吞吐量对我来说不是问题。不过,它似乎与托管代码一样快。 @Jason Kealey:这确实是这篇文章的最佳答案 - 导出与 SpreadsheetML 无关。数据都可以从文件中访问。如果您需要不同格式的数据,请通过 XSLT 或 Linq 提供转换。 不过,这根本不适用于“.xls”文件。 github.com/OfficeDev/Open-XML-SDK 它现在是开源和 github 托管的(我喜欢 MS 最近的发展方向)【参考方案3】:

在 LGPL 下免费用于商业项目的 ExcelPackage 的最后一个版本是 https://www.nuget.org/packages/EPPlus/4.5.3.3

如果您需要最新最好的,可在此处获得商业许可证:https://epplussoftware.com/en/LicenseOverview/

我仍在与导出到 excel 功能作斗争,因为我的应用程序应该将一些数据导出到 excel-template 2007

这个项目对我来说似乎很好,开发人员对错误和问题非常敏感。

【讨论】:

工作正常,但它是在 GPL 下获得许可的 - 例如任何使用它的软件也必须以纯源代码形式提供......并不总是一个好的选择...... 以您方便的原生格式导出,编写一个 prog。使用 EPPlus 转换为 Excel,使其免费。让你的主编默认使用它,但允许其他“插件”,嘿,你的真实代码是从 GPL 中免费的。 现在看来这是在 LGPL 下获得许可的,因此您可以将其用作链接库而不受 copyleft 限制。 请注意,如果您需要生成一个包含大字符串的 excel 文件,此库可能会在 excel 中随机生成“不可读内容”错误。 注意 EPPlus 会泄漏内存,对于大量数据来说并不是很好。【参考方案4】:

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

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

【讨论】:

我喜欢这个名字的讽刺...... 也用过,体验一样。效果很好,非常灵活。【参考方案5】:

SpreadsheetGear for .NET 读写 CSV / XLS / XLSX 并执行更多操作。

您可以查看带有 C# 和 VB 源代码的实时 ASP.NET 示例here 并下载免费试用版here。

当然,我认为 SpreadsheetGear 是在 ASP.NET 中导入/导出 Excel 工作簿的最佳库 - 但我有偏见。您可以在this page 的右侧看到我们的一些客户所说的内容。

免责声明:我拥有 SpreadsheetGear LLC

【讨论】:

@Joe Erickson :您能告诉我们如何读取 CSV,然后从刚刚使用电子表格设备读取的 CSV 生成 XML,并使用该 XLS 生成生成的 XML 文件,其中包含那个结构?或者我们可以使用 Spreadsheetgear 直接从 CSV 生成 XML?【参考方案6】:

NPOI For Excel 2003 开源 http://www.leniel.net/2009/07/creating-excel-spreadsheets-xls-xlsx-c.html

【讨论】:

前几天我使用这个库来研究这个问题。这是一个很棒的图书馆!【参考方案7】:

我过去使用过Flexcel,它很棒。但这更适用于以编程方式创建和更新 Excel 工作表。

【讨论】:

我看不出它支持 Excel 2007 (xlsx)。由于 xls 仅支持 64k 行,这对我来说是一个限制。 @Jason Kealey - Flexcel 现在支持 Excel 2007 和 2010。【参考方案8】:

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

【讨论】:

对于任何应该保留为文本的内容,只需在开头添加一个 '(撇号) 另一个有趣的事实:我无法在很多语言环境中打开逗号分隔的文件,比如德语。这使得 csv 成为与国际联系人共享数据的糟糕格式【参考方案9】:

多年来,我一直为此使用JExcel,这是一个优秀的开源 Java 项目。通过使用 J# 编译它也支持 .NET,而且我在这个版本中也取得了巨大的成功。但是,最近我需要将代码迁移到本机 .NET 以支持 64 位 IIS 应用程序,我在该应用程序中创建 Excel 输出。无法加载 32 位 J# 版本。

CSharpJExcel 的代码是 LGPL,目前可在this 页面获得,同时我们准备在 JExcel SourceForge 站点上部署它。它将与 VS2005 或 VS2008 一起编译。原始 JExcel 文档中的示例将很好地原封不动地转移到 .NET 版本。

希望对这里的人有所帮助。

【讨论】:

两个链接都失效了……但我确实找到了它的一些 sn-ps,它看起来对 Java 更友好,而不是对 .NET 开发人员而言。但是,我确实找到了另一个相反的库,它是一个原生 .NET 库 (GemBox.Spreadsheet),它也被移植到 Java (GemBox.Spreadsheet for Java)。【参考方案10】:

我已经使用 excel jetcell 很长时间了,我真的可以推荐它。 http://www.devtriogroup.com/exceljetcell

商业产品 Excel 文件 XLS 和 XLSX 基于纯网络自带的引擎。

【讨论】:

【参考方案11】:

以下站点演示了如何将 DataTable、DataSet 或 List 导出到“正确的”Excel 2007 .xlsx 文件中(而不是导出 .csv 文件并让 Excel 打开它)。

它使用 OpenXML 库,因此您不需要在您的服务器上安装 Excel。

Mikes Knowledge Base - ExportToExcel

所有源代码均已提供,免费,以及演示应用程序。

添加到您自己的应用程序非常容易,您只需调用一个函数,传入 Excel 文件名和您的数据源:

DataSet ds = CreateSampleData();
string excelFilename = "C:\\Sample.xlsx";
CreateExcelFile.CreateExcelDocument(ds, excelFilename);

希望这会有所帮助。

【讨论】:

此链接已失效。【参考方案12】:

查看ExcelPackage 项目,它使用 Excel 2007 的 Office Open XML 文件格式,它是轻量级和开源的......

【讨论】:

看起来不错,但有一条评论说大文件不好(我的场景) 有趣 - 它被许可为 GPL,而不是 LGPL。因此,它必须在 GPL 应用程序中使用。 (此外,不幸的是,开发似乎已经停止。) 我尝试了 ExcelPackage,但不得不放弃它 - 当您尝试将单引号 (') 放在单元格中时它失败了。【参考方案13】:

我已经尝试过 CSharpJExcel 并且不会推荐它,至少在有一些可用的文档之前不会推荐。与开发者 cmets 不同,它不是一个直接的本地端口。

【讨论】:

【参考方案14】:

我知道这已经很晚了,但我不得不回答来自xPortTools.Net 的xPorter(写作)和xlReader(阅读)。我们测试了相当多的库,但在性能方面没有任何东西可以接近(我在这里谈论的是在几秒钟内写入数百万行)。不能对这些产品说足够多的好话!

【讨论】:

【参考方案15】:

您可以使用Microsoft.Jet.OLEDB.4.0

【讨论】:

我的一个要求是不要在服务器上运行 Excel。 我不这么认为它正在运行! “Microsoft.Jet.OLEDB.4.0”(对于 xls)“Microsoft.ACE.OLEDB.12.0 for xlsx”不需要 MS office。你必须只使用 Drivers ,所以没有机会在服务器上运行 Excel @Jason Kealey 我将它用于 XLS(不是最初的要求),为了完整性......有一些重要问题:(1)它只是 32 位,所以你必须设置 IIS 以允许那。 (2) 出口速度慢得可怕。 (3) 它的行和列限制记录不充分。 (4) 它坚持“类型嗅探”导入的列,除非你有注册表访问权限,而且它通常会出错。【参考方案16】:

我们刚刚发现了类似的需求。我认为考虑用户体验很重要。

我们几乎走上了歧途:

    准备/处理电子表格文件 保存文件 导入文件 处理系统中的数据

...工作流程

Add-in Express 允许您在 Excel 中创建一个按钮,而无需对 VSTO 进行繁琐的处理。那么工作流程就变成了:

    准备/处理电子表格文件 导入文件(使用按钮在 Excel 中) 处理系统中的数据

让按钮背后的代码使用“本机”Excel API(通过 Add-in Express)并直接推送到收件人系统。对于开发人员或用户,您无法获得更加透明的信息。值得考虑。

【讨论】:

【参考方案17】:

Yogesh Jagota 在 CodeProject 上有一篇非常好的文章和库:

Excel XML Import-Export Library

我用它来将数据从 SQL 查询和其他数据源导出到 Excel - 对我来说效果很好。

干杯

【讨论】:

有趣,但需要 XML 文件。无法读取/写入 xls 或 xlsx 文件。【参考方案18】:

您可以尝试以下库,它非常简单,它只是 Microsoft 的 Open XML SDK 的一个轻量级包装器(您甚至可以重用辅助 Excel 文件中的格式、样式甚至整个工作表): http://officehelper.codeplex.com

【讨论】:

该库的新版本最近发布了。【参考方案19】:

Spreadsheetgear 是我们发现并正在使用的最好的商业库。我们公司做了很多高级的 excel 导入和导出,Spreadsheetgear 支持很多高级的 excel 功能,远远超出了简单的 CSV 所能做的任何事情,而且速度很快。它不是免费的,也不是很便宜,但值得,因为支持非常好。如果您遇到问题,开发人员实际上会回复您。

【讨论】:

【参考方案20】:

apache POI java 库怎么样。我没有在 Excel 中使用它,但在 Word 2007 中使用它。

【讨论】:

以上是关于导入和导出 Excel - 啥是最好的库? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

handsontable支持excel导入导出么

PHP如何将查询出来的数据导出成excel表格(最好做一个按钮)?

PHP导入导出excel表格图片(转)

PHP导出100万数据到excel

java用poi实现将数据库里面的数据导入已经存在的excel模板中。最好有实例参考,谢谢。

delphi2010 dbgrid 导出 excel