web-dev-qa-db-ja.com

Apache POIを使用してパスワードで保護されたExcelファイルを作成しますか?

(Apache POI)APIを使用してExcelファイルを作成するための単純なJavaプログラムを開発しています。データベースとしてOracle10gを使用し、ojdbc14JARファイルを使用しています。

USERNAMEPASSWORD、およびNAME.の3つの列を持つUSERINFOというテーブルがあります。ApachePOIを使用して、すべての行をExcelファイルに入れることができました。 。

ファイルにはユーザー名やパスワードなどの機密データが含まれているため、パスワードで保護したいと思います。フォーラムで、パスワードで保護されたファイルを読み取る方法を見つけましたが、作成する方法は見つかりませんでした。では、どうすればこれを達成できますか?

13
vikiiii

更新:バージョン3.10以降、POIはXLSXファイルの暗号化と復号化をサポートします。 POIのWebサイトの「暗号化サポート」ページ を参照してください。以下は、XLSバイナリワークブックに引き続き関連しています。

POIのWebサイトの「暗号化サポート」ページ によると、POIは暗号化されたXLSおよびXLSXファイルの読み取りをサポートしています。そのページでは暗号化について言及されていません。これは、暗号化がサポートされていないことを意味します。これは POIサイトで「暗号化」を検索する によってバックアップされます。これは、すべて復号化に関する結果のほんの一握りを返します。また、復号化のみを処理しているように見える暗号化実装のソースも調べました。これは驚くべきことではありません。 POIは、新しいスプレッドシートを作成するためではなく、データ抽出と検索インデックス作成のために設計されています。

他の人が示唆しているように、Excelでテンプレートを作成し、POIを使用してデータを入力することで、POIで欠落している機能を回避できることがよくあります。残念ながら、暗号化されたスプレッドシートのファイル形式は根本的に異なるため、暗号化では機能しません。

商用ソフトウェアにお金を払っても構わないと思っているなら、最新バージョンの ExtenXLS は、Excelでサポートされているすべての暗号化形式の完全な読み取りおよび書き込みサポートを備えています。通常のEncryptedWorkBookHandleの代わりにWorkBookHandleを作成するだけです。これは、変更されていないJRE、XLSの場合はRC4、XLSXの場合は128ビットAESでサポートされている最強の暗号を使用します。 OOXMLで256ビットAESを使用する場合で、 JCE無制限ポリシー をインストールしている場合は、MSOfficeEncrypterクラスを使用して使用できます。

JExcelAPI 、人気のあるオープンソースJavaスプレッドシートAPI、暗号化をまったくサポートしていないようです。 Aspose.Cells 、商用製品、 強力な暗号化をサポート 。Actuateのe.Spreadsheetのドキュメントがネットから消えたようで、暗号化をサポートしているかどうかわかりません。

自由に利用できるJavaスプレッドシートAPIはいずれも、暗号化されたスプレッドシートの作成をサポートしていないようです。商用ソフトウェアを使用したくない場合は、回避策を考え出す必要があります。たとえば、スプレッドシートを暗号化されたZipファイルに書き込みます。Java.util.Zipは暗号化をサポートしていませんが、 Zip4j はサポートしているようです。

完全開示:私はExtenXLSの背後にある会社であるExtentechで働いています。

15
Sam Hanes

パスワードで保護されたExcelファイルを作成するか、既存のテンプレートを使用してパスワードで保護します。ただし、これにより、ユーザーには「読み取り専用」アクセスが許可されます。これは、パスワード「secret」を持つExcelファイルがある例です。

import Java.io.BufferedInputStream;
import Java.io.FileInputStream;
import Java.io.FileOutputStream;
import Java.io.IOException;
import org.Apache.poi.hssf.record.crypto.Biff8EncryptionKey;
import org.Apache.poi.hssf.usermodel.HSSFRow;
import org.Apache.poi.hssf.usermodel.HSSFSheet;
import org.Apache.poi.hssf.usermodel.HSSFWorkbook;
import org.Apache.poi.poifs.filesystem.POIFSFileSystem;
import org.Apache.poi.ss.usermodel.Cell;

public class ProtectedExcelFile {

    public static void main(final String... args) throws Exception {

        String fname = "C:\\Documents and Settings\\sadutta\\Desktop\\sample.xls";

        FileInputStream fileInput = null;
        BufferedInputStream bufferInput = null;
        POIFSFileSystem poiFileSystem = null;
        FileOutputStream fileOut = null;

        try {
            fileInput = new FileInputStream(fname);
            bufferInput = new BufferedInputStream(fileInput);
            poiFileSystem = new POIFSFileSystem(bufferInput);

            Biff8EncryptionKey.setCurrentUserPassword("secret");
            HSSFWorkbook workbook = new HSSFWorkbook(poiFileSystem, true);
            HSSFSheet sheet = workbook.getSheetAt(0);

            HSSFRow row = sheet.createRow(0);
            Cell cell = row.createCell(0);

            cell.setCellValue("THIS WORKS!");

            fileOut = new FileOutputStream(fname);
            workbook.writeProtectWorkbook(Biff8EncryptionKey.getCurrentUserPassword(), "");
            workbook.write(fileOut);
        }
        catch (Exception ex) {

            System.out.println(ex.getMessage());
        }
        finally {
            try {

                bufferInput.close();
            }
            catch (IOException ex) {

                System.out.println(ex.getMessage());
            }

            try {

                fileOut.close();
            }
            catch (IOException ex) {

                System.out.println(ex.getMessage());
            }
        }
    }
}

同じ方法で、既存のテンプレートを作成または変更できるはずです。完了したら、テンプレートを上書きします。テンプレートを何度も使用する必要がある場合は、テンプレートを別の場所にコピーしてから、コードを使用して変更することをお勧めします。

8
Sajal Dutta

POIでよくあることですが、より複雑な作業を行うには、Excelで高度な機能(マクロなど)を使用してスプレッドシートを作成し、POIを使用してスプレッドシートを読み取り、データを入力して書き出すのが便利です。 POIは通常、スプレッドシートの機能を維持し、データを追加します。

パスワードについては試していませんが、実験する価値があると思います。

詳細については、 ビジー開発者ガイド を参照してください。

4
Brian Agnew