• ベストアンサー

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が発生してしまいます。 メソッドの使い方が間違っているのでしょうか? どなたかご存知でしたらご教授いただきたいと思います。 よろしくお願い致します。

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

  • ベストアンサー
回答No.2

こんにちは POIのソースを探ってみました。 ワークブック(HSSFWorkbook)から、すでに存在するシートを取得して(getSheetAtメソッド)、そのシートに対して、プロテクトの設定する。 →NullPointerException ワークブック(HSSFWorkbook)から、新規にシートを作成・取得して(createSheetメソッド)、そのシートに対して、プロテクトの設定する。 →例外なく通過=成功 と言う結果になりました。 HSSFSeetクラスには、Sheetクラスがフィールド(メンバー変数)としてあって、Sheetクラスには、ProtectRecordクラスがフィールドとしてあります。 どうやら、createSheetメソッドで、HSSFSeetクラス・オブジェクトを生成すると、ProtectRecordクラス・オブジェクトも生成されますが、 getSheetAtメソッドでHSSFSeetクラス・オブジェクトを取得しても、ProtectRecordクラス・オブジェクトが生成されません。 これがPOIの仕様なのか、バグなのかわかりませんが、原因は、このメソッドによる動作差異によるようです。

non26
質問者

お礼

run34ricky様 ありがとうございます、大変参考になりました。 既存シートではプロテクトできないのですね。。。 原因がわかって助かりました! どうもありがとうございました☆

その他の回答 (1)

回答No.1

こんばんは。 setProtect()以外は操作できてるんでしょうか? 普通にセルの選択とかができるのでしたら、ちょっとわかりません・・・。 もしできなければ、setProtect()の問題ではないですね(って言うか、間違ってはないです)。 bookかsheetのインスタンスがちゃんと(操作可能に)できてますか? FileInputStream is = new FileInputStream("sample.xls"); POIFSFileSystem xx = new POIFSFileSystem(is); HSSFWorkbook book = new HSSFWorkbook(xx); だったような・・・。 全然自信ないです・・・。 (^^ゞ

non26
質問者

お礼

taka451213様、どうもありがとうございます。 setProtect以外の操作(セルに文字を設定したり、シート名を変更するなど)はできているのですが。。。 教えていただいたように、 POIFSFileSystem xx = new POIFileSystem(is) のコードを追加してみたのですが、やはりNullPointerExceptionになってしまいました。 もう少し調べてみようと思います。 ありがとうございました☆

関連するQ&A