c# - 从许多 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();
因此,为了解决我的问题,我希望找到过去遇到类似问题的人并找到解决方法或回答我的一些问题:
- 在从多个 Excel 文件中读取时,什么是最快的免费库(因为它不需要太长时间打开和关闭文件或费心读取文件末尾或每次从头开始读取它以获得细胞)
- 如果我只是将整个 excel 文件加载到内存中并在那里读取它会提高速度吗?是否有一个像这样工作的库?
- 如果我从 2 个不同的线程加载位于 2 个不同驱动器中的文件,它会提高速度吗?
解决方案
你能使用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);
推荐阅读
- amazon - 如何将 Java 列表写入 Amazon Ion writer?
- python - 将 Selenium Python 值返回到 VBA
- javascript - 类型 'typeof @types/p5/index"' 上不存在属性 'noise'
- javascript - js如何实现hue-blend-mode?
- python - 如何在 TwitchIO 中发送不是对命令的响应的消息?
- c# - 带有 Angular 应用程序的 ASP.NET Core 上的计算值
- sql - 如何使用空间索引在 sql server 中测试程序?
- javascript - 如何在不使用javascript或jquery刷新页面的情况下更改整个域名
- python - 是否有可能为 Python 实现这个 R Plotly 示例?
- python - 将元数据从 python 发送到 wordpress 的问题