将一个大的SQL查询移动到Excel

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

数据集根据用户input而不同,所以我不能简单地追加到现有的文件。

当前代码:

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) } 

那么,我会不惜一切代价避免Excel互操作。 你只是写一个.CSV文件的想法有很多好处。 一如既往的“最佳”performance取决于环境,但unit testing总是有帮助的。

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

祝你好运。

一个大问题是,你正在逐个填充Excel工作表,因为每次调用.Value2设置器时都要进行COM-interop调用,所以这很慢。

如果你为excel中的所有数据(M行乘N列)分配一个数组,将会快很多,创build一个范围对象来表示该范围,并使用.Value2设置器将数组复制到范围。

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