Отсутствие данных при конвертации xlsx в csv с использованием OleDb.OleDbConnection - PullRequest
0 голосов
/ 06 ноября 2018

Я написал скрипт для конвертации файлов XLSX в CSV.

это работало довольно хорошо, но теперь я получаю интересную ошибку в зависимости от данных в xlsx.

Это то, что я узнал до сих пор:

Если данные выглядят так в xlsx:

col # ID (1) 50690

(2) 50844

(3) ABC

(4) 50899

(5) 123ABCD

(6) ABCDE

(7) 123456

Файл CSV НЕ будет содержать данные из (3), (5), (6)

Если данные выглядят так в xlsx:

col # ID (1) ABC

(2) 50844

(3) ABC

(4) 50899

(5) 123ABCD

(6) ABCDE

(7) 123456

Файл CSV будет содержать все данные.

Так почему же мне нужна строка в первом столбце, чтобы она работала правильно? Как я могу сказать скрипту, чтобы он всегда использовал STRING в качестве типа данных, а не тип данных первого вхождения.

Public Sub ConvertXLS2CSV(ByVal fullPathSource As String, ByVal fullPathTarget As String, ByVal filename As String)
        Dim logger = LoggerFactory.CreateLogger(Me, MethodBase.GetCurrentMethod())
        logger.BeginMethod(New List(Of Object)({fullPathSource, fullPathTarget, filename}))

        'The data will be read with header row by default. fileHasHeader can be YES/NO
        Dim cDelimiter As Char = System.Convert.ToChar(CCC_GetConfigParm("Custom\OdBSystems\CSVDelimiter")) 'Default: "~"c Delimiter for the new CSV File
        Const fileHasHeader As String = "YES"
        Dim sSheetName As String = String.Empty

        'Build ConnectionString
        Dim sConnection As String =
String.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=""Excel 12.0;HDR={1};IMEX=1""", fullPathSource, fileHasHeader)

        Try
            Using oleExcelConnection As New OleDb.OleDbConnection(sConnection)
                oleExcelConnection.Open()
                Using dtTablesList = oleExcelConnection.GetSchema("Tables")

                    If dtTablesList.Rows.Count > 0 Then
                        sSheetName = dtTablesList.Rows(0)("TABLE_NAME").ToString
                    End If
                    ' Check if the data sheet has a worksheet(table)
                    If sSheetName <> "" Then

                        Dim whereClauseXLSX As String = String.Empty
                        whereClauseXLSX = "SELECT * FROM [" & sSheetName & "]"

                        'Build Command to execute
                        Dim oleExcelCommand As OleDb.OleDbCommand = oleExcelConnection.CreateCommand()
                        oleExcelCommand.CommandText = whereClauseXLSX
                        oleExcelCommand.CommandType = CommandType.Text

                        'Initiate Adapter to execute command
                        Dim da As New OleDb.OleDbDataAdapter(oleExcelCommand)
                        Dim ds As New DataSet()

                        'Poupulate dataset with executed result
                        da.Fill(ds, sSheetName)

                        'Form string builder to export as CSV File
                        Dim dt As DataTable = ds.Tables(sSheetName)
                        Dim sb As New StringBuilder()

                        'Export ColumnNames
                        Dim columnNames As IEnumerable(Of String) = dt.Columns.Cast(Of DataColumn)().[Select](Function(column) column.ColumnName)
                        sb.AppendLine(String.Join(cDelimiter, columnNames))


                'Export Rows
                        For Each row As DataRow In dt.Rows.Cast(Of DataRow).ToList

                            Dim fields As IEnumerable(Of String) = row.ItemArray.[Select](Function(field) field.ToString())
                            Dim newline As String = String.Join(cDelimiter, fields).Replace(vbCr, "").Replace(vbLf, "")
                            Dim newlineWithoutDelimiter As String = newline.Replace(cDelimiter, "")

                            If Not String.IsNullOrWhiteSpace(newlineWithoutDelimiter) Then
                                sb.AppendLine(newline)
                            End If

                        Next

            'DEBUG stuff                
            Dim test As StringBuilder = New StringBuilder
                        test.Appendline(dt.Rows(dt.Rows.Count - 1)(13).toString)
                        test.Appendline(dt.Rows(dt.Rows.Count - 2)(13).toString)
                        test.Appendline(dt.Rows(dt.Rows.Count - 3)(13).toString)
                        test.Appendline(dt.Rows(dt.Rows.Count - 4)(13).toString)
                        'Throw New ViException(test.ToString)

                        File.WriteAllText(String.Format("{0}.csv", fullPathTarget), sb.ToString(), Text.Encoding.UTF8)

                    End If
                End Using
                'End using will close all open connections
            End Using
            'End using will close all open connections

        Catch ex As Exception
            Throw New ViException(String.Format("Error while reading XLSX-File: Exception: {0}", ex.Message))
        End Try
    End Sub

Спасибо.

С наилучшими пожеланиями, DonLedger

...