如何使用C#for JS处理极大的.xlsx文件

问题描述 投票:0回答:1

我需要解决的情况

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

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

大的意思是它们中最小的具有100万条记录。


我尝试过的:

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

[有些帖子建议另存为.csv,但这也不起作用。某种程度上,csv文件未采用正确的UTF编码,导致转换期间数据丢失(所有Unicode字符均变为?)。而且我仍然需要输出.xlsx。


由于机密性,我无法共享实际文件,但是您可以轻松创建一个具有60列(名字,姓氏,文件等)和大约1M记录的类似结构。

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

  • 时间不是太大的问题。如果需要,用户愿意等待一两个小时来获得结果。
  • 当前似乎是内存问题。这是一个个人请求,客户的计算机是一台笔记本电脑,内存上限为8GB。
  • 语言选择最好是用于Python的JS,C#,因为我已经知道如何使用它们创建可执行文件了(不能告诉会计师学习终端,是吗?)>
  • 如果有一种方法可以逐行从文件中缓慢读取小块数据,那将很好,但是我发现解决方案只能同时读取整个文件。

我需要解决的情况:我的客户有一些非常大的.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);
        }
    }
}
javascript c# excel database memory-management
1个回答
0
投票

为了读取Excel文件,我建议ExcelDataReader。读取大文件非常好。我亲自尝试过500k-1M

© www.soinside.com 2019 - 2024. All rights reserved.