Несоответствие строк при переносе таблицы из Excel в DataTable - Visual Basic .NET

Узнай цену своей работы

Формулировка задачи:

Доброго времени. Сложная для объяснения ситуация. Есть исходный файл Excel (во вложении). Я его считываю в DataTable используя OleDb. В итоге в полученной таблице DataTable rows.count (количество строк c данными) на 1 меньше, чем в исходной таблице Excel. Первая строка почему-то не считывается как строка, а идет, как название строк? Не понимаю. Если перед первой строкой вставить пустую - она тоже не считывается (и в итоге разница в нумерации строк становится уже 2!). Если эту вставленную строку заполнить цифрами 1,2,3 .... , то она все равно не попадет в DataTable, как будто она пустая. Почему так происходит - я разобраться не смог. Открыт для предложений как это все переделать (вплоть до "выкинуть нафиг глючную OleDb и считать каким-нибудь другим методом"). Мне нужно, чтобы в итоговой таблице DataTable номера строк с данными соответствовали исходной таблице Excel (можно меньше на 1), вне зависимости от того - есть пустые строки в начале или нет. Мой код:
Листинг программы
  1. Imports System.Data
  2. Imports System.Data.OleDb
  3. Public Module ReadExcel
  4. 'Declaration
  5. Public IshTable As New System.Data.DataTable 'исходная таблица
  6. Public File As String
  7. Public Excel As Excel.Application
  8. Public WorkBook As Excel.Workbook
  9. Public ExSheet As Excel.Worksheet
  10. Public ExRange As Excel.Range
  11. 'Открываем таблицы, сохраняем их в базу
  12. Public Sub Main()
  13. File = "D:\test.xls"
  14. IshTable = ReadExcelFile(File)
  15. End Sub
  16. Private Function GetConnectionString(ByVal FileName As String) As String
  17. Dim props As New Dictionary(Of String, String)()
  18. Try
  19. Dim check As String = GetExtension(FileName)
  20. If check.EndsWith("xls") Then
  21. ' XLS - Excel 2003 and Older
  22. props("Provider") = "Microsoft.Jet.OLEDB.4.0"
  23. props("Extended Properties") = "Excel 8.0"
  24. props("Data Source") = FileName
  25. Else
  26. MsgBox("Неизвестный формат файла: " & check.ToString())
  27. props("Data Source") = ""
  28. End If
  29. Catch ex As Exception
  30. MsgBox(ex.ToString())
  31. End Try
  32. Dim sb As New StringBuilder()
  33. For Each prop As KeyValuePair(Of String, String) In props
  34. sb.Append(prop.Key)
  35. sb.Append("="c)
  36. sb.Append(prop.Value)
  37. sb.Append(";"c)
  38. Next
  39. Return sb.ToString()
  40. End Function
  41. Private Function ReadExcelFile(ByVal FileName As String) As System.Data.DataTable
  42. ' Dim ds As New DataSet()
  43. Dim dt As New System.Data.DataTable()
  44. Dim connectionString As String = GetConnectionString(FileName)
  45. If Not connectionString = "Data Source=;" Then
  46. Using conn As New System.Data.OleDb.OleDbConnection(connectionString)
  47. conn.Open()
  48. Dim cmd As New OleDbCommand()
  49. cmd.Connection = conn
  50. ' Get all Sheets in Excel File
  51. Dim dtSheet As System.Data.DataTable = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, Nothing)
  52. ' Loop through all Sheets to get data
  53. Dim sheetName As String
  54. sheetName = ""
  55. sheetName = dtSheet.Rows(0)("TABLE_NAME").ToString()
  56. ' Get all rows from the Sheet
  57. cmd.CommandText = "SELECT * FROM [" & sheetName & "]"
  58. dt.TableName = sheetName
  59. Dim da As New OleDbDataAdapter(cmd)
  60. da.Fill(dt)
  61. cmd = Nothing
  62. conn.Close()
  63. conn.Dispose()
  64. End Using
  65. Else
  66. dt = Nothing
  67. End If
  68. Return dt
  69. End Function
  70. End Module

