お世話になっております。
現在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で質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
1~100までの数字を表示し、か...
-
Eclipseのコンソールを常に表示...
-
JavaScriptとVBScriptに関して
-
JSPで、PG上のstrutsオブジェク...
-
system.out.printが出力されない
-
DOMでパースしているXML全体の...
-
flush()とclose()について
-
System.out.printlnで出力バッファ
-
プールとスプールの違いがわか...
-
System.err. printlnとSystem.o...
-
サーブレットのログ出力先
-
バイトスワップ
-
java キーボード入力された値の...
-
BOOL値を逆にしたい
-
エクセルVBAで「〜」が表現でき...
-
Java配列でNullPointerExceptio...
-
パソコンキーボードで時分秒を...
-
IF関数でEmpty値を設定する方法。
-
コマンドライン引数の例外処理...
-
C++、クラスメンバの構造体配列...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
System.err. printlnとSystem.o...
-
flush()とclose()について
-
Log4jで機能毎に別ファイルへ出...
-
System.out.printlnの出力先
-
Javaで改行などが出来ないのです。
-
1~100までの数字を表示し、か...
-
system.out.printが出力されない
-
Eclipseのコンソールを常に表示...
-
1~100までの数字を表示したい
-
StringBufferで改ページ処理を...
-
JavaScriptの変数をjavaのメソ...
-
Log4Jではログを改行できない?
-
javaにおけるCSV出力時の文字コ...
-
テキストエリアで改行する
-
switch分が機能しません。
-
Tomcatが無応答となる現象が起...
-
一定のスペースを空けて端を揃...
-
JAVAのServletで、画像表示につ...
-
バイトスワップ
-
InputStreamはreadが1回しかで...
おすすめ情報