![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
お世話になっております。
現在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());
}
}
}
}
-----------------------------------------------------------------------
No.1ベストアンサー
- 回答日時:
できないわ。
残念ながら。
それが証拠に、
最初に10:30と入力したExcelのセルから
getCellStyleした結果をsetCellStyleしても
反映されないわ。
テスト3の方法を取るのが一番と思うわ。
それと、POI3.2は
・createCellでshortへのキャストは不要よ。
・テスト1で、文字列は必ずHSSFRichTextStringに変換すること。
askaaskaさん
回答ありがとうございます。
10:30という値はPOIでは出力できないんですね。
この質問の前に半日調べてわからなかったので、もしかして無理かなとは思っていたんですが……残念です。
>・createCellでshortへのキャストは不要よ。
>・テスト1で、文字列は必ずHSSFRichTextStringに変換すること。
了解しました。
入門サイトのプログラムを真似たら警告が出るようなので直します。
裏技があるかもしれないのでもう少し質問をオープンにしておきます。(基本無理ということは納得したんですが一応)
POIの中身をいじるとか(無理かな?)
No.3
- 回答日時:
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;
}
No.2
- 回答日時:
これはただの掲示板的レス
> POIの中身をいじる
それでできるなら既に誰かがやっている気もするけど
余裕があったら見てみようかしら。
Excel2007対応なら何とかなりそうな気もするんだけどね。
xlsxだし。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) エクセルの数式で教えてください。 1 2023/07/31 15:49
- Excel(エクセル) Excel 、この式はどのように解釈すればいいのでしょうか 4 2023/02/03 08:53
- システム CSVファイルのマッピング処理の省力化 1 2022/11/24 00:01
- Excel(エクセル) Excel2019、2021の日付、曜日の表示について 2 2022/11/29 15:01
- Excel(エクセル) Excelにの以下の設定方法について教えてください! C列にデータ入力の設定をしています。(出、入を 3 2022/06/22 01:33
- Excel(エクセル) Excelヘルプの原文を表示する最速の方法(手順)には? 1 2023/08/11 11:30
- その他(プログラミング・Web制作) プログラミング pythonの問題について 2 2022/04/19 00:41
- Excel(エクセル) VLOOKUP が機能しない、その原因は何 ? 8 2022/10/19 12:06
- C言語・C++・C# C#テキストボックスの文字を配列にいれてその後表示する 4 2022/07/17 04:47
- Excel(エクセル) エクセル VBA実行中のApplication.ScreenUpdatingについて 3 2023/07/13 21:06
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
System.err. printlnとSystem.o...
-
flush()とclose()について
-
system.out.printが出力されない
-
Javaで改行などが出来ないのです。
-
System.out.printlnの出力先
-
Log4jで機能毎に別ファイルへ出...
-
JavaScriptの変数をjavaのメソ...
-
System.out.printlnの意味がよ...
-
日付と曜日が合わない
-
Log4Jではログを改行できない?
-
JAVAのServletで、画像表示につ...
-
StringBufferで改ページ処理を...
-
Eclipseのコンソールを常に表示...
-
InputStreamはreadが1回しかで...
-
プールとスプールの違いがわか...
-
1~100までの数字を表示し、か...
-
一定のスペースを空けて端を揃...
-
Tomcatが無応答となる現象が起...
-
javaにおけるCSV出力時の文字コ...
-
1~100までの数字を表示したい
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
System.err. printlnとSystem.o...
-
flush()とclose()について
-
Javaで改行などが出来ないのです。
-
1~100までの数字を表示し、か...
-
Log4jで機能毎に別ファイルへ出...
-
1~100までの数字を表示したい
-
system.out.printが出力されない
-
一定のスペースを空けて端を揃...
-
System.out.printlnの出力先
-
StringBufferで改ページ処理を...
-
JAVAのServletで、画像表示につ...
-
switch分が機能しません。
-
Eclipseのコンソールを常に表示...
-
tomcatのstdout.logを停止したい。
-
ダブルクォーテーション(””)...
-
Java 九九の表について
-
PrintWriterとBufferedWriterの...
-
Tomcatが無応答となる現象が起...
-
javaのwhile文で九九の表
-
System.out.printlnの意味がよ...
おすすめ情報