Несоответствие строк при переносе таблицы из Excel в DataTable - Visual Basic .NET
Формулировка задачи:
Доброго времени.
Сложная для объяснения ситуация.
Есть исходный файл Excel (во вложении).
Я его считываю в DataTable используя OleDb.
В итоге в полученной таблице DataTable rows.count (количество строк c данными) на 1 меньше, чем в исходной таблице Excel. Первая строка почему-то не считывается как строка, а идет, как название строк? Не понимаю.
Если перед первой строкой вставить пустую - она тоже не считывается (и в итоге разница в нумерации строк становится уже 2!).
Если эту вставленную строку заполнить цифрами 1,2,3 .... , то она все равно не попадет в DataTable, как будто она пустая.
Почему так происходит - я разобраться не смог.
Открыт для предложений как это все переделать (вплоть до "выкинуть нафиг глючную OleDb и считать каким-нибудь другим методом").
Мне нужно, чтобы в итоговой таблице DataTable номера строк с данными соответствовали исходной таблице Excel (можно меньше на 1), вне зависимости от того - есть пустые строки в начале или нет.
Мой код:
Решение задачи: «Несоответствие строк при переносе таблицы из Excel в DataTable»
textual
Листинг программы
Private Function GetConnectionString(ByVal FileName As String) As String
Dim props As New Dictionary(Of String, String)()
Try
Dim check As String = GetExtension(FileName)
If check.EndsWith("xls") Then
' XLS - Excel 2003 and Older
props("Provider") = "Microsoft.Jet.OLEDB.4.0"
props("Extended Properties") = "'Excel 8.0;HDR=No;IMEX=1'"
props("Data Source") = FileName
ElseIf check.EndsWith("xlsx") Then
'XLSX - Excel 2007, 2010, 2012, 2013
' props("Provider") = "Microsoft.ACE.OLEDB.12.0"
' props("Extended Properties") = "Excel 12.0 XML"
' props("Data Source") = FileName
MsgBox("Простите, работа с файлами .xlsx временно не поддерживается")
props("Data Source") = ""
Else
MsgBox("Неизвестный формат файла: " & check.ToString())
props("Data Source") = ""
End If
Catch ex As Exception
MsgBox(ex.ToString())
End Try
Dim sb As New StringBuilder()
For Each prop As KeyValuePair(Of String, String) In props
sb.Append(prop.Key)
sb.Append("="c)
sb.Append(prop.Value)
sb.Append(";"c)
Next
Return sb.ToString()
End Function
'Копируем первый лист из книги в DataTable. Импортируем ПОЛНЫЙ ПУТЬ ФАЙЛА
Private Function ReadExcelFile(ByVal FileName As String) As System.Data.DataTable
' Dim ds As New DataSet()
Dim dt As New System.Data.DataTable()
Dim connectionString As String = GetConnectionString(FileName)
If Not connectionString = "Data Source=;" Then
Using conn As New System.Data.OleDb.OleDbConnection(connectionString)
conn.Open()
Dim cmd As New OleDbCommand()
cmd.Connection = conn
' Get all Sheets in Excel File
Dim dtSheet As System.Data.DataTable = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, Nothing)
' Get name of the first sheet
Dim sheetName As String
sheetName = ""
sheetName = dtSheet.Rows(0)("TABLE_NAME").ToString()
' Get all rows from the Sheet
cmd.CommandText = "SELECT * FROM [" & sheetName & "]"
dt.TableName = sheetName
Dim da As New OleDbDataAdapter(cmd)
Try
da.Fill(dt)
Catch ex As Exception
MsgBox(ex.ToString)
End Try
cmd = Nothing
conn.Close()
conn.Dispose()
End Using
Else
dt = Nothing
End If
Return dt
End Function
'Получаем количество пустых столбцов и строк в начале файла. Импортируем ЛИСТ excel.
Private Function GetSpaces(ByVal Import As Excel.Worksheet) As Long()
Dim F_Yach(1) As Long
F_Yach(0) = Import.UsedRange.Column - 1
F_Yach(1) = Import.UsedRange.Row - 1
Return (F_Yach)
End Function