【问题标题】:editing particular cells of an Excel sheet编辑 Excel 工作表的特定单元格
【发布时间】:2015-01-12 05:34:03
【问题描述】:

我有一个 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")

但是,这样新工作簿会丢失所有以前的格式(合并的单元格、公式等)。

有没有办法更改某些单元格中的值而不会丢失剩余工作表的任何格式?

【问题讨论】:

  • 这没有多大意义。如果您不想替换单元格的内容(例如其公式),那么......不要这样做。如果试图将东西放入合并单元格的一部分,那么拆分合并似乎是可取的。
  • 如果您运行的是 Windows,(显然您已经安装了 Excel),您可以使用 RDCOMClient 包从 R 自动化 Excel(以及其他任何东西...)。
  • 请阅读软件包的帮助页面并注意?writeWorksheet 页面确实链接到?writeNamedRegion。 (难道你不希望一个名为“writeWorksheet”的函数来替换整个工作表吗?)
  • @BondedDust 我确实想替换单元格的内容,但我想保留剩余工作表的所有先前格式 - 与以前相同。就像,如果我有一个模板,里面有我想填充的空白单元格。通过使用writeWorksheet,我将所有信息写为一个data.frame,因此所有格式(合并单元格、文本大小、列/行大小等)都消失了。
  • 我认为有,但你的问题没有示例文件,我构建测试用例的意愿很低。

标签: r excel xlconnect


【解决方案1】:

这是一个使用 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

【讨论】:

  • 请注意:RDCOMClient 包仅适用于 Windows。这是在 cmets 中,但我想澄清一下,以免 Unix 人浪费他们的时间。
  • 如果出现询问我是否要更新链接的弹出窗口怎么办?无论如何在R中点击这个?
【解决方案2】:

使用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 建议在 cmets 中对此进行调查。

【讨论】:

    【解决方案3】:

    如果你不需要使用公式,你有两种可能的解决方案。

    您可以使用 {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)
    

    问候

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-11-21
      • 1970-01-01
      • 1970-01-01
      • 2017-09-01
      • 2017-02-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多