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

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

Rで解析:外部依存なしでExcelファイルを書き出すwritexlパッケージの紹介

Rで集計した結果を、Excelファイルの形で関係者へ渡す場面は少なくありません。しかし、xlsx形式での書き出しには、JavaランタイムやExcel本体といった外部環境を必要とするパッケージもあり、環境の準備に手間がかかります。「writexl」パッケージは、C言語のライブラリであるlibxlsxwriterを基盤とし、外部の実行環境に依存せずにxlsxファイルを生成します。データフレームをそのままシートへ書き出す機能や、名前付きリストを渡して複数シートのブックを作成する機能が収録されています。また、Excelの数式やハイパーリンクをセルへ埋め込むことも可能です。

パッケージバージョンは2.0.0。Windows 11 x64 (build 26200)のR version 4.6.1で確認しています。

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

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

# パッケージのインストール
install.packages("writexl")

# パッケージの読み込み
library("writexl")
スポンサーリンク

コマンド例

詳細はコメント、パッケージのヘルプを確認してください。

架空データを用意し、xlsxファイルへの書き出し、所在地ごとのシート分割、数式とハイパーリンクの埋め込みまでを順に紹介します。

[データフレームをxlsxファイルに書き出す]:write_xlsxコマンド

オプション意味初期値
xデータフレーム、xl_sheet、xl_workbook、またはそれらの名前付きリストを指定、リストの各要素がシートになるなし
path書き出すファイル名を指定tempfile(fileext = “.xlsx”)
col_names列名をシート先頭の見出し行として書き出すか指定TRUE
format_headers見出し行にブックの見出し書式(初期設定は太字・中央寄せ)を適用するか指定TRUE
na値がない場合に書き込む内容を指定、NAはセルを空欄にするNA
use_zip644GBを超えるxlsxファイルに対応するzip64形式を使用するか指定、環境によっては読み込めないFALSE
constant_memory行を逐次書き出してメモリ使用量を抑えるか指定、NAはデータ量に応じて自動で判定するNA
constant_memory_threshold逐次書き出しへ切り替える判定に用いるメモリ削減量をバイト単位で指定128 * 1024^2
# 直売所の販売実績データを作成
HanbaiData <- data.frame(
  直売所名 = c("大通あさいち", "円山ファーム", "白石やさい館", "手稲みのり市", "厚別あおぞら"),
  所在地 = c("札幌市中央区", "札幌市中央区", "札幌市白石区", "札幌市手稲区", "札幌市厚別区"),
  来場者数 = c(1820, 1345, 2060, 970, 1510),
  売上高 = c(2184000, 1479500, 2678000, 1067000, 1737500),
  stringsAsFactors = FALSE)

# 作成したデータの確認
HanbaiData

# データフレームをxlsxファイルをデスクトップに書き出し
write_xlsx(
  HanbaiData,
  path = file.path(Sys.getenv("USERPROFILE"), "Desktop", "chokubai.xlsx"))

# WindowsでOneDriveを使っている場合は以下のコマンド
write_xlsx(
  HanbaiData,
  path = file.path(Sys.getenv("OneDrive"), "Desktop", "chokubai.xlsx"))

# ファイルが生成されたかを確認
file.exists("chokubai.xlsx")

xオプションに名前付きのリストを渡すと、リスト名がシート名になります。split関数と組み合わせると、集計単位ごとにシートを分けたブックを一度に作成できます。

# 所在地ごとにデータを分割して名前付きリストを作成
SheetList <- split(HanbaiData, HanbaiData$所在地)

# リストの名前がシート名になるため内容を確認
names(SheetList)

# リストを渡して複数シートのブックを作成
write_xlsx(SheetList, file.path(Sys.getenv("OneDrive"), "Desktop", "chokubai.xlsx"))

[セルにExcelの数式を埋め込む]:xl_formulaコマンド

オプション意味初期値
x数式として解釈する文字ベクトルを指定、各要素は「=」で始める必要があるなし
formatセルへ適用するxl_formatオブジェクト、または要素ごとのxl_formatのリストを指定NULL

Rで計算した数値をそのまま書き出すのではなく、計算の手順を数式のまま渡します。書き出したファイルをExcelで開くと再計算されるため、受け取った側が来場者数や売上高を修正すると、客単価も自動で更新されます。

# 数式が参照する行番号を作成、見出し行の分だけ1を加える
Gyou <- seq_len(nrow(HanbaiData)) + 1

# 売上高(D列)を来場者数(C列)で割る数式を客単価の列として追加
HanbaiData$客単価 <- xl_formula(paste0("=ROUND(D", Gyou, "/C", Gyou, ", 0)"))

# 追加した列の内容を確認
HanbaiData$客単価
[xl_cell_general: 5 cells]
[1] formula==ROUND(D2/C2, 0)
[2] formula==ROUND(D3/C3, 0)
[3] formula==ROUND(D4/C4, 0)
[4] formula==ROUND(D5/C5, 0)
[5] formula==ROUND(D6/C6, 0)

[セルにハイパーリンクを設定する]:xl_hyperlinkコマンド

オプション意味初期値
urlリンク先URLの文字ベクトルを指定、NAは空欄のセルになるなし
valueセルに表示する文字ベクトルを指定、NULLはURLをそのまま表示するNULL
formatセルへ適用するxl_formatオブジェクト、または要素ごとのxl_formatのリストを指定NULL
namevalueの旧称、後方互換のために残されており指定すると警告が表示されるNULL

HYPERLINK関数の形でセルへ書き込まれます。数式として保存されるため、編集可能なリンクです。

# 各直売所の紹介ページのURLを作成
URLList <- paste0("https://example.com/chokubai/",
                  c("odori", "maruyama", "shiroishi", "teine", "atsubetsu"))

# URLと表示テキストを指定してハイパーリンクの列を追加
HanbaiData$紹介ページ <- xl_hyperlink(URLList, "紹介ページ")

# 追加した列の内容を確認
HanbaiData$紹介ページ

# 数式とハイパーリンクを含むデータをxlsxファイルとして書き出し
write_xlsx(HanbaiData, path = "chokubai_link.xlsx")

# 作成したファイルをまとめて削除
unlink(c("chokubai.xlsx", "chokubai_ku.xlsx", "chokubai_link.xlsx"))


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

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