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

时间:2012-10-30 12:42:22

标签: c# excel interop openxml

  

可能重复:
  What is the best / fastest way to export large set of data from C# to excel

我正在创建一个具有以下功能的Web应用程序:

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

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

  3. 假设行数为10000+,每行约10-15列文本/数字数据。

    我目前的想法是使用Interop.Excel对象来读取Excel模板并上传数据库中的数据。为了阅读,我通常将我的所有数据都提取到DataTable中,然后根据需要显示它。我打算使用DataView进行排序和过滤。但是我从未使用过如此规模的数据,而且我不确定使用上述方法的性能。

    我的问题是,实现我的要求的最佳和最快的方法是什么? 我在某处读到,将大量数据写入Excel文件大约需要2-3分钟。

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

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

4 个答案:

答案 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 connectionJET SQL commands。请注意,格式化很容易搞砸;例如,工作表名称必须与每次上载保持一致,因为在编写JET SQL查询时它将成为“表名”。仔细阅读这些StackOverflow tips