niszetの日記

アナログCMOS系雑用エンジニアが頑張る備忘録系日記

Wordのスタイルを修正しやすくするRのコードを書いている

まだ公開は先…

Wordのreference-docxを作るのにあたって、手でスタイルを修正していくのがしんどいので 対応するためのRのコードを書いています。まぁこれはこれでシンドイ。

officerパッケージでもある程度情報が取れますがそれでは満足しなかったので、一部関数を借りて使ってますが処理は全部自前で書いています。つらい。

ざっとこんな感じ。

file = "sample.docx"
# docxからstyle.xmlを取り出してxml2パッケージで読んだものを返す
xml <- read_style_xml(file)
# そのうち、styleタグのみ取り出す
style_xml <- get_style_tags(xml)
# スタイル名を指定してxmlのnodeを取り出す
node <- get_node_by_name(style_xml, "Date")

# xml2のnodeなのでViewで確認できる
# View(node)

# styleの各タグについて、値を設定可能。文字のサイズ
set_r_sz_val(node, "42")
# テーマカラー名
set_r_color_themecolor(node, "accent2")
# 段落前に入れる空白
set_p_spacing_before(node, 2000)
# 太字にする
set_r_b(node, T)
# ファイルに書き出し
write_style(xml, file, "aaa.docx")

# xmlをひとつずつ処理するのは面倒くさいので、data.frameを介して一括処理を可能にする。
file = "sample.docx"
xml <- read_style_xml(file)
style_xml <- get_style_tags(xml)

# data.frameへ変換。対応しているタグ以外は無視される。現在120弱のタグに対応…。
d <- style2df(style_xml)
# data.frameを直接修正
d[d$style_id=="1","r_sz_val"] <- "400"

# 更新箇所をオリジナルのファイルと比較して、xml形式で返却
xml <- update_xml(file, d)
# ファイルへの書き出し
write_style(xml, file, "aaa.docx")

ざっとこんな感じ。個別のxml用の関数を作っておくことで、data.frameで各スタイルに対して処理を回していく感じですね。

しかし、タグに対して個別に関数を書く必要があったので、値の設定の関数まで実装するだけで200-300個くらいになりそうです。これにlintみたいなチェック機能を入れるとどうなるか…

ただ、Wordのooxmlに対する解釈が実際のところどうなのかを把握するのが大変なので、値のチェック機能は入れずに終わるかもしれません。大変なので。

需要があるのかわからない&メンテ大変なので公開するかは不明ですが…。久々にR書いて満足しつつあります。