4

我正在使用 R 包 XLConnect 将数据帧写入现有工作簿中的现有 Excel 工作表。excel 工作簿有一个用于原始数据的工作表,我writeWorksheet()在 R 中使用它进行填充,另一个用于格式化数据的工作表,它引用原始数据工作表并执行计算。但是,当我将数据写入 R 中的原始数据工作表时,格式化的数据工作表不会更新并给出“公式引用空单元格”的错误,即使这些单元格中有数据。我不确定此错误是否是由于 R 和 XLConnect 或我的工作簿中的某些原因造成的。当我只是将数据直接复制并粘贴到我的原始数据导入工作表的单元格中时,我没有收到错误消息。请参阅下面的示例,感谢您的帮助:

在 R 中:

library(XLConnect)

# Creating first data frame
L3 <- LETTERS[1:3]
fac <- sample(L3, 10, replace = TRUE)
(d <- data.frame(x = 1, y = 1:10, fac = fac))
df.1<-data.frame(1, 1:10, sample(L3, 10, replace = TRUE))

# Creating second data frame
L4 <- LETTERS[4:7]
fac <- sample(L4, 10, replace = TRUE)
(d <- data.frame(x = 1, y = 1:10, fac = fac))
df.2<-data.frame(1, 1:10, sample(L4, 10, replace = TRUE))

# Reading in workbook
wb      <- loadWorkbook(xlname)
wbnames <- as.vector(getSheets(wb)) # where wbnames is of length two
[1] "Raw Data Import"  [2] "Formatted Data"

# Writing df.1 and df.2 to specific locations in Raw Data Import worksheet
writeWorksheet(wb,df.1,sheet=wbnames[1],startRow=3,header=F)
writeWorksheet(wb,df.2,sheet=wbnames[1],startRow=15,header=F)

# Saving workbook
saveWorkbook(wb)
4

2 回答 2

4

您可以使用 XLConnect 功能setForceFormulaRecalculation()。这会强制 Excel 在打开工作表时重新计算公式值。第二个参数允许您指定要重新计算的工作表。如果设置为“*”,它将重新计算工作簿中的所有公式。

wb      <- loadWorkbook(xlname)
wbnames <- as.vector(getSheets(wb))
writeWorksheet(wb,df.1,sheet=wbnames[1],startRow=3,header=F)
writeWorksheet(wb,df.2,sheet=wbnames[1],startRow=15,header=F)
setForceFormulaRecalculation(wb,"*",TRUE)
saveWorkbook(wb,'~/test.xls')
于 2015-02-04T16:01:49.243 回答
0

直到我createSheet为每张纸添加了一个操作,我才成功。如果您想使用现有的工作表信息,请查看getSheets?getSheetPos

> wb      <- loadWorkbook('~/test.xls')
> wbnames <- as.vector(getSheets(wb)) 
> createSheet(wb, "test1"); createSheet(wb, 'test2')
> writeWorksheet(wb,df.1,sheet='test1',startRow=3,header=F)
> writeWorksheet(wb,df.2,sheet='test2',startRow=15,header=F)
> saveWorkbook(wb,'~/test.xls')

当我后来运行你的代码时,我看到两个数据帧都被写入了Sheet1. 如果我插入了 saveWorkbook 操作,我会在不同的工作表上获得数据:

> writeWorksheet(wb,df.1,sheet='Sheet1',startRow=3,header=F); saveWorkbook(wb,'~/test.xls')
> writeWorksheet(wb,df.2,sheet='Sheet2',startRow=15,header=F)
> saveWorkbook(wb,'~/test.xls')

XLConnect 是一种准商业产品,我认为他们不鼓励向 SO 提出问题,因此您可能需要联系 Mirai Solutions, GMBH。

于 2015-01-07T00:35:20.163 回答