分享一个关于下载加密excel的方法;
核心思想就是将workbook的数据流到内容,通过POIFSFileSystem进行包装加密,最终将数据流写到response流里面;
关于代码中的writer是引用hutool的操作excel的工具类;大家不必在此费脑哦
后续博主可以再写一个完整的demo
@Override
public boolean downloadExcel(ExcelWriter writer, String password, String fileName, String fileSuffix) {
if (Objects.isNull(writer) || StringUtils.isAnyBlank( fileName, fileSuffix)) {
log.error("ExcelServiceImpl downloadEncryptExcel params is null!");
return false;
}
HttpServletResponse response = ((ServletRequestAttributes) (RequestContextHolder.currentRequestAttributes())).getResponse();
if (Objects.isNull(response)) {
log.error("ExcelServiceImpl downloadExcel fail,response is null!");
return false;
}
boolean result = false;
ServletOutputStream out = null;
try {
// String finalFileName = String.valueOf(URLEncoder.encode(fileName + fileSuffix, "UTF-8"));
String finalFileName = fileName + fileSuffix;
response.setHeader("Content-Disposition", "attachment;filename=".concat(finalFileName));
response.setContentType("application/vnd.ms-excel;charset=utf-8");
out = response.getOutputStream();
result = true;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
Workbook workbook = writer.getWorkbook();
// 临时存储流到内存
workbook.write(baos);
baos.flush();
if (StringUtils.isNotBlank(password)) {
ByteArrayInputStream workbookInput = new ByteArrayInputStream(baos.toByteArray());
final POIFSFileSystem fs = new POIFSFileSystem();
final EncryptionInfo info = new EncryptionInfo(EncryptionMode.standard);
final Encryptor enc = info.getEncryptor();
enc./confirm/iPassword(password);
final OPCPackage opc = OPCPackage.open(workbookInput);
final OutputStream os = enc.getDataStream(fs);
opc.save(os);
opc.close();
baos = new ByteArrayOutputStream();
fs.writeFilesystem(baos);
baos.flush();
}
baos.writeTo(out);
baos.close();
} catch (Exception e) {
log.error("ExcelServiceImpl downloadExcel error:{} :", e);
} finally {
if (null != out) {
IoUtil.close(out);
} else {
writer.close();
}
}
return result;
}



