我当前项目的一部分涉及从大型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)
}
答案 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>