
こんにちは。CData Software Japan の杉本です。
CData Arc では、Excel コネクタを利用することで、SaaS などのデータソースから取得したデータを Excel ファイル(.xlsx)として出力したり、逆に Excel で管理している表データをフローに取り込んだりすることができます。たとえば、取引先から受け取った注文データをそのまま Excel に変換して社内の担当者に共有する、あるいは Excel で管理している発注リストをフローの起点として活用する、といったユースケースで役立ちます。本記事では、Excel コネクタの基本的な使い方として、XML からのExcel 変換と Excel からのXML 変換の2つのパターンを解説します。
Excel コネクタとは
Excel コネクタは、Excel ファイルと XML ファイルの間でデータを双方向に変換するコネクタです。Arc のフロー上に配置することで、データの入力元としても出力先としても機能します。
Excel コネクタにはTable モードとTemplate モードの2種類の動作モードがあります。
Table モード | Excel ファイルを CSV と同様に扱い、XML に変換します。Excel → XML 方向のみ対応しています。 |
Template モード | テンプレートファイルを使って変換を行います。XML → Excel・Excel → XML の双方向に対応しています。 |
XML からExcel への変換
XML データを Excel ファイルとして出力するには、Template モードを使用します。Template モードでは、出力フォーマットのひな形となるExcel テンプレートファイルを事前に用意し、そのテンプレート内に ArcScript と呼ばれるCData Arc 独自のスクリプト言語を記述することで、入力 XML の値を動的に Excel セルへ埋め込みます。
例えばkintone からデータを取得して、取得したデータをExcel に変換するケースを想定します。kintone から取得したデータ(XML ファイル)が以下のような構造とします。
<?xml version="1.0" encoding="UTF-8"?>
<Items xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<ArcTest>
<RecordId>1</RecordId>
<Mail>[email protected]</Mail>
<Number>001</Number>
</ArcTest>
</Items>
上記のデータを表形式で出力する場合は、以下のようなテンプレートファイルを構成します。

テンプレートファイルの中では画像の赤枠箇所でExcel のメモ欄にxmlDOMSearch と呼ばれるArcScript を記載します。設定内容としてはXML ファイル内のアプリ名(ArcTest)以下の要素をループする設定になっております。そして黒枠箇所でArcTest 以下のXML に含まれる要素名を指定しており、こちらで指定した要素がExcel に出力されます。最後に青枠箇所で記載したxmlDOMSearch ブロックを閉じています(終了を記述しています)。
そのためもし同様の表形式で他のデータを出力したい場合は赤枠のxmlDOMSearch 部分の設定と、黒枠部分のxpath の要素を変更・追加頂くだけで、問題ございません。
そしてExcel コネクタにて変換モードをテンプレートとして、テンプレートファイルのExcel ファイルをアップロードします。

そしてフローを実行して、出力されるExcel が以下となります。

複数レコード・1Excel ファイルに出力する場合
先で示した例ではExcel ファイルに1レコードのみ出力されておりました。これはkintone コネクタのSelect アクションがレコード1件ずつXML ファイルを作成して、Excel コネクタに連携されているためです。そのため全てのレコードを1つのExcel ファイルにしたい場合は、kintone コネクタの高度な設定タブにあるMax Records を「-1」と指定してください。

この状態で先ほどのフローを実行すると、以下のように1つのExcel ファイルに全てのレコードが出力されます。

Excel から XML への変換
Table モード
表形式のExcel ファイルを XML に変換するには、Table モードを使用します。Table モードでは、入力した .xlsx ファイルを CSV のように扱い、各行をXML の要素として出力します。主な設定項目は以下になります。
カラムヘッダー | ONにすると1行目をXML 要素名として使用します |
開始行 | 読み込みを開始する行番号を指定します |
開始列 | 読み込みを開始する列番号を指定します |
最終列 | 読み込みを終了する列番号(未指定時は最初の空白列を自動検出します) |


