【发布时间】:2013-12-13 03:11:14
【问题描述】:
我在尝试使用数据阅读器处理大型 Excel 文件 (300mb+) 时遇到了一个特殊问题。 以下代码说明了我打开 excel 文件并遍历工作表“largesheet$”中的行的方式:
const string inputFilePath = @"C:\largefile.xlsx";
const string connectionString =
"Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=\"Excel 12.0;IMEX=1;HDR=YES;\";Data Source=" +
inputFilePath;
// Initialize connection
using (var connection = new OleDbConnection(connectionString))
{
// Open connection
connection.Open();
// Configure command
var command = new OleDbCommand("largesheet$", connection) {CommandType = CommandType.TableDirect};
// Execute reader
var reader = command.ExecuteReader(); // <-- Completely loads file/sheet into memory
// Iterate results
while (reader.HasRows)
{
// Read single row
reader.Read();
// ...
}
// Close connection
connection.Close();
}
据我了解,这应该打开 excel 文件并在需要时使用 reader.Read() 语句加载每一行。
但是,似乎 ExecuteReader() 语句不仅仅返回一个 OleDbDataReader 实例。使用断点我注意到一条语句需要 30 多秒,并且 Windows 资源监视器表明在执行该语句期间分配的内存稳定增加。
指定 ExecuteReader() 方法的 CommandBehavior 参数(例如 SequentialAccess)无效。
我在这里做错了什么?是否有其他处理大型(excel)文件的方法?
注意:连接字符串的 IMEX 和 HDR 扩展属性是有意的。
编辑:经过一些理性思考,我认为如果不以一种或另一种方式缓冲它,就不可能处理 Excel 文件。由于 excel 文件基本上是压缩 XML 文件的美化集合,因此无法在不解压缩(并将其保存在 ram 中或临时保存到磁盘)的情况下处理工作表。
我能想到的唯一选择是使用Microsoft.Office.Interop.Excel。不过不确定OpenXML 是如何处理的。
【问题讨论】:
标签: c# excel datareader