加密:
目前发现这种加密方式只支持 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();
}
}