Решение задачи: «Несоответствие строк при переносе таблицы из Excel в DataTable»

textual
Листинг программы
  1.     Private Function GetConnectionString(ByVal FileName As String) As String
  2.         Dim props As New Dictionary(Of String, String)()
  3.         Try
  4.             Dim check As String = GetExtension(FileName)
  5.             If check.EndsWith("xls") Then
  6.                 ' XLS - Excel 2003 and Older
  7.                 props("Provider") = "Microsoft.Jet.OLEDB.4.0"
  8.                 props("Extended Properties") = "'Excel 8.0;HDR=No;IMEX=1'"
  9.                 props("Data Source") = FileName
  10.             ElseIf check.EndsWith("xlsx") Then
  11.                 'XLSX - Excel 2007, 2010, 2012, 2013
  12.                 '  props("Provider") = "Microsoft.ACE.OLEDB.12.0"
  13.                 '  props("Extended Properties") = "Excel 12.0 XML"
  14.                 '  props("Data Source") = FileName
  15.                 MsgBox("Простите, работа с файлами .xlsx временно не поддерживается")
  16.                 props("Data Source") = ""
  17.             Else
  18.                 MsgBox("Неизвестный формат файла: " & check.ToString())
  19.                 props("Data Source") = ""
  20.             End If
  21.  
  22.         Catch ex As Exception
  23.             MsgBox(ex.ToString())
  24.         End Try
  25.  
  26.         Dim sb As New StringBuilder()
  27.  
  28.         For Each prop As KeyValuePair(Of String, String) In props
  29.             sb.Append(prop.Key)
  30.             sb.Append("="c)
  31.             sb.Append(prop.Value)
  32.             sb.Append(";"c)
  33.         Next
  34.  
  35.         Return sb.ToString()
  36.     End Function
  37.  
  38. 'Копируем первый лист из книги в DataTable. Импортируем ПОЛНЫЙ ПУТЬ ФАЙЛА
  39.     Private Function ReadExcelFile(ByVal FileName As String) As System.Data.DataTable
  40.         '  Dim ds As New DataSet()
  41.         Dim dt As New System.Data.DataTable()
  42.  
  43.         Dim connectionString As String = GetConnectionString(FileName)
  44.  
  45.         If Not connectionString = "Data Source=;" Then
  46.             Using conn As New System.Data.OleDb.OleDbConnection(connectionString)
  47.                 conn.Open()
  48.                 Dim cmd As New OleDbCommand()
  49.                 cmd.Connection = conn
  50.                 ' Get all Sheets in Excel File
  51.                 Dim dtSheet As System.Data.DataTable = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, Nothing)
  52.                 ' Get name of the first sheet
  53.                 Dim sheetName As String
  54.                 sheetName = ""
  55.                 sheetName = dtSheet.Rows(0)("TABLE_NAME").ToString()
  56.                 ' Get all rows from the Sheet
  57.                 cmd.CommandText = "SELECT * FROM [" & sheetName & "]"
  58.                 dt.TableName = sheetName
  59.                 Dim da As New OleDbDataAdapter(cmd)
  60.                 Try
  61.                     da.Fill(dt)
  62.                 Catch ex As Exception
  63.                     MsgBox(ex.ToString)
  64.                 End Try
  65.                 cmd = Nothing
  66.                 conn.Close()
  67.                 conn.Dispose()
  68.             End Using
  69.         Else
  70.             dt = Nothing
  71.         End If
  72.         Return dt
  73.     End Function
  74.  
  75.         'Получаем количество пустых столбцов и строк в начале файла. Импортируем ЛИСТ excel.
  76.         Private Function GetSpaces(ByVal Import As Excel.Worksheet) As Long()
  77.         Dim F_Yach(1) As Long
  78.         F_Yach(0) = Import.UsedRange.Column - 1
  79.         F_Yach(1) = Import.UsedRange.Row - 1
  80.  
  81.         Return (F_Yach)
  82.     End Function

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


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

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

13   голосов , оценка 3.923 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы