优化c#excel读取/写入文件

所以我有大约2200行 ,我需要读取和写入到一个TXT文件这个Excel,问题是,它需要太多的时间,我被告知读/写文件通常需要时间,因为这是自然 ,所以我试着只读一次的Excel文件,使用一个stringBuilder和每行写(还没有尝试存储所有的文本和写入整个.txt文件)

但是,有什么办法可以加快速度?

select较小的范围,如只有一行? 用\ n作为换行符来填充一个巨大的string,然后写所有的.txt文件?

这是我的代码示例

using Excel = Microsoft.Office.Interop.Excel; [...] xlApp = new Excel.Application(); xlWorkBook = xlApp.Workbooks.Open("C:/Users/MyUser/Desktop/SomeFolder/my_excel.xlsx", 0, true, 5, "", "", true, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0); xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1); Excel.Range allRange = xlWorkSheet.UsedRange; try { System.IO.StreamWriter file = new System.IO.StreamWriter("C:\\test.txt"); String line = ""; //StringBuilder line; for (int row = 1; row <= allRange.Rows.Count; row++) //These are up to thousand sometimes { if (allRange.Value2[row, 1] != "") { //line = new StringBuilder(); for (int column = 1; column <= 6; column++) { //Console.WriteLine(allRange.Value2[row, column]); line += allRange.Value2[row, column]; if (column != 6) { line += "|"; //line.Append("|"); } } file.WriteLine(line); line = ""; } else { MessageBox.Show("Should've not reached here."); break; } } file.Close(); } catch (Exception ex) { MessageBox.Show("Couldn't write file: " + ex.ToString()); } 

顺便说一句我正在使用.NET v4.0.30319 …我想(说Environment.Version.ToString()

或.NET v4.5.51209(说“帮助”>“关于Microsoft Visual Studio”)

我认为这个代码很慢的主要原因在于Excel Interop的使用。 这很慢。 而不是尝试使用OpenXML SDK – 它是操纵Office 2007+文档(包括* .xlsx)的库。 ExcelInterop的速度要快很多,它不需要在机器上安装Excel的实例。 主要缺点是无法打开XLS文件。 以下是如何读取大文档的示例: https : //msdn.microsoft.com/EN-US/library/office/gg575571.aspx

也尝试使用StopWatch或任何分析器,并测量代码中最慢的部分。

对于Excel Interop,我还是很新的,但是这里有一些我最近改进的代码。 表演从30秒到2秒不等。

  //This method is very slow. // Storing Each row and column value to excel sheet //for (int k = 0, k2 = 2; k < table.Rows.Count; k++, k2++) //{ // for (int l = 0, l1 = 1; l < table.Columns.Count; l++, l1++) // { // //ExcelApp.Cells[k2, l1] = // // table.Rows[k].ItemArray[l].ToString(); // ExcelApp.Cells[k2, l1] = // table.Rows[k][l].ToString(); // } //} //////////////// //See if this method is faster // transform formated data into string[,] // var excelData = new string[table.Rows.Count, table.Columns.Count]; var excelData = new object[table.Rows.Count, table.Columns.Count]; for (int rowJ = 0; rowJ < table.Rows.Count; rowJ++) { for (int colI = 0; colI < table.Columns.Count; colI++) { // excelData[rowJ, colI] = table.Rows[rowJ][colI].ToString(); excelData[rowJ, colI] = table.Rows[rowJ][colI]; //excelData[colI, rowJ] = "test"; } } //<Code to set startLoc and endLoc removed> Range valRange = ExcelApp.get_Range(startLoc, endLoc); valRange.Value2 = excelData;