如何使用Openxlsx包在Excel工作簿中修改现有的工作表?

31
我正在使用"openxlsx"包来读写Excel文件。我有一个固定的文件,其中有一个名为"Data"的工作表,其他工作表中的公式使用该工作表。我想更新这个Data工作表而不影响其他工作表。 我尝试了以下代码:
write.xlsx(x = Rev_4, file = "Revenue.xlsx", sheetName="Data")

但这样会删除Excel文件,并创建一个只包含“Data”工作表中新数据的新文件,而其他所有内容都会被删除。有什么建议吗?

我无法在我现在使用的计算机上测试这个,但是你试过使用参数append = TRUE吗? - leosz
4
“openxlsx”包似乎没有“append=T”选项。我知道这个选项在基于Java的“xlsx”包中存在,但是该包速度较慢,并且处理较大文件时很快会用尽内存。我有一种更繁琐的方法解决此问题,但如果能有一个基于“openxlsx”的解决方案就太好了。 - Nipun Arora
openxlsx是一个实现相当不好的包。如果您想让同样的代码适用于您正在创建的第一个工作表,那么您必须做各种额外的事情才能将工作表添加到现有的工作簿中。 - jzadra
2个回答

38

试试这个:

wb <- loadWorkbook("Revenue.xlsx")
writeData(wb, sheet = "Data", Rev_4, colNames = F)
saveWorkbook(wb,"Revenue.xlsx",overwrite = T)

您需要加载完整的工作簿,然后修改其数据,最后将其保存到磁盘。使用writeData,您还可以指定起始行和列。在保存到磁盘之前,您还可以修改其他部分。


1
这会破坏我的文件。 - Brash Equilibrium
2
如果第一个工作表所在的工作簿不存在,则此方法无法正常工作。 - jzadra
@jzadra 我已经尝试更改工作表的顺序,但仍将数据写入了预定的工作表。 - R. Schifini
3
wb <- createWorkbook() addWorksheet(wb, sheetName = "test1") writeData(wb, sheet = "test1", x = data1) addWorksheet(wb, sheetName = "test2") writeData(wb, sheet = "test2", x = data2) saveWorkbook(wb, "test.xlsx")以上是用R语言来创建一个Excel文件的代码,其中包括创建工作簿、添加工作表、写入数据,并将工作簿保存为名为“test.xlsx”的文件。 - R. Schifini
1
这也会破坏我的文件。经过进一步调查,似乎 openxlsx 会破坏工作簿,如果其中包含它无法处理的 Excel 内容。开发人员似乎正在根据需要更新软件包,因为人们向他们报告了损坏的工作簿。 - grapestory
显示剩余5条评论

2
我找到了这个包。它依赖于openxlsx,可以帮助在一个xlsx文件中插入许多工作表。也许它会更容易一些:

包文档

library(xlsx2dfs)
# However, be careful, the function xlsx2dfs assumes
# that all sheets contain simple tables. If that is not the case,
# use the accepted answer!
dfs <- xlsx2dfs("Revenue.xlsx") # all sheets of file as list of dfs
dfs["Data"] <- Rev_4   # replace df of sheet "Data" by updated df Rev_4
dfs2xlsx(dfs, "Revenue.xlsx") # this overwrites the existing file! cave!

回答问题时,最好写出建议的代码,使用原始问题中提供的示例代码/数据。欢迎来到SO! - Josh
@Josh 我添加了一些代码,使用了原始问题的代码/数据。 - Gwang-Jin Kim
1
@Gwang-JinKim,谢谢。我发表评论是因为Review Queue要求我审查Americo的答案(可能是他的第一个答案?),但你添加的细节对其他人也很有用。 - Josh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接