VB .Net 在 MS 中查看时导出为 CSV 时出现问题 Excel

VB .Net when exporting to CSV issue when viewing in MS Excel

我遇到了一些非常奇怪的事情。导出为 CSV 时,我的顶行显示引号但下面的行向下。

我使用 UTF8 编码并手动将双引号添加到值中,以便用引号括起来。

正在使用的代码是

Dim fs As New IO.FileStream(GenericValueEditorExportFilename.Value, IO.FileMode.Create)
        Dim writer As New IO.StreamWriter(fs, Encoding.UTF8)
        fs.Write(Encoding.UTF8.GetPreamble(), 0, Encoding.UTF8.GetPreamble().Length)
.... 
.... 
....

While reader.Read
                If reader("TargetLanguageID") = targetLanguageID Then
                    writer.WriteLine(Encode(reader("SourcePhrase")) & ", " & Encode(reader("TargetPhrase")))
                End If 
.... 
.... 
....

Friend Shared Function Encode(ByVal value As String) As String
    Return ControlChars.Quote & value.Replace("""", """""") & ControlChars.Quote
End Function

在excel中显示的结果显示为(https://ibb.co/ntMYdw)

当我在 Notepad++ 中打开文件时,文本显示如下。但是每行显示不同。为什么第一行显示它们而第二行没有。 Notepad++ 结果显示为 (https://ibb.co/fMkWWG)

Excel 将第一行视为 headers。

https://whosebug.com/a/24923167/2319909

因此,问题是由为开始写入文件而手动设置文件编码而创建的 BOM 引起的。

fs.Write(Encoding.UTF8.GetPreamble(), 0, Encoding.UTF8.GetPreamble().Length)

删除此问题可解决问题,并且文件仍保持所需的 UTF8 编码,因为它是在流写入器上设置的。所以不需要添加BOM来设置编码。

像这样的东西应该适合你。

Dim str As New StringBuilder

For Each dr As DataRow In Me.NorthwindDataSet.Customers

     For Each field As Object In dr.ItemArray

     str.Append(field.ToString & ",")

     Next

     str.Replace(",", vbNewLine, str.Length - 1, 1)

Next



Try

     My.Computer.FileSystem.WriteAllText("C:\temp\testcsv.csv", str.ToString, False)

Catch ex As Exception

     MessageBox.Show("Write Error")

End Try