Excelのセルから日付情報を取得する方法について

このQ&Aのポイント
  • JavaでExcelのセルから日付情報を正しく取得する方法を教えてください
  • Excelのセルから取得した日付情報が数字に変化してしまう問題があります
  • データベースに登録するために、日付情報をString型に変換してから加工したいです
回答を見る
  • ベストアンサー

Excelのセルから日付情報を取得する方法について

こんにちは。 現在JavaでExcelのセルから情報を取り込んで、それらを加工し、データベースに登録するプログラムを考えております。 まずはExcelから情報を取得することを目指しているのですが、文字列や数字は正常にセルからString型の変数に取り込めましたが、日付情報だけ5ケタの数字に変化してString型に取り込まれてしまいます。 双方の型が違うため取得が上手くいかないのでは!?と考えているのですが、解決方法が見つかりません>< データは途中で加工するため、日付型(!?)でセルに入っているものを、Stringに取り込んで、Stringで加工をして、またStringから日付型に戻してデータベースに登録したいというものです。 自身でも色々と調べてみましたが、解決策は見つからず、こちらに泣きついた次第です。 ご教授いただければ幸いです、どうぞ宜しくお願い致します。 <Excel> 2003 <Excelの表>     A    B     C 1|食料品|個数|賞味期限| 2|バナナ|2|H23.6.30| 3|りんご|3|H23.7.1| <参考プログラムのURL> http://vapour.s22.xrea.com/javadojo/index.php?JxlReadTest.java <プログラム> import java.io.File; import jxl.Cell; import jxl.Workbook; import jxl.Sheet; public class Sample{ public static void main(String[] args){ String inputFileName = "output.xls"; Workbook workbook = null; try { System.out.println(inputFileName + "ブックをオープンします"); workbook = Workbook.getWorkbook(new File(inputFileName)); if (workbook == null) { System.err.println(inputFileName + "ブックオープンに失敗しました"); return; } } catch (Exception ex) { System.err.println(ex.toString()); return; } System.out.println("1番目のシートにアクセスします"); Sheet sheet = workbook.getSheet(0); if (sheet == null) { System.err.println(inputFileName + "シート作成に失敗しました"); return; } Cell cell = null; String cellStr = ""; try { for(int i=0;i<3;i++) { for(int j=0;j<3;j++) { cell = sheet.getCell(i,j); cellStr = cell.getContents(); System.out.println("セル("+i+","+j+") は「"+cellStr+"」です"); } } } catch (RuntimeException ex) { System.err.println("A3セルの読込に失敗しました:" + ex.toString()); } try { if (workbook != null) { workbook.close(); } } catch (Exception ex) { System.err.println(inputFileName + "ブックのクローズに失敗しました:" + ex.toString()); } } }

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

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

  • ベストアンサー
  • yamada_g
  • ベストアンサー率68% (258/374)
回答No.3

>H23.6.30 と入力しているということは、セルの分類は「日付」にはなっていませんよね。 すみませんでした。 bin-chanさんのおっしゃるようにシリアル値は特定の日付からの経過日数を表しますので、 //windowsでのデフォルトでは1900/1/1 12:00:00AMから //上記時刻を表すCalendarクラスのインスタンス Calendar cal = Calendar.getInstance(); cal.set(1900, 0, 1, 12, 0, 0); //1900/1/1のシリアルが1なので、加算する値は取得した値 - 1になる int serial = Integer.parseInt(cellStr) - 1; //1900/2/29は存在しないがエクセル内では存在しているらしいので //その日付以降であればさらに -1 serial -= (serial > 60 ? 1 : 0); //基準日に加算 cal.add(Calendar.DATE, serial); //確認のために表示 System.out.println(String.format("%1$tD",cal)); という感じで計算はできると思います。 ただ、日付が入力されているセルが特定できていないとダメですが。 また、 >WindowsとMacで異なります。オプションで補正が可能。 というのは http://support.microsoft.com/kb/214094/ja などを参考に。

ver_51
質問者

お礼

2度もご回答いただきありがとうございます。 お教えいただいた「基準日に加算する方法」で上手くいきました!! 長い時間悩んでいたので、本当に助かりました。 本当にありがとうございましたm(_ _)m

