2017-09-01 194 views
1

我想从我的C#代码数据导出到MS Excel 2007,但它采取30秒,在一个Excel文件。该代码中插入数据就像是这个 - >数据导出到Excel非常缓慢

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列。我做错了什么?如何使它快速?

由于提前

+2

可能重复的[Microsoft.Office.Interop.Excel真慢](https://stackoverflow.com/questions/3989122/microsoft-office-interop-excel-really-slow) – grek40

+0

@ grek40这是一种重复十岁上下。由于他在Excel工作表上执行的操作次数不同,Shugham的问题不同。大部分时间都是用Excel.exe打开的,在上面的例子中,大部分时间都是由更改后的值所占用。 – CodeMonkey

+1

@CodeMonkey不够公平,考虑到数据量较低,你可能是对的。 – grek40

回答

2

你必须要对两个问题在这里。第一个问题是Excel interop实际上打开了Excel.exe并且可以与该进程一起运行。您将无法删除启动Excel的开销,这可能是您的大部分处理时间。

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

对于阅读: 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像标准的Inter一样简单运。

+0

你能给我示例代码吗? – Shubham

+0

阅读我的答案并选择你的方式?我建议使用'ClosedXml'。 – CodeMonkey

+0

我不知道有关ClosedXml和OpenXml.Can你给我一个解决方案只有这个代码 – Shubham