Categories: ExcelR

R 使用 openxlsx 將表格資料、圖形轉為 Excel 檔案教學與範例

介紹如何使用 R 的 openxlsx 套件將 R 的分析結果與圖形匯出至 Excel 檔案中。

R 語言的 openxlsx 套件是一個可以用來建立並編輯 Excel 檔案的套件,透過這個套件可以將 R 的各種資料與分析結果轉成 Excel 檔案,以下是使用教學以及範例。

安裝 openxlsx 套件

openxlsx 套件可從官方的 CRAN 套件庫下載安裝:

# 安裝 openxlsx 套件
install.packages("openxlsx")

安裝完成之後,將其載入即可使用:

# 載入 openxlsx 套件
library(openxlsx)

建立 Excel 檔案

openxlsx 所提供的 write.xlsx 函數可以將 data.frame 的資料直接寫入 Excel 檔案中,其效果類似 write.csv 函數,但是 write.xlsx 可以直接輸出為 xlsx 檔案:

# 將 data.frame 寫入 Excel 檔案
write.xlsx(iris, file = "writeXLSX1.xlsx")
Excel 檔案

write.xlsx 函數也可以直接將資料轉為 Excel 的表格:

# 將 data.frame 寫入 Excel 檔案,轉為表格
write.xlsx(iris, file = "writeXLSXTable1.xlsx", asTable = TRUE)
Excel 表格

若要將多張 data.frame 同時寫入一個 Excel 檔案,可以先用 R 的列表(list)打包之後,再以 write.xlsx 寫入至 Excel 檔案中:

# 將多張 data.frame 寫入 Excel 檔案
l <- list("IRIS" = iris, "MTCARS" = mtcars)
write.xlsx(l, file = "writeXLSX2.xlsx")
write.xlsx(l, file = "writeXLSXTable2.xlsx", asTable = TRUE)

不同的 data.frame 會儲存於不同的 Excel 工作表中。

Excel 多張工作表

Excel 儲存格格式

透過設定不同的資料類型,可以讓 write.xlsx 函數在匯出資料至 Excel 時自動設定儲存格格式。

# 設定框線樣式
options("openxlsx.borderColour" = "#4F80BD")
options("openxlsx.borderStyle" = "thin")

# 日期與時間格式
options("openxlsx.datetimeFormat" = "yyyy-mm-dd hh:mm:ss")

# 建立資料
df <- data.frame(
  "Time" = Sys.time(),
  "Cash" = paste("$",1:20),
  "Cash2" = 31:50,
  "hLink" = "https://CRAN.R-project.org/",
  "Percentage" = seq(0, 1, length.out=20),
  "TinyNumbers" = runif(20) / 1E9,
  stringsAsFactors = FALSE)

# 設定資料類型,用於 Excel 儲存格格式
class(df$Cash) <- "currency"          # 貨幣
class(df$Cash2) <- "accounting"       # 會計
class(df$hLink) <- "hyperlink"        # 超連結
class(df$Percentage) <- "percentage"  # 百分比
class(df$TinyNumbers) <- "scientific" # 科學記號

# 將 data.frame 寫入 Excel 檔案
write.xlsx(df, "writeXLSX3.xlsx")
write.xlsx(df, file = "writeXLSXTable3.xlsx", asTable = TRUE)
Excel 表格

表格標題列樣式

在建立 Excel 表格時,可以自訂標題列樣式,例如讓標題列的文字旋轉 45 度。

# 建立樣式
hs <- createStyle(fontColour = "#ffffff", fgFill = "#4F80BD",
                  halign = "center", valign = "center", textDecoration = "Bold",
                  border = "TopBottomLeftRight", textRotation = 45)

# 將 data.frame 寫入 Excel 檔案,並指定標題列樣式
write.xlsx(iris, file = "writeXLSX4.xlsx", borders = "rows", headerStyle = hs)
write.xlsx(iris, file = "writeXLSX5.xlsx", borders = "columns", headerStyle = hs)

# 將 data.frame 寫入 Excel 檔案,轉為表格,並指定標題列樣式
write.xlsx(iris, "writeXLSXTable4.xlsx", asTable = TRUE,
           headerStyle = createStyle(textRotation = 45))

