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
答案 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