我正在VS2013 Pro中开发Windows窗体应用程序,在应用程序中我正在将XLSX文件转换为CSV文件。转换代码很有效,只有一个例外:某些特殊字符要么被省略,要么导致整个当前单元格的内容被省略(产生一个空字符串) - 通常会发生后一种情况。
以下是代码:
Private Shared Sub convertExcelToCsv(ByVal sourceFile As String, ByVal workSheetName As String, ByVal targetFile As String)
Dim strConn As String = "provider=microsoft.ace.oledb.12.0;data source=" & sourceFile & ";extended properties=""excel 12.0 xml;hdr=no"""
Dim conn As OleDbConnection = Nothing
Dim wrtr As StreamWriter = Nothing
Dim cmd As OleDbCommand = Nothing
Dim da As OleDbDataAdapter = Nothing
Try
conn = New OleDbConnection(strConn)
conn.Open()
cmd = New OleDbCommand("select * from [" & workSheetName & "$]", conn)
cmd.CommandType = CommandType.Text
wrtr = New StreamWriter(targetfile)
da = New OleDbDataAdapter(cmd)
Dim dt As DataTable = New DataTable()
da.Fill(dt)
For x As Integer = 0 To dt.Rows.Count - 1
Dim rowString As String = ""
For y As Integer = 0 To dt.Columns.Count - 1
' Get the current cell's contents, replace any pipe characters with a dash and remove any leading and trailing spaces
Dim strCellText As String = dt.Rows(x)(y).ToString()
Dim strCellTextCleaned As String = strCellText.Replace("|", "-").Trim
rowString &= strCellTextCleaned & "|" ' System set up with pipe-delimited files
Next y
wrtr.WriteLine(rowString)
Next x
MessageBox.Show("Done! your " & sourceFile & " has been converted into " & targetFile & ".")
Catch ex As Exception
MessageBox.Show(ex.ToString())
Finally
If conn.State = ConnectionState.Open Then
conn.Close()
End If
Try
wrtr.Close()
Catch ex As Exception
MessageBox.Show(ex.ToString())
End Try
End Try
End Sub
当我在运行时查看变量strCellText时,我看到的单元格以空格结尾,然后是标题单元格中的井号(#) - ,奇怪的是,正在返回一个空字符串 - 我在其他单元格中放置了一个spaceh / hash标记,它们很好。
我在细胞中尝试了其他特殊字符,我发现这些字符:!,%,&导致整个单元格作为空字符串返回 - 只有当字符位于单元格内容的开头或结尾时,并且有一个空格将字符与文本的其余部分分开。
因此,在我正在使用列标题“PROJECT#”进行测试的文件中,变为空字符串(两个其他标题单元格以空格/哈希结尾),但单元格A2以空格/哈希结尾,但是通过。具有哈希标记的单元格也是如此。
带有“& 0”,“%test”和“!12345”的单元格都被写入csv作为该单元格的空字符串。
但如果我将任何上述字符放在 的单元格内容中,它们就会通过。
我需要能够允许这些角色 - 我该怎么做?
感谢。
更新
根据Icepickle的建议我在连接字符串的末尾添加了“IMEX = 1” - 这解决了一个问题(没有具有特殊字符的空单元格),但导致了另一个问题:在测试时我在字段中添加了一个百分号我的日期格式为M / D / YYYY。百分比在日期之前。在该列的其余部分 - 对于每个其他日期值 - 它们都设置为五位数值。它将日期列格式化为常规格式类型字段。源文件将该列格式化为MM / DD / YYYY日期格式。
建议?