互操作 - 将UTF-8 .csv保存为.xlsx

时间:2018-05-02 13:29:12

标签: vb.net interop excel-interop

使用Excel.Interop我想打开.txt或.csv文件并将其另存为excel文件。大多数时候这个简单的代码都有效:

Dim Exl As New Excel.Application()
Dim wb1 As Excel.Workbook = Exl.Workbooks.Open("C:\MyFile.txt", Format:=4)
wb1.SaveAs("C:\MyFile.xlsx", FileFormat:=Excel.XlFileFormat.xlOpenXMLWorkbook)
wb1.Close()
Exl.Quit()

但是,有时正在转换的.txt / .csv包含特殊字符,如ü,ä或ö - 在这些情况下,这些字符将替换为生成的excel文件中的其他字符。 问题似乎是输入文件是UTF-8编码的。所以我试着将第二行改为

Dim wb1 As Excel.Workbook = Exl.Workbooks.Open("C:\MyFile.txt", Format:=4, Origin:=61005)

也不起作用。

我遇到的另一个选择是简单地使用OpenText而不是Open,但是现在我得到了一个例外:

    Dim wb1 As Excel.Workbooks
    wb1.OpenText("C:\MyFile.txt")
    Exl.wb1.SaveAs("C:\MyFile.xlsx", FileFormat:=Excel.XlFileFormat.xlOpenXMLWorkbook)
    wb1.Close()
    Exl.Quit()

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

Workbooks.Open MethodOrigin参数必须是XlPlatform枚举中的值;

 Name          Value               Description  
 xlMacintosh     1                 Macintosh  
 xlMSDOS         3                 MS-DOS 
 xlWindows       2                 Microsoft Windows

您的代码:

wb1 As Excel.Workbook = Exl.Workbooks.Open("C:\MyFile.txt", Format:=4, Origin:=61005)

正在尝试指定code page identifierWorkbooks.OpenText MethodOrigin参数支持此功能。此外,您在标识符值中有转录错误;它应该是65001而不是61005。

以下是使用OpenText方法的示例。

Sub Example()
    Const UTF8CodePage As Int32 = 65001
    Dim app As New Excel.Application
    app.Visible = True
    Dim filePath As String = "F:\TestUTF_8Quoted.txt"
    Dim fi As New IO.FileInfo(filePath)
    app.Workbooks.OpenText(Filename:=filePath, Semicolon:=True, Origin:=UTF8CodePage, TextQualifier:=Excel.XlTextQualifier.xlTextQualifierDoubleQuote)
    Dim wb As Excel.Workbook = app.Workbooks.Item(fi.Name)
    wb.Close(False)
    app.Quit()
End Sub