セルタイプの取得
セルに値が設定されている場合、セルは設定されている値の種類に応じていずれかのタイプとなります。ここではセルのタイプを調べる方法を確認します。
セルタイプを取得するにはCellインターフェースで用意されているgetCellTypeメソッドを使います。
int getCellType()
Return the cell type. Returns: the cell type
メソッドを実行するとセルのタイプを表すint型の値を取得できます。取得可能な値はCellインターフェースで定義されており次のいずれかの値となります。
値 | 定数 |
---|---|
0 | Cell.CELL_TYPE_NUMERIC |
1 | Cell.CELL_TYPE_STRING |
2 | Cell.CELL_TYPE_FORMULA |
3 | Cell.CELL_TYPE_BLANK |
4 | Cell.CELL_TYPE_BOOLEAN |
5 | Cell.CELL_TYPE_ERROR |
日付タイプについては数値の場合と同じくCELL_TYPE_NUMERICとなります。
実際の使い方は次のようになります。
InputStream in = new FileInputStream("filename.xls"); Workbook wb = WorkbookFactory.create(in); Sheet sheet = wb.getSheetAt(0); Row row = sheet.getRow(0); Cell cell = row.getCell(2); int type = cell.getCellType();
この場合は、0行目の2列目のセルのタイプを取得しています。
日付タイプか数値タイプか
先ほど記載したとおり、日付タイプと数値タイプは同じくCELL_TYPE_NUMERICとなります。そこでさらに数値か日付かを判別するためにはDateUtilクラスで用意されているisCellDateFormattedメソッドを使います。
public static boolean isCellDateFormatted(Cell cell)
Check if a cell contains a date Since dates are stored internally in Excel as double values we infer it is a date if it is formatted as such.
getCellTypeメソッドを実行した戻り値がCell.CELL_TYPE_NUMERICだった場合に、さらにこのメソッドの引数にCellインターフェースを実装したクラスのオブジェクトを指定すると、セルのタイプが日付タイプなのか数値タイプなのかを調べることができます。trueを返した場合、セルのタイプは日付タイプです。falseを返した場合は数値タイプとなります。
実際の使い方は次のようになります。
InputStream in = new FileInputStream("filename.xls"); Workbook wb = WorkbookFactory.create(in); Sheet sheet = web.getSheetAt(0); Row row = sheet.getRow(0); Cell cell = row.getCell(2); int type = cell.getCellType(); if (type == Cell.CELL_TYPE_NUMERIC){ if(DateUtil.isCellDateFormatted(cell)) { System.out.println("Date Type"); }else{ System.out.println("Numeric Type"); } }
セルタイプが数値タイプだった場合には、さらに日付タイプなのか数値タイプなのかを調べています。
サンプルプログラム
実際に試してみましょう。
import org.apache.poi.ss.usermodel.*; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.openxml4j.exceptions.InvalidFormatException; import java.io.*; import java.util.Calendar; import java.util.Date; public class Sample5_1{ public static void main(String[] args){ FileInputStream in = null; Workbook wb = null; try{ in = new FileInputStream("sample.xls"); wb = WorkbookFactory.create(in); }catch(IOException e){ System.out.println(e.toString()); }catch(InvalidFormatException e){ System.out.println(e.toString()); }finally{ try{ in.close(); }catch (IOException e){ System.out.println(e.toString()); } } Sheet sheet = wb.getSheetAt(0); for (int i = 1 ; i < 8 ; i++){ Row row = sheet.getRow(i); if (row == null){ row = sheet.createRow(i); } Cell cell1 = row.getCell(1); if (cell1 == null){ cell1 = row.createCell(1); } Cell cell2 = row.createCell(2); switch(cell1.getCellType()) { case Cell.CELL_TYPE_STRING: cell2.setCellValue("String"); break; case Cell.CELL_TYPE_NUMERIC: if(DateUtil.isCellDateFormatted(cell1)) { cell2.setCellValue("Date"); } else { cell2.setCellValue("Numeric"); } break; case Cell.CELL_TYPE_BOOLEAN: cell2.setCellValue("Boolean"); break; case Cell.CELL_TYPE_FORMULA: cell2.setCellValue("Formula"); break; case Cell.CELL_TYPE_ERROR : cell2.setCellValue("Error"); break; case Cell.CELL_TYPE_BLANK : cell2.setCellValue("Blank"); break; } } FileOutputStream out = null; try{ out = new FileOutputStream("sample5_1.xls"); wb.write(out); }catch(IOException e){ System.out.println(e.toString()); }finally{ try { out.close(); }catch(IOException e){ System.out.println(e.toString()); } } } }
今回は下記のようなExcelファイルを事前に用意しました。
プログラムを実行すると1列目のセルのセルタイプを読み込み、同じ行の2列目のセルにセルタイプを値として設定します。それでは作成されたExcelファイルを開いてみます。
このようにセルタイプを取得することができました。また同じ数値タイプであっても日付か数値かの判別も行われています。(なお、セルの値が240となっているところは、実際には「=10*24」という計算式が入力されています)。
( Written by Tatsuo Ikura )
著者 / TATSUO IKURA
これから IT 関連の知識を学ばれる方を対象に、色々な言語でのプログラミング方法や関連する技術、開発環境構築などに関する解説サイトを運営しています。