将XLConnect函数映射到工作簿列表的奇怪行为

时间:2016-12-12 19:17:34

标签: r loops xlconnect

第1部分:

我正在尝试使用lapplyXLConnect重命名工作簿列表中的工作表(我需要重命名它们以使代码的下一部分正常运行,更多内容在第2部分中) :

library(XLConnect)

# testWB.xlsx contains a blank worksheet called Sheet1
testWB <- rep(lapply("testWB.xlsx", loadWorkbook), 3)

lapply(1:length(testWB), function(x) {
  renameSheet(testWB[[x]], "Sheet1", "test1")
})

给我错误:

`Error: IllegalArgumentException (Java): Sheet index (-1) is out of range (0..0)`

可是:

renameSheet(testWB[[1]], "Sheet1", "test1")

按原样重命名工作表。这很奇怪,renameSheet不适用于lapply,但getActiveSheetIndex确实适用于lapply。

unlist(lapply(1:length(testWB), function(x) {
  getActiveSheetIndex(testWB[[x]])
}))
[1] 1 1 1

我测试了其他XLConnect函数,有些函数在lapply中工作,而其他函数则没有。

第2部分:

我需要重命名工作表才能使writeWorksheet函数正常工作。 E.g:

cell_data <- c("Larry", "Curly", "Moe")

unlist(lapply(1:length(testWB), function(x) {
  writeWorksheet(testWB[[x]], cell_data[x], sheet = "sheet1", header = F)
  readWorksheet(testWB[[x]], "Sheet1", header = F)
}))
Col1    Col1    Col1 
"Larry" "Curly"   "Moe" 

但在运行上述循环后查看testWB:

unlist(lapply(1:length(testWB), function(x) {
  readWorksheet(testWB[[x]], "Sheet1", header = F)
}))
Col1  Col1  Col1 
"Moe" "Moe" "Moe"

正如您所看到的,最终将Moe输入到每个工作簿中每个工作表的所有A1单元格中,而不是在每个相应工作簿的A1单元格中输入Larry, Curly, Moe。如果工作簿表具有不同的名称(例如,Sheet1,Sheet2,Sheet3),则它可以正常工作。因此我的问题在第一部分。

由于我没有使用它,我不得不在R中重建testWB.xlsx模板并重新应用格式。 testWB.xlsx实际上是一种非常细致的excel形式,所以重新创建它并不理想。

我希望我错过了一些小事,并提前感谢您提出任何建议。

XLConnect版本0.2-12

0 个答案:

没有答案