R语言使用xlsx包读取xlsx表格时如何保留空列解决报错
问题背景
使用xlsx包读取.xlsx文件时,无任何填充内容的空列会被函数自动跳过、无法被捕获,执行列名赋值操作时触发如下报错:
'names' attribute [17] must be the same length as the vector [14]
触发报错的原始代码:
wb <- loadWorkbook(".xlsx") sheet1 <- getSheets(wb)[[2]] rows <- getRows(newsheet)[2:3] headerdata <- getCells(rows[1]) %>% lapply(., getCellValue) %>% as.data.frame() rowdata <- getCells(rows[2])%>% lapply(., getCellValue) %>% as.data.frame() names(rowdata) <- headerdata
报错原因
- 代码存在基础笔误:
getRows(newsheet)调用的newsheet变量未提前定义,和前面赋值的工作表对象名sheet1不一致 - 核心逻辑问题:
getCells()默认仅识别存在实际内容的单元格,空列因为无填充值会被自动过滤:表头行存在3个空列,最终返回17个表头字段;数据行对应空列位置无内容,仅返回14个有效值,二者长度不匹配,给names()赋值时就会触发报错。
解决方案
- 方案1:修改
xlsx包读取参数,保留空列
调用getCells()时添加dropEmptyCols = FALSE参数,强制函数不自动跳过空列,同时修正变量名笔误,即可保证表头和数据行列数完全对齐:wb <- loadWorkbook("你的文件路径.xlsx") sheet1 <- getSheets(wb)[[2]] # 修正笔误,读取指定行 rows <- getRows(sheet1)[2:3] # 读取时关闭空列自动跳过逻辑 headerdata <- getCells(rows[1], dropEmptyCols = FALSE) %>% lapply(getCellValue) %>% as.data.frame() rowdata <- getCells(rows[2], dropEmptyCols = FALSE) %>% lapply(getCellValue) %>% as.data.frame() # 取表头第一行的值作为列名 names(rowdata) <- unlist(headerdata[1,]) - 方案2:替换为
readxl包读取(稳定性更高)xlsx包依赖Java环境,空值、格式兼容类bug较多,可替换为无Java依赖的readxl包读取,函数会自动对齐空列、空行,无需额外配置参数:library(readxl) # 直接读取第2个工作表,跳过第1行后将第一行识别为表头 df <- read_excel("你的文件路径.xlsx", sheet = 2, skip = 1)
内容的提问来源于stack exchange,提问作者Ali
相关产品推荐
相关产品推荐

