POI vs JExcelAPI
Apache POI > http://poi.apache.org/
JExcelAPI > http://jexcelapi.sourceforge.net/
今更紹介するまでも無いですが、JavaでExcelファイルを読み書きするためのAPI。というか、 JExcelAPI は知らなかったのです。なぜ知ったかというと、 POI では手に負えないファイルでも JExcelAPI なら読めるかもしれない、という情報を得たからです。
今のところ書き込み用途は無いので、読み込みのサンプルを書いてみました。
import java.io.*; import java.io.File; import java.util.*; import jxl.*; import jxl.read.biff.*; import org.apache.poi.hssf.usermodel.*; public class SpreadSheetTest { public static void main(String[] args) { File file = new File("test.xls"); testForJExcelAPI(file); testForPOI(file); } private static void printCellValue(int columnIndex, int rowIndex, Object value) { System.out.println("Cell(" + columnIndex + "," + rowIndex + ")=" + value); } private static void testForJExcelAPI(File file) { System.out.println("--- test for JExcelAPI ---"); try { Workbook book = Workbook.getWorkbook(file); try { Sheet[] sheets = book.getSheets(); for (int i = 0; i < sheets.length; i++) { Sheet sheet = sheets[i]; System.out.println("sheet=[" + sheet.getName() + "]"); int rowCount = sheet.getRows(); for (int rowIndex = 0; rowIndex < rowCount; rowIndex++) { Cell[] row = sheet.getRow(rowIndex); for (int columnIndex = 0; columnIndex < row.length; columnIndex++) { printCellValue(columnIndex, rowIndex, row[columnIndex].getContents()); } } } } finally { book.close(); } } catch (BiffException ex) { ex.printStackTrace(); } catch (IOException ex) { ex.printStackTrace(); } } private static void testForPOI(File file) { System.out.println("--- test for POI(HSSF) ---"); try { InputStream is = new FileInputStream(file); try { HSSFWorkbook book = new HSSFWorkbook(is); for (int i = 0; i < book.getNumberOfSheets(); i++) { HSSFSheet sheet = book.getSheetAt(i); System.out.println("sheet=[" + book.getSheetName(i) + "]"); for (Iterator rowIt = sheet.rowIterator(); rowIt.hasNext();) { HSSFRow row = (HSSFRow)rowIt.next(); for (Iterator it = row.cellIterator(); it.hasNext();) { HSSFCell cell = (HSSFCell)it.next(); printCellValue(cell.getCellNum(), row.getRowNum(), cell); } } } } finally { is.close(); } } catch (IOException ex) { ex.printStackTrace(); } } }
実行するための準備として、デフォルトのファイルに Sheet1.C2="aa", Sheet3.A3="123" だけ入力した"test.xls"を作成します。結果は以下のようになりました。
--- test for JExcelAPI --- sheet=[Sheet1] Cell(0,1)= Cell(1,1)= Cell(2,1)=aa sheet=[Sheet2] sheet=[Sheet3] Cell(0,2)=123 --- test for POI(HSSF) --- sheet=[Sheet1] Cell(2,1)=aa sheet=[Sheet2] sheet=[Sheet3] Cell(0,2)=123.0