为了读取Excel
文件,我建议ExcelDataReader。读取大文件非常好。我亲自尝试过500k-1M
:
我需要解决的情况:
我的客户端有一些非常大的.xlsx文件,它们类似于数据库表(每行是一条记录,cols是字段)
我需要帮助他们处理这些文件(搜索,过滤器等)。
大的意思是它们中最小的具有100万条记录。
我尝试过的:
System.OverflowException
,我猜测它基本上是内存不足,因为200MB xlsx文件已经占用了4GB内存阅读。[有些帖子建议另存为.csv,但这也不起作用。某种程度上,csv文件未采用正确的UTF编码,导致转换期间数据丢失(所有Unicode字符均变为?
)。而且我仍然需要输出.xlsx。
由于机密性,我无法共享实际文件,但是您可以轻松创建一个具有60列(名字,姓氏,文件等)和大约1M记录的类似结构。
一旦您可以读取具有该标准的.xlsx文件,将删除该记录的一半,然后将其写入另一个位置而不会遇到内存问题。该问题将已解决。
如果有一种方法可以逐行从文件中缓慢读取小块数据,那将很好,但是我发现解决方案只能同时读取整个文件。
我需要解决的情况:我的客户有一些非常大的.xlsx文件,它们类似于数据库表(每行是一条记录,cols是字段),我需要帮助他们处理这些文件(搜索,...
] >为了读取Excel
文件,我建议ExcelDataReader。读取大文件非常好。我亲自尝试过500k-1M
:
using (var stream = File.Open("C:\\temp\\input.xlsx", FileMode.Open, FileAccess.Read)) { using (var reader = ExcelReaderFactory.CreateReader(stream)) { while (reader.Read()) { for (var i = 0; i < reader.FieldCount; i++) { var value = reader.GetValue(i)?.ToString(); } } } }
以相同有效的方式写回数据更加棘手。我完成了创建自己的SwiftExcel库的工作,该库非常快速高效(与其他
Nuget
库,包括EPPlus
相比,有一个性能图表),因为它不使用任何XML序列化并将数据直接写入到文件:
using (var ew = new ExcelWriter("C:\\temp\\test.xlsx"))
{
for (var row = 1; row <= 100; row++)
{
for (var col = 1; col <= 10; col++)
{
ew.Write($"row:{row}-col:{col}", col, row);
}
}
}
为了读取Excel
文件,我建议ExcelDataReader。读取大文件非常好。我亲自尝试过500k-1M
: