本特集は、「Office 2007」よりファイル形式として使われている「Office Open XML」ファイルフォーマット(以下、Open XML)について解説をする特集記事です。前編の「Officeファイルの成り立ちと最新形、そして標準化」では、XMLを取り込んだOpen XMLの成り立ちやOpenOfficeとの比較、標準化の流れ、仕様の概要について紹介しました。
後編は、Excelを例にJavaで最新Officeフォーマットファイルのデータを操作する方法を紹介します。まず、ワークシートが1つで、テキストと数値の行を入力したシンプルなExcelファイルを作成してみます。次に、DOM操作用のJava標準APIである「org.w3c.dom」「javax.xml.parsers」「javax.xml.transform」パッケージなどを使って、作成したExcelファイルの各行を参照したり、データをさらに追加したり、データの一部更新、削除など行ってみます。
Java標準APIによるXML操作の基本を知りたい読者は、少し情報が古いですが、以下の連載を参考にしてください。
今回最初に作成するExcelファイルのサンプルは、図1のようになります。
図1 今回作成するサンプルのExcelファイル
A列:テキストデータ、B列:数値、C列:数値からなる行を入力してみます。ソースコードのフォルダ構成は、次のようになります。
図2 ソースコードのフォルダ構成
まずは、図2のソースコードをこちらよりダウンロードしておいてください。
本稿のサンプルプログラムについては、以下の注意事項がありますので、気を付けてください。
- Java動作確認環境は、JDK 6 Update 5ですJDK 6 Update 5です
- Office 2007でdocx/xlsx/pptxサンプルファイルの編集や保存を行うと、元のサンプルにないコードが挿入されます
- テキストエディタでサンプルのXMLファイルを編集する場合、文字コードをUTF-8に設定してください。エンコーディングが正しく設定されないと、Office 2007でdocx/xlsx/pptxファイルが開けない場合があります文字コードをUTF-8に設定してください。エンコーディングが正しく設定されないと、Office 2007でdocx/xlsx/pptxファイルが開けない場合があります
- プログラムをコンパイルする際、コンパイル環境がUTF-8ではない場合、『javac -encoding UTF-8 OXMLCreator.java』のように、コンパイル時に文字コード(エンコーディング)を指定してくださいコンパイルする際、コンパイル環境がUTF-8ではない場合、『javac -encoding UTF-8 OXMLCreator.java』のように、コンパイル時に文字コード(エンコーディング)を指定してください
- サンプルファイルは読み取り専用になっています。必要に応じ、解除してください読み取り専用になっています。必要に応じ、解除してください
- サンプルプログラムは自己責任によりご利用ください
Javaの文字エンコーディングについて詳しく知りたい読者は、以下の記事を参考にしてください。
ダウンロードして解凍したフォルダの中から、テキストエディタでOpen XMLのExcelファイルを作成する「OXMLCreator.java」ファイルを開いてください。OXMLCreator.javaの処理の流れは、次のようになります。
23 oxml.startFile();
24 oxml.insertData("製品名1", 4, 400); /* 行追加 */
25 oxml.insertData("製品名2", 10, 1200); /* 行追加 */
26 oxml.insertData("製品名3", 3, 900); /* 行追加 */
27 oxml.endFile();
28 oxml.createUTF8file((String)fileList.get(4));/* sheet1.xml生成 */
29 oxml.createZIPfile(fileList,"sample.xlsx"); /* sample.xlsx生成 */ |
- sheet1.xmlファイルに書き込む内容をStringBufferへ保存(23?27行目)
- 1.で保存したデータからsheet1.xmlファイルを生成(28行目)
- あらかじめ保存しておいた[Content_Types].xmlやworkbook.xmlなどのファイルとともにsheet1.xmlファイルをZIP圧縮し、sample.xlsx生成(29行目)
Java標準APIによるZIP圧縮について詳しく知りたい読者は、以下の記事を参考にしてください。
15 ArrayList<String> fileList = new ArrayList<String>();
16 fileList.add("[Content_Types].xml");
17 fileList.add("_rels/.rels");
18 fileList.add("xl/workbook.xml");
19 fileList.add("xl/_rels/workbook.xml.rels");
20 fileList.add("xl/worksheets/sheet1.xml"); |
16〜20行目でZIPファイル(sample.xlsx)に含むファイルのファイル名とパスを追加します。
38 void insertData(String a, int b, int c) {
39 rowNum++;
40 sheetContent.append("
<row r=\""+rowNum+"\">\r\n"
41 +" <c r=\"A"+rowNum+"\" t=\"inlineStr\">\r\n" /* A列*/
42 +" <is>\r\n"
43 +" <t>"+a+"</t>\r\n" /* テキストデータ */
44 +" </is>\r\n"
45 +" </c>\r\n"
46 +" <c r=\"B"+rowNum+"\">\r\n" /* B列 */
47 +" <v>"+b+"</v>\r\n" /* 数値データ */
48 +" </c>\r\n"
49 +" <c r=\"C"+rowNum+"\">\r\n" /* C列 */
50 +" <v>"+c+"</v>\r\n" /* 数値データ */
51 +" </c>\r\n"
52 +" </row>\r\n");
53 } |
insertDataの引数に順に設定したA列のテキスト、B列の数値、C列の数値をそれぞれStringBuffer型のsheetContent変数へ行データ1行分のデータとして保存します。41〜45行目でA列、46?48行目でB列、49?51行目でC列を設定します。
60 void createUTF8file(String fileName){
61 try {
62 BufferedOutputStream outstream
= new BufferedOutputStream(
new FileOutputStream(fileName));
63 outstream.write(sheetContent.toString()
.getBytes("UTF-8"));/* 文字コード指定 */
64 outstream.flush();
65 outstream.close();
66 }catch (Exception e) {
67 e.printStackTrace();
68 }
69 } |
StringBuffer型のsheetContent変数へ保存したデータからsheet1.xmlファイルを生成します。63行目でsheet1.xmlの文字コードを「UTF-8」に設定します。なお、Open XMLでサポートされている文字コードは、「Unicode」(「UTF-8」または「UTF-16」)および「ISO/IEC 10646」です。
sheet1.xmlファイルを生成後、あらかじめ保存しておいた[Content_Types].xmlやworkbook.xmlなどのファイルとともにsheet1.xmlファイルをZIP圧縮すると、図1のようなExcelファイルが作成されます。
次ページでは、今回作成したサンプルExcelファイル「sample.xlsx」の行データについて、参照、追加、一部更新、削除を行ってみます。