- ベストアンサー
Jakarta POI での、excelのシート保護
こんにちは。いつも色々と参考にさせていただいております。POIを利用して、excelのシートの操作をやっているのですが、シートの保護がうまくいきません。 まず、sample.xlsを読み込み、 FileInputStream is = new FileInputStream("sample.xls"); HSSFWorkbook book = new HSSFWorkbook(is); HSSFSheet sheet = book.getSheetAt(0); HSSFSheetクラスのsetProtectメソッドを用いて、 sheet.setProtect(false); とすると、NullPointerExceptionが発生してしまいます。 メソッドの使い方が間違っているのでしょうか? どなたかご存知でしたらご教授いただきたいと思います。 よろしくお願い致します。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは POIのソースを探ってみました。 ワークブック(HSSFWorkbook)から、すでに存在するシートを取得して(getSheetAtメソッド)、そのシートに対して、プロテクトの設定する。 →NullPointerException ワークブック(HSSFWorkbook)から、新規にシートを作成・取得して(createSheetメソッド)、そのシートに対して、プロテクトの設定する。 →例外なく通過=成功 と言う結果になりました。 HSSFSeetクラスには、Sheetクラスがフィールド(メンバー変数)としてあって、Sheetクラスには、ProtectRecordクラスがフィールドとしてあります。 どうやら、createSheetメソッドで、HSSFSeetクラス・オブジェクトを生成すると、ProtectRecordクラス・オブジェクトも生成されますが、 getSheetAtメソッドでHSSFSeetクラス・オブジェクトを取得しても、ProtectRecordクラス・オブジェクトが生成されません。 これがPOIの仕様なのか、バグなのかわかりませんが、原因は、このメソッドによる動作差異によるようです。
その他の回答 (1)
- taka451213
- ベストアンサー率47% (436/922)
こんばんは。 setProtect()以外は操作できてるんでしょうか? 普通にセルの選択とかができるのでしたら、ちょっとわかりません・・・。 もしできなければ、setProtect()の問題ではないですね(って言うか、間違ってはないです)。 bookかsheetのインスタンスがちゃんと(操作可能に)できてますか? FileInputStream is = new FileInputStream("sample.xls"); POIFSFileSystem xx = new POIFSFileSystem(is); HSSFWorkbook book = new HSSFWorkbook(xx); だったような・・・。 全然自信ないです・・・。 (^^ゞ
お礼
taka451213様、どうもありがとうございます。 setProtect以外の操作(セルに文字を設定したり、シート名を変更するなど)はできているのですが。。。 教えていただいたように、 POIFSFileSystem xx = new POIFileSystem(is) のコードを追加してみたのですが、やはりNullPointerExceptionになってしまいました。 もう少し調べてみようと思います。 ありがとうございました☆
お礼
run34ricky様 ありがとうございます、大変参考になりました。 既存シートではプロテクトできないのですね。。。 原因がわかって助かりました! どうもありがとうございました☆