gpt4 book ai didi

c# - 如何使用 C# 处理超大的 .xlsx 文件

转载 作者:行者123 更新时间:2023-12-04 19:54:00 25 4
gpt4 key购买 nike

我需要解决的情况:

我的客户有一些非常大的 .xlsx 文件,类似于数据库表(每行是一条记录,cols 是字段)

我需要帮助他们处理这些文件(搜索、过滤等)。

大体上我的意思是其中最小的有 100 万条记录。


我尝试过的:

  • SheetJS 和 NPOI:两个库都只回复一个简单的“文件太大”。
  • EPPlus:最多可以读取数百 K 条记录的文件,但是当面对实际文件时,它只会给我一个 System.OverflowException,我的猜测是它基本上内存不足,因为 200MB xlsx 文件已经占用了我 4GB 的内存来读取。
  • 我没有尝试过 Microsoft OleDB,但我宁愿避免使用它,因为我不想仅仅为了一份工作而购买 Microsoft Office。

出于保密原因,我无法共享实际文件,但您可以轻松创建具有 60 列(名字、姓氏、出生日期等)和大约 100 万条记录的类似结构。

一旦您可以读取具有该标准的 .xlsx 文件,删除一半记录然后写入另一个地方而不会遇到内存问题,问题就会解决

  • 时间不是太大的问题。如果需要,用户愿意等待 1 或 2 小时以获得结果。
  • 目前似乎是内存问题。这是个人要求,客户的机器是笔记本电脑,内存上限为 8GB。
  • csv 在这里不是一个选项。我的客户有 .xlsx 输入,需要 .xlsx 输出。
  • 语言选择最好是 JS、C# 和 Python,因为我已经知道如何用它们创建可执行文件(我们总不能告诉会计师去学习终端吧?)。

如果有一种方法可以从文件中逐行缓慢读取小块数据,那就太好了,但我发现的解决方案只能同时读取整个文件。

最佳答案

对于阅读 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);
}
}
}

关于c# - 如何使用 C# 处理超大的 .xlsx 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59810716/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com