将数据导出到Excel非常慢

时间:2017-09-01 06:57:51

标签: c#

我正在尝试将数据从我的C#代码导出到MS Excel 2007,但是在excel文件中插入数据需要30秒。代码就像这样 - >

Excel.Application excelapp = new Excel.Application();

Excel.Workbook excelworkbook = excelapp.Workbooks.Open(fileTest);

Excel.Sheets excelsheets = excelworkbook.Worksheets;

Excel.Worksheet mysheets = (Excel.Worksheet)excelsheets.get_Item("Sheet1");

Excel.Range mycells = mysheets.Cells;

mycells.Item[destroyer, "A"].Value = s[2];

mycells.Item[destroyer, "B"].Value = s[1];

mycells.Item[destroyer, "C"].Value = s[3];

mycells.Item[destroyer, "D"].Value = dbl_standard.Text;

 mycells.Item[destroyer, "E"].Value = s[4];

 mycells.Item[destroyer, "F"].Value = s[7];

 mycells.Item[destroyer, "G"].Value = s[5];

 mycells.Item[destroyer, "H"].Value = s[6];

excelworkbook.Save();

 excelworkbook.Close();

 excelapp.Quit();

Marshal.ReleaseComObject(mycells);

Marshal.ReleaseComObject(mysheets);

 Marshal.ReleaseComObject(excelsheets);

Marshal.ReleaseComObject(excelworkbook);

 Marshal.ReleaseComObject(excelapp);

我几乎不插25列。我做错了什么?如何快速完成?

先谢谢

1 个答案:

答案 0 :(得分:2)

这里有两个问题。第一个问题是Excel互操作实际上打开了Excel.exe并且它与该进程一起操作。您将无法消除启动Excel的开销,这可能是您处理时间的主要部分。

另一部分是,对于您编辑的每个单元格,您都会在互操作层“引擎盖下”创建大量调用。您可以对这些调用进行矢量化。

阅读: https://stackoverflow.com/a/42604291/3387223

写作(VB示例): https://stackoverflow.com/a/23503305/3387223

这样,您只需为整个值范围创建一个互操作操作。这比插入25个值大约快25倍。

但正如我上面所说,启动Excel可能需要大部分时间。

您可以使用OpenXML更快地读取和写入Excel工作表,但是您可能会遇到一些格式问题,并且您不会在Excel工作表中获得其他公式的即时更新(如果这是您需要的)。

https://msdn.microsoft.com/en-us/us-en/library/office/bb448854.aspx

以下是生成Excel工作表的示例:

https://msdn.microsoft.com/en-us/library/office/hh180830(v=office.14).aspx

如果您想更轻松地处理OpenXml,可以使用ClosedXml:

https://github.com/closedxml/closedxml

这将使OpenXml与标准互操作一样简单。