2016-01-11 2 views
2

Я пытаюсь прочитать файл 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];" 

Я получаю эту ошибку.

OleDb Error

Обратите внимание, что файл Excel имеет 475128 строк и B70000-B70001 даже не половина всего.

Total Columns

Может кто-нибудь пролить некоторый свет? Я думаю, что здесь что-то не хватает.

+0

Вы выполнили свой запрос? после 'cmd = Nothing' я не могу видеть строку' cmd.ExecuteNonQuery() '. – BNN

+0

Привет. Должен ли cmd.ExecuteNonQuery() использоваться для операций, которым не нужны наборы данных, такие как INSERT, UPDATE и т. Д.? Насколько мне известно, da.Fill уже выполняет команду SQL. :) – Nathu

ответ

1

Я нашел рабочее решение. Вместо использования 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 является объектом в памяти (из-за чего мы можем получить исключение из памяти из памяти). Check here for reference

Я все еще хочу услышать о том, почему моя проблема выше вверх.

Смежные вопросы