自社出勤簿はExcel管理されており、毎月月末に入力するのが面倒なので
Webから退社時刻だけ入力したら自社出勤簿に保存されるようにPOIを使ってみることに。
利用したPOIは「poi-bin-3.10.1-20140818」です。
自社出勤簿はいまだにExcel2003なのでHSSFXXXのオブジェクトを利用します。
両方を扱えるインターフェースもあるようです。
HSSFXXX:Excel2003のファイルフォーマット(.xls)を扱うオブジェクト XSSFXXX:Excel2007のファイルフォーマット(.xlsx)を扱うオブジェクト
// Excelファイル取得 POIFSFileSystem filein = new POIFSFileSystem(new FileInputStream(String 入力ファイルのフルパス)); // ワークブック取得 HSSFWorkbook wb = new HSSFWorkbook(filein); // シート取得 HSSFSheet sheet = wb.getSheet(String シート名); // 行数取得 HSSFRow row = sheet.getRow(int 行数); // 列取得(出社時刻用) HSSFCell cellFirst = row.getCell(int 列数); // 出社時刻設定 cellFirst.setCellValue(double 出社時刻); // 列取得(退社時刻用) HSSFCell cellEnd = row.getCell(int 列数); // 退社時刻設定 cellEnd.setCellValue(double 退社時刻); // ワークブック強制再計算 wb.setForceFormulaRecalculation(true); // Excelファイル保存 wb.write(new FileOutputStream(String 出力ファイルのフルパス));
出社時刻、退社時刻をdouble型にしている理由ですが、
自社出勤簿の出社時刻、退社時刻はExcelのセルを確認すると
ユーザ定義で「h:mm」の時刻形式で、当日勤務時間や残業時間は自動計算されるようになっています。
Excelを使って入力した場合、下記の通りの表示となり、
画面表示:9:00 18:00
セル内値:9:00:00 18:00:00
出勤簿計算結果:正常
それと同じ画面表示、セル内値にしたいので、
Excel側にはシリアル値(1900年1月1日を1として算出した数値)を渡す必要があり、
double型をsetCellValueに渡しています。
// 時 double hh = Double.parseDouble("0900".substring(0,2))*(1.0/24.0); // 分 double mm = Double.parseDouble("0900".substring(2,4))*(1.0/24.0/60.0);
setCellValueは受け取れる型が下記の通り複数あるので、StringとDateで試してみました。
java.lang.String
java.util.Date
java.util.Calendar
double
boolan
RichTextString
【お試し:String】
cellFirst.setCellValue("09:00"); cellEnd.setCellValue("18:00");
画面表示:09:00 18:00
セル内値:09:00 18:00
出勤簿計算結果:正常
⇒画面表示とセル内値がちょっと違う。
【お試し:Date】
SimpleDateFormat hhmmFormat = new SimpleDateFormat("h:mm"); cellFirst.setCellValue(hhmmFormat.parse("09:00")); cellEnd.setCellValue(hhmmFormat.parse("18:00"));
画面表示:613655:00 613674:00
セル内値:1970/1/1 9:00:00 1970/1/1 18:00:00
出勤簿計算結果:正常
⇒何か色々違う