用数据读取器处理excel文件:ExecuteReader()缓冲整个文件

尝试使用数据读取器处理大型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实例。 使用断点我注意到,一个语句需要30s +,Windows资源监视器表示执行该语句期间分配内存的稳步增加。
指定ExecuteReader()方法的CommandBehavior参数(例如SequentialAccess )不起作用。

我在这里做错了什么? 是否有其他的方法来处理大(excel)文件?

注意 :连接string的IMEX&HDR扩展属性是有意的。

编辑 :经过一些理性的思考,我认为这是不可能处理一个Excel文件,而不用缓冲这种或那种方式。 由于excel文件基本上是压缩的XML文件的荣耀的集合,所以不可能在不解压的情况下处理工作表(并且保存在RAM中或临时保存到磁盘中)。
我能想到的唯一select是使用Microsoft.Office.Interop.Excel 。 不知道OpenXML如何处理它。

从MSDN :“当您调用一个Command对象的Execute方法之一时,将返回命名的一个或多个表的所有行和列”。 (在“备注”部分下)。 所以这似乎是ExecuteReader()的默认行为。

ExecuteReader(CommandBehavior)可能会给你更多的select,特别是当CommandBehavior设置为SequentialAccess时 ,尽pipe你需要处理字节级别的读取。