优化c#excel文件读写

优化c#excel文件读写,c#,.net,excel,optimization,excel-interop,C#,.net,Excel,Optimization,Excel Interop,因此,我有一个大约2200行的excel,我需要读写一个txt文件,问题是它花费了太多的时间,我被告知读写文件通常需要时间,因为它的本质,所以我尝试只读取一次excel文件,使用stringBuilder并按行写入(尚未尝试存储所有文本并写入整个.txt文件) 但是,有什么方法可以加快速度吗? 选择较小的范围(如仅1行)?生成一个巨大的字符串,\n作为换行符,然后将所有内容写入.txt 这是我的代码示例 using Excel = Microsoft.Office.Interop.Excel;

因此,我有一个大约2200行的excel,我需要读写一个txt文件,问题是它花费了太多的时间,我被告知读写文件通常需要时间,因为它的本质,所以我尝试只读取一次excel文件,使用stringBuilder并按行写入(尚未尝试存储所有文本并写入整个.txt文件)

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

选择较小的范围(如仅1行)?生成一个巨大的字符串,\n作为换行符,然后将所有内容写入.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());
}
使用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_项(1);
Excel.Range allRange=xlWorkSheet.UsedRange;
尝试
{
System.IO.StreamWriter file=new System.IO.StreamWriter(“C:\\test.txt”);
字符串行=”;
//架线机;

对于(int row=1;row我认为这段代码速度慢的主要原因是使用了Excel Interop。它非常慢。相反,尝试使用OpenXML SDK-它的库来处理Office 2007+文档(包括*.xlsx)。使用ExcelInterop的速度要快得多,而且不需要在计算机上安装Excel实例。主要缺点是它无法打开XLS文件。下面是如何读取大型文档的示例:


还可以尝试使用秒表或任何分析器,并测量代码中最慢的部分。

我对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;
//这个方法非常慢。
//将每行和每列值存储到excel工作表
//对于(int k=0,k2=2;k
Range valRange=ExcelApp.get_范围(STARTOC,endLoc);
valRange.Value2=excelData;

2200行听起来不多。为什么不能一次读/写整个文件?这是最快的,如果速度是问题的话,那么就这样做。我教过这就是我所做的,至少在读xlsx文件时,但不写,构建“巨大”字符串真的更快吗?(大约每行45~50行加上换行符“\n”乘以2200行(一个字符串/stringBuilder变量中大约有100000个字符),写得肯定更快。100000个字符真的不是“巨大的”,这大约是20万,用现代内存术语来说是微不足道的-大约是网页上一个横幅图像的大小。至于阅读,excel互操作可能是主要的瓶颈。也许你应该将阅读阶段和写作阶段分开。首先将所有数据读入内存,然后再写入-所以您可以分析这两个操作,并查看哪个操作最慢,最需要注意。是的,我刚刚进行了分析,显然问题在于阅读,选择了一个“大”范围
Excel.range allRange=xlWorkSheet.UsedRange;
([a,1],[AD,2210])一个单元格一个单元格地读取值要比选择一个较小的范围(我只需要前6列)花费更多的时间。而写入文件只需要不到1秒的时间。因此,现在我可以使用OpenXML SDK尝试解决方案@sławomir rosiek sugested