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


180

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

要求:

  • Excel 2007文件(Excel 2003是否支持超过64k行?我还需要更多。)
  • 在服务器上不需要Excel
  • 接受类型化的集合,如果可以的话,尝试将数字字段作为Excel中的数字放置。
  • 适用于大型文件(100k至10M)-足够快。
  • 导出GUID时不会崩溃!
  • 无需花钱(没有像aspose那样的企业库)。自由永远是伟大的,但可以成为商业图书馆。

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

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

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


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


18
“鉴于Excel 2007是基于xml(和压缩文件)的文件格式,我想这种类型的库应该很容易找到” –哈哈!这就像在说“ Excel 97是基于字节的,因此这种库应该很容易找到”。XML并不意味着简单,而OOXML是如何使XML规格不足且难以理解的复杂性的发源子。:-)
肯(Ken)

实际上,您做这个假设并不完全正确。有一些工具至少可以为XLSX生成结构良好的OOXML文档,而使用C#.NET则非常容易。
匿名类型

3
我创建了一个站点建议,以向像这样的问题提供一个远离Stack Overflow的正式家。它被称为“代码建议帮助”,现在就加入并提出问题,可以使它成为现实!
daviewales 2014年

那Spire.xls呢?专业版仅售800美元。您将获得所有转换以及excel导入或导出。e-iceblue.com/Introduce/...
DOTNET的程序员

GemBox.Spreadsheet是另一个值得一试的解决方案,超快速,并且有免费版和专业版。而且,专业版相当便宜,并且像大多数版本一样,没有任何隐藏的部署成本。
NixonUposseen

Answers:


41

如果您对代码有最大的控制权,那么我将全力以赴获取平面csv文件。只需确保您读入这些行并一次处理它们即可(将文档读到末尾并拆分将占用所有的内存-与写入相同,将其输出)。

是的,用户必须先在excel中另存为CSV,然后才能进行处理,但是也许可以通过培训和在页面上提供清晰的说明来克服此限制?

最后,当您导出给客户时,如果将mime类型设置为text / csv,则通常会将Excel映射到该类型,以便用户看到的是“ Excel文件”。


4
我也尝试了CSV方法,但是有几个问题。例如,如果要在单元格中包含多行文本怎么办?我无法使Excel导入此类CSV。
Igor Brejc,2009年

23
CSV有它的位置,但是发布者询问了Excel,我假设他必须要Excel,而不是CSV。
John Scipione

7
导出0345之类的列时,CSV会下降。Excel会自动将其修剪为345。当该前导数字很重要时,这根本没有帮助。
NotMe 2010年

2
带有excel文件扩展名的HTML表格似乎运行得很好...它将以一种特殊的方式解析一些CSS,以格式化诸如多行,彩色等格式,而无需创建本地Excel文件
Oskar Duveborn

3
“另存为”?否。如果客户使用的是Excel,那么为什么还要保存第二个更为有限的文件才能与您的产品交互?
mlibby 2011年

41

自最初回答以来,我发现了Open XML SDK。它为电子表格对象提供了强类型化的类,并且看起来很容易使用。我将在我的一个项目中将其用于报告。las,版本2.0预计要到2009年底或2010年才能发布。


很有意思!您是否使用大量数据进行了测试?
贾森·基利

我还没有做任何性能测试。我将主要使用图表和单页报告,因此吞吐量对我来说不是问题。不过,它似乎和托管代码一样快。
cdonner

1
@Jason Kealey:这确实是此帖子的最佳答案-导出与SpreadsheetML无关。可以从文件内访问所有数据。如果您需要其他格式的数据,请通过XSLT或Linq提供转换。
Todd Main

1
但是,这根本不适用于“ .xls”文件。
quillbreaker,2012年

