ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 2908|回复: 8

不解压直接读取zip压缩包

[复制链接]

TA的精华主题

TA的得分主题

发表于 2018-4-25 21:39 | 显示全部楼层 |阅读模式
我们知道Power Query能够连接很多不同格式的数据源,但同时还有很多是不能直接支持的,比如word文档、压缩包等等。
有这样一种场景:源数据来自于网络或者远程服务器,每天更新,文件格式是zip,压缩包内有csv。
如果不能直接读取zip,那么我们需要每天把zip下载下来,解压后再导入Power Query,非常麻烦,有什么办法可以解决这个问题呢?

TA的精华主题

TA的得分主题

发表于 2018-4-26 22:34 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
  1. // 定义文件解压函数
  2. UnZipFiles = (ZIPFile) =>
  3. let
  4.     Header = BinaryFormat.Record([
  5.         MiscHeader = BinaryFormat.Binary(14),
  6.         BinarySize = BinaryFormat.ByteOrder(BinaryFormat.UnsignedInteger32, ByteOrder.LittleEndian),
  7.         FileSize   = BinaryFormat.ByteOrder(BinaryFormat.UnsignedInteger32, ByteOrder.LittleEndian),
  8.         FileNameLen= BinaryFormat.ByteOrder(BinaryFormat.UnsignedInteger16, ByteOrder.LittleEndian),
  9.         ExtrasLen  = BinaryFormat.ByteOrder(BinaryFormat.UnsignedInteger16, ByteOrder.LittleEndian)   
  10.     ]),

  11.     HeaderChoice = BinaryFormat.Choice(
  12.         BinaryFormat.ByteOrder(BinaryFormat.UnsignedInteger32, ByteOrder.LittleEndian),
  13.         each if _ <> 67324752             // not the IsValid number? then return a dummy formatter
  14.             then BinaryFormat.Record([IsValid = false, Filename=null, Content=null])
  15.             else BinaryFormat.Choice(
  16.                     BinaryFormat.Binary(26),      // Header payload - 14+4+4+2+2
  17.                     each BinaryFormat.Record([
  18.                         IsValid  = true,
  19.                         Filename = BinaryFormat.Text(Header(_)[FileNameLen]),
  20.                         Extras   = BinaryFormat.Text(Header(_)[ExtrasLen]),
  21.                         Content  = BinaryFormat.Transform(
  22.                             BinaryFormat.Binary(Header(_)[BinarySize]),
  23.                             (x) => try Binary.Buffer(Binary.Decompress(x, Compression.Deflate)) otherwise null
  24.                         )
  25.                         ]),
  26.                         type binary                   // enable streaming
  27.                 )
  28.     ),

  29.     ZipFormat = BinaryFormat.List(HeaderChoice, each _[IsValid] = true),

  30.     Entries = List.Transform(
  31.         List.RemoveLastN( ZipFormat(ZIPFile), 1),
  32.         (e) => [FileName = e[Filename], Content = e[Content] ]
  33.     )
  34. in
  35.     Table.FromRecords(Entries)

  36. // 调用文件解压函数   
  37. let
  38.     源 = File.Contents("C:\Users\Administrator\Desktop\ZipFile\新建文件夹.zip"),
  39.     Resulte = UnZipFiles(源)
  40. in
  41.     Resulte
复制代码


TA的精华主题

TA的得分主题

发表于 2018-4-26 22:39 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 张文洲 于 2018-4-27 11:50 编辑


UnZipFiles Code.rar (823 Bytes, 下载次数: 55)
2018-04-26_223658.jpg

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-4-28 06:16 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2018-4-28 06:39 来自手机 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2018-4-28 06:42 来自手机 | 显示全部楼层
UnZipFiles = (ZIPFile) =>
  // enable streaming
       python?

TA的精华主题

TA的得分主题

发表于 2018-4-28 06:46 来自手机 | 显示全部楼层
unzip.exe rar.exe 应该可以解压吧,直接读取openxml或许可以,不过没试过。https://msdn.microsoft.com/en-us/library/bb448854(office.14).aspx

TA的精华主题

TA的得分主题

发表于 2018-4-28 06:51 来自手机 | 显示全部楼层
https://msdn.microsoft.com/en-us/library/system.io.compression.zipfile.openread(v=vs.110).aspx
这篇文章可以看看

TA的精华主题

TA的得分主题

发表于 2022-3-12 16:37 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-4-27 12:55 , Processed in 0.032566 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表