Jakarta POI

多数の同一形式のExcelからデータを抜き出して別のExcelへ、という作業があったので、Jakarta POIを使ってみた。結構簡単に使えて、単純作業から解放されるので、かなり便利に感じた。Javaだとコンパイルの手間があるので、PerlRubyでは同じことはできるのだろうか。

以下がソース。とりあえず動作すれば良かったので、式やセルの書式の扱いなどは調べ切れていない。

import java.util.Iterator;
import java.util.Date;
import java.io.FileInputStream;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;


/**
 * Excelの必要な部分を表示します。
 */
public class PickExcel {
    
    public static void main(String[] args) throws Exception
    {
        for (int i = 0; i < args.length; i++)
        {
            HSSFWorkbook workBook = new HSSFWorkbook(new FileInputStream(args[i]));
            System.out.println("file: " + args[i]);
            for (int s = 0; s < workBook.getNumberOfSheets(); s++)
            {
                System.out.println("SheetName: " + workBook.getSheetName(s));
                HSSFSheet sheet = workBook.getSheetAt(s);
                // D4 セル
                printCell('D', 4, sheet);
                // O9 セル
                printCell('O', 9, sheet);
                // V11 セル
                printCell('V', 11, sheet);
                
                System.out.print("\n");
            }
        }
    }
    
    private static void printCell(char cellpos, int rowpos, HSSFSheet sheet)
    {
        HSSFRow row = sheet.getRow(rowpos-1);
        HSSFCell cell = row.getCell( (short)(cellpos - 'A'));
        switch (cell.getCellType())
        {
        case HSSFCell.CELL_TYPE_NUMERIC:
        case HSSFCell.CELL_TYPE_FORMULA:
            double numval = cell.getNumericCellValue();
            System.out.print(numval);
            break;
        case HSSFCell.CELL_TYPE_STRING:
        default:
            String strval = cell.getStringCellValue();
            System.out.print(strval);
            break;
        }
        System.out.print("\t");
    }
}