编辑 Excel 表格中特定单元格

4
我有一个Excel工作簿,想要使用R编辑/填写其中的一些特定单元格,而不改变任何格式。目前我尝试了XLConnect包,似乎可以实现我想要的功能,但我还没有找到具体的方法。我的直接解决方案如下:
wb <- loadWorkbook("file1.xls")
data1 <- readWorksheet(wb, "Sheet1", header=TRUE)

## adding a value to a particular cell:
data1[11,12] <- 3.2 

## rewriting old data:
writeWorksheet(wb, data1, "Sheet1")
saveWorkbook(wb, "new_file1.xls")

然而,这样做会导致新工作簿失去所有以前的格式(合并单元格、公式等)。

有没有一种方法可以在不丢失剩余表格格式的情况下更改某些单元格中的值?


这并没有太多意义。如果您不想替换单元格的内容(例如其公式),那么请不要这样做。如果您试图将内容放入合并单元格的某个部分,则最好拆分该合并单元格。 - IRTFM
如果你正在运行Windows(并且显然已经安装了Excel),你可以使用RDCOMClient包从R自动化Excel(以及其他任何东西...)。 - jlhoward
@BondedDust 我确实想要替换单元格的内容,但我希望保留剩余表格的所有以前的格式 - 与之前完全相同。就像我有一个带有空单元格的模板需要填写。通过使用writeWorksheet,我将所有信息都写入数据框,因此所有格式(合并单元格、文本大小、列/行大小等)都消失了。 - runr
1
我认为有可能存在,但是你的问题没有示例文件,而且我建立测试用例的意愿很低。 - IRTFM
请查看XLConnect的setStyleAction。样式操作NONE或DATA_FORMAT_ONLY应该可以满足您的需求。 - Martin Studer
显示剩余3条评论
3个回答

9

以下是使用 R 自动化 Excel 的示例。

library(RDCOMClient)
xlApp <- COMCreate("Excel.Application")
wb    <- xlApp[["Workbooks"]]$Open("file.1.xls")
sheet <- wb$Worksheets("Sheet1")

# change the value of a single cell
cell  <- sheet$Cells(11,12)
cell[["Value"]] <- 3.1

# change the value of a range
range <- sheet$Range("A1:F1")
range[["Value"]] <- paste("Col",1:6,sep="-")

wb$Save()                  # save the workbook
wb$SaveAS("new.file.xls")  # save as a new workbook
xlApp$Quit()               # close Excel

3
仅供参考:RDCOMClient包只能在Windows系统上运行。虽然这已经在评论中提到,但我想再次强调,以免Unix用户浪费时间。 - CephBirk
如果出现一个弹窗询问是否要更新链接,有没有办法在R中点击通过它? - Rafael

6

如果你不需要使用公式,你有两个解决方案。

你可以使用{xlsx}包:

library(xlsx)
xlsx::write.xlsx(x = head(iris),file = "source3.xlsx",sheetName = "A")
hop3 <- xlsx::loadWorkbook(file = "source3.xlsx")
sheets <- getSheets(hop3)
rows  <- getRows(sheets$A,rowIndex = 2)   # get all the rows
cc <- getCells(rows,colIndex = 3) 
xlsx::setCellValue(cc[[1]],value = "54321")
hop3$setForceFormulaRecalculation(TRUE)
xlsx::saveWorkbook(hop3,file = "output3.xlsx")

您也可以使用{XLconnect}。
library(XLConnect)    
XLConnect::writeWorksheetToFile(file = "source2.xlsx",data = head(iris),sheet="A")
hop2 <- XLConnect::loadWorkbook(file = "source2.xlsx")
createName(hop2, name = "plop", formula = "A!C2")
writeNamedRegion(hop2, 12345, name = "plop", header = FALSE)

问候


4
使用XLC$STYLE_ACTION.NONE样式操作应该可以添加数据而不改变任何格式:
data1 <- readWorksheetFromFile("file1.xls", "Sheet1")

## adding a value to a particular cell:
data1[11,12] <- 3.2 

## rewriting old data:
writeWorksheetToFile("file1.xls", data1, "Sheet1", styleAction = XLC$STYLE_ACTION.NONE)

感谢Martin在评论中提出的建议,让我们了解了这一点。


这是使用 XLConnect 还是 xlsx? - Peter King
这是使用XLConnect。 - CephBirk

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