argius note

プログラミング関連

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