c#Microsoft.Office.Interop.Excel导出

我正在编写一个程序,我正在使用C#语言, DataSet等。我有大约200 000个值,我想要导出到.xlsx文档。

我的代码:

 using Excel = Microsoft.Office.Interop.Excel; ... Excel.Application excelApp = new Excel.Application(); Excel.Workbook excelworkbook = excelApp.Workbooks.Open(/location/); Excel._Worksheet excelworkSheet = (Excel.Worksheet)excelApp.ActiveSheet; ... excelApp.visible = true; ... for (int i = 0; i < /value/; i++) for (int j = 0; j < /value/; j++) excelworkSheet.Cells[i, j] = /value/; 

它运作良好,但速度太慢(至less5-10分钟)。

你有什么build议吗?

我只是采取了相同的性能打击,写这个基准:

 [Test] public void WriteSpeedTest() { var excelApp = new Application(); var workbook = excelApp.Workbooks.Add(); var sheet = (Worksheet)workbook.Worksheets[1]; int n = 1000; var stopwatch = Stopwatch.StartNew(); SeparateWrites(sheet, n); Console.WriteLine("SeparateWrites(sheet, " + n + "); took: " + stopwatch.ElapsedMilliseconds + " ms"); stopwatch.Restart(); BatchWrite(sheet, n); Console.WriteLine("BatchWrite(sheet, " + n + "); took: " + stopwatch.ElapsedMilliseconds + " ms"); workbook.SaveAs(Path.Combine(@"C:\TEMP", "Test")); workbook.Close(false); Marshal.FinalReleaseComObject(excelApp); } private static void BatchWrite(Worksheet sheet, int n) { string[,] strings = new string[n, 1]; var array = Enumerable.Range(1, n).ToArray(); for (var index = 0; index < array.Length; index++) { strings[index, 0] = array[index].ToString(); } sheet.Range["B1", "B" + n].set_Value(null, strings); } private static void SeparateWrites(Worksheet sheet, int n) { for (int i = 1; i <= n; i++) { sheet.Cells[i, 1].Value = i.ToString(); } } 

结果:

  n = 100 n = 1 000 n = 10 000 SeparateWrites(sheet, n); 180 ms 1125 ms 10972 ms BatchWrite(sheet, n); 3 ms 4 ms 14 ms 

对于Excel,我只编程VBA,所以我不能给你如何在C#中的确切语法。

我注意到的是,你正在做的事情,我注意到很多人都想要:
将代码分别写入Excel中的每个单元格。 与在内存中执行的操作相比,读取/写入操作相当慢。

将一组数据传递给一个将所有这些数据写入一个定义的范围的函数会更有趣。 在这之前,当然你需要正确设置范围的大小(等于数组的大小)。

但是,这样做时,应该提高性能。