• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Java swing エクセル書き込み)

Java Swingでエクセル書き込みをする方法

このQ&Aのポイント
  • Java Swingを使用して、エクセルに日報を出力する処理を作成しています。入力されたデータは、既存のエクセルファイルに上書きされるようにしたいです。また、新規でエクセルが出力される場合には、見出しと入力内容が1行目と2行目に出力されるようにしたいです。しかし、2回目の出力で1行目と2行目が消えてしまう問題や、エクセルが存在しない場合の新規作成方法について分からない点があります。アドバイスをお願いします。
  • Java Swingを使用して、エクセルに日報を出力する処理を作成しています。上書き保存や新規作成など、さまざまなケースで問題が発生しています。具体的には、2回目の出力で1行目と2行目が消えてしまう問題があり、エクセルが存在しない場合の新規作成方法についても分からない状況です。解決策を教えてください。
  • Java Swingを使用して、エクセルに日報を出力する処理を作成しています。現在、上書き保存と新規作成の機能について問題が発生しています。2回目の出力で1行目と2行目が消えてしまう問題や、エクセルが存在しない場合の新規作成方法について、解決策を教えてください。

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

  • ベストアンサー
  • LancerVII
  • ベストアンサー率51% (1060/2054)
回答No.1

こんにちは。 既存のソースは一部抜粋のようですのであまり解析していません。 ・ファイルが存在した場合はそのファイルを利用、ファイルが存在しない場合は新規作成 ・新規作成の場合は先頭行に見出し ・その後は次の行から作成されていく という仕様で簡単なサンプルですが作ってみました。 これを参考にどうにかなるでしょうか。 (動きはソース中のコメントを参考にしてください) 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); cell1.setCellValue ( "会社" ); cell2.setCellValue ( "報告者" ); } // 行を1行目から走査する // 1行目は見出しのため、チェック対象外 Row row = null; Cell cell = null; int i = 1; for ( ; ; i ++ ) { // i番目を取得する row = sheet.getRow(i); if ( row == null ) // i番目が取得できなかったら行を作成 row = sheet.createRow(i); // 0番目のセルを取得する cell = row.getCell(0); if ( cell == null ) // 0番目のセルが取得できなかったら新規作成 cell = row.createCell(0); // そのセルに値が入っていない場合はループを抜ける if ( "".equals(cell.getStringCellValue()) ) break; } // 値の入っていないセルでループを抜けるため、すなわち最新の行に内容を書き込む cell.setCellValue ( i + "行目に書いた" ); 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(); } } }

doborn
質問者

お礼

ご回答ありがとうございました。 新規で質問をたてさせていただきます、宜しくお願いいたします。

doborn
質問者

補足

ご教授頂きありがとうございます。 教えて頂いたプログラムを参考にしましたところうまくいきました。 ところがここでまた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(); } } } }

関連するQ&A