使用OleDB范围错误从Excel 2013文件中读取非常大的数据

我正尝试使用Visual Basic.NET在OleDB的帮助下阅读Excel 2013文件(.xlsx,大小约为100 MB)。 主要担心的是系统内存exception的系统:

da.Fill(dt) 

从下面的代码。

 Private Function ReadExcelFile() As DataSet Dim ds As New DataSet() Dim connectionString As String = "Provider=Microsoft.ACE.OLEDB.12.0;;Extended Properties=Excel 12.0 XML;Data Source=C:\file.xlsx;" Using connection As New OleDbConnection(connectionString) connection.Open() Dim cmd As New OleDbCommand() cmd.Connection = connection Dim dtSheet As DataTable = connection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, Nothing) For Each dr As DataRow In dtSheet.Rows Dim sheetName As String = dr("TABLE_NAME").ToString() If Not sheetName.EndsWith("$") Then Continue For End If cmd.CommandText = "SELECT * FROM [" & sheetName & "];" Dim dt As New DataTable() dt.TableName = sheetName Dim da As New OleDbDataAdapter(cmd) da.Fill(dt) ds.Tables.Add(dt) Next cmd = Nothing connection.Close() End Using Return ds End Function 

但我认为最好的解决scheme是通过块读取数据,所以我发现我可以通过在SQL语句中添加一个列范围来读取数据,如下所示:

  cmd.CommandText = "SELECT * FROM [" & sheetName & "B1:B10];" 

我做了一个循环通过在该范围上的增量,但我发现一个错误。 以此为例,

 cmd.CommandText = "SELECT * FROM [" & sheetName & "B50000:B51000];" 

它仍然有效。 但是,如果我这样做,

 cmd.CommandText = "SELECT * FROM [" & sheetName & "B70000:B70001];" 

我得到这个错误。

OleDb错误

请注意,Excel文件有475128行,B70000-B70001甚至不是总数的一半。

总列数

任何人都可以点亮一下吗? 我想我在这里错过了一些东西。

我find了一个工作解决scheme 而不是使用DataSet,使用DataReader。 我可以添加一个工作,所以不会挂断。

  Private Function ReadExcelFile() As DataSet Dim ds As New DataSet() Dim connectionString As String = GetConnectionString() Using connection As New OleDbConnection(connectionString) connection.Open() Dim cmd As New OleDbCommand() cmd.Connection = connection Dim dtSheet As DataTable = connection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, Nothing) For Each dr As DataRow In dtSheet.Rows Dim sheetName As String = dr("TABLE_NAME").ToString() If Not sheetName.EndsWith("$") Then Continue For End If cmd.CommandText = "SELECT * FROM [" & sheetName & "];" Dim ddr As OleDbDataReader = cmd.ExecuteReader() Dim counter As Integer = 0 While (ddr.Read()) MessageBox.Show(ddr.GetValue(0)) End While Next cmd = Nothing connection.Close() End Using Return ds End Function 

线路:

 Dim ddr As OleDbDataReader = cmd.ExecuteReader() Dim counter As Integer = 0 While (ddr.Read()) MessageBox.Show(ddr.GetValue(0)) End While 

是可以访问第一列(索引0)的行的基本代码。 这是有效的,因为我读到DataSet是一个内存中的对象(这就是为什么我们可以得到一个系统内存exception) – 检查这里参考

我仍然想知道为什么我的上述问题出现了。