Несоответствие строк при переносе таблицы из 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

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 3.923 из 5
Похожие ответы