Я написал скрипт для конвертации файлов 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