dポイントプレゼントキャンペーン実施中!

お世話になっております。

現在JAVA勉強という名目でEXCELで運用している社内勤務表をWebから入力できるシステムを開発しています。(好みによりExcel直接編集とWebによる編集どちらかを選べる)

現状の問題としてはPOIライブラリにより勤務開始時間、勤務終了時間の値をExcelのセルに出力するところで h:mm (例えば[10:30])という値が出力できないことです。(既存の書式に合わせた値の出力ができない)
文字列(先頭に'が付く)やシリアル値として出力することは可能ですが、ただ単純に[10:30]と出力することができません。

【実現したいExcelの出力結果】(JavaのString文字列"10:30"を元に出力)
値:[10:30]
表示:[10:30]

※Excelのセルは表示と値が異なる場合があるが両方共 h:mm 形式で出力したい。

【試行錯誤した出力結果】
(1)文字列として出力する
値:['10:30]
表示:[10:30]

※表示は期待通りだが値の先頭に'がついてしまいうまくいかない。
※出力した値は他のセルの計算式で参照するので'がついてるのは問題あり。

(2)Date型で出力し書式を h:mm 形式にする
値:[613666:30:00]
表示:[10:30]

※表示は期待通りだが値がシリアル値になってしまいうまくいかない。
※ただし m/d/yy h:mm 形式を出力するとシリアル値にならない。(何故だろう)
※シリアル値ではExcel直接編集の際に人が編集しにくい値なので問題。


実際Excelでは値も表示も[10:30]というセルはキーボード入力で簡単に作成できるのでPOIで出力できないとはとても思えません。
どうすれば[10:30]という値が出力できるか教えていただけないでしょうか。
よろしくお願いいたします。

-----------------------------------------------------------------------
【使用しているPOI】
バージョン:3.2
ダウンロードしたファイル:poi-bin-3.2-FINAL-20081019.zip
-----------------------------------------------------------------------
【試行錯誤したプログラム】
public class CellOutput{
public static void main(String[] args){

HSSFWorkbook workbook = new HSSFWorkbook();
HSSFSheet sheet = workbook.createSheet();
HSSFRow row = sheet.createRow(1);
HSSFCellStyle style = workbook.createCellStyle();
style.setDataFormat(HSSFDataFormat.getBuiltinFormat("h:mm"));

try {
// テスト1(文字列で出力)
HSSFCell cell1 = row.createCell((short)0);
cell1.setCellValue("10:30");

// テスト2(Dateで出力 書式設定無)
HSSFCell cell2 = row.createCell((short)1);
SimpleDateFormat hhmmFormat = new SimpleDateFormat("h:mm");
Date time = hhmmFormat.parse("10:30");
cell2.setCellValue(time);

// テスト3(Dateで出力 書式設定有)
HSSFCell cell3 = row.createCell((short)2);
cell3.setCellValue(time);
cell3.setCellStyle(style);

// テスト4(Dateで出力 m/d/yy h:mm形式)
HSSFCell cell4 = row.createCell((short)3);
HSSFCellStyle style2 = workbook.createCellStyle();
style2.setDataFormat(HSSFDataFormat.getBuiltinFormat("m/d/yy h:mm"));
cell4.setCellValue(time);
cell4.setCellStyle(style2);

}
catch(Exception e){
}
FileOutputStream out = null;
try{
out = new FileOutputStream("sample.xls");
workbook.write(out);
}catch(IOException e){
System.out.println(e.toString());
}finally{
try {
out.close();
}catch(IOException e){
System.out.println(e.toString());
}
}
}
}
-----------------------------------------------------------------------

※添付画像が削除されました。

A 回答 (3件)

できないわ。


残念ながら。

それが証拠に、
最初に10:30と入力したExcelのセルから
getCellStyleした結果をsetCellStyleしても
反映されないわ。
テスト3の方法を取るのが一番と思うわ。


それと、POI3.2は
・createCellでshortへのキャストは不要よ。
・テスト1で、文字列は必ずHSSFRichTextStringに変換すること。
    • good
    • 0
この回答へのお礼

askaaskaさん
回答ありがとうございます。

10:30という値はPOIでは出力できないんですね。
この質問の前に半日調べてわからなかったので、もしかして無理かなとは思っていたんですが……残念です。

>・createCellでshortへのキャストは不要よ。
>・テスト1で、文字列は必ずHSSFRichTextStringに変換すること。
了解しました。
入門サイトのプログラムを真似たら警告が出るようなので直します。

裏技があるかもしれないのでもう少し質問をオープンにしておきます。(基本無理ということは納得したんですが一応)

POIの中身をいじるとか(無理かな?)

お礼日時:2009/05/11 19:45

excelの時刻は、少数点以下のシリアル値を設定します。


excelの書式は、時刻とします。
excelのシリアル値は1900年1月1日が1なので
日付なしの時刻は、少数以下の数値です。
(例)
9:15
シリアル値=9*(1/24) + 15*(1/24/60)

これをpoiのsetCellValueで設定すると時刻のみとなります。
XXX.setCellValue(シリアル値);

(PGの例)
SetCellTime(10,2,"12:53");

private static void SetCellTime(HSSFSheet sheet,int r,int c,String data){
HSSFRow row = sheet.getRow(r-1);
HSSFCell cell = row.getCell(c-1);
double s;
double hh;
double mm;
//シリアル値への変換
hh = Double.parseDouble(data.substring(0,2))*(1.0/24.0);
mm = Double.parseDouble(data.substring(3,5))*(1.0/24.0/60.0);
s = hh + mm;
cell.setCellValue(s);
return;
}
    • good
    • 3

これはただの掲示板的レス



> POIの中身をいじる
それでできるなら既に誰かがやっている気もするけど
余裕があったら見てみようかしら。
Excel2007対応なら何とかなりそうな気もするんだけどね。
xlsxだし。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!