首页 > 解决方案 > 从许多 Excel 文件(xls 格式)中读取数据的理想方法

问题描述

大家好,感谢您的关注。

(我已经用谷歌搜索了我的问题,请理解我的问题与那些要求以最佳方式读取 LARGE 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();

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

标签: c#excel

解决方案


你能使用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);


推荐阅读