POI 加密,解密xlsx文件

2020-11-09  本文已影响0人  __元昊__

加密:

目前发现这种加密方式只支持 XSSFWorkbook创建的excel文件(Excel 2007 OOXML (.xlsx)格式),对于HSSFWorkbook不支持;

POI的jar包自己去官网下载。
<poi.version>3.12</poi.version> poi3.12版本以后好使之前版本莫名报错

加密:

@Test
public void encryptExcel_xlsx() throws Exception {
    //构建XSSFWorkbook
    XSSFWorkbook hssfWorkbook = new XSSFWorkbook();
    XSSFSheet sheet1 = hssfWorkbook.createSheet("sheet1");
    XSSFRow row1 = sheet1.createRow(0);
    XSSFCell cell1 = row1.createCell(0);
    cell1.setCellValue("cell1");
    cell1.setCellType(CellType.STRING);
    XSSFCell cell2 = row1.createCell(1);
    cell2.setCellValue(2);
    cell2.setCellType(CellType.NUMERIC);

    //保存此XSSFWorkbook对象为xlsx文件
    hssfWorkbook.write(new FileOutputStream(TEST_WORKBOOK_NAME));

    POIFSFileSystem fs = new POIFSFileSystem();
    EncryptionInfo info = new EncryptionInfo(EncryptionMode.standard);
    //final EncryptionInfo info = new EncryptionInfo(EncryptionMode.agile, CipherAlgorithm.aes256, HashAlgorithm.sha256, -1, -1, null);
    Encryptor enc = info.getEncryptor();

    //设置密码
    enc.confirmPassword(USER_PASSWORD);

    //加密文件
    OPCPackage opc = OPCPackage.open(new File(TEST_WORKBOOK_NAME), PackageAccess.READ_WRITE);
    OutputStream os = enc.getDataStream(fs);
    opc.save(os);
    opc.close();

    //把加密后的文件写回到流
    FileOutputStream fos = new FileOutputStream(TEST_WORKBOOK_NAME);
    fs.writeFilesystem(fos);
    fos.close();

}

解密:解密也只支持XSSFWorkbook创建的excel文件

有两种方式:

@Test
public void decryptExcel_xlsx1() throws IOException {
    Workbook wb = null;
    FileInputStream in = null;
    try {
        in = new FileInputStream(TEST_WORKBOOK_NAME);//读取xlsx文件
        wb = WorkbookFactory.create(in,USER_PASSWORD);//设置密码打开
    } catch (Exception e) {
        e.printStackTrace();
    }finally {
        in.close();
    }
    System.out.println("=================================");
    System.out.println("Number of Sheets:" + wb.getNumberOfSheets());
    System.out.println("Sheet3's name:" + wb.getSheetName(0));
    System.out.println();
}

第二种

@Test
public void decryptExcel_xlsx2() throws Exception{
    Workbook wb = null;
    FileInputStream in = null;
    try {
        in = new FileInputStream(TEST_WORKBOOK_NAME);
        POIFSFileSystem poifsFileSystem = new POIFSFileSystem(in);
        EncryptionInfo encInfo = new EncryptionInfo(poifsFileSystem);
        Decryptor decryptor = Decryptor.getInstance(encInfo);
        decryptor.verifyPassword(USER_PASSWORD);
        wb = new XSSFWorkbook(decryptor.getDataStream(poifsFileSystem));
    } catch (Exception e) {
        e.printStackTrace();
    }finally {
        in.close();
    }
    System.out.println("=================================");
    System.out.println("Number of Sheets:" + wb.getNumberOfSheets());
    System.out.println("Sheet3's name:" + wb.getSheetName(0));
    System.out.println();
}

对于HSSFWorkbook文件的加密:目前只知道一种保护加密,就是加密后还是能以只读打开,如果修改就需要输入密码,百度说有一个付费的jar包支持加密,jxcell.jar

@Test
public void test1() throws IOException {
    HSSFWorkbook hssfWorkbook = new HSSFWorkbook();

    HSSFSheet myseet = hssfWorkbook.createSheet("myseet");
    HSSFSheet sheet2 = hssfWorkbook.createSheet("sheet2");
    // 在索引0的位置创建行(最顶端的行)
    HSSFRow hssfRow = myseet.createRow(0);
    //在索引0的位置创建单元格(左上端)
    HSSFCell cell = hssfRow.createCell(0);
    // 定义单元格为字符串类型
    cell.setCellType(CellType.STRING);
    // 在单元格中输入一些内容
    cell.setCellValue("poi生成Excel");

    OutputStream out = new FileOutputStream(userDir + "\\src\\test1.xlsx");

    //加密
    hssfWorkbook.writeProtectWorkbook(USER_PASSWORD,"admin");
    hssfWorkbook.write(out);
    out.close();
}

jxcell方式加密、解密

@Test
public void encryptExcel_xls() {
    try {
        View view = new View();
        view.read(TEST_WORKBOOK_NAME);//这是一个路径
        view.write(TEST_WORKBOOK_NAME, USER_PASSWORD); //参数为文件路径和密码

    } catch (Exception e) {
        e.printStackTrace();
    }
}
@Test
public void decryptExcel_xls() {
    try {
        View view = new View();
        view.read(TEST_WORKBOOK_NAME,USER_PASSWORD);
        view.write(TEST_WORKBOOK_NAME);

    } catch (Exception e) {
        e.printStackTrace();
    }
}
上一篇下一篇

猜你喜欢

热点阅读