2

我当前项目的一部分涉及从包含 120,000 多条记录的大型 SQL 表中填充 Excel 工作表。我目前正在使用带有 while 循环的 SqlDataReader 来直接填充新的 Excel 工作表,但显然这需要不切实际的时间。使用 StringBuilder 构建本地 .CSV 文件,然后在 Excel 中打开它似乎是一个更快的选择。是每千行左右将数据转储到文件中,还是一次全部写入?或者有没有更有效的方法来导入我没有考虑的这些数据?

数据集因用户输入而异,因此我不能简单地附加到现有文件。

当前代码:

SqlConnection cnnct = new SqlConnection("Data Source=Source;Initial Catalog=Catalog;Integrated Security=True;");
            cnnct.Open();
            SqlCommand cmd = new SqlCommand();
            cmd.Connection = cnnct;
            string cmdText = "SELECT * FROM TABLE";
            cmd.CommandText = cmdText;

            SqlDataReader dr = cmd.ExecuteReader();
            while (dr.Read())
            {
                columnChar = 'A';
                rowCount++;

                cellName = columnChar.ToString() + rowCount.ToString();
                    ws.get_Range(cellName, cellName).Value2 = dr["EXAMPLE_FIELD"].ToString();
                    columnChar++;
                //The above three lines are identical for each field (there are 26)
            }
4

3 回答 3

2

好吧,我会不惜一切代价避免 Excel 互操作。您只编写 .CSV 文件的想法有很多优点。与“最佳”性能一样,它取决于环境,但单元测试总是有帮助的。

System.IO非常理想。我只会读取一行SqlDataReader并写入 CSV 行。它变成了非常简单的代码,我敢打赌它相当“快”。

祝你好运。

于 2012-11-27T15:27:24.843 回答
1

一个大问题是您正在逐个单元格地填充 Excel 工作表,这很慢,因为每次调用.Value2setter 时都要进行 COM 互操作调用。

如果您为要放入 excel 的所有数据(M 行乘 N 列)分配一个数组,创建一个范围对象来表示该范围,并使用.Value2setter 将该数组复制到该范围,那将会快得多。

于 2012-11-27T15:17:35.270 回答
0

在 c# 中使用DocumentFormat.OpenXml.Spreadsheet,您可以编写该数据集以Xlsx格式化或创建 xml 文件using System.xml或使用第三方工具/创建自己的 excel xml,以创建 xls 格式。

于 2012-11-27T15:09:41.847 回答