Office Servers Word APIでJSONデータを差し込む
Antenna House Office Servers Word APIでは差し込み印刷の機能を提供しています。CSVやJSONデータをプレースホルダーに流し込む操作について、OOXMLとしての内容を確認してみましょう。
Word 2019では住所用にデータベースを構築し参照する機能がありますが、WordprocessingMLでは差し込み元形式はとくに定まっていません。
差し込み用のWordprocessingML文書
<w:document ...
xmlns:r=".../2006/relationships" ...
xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" ...>
<w:body> <w:p ... w:rsidR="001903BC" w:rsidRDefault="001903BC"
w:rsidP="00776AF7">
<w:pPr> <w:jc w:val="center"/>
</w:pPr>
<w:r>
<w:rPr>
<w:rFonts w:hint="eastAsia"/>
</w:rPr>
<w:t>売上報告書</w:t>
</w:r>
</w:p> ...
<w:p w14:paraId="5B0FB41D" w14:textId="77777777" w:rsidR="001903BC"
w:rsidRDefault="001903BC" w:rsidP="001903BC">
<w:r> ...
<w:t>以下の通り、今月の売り上げを報告します。</w:t>
</w:r>
</w:p>
...
<w:fldSimple w:instr=" MERGEFIELD month \* MERGEFORMAT ">
<w:r w:rsidR="001903BC">
...
<w:t>«month»</w:t>
</w:r>
</w:fldSimple>
<w:r w:rsidR="001903BC"> ...
<w:t>月売上</w:t>
</w:r>
...
<w:p ... w:rsidR="001903BC"
w:rsidRDefault="001903BC" w:rsidP="001903BC">
...
<w:r>
...
<w:t xml:space="preserve">今月の売上合計: </w:t>
</w:r>
<w:fldSimple w:instr=" MERGEFIELD 月別売上合計 \* MERGEFORMAT ">
<w:r>
...
<w:t>«</w:t>
</w:r>
<w:r>
...
<w:t>月別売上合計</w:t>
</w:r>
<w:r>
...
<w:t>»</w:t>
</w:r>
</w:fldSimple>
</w:p>
...
<w:tbl>
...
<w:tr w:rsidR="004C36DD" w:rsidRPr="009868E9" ...
w:rsidTr="007E1F45">
...
<w:tc>
...
<w:p ... w:rsidR="004C36DD"
w:rsidRPr="009868E9" w:rsidRDefault="004C36DD" w:rsidP="00DE7DD4"> ...
<w:r w:rsidRPr="009868E9">
...
<w:t>製品名</w:t>
</w:r>
</w:p>
</w:tc>
...
</w:tr>
<w:tr w:rsidR="004C36DD"
w14:paraId="43014F1F" w14:textId="77777777" w:rsidTr="007E1F45">
<w:tc>
...
<w:p ... w:rsidR="004C36DD" w:rsidRDefault="007E1F45"
w:rsidP="00DE7DD4">
<w:r>
<w:fldChar w:fldCharType="begin"/>
</w:r>
<w:r>
<w:instrText xml:space="preserve"> MERGEFIELD </w:instrText>
</w:r>
<w:r>
<w:instrText>製品名</w:instrText>
</w:r>
<w:r>
<w:instrText xml:space="preserve"> \* MERGEFORMAT </w:instrText>
</w:r>
<w:r>
<w:fldChar w:fldCharType="separate"/>
</w:r>
<w:r w:rsidR="004C36DD">
<w:rPr>
<w:noProof/>
</w:rPr>
<w:t>«</w:t>
</w:r>
<w:r w:rsidR="004C36DD">
...
<w:t>製品名</w:t>
</w:r>
<w:r w:rsidR="004C36DD">
...
<w:t>»</w:t>
</w:r>
<w:r>
...
<w:fldChar w:fldCharType="end"/>
</w:r>
</w:p>
</w:tc>
...
</w:tr>
<w:tr w:rsidR="004C36DD" ... w:rsidTr="007E1F45">
<w:tc>
...
<w:p ... w:rsidR="004C36DD"
w:rsidRDefault="004C36DD" w:rsidP="00DE7DD4"/>
</w:tc>
...
</w:tr>
<w:tr ...>
...
</w:tr>
</w:tbl>
...
</w:body>
</w:document>
fldSimple要素によるフィールドと、fldChar要素によるフィールドが登場しています。
<w:settings ... xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" ... xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"
...>
...
<w:decimalSymbol w:val="."/>
<w:listSeparator w:val=","/>
...
</w:settings>
設定ではlistSeparator要素に「,」が指定されていることが分かります。
流し込むデータの確認
先程のWordprocessingML文書にJSONデータを流し込むことにします。
[
{
"month": "3",
"月別売上合計": "\\8,790,700",
"AH_DETAIL": [
{
"製品名": "AAA",
"管理番号": "AAA6783109",
"売上合計": "\\900,000",
"月別目標": "\\1,000,000",
"差額": "\\-100,000"
},
{
"製品名": "BBB",
"管理番号": "BBB5210857",
"売上合計": "\\2,687,500",
"月別目標": "\\2,500,000",
"差額": "\\187,500"
},...
],
"月別合計目標": "\\8,650,000",
"合計差額": "\\140,700",
"備考": "AAAの売上落ち込みは、当月計上予定だった売り上げが先方の稟議の都合で翌月に延びたため。来月分への計上は確定。注文書受領済。"
}
]
JSONフォーマットの都合上、\記号がエスケープされています。
このアプリケーションの例では複数の差し込みデータ列に対応するため、AH_DETAILというキーを用意しています。
流し込みの結果
流し込みを行ったWordprocessingML文書を確認します。

