Несоответствие строк при переносе таблицы из 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
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д