【问题标题】:How to import a zipped csv hosted online into Excel如何将在线托管的压缩 csv 导入 Excel
【发布时间】:2016-07-24 03:51:25
【问题描述】:

我有一个简单的链接 www.example.com/file.zip

里面有一个csv文件

下载文件不需要登录表单,它是直接链接。

有没有办法将文件下载到临时文件夹,解压缩,然后作为新工作表导入现有工作表? (全部通过一键VBA)

【问题讨论】:

    标签: vba excel


    【解决方案1】:

    试试下面的代码。它使用 Windows 中内置的 zip 功能,并且要正确加载 CSV 文件,需要将文件重命名为 TXT。

    'Main Procedure
    Sub DownloadAndLoad()
    
        Dim url As String
        Dim targetFolder As String, targetFileZip As String, targetFileCSV As String, targetFileTXT As String
    
        Dim wkbAll As Workbook
        Dim wkbTemp As Workbook
        Dim sDelimiter As String
        Dim newSheet As Worksheet
    
        url = "http://www.example.com/data.zip"
        targetFolder = Environ("TEMP") & "\" & RandomString(6) & "\"
        MkDir targetFolder
        targetFileZip = targetFolder & "data.zip"
        targetFileCSV = targetFolder & "data.csv"
        targetFileTXT = targetFolder & "data.txt"
    
        '1 download file
        DownloadFile url, targetFileZip
    
        '2 extract contents
        Call UnZip(targetFileZip, targetFolder)
    
        '3 rename file
        Name targetFileCSV As targetFileTXT
    
        '4 Load data
        Call LoadFile(targetFileTXT)
    
    End Sub
    
    Private Sub DownloadFile(myURL As String, target As String)
    
        Dim WinHttpReq As Object
        Set WinHttpReq = CreateObject("Microsoft.XMLHTTP")
        WinHttpReq.Open "GET", myURL, False
        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 targetFile, 2  ' 1 = no overwrite, 2 = overwrite
            oStream.Close
        End If
    
    End Sub
    
    
    Private Function RandomString(cb As Integer) As String
    
        Randomize
        Dim rgch As String
        rgch = "abcdefghijklmnopqrstuvwxyz"
        rgch = rgch & UCase(rgch) & "0123456789"
    
        Dim i As Long
        For i = 1 To cb
            RandomString = RandomString & Mid$(rgch, Int(Rnd() * Len(rgch) + 1), 1)
        Next
    
    End Function
    
    Private Function UnZip(PathToUnzipFileTo As Variant, FileNameToUnzip As Variant)
        ' Unzips a file
        ' Note that the default OverWriteExisting is true unless otherwise specified as False.
        Dim objOApp As Object
        Dim varFileNameFolder As Variant
        varFileNameFolder = PathToUnzipFileTo
        Set objOApp = CreateObject("Shell.Application")
        ' the "24" argument below will supress any dialogs if the file already exist. The file will
        ' be replaced. See http://msdn.microsoft.com/en-us/library/windows/desktop/bb787866(v=vs.85).aspx
        objOApp.Namespace(FileNameToUnzip).CopyHere objOApp.Namespace(varFileNameFolder).items, 24
    
    End Function
    
    
    Private Sub LoadFile(file As String)
    
         Set wkbTemp = Workbooks.Open(Filename:=file, Format:=xlCSV, Delimiter:=";", ReadOnly:=True)
    
         wkbTemp.Sheets(1).Cells.Copy
         'here you just want to create a new sheet and paste it to that sheet
         Set newSheet = ThisWorkbook.Sheets.Add
         With newSheet
             .Name = wkbTemp.Name
             .PasteSpecial
         End With
         Application.CutCopyMode = False
         wkbTemp.Close
    
    End Sub
    

    【讨论】:

    • 这非常有用。不过,我遇到了一些问题,主要是我使用自己的方法时遇到的问题:每当我通过 VBA 从 zip 文件中提取 csv 文件时,该文件似乎仍处于压缩状态(大小不会从 75kb 变为 1.1MB)。如果我使用 windows 解压,文件可以正常工作。
    【解决方案2】:

    你可以在那里用简单的代码找到它:

    Download a File with VBA

    Unzip Files

    并使用此 Sub 将文件数据导入新工作表。

    Sub InsertCSVData()
        Sheets.Add After:=Sheets(Sheets.Count)
        With ActiveSheet.QueryTables.Add(Connection:= _
            "TEXT;C:\Ttemp\filename.csv", Destination:=Range("$B$7"))
            .Name = "filename"
            .FieldNames = True
            .RowNumbers = False
            .PreserveFormatting = True
            .RefreshStyle = xlInsertDeleteCells
            .SaveData = True
            .AdjustColumnWidth = True
            .TextFilePlatform = xlWindows
            .TextFileStartRow = 1
            ' Don't forget to choose your delimiters and text type.
            .TextFileParseType = xlDelimited
            .TextFileTextQualifier = xlTextQualifierNone
            .TextFileConsecutiveDelimiter = False
            .TextFileTabDelimiter = False
            .TextFileSemicolonDelimiter = True
            .TextFileCommaDelimiter = False
            .TextFileSpaceDelimiter = False
            .TextFileTrailingMinusNumbers = True
            .Refresh BackgroundQuery:=False
        End With
    End Sub
    

    希望对您有所帮助。

    【讨论】:

      猜你喜欢
      • 2017-06-03
      • 1970-01-01
      • 2015-04-07
      • 2012-08-09
      • 1970-01-01
      • 2012-08-06
      • 1970-01-01
      相关资源
      最近更新 更多