使用C#读取和写入Excel的最快方法

可能重复:
从C#导出大量数据到excel的最佳/最快捷的方式是什么?

我正在创build一个具有以下function的Web应用程序:

  1. 假设pipe理员将一些数据存储在预定义的Excel模板文件中。 他将访问pipe理页面并上传此Excel。 应用程序读取此Excel并相应地更新数据库中的数据。

  2. 存储在数据库中的数据必须显示给访问ViewDetails页面的任何用户。 现在,数据应该在屏幕上显示给用户,并且必须提供“下载到Excel”选项。 另外,用户可以select过滤数据和sorting数据。

假设行数将是10000+,并且每行中大约有10-15列的文本/数字数据。

我目前的想法是使用Interop.Excel对象来读取Excel模板并将数据上传到数据库中。 对于阅读,我通常将所有的数据提取到DataTable中,然后根据需要进行显示。 我打算使用DataView进行sorting和过滤。 然而,我从来没有处理过这样大的数据,我不确定使用上述方法的性能。

我的问题是,要实现我的要求,最好和最快的方法是什么? 我读了一个地方,大概需要2-3分钟才能把这么多的数据写入Excel文件。

我还遇到过OpenXML:“Open XML是文字处理文档,演示文稿和电子表格的开放标准,可以由不同平台上的多个应用程序自由实现。

我可以使用它来更好地实现要求还是有其他的方式? 我最近开始开发C#Web应用程序,并首次使用Excel电子表格,所以如果有任何我不知道的明显答案,请耐心等待。 提前致谢 :)

我会build议使用epplus来加载和保存excel文件。 这是非常快速和多function的。 特别是加载它很容易:

Try Dim existingFile As New FileInfo(path) Using ExcelPackage As New ExcelPackage(existingFile) Dim Wsht As ExcelWorksheet = Nothing Try Wsht = ExcelPackage.Workbook.Worksheets(1) Catch ex As Exception End Try Dim tbl As New DataTable Dim hasHeader = True For i = 1 To Wsht.Dimension.End.Column tbl.Columns.Add() 'this is very "dumb" if you need better column names just iterate over the file and get them Next Dim startRow = 1 '1 due to the excel quirk For rowNum = startRow To Wsht.Dimension.End.Row Dim wsRow = Wsht.Cells(rowNum, 1, rowNum, Wsht.Dimension.End.Column) Dim row = tbl.NewRow For Each cell In wsRow row(cell.Start.Column - 1) = cell.Text Next tbl.Rows.Add(row) Next 'do something with the tbl datatable End Using Catch ex As Exception End Try 

缺点是:目前只支持xlsx文件

这一切都取决于你有多less数据,你想要做什么(例如生成完整格式的Excel表格)和你的预算。

Excel Interop在我看来是一个坏主意。 这是非常容易出错的,特别是在服务器上。 实际上,我绝对不会在服务器上运行互操作,因为Office应用程序是构build为交互式的,而不是在服务器上运行多实例。

我已经成功地使用了两种方法:OpenXML(但这很难使用)和商业Aspose单元库。 后者非常快速,并支持几乎所有的Excelfunction。 您可以在http://www.aspose.com/categories/.net-components/aspose.cells-for-.net/default.aspx阅读更多。

就我个人而言,我会看看codeplex有几个项目,正是你想要做的。 Excel文件是开放的XML格式,但它可以得到非常快,真烦人。 那么你也可以使用com,但也很烦人。

http://exceldatareader.codeplex.com/

快速生成数据 – 在不到10秒的时间内就可以生成一个包含500,000个独特string单元格的新工作簿。

您应该尝试多种select:计时并查看哪种方法可以为您的情况提供最佳性能。 一个选项是你提到的Interop。 另一个是使用JET SQL命令的OLE DB连接 。 只是要注意,格式化可以很容易搞砸, 例如,工作表名称必须与每个上传保持一致,因为在编写JET SQL查询时,该名称将成为“表名”。 通读这些StackOverflow提示 。