【问题标题】:R: Append a worksheet to an excel workbook without reading the entire workbookR:将工作表附加到 Excel 工作簿而不阅读整个工作簿
【发布时间】:2018-03-08 20:33:47
【问题描述】:

我有一个 26 mb 的 Excel 工作簿,我正在尝试向其中添加一个 42 kb 的工作表。使用 openxlsx 包,我有以下代码:

wb_object <- loadWorkbook(to_name2)
addWorksheet(wb_object, "New Data")
writeData(wb_object, sheet = "New Data", m_data)
saveWorkbook(wb_object, to_name2, overwrite = TRUE)

我注意到这段代码大约需要 2 分钟才能执行。我相信 R 正在读取整个 26 mb 文件,然后附加 42 kb 工作表。有没有办法将 42 kb 工作表附加到 26 mb 工作簿而无需读取 26 mb 文件?每次运行将节省 2 分钟。

【问题讨论】:

  • 为了清楚起见,您所做的工作都在 excel 中,所以您不能只在 R 中完成吗?如果您想保留工作簿中的所有内容,据我所知,您必须阅读整个工作簿才能添加页面并重写。
  • 感谢您的快速响应,獾。我在 excel 中创建的 26 mb 文件具有重要的条件格式,尝试在 R 中创建整个工作簿本身将是一项艰巨的任务。我确实想保留工作簿中的所有其他内容,所以如果你说的是真的,那么我想我必须阅读整个工作簿。我怀疑这一点,但非常感谢您的确认。
  • 我不是 R - Excel 交互方面的专家,一旦我去 R,我就断绝了与 Excel 的联系,所以我错的可能性不大。这只是我的经验!不过对于这么小的文件来说,2 分钟是相当不可思议的。
  • 明白了。是的,既然您提到它,26 mb 的文件并不是需要 2 分钟才能读取的大文件。也许是对openxlsx端的限制。

标签: r excel xlsx readxl writexl


【解决方案1】:

我通常使用openxlsx,但我不确定openxlsx 是否可以在不先将 Excel 工作簿加载到 R 中的情况下将工作表添加到 Excel 文件中。但是,使用 xlsx 包,您可以在不加载 Excel 文件的情况下添加新工作表。例如,如果您的文件是“test.xlsx”,那么您可以这样做:

library(xlsx)

write.xlsx(new_data, "test.xlsx", sheetName="New_Sheet", append=TRUE)

如果我需要在 Excel 文件中保存任何内容,我通常会尝试在 R 中执行所有操作,然后在最后将需要的内容写入 Excel 文件。但是,如果您需要添加到现有的 Excel 文件,上面的代码提供了一个选项来执行此操作。

【讨论】:

  • 这看起来是完美的解决方案,非常感谢!会试一试,让你知道它是否有效。
  • 我收到以下错误:.jcall("RJavaTools", "Ljava/lang/Object;", "invokeMethod", cl, : java.lang.OutOfMemoryError: Java heap space考虑到我没有加载 excel,因此不应该使用太多 RAM,我收到此错误似乎很奇怪。
  • 请参阅this answer 了解如何增加 Java 堆空间。
  • 感谢您的快速回答。我独立找到了该链接,并将 RAM 分配增加到 8gb,程序成功执行。但是,执行需要 4 分钟,比上次还慢。
  • 奇怪。我不确定是什么原因造成的。
猜你喜欢
  • 2017-12-21
  • 1970-01-01
  • 1970-01-01
  • 2021-06-16
  • 1970-01-01
  • 1970-01-01
  • 2021-10-03
  • 2017-09-18
相关资源
最近更新 更多