将大型SQL查询移动到Excel

时间:2012-11-27 15:06:12

标签: c# sql-server excel

我当前项目的一部分涉及从大型SQL表填充Excel工作表,其中包含120,000多条记录。我目前正在使用带有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)
            }

3 个答案:

答案 0 :(得分:2)

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

System.IO非常优秀。我只想从SqlDataReader读取一行并写入CSV行。它变得非常简单,我打赌相当“快”。

祝你好运。

答案 1 :(得分:1)

一个大问题是你逐个填充Excel表单,这很慢,因为每次调用.Value2 setter时都会进行COM-interop调用。

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

答案 2 :(得分:0)

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