読者です 読者をやめる 読者になる 読者になる

Office OpenXMLの解説

GPUで並列処理の続きの記事がまだできていませんので、今回は別の記事を用意しました。

OpenXMLはMicrosoft Office2007で新たに採用された文章フォーマットです。
Microsoft独自のバイナリデータではなく、新たにXMLで記述された規格を採用したことで、外部アプリケーションから
データ内容を操作しやすくなりました。
しかしながら、データ操作の際ECMAのOpenXML仕様書(Part 4: Markup Language Reference)を参照するわけですが、5千ページを超えているpdfですので ファイルを開くだけでマシンがカクカクする私にとっては大問題です。

よって今回Microsoft Excelのセル内容、レイアウトを変更するにあたって特に必要な部分についてまとめました。

フォルダ構成

まず、Excelファイルであるxlsxファイルを展開してみます。
すると次のようなフォルダ構成となっています。

  root
   |- _rels
   |
   |- docProps
   |
   |- xl
   |
   |- [Content_Types].xml

この中で表内のデータを操作する場合に必要なのはxlフォルダです。
そのフォルダ内で書き換えが必要なxmlは次の二つです。

  • xl\worksheets\sheet○.xml(○の中には何枚目のシートであるといった番号が振られます)
  • xl\styles.xml
それでは実際にファイル内容を変更してみましょう。

ファイルフォーマット、ビューの定義(sheet.xml

セル内のデータに変更を加えるのでsheet1.xmlを元に説明します。
まずは行頭のxmlフォーマット定義部です。ここはほぼテンプレートなので変更する必要はないでしょう。
UTF-8フォーマットで書かれているということを定義しています。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main"
xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships">

次にシートのビューの状態に��いて設定する項目があります。
シートのビューとはExcelでそのxlsxファイルをオープンした時に、どのようにファイルが表示されるかという事です。

<dimension ref="A1:D2"/>
<sheetViews><sheetView tabSelected="1" workbookViewId="0">
<selection activeCell="D2" sqref="D2"/>
</sheetView>
</sheetViews>
<sheetFormatPr defaultRowHeight="13.5"/>

ここで使われているタグについて説明します。

  • dimention : シートのデータが入っている左上のセル番号:右下のセル番号を登録
  • sheetView : シートのビューIDとExcelで表示されるタブの番号を指定します
  • selection : 現在Excel画面でカーソルがアクティブになっているセル(どこでもよいと思われます)
  • shee tFormatPr : ロウのデフォルトの縦幅は13.5(point?)と定義されています (styles.xmlでスタイルが決定できるのですが・・・、なぜここでも定義する必要があるのかは不明)
ここまででフォーマット定義、ビューの定義が終わりいよいよセルのデータ操作となります。

セル内データの操作(sheet.xml

理解しやすくするために、セルにデータを入力してみます。
  • A1 : 1(数値としての1)
  • B1 : 2007/05/07(日付)
  • C1 : 3列目(文字列)
  • D1 : hogehoge(文字列)
  • D2 : 8(数値としての8)
xmlは以下のようになります。

<sheetData>
<row r="1" spans="1:4">
<c r="A1"><v>1</v></c>
<c r="B1" s="1"><v>39575</v></c>
<c r="C1" t="s"><v>0</v></c>
<c r="D1" t="s"><v>1</v></c>
</row><row r="2" spans="1:4">
<c r="D2"><v>8</v></c>
</row>
</sheetData>
<phoneticPr fontId="1"/><pageMargins left="0.7" right="0.7" top="0.75" bottom="0.75" header="0.3" footer="0.3"/>
</worksheet>

それではここのタグは詳細に解説したいと思います。

  • sheetDataタグ : シート情報の開始タグです。アトリビュートはありません。
  • rowタグ : 行の開始タグです(アトリビュート : r 行番号を指定します,spans 開始�列:終了列で指定します)
  • cタグ : セル開始タグです(アトリビュート : 量が多いため後述します)
  • vタグ : セル内の値を保持するタグです。
  • phoneticPrタグ : フォントを変更しているようですが・・・特に操作したことがありませんorz
  • pageMarginsタグ : ページ上下左右のマージンサイズを変更できます
cタグのアトリビュートについて列挙します
  • r : 行列番号を指定します
  • s : 1を指定すると時刻を(年/月/日)のフォーマットで表示します
  • t : sを指定するとstringテーブルを格納したxmlファイルから参照します、またstrを指定することでvタグ内に直接文字列を書き込むことができます。
よって何もない空のsheet.xmlを操作する場合dimention, spansを使用サイズ分設定した後、新たにcタグを作りvタグに値を設定すればよいということです。(実はdimentionは特に設定しなくても動きますが、念のため)実際にE1セルに�新しい内容を追加してみました。
こちらが変更前です。


以下の行を追加します。

<c r="E1" t="str"><v>new</v></c>


正常に変更されました。もしファイルオープンに失敗する場合は以下の点に注意してください。

  • 文字フォーマットはUTF-8で保存しているかどうか
  • Book1.xlsxを解凍したときにでてくるBook1フォルダごと圧縮していないかどうか(圧縮するのはその下の3つのフォルダと1つのxmlファイルだけです)
今回セルの内容操作だけでかなり長文となってしまいました。
スタイルや罫線、配色については次の機会に説明したいと思います。

さらに説明しきれなかったタグの説明や、アトリビュートの詳細説明を後日リファレンスとしてまとめたいと思います。

担当:松浦