VBA импортирует файл CSV UTF-8 с веб-сервера
У меня есть файл CSV UTF-8, хранящийся на веб-сервере. Когда я загружаю файл, поместите его на свой жесткий диск, а затем импортирую его в лист 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
Все символы (вьетнамские символы) отображаются правильно.
Когда я пытаюсь использовать тот же макрос, но вместо того, чтобы указывать локальный адрес файла ( "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; ‰; ™,™
который Excel неправильно читает как: „; Â; ˜; Â1/4; ‰; ™,™;
Ответы
Ответ 1
Если символы отображаются правильно при загрузке файла csv
самостоятельно, я бы разделил процесс на 2 этапа:
Загрузка
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 (vietnamese), которая по умолчанию установлена на False
.
Объединяя все вместе
Sub DownloadAndLoad
DownloadFile "http://myserver.com/myFile.csv","C:\myFile.csv"
OpenCsv "C:\myFile.csv"
End Sub
Ответ 2
Я рассматриваю аналогичную проблему, когда мы импортируем файлы csv, закодированные в utf-8, на рабочий лист. Я не вынимаю данные с веб-сервера, но это может помочь.
Мое решение - прочитать файл utf-8 локальной переменной, а затем вставить ее в лист. Я попытался сохранить данные во временном файле с помощью 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")
Ответ 3
IMO, кажется, что в Excel появляется ошибка/конфликт при открытии файлов UTF-8/UTF-8-BOM с использованием записанного макрокода, особенно если параметр Origin
установлен на 65001
, который предполагается UTF-8.
Я нашел два обхода этой проблемы:
-
Удалите параметр Origin
из вызова функции и проверьте, правильно ли загружен файл Workbooks.OpenText Filename:="C:\file.csv"
.
MSDN говорит:
Если этот аргумент опущен, метод использует текущую настройку параметр "Происхождение файла" в Мастере импорта текста.
Я думаю, что как только вы свяжете файл с Excel, он должен попытаться прочитать заголовок файла и выбрать правильный Код страны автоматически (ну, если заголовок не отсутствует).
-
Я пробовал разные Коды стран и обнаружил, что в моем конкретном сценарии установка Origin:=1252
(1252 - windows-1252 - ANSI Latin 1; Western European (Windows)
) загружает файл в Excel просто отлично.