產生的 Excel 表格會類似這樣,標題列文字旋轉 45 度。

標題列文字旋轉 45 度

自行建立 Excel 活頁簿

如果想要將各種非 data.frame 的資料寫入 Excel 檔案中,可以使用自行建立 Excel 活頁簿的方式,手動寫入各種資料,以下是建立一個 Excel 活頁簿,並將各種資料寫入的範例。

# 建立 Excel 活頁簿
wb <- createWorkbook()

# 設定框線樣式
options("openxlsx.borderColour" = "#4F80BD")
options("openxlsx.borderStyle" = "thin")

# 設定 Excel 活頁簿預設字型
modifyBaseFont(wb, fontSize = 10, fontName = "Arial Narrow")

# 新增工作表
addWorksheet(wb, sheetName = "Motor Trend Car Road Tests", gridLines = FALSE)
addWorksheet(wb, sheetName = "Iris", gridLines = FALSE)

# 鎖定第一張工作表的第一行與第一列
freezePane(wb, sheet = 1, firstRow = TRUE, firstCol = TRUE)

# 將 mtcars data.frame 資料寫入第一張工作表
writeDataTable(wb, sheet = 1, x = mtcars,
               colNames = TRUE, rowNames = TRUE,
               tableStyle = "TableStyleLight9")

# 設定欄寬
setColWidths(wb, sheet = 1, cols = "A", widths = 18)

# 將 iris data.frame 資料寫入第二張工作表
writeDataTable(wb, sheet = 2, iris, startCol = "K", startRow = 2)

# 將 ggplot2 繪製的圖形插入第二張工作表的 B16 位置
require(ggplot2)
qplot(data=iris, x = Sepal.Length, y= Sepal.Width, colour = Species)
insertPlot(wb, 2, xy=c("B", 16))

# 建立組平均與變異數資料表格
means <- aggregate(x = iris[,-5], by = list(iris$Species), FUN = mean)
vars <- aggregate(x = iris[,-5], by = list(iris$Species), FUN = var)

# 建立樣式
headSty <- createStyle(fgFill="#DCE6F1", halign="center", border = "TopBottomLeftRight")

# 將組平均資料表格寫入第二張工作表的 B3 位置
writeData(wb, 2, x = "Iris dataset group means", startCol = 2, startRow = 2)
writeData(wb, 2, x = means, startCol = "B", startRow=3, borders="rows", headerStyle = headSty)

# 將組變異數資料表格寫入第二張工作表的 B10 位置
writeData(wb, 2, x = "Iris dataset group variances", startCol = 2, startRow = 9)
writeData(wb, 2, x= vars, startCol = "B", startRow=10, borders="columns", headerStyle = headSty)

# 設定欄寬
setColWidths(wb, 2, cols=2:6, widths = 12)
setColWidths(wb, 2, cols=11:15, widths = 15)

# 設定標題樣式
titleStype <- createStyle(fontSize=14, textDecoration=c("bold", "italic"))
addStyle(wb, 2, style = titleStyle, rows=c(2,9), cols=c(2,2))

# 儲存 Excel 活頁簿
saveWorkbook(wb, "basics.xlsx", overwrite = TRUE)
包含各種資料與圖形的 Excel 活頁簿

參考資料:openxlsx vignette

Share
Published by
Office Guide

Recent Posts

Python 使用 PyAutoGUI 自動操作滑鼠與鍵盤

本篇介紹如何在 Python ...

9 個月 ago

Ubuntu Linux 以 WireGuard 架設 VPN 伺服器教學與範例

本篇介紹如何在 Ubuntu ...

9 個月 ago

Linux 網路設定 ip 指令用法教學與範例

本篇介紹如何在 Linux 系...

9 個月 ago

Windows 使用 TPM 虛擬智慧卡保護 SSH 金鑰教學與範例

本篇介紹如何在 Windows...

10 個月 ago

Linux 以 Shamir’s Secret Sharing 分割保存金鑰教學與範例

介紹如何在 Linux 中使用...

10 個月 ago

Linux 以 Cryptsetup、LUKS 加密 USB 隨身碟教學與範例

介紹如何在 Linux 系統中...

10 個月 ago