R语言下载网站xlsx文件后用readxl导入报错-103如何解决
错误原因
- 核心原因是你下载的xlsx文件实际已损坏或并非合法的xlsx格式文件。xlsx本质是zip压缩包,readxl读取时会先尝试解压归档,报错
error -103 with zipfile in unzGetCurrentFileInfo就是解压时识别不到合法的zip文件结构导致的。 - 最常见的触发场景:
download.file在处理HTTPS协议的资源时,默认未使用二进制下载模式(尤其Windows系统),导致二进制的xlsx文件被破坏;部分站点会对无请求头的默认下载请求拦截,返回的是HTML错误页面而非真实xlsx文件,你仅修改了后缀名存储,实际文件并非xlsx格式。 - 少数情况为readxl版本过旧,对部分特殊编码的xlsx文件兼容性不足。
解决方案
方法1:调整download.file参数(最便捷)
下载二进制文件时强制指定二进制模式mode = "wb",HTTPS资源指定method = "libcurl",避免文件损坏:
download.file(output$FULL_FINAL_PATH, destfile = "myfile.xlsx", method = "libcurl", mode = "wb")
下载完成后优先校验文件大小,和手动从浏览器下载的目标文件大小对比,确认一致后再读取。
方法2:使用httr包下载(兼容性更强)
httr包会自动处理请求头、HTTPS校验,更适合爬取站点资源:
library(httr) GET(output$FULL_FINAL_PATH, write_disk("myfile.xlsx", overwrite = TRUE))
方法3:验证文件合法性后再读取
如果仍报错,可先确认下载的文件是否为真实xlsx:
# 读取文件前4个字节,合法xlsx为PK开头(对应十六进制50 4b 03 04) head(readBin("myfile.xlsx", "raw", n=4)) # 如果输出不是 50 4b 03 04,说明文件不是xlsx,需要重新检查下载链接和请求逻辑
如果确认是readxl兼容性问题,可升级readxl版本,或换用openxlsx包读取:
install.packages("openxlsx") library(openxlsx) my_data <- read.xlsx("myfile.xlsx", sheet = 1, startRow = 2)
内容的提问来源于stack exchange,提问作者ATMA
相关产品推荐
相关产品推荐

