Excelに時刻を入れる方法と表示結果について

このQ&Aのポイント
  • JAVA初心者ですが、ExcelにDBから取得した時刻データを正しく表示する方法を教えてください。
  • Timeタイプとして入れるとセル値がシリアルになり、Stringとして入れるとアポストロフィが付いてしまいます。
  • また、エクセルの書式は「時刻」です。以下のソースコードを使用しています。
回答を見る
  • ベストアンサー

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(); }

  • Java
  • 回答数5
  • ありがとう数3

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

  • ベストアンサー
  • aton
  • ベストアンサー率47% (160/334)
回答No.5

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
RuuZZU
質問者

お礼

atonさん ご回答、ありがとうございました。 Excelの書式の変更を行い、結果が出てきました。 問題は、すでに解決しました。 ありがとうございました。

その他の回答 (4)

  • aton
  • ベストアンサー率47% (160/334)
回答No.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
RuuZZU
質問者

補足

atonさん ご回答、ありがとうございます。 日本語の問題で、ご迷惑をかけました、すみません。 >とありますが,ご質問は,「シリアル値になってしまう」ことを避けたいが,どうすればいいかということでしょうか? ⇒はい、「シリアル値になってしまう」ことを避けたいです。 >それとも,シリアル値として格納されるのはOKだが,それがExcelにおいて(例えば)9:00を表す正しいシリアル値として格納したい時,どうすればいいかということでしょうか? ⇒9:00を表す正しいシリアル値として格納したくありませんので、直接に言えば、JAVAでそうすればExcelに「9:00」として格納し、「9:00」が正しく表示されるってこと。 よろしくお願いします。

回答No.3

これでは、ダメでしょうか? 1.DBからの値を文字列で取得 2.エクセルのセルのタイプを設定 3.エクセルの値の設定 //DBからの値を設定 HSSFRichTextString hoge = new HSSFRichTextString("24:00"); //セルのタイプを文字列にする newCell1.setCellType(HSSFCell.CELL_TYPE_STRING); //値設定 newCell1.setCellValue(hoge);

RuuZZU
質問者

補足

namida6000さん ご回答ありがとうございます。 値設定のところにエラーが出てきました。下記の通り: 「The method setCellValue(double) in the type HSSFCell is not applicable for the arguments (HSSFRichTextString)」 まだ初心者なので、エラーの意味が分からなくって、恐れ入れますが、 何の意味でしょうか、それと、エラーを解決する方法がありますか。 よろしくお願いします。

  • bgbg
  • ベストアンサー率53% (94/175)
回答No.2

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

RuuZZU
質問者

補足

bgbgさん ご回答、ありがとうございます。 #1のURLの方法は、すでに検証しました。フォーマットの部分を"h:mm"に変換したら、見た目は確かに「9:00」に表示されましたが、 実のセル値はシリアル(955065:00:00)になってしまいました。 たびたび申し訳ないが、何か別の方法ではあるのでしょうか。 よろしくお願いします。

  • bgbg
  • ベストアンサー率53% (94/175)
回答No.1

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

RuuZZU
質問者

補足

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

