可能重复:
What is the best / fastest way to export large set of data from C# to excel
我正在创建一个具有以下功能的Web应用程序:
假设管理员将某些数据存储在预定义的Excel模板文件中。他将访问管理员页面并上传此Excel。应用程序读取此Excel并相应地更新数据库中的数据。
存储在数据库中的数据必须显示给访问ViewDetails页面的任何用户。现在,数据应该在屏幕上显示给用户,并且必须提供下载到Excel选项。此外,用户可以选择过滤数据和排序数据。
假设行数为10000+,每行约10-15列文本/数字数据。
我目前的想法是使用Interop.Excel对象来读取Excel模板并上传数据库中的数据。为了阅读,我通常将我的所有数据都提取到DataTable中,然后根据需要显示它。我打算使用DataView进行排序和过滤。但是我从未使用过如此规模的数据,而且我不确定使用上述方法的性能。
我的问题是,实现我的要求的最佳和最快的方法是什么? 我在某处读到,将大量数据写入Excel文件大约需要2-3分钟。
我也遇到过OpenXML: “Open XML是文字处理文档,演示文稿和电子表格的开放标准,可以由不同平台上的多个应用程序自由实现。”
我可以使用它来更好地实现要求,还是有其他方法? 我最近开始开发C#web应用程序,并且是第一次使用Excel电子表格,所以如果有任何我不知道的明显答案,请耐心等待。 在此先感谢:)
答案 0 :(得分:3)
我建议使用epplus加载并保存excel文件。 它非常快速且通用。特别是加载很容易:
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文件
答案 1 :(得分:2)
这完全取决于您拥有多少数据,您想要做什么(例如,生成具有完整格式的Excel工作表)以及您的预算。
Excel Interop在我看来是个坏主意。它非常容易出错,尤其是在服务器上。实际上,我永远不会在服务器上运行互操作,因为Office应用程序是构建为交互式的,而不是在服务器上运行多实例。
我成功使用的两种方法是OpenXML(但这很难使用)和商业Aspose Cells库。后者非常快,几乎支持所有Excel功能。您可以在http://www.aspose.com/categories/.net-components/aspose.cells-for-.net/default.aspx了解更多相关信息。
答案 2 :(得分:1)
就个人而言,我会看看codeplex,有几个项目完全符合您的要求。 Excel文件采用开放的xml格式,但它真的很快就会变得非常毛茸茸而且很烦人。然后你也可以使用com,但这也很烦人。
http://exceldatareader.codeplex.com/
快速生成数据 - 可以在不到10秒的时间内生成一个包含500,000个独特字符串单元格的新工作簿。
答案 3 :(得分:0)
您应该尝试多种选择:计算时间并查看哪种选项可以为您的情况提供最佳性能。一个选项是你提到的Interop。另一个是使用OLE DB connection和JET SQL commands。请注意,格式化很容易搞砸;例如,工作表名称必须与每次上载保持一致,因为在编写JET SQL查询时它将成为“表名”。仔细阅读这些StackOverflow tips。