Я пытаюсь прочитать файл Excel 2013 (размером .xlsx размером около 100 МБ) с помощью Visual Basic.NET с помощью OleDB. Основной проблемой было исключение системы из памяти в линию:Чтение очень больших данных из файла Excel 2013 с использованием ошибки диапазона OleDB
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
, но я думаю, что лучшим решением будет считывать данные кусками, так что я узнал, что я мог бы прочитать данные, добавив диапазон столбцов в операторе SQL, как это:
cmd.CommandText = "SELECT * FROM [" & sheetName & "B1:B10];"
I сделал цикл, выполнив приращения в этом диапазоне, но обнаружил ошибку. При этом, например,
cmd.CommandText = "SELECT * FROM [" & sheetName & "B50000:B51000];"
Он по-прежнему работает. Однако, если я это сделаю,
cmd.CommandText = "SELECT * FROM [" & sheetName & "B70000:B70001];"
Я получаю эту ошибку.
Обратите внимание, что файл Excel имеет 475128 строк и B70000-B70001 даже не половина всего.
Может кто-нибудь пролить некоторый свет? Я думаю, что здесь что-то не хватает.
Вы выполнили свой запрос? после 'cmd = Nothing' я не могу видеть строку' cmd.ExecuteNonQuery() '. – BNN
Привет. Должен ли cmd.ExecuteNonQuery() использоваться для операций, которым не нужны наборы данных, такие как INSERT, UPDATE и т. Д.? Насколько мне известно, da.Fill уже выполняет команду SQL. :) – Nathu