例えば先ほど出力したExcel ファイルをTable モードで読み込むと(カラムヘッダーの設定をONにしています)、以下のようになります。
<Items xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Sheet1>
<レコード番号>1</レコード番号>
<番号>001</番号>
<メールアドレス>[email protected]</メールアドレス>
</Sheet1>
<Sheet1>
<レコード番号>2</レコード番号>
<番号>002</番号>
<メールアドレス>[email protected]</メールアドレス>
</Sheet1>
</Items>
Template モード
発注書や申請書のような固定レイアウトの Excelを XML に変換する場合も、Template モードが利用できます。この場合、テンプレートファイルとしてXML ファイルを用意します。
今回は以下のような発注書 Excel を XML に変換する例を示します。

そして上記のExcel を読み取るテンプレートファイルとしてのXML ファイルの中身が以下になります。こちらでも同様に変換にArcScript を利用します。
<!-- 入力 Excel ファイルと Excel バージョンを指定 -->
<arc:set attr="xml.file" value="[FilePath]" />
<arc:set attr="xml.version" value="2007" />
<!-- 常に先頭シートを対象にする -->
<arc:call op="excelListSheets" in="xml" out="sheet">
<arc:set attr="xml.sheet" value="[sheet.sheet]" />
<arc:break />
</arc:call>
<!-- ヘッダー (C列 = 値) -->
<arc:set attr="xml.map:Status" value="C3" />
<arc:set attr="xml.map:OrderNo" value="C4" />
<arc:set attr="xml.map:OrderDate" value="C5" />
<arc:set attr="xml.map:RequestedDate" value="C6" />
<arc:set attr="xml.map:ShipDate" value="C7" />
<!-- 納品先 (C列 = 値) -->
<arc:set attr="xml.map:ShipToName" value="C10" />
<arc:set attr="xml.map:ShipToAddress" value="C11" />
<arc:set attr="xml.map:ShipToCity" value="C12" />
<arc:set attr="xml.map:ShipToState" value="C13" />
<arc:set attr="xml.map:ShipToZip" value="C14" />
<!-- 請求先 (I列 = 値) -->
<arc:set attr="xml.map:BillToName" value="I10" />
<arc:set attr="xml.map:BillToAddress" value="I11" />
<arc:set attr="xml.map:BillToCity" value="I12" />
<arc:set attr="xml.map:BillToState" value="I13" />
<arc:set attr="xml.map:BillToZip" value="I14" />
<!-- サマリー (23 行目 = 値) -->
<arc:set attr="xml.map:TotalQuantity" value="H23" />
<arc:set attr="xml.map:SummaryReqDate" value="I23" />
<!-- マッピングした固定セルをまとめて取得し、永続オブジェクト data へコピー -->
<arc:call op="excelGet" in="xml" out="hdr">
<arc:map from="hdr" to="data" map="*=*" />
</arc:call>
<PurchaseOrder>
<Header>
<Status>[data.Status | def]</Status>
<OrderNo>[data.OrderNo | def]</OrderNo>
<OrderDate>[data.OrderDate | def]</OrderDate>
<RequestedDate>[data.RequestedDate | def]</RequestedDate>
<ShipDate>[data.ShipDate | def]</ShipDate>
</Header>
<ShipTo>
<Name>[data.ShipToName | def]</Name>
<Address>[data.ShipToAddress | def]</Address>
<City>[data.ShipToCity | def]</City>
<State>[data.ShipToState | def]</State>
<ZipCode>[data.ShipToZip | def]</ZipCode>
</ShipTo>
<BillTo>
<Name>[data.BillToName | def]</Name>
<Address>[data.BillToAddress | def]</Address>
<City>[data.BillToCity | def]</City>
<State>[data.BillToState | def]</State>
<ZipCode>[data.BillToZip | def]</ZipCode>
</BillTo>
<LineItems>
<!-- 明細行 (18 行目以降) を 1 行ずつ読み取る。十分大きい上限まで走査し、
商品コードが空の行に到達したらループを終了する。 -->
<arc:enum range="18..500">
<arc:set attr="tmp.row" value="[_value]" />
<!-- 前行の値が row に残らないよう、毎行クリアする。-->
<arc:set attr="row.ItemCode" value="" />
<!-- 当該行のセルをマッピング -->
<arc:set attr="xml.map:ItemCode" value="B[tmp.row]" />
<arc:set attr="xml.map:ItemName" value="F[tmp.row]" />
<arc:set attr="xml.map:ItemQty" value="C[tmp.row]" />
<arc:set attr="xml.map:ItemUnit" value="D[tmp.row]" />
<arc:set attr="xml.map:ItemPrice" value="E[tmp.row]" />
<arc:set attr="xml.map:ItemDiscRate" value="I[tmp.row]" />
<arc:set attr="xml.map:ItemDiscType" value="J[tmp.row]" />
<arc:call op="excelGet" in="xml" out="li">
<arc:map from="li" to="row" map="*=*" />
</arc:call>
<!-- 商品コード(B列)が空ならこれ以上の明細はないため終了 -->
<arc:equals attr="row.ItemCode" value="">
<arc:break />
</arc:equals>
<LineItem>
<ItemCode>[row.ItemCode | def]</ItemCode>
<Name>[row.ItemName | def]</Name>
<Quantity>[row.ItemQty | def]</Quantity>
<Unit>[row.ItemUnit | def]</Unit>
<UnitPrice>[row.ItemPrice | def]</UnitPrice>
<DiscountRate>[row.ItemDiscRate | def]</DiscountRate>
<DiscountType>[row.ItemDiscType | def]</DiscountType>
</LineItem>
</arc:enum>
</LineItems>
<Summary>
<TotalQuantity>[data.TotalQuantity | def]</TotalQuantity>
<RequestedDate>[data.SummaryReqDate | def]</RequestedDate>
</Summary>
</PurchaseOrder>
Excel コネクタにて変換モードをテンプレートとして、テンプレートファイルをアップロードします。

