前回、セルのデータは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)にたどり着きます。
以上から、前回に説明した「セルにデータをセットするためのステップ」は、詳しくは以下の手順になることがわかります。
- 文字をセットするシート(Worksheetパーツ)を特定する。
シート名を手がかりに、/xl/workbook.xml ファイルからリレーションシップIDを取得する。
取得したリレーションシップIDをキーに/xl/_res/workbook.xml.rels ファイルからその定義が記述されているWorksheetパーツファイルを特定する。
worksheet パーツのセル(c要素)を特定する。このときc要素がなければc要素を追加する。
そのためには行(r要素)を特定する必要がある。このときr要素がなければr要素を追加する。 - 特定したセル(c要素)にデータをセットする。ただし文字データをセットする場合にはSharedStringパーツからセットしたい文字列を検索して、そのインデックス番号(n番目のsi要素)を取得する。
(このときセットした文字列をもつsi要素が存在しなければ新たにsi要素を追加し、そのインデックス番号を取得する。)
取得したインデックス番号を取得したc要素にセットする