Подтвердить что ты не робот

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; ‰; ™,™;

4b9b3361

Ответ 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 просто отлично.