■ Java で Excel の読み書きを行うには...
* Apache POI を使用する
補足
* 「JExcel API」「jXLS」「XLSBeans」ってのもあるらしいが Java の主流は、Apache POIらしいので。
■ 設定
その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.gradleapply 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!
参考文献
http://takezoe.hatenablog.com/entry/20140106/p1http://web.plus-idea.net/2016/01/how_to_read_excel_java_apache_poi/
http://www.javadrive.jp/poi/
http://qiita.com/tool-taro/items/4b3c802bb114a9110ecb
http://unokun.hatenablog.jp/entry/2016/03/22/035257