• ベストアンサー

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

  • POI 読込 OutOfMemory

    POIでエクセルの読込をやっているのですが 4Mぐらいのファイルを読み込むと new HSSFWorkbook(fileSystem); のところでOutOfMemoryが出てしまいます。 手順は、 // ファイル入力ストリームを作成 fileIn = new FileInputStream(fileName); // エクセルファイルシステムを作成 fileSystem = new POIFSFileSystem(fileIn); // ワークブックを設定 book = new HSSFWorkbook(fileSystem); // ワークシートを設定 sheet = book.getSheet(sheetName); マシンメモリは512なのですが、これくらいはいけないと困りますよね。 なにかアドバイスをお願いします。 OS:WinXPPro JDK:1.4.2 POI:poi-2.5.1-final-20040804.jar

    • ベストアンサー
    • Java
  • 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
  • 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
  • POIの出力場所について

    お世話になります。 POI 出力などで検索を行いましたが上手くHITしませんでしたのでご質問させて頂きます。 例えば HSSFWorkbook workbook = null; FileOutputStream out = null; out = new FileOutputStream("質問.xls"); workbook.write(out); など記述し出力すると思うのですが「質問.xls」を C:\testに指定して出力したいなど指定した階層に出力するということは出来るでしょうか。

    • ベストアンサー
    • Java
  • excel vba

    テーブル情報に基づきシートをコピーするVBAマクロを記述したい。 ExcelのBook111のSheet1に次のような データが入っています。 (1、2)セルにn=3という数字が入っているものとします。 その数値に合わせて、この場合は3なので Sub Sample01() Workbooks("Book3.xls").Worksheets("booksheet3").Copy After:=Workbooks("Book111.xls").Sheet(1) End Sub のようなつまり、booksheet3なるシートをBook111(固定なBOOK)にコピーしようとしています。 このようなことをVBAで書くにはどうすればいいのでしょうか。 ただしBook名とシート名はあくまでデータの値にもとづいたデータをもってくることになります。 要するに間接参照したデータに基づき処理するのをどのように記述するかという質問です。 A列 B列 1 回数 n=3 2     3     4 Book1.xls book1sheet ←n=1 5 Book2.xls book2sheet ←n=2 6 Book3.xls book3sheet ←n=3 7 Book4.xls book4sheet 8 Book5.xls book5sheet 9 Book6.xls book6sheet ←n=6 10 Abc,xls Defsheet ←n=7

  • 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()); } } }

    • ベストアンサー
    • Java
  • POIのHSSFを用いたエクセルでのフォント指定について

    POIのHSSFについてお教えください。 JDK1.5.0_12 / poi-3.0.2を使用しています。 フォントは、デフォルトでは "Arial" なので、セル毎に"MS 明朝"を指定すると、初めはMS明朝に変更できたのですが、そのうち"表示形式を追加できません。" とエクセルに表示され、エクセルが開けなくなりました。調べると、ブックに含まれるセルの書式の組み合わせが約 4,000 を超える場合に発生し、すべてのセルに同じフォントを使用すると、書式設定の組み合わせ数が減少するとのこと。HSSFで、デフォルトのフォントをワークブックまたはシート指定で直接変更することはできるのでしょうか。 下記が、今回のコードの一部です。 HSSFWorkbook wb = new HSSFWorkbook(); HSSFFont font1 = wb.createFont(); font1.setFontName("MS 明朝"); を指定し、以下を、行毎に、セルの数だけ(CellPositionを変動)繰り返しました。 HSSFCell cell = row.createCell((short)CellPosition); HSSFCellStyle style1 = wb.createCellStyle(); style1.setFont(font1); cell.setCellStyle(style1); 宜しくお願い致します。

    • ベストアンサー
    • Java
  • 他のブックから任意のシートをコピーするVBA

    以下についてお手数ですがご教示いただけませんでしょうか。 【前提条件】  BOOK1.xlsとBOOK2.xlsが同じフォルダにあります。 【行いたいこと】  BOOK1.xlsで、  1.BOOK2.xlsを選んで、  2.BOOK2.xlsに存在するするシート名を選択させ、  3.選択したBOOK2.xlsの任意のシートをBOOK1.xlsにコピーする  

  • Excel VBA別ブックのシートをコピーするには

    Excel2010のVBAで別ブックのシートをコピーしてくる方法 Excelファイル(C:\test\BOOK2.xls)のシート名が TESTというシートを自分のExcelファイル(C:\doc\BOOK1.xls)に コピーするにはどのように記述すればよいのでしょうか。 ・コピー先:自分のExcelファイル(C:\doc\BOOK1.xls)  VBAのコードがあるファイルです ・コピー元:C:\test\BOOK2.xlsのTESTシート  なお、TESTシートを持つ同じ名前(BOOK2.xls)のファイルが  別フォルダにもあります   Workbooks( )の引数にファイル名(BOOK2.xls)は指定できるのですが、 フルパス名(C:\test\BOOK2.xls)で指定できないので困っています。

  • エクセル

    Book1 A1セルにBook2 A1,B1,C1(同一シート)いずれかに文字あるいは数値が入力された場合 Book1 A1にリンクするようにしたいのですが =[Book2.xls]Sheet1!A1&[Book2.xls]Sheet1!B1&[Book2.xls]Sheet1!C1 とすると今後D,E・・・・と続くとすごく長い式になってしまいます。 これをもっと簡単な式に出来ないものでしょうか。(エクセル2003使用) ヨロシクお願いします。