github.com/OfficeDev/Open-XML-SDK,它现在是开源的,并由 github托管(我喜欢MS最近的去向
Alex

34

新的ExcelPackage版本位于 http://EPPlus.codeplex.com

由于我的应用程序应将一些数据导出到excel-template 2007,因此我仍在与导出到excel函数进行斗争

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


3
工作正常,但已获得GPL许可-例如,使用该软件的任何软件也必须以纯源代码提供....并非总是一个好选择...
marc_s 2010年

以方便您的本机格式导出,编写编。使用EPPlus转换为Excel的工具,即可免费使用。让您的主要编默认使用它,但允许其他“插件”,嘿,您的真实代码是免费的GPL。

5
看来这是根据LGPL许可的,因此可以将其用作不受版权保护限制的链接库。
布拉德·R

请注意,如果您需要生成其中包含大字符串的excel文件,则该库倾向于在excel中随机生成“无法读取的内容”错误。
凯文·莱蒂

1
请注意,EPPlus会泄漏内存,这对于大量数据而言并不是很好。
user3285954

18

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

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


8
我喜欢这个名字的讽刺意味
Jagd 2012年

也使用它,并获得相同的经验。效果很好,非常灵活。
AnthonyVO 2012年

14

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

你可以看到现场ASP.NET样本C#和VB源代码在这里和下载免费试用这里

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

免责声明:我拥有SpreadsheetGear LLC


@Joe Erickson:您能告诉我们如何阅读CSV,然后从使用Spreadsheet齿轮读取的CSV中生成XML,然后使用XLS生成包含该结构的XML文件吗?还是可以使用Spreadsheetgear直接从CSV生成XML?
AnkitSablok


5

我过去使用过Flexcel,这很棒。但这更多是通过编程方式创建和更新excel工作表。


我看不到它支持Excel 2007(xlsx)。由于xls仅支持64k行,因此对我来说是一个限制。
贾森·基利

@Jason Kealey-Flexcel现在支持Excel 2007和2010。–
Pauk

5

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


1
对于应该保留为文本的任何内容,只需在开头添加一个“(撇号)
phuclv 2013年

另一个有趣的事实:我无法在许多语言环境(例如德语)中打开一个逗号分隔的文件。这使csv成为与国际联系人共享数据的不良格式
Christian Sauer 2014年

4

多年来,我已经为此使用了JExcel,这是一个出色的开源Java项目。通过使用J#进行编译,它也可以使用.NET。在这种情况下,我也取得了很大的成功。但是,最近我需要将代码迁移到本机.NET,以支持我在其中创建Excel输出的64位IIS应用程序。无法加载32位J#版本。

CSharpJExcel的代码是LGPL,当前可在页面上找到,而我们准备在JExcel SourceForge站点上进行部署。它将与VS2005或VS2008一起编译。原始JExcel文档中的示例将很完整地移到.NET版本。

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


这两个链接都不再起作用了……但是我确实找到了它的一些片段,而且看起来对Java更友好了,而对.NET开发人员却没有那么多。但是,我确实找到了另一个相反的库,它是本机.NET库(GemBox.Spreadsheet),它也已移植到Java(Java的GemBox.Spreadsheet)。
Hazel Patton


3

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

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

Mikes知识库-ExportToExcel

所有源代码都是免费提供的,还提供了演示应用程序。

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

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

希望这可以帮助。


2

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


1
看起来不错,但有一条评论说大文件是不好的(我的情况)
Jason Kealey 09年

1
有趣的是-它被许可为GPL,而不是LGPL。因此,必须在GPL应用程序中使用它。(此外,不幸的是,发展似乎已经停止。)
Jason Kealey,2009年

1
我尝试了ExcelPackage,但是不得不放弃它-当您尝试在单元格中放置单引号(')时,它将失败。
Igor Brejc,2009年

2

我已经尝试过CSharpJExcel,并且不会推荐它,至少直到有一些可用的文档为止才推荐它。与开发人员评论相反,它不是直接的本机端口。


2

我知道这已经很晚了,但是我不得不从xPortTools.Net回答xPorter(写作)和xlReader(阅读)。我们测试了很多库,并且没有任何性能方面的障碍(我在这里谈论的是在几秒钟内写入数百万行)。不能说这些产品足够好!


2

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


1
我的要求之一是不要在服务器上运行Excel。
贾森·基利

2
我不认为它正在运行!
SonerGönül,2010年

2
对于“ Microsoft.Jet.OLEDB.4.0”(对于xls)“对于Microsoft.ACE.OLEDB.12.0对于xlsx”,不需要MS Office。您只需要使用Drivers即可,因此没有机会在服务器@Jason Kealey上运行Excel
Sanjay Goswami

1
我将其用于XLS(不是最初的要求)以及完整性……有一些重要问题:(1)仅32位,因此您必须设置IIS以允许这样做。(2)出口速度缓慢。(3)它记录的行和列限制很差。(4)除非您具有注册表访问权限,否则它坚持“类型嗅探”导入的列,并且通常会出错。
phil12年

1

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

我们几乎都陷入了同样的困境:

  1. 在电子表格文件中准备/工作
  2. 保存存档
  3. 导入文件
  4. 在系统中处理数据

...工作流程

外接程序Express允许您在Excel中创建按钮,而无需使用VSTO进行所有繁琐的操作。然后,工作流程变为:

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

使按钮后面的代码使用“本机” Excel API(通过Add-in Express),然后直接推入收件人系统。对于开发人员或用户,您无法获得更高的透明度。值得考虑。


1

Yogesh Jagota在CodeProject上有一篇相当不错的文章和库:

Excel XML导入导出库

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

干杯


1
有趣,但是需要XML文件。无法读取/写入xls或xlsx文件。
贾森·基利


0

Spreadsheetgear是我们发现并正在使用的最佳商业库。我们公司执行许多高级excel导入和导出操作,并且Spreadsheetgear支持许多高级excel功能,这些功能远远超出了简单CSV所能提供的功能,而且速度很快。它不是免费的也不是很便宜,但是值得一提,因为它的支持非常出色。如果您遇到问题,开发人员将实际答复您。


0

apache POI java库怎么样。我没有将其用于Excel,但确实将其用于Word 2007。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.