そしてフローを実行すると、以下のXML ファイルが出力されます。
<PurchaseOrder>
<Header>
<Status>受信済</Status>
<OrderNo>476696888</OrderNo>
<OrderDate>2015/7/8</OrderDate>
<RequestedDate>2015/10/30</RequestedDate>
<ShipDate>2015/10/20</ShipDate>
</Header>
<ShipTo>
<Name>株式会社TEST</Name>
<Address>東京都千代田区1-1-1</Address>
<City>千代田区</City>
<State>東京都</State>
<ZipCode>100-0001</ZipCode>
</ShipTo>
<BillTo>
<Name>株式会社DISTRIBUTER</Name>
<Address />
<City />
<State />
<ZipCode />
</BillTo>
<LineItems>
<LineItem>
<ItemCode>492000907210</ItemCode>
<Name>プレート</Name>
<Quantity>500000</Quantity>
<Unit>EA</Unit>
<UnitPrice>495</UnitPrice>
<DiscountRate />
<DiscountType />
</LineItem>
<LineItem>
<ItemCode>492000907211</ItemCode>
<Name>カップ</Name>
<Quantity>1234</Quantity>
<Unit>EA</Unit>
<UnitPrice>295</UnitPrice>
<DiscountRate />
<DiscountType />
</LineItem>
</LineItems>
<Summary>
<TotalQuantity>501234</TotalQuantity>
<RequestedDate>2015/10/30</RequestedDate>
</Summary>
</PurchaseOrder>
おわりに
本記事では、Excel コネクタの基本的な使い方を解説しました。製品を試していただく中で何かご不明な点があれば、テクニカルサポートへお気軽にお問い合わせください。
https://jp.cdata.com/support/submit.aspx
この記事では CData Arc™ 2026 - 26.2.9665.0 を利用しています。