0

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

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

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

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

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

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

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

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

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

4

4 回答 4

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 文件

于 2012-10-30T14:24:17.880 回答
2

这完全取决于您拥有多少数据、您想要做什么(例如,生成具有完整格式的 Excel 工作表)以及您的预算。

我认为 Excel 互操作是一个坏主意。它非常容易出错,尤其是在服务器上。实际上,我永远不会在服务器上运行互操作,因为 Office 应用程序是为交互而构建的,而不是在服务器上运行多实例。

我成功使用的两种方法是 OpenXML(但这很难使用)和商业 Aspose Cells 库。后者速度极快,几乎支持所有 Excel 特性和功能。您可以在http://www.aspose.com/categories/.net-components/aspose.cells-for-.net/default.aspx阅读更多相关信息。

于 2012-10-30T13:39:10.490 回答
1

就我个人而言,我会看看 codeplex,有几个项目可以完全按照您的意愿进行操作。Excel 文件是开放的 xml 格式,但它会变得非常多毛且非常烦人。然后你也可以使用 com 但这也很烦人。

http://exceldatareader.codeplex.com/

快速数据生成——可以在不到 10 秒的时间内生成包含 500,000 个唯一字符串单元的新工作簿。

于 2012-10-30T12:46:30.153 回答
0

您应该尝试多种选择:对它们进行计时,看看哪种方法最适合您的情况。一种选择是您提到的互操作。另一种是使用带有JET SQL 命令的OLE DB 连接。请注意,格式很容易弄乱;例如,工作表名称必须与每次上传保持一致,因为在编写 JET SQL 查询时,这将成为“表名”。通读这些StackOverflow 提示

于 2012-10-30T13:04:39.817 回答