5

POIを学んだばかりですが、HSSFはExcelファイル(.xls)の読み取りと作成が非常に簡単であることがわかりました。しかし、パスワードで保護されたExcelを読みたいときに問題が見つかりました。インターネットでこの解決策を見つけるのに1時間かかりました。

この問題を解決するのを手伝っていただけませんか。コードスニペットを教えていただければ幸いです。

ありがとうございました。

4

6 に答える 6

7

http://poi.apache.org/encryption.htmlを参照してください-ApachePOIの最近の十分なコピー(例:3.8)を使用している場合は、暗号化された.xlsファイル(HSSF)と.xlsxファイル(XSSF)を復号化できます(パスワードを持っていることを証明します!)

現時点では、暗号化されたExcelファイルを書き出すことはできませんが、暗号化されていないファイルのみを書き出すことができます。

于 2011-06-12T13:54:58.607 に答える
4

質問を書いた時点では、ApachePOIを使用するのは簡単ではありませんでした。それ以来、サポートは長い道のりを歩んできました

最近では、パスワードで保護されたExcelファイルを開きたい場合は、パスワードを知っているかどう.xlsかに関係なく、WorkbookFactory.create(File、Password)を使用するだけです。.xlsx

File input = new File("password-protected.xlsx");
String password = "nice and secure";
Workbook wb = WorkbookFactory.create(input, password);

これにより、ファイルの種類が識別され、指定されたパスワードで復号化されて開かれます。その後、通常どおり内容を読むことができます

于 2015-08-20T17:58:50.760 に答える
2

これは、保護されたExcelファイルを読み込み、パスワードを使用して復号化し、保護されていないExcelファイルを書き出す完全なサンプルコードです。

    public static void readProtectedBinFile() {
    try {

        InputStream inp = new FileInputStream("c:\\tmp\\protectedFile.xls");
        org.apache.poi.hssf.record.crypto.Biff8EncryptionKey.setCurrentUserPassword("abracadabra"); 

        Workbook wb;
        wb = WorkbookFactory.create(inp);

        // Write the output to a file
        FileOutputStream fileOut;
        fileOut = new FileOutputStream("c:\\tmp\\unprotectedworkbook.xlsx");
        wb.write(fileOut);
        fileOut.close();
    } catch (InvalidFormatException e) {
        e.printStackTrace();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

}
于 2012-12-07T18:42:19.257 に答える
1

これは、完全なサンプルコードとして.xlsおよび.xlsx(パスワードで保護されているまたはパスワードで保護されていない)をチェックするReadExcelファイルのコードです。

 private Workbook createWorkbookByCheckExtension() throws IOException, InvalidFormatException {
                Workbook workbook = null;
                String filePath = "C:\\temp\\TestProtectedFile.xls";
                String fileName = "TestProtectedFile.xls";
                String fileExtensionName = fileName.substring(fileName.indexOf("."));
                if (fileExtensionName.equals(".xls")) {                         
                    try {
                        FileInputStream fileInputStream = new FileInputStream(new File(filePath));
                        workbook = new HSSFWorkbook(fileInputStream);                               
                    } catch (EncryptedDocumentException e) {
                        // Checking of .xls file with password protected.
                        FileInputStream fileInputStream = new FileInputStream(new File(filePath));
                        Biff8EncryptionKey.setCurrentUserPassword("password");
                        workbook = new HSSFWorkbook(fileInputStream);
                    }                           
                } else if (fileExtensionName.equals(".xlsx")){
                    // Checking of .xlsx file with password protected.
                    String isWorkbookLock = "";
                    InputStream is = null;
                    is = new FileInputStream(new File(filePath));
                    if (!is.markSupported()) {
                        is = new PushbackInputStream(is, 8);
                    }

                    if (POIFSFileSystem.hasPOIFSHeader(is)) {
                        POIFSFileSystem fs = new POIFSFileSystem(is);
                        EncryptionInfo info = new EncryptionInfo(fs);
                        Decryptor d = Decryptor.getInstance(info);
                        try {
                            d.verifyPassword("password");
                            is = d.getDataStream(fs);
                            workbook = new XSSFWorkbook(OPCPackage.open(is));
                            isWorkbookLock = "true";
                        } catch (GeneralSecurityException e) {
                            e.printStackTrace();
                        }               
                    }           
                    if (isWorkbookLock != "true") {
                        FileInputStream fileInputStream = new FileInputStream(new File(filePath));
                        workbook = new XSSFWorkbook(fileInputStream);
                    }
                }
                return workbook;
            }
于 2015-08-20T04:47:34.140 に答える
0

ラビは正しいです。パスワードで保護されているが、POIで暗号化されたファイルを読み取ることはできないようです。http://osdir.com/ml/user-poi.apache.org/2010-05/msg00118.htmlを参照してください。次のコードは、ファイルのトレースを出力します

POIFSLister lister = new POIFSLister();
lister.viewFile(spreadsheetPath, true);

暗号化に関する出力が得られた場合、POIでファイルを開くことはできません。

于 2010-06-28T10:22:48.167 に答える
0

POIは暗号化されたワークブックを読み取ることができなくなります。つまり、ワークブック全体(シートだけでなく)を保護している場合、 POIはそれを読み取ることができなくなります。それ以外の場合は、機能するはずです。

于 2009-11-06T01:05:29.823 に答える