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

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

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
  • 回答数1
  • ありがとう数1

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

  • ベストアンサー
  • 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

  • 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
  • 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
  • Java ApachePOIについて

    サーブレットとApachePOIについて質問です。 下記のソースで書き込んだセルをすべて黄色で塗りつぶしをしたいのですが、 ソースの書き方を教えてください。 以上、お願いします。 「ソース」 // 業務名前 String[] name4 = request.getParameterValues("gyoumuname"); for (int i = 0; i < name4.length; i++) { System.out.println(i + " " + name4[i]); name4[i] = new String(name4[i].getBytes("8859_1"), "UTF-8"); List outList=new ArrayList(); for (int i = 0; i < name4.length; i++) { outList.add(name4[i]); } for (int i = 0; i < outList.size(); i++) { Row row5 = sheet.getRow(8 + i); row5.getCell(3).setCellValue(new HSSFRichTextString(outList.get(i).toString())); } // 値を書き込んだエクセルを出力する FileOutputStream out = null; try { out = new FileOutputStream( "C:\\Users\\satou\\Desktop\\weekreport.xls"); workbook.write(out); } catch (IOException e) { System.out.println(e.toString()); } finally { try { out.close(); } catch (IOException e) { System.out.println(e.toString()); } } 以下省略。

  • 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
  • JTextAreaの文字列が表示されない

    閲覧ありがとうございます。 現在eclipseでjavaの勉強をしており、Apache POIを使ってエクセルの操作をしたいと思い以下のプログラムを組んでみたのですが、ボタンの方は上手く動作したのですがメニューの方が上手く動作しません・・・やりたい事は以下の通りです。 ・[ファイル]-[ファイルを作成]をクリックすると、保存ダイアログが表示され指定したディレクトリにtextAreaの内容が1行目、1列目のセルに表示されているxlsファイルを作成する また、ついでに教えて頂きたいのですが、WindowBuilderを使用しフレームの設計をする際、Button等各コンポーネントのアクセス修飾子はデフォルトだと全てprivateなのですが、この修飾子はプログラム中で変更しても問題無いでしょうか?WindowBuilderはつい最近使い始めたばかりでまだ慣れてないので・・・ 以下がソースです。開発環境はeclipse Indigo3.7で、WindowBuilderを使用しています。言語はJavaです。(字数オーバーしたので、import文は省略しています。 ■ExcelTest.java public class ExcelTest implements ActionListener { private JFrame frame; private JTextArea textArea; private JButton btnwo; private menu menu; public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { try { ExcelTest window = new ExcelTest(); window.frame.setVisible(true); } catch (Exception e) { e.printStackTrace(); } } }); } public ExcelTest() { initialize(); } private void initialize() { frame = new JFrame(); frame.setBounds(100, 100, 450, 300); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); textArea = new JTextArea(); frame.getContentPane().add(textArea, BorderLayout.CENTER); btnwo = new JButton("ファイルを作成"); btnwo.addActionListener(this); frame.getContentPane().add(btnwo, BorderLayout.WEST); menu = new menu(); frame.getContentPane().add(menu, BorderLayout.NORTH); }       //ボタンの動作 // こちらは上手く動作する @Override public void actionPerformed(ActionEvent e) { JFileChooser chooser = new JFileChooser(); int selected = chooser.showSaveDialog(null); if (selected == JFileChooser.APPROVE_OPTION) { String path = chooser.getSelectedFile().getPath(); // パスを取得 System.out.println(path); // パスを表示 Workbook wb = new HSSFWorkbook(); Sheet sheet = wb.createSheet(); Row row = sheet.createRow(0); // 1行目を作成 Cell cell = row.createCell(0); // 1行目の1列目にセルを作成 cell.setCellValue(getTextAreaText()); // テキストエリアの文字列を表示 try { FileOutputStream fo = new FileOutputStream(path + ".xls"); wb.write(fo); fo.close(); } catch (IOException e1) { e1.printStackTrace(); } } } public String getTextAreaText() { return textArea.getText(); // テキストエリアの文字列を取得 } } ■menu.java public class menu extends JPanel implements ActionListener { private static final long serialVersionUID = 1L; private JMenuItem menuItem; public menu() { setLayout(new BorderLayout(0, 0)); JMenuBar menuBar = new JMenuBar(); add(menuBar, BorderLayout.NORTH); JMenu menu = new JMenu("ファイル"); menuBar.add(menu); menuItem = new JMenuItem("ファイルを作成"); menuItem.addActionListener(this); menu.add(menuItem); } //メニューの動作 // こちらが上手く動作しない @Override public void actionPerformed(ActionEvent e) { JFileChooser chooser = new JFileChooser(); int selected = chooser.showSaveDialog(null); if (selected == JFileChooser.APPROVE_OPTION) { String path = chooser.getSelectedFile().getPath(); // パスを取得 System.out.println(path); // パスを表示 Workbook wb = new HSSFWorkbook(); Sheet sheet = wb.createSheet(); Row row = sheet.createRow(0); // 1行目を作成 Cell cell = row.createCell(0); // 1行目の1列目にセルを作成 ExcelTest excel = new ExcelTest(); cell.setCellValue(excel.getTextAreaText()); try { FileOutputStream fo = new FileOutputStream(path + ".xls"); wb.write(fo); fo.close(); } catch (IOException e1) { e1.printStackTrace(); } } } }

    • ベストアンサー
    • Java
  • ApachPOIについて

    サーブレットとApachePOIについて質問です。 下記のソースで書き込んだセルをすべて黄色で塗りつぶしをしたいのですが、 ソースの書き方を教えてください。 以上、お願いします。 「ソース」 // 業務名前 String[] name4 = request.getParameterValues("gyoumuname"); for (int i = 0; i < name4.length; i++) { System.out.println(i + " " + name4[i]); name4[i] = new String(name4[i].getBytes("8859_1"), "UTF-8"); List outList=new ArrayList(); for (int i = 0; i < name4.length; i++) { outList.add(name4[i]); } for (int i = 0; i < outList.size(); i++) { Row row5 = sheet.getRow(8 + i); row5.getCell(3).setCellValue(new HSSFRichTextString(outList.get(i).toString())); } // 値を書き込んだエクセルを出力する FileOutputStream out = null; try { out = new FileOutputStream( "C:\\Users\\satou\\Desktop\\weekreport.xls"); workbook.write(out); } catch (IOException e) { System.out.println(e.toString()); } finally { try { out.close(); } catch (IOException e) { System.out.println(e.toString()); } } 以下省略。

  • 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
  • Return で文字列が返せない、、

    このような関数を作って、mainの関数に渡したいのですが、文法がダメだとコンパイラに怒られます。 private String test(){ try{ FileOutputStream fos=openFileOutput("sample.txt", MODE_PRIVATE); String text="サンプルテキストです"; fos.write(text.getBytes()); fos.close(); }catch(FileNotFoundException e){ }catch(IOException e){ } try{ FileInputStream fis=openFileInput("sample.txt"); byte buffer[]=new byte[100]; fis.read(buffer); String str = new String(buffer).trim(); fis.close(); return str; }catch(FileNotFoundException e){ }catch(IOException e){ } }なぜ返せないのでしょうか。

    • ベストアンサー
    • Java
  • java utf-8 で ファイル出力

    【やりたい事】  ファイルを読み込んで、改行コードCRLFをLFに変換して、空白行は削除して、「正常終了しました。」は削除。  文字コードUTF8で出力したい。 【問題】  UTF-8で指定してるのに、Shift_JISで出力される。 【入力ファイル】  ファイル名:test.tsv  文字コード:UTF-8  改行コード:CRLF ************************ test test1 1 2 1 3 正常終了しました。 ************************ 【現在のソース】 import java.io.*; public class writeFile { /** * @param args */ public static void main(String[] args) { // TODO 自動生成されたメソッド・スタブ try { //(1)FileReaderオブジェクトinFileを生成 FileReader inFile = new FileReader("test.tsv"); //(2)FileWriterオブジェクトoutFileを生成 FileWriter outFile = new FileWriter("test_lf.tsv"); //(3)BufferedReaderオブジェクトinBufferを生成 BufferedReader inBuffer = new BufferedReader(inFile); //(4)BufferedWriterオブジェクトoutBufferを生成 BufferedWriter outBuffer = new BufferedWriter(outFile); String line; int cnt=0; //(5)読み込みデータがなくなるまで、読み込み while ((line = inBuffer.readLine()) != null) { //(6)データの書き込み処理 if (line.equals("")){ cnt=cnt+1; }else{ if(cnt<=1){ outBuffer.write(line+"\n"); } } } outBuffer.flush(); //(7)バッファをフラッシュ inBuffer.close(); //(8)読み込みストリームのクローズ outBuffer.close(); //(9)書き込みストリームのクローズ } catch (IOException e) { } try { //(1) //(2)FileInputStreamオブジェクトの生成 FileInputStream abc = new FileInputStream("test_lf.tsv"); //(3)FileOutputStreamオブジェクトの生成 FileOutputStream xyz = new FileOutputStream("test_lf_utf.tsv"); //(4)InputStreamReaderオブジェクトの生成 InputStreamReader in = new InputStreamReader(abc, "Shift_JIS"); //(5)OutputStreamWriterオブジェクトの生成 OutputStreamWriter out = new OutputStreamWriter(xyz, "UTF-8"); int contents; //(6) //(7)読み込むデータがなくなるまで読み込み while ((contents = in.read()) != -1) { //(8)書き込むデータがなくなるまで書き込み out.write(contents); } in.close(); //(9)読み込みストリームを閉じる out.close(); //(10)書き込みストリームを閉じる } catch(IOException e) { } } } 【出力結果】  ファイル名:test_lf.tsv  文字コード:Shift_JIS  改行コード:LF ************************  test test1 1 2 1 3 ************************  ファイル名:test_lf_utf.tsv  文字コード:Shift_JIS  改行コード:LF ************************ test test1 1 2 1 3 ************************ 本当に困っています。 もう二日、はまってます。 ご教授願います。

    • ベストアンサー
    • Java
  • javaのエラーが回収できない

    JAVA初心者です。下記のエラーを直したいんですがよくわかりません。 Exception in thread "main" java.lang.NumberFormatException: For input string: "" at java.lang.NumberFormatException.forInputString(Unknown Source) at java.lang.Integer.parseInt(Unknown Source) at java.lang.Integer.parseInt(Unknown Source) at hangman.main(hangman.java:141) ソースを載せたいのですが200行程度あって全部載せられないので 関連しそうなところだけ載せます。 ~~~~~~~~~略~~~~~~~~~~~ try{ int input=System.in.read(); char str_moji1=(char)input; //ユーザの1文字入力 if(words[chosenWordRecord].indexOf(str_moji1) != -1){ System.out.println("debug:"+str_moji1+"の場所"+(words[chosenWordRecord].indexOf(str_moji1)+1)); } else{ System.out.println(str_moji1+"は含まれてないよ!"); } for(int arrayNum=0; arrayNum<wordArray.length; arrayNum++){ if(wordArray[arrayNum]==str_moji1){ System.out.print(" "+str_moji1); } else{ System.out.print(" _"); } } }catch(IOException e){ System.out.println(e); } try{ System.out.print("入力テスト:"); BufferedReader br1=new BufferedReader(new InputStreamReader(System.in)); String str=br1.readLine(); step=Integer.parseInt(str); //int型に変換 }catch(IOException e){ System.out.println(e);            //141行目 } ~~~~~~~~~略~~~~~~~~~~~ 状況としては、 ユーザの入力によって2つのテキストファイルを順にコマンドライン上に 表示しようとしているのですが1つ目のファイルから単語を呼んで処理を終えた後に、 2つ目のファイルを呼ぶための入力ができなくなっているようです。 かってに数字以外の文字が入力されてしまっているということでしょうか? エラーで指定された場所にcatch(NumberFormatException e){}も追加してみましたが ただエラーが表示されなくなるだけでした。 ちなみに変数はすべて宣言してあります。 解決方法ご存知の方いましたら教えてください。 よろしくお願いします。

    • ベストアンサー
    • Java