1

ここスタックオーバーフローの初心者なので、ご容赦ください-助けやアドバイスをいただければ幸いです!

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 に答える