本文へスキップ
からだにいいもの

Rのトピックスを中心に『まだ、まだ、知らない、役に立つ情報?』を発信します。

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で確認しています。

パッケージのインストール

下記コマンドを実行してください。

# パッケージのインストール
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コマンド

オプション意味初期値
wbopenxlsx2のwb_workbookコマンドで作ったワークブックなし
xgtの表、または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コマンド

オプション意味初期値
wbopenxlsx2のワークブックなし
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

gtの表の中身を取り出す:gtxlsx_extractコマンド

オプション意味初期値
xgtの表なし
contextgtが表を組み立てるときの出力先。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,875

HTMLの表をワークシートに書き出す:wb_add_htmlコマンド

オプション意味初期値
wbopenxlsx2のワークブックなし
xHTML。文字列、ファイルのパス、読み込み済みの文書、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かブラウザが必要です。

オプション意味初期値
wbopenxlsx2のワークブックなし
xltの表(lt_tbl)なし
sheet書き出すワークシートcurrent_sheet()
dims表の左上の角のセル番地“A1”
methodltが表を焼き付ける方法。”node”か”browser”で指定、”auto”は使える方を使う“auto”
…wb_add_htmlコマンドに渡すオプションなし


この記事が誰かの役に立ちますように。

スポンサーリンク
価格および配送状況は変更される場合があります。購入時は商品ページをご確認ください。
当サイトに表示されている商品情報はAmazonから提供されたものであり、更新または削除される場合があります。
karada-goodはAmazonアソシエイトとして、適格販売により収入を得ています。