Rで解析:gtで整えた表を書式ごとExcelへ書き出す「gtxlsx」パッケージ
「gtxlsx」パッケージは、gtパッケージで整えた表を、見た目と数値を保ったままExcelのワークシートへ書き出せるパッケージです。渡すのはgtで作った表のオブジェクトで、HTMLで書かれた表の文字列やファイルも書き出せます。見出しや注釈は結合したセルに、通貨や割合の表示はセルの書式になるので、書き出した後もExcel上で計算に使えます。ワークシートの範囲を読み込んでgtの表に戻すこともできます。ワークブックの扱いにはopenxlsx2パッケージを使い、gtの表を書き出すにはgtパッケージも必要です。Rで作った集計表をExcelで受け取る人へ渡すときに、役立てられるのではないかと考えます。
パッケージバージョンは0.4.0。Windows 11 x64 (build 26200)のR version 4.6.1で確認しています。
<おすすめのRに関する書籍です>
パッケージのインストール
下記コマンドを実行してください。
# パッケージのインストール
install.packages(c("gtxlsx", "gt", "openxlsx2"))
# パッケージの読み込み
library("gtxlsx")
library("gt")
library("openxlsx2")コマンド例
詳細はコメント、パッケージのヘルプを確認してください。
gtxlsxでは、Excelのファイルを「ワークブック」、その中の1枚のシートを「ワークシート」と呼びます。ワークブックはopenxlsx2パッケージのwb_workbookコマンドで作り、gtxlsxのコマンドで表を書き込んだ後、wb_saveコマンドで.xlsxファイルとして保存します。書き込む位置は「B2」のようなセル番地で、表の左上の角を指定します。
以下の例では、共通のデータとして、京都府内の4産地(左京区、伏見区、亀岡市、宇治市)における京野菜の出荷量、単価、前年比を模したデータを作成し、gtの表に整えます。
# 4産地の京野菜の出荷実績の架空データを作成
yasai <- data.frame(
産地 = c("左京区", "伏見区", "亀岡市", "宇治市"),
品目 = c("九条ねぎ", "伏見とうがらし", "賀茂なす", "京たけのこ"),
出荷量 = c(1520, 860, 1275, 640),
単価 = c(412.5, 598, 356.25, 1180),
前年比 = c(0.052, -0.031, 0.118, -0.074)
)
# 産地を行の見出しにしてgtの表を作成
tbl <- gt(yasai, rowname_col = "産地")
# 表題と副題を付ける
tbl <- tab_header(tbl, title = "京野菜の出荷実績", subtitle = "2026年9月")
# 出荷量を桁区切り、単価を円、前年比を割合で表示
tbl <- fmt_number(tbl, columns = "出荷量", decimals = 0)
tbl <- fmt_currency(tbl, columns = "単価", currency = "JPY", decimals = 0)
tbl <- fmt_percent(tbl, columns = "前年比", decimals = 1)
# 表の下に出典を付ける
tbl <- tab_source_note(tbl, "出典:架空の集計")gtの表をワークシートに書き出す:wb_add_gtコマンド
| オプション | 意味 | 初期値 |
|---|---|---|
| wb | openxlsx2のwb_workbookコマンドで作ったワークブック | なし |
| x | gtの表、またはgt_groupコマンドやgt_splitコマンドでまとめた表のグループ。グループは表を1つずつ下へ並べて書き出す | なし |
| sheet | 書き出すワークシート。初期値は今のワークシート | current_sheet() |
| dims | 表の左上の角のセル番地。例えば”B2″ | “A1” |
| numeric | 表示の書式を再現できる数値は数値として書き出す。FALSEの場合はすべてのセルを文字列で書き出す | TRUE |
| col_widths | 列の幅。”auto”は文字の幅に合わせる、数値ベクトルは幅を直接指定、NULLは変えない。gtのcols_widthコマンドで決めた幅が優先される | “auto” |
| row_heights | 行の高さ。NULLはExcelに任せる、”gt”はgtの余白から決める、数値ベクトルは高さを直接指定。NULL以外では文字を上下中央に揃える | NULL |
| ignore_errors | 数値や日付に見える文字列のセルに印を付け、Excelのエラー表示を出さない | TRUE |
| gap | 表のグループを書き出すときに表と表の間にあける行数。表が1つのときは使わない | 1L |
| features | 値のほかに書き出す物。TRUEはすべて、FALSEは値だけ。”font”、”fill”、”border”、”numfmt”、”merge”、”link”を文字列ベクトルで選ぶこともできる | TRUE |
| freeze | 見出しと行の見出しがスクロールで隠れないように枠を固定する。TRUEは表から位置を決める、c(行, 列)はそのセルで固定、FALSEは固定しない | FALSE |
| … | 今は使われていない | なし |
# ワークブックを作成し、「出荷」という名前のワークシートを追加
wb <- wb_workbook()$add_worksheet("出荷")
# gtの表をB2セルから書き出し、見出しの下と行の見出しの横で枠を固定
wb <- wb_add_gt(wb, tbl, dims = "B2", freeze = TRUE)
# 書き出したセルの値を確認
wb_to_df(wb, col_names = FALSE)
B C D E F
2 京野菜の出荷実績 <NA> <NA> <NA> <NA>
3 2026年9月 <NA> <NA> <NA> <NA>
4 <NA> 品目 出荷量 単価 前年比
5 左京区 九条ねぎ 1520 412.5 0.052
6 伏見区 伏見とうがらし 860 598 -0.031
7 亀岡市 賀茂なす 1275 356.25 0.118
8 宇治市 京たけのこ 640 1180 -0.074
9 出典:架空の集計 <NA> <NA> <NA> <NA>
# .xlsxファイルとして保存
wb_save(wb, file = "kyoyasai.xlsx")セルには元の数値がそのまま入り、Excelで開くと、左京区の前年比0.052が「5.2%」となるように、gtと同じ書式で表示されます。
ワークシートの範囲をgtの表に戻す:wb_to_gtコマンド
| オプション | 意味 | 初期値 |
|---|---|---|
| wb | openxlsx2のワークブック | なし |
| sheet | 読み込むワークシート。初期値は今のワークシート | current_sheet() |
| dims | 読み込む範囲。初期値はワークシートの使われている範囲 | NULL |
| styles | セルの書式をgtのtab_styleコマンドに置き換える。セルごとに処理するので広い範囲では時間がかかる | TRUE |
| structure | 結合したセルを表題、列のまとめ見出し、出典として読む。FALSEの場合は範囲をただの表として読む | TRUE |
| … | openxlsx2のwb_to_dfコマンドに渡すオプション | なし |
# 書き出した表の範囲を、表題や出典ごとgtの表に戻す
modoshi <- wb_to_gt(wb, dims = "B2:F9")
# gtの表になっているかを確認
class(modoshi)
[1] "gt_tbl" "list"
# 列名と値の範囲だけを、書式を付けずにただの表として読む
modoshi2 <- wb_to_gt(wb, dims = "B4:F8", styles = FALSE, structure = FALSE)
# 中身の値を確認
gtxlsx_extract(modoshi2)$body
B 品目 出荷量 単価 前年比
1 左京区 九条ねぎ 1520 412.50 0.052
2 伏見区 伏見とうがらし 860 598.00 -0.031
3 亀岡市 賀茂なす 1275 356.25 0.118
4 宇治市 京たけのこ 640 1180.00 -0.074
<おすすめのRに関する書籍です>
gtの表の中身を取り出す:gtxlsx_extractコマンド
| オプション | 意味 | 初期値 |
|---|---|---|
| x | gtの表 | なし |
| context | gtが表を組み立てるときの出力先。wb_add_gtコマンドが使うのは”html”で、動作が確かめられているのもこの値だけ | “html” |
# 宇治茶の茶園別収量の架空データでgtの表を作成
cha <- data.frame(茶園 = c("和束町", "宇治田原"), 収量 = c(2340, 1875))
cha_tbl <- fmt_number(gt(cha), columns = "収量", decimals = 0)
# gtの表の中身を取り出す
naka <- gtxlsx_extract(cha_tbl)
# 取り出した要素の名前を確認
names(naka)
[1] "body" "data" "boxhead" "stub" "groups_rows"
[6] "row_groups" "spanners" "heading" "stubhead" "styles"
[11] "footnotes" "source_notes" "summary" "options"
# 書式を当てた後の表示用の値を確認
naka$body
茶園 収量
1 和束町 2,340
2 宇治田原 1,875HTMLの表をワークシートに書き出す:wb_add_htmlコマンド
| オプション | 意味 | 初期値 |
|---|---|---|
| wb | openxlsx2のワークブック | なし |
| x | HTML。文字列、ファイルのパス、読み込み済みの文書、as.characterコマンドでHTMLを返す物。rvestやxml2で取ったページやtableの要素もそのまま渡せる | なし |
| sheet | 書き出すワークシート。初期値は今のワークシート | current_sheet() |
| dims | 表の左上の角のセル番地 | “A1” |
| which | 文書に表が複数あるときに、何番目の表を書き出すか | 1L |
| numeric | 明らかに数値の文字列は数値として書き出す。$や%のような記号の前後だけを外すので、「458 Speciale」のような名前は文字列のまま | TRUE |
| col_widths | 列の幅。”auto”は文字の幅に合わせる、数値ベクトルは幅を直接指定、NULLは変えない | “auto” |
| ignore_errors | 数値に見える文字列のセルに印を付け、Excelのエラー表示を出さない | TRUE |
| context | 表の上の見出しや下の注記を拾い、結合した行として書き出す。FALSEの場合は表だけを書き出す | TRUE |
| features | 値のほかに書き出す物。TRUEはすべて、FALSEは値だけ。”font”、”fill”、”border”、”numfmt”、”merge”、”link”を文字列ベクトルで選ぶこともできる | TRUE |
| freeze | 見出しの行と先頭のth列がスクロールで隠れないように枠を固定する。TRUEは表から位置を決める、c(行, 列)はそのセルで固定、FALSEは固定しない | FALSE |
| … | 今は使われていない | なし |
# 宇治茶の茶園別収量をHTMLの表として用意
html <- paste0(
"<table><tr><th>茶園</th><th>収量(kg)</th><th>増減</th></tr>",
"<tr><td>和束町</td><td>2,340</td><td>+4.5%</td></tr>",
"<tr><td>宇治田原</td><td>1,875</td><td>-1.2%</td></tr>",
"<tr><td>南山城村</td><td>1,090</td><td>+0.8%</td></tr></table>"
)
# ワークブックを作成し、「茶園」という名前のワークシートを追加
wb_cha <- wb_workbook()$add_worksheet("茶園")
# HTMLの表をA1セルから書き出す
wb_cha <- wb_add_html(wb_cha, html, dims = "A1")
# 書き出したセルの値を確認
wb_to_df(wb_cha, col_names = FALSE)
A B C
1 茶園 収量(kg) 増減
2 和束町 2340 0.045
3 宇治田原 1875 -0.012
4 南山城村 1090 0.008「2,340」や「+4.5%」のような文字列が、数値の2340や0.045としてセルに入ります。
ltの表をワークシートに書き出す:wb_add_ltコマンド
ltパッケージ(0.2以上)で作った表を、HTMLに焼き付けてからwb_add_htmlコマンドと同じ方法で書き出します。焼き付けにはNode.jsかブラウザが必要です。
| オプション | 意味 | 初期値 |
|---|---|---|
| wb | openxlsx2のワークブック | なし |
| x | ltの表(lt_tbl) | なし |
| sheet | 書き出すワークシート | current_sheet() |
| dims | 表の左上の角のセル番地 | “A1” |
| method | ltが表を焼き付ける方法。”node”か”browser”で指定、”auto”は使える方を使う | “auto” |
| … | wb_add_htmlコマンドに渡すオプション | なし |
この記事が誰かの役に立ちますように。