java - 如何在java中读取受密码保护的.xls文件?

标签 java apache-poi xls

我有一个代码可以在java中读取 protected Excel,但是该代码给了我错误。 我的java代码。

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.security.GeneralSecurityException;
import java.util.Iterator;

import org.apache.poi.hssf.usermodel.HSSFCell;
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.crypt.Decryptor;
import org.apache.poi.poifs.crypt.EncryptionInfo;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;

public class REadProtectedExcel {
    public static void main(String[] args) {
        String fname = "D:/Vijay/BRS_docs/10168/20.11.2014/20.11.2014/JCR_30.12.14_I Pay.xls";
        try {
            POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream(fname));
            EncryptionInfo info = new EncryptionInfo(fs);
            Decryptor d = Decryptor.getInstance(info);
            if (d.verifyPassword("vijay")) {
                System.out.println("Password correct");
                FileInputStream fis = new FileInputStream(fname);
                HSSFWorkbook workbook = new HSSFWorkbook(fis);
                HSSFSheet sheet = workbook.getSheetAt(0);
                Iterator rowIter = sheet.rowIterator();
                while (rowIter.hasNext()) {
                    HSSFRow myRow = (HSSFRow) rowIter.next();
                    Iterator cellIter = myRow.cellIterator();
                    while (cellIter.hasNext()) {
                        String cellvalue = "";
                        HSSFCell myCell = (HSSFCell) cellIter.next();
                        if (myCell.getCellType() == HSSFCell.CELL_TYPE_STRING) {
                            cellvalue = myCell.getStringCellValue();
                        } else if (myCell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC) {
                            cellvalue = "" + myCell.getNumericCellValue();
                        } else if (myCell.getCellType() == HSSFCell.CELL_TYPE_BOOLEAN) {
                            cellvalue = "" + myCell.getBooleanCellValue();
                        } else if (myCell.getCellType() == HSSFCell.CELL_TYPE_FORMULA) {
                            cellvalue = "" + myCell.getCellFormula();
                        } else if (myCell.getCellType() == HSSFCell.CELL_TYPE_BLANK) {
                            cellvalue = "";
                        }
                        System.out.println("cellvalue--" + cellvalue);
                    }
                }
            } else {
                System.out.println("Password wrong");
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (GeneralSecurityException e) {
            e.printStackTrace();
        }
    }
}

这段代码给了我以下错误。

java.io.FileNotFoundException: no such entry: "EncryptionInfo"
    at org.apache.poi.poifs.filesystem.DirectoryNode.getEntry(DirectoryNode.java:375)
    at org.apache.poi.poifs.filesystem.DirectoryNode.createDocumentInputStream(DirectoryNode.java:177)
    at org.apache.poi.poifs.crypt.EncryptionInfo.<init>(EncryptionInfo.java:45)
    at org.apache.poi.poifs.crypt.EncryptionInfo.<init>(EncryptionInfo.java:39)
    at com.test.arrayList.REadProtectedExcel.main(REadProtectedExcel.java:22)
  • 我正在使用 poi3.9 jar、xmlbeans-2.3.0jar、poi-ooml-3.6
  • 我没有遇到这个问题。提前致谢。
  • 或者请分享另一种读取 .xls 文件的方法。

最佳答案

Apache POI provides documentation on Encryption on the website 。如果您转到Apache POI homepage并查看左侧菜单顶部附近,您会发现它链接在 Encryption Support 下。我强烈建议您阅读它!

随后您将看到,您编写的代码适用于加密的 .xlsx 文件,该文件使用与旧版 .xls 非常不同的方式来保护文件> 文件

正如文档所解释的,对于受密码保护的 .xls 文件,您需要做的就是:

String myPassword = "password";
org.apache.poi.hssf.record.crypto.Biff8EncryptionKey.setCurrentUserPassword(myPassword);
HSSFWorkbook wb = new HSSFWorkbook(stream);

关于java - 如何在java中读取受密码保护的.xls文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27741124/

相关文章:

java - 连接 MYSQL 和 netbeans 7.4

java - 使用 apache poi (.xlsx) 的 excel 2007 无法读取内容

Java从Excel中读取数据

c - C语言如何计算xls文件的MD5

java - 卡片布局问题

java - 为整数列表创建特定模式

java - 如果使用@Bean标签创建一个bean,那么我们可以创建两个bean。每个 applicationContext 如何是单例的

java - 将表格边框设置为粗

java - 将 xls 转换为图像

javascript - 使用 FireFox 下载时无法打开导出为 .xls 的 HTML 表格