从许多Excel文件中读取数据的理想方法(xls格式)

时间:2019-05-13 07:40:27

标签: c# excel

大家好,感谢您的关注。

(我已经用谷歌搜索了我的问题,请理解我的问题不同于那些要求最好的方法来读取不多的大型excel文件或将其写入Excel文件的问题,我只想阅读它们)

目前,我正在开发一个小程序,其目的可以定义为读取和分析excel格式的少数至几百甚至数千个日志文件之间的任意位置以收集统计结果,现在我知道了将日志另存为Excel的决定很奇怪,但是我不是那个决定的人,那对我来说就是这样。

您可能会猜到我打算做的是从每个Excel文件中读取数据,并在处理之前将其作为C#模型类加载到内存中。 我读取Excel文件的方式是基于以下经验:使用Interop,打开Excel文件,从我需要的几个单元格读取数据,然后关闭该文件并移至下一个并让另一个线程处理。

我已经尝试使用Interop测试我的方法,而且速度非常慢。这是有助于阅读的零件代码

                List<string> strings = new List<string>();
            Microsoft.Office.Interop.Excel.Application xlApp = null;
            Microsoft.Office.Interop.Excel.Workbook xlWorkBook = null;
            Microsoft.Office.Interop.Excel.Worksheet xlWorkSheet = null;
            Microsoft.Office.Interop.Excel.Range range = null;

            try
            {
                string str;
                int rCnt;
                int cCnt;
                int row = 0;
                int column = 0;

                xlApp = new Microsoft.Office.Interop.Excel.Application();
                xlWorkBook = xlApp.Workbooks.Open(path, 0, true, 5, "", "", true,
                    Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0);
                xlWorkSheet = (Microsoft.Office.Interop.Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);

                range = xlWorkSheet.UsedRange;
                row = range.Rows.Count;
                column = range.Columns.Count;
                strings.Clear();

                for (rCnt = 1; rCnt <= row; rCnt++)
                {
                    for (cCnt = 1; cCnt <= column; cCnt++)
                    {
                        str = (range.Cells[rCnt, cCnt] as Microsoft.Office.Interop.Excel.Range).Value2?.ToString();
                        if (!string.IsNullOrEmpty(str))
                            strings.Add(str);
                    }
                }

                xlWorkBook.Close(true);
                xlApp.Quit();
            }
    catch (Exception exception)
            {
                exception.Log();
            }
            finally
            {
                //https://www.add-in-express.com/creating-addins-blog/2013/11/05/release-excel-com-objects/
                if (xlWorkBook != null) Marshal.FinalReleaseComObject(xlWorkBook);
                if (xlWorkSheet != null) Marshal.FinalReleaseComObject(xlWorkSheet);
                if (range != null) Marshal.FinalReleaseComObject(range);
                if (xlApp != null) Marshal.FinalReleaseComObject(xlApp);
            }
            return strings.ToArray();

因此,为了解决我的问题,我希望找到过去曾经遇到过类似问题并找到解决方法的人,或者回答一些我有的问题:

  • 从多个Excel文件读取时最快的免费库是什么(因为打开和关闭文件不需要花费太长时间,也不需要花时间读取到文件末尾或每次读取时都从头开始读取)得到一个细胞)
  • 如果我将整个excel文件加载到内存中并在其中读取它,并且有一个像这样的库,它会提高速度吗?
  • 如果我从2个不同的线程加载2个不同的驱动器中的文件,是否可以提高速度?

1 个答案:

答案 0 :(得分:0)

您可以使用nuget包吗?如果是这样,请查看ExcelDataReader库及其ExcelReaderFactory。 https://www.nuget.org/packages/ExcelDataReader

对于xls文件,我将使用var excelReader = ExcelReaderFactory.CreateBinaryReader(stream),然后可以使用阅读器将其读入数据集var data = reader.AsDataSet();

您还可以在读取数据集之前告诉它第一行是否包含列名,例如reader.IsFirstRowAsColumnNames = true;

如果您有.xlsx文件,则可以使用ExcelReaderFactory.CreateOpenXmlReader(stream);