その他の回答 (2)

  • yamada_g
  • ベストアンサー率68% (258/374)
回答No.2

ava Excel APIは使ったことがないのですが、チュートリアルに日付セルの読み込み方があります。 http://www.andykhan.com/jexcelapi/tutorial.html#reading >if (c2.getType() == CellType.DATE) >{ > DateCell dc = (DateCell) c2; > datec2 = dc.getDate(); >} 日付セルであればDateCellにキャストしてDateオブジェクトを取得できるようです。 そのDateオブジェクトを文字列に変換すればいいのではないでしょうか。

ver_51
質問者

補足

ご回答いただきありがとうございます。 ご紹介いただいたURLを参考にプログラムを修正し、getType()で説明文にあるExcelの各セルを取得したところ、バナナはLABEL、2はNUMBER、H23.6.30はNUMBERと判定されました。 やはりH23.6.3に関しては、セルの中身がNo1の方にご指摘いただいた通り、シリアル値として取得されており、NUMBERの判定となったみたいです^^; 自身の知識不足で未だ解決できていませんが、今一歩のような気もしますので、もう一度他の手法はないか、一から検討してみます。 再度ですが、ありがとうございました。

  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.1

EXCELは日付を「シリアル値」として持ってます。「ある基準日」からの通算日数です。 「ある基準日」のデフォルトはWindowsとMacで異なります。オプションで補正が可能。 そこらへんも調べておく必要がありますよ。

ver_51
質問者

補足

ご回答ありがとうございます。 シリアル値も検索ワードに入れて、再度色々と調べていますが、未だ解決には至っていません。 しかし、5ケタの数字の謎が解けただけでも、かなり前進した気がします。 ありがとうございました。