フィールドだった箇所にデータが挿入されていますね。では、document.xmlを確認してみましょう。
<w:document...>
<w:body>
...
<w:p ... w:rsidR="00F80EA2" w:rsidRDefault="00F80EA2" w:rsidP="001903BC">
<w:r>
...
<w:t>以下の通り、今月の売り上げを報告します。</w:t>
</w:r>
</w:p>
<w:p w14:paraId="63155A7E" w14:textId="77777777" w:rsidR="00F80EA2"
w:rsidRDefault="00F80EA2" w:rsidP="001903BC">
<w:r w:rsidR="00F80EA2">
...
<w:t>3</w:t>
</w:r>
<w:r w:rsidR="00F80EA2">
...
<w:t>月売上</w:t>
</w:r>
</w:p>
<w:p ... w:rsidR="00F80EA2" w:rsidRDefault="00F80EA2" w:rsidP="001903BC">
...
<w:r>
...
<w:t xml:space="preserve">今月の売上合計: </w:t>
</w:r>
<w:r>
...
<w:t>\8,790,700</w:t>
</w:r>
</w:p>
...
<w:tbl>
...
<w:tr w:rsidR="00F80EA2" w:rsidRPr="009868E9" ... w:rsidTr="00F80EA2">
...
<w:tc>
...
<w:p ... w:rsidR="00F80EA2" w:rsidRPr="009868E9" w:rsidRDefault="00F80EA2" w:rsidP="00DE7DD4">
...
<w:r w:rsidRPr="009868E9">
...
<w:t>製品名</w:t>
</w:r>
</w:p>
</w:tc>
...
</w:tr>
<w:tr w:rsidR="00F80EA2" ... w:rsidTr="00F80EA2">
<w:tc>
...
<w:p ... w:rsidR="00F80EA2" w:rsidRDefault="00F80EA2" w:rsidP="00DE7DD4">
<w:r w:rsidR="00F80EA2">
...
<w:t>AAA</w:t>
</w:r>
...
</w:p>
</w:tc>
...
</w:tr>
...
</w:tbl>
...
</w:body>
</w:document>
データが挿入され、fldSimple要素、fldChar要素はdocument.xmlから削除されています。
ページ番号など、今後も動的に変わる可能性のあるコンテンツではフィールドはそのまま保持した方がよいですが、提出書類や公開用のデータでは、フィールドの要素は削除しても問題ないでしょう。