セルタイプの取得

広告

セルに値が設定されている場合、セルは設定されている値の種類に応じていずれかのタイプとなります。ここではセルのタイプを調べる方法を確認します。

セルタイプを取得するにはCellインターフェースで用意されているgetCellTypeメソッドを使います。

Return the cell type. 

Returns:
  the cell type

メソッドを実行するとセルのタイプを表すint型の値を取得できます。取得可能な値はCellインターフェースで定義されており次のいずれかの値となります。

定数
0Cell.CELL_TYPE_NUMERIC
1Cell.CELL_TYPE_STRING
2Cell.CELL_TYPE_FORMULA
3Cell.CELL_TYPE_BLANK
4Cell.CELL_TYPE_BOOLEAN
5Cell.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メソッドを使います。

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");
  }
}

セルタイプが数値タイプだった場合には、さらに日付タイプなのか数値タイプなのかを調べています。

サンプルプログラム

実際に試してみましょう。

Sample5_1.java

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 )

関連記事 (一部広告含む)