Open XML SDK 備忘録

おもにExcelファイル (.xlsx) を扱います。

P-SPACE
就学奨励費システム

マイナンバー対応 特別支援教育 就学奨励費 支給業務支援システム

詳細...

P-SPACE
就学奨励費ソフトウェア

特別支援教育 就学奨励費 支給業務支援ソフトウェア

詳細...

開発室
(備忘録そのほか)

システム開発にまつわる(かもしれない)調査・実験結果など

詳細...

まずはセルデータから - その2

前回、セルのデータはWorksheetパーツファイル(xl/worksheets/sheet1.xml)に記述されていることを確認しました。

今回はそのWorksheetパーツを、シート名をもとに特定する方法について確認します。

シート名からWorksheetパーツファイルを特定する

はじめに前回に作った「Book1.xlsx」のコピーを作成し、コピーしたファイルのファイル拡張子を.zipに変えて、解凍してください。

解凍してできたフォルダのxlフォルダ内にworkbook.xmlというファイルがあります。

/xl/workbook.xml

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<workbook xmlns="【中略】">
【中略】
<sheets>
    <sheet name="Sheet1" sheetId="1" r:id="rId1"/>
</sheets>
【中略】
</workbook>

 このファイルのsheets要素にブックを構成するsheet要素が列挙されます。sheet要素のname属性にはシート名が、sheetId要素にはシートのIDが、r:id要素にはそのシートの定義がどこに配置されているかを特定するために用いるリレーションシップIDが、それぞれ記述されています。

Worksheetパーツの特定にはリレーションシップIDが手がかりになります。ファイル /xl/_res/workbook.xml.rels を参照すると、リレーションシップIDに対応する定義ファイルのパスを知ることができます。

/xl/_res/workbook.xml.rels

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
<Relationship Id="rId3" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles" Target="styles.xml"/>
<Relationship Id="rId2" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme" Target="theme/theme1.xml"/>
<Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet" Target="worksheets/sheet1.xml"/>
<Relationship Id="rId4" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings" Target="sharedStrings.xml"/>
</Relationships>

Id属性がrId1となっているRelationship要素は5行目にあります。このTarget属性をみると、前回確認したWorksheetパーツファイル(worksheets/sheet1.xml)にたどり着きます。

以上から、前回に説明した「セルにデータをセットするためのステップ」は、詳しくは以下の手順になることがわかります。

  1. 文字をセットするシート(Worksheetパーツ)を特定する。
    シート名を手がかりに、/xl/workbook.xml ファイルからリレーションシップIDを取得する。
    取得したリレーションシップIDをキーに/xl/_res/workbook.xml.rels ファイルからその定義が記述されているWorksheetパーツファイルを特定する。
    worksheet パーツのセル(c要素)を特定する。このときc要素がなければc要素を追加する。
    そのためには行(r要素)を特定する必要がある。このときr要素がなければr要素を追加する。
  2. 特定したセル(c要素)にデータをセットする。ただし文字データをセットする場合にはSharedStringパーツからセットしたい文字列を検索して、そのインデックス番号(n番目のsi要素)を取得する。
    (このときセットした文字列をもつsi要素が存在しなければ新たにsi要素を追加し、そのインデックス番号を取得する。)
    取得したインデックス番号を取得したc要素にセットする