美文网首页
POI 加密,解密xlsx文件

POI 加密,解密xlsx文件

作者: __元昊__ | 来源:发表于2020-11-09 08:46 被阅读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();
        }
    }
    

    相关文章

      网友评论

          本文标题:POI 加密,解密xlsx文件

          本文链接:https://www.haomeiwen.com/subject/tbzkbktx.html