从zip压缩包解压的xls文件读取时报libxls无法打开错误如何解决
问题原因
你遇到的libxls error: Unable to open file报错,是因为readxl依赖的底层解析库libxls仅支持二进制格式的Excel 97-2003(.xls)文件。你下载的该IBGE公开的.xls文件实际为XML Spreadsheet 2003格式,属于类XML的文本类xls格式,虽然文件签名识别结果为xls,但libxls无法解析该类格式。
可行解决方案
方案1:使用openxlsx2包读取(无需额外环境依赖,推荐)
openxlsx2对XML Spreadsheet格式的xls文件有良好支持,替换读取部分的代码即可:
# 安装依赖包(首次运行执行) if(!require(openxlsx2)){ install.packages("openxlsx2") } # 读取文件 file <- openxlsx2::read_xlsx( file = paste0(temp_,"/Tab_Compl_CNT_1T21.xls"), sheet = "Base Móvel", skip = 3 )
方案2:使用rio包自动适配读取引擎
rio包会自动根据文件格式匹配最优的读取引擎,无需手动判断文件类型:
# 安装依赖包(首次运行执行) if(!require(rio)){ install.packages("rio") } # 读取文件 file <- rio::import( file = paste0(temp_,"/Tab_Compl_CNT_1T21.xls"), sheet = "Base Móvel", skip = 3 )
方案3:使用XLConnect包读取(需本地配置Java环境)
如果本地已配置Java运行环境,XLConnect对各类非标准Excel格式的兼容性更高:
# 安装依赖包(首次运行执行) if(!require(XLConnect)){ install.packages("XLConnect") } # 读取文件 wb <- XLConnect::loadWorkbook(paste0(temp_,"/Tab_Compl_CNT_1T21.xls")) file <- XLConnect::readWorksheet(wb, sheet = "Base Móvel", startRow = 4)
如果执行上述方案后仍读取失败,可先删除本地缓存的压缩包和解压文件,重新执行下载、解压流程,排除文件下载损坏的影响。
内容的提问来源于stack exchange,提问作者yuri_passuelo
相关产品推荐
相关产品推荐

