※ ChatGPTを利用し、要約された質問です(原文:POIでExcelに時刻(h:mm)の値を出力したい)
POIでExcelに時刻の値を出力したい
このQ&Aのポイント
現在、JAVAでEXCELで運用している社内勤務表をWebから入力できるシステムを開発しています。
現在の問題は、POIライブラリを使用して勤務開始時間や勤務終了時間の値をExcelのセルに出力する際に、h:mm形式の値が出力できないことです。
既に試した方法(文字列やシリアル値としての出力など)では期待通りの結果が得られず、値も表示もh:mm形式で出力する方法がわかりません。ご教授頂けないでしょうか。
POIでExcelに時刻(h:mm)の値を出力したい
お世話になっております。
現在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());
}
}
}
}
-----------------------------------------------------------------------
お礼
askaaskaさん 回答ありがとうございます。 10:30という値はPOIでは出力できないんですね。 この質問の前に半日調べてわからなかったので、もしかして無理かなとは思っていたんですが……残念です。 >・createCellでshortへのキャストは不要よ。 >・テスト1で、文字列は必ずHSSFRichTextStringに変換すること。 了解しました。 入門サイトのプログラムを真似たら警告が出るようなので直します。 裏技があるかもしれないのでもう少し質問をオープンにしておきます。(基本無理ということは納得したんですが一応) POIの中身をいじるとか(無理かな?)