アプリ版:「スタンプのみでお礼する」機能のリリースについて

こんにちは。いつも色々と参考にさせていただいております。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が発生してしまいます。

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

A 回答 (2件)

こんにちは



POIのソースを探ってみました。
ワークブック(HSSFWorkbook)から、すでに存在するシートを取得して(getSheetAtメソッド)、そのシートに対して、プロテクトの設定する。
→NullPointerException

ワークブック(HSSFWorkbook)から、新規にシートを作成・取得して(createSheetメソッド)、そのシートに対して、プロテクトの設定する。
→例外なく通過=成功

と言う結果になりました。
HSSFSeetクラスには、Sheetクラスがフィールド(メンバー変数)としてあって、Sheetクラスには、ProtectRecordクラスがフィールドとしてあります。
どうやら、createSheetメソッドで、HSSFSeetクラス・オブジェクトを生成すると、ProtectRecordクラス・オブジェクトも生成されますが、
getSheetAtメソッドでHSSFSeetクラス・オブジェクトを取得しても、ProtectRecordクラス・オブジェクトが生成されません。

これがPOIの仕様なのか、バグなのかわかりませんが、原因は、このメソッドによる動作差異によるようです。
    • good
    • 0
この回答へのお礼

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

お礼日時:2004/12/17 10:50

こんばんは。



setProtect()以外は操作できてるんでしょうか?
普通にセルの選択とかができるのでしたら、ちょっとわかりません・・・。
もしできなければ、setProtect()の問題ではないですね(って言うか、間違ってはないです)。
bookかsheetのインスタンスがちゃんと(操作可能に)できてますか?

FileInputStream is = new FileInputStream("sample.xls");
POIFSFileSystem xx = new POIFSFileSystem(is);
HSSFWorkbook book = new HSSFWorkbook(xx);
だったような・・・。

全然自信ないです・・・。
(^^ゞ
    • good
    • 0
この回答へのお礼

taka451213様、どうもありがとうございます。
setProtect以外の操作(セルに文字を設定したり、シート名を変更するなど)はできているのですが。。。

教えていただいたように、
POIFSFileSystem xx = new POIFileSystem(is)
のコードを追加してみたのですが、やはりNullPointerExceptionになってしまいました。

もう少し調べてみようと思います。
ありがとうございました☆

お礼日時:2004/12/17 09:19

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!