在VB.NET中读取Excel文件时处理特殊字符

时间:2014-10-30 17:01:56

标签: vb.net visual-studio-2013 streamwriter oledbdataadapter

我正在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日期格式。

建议?

0 个答案:

没有答案