Несоответствие строк при переносе таблицы из Excel в DataTable - Visual Basic .NET
Формулировка задачи:
Доброго времени.
Сложная для объяснения ситуация.
Есть исходный файл Excel (во вложении).
Я его считываю в DataTable используя OleDb.
В итоге в полученной таблице DataTable rows.count (количество строк c данными) на 1 меньше, чем в исходной таблице Excel. Первая строка почему-то не считывается как строка, а идет, как название строк? Не понимаю.
Если перед первой строкой вставить пустую - она тоже не считывается (и в итоге разница в нумерации строк становится уже 2!).
Если эту вставленную строку заполнить цифрами 1,2,3 .... , то она все равно не попадет в DataTable, как будто она пустая.
Почему так происходит - я разобраться не смог.
Открыт для предложений как это все переделать (вплоть до "выкинуть нафиг глючную OleDb и считать каким-нибудь другим методом").
Мне нужно, чтобы в итоговой таблице DataTable номера строк с данными соответствовали исходной таблице Excel (можно меньше на 1), вне зависимости от того - есть пустые строки в начале или нет.
Мой код:
Листинг программы
- Imports System.Data
- Imports System.Data.OleDb
- Public Module ReadExcel
- 'Declaration
- Public IshTable As New System.Data.DataTable 'исходная таблица
- Public File As String
- Public Excel As Excel.Application
- Public WorkBook As Excel.Workbook
- Public ExSheet As Excel.Worksheet
- Public ExRange As Excel.Range
- 'Открываем таблицы, сохраняем их в базу
- Public Sub Main()
- File = "D:\test.xls"
- IshTable = ReadExcelFile(File)
- End Sub
- 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"
- props("Data Source") = FileName
- 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
- 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)
- ' Loop through all Sheets to get data
- 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)
- da.Fill(dt)
- cmd = Nothing
- conn.Close()
- conn.Dispose()
- End Using
- Else
- dt = Nothing
- End If
- Return dt
- End Function
- End Module
Решение задачи: «Несоответствие строк при переносе таблицы из 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
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д