連載
» 2004年09月07日 10時00分 公開

JavaTips 〜Apache/Jakarta編:POIを使用してJavaからExcelデータを読み込む

[青木淳夫, 岡雅久,@IT]

 データ入力を行うには、Webブラウザや専用のGUI画面を使用することが一般的ですが、用途によっては、Microsoft Excelで作成したファイルからデータの読み込みを求められることがあります。そこで、本稿では「POI」を使用して、Excelファイルを読み込む方法を紹介します。なお、POIの基本については、「POIを使用してJavaからExcel出力を行う」をご覧ください。

 今回は、Excelファイルを読み込み合計値を出力するというサンプルを実行します。

読み込むExcelファイル 読み込むExcelファイル (Excelファイルはここからダウンロードできます)

 以下は、先ほど示したExcelファイルをJavaで読み込むためのプログラムです。

PoiReadSample.java
package to.msn.wings;
 
import java.io.FileInputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
 
public class PoiReadSample {
    public static void main(String[] args) {
        try {
            //Excelのワークブックを読み込みます。
            POIFSFileSystem filein = new POIFSFileSystem
                (new FileInputStream("C:\\PoiReadSample.xls"));
            HSSFWorkbook wb = new HSSFWorkbook(filein);
            //シートを読み込みます。
            HSSFSheet sheet = wb.getSheet("サンプルSheet");
            //3行目の値を読み込みます。
            HSSFRow row = sheet.getRow(2);
            //getStringCellValueにて文字列を読み込みます。
            HSSFCell cell = row.getCell((short) 1);
            String shopName = cell.getStringCellValue();
            //getDateCellValueにて日付を読み込みます。
            cell = row.getCell((short) 2);
            Date inputDate = cell.getDateCellValue();
            //6行目から17行目の値を読み込みます。           
            int sum = 0;    //合計金額を保存する変数
            for (int i = 5; i <= 16; i++) {
                //getNumericCellValueにて数字を読み込みます。
                row = sheet.getRow(i);
                cell = row.getCell((short) 2);
                sum = sum + (int) cell.getNumericCellValue();
            }
            //Excelから読み込んだ結果を出力します。
            System.out.println(shopName + "の年間売上は" 
                    + sum + "円です。");
            System.out.println(new SimpleDateFormat
                    ("yyyy/MM/dd").format(inputDate) + "入力" );
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("処理が失敗しました");
        }
    }
}

 このプログラムを実行すると下記のように出力されます。

東京駅前店の年間売上は78000円です。
2004/04/20入力

 今回のサンプルでは、店名は文字列型のためgetStringCellValueメソッド、入力日は日付型のためgetDateCellValueメソッド、売上げはgetNumericCellValueメソッドにてセルの値を読み込んでいます。このように、セルに設定されている値を取得したい場合には、HSSFCellクラスのget〜Valueメソッドを使用します。

HSSFCellクラスから値を取得するメソッド
HSSFCellのメソッド 詳細
getBooleanCellValue セルの値をBoolean型にて読み込む
getDateCellValue セルの値を日付型にて読み込む
getNumericCellValue セルの値をDouble型の数値にて読み込む
getStringCellValue セルの値を文字列型にて読み込む
getCellFormula セルに設定されている計算式を読み込む

 今回紹介したセルの読み込み方法を整理すると以下の手順になります。

  1. ワークブックの指定(HSSFWorkbookクラス)
  2. ワークシートの指定(HSSFWorkbook#getSheetメソッド)
  3. 対象列の指定(HSSFSheet#getRowメソッド)
  4. 対象セルの指定(HSSFRow#getCellメソッド)
  5. セル値の読み込み(HSSFCell#get〜CellValueメソッド)

 なお、文字列のセルをgetNumericCellValueで読み込んだり、数字型のセルをgetStringCellValueにて読み込んだりするとNumberFormatExceptionが発生します。そのためgetCellTypeメソッドを使用して事前にセルの型を調べることができます。getCellTypeメソッドの戻り値は下記のとおりです。

HSSFCellのgetCellTypeの戻り値
フィールド名 セルの型
CELL_TYPE_BLANK 空白
CELL_TYPE_BOOLEAN Boolean型
CELL_TYPE_ERROR エラーコード
CELL_TYPE_FORMULA 計算式
CELL_TYPE_NUMERIC 数値型
CELL_TYPE_STRING 文字列型

 getCellTypeメソッドの戻り値に応じて、処理内容を制御するとよいでしょう。

Profile

WINGSプロジェクト

青木淳夫・岡雅久


Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

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

メールマガジン登録

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