関連するQ&A

  • POIの出力場所について

    お世話になります。 POI 出力などで検索を行いましたが上手くHITしませんでしたのでご質問させて頂きます。 例えば HSSFWorkbook workbook = null; FileOutputStream out = null; out = new FileOutputStream("質問.xls"); workbook.write(out); など記述し出力すると思うのですが「質問.xls」を C:\testに指定して出力したいなど指定した階層に出力するということは出来るでしょうか。

    • ベストアンサー
    • Java
  • java Excel書き込み

    前回質問をさせて頂き、 教えて頂いたプログラムを参考にしましたところうまくいきました。 ところがここでまた1つ問題点が発生してきてしまいました。 業務日報には4つの項目があり、そこを入力すると1行目のDセルまで値が入ります。 次にシステムから上書きをすると正常に2行目に書き込みはされるのですが、1行目のBCDセルの情報が消えてしまい、Aセルのみ残った状態になっています。 これを繰り返すと最新で書き込みした行以外の物はすべてAセルしか情報が残らなくなってしまいます。 この現象を回避するにはどうすればよいのでしょうか? アドバイス宜しくお願いいたします。 public void execute() { FileInputStream in = null; HSSFWorkbook workbook = null; HSSFSheet sheet = null; try { // test.xlsを読み込んでみる // 読み込めた場合は既存のファイルを利用する in = new FileInputStream("test.xls"); workbook = new HSSFWorkbook ( in ); sheet = workbook.getSheetAt ( 0 ); } catch ( IOException e ) { // test.xlsが読み込めない場合はここで新規作成 workbook = new HSSFWorkbook(); sheet = workbook.createSheet("test"); // 見出しを作る Row row = sheet.createRow(0); Cell cell1 = row.createCell(0); Cell cell2 = row.createCell(1); Cell cell3 = row.createCell(2); Cell cell4 = row.createCell(3); cell1.setCellValue("会社"); cell2.setCellValue("報告者"); cell3.setCellValue("場所"); cell4.setCellValue("時間"); } // 行を1行目から走査する // 1行目は見出しのため、チェック対象外 Row row = null; Cell cell1, cell2, cell3, cell4 = null; int i = 1; for ( ; ; i ++ ) { // i番目を取得する row = sheet.getRow(i); if ( row == null ) // i番目が取得できなかったら行を作成 row = sheet.createRow(i); // 0番目のセルを取得する cell1 = row.getCell(0); if ( cell1 == null ) // 0番目のセルが取得できなかったら新規作成 cell1 = row.createCell(0); cell2 = row.createCell(1); cell3 = row.createCell(2); cell4 = row.createCell(3); // そのセルに値が入っていない場合はループを抜ける if ( "".equals(cell1.getStringCellValue()) ) break; } // 値の入っていないセルでループを抜けるため、すなわち最新の行に内容を書き込む cell1.setCellValue(CompanyInput.getText()); cell2.setCellValue(NameInput.getText()); cell3.setCellValue(WhereInput.getText()); contents4.setCellValue(TimeInput.getText()); try { if ( in != null ) in.close(); } catch ( IOException e ) { e.printStackTrace(); } FileOutputStream out = null; try { // ファイルの書き出し out = new FileOutputStream("test.xls"); workbook.write ( out ); } catch ( IOException e ) { e.printStackTrace(); } finally { try { out.close(); } catch ( IOException e ) { e.printStackTrace(); } } } }

    • ベストアンサー
    • Java
  • サーブレットでのファイルダウンロードについて

    サーブレットでファイルのダウンロードを 行うプログラムを作成しているのですが ときどきダウンロードするファイルが切れている 場合があります。 なので実際のファイルとダウンロード時のファイル の違いがあった場合はJSPでalert表示を行いたい のですが、うまく実行できません。 処理としては response.setHeader(......) response.setContentType(......) 等の設定を行い ダウンロードするファイルのInputStream を作成、OutputStreamにgetOutputStream() を取得してwriteしています。 上記のwriteする時に件数をカウントして このサーブレットの呼び元のjspに返却したい のですが、取得ができません。 何か参考になるサイトなどないでしょうか? よろしくお願いします。

    • ベストアンサー
    • Java
  • Socket通信でのデータの受け渡し

    サーバーが受けたデータを、クライアントに返す プログラムですが、 サーバーは、クライアントからのデータを、 while(true){ BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream())); str=br.readLine(); if(str!=null){ PrintWriter pr=new PrintWriter(s.getOutputStream()); pr.println(str); pr.flush(); }}で、返すようにしています。 クライアントも大体同じです(PrintWriterは、 Buttonを押した時に、取得しています)。 考え方としては、inputstreamは、無限ループで、 取得し、outputstreamは、必要におうじて、取得し データを送っています。 しかし、これだと、一度データを送ると、次から データの受け渡しが出来なくなります。 socketか、inputstreamかoutputstreamのどれかが、 閉じるか、使えなくなるのだと思いますが、 いつもここで、悩んでいます。 (また、無限ループで、BufferedReaderオブジェクト をつくり続けるというのも、ちょっと不安)。 どこに問題があるのか、分かる人教えてください。 お願いします。

    • ベストアンサー
    • Java
  • POIで出力したExcelファイルで変更メッセージ

    POIで出力したExcelファイルを開いてすぐに閉じると 「'○○.xls'への変更を保存しますか?」といったメッセージが出てしまい、 何とかならないかと困っている状況です。 全体的な流れとしては単純で、テンプレートとなるExcelファイルを用意して それをPOIを利用して読み込み、値をセットして、別名で保存しなおしています。 テンプレートは、SUM関数が書かれただけのシンプルなものです。 POIのバージョンは、3.8です。 JREは、1.5.0_15を使用しています。 プログラムは以下になります。 -----------------------------------------------------   int rowNo = 0;   int colNo = 0;      FileOutputStream fileOutputStream = null;   try{    //EXCEL読み込み    HSSFWorkbook inputWorkbook = new HSSFWorkbook(     new FileInputStream(new File("C:\\Test1.xls")));    fileOutputStream = new FileOutputStream("C:\\結果.xls");        //最初のシートを取得する    HSSFSheet sheet = inputWorkbook.getSheetAt(0);    sheet.setForceFormulaRecalculation(true);        //ROW取得    HSSFRow row = sheet.getRow(rowNo);    if(null == row)row = sheet.createRow(rowNo);    //CELL取得    HSSFCell cell = row.getCell(colNo);    if(null == cell)cell = row.createCell(colNo);    //値を書き込む    cell.setCellValue(1);        //EXCELファイル書き出し    inputWorkbook.write(fileOutputStream);   }catch (Exception e) {    e.printStackTrace();   }finally{    try{     if(null != fileOutputStream)fileOutputStream.close();    }catch (Exception e) {     e.printStackTrace();    }   } ----------------------------------------------------- 以下の一文を除くと、変更メッセージは表示されなくなります。 sheet.setForceFormulaRecalculation(true); しかし、この一文がないとSUM関数の計算が動作しません。 記述、認識の不備、また解決に向けた良い方法がありましたら ご教授のほど、よろしくお願いします。

    • ベストアンサー
    • Java
  • 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()); } } } } -----------------------------------------------------------------------

    • ベストアンサー
    • Java
  • ApachePOIでエラー

    ApachePOI3.9をインストールして、ECLIPSに入れて、サンプルコーディングを試して見ました。 実行したところ、次のエラーが表示されました。 java.lang.NoClassDefFoundError: org/apache/poi/ss/usermodel/WorkbookFactory コーディング(抜粋)は以下の通りです。 import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.WorkbookFactory; public void doNippou(HttpServletRequest request, HttpServletResponse response) { String path = getServlet().getServletContext().getRealPath("document"); FileInputStream fi = new FileInputStream(path + File.separator + "A4nippou.xls"); Workbook wb = WorkbookFactory.create(fi); Sheet sheet1 = wb.getSheetAt(1); response.setContentType("application/msexcel"); String fname = "A4nippouyyyymmdd.xls" ; // ファイル名を設定 response.setHeader("Content-Disposition", "attachment; filename=" + fname); OutputStream out = response.getOutputStream(); wb.write(out); out.close(); } 実行環境は、CentOS5,Tomcat5.0,jdk1.4です。 Javaのバージョンが1.4ではApachePOI3.9が動かないのでしょうか。 よろしくお願いします。

  • InputStream.read()でタイムアウトの処理をしたい。

    InputStream.read()でタイムアウトの処理をしたい。 現在自分は、InputStreamに入力されたデータをOutputStreamに移したいとかんがえているのですが、途中でreadメソッドが固まってしまいうまくいきません。 ソースで説明させていただきますと、 public static int copy(InputStream input,OutputStream output)throws IOException { byte[] buffer = new byte[1024 * 4]; int count = 0; int n = 0; while (0 < (n = input.read(buffer))) //ここで固まる { output.write(buffer, 0, n); count += n; System.out.println("available = " + input.available()); System.out.println(count + " byte = " + n); } return count; } このようなコピーするメソッドを書いたのですが、何度かループした後readメソッドで固まってしまいます。また、availableは常に0を返しております。 おそらくストリームの終わりが検出できないため、このような状態になっていると推測されるのですが、プログラムの性質上、InputStreamに入ってくるデータを変更することはできません。 なのでこの問題を解決するべく、ある程度の時間readメソッドがブロックされたら、breakするというような処理を書きたいのですが、どのようにすればよいでしょうか?

    • ベストアンサー
    • Java
  • linuxでapache poiが動かない。

    linux(ubuntu12.04)でeclipseでプログラミングをしているのですが、以下のapache poiのサンプルが正常に動作しません。 import java.io.*; import org.apache.poi.hssf.usermodel.HSSFWorkbook; public class sample{ public static void main(String[] args){ HSSFWorkbook workbook = new HSSFWorkbook(); workbook.createSheet("test"); FileOutputStream out = null; try{ out = new FileOutputStream("sample1.xls"); workbook.write(out); }catch(IOException e){ System.out.println(e.toString()); }finally{ try { out.close(); }catch(IOException e){ System.out.println(e.toString()); } } } コンソールには、 Usage: BiffDrawingToXml [options] inputWorkbook Options: -exclude-workbook exclude workbook-level records -sheet-indexes <indexes> output sheets with specified indexes -sheet-namek <names> output sheets with specified name と表示されます。windowsで正常に動作した時には表示されません。 参照ライブラリーにjarファイルは登録してありますし、windows7では同じeclipseとapache poiの環境で正常に動き、xlsファイルができました。 権限の問題を疑い、プログラムのフォルダごと chmod -R 777 としてみたのですが改善されません。 ネットでの情報も少なく、何が悪いのかわかりません。windowsで動いてなぜlinuxで動かないのでしょうか?

    • ベストアンサー
    • Java
  • サーブレットからIMGタグへ画像が送れない

    Apache1.3.26とTomcat4.0.6でjava1.4でIEに画像を表示するシステムを開発しています。 Tableタグで構成した表内に、サーブレットをリンク先としたIMGタグを3つ記述してあります。   <tr><td>     <img src='../servlet?param='aa''></a>   </td><tr/><tr><td>     <img src='../servlet?param='bb''></a>   </td><tr/><tr><td>     <img src='../servlet?param='cc''></a>   </td><tr/> このタグ内に記述しているサーブレットでは、DBより取得したパスを元にJpegファイルを 読込み、レスポンスに渡しています。   response.setContentType("image/pjpeg");   response.addHeader("Content-Disposition","inline; filename=" + fileName);   InputStream in = null;   OutputStream out = null;   try {     in = new FileInputStream(ImagePath);     out = response.getOutputStream();     int b;     while ((b = in.read()) != -1) {       out.write(b);       break ;     }   } finally {     if (in != null) {       in.close();     }     if (out != null) {       out.flush();       out.close();     }   } IEにこのHTMLを表示させると、ほとんどの場合はJpeg画像が表示されるのですが、 まれに表示されずに×印が出てしまうことがあります。 右クリックメニューより「画像の表示」を行うと表示されますが、ページを表示した際に表示されていないと使えるシステムとなりません。 何が原因なのかわからず、対処のしようがない状態です。 どなたか原因、対処方法についてご教授いただけないでしょうか?

    • ベストアンサー
    • Java

専門家に質問してみよう