
お世話になっております。
現在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を探す
今、見られている記事はコレ!
-
隣の枝がはみ出してきたら切ってもいい?最もやってはいけないことは?
「隣の木が越境してきて困るが、勝手に切ってはいけないと聞くし…」そう思っている方も多いだろう。実は、2023年4月1日に民法が改正され、この「越境枝」のルールが大きく変わった。 教えて!gooでも「境界から出て...
-
弁護士が解説!あなたの声を行政に届ける「パブリックコメント」制度のすべて
社会に対する意見や不満、疑問。それを発信する場所は、SNSやブログ、そしてニュースサイトのコメント欄など多岐にわたる。教えて!gooでも「ヤフコメ民について」というタイトルのトピックがあり、この投稿の通り、...
-
弁護士が語る「合法と違法を分けるオンラインカジノのシンプルな線引き」
「お金を賭けたら違法です」ーーこう答えたのは富士見坂法律事務所の井上義之弁護士。オンラインカジノが違法となるかどうかの基準は、このように非常にシンプルである。しかし2025年にはいって、違法賭博事件が相次...
-
釣りと密漁の違いは?知らなかったでは済まされない?事前にできることは?
知らなかったでは済まされないのが法律の世界であるが、全てを知ってから何かをするには少々手間がかかるし、最悪始めることすらできずに終わってしまうこともあり得る。教えてgooでも「釣りと密漁の境目はどこです...
-
カスハラとクレームの違いは?カスハラの法的責任は?企業がとるべき対応は?
東京都が、客からの迷惑行為などを称した「カスタマーハラスメント」、いわゆる「カスハラ」の防止を目的とした条例を、全国で初めて成立させた。条例に罰則はなく、2025年4月1日から施行される。 この動きは自治体...
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
System.err. printlnとSystem.o...
-
VBSエラー"オブジェクト型の変...
-
JavaScriptの変数をjavaのメソ...
-
javaです
-
Java 九九の表について
-
[至急]Project Euler:#17Number...
-
POIでExcelに時刻(h:mm)の値を...
-
ダブルクォーテーション(””)...
-
JSPでのself.print()作成について
-
ServletからJSP
-
Log4jで機能毎に別ファイルへ出...
-
InputStream.read()でタイムア...
-
変数を動的に作るには?
-
javaのコンパイルエラーについ...
-
パソコンキーボードで時分秒を...
-
JSPやサーブレットでSystem.out...
-
「配列定数は、イニシャライザ...
-
jspでの二次元配列
-
JButton-背景の透明化
-
VBで作った乱数を一度も重複さ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
System.err. printlnとSystem.o...
-
flush()とclose()について
-
Log4jで機能毎に別ファイルへ出...
-
System.out.printlnの出力先
-
Javaで改行などが出来ないのです。
-
system.out.printが出力されない
-
一定のスペースを空けて端を揃...
-
Tomcatが無応答となる現象が起...
-
1~100までの数字を表示し、か...
-
ジャバスクリプトについて。
-
switch分が機能しません。
-
Log4Jではログを改行できない?
-
System.out.printlnの意味がよ...
-
OpenSSL関数エラーについて
-
テキストエリアで改行する
-
プールとスプールの違いがわか...
-
VBAでEUC-JPのHTMLソースを取得...
-
Javaで任意のパスへ任意のファ...
-
JAVAのServletで、画像表示につ...
-
Eclipseのコンソールを常に表示...
おすすめ情報