Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将大型SQL查询移动到Excel_C#_Sql Server_Excel - Fatal编程技术网

C# 将大型SQL查询移动到Excel

C# 将大型SQL查询移动到Excel,c#,sql-server,excel,C#,Sql Server,Excel,我当前项目的一部分涉及从包含120000多条记录的大型SQL表填充Excel工作表。我目前正在使用带有while循环的SqlDataReader来直接填充一个新的Excel工作表,但显然这需要不现实的时间。使用StringBuilder构建本地.CSV文件,然后在Excel中打开该文件似乎是一个更快的选择。是每一千行左右将数据转储到文件中,还是一次写入所有数据?或者有没有更有效的方法导入我没有考虑的数据 数据集根据用户输入的不同而不同,因此我不能简单地附加到现有文件 当前代码: SqlConne

我当前项目的一部分涉及从包含120000多条记录的大型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)
            }

使用c#中的
DocumentFormat.OpenXml.Spreadsheet
,您可以将该数据集写入
Xlsx
格式,或者使用System.xml创建xml文件
,或者使用第三方工具/create own excel xml创建xls格式。

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


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

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

System.IO
非常理想。我只需从
SqlDataReader
中读取一行,然后编写CSV行。它变成了非常简单的代码,我打赌它相当“快”


祝你好运。

你试过什么?您是否有性能测试来尝试各种选项?您显示的代码与编写CSV文件无关。正如我在第一篇文章中所说的,我目前正在使用SqlDataReader和while循环来直接填充新的Excel工作表。我一直在探索不同的选择,但在我开始构建CSV之前,我正在寻求外界的意见。我不是在寻找代码示例,我只是想知道是否有更有效的替代方案。