みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

Excelに時刻を入れたい

はじめまして。
JAVA初心者です。

DBから取得したデータ「09:00」をExcelに入れようとしているんですが、表示された結果が正しくないのです。
DBからTimeタイプとして入れたら、セル値がシリアルになってしまう。
他、Stringとしたら、セル値にアポストロフィが付いてしまう。
今のところ解決方法はありません。

どうすれば、正しい結果(9:00)が表示されるのでしょうか。
教えていただけませんか?


ついでに、既存エクセルの書式は「時刻」です。
ソースは以下の通りです。(Timeタイプとする)

-------------------jsp ソース------------------

FileInputStream inputStream = null;
FileOutputStream outputStream = null;

File excel = new File("C:\\123123.xls");
inputStream = new FileInputStream(excel);
HSSFWorkbook workBook = new HSSFWorkbook(inputStream);
HSSFSheet newSheet = workBook.getSheetAt(0);
HSSFRow newRow = newSheet.getRow(16);
HSSFCell newCell1 = newRow.getCell((short) 6);

java.sql.ResultSet rs = null;
rs = DBtest.DBGetdate();
Time modifyTimeTemp = null;
HSSFRow newRowtemp = newSheet.getRow(18);
HSSFCell newCell1temp = newRow.getCell((short) 6);

while(rs.next()){
modifyTimeTemp = rs.getTime("Time");
}
//newCell1temp:正しく入力されたデータ
newCell1.setCellStyle(newCell1temp.getCellStyle());
newCell1.setCellValue(modifyTimeTemp);
try{
response.setContentType("application/msexcel");
response.setHeader("Content-Disposition",
"attachment; filename=jsp.xls");
OutputStream outs = response.getOutputStream();
workBook.write(outs);
outs.close();
}catch(Exception e){
e.printStackTrace();
}

投稿日時 - 2008-03-18 13:04:33

QNo.3873287

すぐに回答ほしいです

質問者が選んだベストアンサー

No.4です。

>>とありますが,ご質問は,「シリアル値になってしまう」ことを避けたいが,どうすればいいかということでしょうか?
>⇒はい、「シリアル値になってしまう」ことを避けたいです。

No.4の回答にも書きましたが,時刻を(1日を1とする)シリアル値で管理するのはExcelの仕様です。

< http://office.microsoft.com/ja-jp/excel/HP052006741041.aspx >

試しにExcelを開き,手で「09:00」とセルに入力した後,そのセルの表示形式を"標準"に変更してみてください(ちなみに変更前の表示形式は"hh:mm"になっているはず)。おそらく「0.375」かそれに近い値になるはずです。

シリアル値以外で格納するとすると,文字列しかありません。しかし,RuuZZUさんは,

> 他、Stringとしたら、セル値にアポストロフィが付いてしまう。

と書かれているので,文字列での格納もしたくないように思われます。

そうすると,結論としては,「シリアル値でもなく文字列でもなく格納することは不可能です」という回答にしかならないのですが,正直RuuZZUさんが「正しい」と考えている格納状態はどういうものなのでしょうか?

繰り返しになりますが,Excelには「時刻」をそのまま表す格納形式はありません。時刻として格納したい(加減乗除などを行いたい)場合はシリアル値,単に表示できればいい場合は文字列,のどちらかしかありません。いずれにせよこれはまずExcelでどうしたいかの問題であり,その答が得られない限りJavaでどうするということは答えられません。

参考URL:http://office.microsoft.com/ja-jp/excel/HP052006741041.aspx

投稿日時 - 2008-03-21 16:13:29

お礼

atonさん

ご回答、ありがとうございました。

Excelの書式の変更を行い、結果が出てきました。
問題は、すでに解決しました。

ありがとうございました。

投稿日時 - 2008-03-21 16:42:24

ANo.5

このQ&Aは役に立ちましたか?

2人が「このQ&Aが役に立った」と投票しています

回答(5)

ANo.4

補足要求+回答です。

> DBからTimeタイプとして入れたら、セル値がシリアルになってしまう。

とありますが,ご質問は,「シリアル値になってしまう」ことを避けたいが,どうすればいいかということでしょうか?

