Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用数据读取器处理excel文件:ExecuteReader()缓冲整个文件_C#_Excel_Datareader - Fatal编程技术网

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

C# 使用数据读取器处理excel文件:ExecuteReader()缓冲整个文件,c#,excel,datareader,C#,Excel,Datareader,我在尝试使用数据读取器处理大型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;HD

我在尝试使用数据读取器处理大型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();
}
const string inputFilePath=@“C:\largefile.xlsx”;
常量字符串连接字符串=
“Provider=Microsoft.ACE.OLEDB.12.0;扩展属性=\”Excel 12.0;IMEX=1;HDR=是\“数据源=”+
输入文件路径;
//初始化连接
使用(var连接=新的OLEDB连接(connectionString))
{
//开放连接
connection.Open();
//配置命令
var command=new-OleDbCommand(“largesheet$”,connection){CommandType=CommandType.TableDirect};
//执行读取器
var reader=command.ExecuteReader();//From:“调用命令对象的某个Execute方法时,将返回命名表的所有行和列。”(在备注部分下)。因此这似乎是ExecuteReader()的默认行为


可能会为您提供更多选项,特别是当CommandBehavior设置为时,尽管您需要在字节级别处理读取。

正如我在问题中所述,SequentialAccess的使用没有任何区别(我只是结合TableDirect尝试过)。我发现ExecuteReader将数据加载到内存中很奇怪,我认为数据读取器的优势之一是其灵活性和性能。.NET framework是否提供了更适合处理大型数据文件的替代方案?您是否考虑过使用OpenXML()对于您的任务?这可能会给您更多的控制,这取决于加载数据后您需要对数据执行什么操作。您可以使用SDK提供的类似SAX的读取来控制文件的读取方式。