1

Stack Overflow 上的新手,所以请多多包涵 - 任何帮助或建议都将不胜感激!

我正在尝试将单个单元格样式应用于我使用 R 中的 write.xlsx 函数创建的整个 Excel 工作簿。我在网上查看过,我能想到的最好的方法是以下方法。

Reformat<-function(filename){
  wb<-loadWorkbook(filename)
  sheets<-getSheets(wb)
  for (sheet in sheets){
    rows<-getRows(sheet)
    cells<-getCells(rows)
    cs <- CellStyle(wb) +
      Font(wb, heightInPoints=12,name="Calibri") +
      DataFormat("#,##0") +
      Alignment(h="ALIGN_CENTER")
    invisible(lapply(c(1:length(cells)), function(i) setCellStyle(cells[[i]], cs)))
  }
  saveWorkbook(wb,filename)
}

然后将此函数应用于我之前生成的每个 xlsx 文件。

但是,这似乎在计算上非常昂贵,因为我相信它会循环每一行中的每个单元格,以及工作簿的每一页。这需要一些时间来运行一些较大的 Excel 电子表格,甚至一些中等大小的 (<1MB)。

有没有一种计算成本较低的方法来实现这一点?说等效于适用于整个工作表的 CellStyle?

提前致谢 - 任何意见/建议表示赞赏!

问候, Alch84

4

1 回答 1

1

如前所述,考虑将RDCOMClient包与 Excel 对象库接口,并访问其大部分方法和属性。在这里,您可以一次格式化所有单元格,类似于选择一个区域并使用功能区的 Excel.exe GUI 格式化单元格。

以下是遍历所有工作表以相应修改格式的循环版本。我在 Excel VBA 中展示了它的对应物。

VBA代码 (本机界面,因此无需分配 Excel.Application 或 xlCenter 等常量)

Sub FormatCells()
    Dim i As Integer
    Dim rng As Range

    For i = 1 To ThisWorkbook.Worksheets.Count
        Set rng = ThisWorkbook.Worksheets(i).Range(ThisWorkbook.Worksheets(i).Cells.Address)

        rng.NumberFormat = "#,##0"
        rng.Font.Name = "Calibri"
        rng.HorizontalAlignment = xlCenter
    Next i

    ThisWorkbook.Close True
    Application.Quit

End Sub

R代码 (外部接口,因此需要分配所有对象)

library(RDCOMClient)

xlApp <- COMCreate("Excel.Application")
xlWbk <- xlApp$Workbooks()$Open("D:\\Freelance Work\\Scripts\\FormatXLCells.xlsx")

xlCenter <- -4108

for (i in 1:xlWbk$Worksheets()$Count()){
  xlWks <- xlWbk$Worksheets(i)

  rng <- xlWks$Range(xlWks$Cells()$Address())
  rng[['NumberFormat']] <- "#,##0"
  rng[['Font']][['Name']] <- "Calibri"
  rng[['Font']][['Color']] <- 1
  rng[['HorizontalAlignment']] <- xlCenter

}

xlWbk$Close(TRUE)                    # SAVE AND CLOSE WORKBOOK
xlApp$Quit()                         # CLOSE COM APP 

# FREE RESOURCES
xlWks <- xlWbk <- xlApp <- NULL
rm(rng, xlWks, xlWbk, xlApp)
gc()                                 # NEEDED TO EFFECTIVELY END EXCEL PROCESS
于 2016-08-10T21:56:28.260 回答