使用R xlsx包

时间:2016-08-10 11:15:18

标签: r r-xlsx

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

1 个答案:

答案 0 :(得分: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