C#读取Excel文件> 100MB

时间:2018-08-09 21:54:28

标签: c# excel csv closedxml exceldatareader

所以我试图用C#读取一个excel文件,文档为181MB。我尝试使用Microsoft.Office.Interop.Excel,OpenXML,ClosedXML和ExcelDataReader。 我无法使OpenXML正常工作,并且ClosedXML似乎对大型excel文件有问题(读取该文件也至少需要6分钟)。我最喜欢ExcelDataReader,因为我可以像读取数组一样读取数据表,但是读取文件的确花了4-5分钟的时间,这比Interlop快得多,但是仍然需要很长时间。我正在考虑将excel文档转换为csv文件,但是当我这样做时,其大小从181 MB增大到248 MB,因此我不确定它是否会更有效。它还迫使用户采取额外的步骤将其文件转换为csv,但是如果性能值得,我会尝试这种方法。

不幸的是,由于用户将使用openFileDialog选择文件,因此我无法预先确定excel文档将具有多少列和行。

ExcelDataReader是最好的方法还是有更好的解决方案?

这是我当前的代码,以防我可以做一些改进:

OpenFileDialog openFileDialog = new OpenFileDialog();
openFileDialog.Filter = "Excel Files|*.xls;*.xlsx;*.slxm";
if (openFileDialog.ShowDialog() == true)
{
    using (var stream = File.Open(openFileDialog.FileName, FileMode.Open, FileAccess.Read))
    {
        using (var reader = ExcelReaderFactory.CreateReader(stream))
        {
            //results will be in dataSet.Tables
            var dataSet = reader.AsDataSet();
            var dataTable = dataSet.Tables[0];

            int r = 0;
            for(int c = 0; c < dataTable.Columns.Count; c += 3)
            {
                TagListData.Add(new TagClass { IsTagSelected = false, TagName = dataTable.Rows[r][c].ToString(), rIndex = r, cIndex = c });
            }                    
        }
    }
    GC.Collect();
    GC.WaitForPendingFinalizers();
    GC.Collect();
}

1 个答案:

答案 0 :(得分:1)

想法1:ExcelDataReader的AsDataSet会有一些开销-因此,在处理大型工作表时,最好直接使用阅读器界面。它实现了IDataReader接口,并提供了对数据的pr-row级访问:

using (var reader = ExcelReaderFactory.CreateReader(stream)) {
    reader.Read();
    for(int c = 0; c < reader.FieldCount; c += 3) {
        TagListData.Add(new TagClass { IsTagSelected = false, TagName = Convert.ToString(reader.GetValue(c)), rIndex = r, cIndex = c });
    }                    
}

想法2:尝试将ExcelDataSetConfiguration.UseColumnDataType = false传递给AsDataSet,这消除了内部传递并降低了内存压力,因此在使用大工作表时应显着提高性能