VBA从Web服务器导入UTF-8 CSV文件

我有一个存储在Web服务器上的UTF-8 CSV文件。 当我下载文件时,把它放在我的硬盘上,然后用macros(从macroslogging器)将它导入到Excel工作表中:

Sub Macro2() Workbooks.OpenText Filename:= _ "C:/myFile.csv", Origin _ :=65001, StartRow:=1, DataType:=xlDelimited, TextQualifier:= _ xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, Semicolon:=False _ , Comma:=True, Space:=False, Other:=False End Sub 

所有的字符(越南字符)都显示正确。

当我尝试使用相同的macros而不是给出文件的本地地址(“C:/myFile.csv”)时,我传递了该文件的URL(“ http://myserver.com/myFile.csv ”)CSV被正确地导入到我的Excel工作表中,但越南的字符不能正确显示。

我也尝试使用数据选项卡,但编码似乎被忽略的Excel:

 With ActiveSheet.QueryTables.Add(Connection:= _ "TEXT;C:/myFile.csv" _ , Destination:=Range("$A$1")) .Name = "myFile.csv" .FieldNames = True .RowNumbers = False .FillAdjacentFormulas = False .PreserveFormatting = True .RefreshOnFileOpen = False .RefreshStyle = xlInsertDeleteCells .SavePassword = False .SaveData = True .AdjustColumnWidth = True .RefreshPeriod = 0 .TextFilePromptOnRefresh = False .TextFilePlatform = 65001 .TextFileStartRow = 1 .TextFileParseType = xlDelimited .TextFileTextQualifier = xlTextQualifierDoubleQuote .TextFileConsecutiveDelimiter = False .TextFileTabDelimiter = True .TextFileSemicolonDelimiter = False .TextFileCommaDelimiter = False .TextFileSpaceDelimiter = False .TextFileOtherDelimiter = "~" .TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1) .TextFileTrailingMinusNumbers = True .Refresh BackgroundQuery:=False End With 

示例数据: „; Â; ˜; Â1/4; ‰; ™,™ „; Â; ˜; Â1/4; ‰; ™,™

哪些Excel读取错误为:? „; Â; ˜; Â1/4; ‰; ™,™; „; Â; ˜; Â1/4; ‰; ™,™;

如果你自己下载csv文件时字符显示正确,我会把这个过程分成两个阶段:

下载

 Sub DownloadFile(ByVal url As String, ByVal local As String) Dim WinHttpReq As Object Set WinHttpReq = CreateObject("Microsoft.XMLHTTP") WinHttpReq.Open "GET", url, False, "username", "password" WinHttpReq.send myURL = WinHttpReq.responseBody If WinHttpReq.Status = 200 Then Set oStream = CreateObject("ADODB.Stream") oStream.Open oStream.Type = 1 oStream.Write WinHttpReq.responseBody oStream.SaveToFile local, 2 oStream.Close End If End Sub 

加载CSV

 Sub OpenCsv(ByVal csvfile As String) Workbooks.OpenText Filename:= _ csvfile,Local:=True,StartRow:=1, DataType:=xlDelimited, TextQualifier:= _ xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, Semicolon:=False _ , Comma:=True, Space:=False, Other:=False End Sub 

注意: Local参数是这里的关键,它使得VBA使用你的excel的本地configuration(越南语),默认设置为False

把它放在一起

 Sub DownloadAndLoad DownloadFile "http://myserver.com/myFile.csv","C:\myFile.csv" OpenCsv "C:\myFile.csv" End Sub 

我一直在寻找类似的问题,我们将utf-8编码的csv文件导入到工作表中。 我不是从Web服务器拉数据,但这可能有帮助。

我的解决scheme是读取utf-8文件到本地variables,然后将其插入到工作表中。 我试图用ansi编码将数据保存到临时文件中,但这样做会导致所有的字符都失去重音。

 Function ReadUTF8CSVToSheet(file As String) Dim ws As Worksheet Dim strText As String ' read utf-8 file to strText variable With CreateObject("ADODB.Stream") .Open .Type = 1 ' Private Const adTypeBinary = 1 .LoadFromFile file .Type = 2 ' Private Const adTypeText = 2 .Charset = "utf-8" strText = .ReadText(-1) ' Private Const adReadAll = -1 End With ' parse strText data to a sheet Set ws = Sheets.Add() intRow = 1 For Each strLine In Split(strText, chr(10)) If strLine <> "" Then With ws .Cells(intRow, 1) = strLine .Cells(intRow, 1).TextToColumns Destination:=Cells(intRow, 1), DataType:=xlDelimited, _ TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _ Semicolon:=False, Comma:=True, Space:=False, Other:=False End With intRow = intRow + 1 End If Next strLine ReadUTF8CSVToSheet = ws.Name End Function ' to run strSheetName = ReadUTF8CSVToSheet("C:\temp\utf8file.csv") 

国际海事组织,似乎有一个Excel中的错误/冲突,当使用logging的macros代码打开UTF-8 / UTF-8-BOM文件,特别是当Origin参数设置为65001 ,这应该是UTF-8。

我发现了这个问题的两个解决方法:

  1. 从函数调用中删除Origin参数,看看文件是否正确加载Workbooks.OpenText Filename:="C:\file.csv"

    MSDN说 :

    如果省略此参数,则该方法使用文本导入向导中的“文件原点”选项的当前设置。

    我认为,只要你与Excel链接文件,它应该尝试读取文件的标题,并自动select正确的国家代码 (当然,假设头不失踪 )。

  2. 我已经尝试了不同的国家代码 ,发现在我的具体情况设置Origin:=12521252 - windows-1252 - ANSI Latin 1; Western European (Windows) )加载文件在Excel中就好了。