Как прочитать столбец Excel из VB. net, которые имеют 2 типа данных - PullRequest
0 голосов
/ 14 апреля 2020

У меня проблема: в Excel у меня есть столбец с целым числом и строкой. Мне нужно прочитать столбец и заполнить таблицу всем, что у меня есть.

Excel выглядит следующим образом:

Ndedocumento

2.147.483.647,
959.224,
949.143,
530.949,

первый в виде строки, следующий как целое число.

Моя заявка возвращается:

Ndedocumento

null,
959.224,
949.143,
530.949,

Я попытался опубликовать изображения, чтобы вы могли видеть их ясно, но я не допускается. И это снимает с меня ввод между цифрами: (

Знаете ли вы какой-нибудь способ прочитать все значения? Потому что таким образом я получаю значение ни в чем, поэтому я не могу отформатировать его или что-либо, что делает я поймать значение.

вот мой код для чтения в Excel:

    conexion_te.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + ruta_archivo + "; Extended Properties=Excel 12.0 Xml;HDR=YES;"

    Dim cmd As New OleDb.OleDbCommand
    Dim da As New OleDb.OleDbDataAdapter
    Dim dtExt As New DataTable

    cmd.CommandText = "Select * FROM [" + Me.Combo_Tabla_Hoja.SelectedItem + "]"
    cmd.Connection = conexion_te
    da.SelectCommand = cmd
    da.Fill(dtExt)

1 Ответ

0 голосов
/ 14 апреля 2020

Я хотел бы отказаться от использования драйвера ACE для чтения данных из Excel и вместо этого использовать EPPlus, как описано в ответе Тима Шмельтера здесь . Где он начинает свой первый ряд с 2 или 1, вы должны начать с 3 или 2.

Вот версия его кода на VB:

    Public Shared Function GetDataTableFromExcel(path As String, Optional hasHeader As Boolean = True) As DataTable
        Using pck = New OfficeOpenXml.ExcelPackage()

            Using stream = File.OpenRead(path)
                pck.Load(stream)
            End Using


            Dim ws = pck.Workbook.Worksheets.First()
            Dim tbl = New DataTable();

            For Each firstRowCell In ws.Cells(1, 1, 1, ws.Dimension.End.Column)
                tbl.Columns.Add(If(hasHeader, firstRowCell.Text, String.Format("Column {0}", firstRowCell.Start.Column)))
            Next

            Dim startRow = If(hasHeader, 3, 2)

            For rowNum = startRow To ws.Dimension.End.Row Step 1
                Dim wsRow = ws.Cells(rowNum, 1, rowNum, ws.Dimension.End.Column)
                Dim row = tbl.Rows.Add()
                For Each cell In wsRow

                    row(cell.Start.Column - 1) = cell.Text
                Next cell
            Next rowNum

            Return tbl
        End Using

    End Function

Я думаю, что я перевел это правильно, но если это действует странно для вас, включите отладчик и посмотрите, почему. Это вернет таблицу данных, где все столбцы имеют тип string, что должно означать, что ваши данные хорошо представлены. Вы можете делать преобразования и форматирование на нем после

enter image description here

...