top / index / prev / next / target / source
日記形式でつづる いがぴょんコラム ウェブページです。
遅ればせながら 私も Jakarta POIを用いたExcelファイル読み込みを体験してみました。サンプルソースコードをメモしておきます。 + Java Excel API (JExcelApi) のメモ
Jakarta POI 2.5.1 による Excelファイル読み込みについて ざっくり調べたので、これをメモします。
まず、一次情報源は下記になります。(※ポイント: 必ず一度は一次情報源から情報を得る努力を行うよう心がけましょう)
いろいろ書いてありますが、現時点で一番安定感があるのは HSSFによるExcel操作の模様です。(というか サンプルがHSSFによるExcel操作でした)まずは POIのバイナリとソースをダウンロードしました。
これを解凍して、下記の2ファイルを得ます。
poi-2.5.1-final-20040804.jar
poi-contrib-2.5.1-final-20040804.jar
動作条件
sample.xls というExcelファイルがカレントディレクトリに存在すること。
Sheet1 というワークシートに、A列1行に 文字列(または数字)のデータが書かれていること。
その上で、下記のサンプルを動作させました。 PoiReadExcelSample.java
/*
* Jakarta POI: Excel読み込みサンプル
* Copyright (C) 2005 伊賀敏樹
* 作成日: 2005/02/06
*/
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
/**
* @author Tosiki IGA
*/
public class PoiReadExcelSample {
public static void main(String[] args) {
FileInputStream inStream = null;
try {
try {
inStream = new FileInputStream("sample.xls");
} catch (FileNotFoundException ex) {
System.err.println("ファイルのオープンに失敗しました.:" + ex.toString());
return;
}
HSSFWorkbook hssfWorkbook = null;
try {
hssfWorkbook = new HSSFWorkbook(inStream);
} catch (IOException ex) {
System.err.println("Excelのファイル形式が不正です.:" + ex.toString());
return;
}
HSSFSheet hssfSheet = hssfWorkbook.getSheet("Sheet1");
if (hssfSheet == null) {
System.err.println("指定のExcelシートが見つかりませんでした.");
return;
}
//
HSSFRow hssfRow = hssfSheet.getRow(0);
if (hssfRow == null) {
System.err.println("指定のExcel行が見つかりませんでした. "
+ "なお、行は0オリジンとなっています。つまり1行目は 0 と指定します。");
return;
}
HSSFCell hssfCell = hssfRow.getCell((short) 0);
if (hssfCell == null) {
System.err.println("指定のExcel列が見つかりませんでした. "
+ "なお、列は0オリジンとなっています。つまりA列は 0 と指定します。");
return;
}
try {
// 文字列であれば、ここを通過する。
System.out.println(hssfCell.getStringCellValue());
} catch (NumberFormatException e) {
// 数値であれば、ここを通過する。
System.out.println(hssfCell.getNumericCellValue());
//日付フィールドの場合には下記で取得する。
//System.out.println(hssfCell.getDateCellValue());
}
} finally {
try {
if (inStream != null) {
inStream.close();
}
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
}
動かしてみて、ちゃんとExcelのファイルを読み込むことができることを確認しました。Jakarta POI って すごいですね。POIのおかげで、Java言語からExcelファイルの入出力が出来てしまうのですから。ポイントは、Excelシート名を英字にしておくことなどなどです。このサンプルは、英字シート名対策を割愛しています。また、実業務で利用する際には、こんな実装ではなくって、当然クラス化などを行ってカプセリングを行います。
他のJakarta POIのサンプル
2005.02.21 後日談 JExcelApiの検討も深めていっています。
2005.02.07 読者の方からのツッコミ伊藤と申します。 2月6日の日記
を興味深く拝読しました。私は、 POI は寡聞にして知りませんでしたが、 Java での Excel の読み書きには、以前から
を使用しています。 POI を知ったうえは、作者個人依存の Java Excel API より、 Jakarta の POI のほうが安心かと思い、乗り換えを考えましたが、残念ながら現状では、 Java Excel API のほうが、使いやすいようです。
たとえば、 HSSF で読めていた Excel シートに、オートフィルタを追加しただけで、例外が発生して読めなくなってしまいましたが、Java Excel API では読めます (ただし、オートフィルタでフィルタをかけた結果が読めるわけではなく、単に元データが読めるだけですが)。御参考まで。
2005.02.09追伸 なお、この件では、バグレポートが出ていて CVS では修正されている模様です。
ここからいがぴょんツッコミ、大変 ありがとうございます。感謝です。JExcelApi (Java Excel API)のサイトを とても興味深く拝見させて頂きました。それにしても、HSSFがExcelシートにオートフィルタをかけただけで読み込めなくなるとは衝撃です。そして GNU Lesser General Public License (LGPL)ライセンスである点も魅力ですもの。(私はデフォルトでLGPLライセンスが好きなのです) メーリングリストも活発に運用されており、46名のメンバが在籍しているようです。単に個人が開発したソフトという枠は超えている、ちゃんとユーザが根付いたオープンソースプロダクトだと感じました。なお、いま従事している案件では ユーザが入力したExcelシートが入力となるので、オートフィルタがかかっただけで読み込めなくなるのは結構困りそうなのです。確認を取って、パッチ適用よりもJava Excel APIの方が良い、あるいはサポート範囲が広いようなら、お客様向けに情報をあげていって Java Excel APIの検討も勧める必要がありそうです。(2005.02.09内容を微調整)
それにしても、jexcelapi_2_0.tar.gz とか jxl.jar が見いだせたら、JExcelApi (Java Excel API)が関連しているのですね。今後 注意して観察していこうと思います。
2005.02.19 追記 JExcelApi (Java Excel API) の最新版は JExcelApi v2.5.2 でした。Jakarta POI 2.5.1において Excelシートのコピーの際に画像が入っているとコピーできないという不具合があり、JExcelApiの検討を深めていく予定です。
JExcelApiの現時点でわかったリンクをメモしておきます。
JExcelApi http://jexcelapi.sourceforge.net/
JExcelApi : SourceForge.net: A Java library for reading/writing Excel http://sourceforge.net/projects/jexcelapi/
JExcelApi http://www.andykhan.com/jexcelapi/
2005.02.21 後日談 まずはサンプルを書いてみようということで、ざっくりサンプルを作り始めました。
こんなサービスが存在したら便利かしらメモ。マンスリー・メールアドレス。あるサーバに月極でメールアドレスを開設してもらいます。そのメールアドレスに受信したメールは、自動的にあらかじめ登録してある自身のメールアドレスにメールが届くというサービスです。そんなサービスがあったら、便利かしら。例えば、飲食店などで順番待ちをしている際に、マンスリー・メールアドレスを申請しておいて、順番が来たら、マンスリー・メールアドレス側にメールをもらう。そうすると、自身のケータイメールにメールが転送されて届くという使い方などが思いつきます。ポイントは、そのマンスリー・メールアドレスを運営する事業者が、個人情報保護などを徹底して実施できるような信頼に足る事業者であること、って感じでしょうか。
Last modified: $Date: 2018-04-18 $