- PR -

POIでExcelデータ取得について

投稿者投稿内容
ワタ
会議室デビュー日: 2007/11/05
投稿数: 1
投稿日時: 2007-11-05 21:05
こんばんわ。
こちらの話題はもう終わっているようですが、
でゅうくさんの仰っていたクラスが気になって
書式設定のされているセルについて調べてみたので貼らせていただきます。

素人考えで申し訳ないのですが・・・こんな感じでしょうか?

※サンプルなので1シート目1行目の、数値データのみ取得しています。
コード:
public class Sample {

    public static void main(String[] args) {
        try {
            HSSFWorkbook book = new HSSFWorkbook(new FileInputStream("Sample.xls"));
            HSSFDataFormat fmt = getDataFormat(book);
            HSSFRow row = book.getSheetAt(0).getRow(0);
            for (short i = 0; i < row.getLastCellNum(); i++) {
                HSSFCell cell = row.getCell(i);
                if (cell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC) {
                    System.out.println(getNumericCellValue(cell, fmt));
                }
            }
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    }

    private static HSSFDataFormat getDataFormat(HSSFWorkbook book) throws Exception {
        Class cls = HSSFWorkbook.class;
        Method mtd = cls.getDeclaredMethod("getWorkbook", null);
        mtd.setAccessible(true);
        Workbook work = (Workbook) mtd.invoke(book, null);
        return new HSSFDataFormat(work);
    }

    private static String getNumericCellValue(HSSFCell cell, HSSFDataFormat fmt) throws Exception {
        double value = cell.getNumericCellValue();
        short fmtNum = cell.getCellStyle().getDataFormat();
        if (fmtNum != 0) {
            DecimalFormat dfmt = new DecimalFormat(fmt.getFormat(fmtNum));
            return dfmt.format(value);
        }
        return String.valueOf(value);
    }
}



でゅうく
大ベテラン
会議室デビュー日: 2003/11/30
投稿数: 129
投稿日時: 2007-11-06 15:46
引用:

こんな感じでしょうか?



残念ながらそんなに単純な話では無いです。
HSSFDataFormat#getFormat(short) で得られる表示形式は、NumberFormat#format(double) ではフォーマットできません。
表示形式のユーザー定義で 「#,##0;[赤]-#,##0;[青]"零";[黄]G/標準」 と設定されていた場合、当然ですが NumberFormat のサブクラスではフォーマットできない訳です。
さらに言えば、日付である可能性もある訳ですし、HSSF でサポートしていない(たぶん・・)の元号も考慮する必要が出てくるかもしれません。
でゅうく
大ベテラン
会議室デビュー日: 2003/11/30
投稿数: 129
投稿日時: 2007-11-06 16:02
# 途中で送信してしまいました。

上記の理由により、表示形式のパーサを実装しなければいけなそうなので、最初の投稿でお薦めしなかったわけです。

参考に、下記をご一読ください。
http://support.microsoft.com/kb/883199/ja
でゅうく
大ベテラン
会議室デビュー日: 2003/11/30
投稿数: 129
投稿日時: 2007-11-06 17:27
連投ごめんなさい。

2コ前の投稿で、「NumberFormat」 とか 「NumberFormat のサブクラス」 とか書いてますが、DecimalFormat の間違いです。orz

Excel の表示形式のフォーマッタを NumberFormat のサブクラスとして実装しなくちゃ・・みたいなことを書こうとしてたのだと思うけど、推敲する前に送信しちゃったもんで・・・。

# 編集機能があるのは知ってるけど、あえて訂正の投稿します。

スキルアップ/キャリアアップ(JOB@IT)