最新ExcelフォーマットをJavaで操作するための基礎XMLを取り込んだ最新Officeフォーマットとは(後編)(1/2 ページ)

» 2008年08月18日 00時00分 公開
[Girier陽子株式会社 東芝 ソフトウェア技術センター]

XMLを取り込んだExcelならJava標準APIで操作できる!

 本特集は、「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ファイルを見てみよう

 今回最初に作成するExcelファイルのサンプルは、図1のようになります。

図1 今回作成するサンプルのExcelファイル 図1 今回作成するサンプルのExcelファイル

 A列:テキストデータ、B列:数値、C列:数値からなる行を入力してみます。ソースコードのフォルダ構成は、次のようになります。

図1 OpenOffice.org日本語サイト 図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ファイルを作成するには?

 ダウンロードして解凍したフォルダの中から、テキストエディタで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生成 */

  1. sheet1.xmlファイルに書き込む内容をStringBufferへ保存(23?27行目)
  2. 1.で保存したデータからsheet1.xmlファイルを生成(28行目)
  3. あらかじめ保存しておいた[Content_Types].xmlやworkbook.xmlなどのファイルとともにsheet1.xmlファイルをZIP圧縮し、sample.xlsx生成(29行目)

 Java標準APIによるZIP圧縮について詳しく知りたい読者は、以下の記事を参考にしてください。

sample.xlsxに含むファイルの構成を決める

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列を設定します。

sheet1.xmlの生成

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」の行データについて、参照、追加、一部更新、削除を行ってみます。

       1|2 次のページへ

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。