[Seasar-user:1362] XlsReaderでのExcelファイル内Boolean値の読み込み

s-fukuzawa@hitachijoho.com s-fukuzawa
2004年 12月 15日 (水) 16:20:01 JST


福澤と申します。
はじめまして。

現在SQLServerでS2Daoを使っておりまして、S2UnitでExcelファイルを
利用してDBアクセスのテストを行っているところです。

その最中に気づいたのですが、Excelファイル内にBoolean値
(Excelは、セル内にTRUE,FALSEと書くとBoolean値として
勝手に認識してくれるようです)
を書いた場合、XlsReaderはそのセルをnullと認識してしまいます。

ソースを見たところXlsReaderとXlsWriterにBoolean値の時の処理が一切
含まれてなかったため、2ファイルを以下のように修正してみました。

public class XlsReader implements DataReader, DataSetConstants {
……
    public Object getValue(HSSFCell cell) {
        if (cell == null) {
            return null;
        }
        switch (cell.getCellType()) {
            case HSSFCell.CELL_TYPE_NUMERIC :
                if (isCellDateFormatted(cell)) {
                    return TimestampConversionUtil.toTimestamp(
                        cell.getDateCellValue());
                }
                return new BigDecimal(cell.getNumericCellValue());
            case HSSFCell.CELL_TYPE_STRING :
                String s = cell.getStringCellValue();
                if (s != null) {
                    s = StringUtil.rtrim(s);
                }
                if ("".equals(s)) {
                    s = null;
                }
                if (isCellBase64Formatted(cell)) {
                    return Base64Util.decode(s);
                }
                return s;
/*追加ここから*/
            case HSSFCell.CELL_TYPE_BOOLEAN :
                boolean b = cell.getBooleanCellValue();
                return Boolean.valueOf(b);
/*追加ここまで*/
            default :
                return null;
        }
    }
……
}



public class XlsWriter implements DataWriter, DataSetConstants {
……
    private void setValue(HSSFCell cell, Object value) {
        if (value instanceof Number) {
            cell.setCellValue(((Number) value).doubleValue());
        } else if (value instanceof Date) {
            cell.setCellValue((Date) value);
            cell.setCellStyle(dateStyle_);
        } else if (value instanceof byte[]) {
            cell.setCellValue(Base64Util.encode((byte[]) value));
            cell.setCellStyle(base64Style_);
/*追加ここから*/
        } else if (value instanceof Boolean) {
            cell.setCellValue(((Boolean)value).booleanValue());
/*追加ここまで*/
        } else {
            cell.setEncoding(HSSFWorkbook.ENCODING_UTF_16);
            cell.setCellValue(StringConversionUtil.toString(value, null));
        }
    }
}



これに気づいたのは、bit型のカラムを含むテーブルのDaoのテスト時
でしたが、上記の修正を行うことでこちらのテストも正常に動作するようになりました。

特に不都合が無ければSeasar本体に取り込んでいただけると幸いです。
よろしくおねがいします。

--
福澤 進 <[E-MAIL ADDRESS DELETED]>




Seasar-user メーリングリストの案内