所以我试图用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();
}
答案 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,这消除了内部传递并降低了内存压力,因此在使用大工作表时应显着提高性能