如何使用 R 而不是整个数据表更改 excel 文件中的单个条目?

Posted

技术标签:

【中文标题】如何使用 R 而不是整个数据表更改 excel 文件中的单个条目?【英文标题】:How can you change single entries in an excel file with R and not the entire data sheet? 【发布时间】:2020-03-15 01:58:08 【问题描述】:

我有一个包含一些数据的 excel 文件。我想使用 R 在所述工作表上运行一些统计信息,然后将一些值保存到原始 Excel 工作表中的不同列中。 有没有办法做到这一点而不总是“覆盖”整个excel文件?

My_data <- read_xlsx("MeasurementData.xlsx", sheet = "Data_Overview")
data$Column1[1] = "result"
write.xlsx(My_data, file="MeasurementData.xlsx", sheetname="Data_Overview" )

所以我试图用这段代码做的是打开我的 xlsx 文件,将其中的一个条目更改为“结果”,然后将整个稍微更改的数据帧重写到 xlsx 文件中。 但是我想要的是不重写整个文件,而只是覆盖/替换更改的条目。

有没有办法做到这一点? 谢谢!

【问题讨论】:

这样做的目的是什么,只要最终得到相同的结果?在大多数编程语言中更新文件的工作方式如下:“read->modify->write”。 嗨!如果我更新整个文件,excel 文件中的所有格式和 cmets 等都会消失。因为我不希望我正在寻找一种仅更新单个单元格的方法,所以文档的其余部分(在我的理论中)应该保持不变。这可能吗? 我明白你的意思。感谢您的澄清。请查看我使用openxlsx 完成工作的答案。希望你觉得它有用。 【参考方案1】:

我建议您改用openxlsx 包,您可以在其中更新特定工作表中的特定单元格,而不会损坏文件中的其他工作表。

这是一个例子:

install.packages("openxlsx")
library(openxlsx)
wb <- loadWorkbook("https://github.com/awalker89/openxlsx/files/744103/template.xlsx")

writeData(wb, sheet = "Iris Data", x = head(iris, 20))
saveWorkbook(wb, "populated_template.xlsx")
openXL("populated_template.xlsx")

正如您将看到的,格式没有改变,文件中的另一张表包含填充数据的绘图也是完整的。

您可以将x 设置为单个值(如您的示例中所示)并根据需要设置位置(使用startColstartRow

希望你觉得它有用。

【讨论】:

这仅适用于Windows。我正在运行Ubuntulibreoffice,但它不起作用。我只是发表评论通知其他人。 在运行 Catalina 的 Mac 上,这种方法会生成损坏的 XLSX 文件,Excel 会尝试恢复该文件并最终删除我感兴趣的内容。【参考方案2】:

我使用的解决方案如下:

    创建一个包含一些数据的 excel 文件。 使用以下命令在 R Studio 中打开 excel 文件:
  File <- excel_file #path to excel file "Data_Analysis.xlsx" for example
  sheet <- "Info"
  wb <- openxlsx::loadWorkbook(file = File)

  #Read a section of a sheet called "Info" from the Excel File
  Data_Info <- openxlsx::read.xlsx(wb, sheet = sheet,
                                   colNames = FALSE, #Column Names are there
                                   rows = seq(1:4), #Copy out these rows
                                   cols = seq(1:5)) #Copy out these columns

    用户现在可以对数据帧 Data_Info 执行他想要的所有操作。 要将更改的数据框 (NEW_DATAFRAME_TO_BE_SAVED) 保存回 excel 文件,请使用以下代码:

  openxlsx::writeData(wb, sheet = sheet, x = NEW_DATAFRAME_TO_BE_SAVED,
            startCol = "A",
            startRow = 2,
            colNames = FALSE) # Do not print Header Line with Column Names
  openxlsx::saveWorkbook(wb2, File, overwrite = TRUE)

最后一步要小心,因为它会覆盖之前的文件。另请注意,最后一步仅适用于当前未打开 excel 文件的情况,否则会出现错误/警告。

【讨论】:

以上是关于如何使用 R 而不是整个数据表更改 excel 文件中的单个条目?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Facebook 上分享一篇博文,而不是整个博文提要

文本文档格式下,如何把一列数据改为连续的行数据?

使用电子表格插入图片,如何使图片刚好填满整个单元格,而不是浮在上面

如何将更改保存到现有的 excel 文件,而不是创建包含更改的 txt 文件?

如何仅更改图像按钮内的图像而不是整个图像按钮

Excel VBA函数仅粘贴打印区域内的内容而不是整个工作表?