【Java】【Excel】 Java で Excel の読み書きを行う ~ Apache POI / 入門編 ~

JavaExcel の読み書きを行うには...

 * Apache POI を使用する

補足

 * 「JExcel API」「jXLS」「XLSBeans」ってのもあるらしいが
    Java の主流は、Apache POIらしいので。

Apache POI について

特徴

 * 「.xls」と「.xlsx」の両方のエクセルファイルを扱うことができる

公式サイト

http://poi.apache.org/

■ 設定

その1:ダウンロードして設定する

 [1] 以下のサイトからZIPファイル(今回は「poi-bin-3.14.zip」)をダウンロードし、解凍する
Downloadサイト
http://poi.apache.org/download.html
 [2] ダウンロードしたJARファイルをEclipseにインポートする(今回は以下のJARファイル)

  + poi-3.14-20160307.jar
  + poi-excelant-3.14-20160307.jar
  + poi-ooxml-3.14-20160307.jar
  + poi-ooxml-schemas-3.14-20160307.jar
  + poi-scratchpad-3.14-20160307.jar
  + commons-codec-1.10.jar
  + commons-logging-1.2.jar
  + log4j-1.2.17.jar
  + curvesapi-1.03.jar
  + xmlbeans-2.6.0.jar

その2:Gradleから設定する

build.gradle
apply plugin: 'java-library'

repositories {
    jcenter()
}

dependencies {
    // ★Apache POI★
    compile group: 'org.apache.poi', name: 'poi', version: '3.17'
}

■ サンプル

Main.java

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CreationHelper;
import org.apache.poi.ss.usermodel.DateUtil;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;
import org.apache.poi.ss.util.WorkbookUtil;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class Main {

  public static void main(String[] args) throws FileNotFoundException, IOException {
    String filePath = "C:\\temp\\sample.xlsx";

    // 書き込み
    try (FileOutputStream out = new FileOutputStream(filePath)) {
      Workbook workbook = new XSSFWorkbook();
      String safeName = WorkbookUtil.createSafeSheetName("Sheet Name");
      Sheet sheet = workbook.createSheet(safeName);
      CreationHelper createHelper = workbook.getCreationHelper();

      Row row = sheet.createRow((short) 0);
      Cell cell = row.createCell(0);
      cell.setCellValue(1);

      row.createCell(1).setCellValue(1.2);
      row.createCell(2).setCellValue(createHelper.createRichTextString("sample string"));
      row.createCell(3).setCellValue(true);

      workbook.write(out);
    }

    // 読み込み
    try (FileInputStream in = new FileInputStream(filePath);
         Workbook workbookForInput = WorkbookFactory.create(in);) {

      // 全セルを表示する
      for (Sheet sheet : workbookForInput) {
        for (Row row : sheet) {
          for (Cell cell : row) {
            System.out.print(getCellValue(cell));
            System.out.print(" , ");
          }
          System.out.println();
        }
      }
    } catch (Exception ex) {
      ex.printStackTrace();
    }
  }

  private static Object getCellValue(Cell cell) {
    switch (cell.getCellType()) {
    case Cell.CELL_TYPE_STRING:
      return cell.getRichStringCellValue().getString();
    case Cell.CELL_TYPE_NUMERIC:
      if (DateUtil.isCellDateFormatted(cell)) {
        return cell.getDateCellValue();
      } else {
        return cell.getNumericCellValue();
      }
    case Cell.CELL_TYPE_BOOLEAN:
      return cell.getBooleanCellValue();
    case Cell.CELL_TYPE_FORMULA:
      return cell.getCellFormula();
    default:
      return null;
    }
  }
}

実行結果

1.0 , 1.2 , sample string , true , 

# あと、C:\temp配下に「sample.xlsx」ができてるはず。

■ 注意

 * 実行時に以下の以下の例外が発生する場合があった

エラー内容

Exception in thread "main" java.lang.NoSuchMethodError: org.apache.xmlbeans.XmlOptions.setLoadEntityBytesLimit(I)Lorg/apache/xmlbeans/XmlOptions;
	at org.apache.poi.POIXMLTypeLoader.<clinit>(POIXMLTypeLoader.java:50)
	at org.openxmlformats.schemas.spreadsheetml.x2006.main.CTWorkbook$Factory.newInstance(Unknown Source)
	at org.apache.poi.xssf.usermodel.XSSFWorkbook.onWorkbookCreate(XSSFWorkbook.java:425)
	at org.apache.poi.xssf.usermodel.XSSFWorkbook.<init>(XSSFWorkbook.java:227)
	at org.apache.poi.xssf.usermodel.XSSFWorkbook.<init>(XSSFWorkbook.java:218)
	at com.sample.excels.Main.main(Main.java:25)

原因と解決策

 * xmlbeans-2.6.0.jarだけでなく xmlbeans-2.5.0.jarもインポートされ、
   古いxmlbeans-2.5.0.jarが有効になっていた
 => xmlbeans-2.6.0.jarを有効にしたらOK!


関連記事

JavaJava で Word の読み書きを行う ~ Apache POI / 入門編 ~

http://blogs.yahoo.co.jp/dk521123/36584129.html

JavaJava で Word の読み書きを行う ~ docx4j / 入門編 ~

http://blogs.yahoo.co.jp/dk521123/36582301.html