- ベストアンサー
EXECLの行を削除
こんにちは 質問があります。 以下のコードのように、 テキストボックスに入力した行数の エクセルの行を削除したいのですが、 何も削除されません。 どなたか解決策を教えていただけないでしょうか よろしくお願いいたします。 import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.io.*; import java.util.*; import org.apache.poi.hssf.usermodel.*; import org.apache.poi.poifs.filesystem.POIFSFileSystem; class testdel { public static void main(String[] args) { testdel2 test=new testdel2(); } } class testdel2 implements ActionListener { JButton button; JTextField text; testdel2() { JFrame frame=new JFrame(); JPanel panel=new JPanel(); button=new JButton("削除"); text=new JTextField(1); button.addActionListener(this); panel.add(text); panel.add(button); Container ct=frame.getContentPane(); ct.add(panel); frame.pack(); frame.setVisible(true); } public void actionPerformed(ActionEvent e) { if(e.getSource()==button) { int del_row=Integer.parseInt(text.getText()); Delete del=new Delete(del_row); } } } class Delete { Delete(int delrow) { try {System.out.println(delrow); FileInputStream fis = new FileInputStream("c:/sample.xls"); POIFSFileSystem fs = new POIFSFileSystem(fis); HSSFWorkbook wb1 = new HSSFWorkbook(fs); HSSFSheet sheet = wb1.getSheetAt(0); HSSFRow row=sheet.getRow(delrow); sheet.removeRow(row); System.exit(0); } catch(Exception e) { System.err.println(e.toString()); } } }
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
removeRowではなくshiftRowsを使用すると 削除したように見せることができます。 sheet.removeRow(row); ↓ sheet.shiftRows(delrow,sheet.getLastRowNum(),-1);
その他の回答 (3)
- Bonjin
- ベストアンサー率43% (418/971)
#2です。 >もう少し具体的に教えていただけますか? 提示されたソースコードではワークシートに変更を加えてからファイルへ保存を行っていないので内容が変更されません。変更が加わっているのはあくまでメモリ上にあるデータに対してだけです。 ファイルへの保存方法は参考URLを参考にしてください。
補足
要するに 上書きするメソッドは write(); でよろしいんですよね?
- Bonjin
- ベストアンサー率43% (418/971)
変更したらちゃんとファイルに保存しないと…
補足
Bonjinさん、こんにちは。 申し訳ございません。 もう少し具体的に教えていただけますか? よろしくお願いします。
- renann
- ベストアンサー率33% (1/3)
org.apache.poi.poifs.filesystem.POIFSFileSystemなどは、あまり知らないのですが、普通に考えて・・Streamを最後閉じていないところが気になります。 *sheet.removeRow(row);で処理が終わってしまっている(変更の確定(保存)を行う処理が必要では?)
お礼
renannさん。 早速のご回答ありがとうございます。 おっしゃる通りでした。 sheet.removeRow(row);の後に FileOutputStream fso=new FileOutputStream("c:/sample.xls"); wb1.write(fso); fso.close(); を追記したらうまくいきました。 しかし、行は削除ではなく、ただ値がクリアされただけで テキストボックスに入力した行だけが空白になっている状態です。 ちゃんと削除したいのですがどうしたらよいでしょうか?
お礼
javakariさん、こんにちは。 おかげさまで、できるようになりました。 もし、また行き詰まってしまったらよろしくお願いいたします。