だとしたら,時刻をシリアル値として扱うのはExcelの仕様であり,Javaでどうこうできる問題ではありません。

それとも,シリアル値として格納されるのはOKだが,それがExcelにおいて(例えば)9:00を表す正しいシリアル値として格納したい時,どうすればいいかということでしょうか?

それならば,java.sql.Time型は,1970年1月1日0時ちょうど(UTC)をエポックとするjava.util.Date型なので,これを1900年1月1日0時ちょうど(UTC)をエポックとするExcelの時刻表現に合わせる必要があります。

具体的には,

1) modifyTimeTempをミリ秒(long)に変換し,
2) そこから (1970年1月1日0時ちょうど(UTC) - 1900年1月1日0時ちょうど(UTC)) のミリ秒(私の計算では2208988800000L)を引き,
3) それを java.util.Date 型に変換したものを,
4) newCell1.setCellValue(java.util.Date)する

という手順になると思います。

なお,modifyTimeTempに入っている時間がUTC以外なら,別途時差調整が必要になると思われます。


またMac版のExcelでは,1904年1月1日0時ちょうど(UTC)がエポックの場合もあるようなので< http://support.microsoft.com/kb/214330/ja >,Macではそちらの数値を使って調整する必要があるかもしれません。

参考URL:http://support.microsoft.com/kb/214330/ja

投稿日時 - 2008-03-20 20:47:21

補足

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

日本語の問題で、ご迷惑をかけました、すみません。

>とありますが,ご質問は,「シリアル値になってしまう」ことを避けたいが,どうすればいいかということでしょうか?
⇒はい、「シリアル値になってしまう」ことを避けたいです。

>それとも,シリアル値として格納されるのはOKだが,それがExcelにおいて(例えば)9:00を表す正しいシリアル値として格納したい時,どうすればいいかということでしょうか?
⇒9:00を表す正しいシリアル値として格納したくありませんので、直接に言えば、JAVAでそうすればExcelに「9:00」として格納し、「9:00」が正しく表示されるってこと。

よろしくお願いします。

投稿日時 - 2008-03-21 09:07:09

ANo.3

これでは、ダメでしょうか?
1.DBからの値を文字列で取得
2.エクセルのセルのタイプを設定
3.エクセルの値の設定

//DBからの値を設定
HSSFRichTextString hoge = new HSSFRichTextString("24:00");

//セルのタイプを文字列にする
newCell1.setCellType(HSSFCell.CELL_TYPE_STRING);

//値設定
newCell1.setCellValue(hoge);

投稿日時 - 2008-03-19 14:03:51

補足

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

値設定のところにエラーが出てきました。下記の通り:

「The method setCellValue(double) in the type HSSFCell is not applicable for the arguments (HSSFRichTextString)」

まだ初心者なので、エラーの意味が分からなくって、恐れ入れますが、
何の意味でしょうか、それと、エラーを解決する方法がありますか。

よろしくお願いします。

投稿日時 - 2008-03-19 14:46:52

ANo.2

#1のURLでは時刻表示スタイルの設定を紹介しています。
フォーマットの部分を"h:mm"にすれば "9:00"と表示されるでしょう。
"h:mm"はビルドインフォーマットなのでサンプルのソースで問題ないと思います。
(未検証なので追試して下さい)

投稿日時 - 2008-03-19 11:00:50

補足

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

#1のURLの方法は、すでに検証しました。フォーマットの部分を"h:mm"に変換したら、見た目は確かに「9:00」に表示されましたが、
実のセル値はシリアル(955065:00:00)になってしまいました。

たびたび申し訳ないが、何か別の方法ではあるのでしょうか。
よろしくお願いします。

投稿日時 - 2008-03-19 11:30:17

ANo.1

HSSFで検索すれば一発で見つかりますが、
http://poi.terra-intl.com/hssf/quick-guide.html#CreateDateCells

投稿日時 - 2008-03-18 17:34:32

補足

ご回答、ありがとうございます。

が、セルに「09:00」だけを入れたいのです。他の日付は要りません。
何か役になるものがあるのですか?

投稿日時 - 2008-03-19 09:12:30

あなたにオススメの質問