2015年12月22日
Apache POIライブラリを使うと、Java言語から、Excelのファイルを簡単に生成できます。きれいな表やグラフを作りたいときや、サーバで難しい処理をした結果をExcel形式で出力したいときなどに、重宝するかもしれません。
Java言語でデータを処理して、結果をExcelでグラフにしたいとき、たいていはデータをCSV形式で書き出します。
"距離(km)","燃料消費量(l)","メモ" "1","0.20","東京駅前" "2","0.25","有楽町カメラ量販店前" "3","0.30","新橋駅前広場" "4","0.40","浜松町" "5","0.45","田町"!?&,<>""
ところが、CSV形式には、以下のような問題があり、データの表示形式が思った通りにならなかったり、流し込むセルががずれたりすることもあります。
"0.20"は、Excelの画面では"0.2"と表示されるなど、CSVファイルに書いたとおりに表示されないことがあります。
CSVファイルには、それぞれの値をどのような書式で表示すべきかの情報が入っていないので、データが見た目上どのように表示されるかは、Excel次第になります。
Excelで[データ]→[外部データの取り込み]→[テキストファイル]を実行すれば、手動で表示形式を選択しながらCSVファイルを読み込むこともできるのですが、それなりに面倒です。
1つの文字列であっても、中に「,」などの記号があると、そこでセルの区切りとみなされ、複数のセルに分かれて表示されるなどして、データを納めるセルがずれてしまうことがあります。
Excelが1つの文字列と認識できるように、文字列を置き換えることも1つの方法ですが、Excelが文字列の区切りを認識する規則性が分かりにくく、簡単ではありません。
Javaのプログラムから直接、Excel本来の形式で、セル毎の書式や、特殊な文字が入ったテキストなどもふまえてデータを出力できれば、それなりに便利にできそうです。
Excel2007以降で使われている拡張子が".xlsx"のファイルは、「Office Open XML方式」と呼ばれ、実はたくさんのXMLファイルをZIP形式に圧縮したものになっています。
XMLはテキスト形式なので、基本的にはXMLの書式に従ってデータを書き出せば、自作のJavaプログラムからExcelのファイルを出力できます。
しかし、これをやろうとすると結構難しいです。
一例として、ごくわずかにデータを入れただけでも、XMLファイルはこのように、たいへん長くなります。
<?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"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="x14ac"
xmlns:x14ac="http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac"><dimension
ref="A1:B3"/><sheetViews><sheetView tabSelected="1"
workbookViewId="0"><selection activeCell="B3"
sqref="B3"/></sheetView></sheetViews>
<sheetFormatPr defaultRowHeight="13.5" x14ac:dyDescent="0.15"/>
<sheetData><row r="1" spans="1:2" x14ac:dyDescent="0.15">
<c r="A1"><v>1.23</v></c><c r="B1" s="1" t="s">
<v>0</v></c></row>
<row r="2" spans="1:2" x14ac:dyDescent="0.15">
<c r="A2"><v>2</v></c>
<c r="B2" t="s"><v>1</v></c>
</row><row r="3" spans="1:2" x14ac:dyDescent="0.15">
<c r="A3"><v>3</v></c>
<c r="B3" t="s"><v>2</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>
ご参考までに、1枚のシートを示す上記のXMLファイルに含まれる、いくつかのタグの意味を以下に示します。
<sheetData>は、シートのデータを示しています。
<row>は、行を示します。
<c>は、セル1つを示します。
ささやかなExcelファイルでも、このようなXMLファイルが10個以上作られるようで、それぞれのXMLファイルを組み合わせて、1つのExcelファイルを組み立てていく必要があります。
XMLファイルの仕様書は、何千ページもあるので、とても読んでいられません。まあ、大量の仕様書が公開されていることは、それはそれですごいことなのですが・・・。
Javaのソースコードから、簡単にExcelのファイルを出力できるライブラリApache POIを見つけました。
これを使えば、Javaから比較的簡単にExcelのファイルを出力できます。
ブックの中に、シートを作り、行にセルを配置して、セルにデータを入れて、書式を設定して・・・といったことを、Javaの実行文で1つ1つ書いていき、最後にFileOutputStreamに書き出す指示をすれば、実行した通りの内容のExcelファイルができてしまいます。
「シート1」のワークシートの、左上のセルに123(数値)の入ったワークブックを作り、ファイルに書き出すなら、これだけでOKです。
Workbook book = new XSSFWorkbook(); // ワークブックを作る Sheet sheet1 = book.createSheet("シート1"); // シートを作る Row row = sheet1.createRow((short)0);// 最初の行を作る Cell cell = row.createCell(0);// 最初の行にセルを作る cell.setCellValue(123); // セルに値を入れる FileOutputStream fos = new FileOutputStream("book0001.xlsx"); // 出力するファイルの設定 book.write(fos); // ファイルへの出力 fos.close();// 出力完了
なお、WorkbookやSheetといったクラス名は、別途インポートが必要です。また、ファイルに書き出すためには例外をキャッチする処理なども必要ですのでご注意ください。
使い方を覚えるのが面倒な人のために、忙しい人向けのガイド(quick-guide)も公開されています。
これを読めば、たぶん見よう見まねでそれっぽい表が作れます。
科学研究のような難しいことをしている方々は、グラフをExcelでは作らないかもしれません。グラフの作成はgnuplotでやったほうがよいのであれば、そもそもXLSX形式のファイルに書き出す必要はないでしょう。
企業システムで、サーバにアクセスしてダウンロードボタンを押すと、Excelのファイルが出力されるような仕組みを作りたいときには、Apache POIは重宝しそうです。
Apache POIは、Excel形式だけでなく、ワードやパワーポイント形式のファイルもいじれるようになっているそうです。興味があれば、いじり回してみると楽しいかもしれません。
こちらのページには、Apache POIの詳しい使い方が紹介されています。英語のquick-guideが読みづらいようでしたら、参考になると思います。
トップページ → なにげなく自由研究(もくじ) → JavaのコードでExcelのファイルを作成--気軽に便利なApache POIライブラリ
著者のメールアドレス・Twitterアカウントは、トップページからご覧ください。
製作・著作:杉原 俊雄(すぎはら としお)
(c)2015 Sugihara Toshio. All rights reserved.