関連するQ&A

  • 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
  • 同じLAN上(別のホスト)のファイル内容を取得する方法

    質問があります。 同じLAN上で別のPCのファイル内容を取得するには どうすればよろしいでしょうか。 例えば、192.168.1.1というIPを持つPCから192.168.1.2というIPを持つPCのc:/text.txtというファイルを読み込みたい場合以下のようなコードを作成したのですが、java.net.ConnectionExceptionというエラーが表示されます。どのように修正すればうまくいくかを教えていただければとてもありがたいです。 よろしくお願いします。 ======================================================= import java.io.*; import java.net.*; public class Sample{ public static void main( String[] args ) { String testStr = ""; //初期化 try{ URL url = new URL("ftp","192.168.1.2",21,"c:/text.txt"); InputStream is = url.openStream(); InputStreamReader isr = new InputStreamReader(is); BufferedReader bur = new BufferedReader(isr); while((testStr = bur.readLine()) != null){ System.out.println(csvStr); } } catch(Exception e){ System.err.println(e.toString()); return; } }

    • ベストアンサー
    • Java
  • excel vba 選択されたセルの範囲を別のセル

    excel vba 選択されたセルの範囲を別のセルに書き込みたい。 お世話になっております。 乱筆乱文お許し下さい。 EXCEL VBAについてですが、或るブックを閉じる時(Private Sub Workbook_BeforeClose(Cancel As Boolean))にその時点でACTIVEなsheetの名前を指定シートの指定セルに書き込み、そのブックを開く時(Private Sub Workbook_Open())に指定シートの指定セルの値の名前sheetをACTIVEにすることは出来たのですが、もう一歩進んで、 ブックを閉じる時(Private Sub Workbook_BeforeClose(Cancel As Boolean))にその時点でselectされているcellの範囲(単一セル・複数セル共に、名前がついていたら名前、ついていなければrangeを表す文字列)を指定シートの指定セルに書き込み、そのブックを開く時(Private Sub Workbook_Open())に指定シートの指定セルの値の名前cell範囲をselectするようなことがやりたいのですが、私の検索の仕方が下手で、なかなか出てきません。どなたかご教示下さい。よろしくお願いします。

  • java 全角判定ができなくて困っています。

    今年javaを習いだした初心者です。 現在java servletでユーザの登録画面の作成をしており、 ユーザ名を入力した際に、半角英数字での入力ならばtrue、全角文字での入力であればfalseでエラーを表示したいのですがうまくいきません。 どなたかご教授いただけませんでしょうか? ソースは下記のとおりとなります。 よろしくお願いいたします。 import java.io.*; import java.sql.*; import javax.servlet.*; import javax.servlet.http.*; public class ServletUsersRegistrationScreen extends HttpServlet{ String url = "xxxx” String user = "xx"; String password = "xx"; PrintWriter out; Statement statement; HttpSession session; public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException { Connection conn = null; try{ // DBに接続 Class.forName("com.mysql.jdbc.Driver").newInstance(); conn = DriverManager.getConnection(url,user,password); }catch( Exception e ) { // エラー画面 response.sendRedirect("error.html"); return; } request.setCharacterEncoding("Windows-31J"); response.setContentType("text/html; charset=Windows-31J"); try{ // インスタンス変数の設定 statement = conn.createStatement(); out = response.getWriter(); session = request.getSession(); //HTMLの出力 out.println("<html>"); out.println("<head>"); out.println("<title>書籍検索システム</title>"); out.println("</head>"); out.println("<body>"); out.println("<left>"); out.println("<p><h1>書籍検索システムの新規登録</h1></p>"); out.println("<p>書籍検索システムのサービス(書籍検索・書籍登録)をご利用いただけます。</p>"); out.println("<p>入力項目はすべて必須です。</p>"); out.println("<fieldset style=\"width:400;height:270;\">"); out.println("<legend>入力する項目</legend>"); //既にユーザー名が登録されている String message = (String)session.getAttribute("ERR_FAILURE"); if(message != null) { out.println("<p><Font Color=\"#ff0000\">"+message+"</Font></p>"); session.setAttribute("ERR_FAILURE", null); } //ユーザー名が入力されていない String message1 = (String)session.getAttribute("ERR_USERNAME"); if(message1 != null){ out.println("<p><Font Color=\"#ff0000\">"+message1+"</Font></p>"); session.setAttribute("ERR_USERNAME", null); } //パスワードが入力されていない String message2 = (String)session.getAttribute("ERR_PASSWORD"); if(message2 != null){ out.println("<p><Font Color=\"#ff0000\">"+message2+"</Font></p>"); session.setAttribute("ERR_PASSWORD", null); } //(再入力)パスワードが入力されていない String message3 = (String)session.getAttribute("ERR_CONFPASSWORD"); if(message3 != null){ out.println("<p><Font Color=\"#ff0000\">"+message3+"</Font></p>"); }} //パスワードと(再入力)パスワードが一致しない String message4 = (String)session.getAttribute("ERR_MISSMACH"); if(message4 != null){ out.println("<p><Font Color=\"#ff0000\">"+message4+"</font></p>"); session.setAttribute("ERR_MISSMACH",null); } //ユーザー名入力数制限の20文字をオーバー String message5 = (String)session.getAttribute("ERR_20OVER"); if(message5 != null){ out.println("<p><Font Color=\"#ff0000\">"+message5+"</font></p>"); session.setAttribute("ERR_20OVER",null); } //パスワードが6文字未満8文字以上 String message6 = (String)session.getAttribute("ERR_6UNDER8OVER"); if(message6 != null){ out.println("<p><Font Color=\"#ff0000\">"+message6+"</font></p>"); session.setAttribute("ERR_6UNDER8OVER",null); } //半角英数判定 String message7 = (String)session.getAttribute("ERR_MISSSPELL"); if(message != null){ out.println("<p><Font Color=\"#ff0000\">"+message7+"</font></p>"); session.setAttribute("ERR_MISSSPELL",null); } out.println("<form method=\"POST\" action=\"Servl

  • 誰か教えてください!

    javaのプログラムですが import java.io.*; import java.util.*; public class Suudoku{ Suudoku(int[] data){ public static void main(String[] args);{ int[] data = new int[81]; if(args.length!=1){ System.err.println("need 1 argument"); System.exit(1); } BufferedReader br; try{ br = new BufferedReader(new FileReader(args[0])); for(int i=0;i<9;i++){ String tmp = br.readLine(); StringTokenizer stn = new StringTokenizer(tmp," ",false); for(int j=0;j<9;j++){ data[i*9+j]=Integer.parseInt(stn.nextToken()); } } }catch(Exception e){ System.err.println(""+e); System.exit(1); } new Suudoku(data); int board[][] = {{ 6, 0, 1, 0, 7, 0, 2, 0, 8 }, { 0, 7, 0, 6, 0, 8, 0, 9, 0 }, { 9, 0, 0, 0, 3, 0, 0, 0, 7 }, { 0, 8, 0, 3, 0, 4, 0, 1, 0 }, { 4, 0, 2, 0, 0, 0, 9, 0, 5 }, { 0, 6, 0, 1, 0, 9, 0, 2, 0 }, { 1, 0, 0, 0, 8, 0, 0, 0, 2 }, { 0, 2, 0, 7, 0, 6, 0, 5, 0 }, { 3, 0, 7, 0, 9, 0, 6, 0, 1 }}; } } } の後はどうようにしたら良いか教えて下さい。

  • 文字列の比較について

    BufferedReaderでファイルを読んだのちに、見出しの文字列をカンマで分割して 文字列を比較しようとしています。 ですが、分割すると、文字列が別な文字コードによる表記に変わってしまいます。 なぜでしょうか? また、解決方法などのヒントなどあれば教えてください。 BufferedReader buffReader = new BufferedReader( new FileReader("/home/masa/Desktop/Sample.csv")); String s; int ini=0; int wamei=0; int i=0; while((s = buffReader.readLine())!= null){ String[] str = s.split(",", -1); //System.out.println(s); if (i == 0) { for(int j=0; j<str.length;j++){ System.out.println(String.toString(str)); if(str.equals("五十音")){ini = j;} System.out.println("五十音"+ini); if(str.equals("a")){wamei = j;} System.out.println("和名"+wamei); //System.out.println(j); } } i++;

    • ベストアンサー
    • Java
  • 基本情報処理平成13年度秋期JAVA午後問8について

    早速質問させていただきます。 基本情報処理平成13年度秋期JAVA午後問8のTestPantsプログラムについてですが、 abstract class Pants内のpublic String toStringメソッドがどのタイミングで呼び出されるのかが解りません。 for (int i = 0; i < pants.length; i++) { System.out.println(pants[i]); } 上記のSystem.out.println(pants[i]);を実行すると勝手にtoStringが呼ばれるのでしょうか? ■平成13年度秋期JAVA午後問8ソース http://www.bohyoh.com/ITEE/Java/2001B/J2001B08.html よろしくお願い致します。

  • 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
  • Java swing エクセル書き込み

    現在、poiで日報システムを作成しております。 入力されたデータはexcelに出力されるような処理をしました。 日報を入力し、ボタンを押されるたびに既存のexcelファイルに上書きされるようにしたいです。 もしエクセルが新規で出力される場合には1行目には見出しを、2行目には入力された内容が出力されます。 次にこのシステムを使った人が書き込みをした場合には3行目に内容が出力されるようにしていきたいです。 このためにexcelを読み込んで、空白セルを確認する処理をすればいいのでしょうが、試行錯誤しました、まず自分で保存先に空のExcelを作らないといけないということと、1回目の入力では正常に2行目まで出力されていますが、もう1度入力をし、出力をすると1,2行目が消えて3行目に書き込みがされるだけになってしまいます。 そこで2点ございます。 (1)2回目の出力で1,2行目が消えてしまうのはプログラムの組み方に誤りがあるのでしょうが、お手上げ状態です。 (2)excelが存在しない場合はこのシステム上で新たに作成をしてくれるようにもできるのでしょうか? ご教授いただければと思います。 public void ExcelOutput() { Workbook wb = new HSSFWorkbook(); Sheet sheet = wb.createSheet(); /* * ファイルを読み込みし行数が「0」 * 何も書き込みがされていない場合にはヘッダと1つめの行(2行目)を書き込み */ if(ExcelInput() == 0){ Row head = sheet.createRow(0); Cell head1 = head.createCell(0); Cell head2 = head.createCell(1); head1.setCellValue("会社"); head2.setCellValue("報告者"); CellStyle styleHead = wb.createCellStyle(); styleHead.setFillPattern(CellStyle.SOLID_FOREGROUND); styleHead.setFillForegroundColor(IndexedColors.RED.getIndex()); head1.setCellStyle(styleHead); head2.setCellStyle(styleHead); Row contents = sheet.createRow(1); Cell contents1 = contents.createCell(0); Cell contents2 = contents.createCell(1); contents1.setCellValue(CompanyInput.getText()); contents2.setCellValue(NameInput.getText()); FileOutputStream out = null; try{ out = new FileOutputStream("ccc.xls"); wb.write(out); }catch(IOException e){ //System.out.println(e.toString()); }finally{ try { out.close(); }catch(IOException e){ //System.out.println(e.toString()); } } } /* * すでにエクセル作成済み(1,2行目に入力がされている)場合 * 途中から書き込み */ else{ Row contents = sheet.createRow(CompanyExcelInput()); Cell contents1 = contents.createCell(0); Cell contents2 = contents.createCell(1); contents1.setCellValue(InterviewPersonInput.getText()); contents2.setCellValue(NameInput.getText()); FileOutputStream out = null; try{ out = new FileOutputStream("ccc.xls"); wb.write(out); }catch(IOException e){ //System.out.println(e.toString()); }finally{ try { out.close(); }catch(IOException e){ //System.out.println(e.toString()); } } } } public int ExcelInput(){ int rowNullCount = 0; try{ //Excelのワークブックを読み込む POIFSFileSystem filein = new POIFSFileSystem (new FileInputStream("ccc.xls")); HSSFWorkbook wb = new HSSFWorkbook(filein); //シートを読み込む HSSFSheet sheet = wb.getSheetAt(0); //空行を検索し、空行を保持する for(rowNullCount = 0; rowNullCount <= sheet.getLastRowNum(); rowNullCount++) { HSSFRow row = sheet.getRow(rowNullCount); if(row == null){ break; } } } catch(IOException ioe) { // TODO } return rowNullCount; } ExcelInputとExcelOutputはボタンのactionPerformedで読み込んでいます。 宜しくお願い致します。

    • ベストアンサー
    • Java
  • TCP関係のjavaプログラム

    TCPでオウム返しをするサーバとクライアントソフトでクライアント側でピリオドだけを入力すると接続を切るプログラムを作っているのですがなかなか思い通りにいきません。 正しいソースコードを教えてください。 クライアント側のソースコード import java.io.*; import java.net.*;   public class echoClient { public static void main(String[] args) { Socket echoSocket = null; DataOutputStream os = null; BufferedReader is = null;   try { echoSocket = new Socket("localhost", 9999); os = new DataOutputStream(echoSocket.getOutputStream()); is = new BufferedReader(new InputStreamReader(echoSocket.getInputStream())); } catch (UnknownHostException e) { System.err.println("Don't know about host: localhost"); } catch (IOException e) { System.err.println("Couldn't get I/O for the connection to: localhost"); }   if (echoSocket != null && os != null && is != null) { try { os.writeBytes("HELLO\n");   String responseLine; if ((responseLine = is.readLine()) != null) { System.out.println("Server: " + responseLine); }   os.close(); is.close(); echoSocket.close(); } catch (UnknownHostException e) { System.err.println("Trying to connect to unknown host: " + e); } catch (IOException e) { System.err.println("IOException: " + e); } } } } サーバー側のプログラム import java.io.*; import java.net.*; public class echoServer { public static void main(String args[]) { ServerSocket echoServer = null; String line; BufferedReader is; PrintStream os; Socket clientSocket = null; try { echoServer = new ServerSocket(9999); } catch (IOException e) { System.out.println(e); } try { clientSocket = echoServer.accept(); is = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); os = new PrintStream(clientSocket.getOutputStream()); while (true) { line = is.readLine(); os.println(line); } } catch (IOException e) { System.out.println(e); } }

専門家に質問してみよう