java生成excel表格,并将excel表格加密压缩

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: POI提供了一些API,可以是java程序对Microsoft Office的读和写;zip4j提供非常友好的zip加密压缩; 某电商平台,需要把供应商销售数据导出为excel表单,为了安全加密为zip压缩包,方便发给供应商对账。

(一)java生成excel表格,并将excel表格加密压缩

1.1 技术选型

springboot、poi、zip4j、lombok、spring-test

POI EXCEL文档结构类

序号 类名                 用途

1 HSSFWorkbook excel文档对象

2 HSSFSheet excel的sheet

3 HSSFRow excel的行

4 HSSFCell excel的单元格

5 HSSFFont excel字体

6 HSSFName 名称

7 HSSFDataFormat 日期格式

8 HSSFHeader sheet头

9 HSSFFooter sheet尾

10 HSSFCellStyle cell样式

11 HSSFDateUtil 日期

12 HSSFPrintSetup 打印

13 HSSFErrorConstants 错误信息表

1.2 业务流程

1.2.1 需求背景

POI提供了一些API,可以是java程序对Microsoft Office的读和写;

zip4j提供非常友好的zip加密压缩;

         某电商平台,需要把供应商销售数据导出为excel表单,为了安全加密为zip压缩包,方便发给供应商对账。

  1. ZIP4J 是一个支持处理ZIP文件的开源库
  2. 支持创建,修改,添加,删除,解压 压缩文件
  3. 支持读/写密码保护
  4. 支持AES加密 128/256
  5. 支持标准ZIP加密
  6. 支持进度监视器
  7. 自持Unicode 文件名
  8. 支持创建分卷压缩文件
  9. 支持将文件添加到压缩包中但不进行压缩

1.3 导入jar包

【pom.xml】

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!--生成excel 需要poijar包 --><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>5.0.0</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>5.0.0</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-scratchpad</artifactId><version>5.0.0</version></dependency><!--lombok jar --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><!--测试--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId></dependency><!--压缩文件 需要zip4j包 --><dependency><groupId>net.lingala.zip4j</groupId><artifactId>zip4j</artifactId><version>1.3.2</version></dependency>

1.4 供应商实体类

【代码】

@Data@AllArgsConstructor@NoArgsConstructor@Builder(toBuilder=true)
publicclassSupDetailsRankingVO {
//供应商IDprivateintsid;
//供应商名称privateStringname;
//订单数量privateintorderVolume;
//采购成本privateBigDecimalpurchasingCost;
//订单数量排名privateintorderVolumeRanking;
//统计时间privateStringstatisticsDate;
}

1.5 准备供应商列表

【代码】

//供应商数据publicstaticList<SupDetailsRankingVO>getListSup() {
List<SupDetailsRankingVO>supDetailsRankingVOList=newArrayList<SupDetailsRankingVO>();
for (inti=0; i<10; i++) {
SupDetailsRankingVOsvo=newSupDetailsRankingVO();
svo.setSid(i+1000);
svo.setName("供应商:"+i);
svo.setOrderVolume(i+998);
svo.setPurchasingCost(newBigDecimal(i*666));
svo.setOrderVolumeRanking(i);
Datedate=newDate();
SimpleDateFormatformatter=newSimpleDateFormat("yyyy-MM-dd HH:mm:ss");
StringdateString=formatter.format(date);
svo.setStatisticsDate(dateString);
supDetailsRankingVOList.add(svo);
    }
returnsupDetailsRankingVOList;
}

1.6 生成供应商-统计excel表格

1.6.1 EXCEL常用操作方法

得到Excel常用对象//得到POI文件系统POIFSFileSystemfs=newPOIFSFileSystem(newFileInputStream("d:/test.xls")); 
//得到Excel工作簿对象   HSSFWorkbookwb=newHSSFWorkbook(fs);  
//得到Excel工作表对象   HSSFSheetsheet=wb.getSheetAt(0);   
//得到Excel工作表的行   HSSFRowrow=sheet.getRow(i);  
//得到Excel工作表指定行的单元格   HSSFCellcell=row.getCell((short) j);  
//得到单元格样式  cellStyle=cell.getCellStyle();
建立Excel常用对象//创建Excel工作簿对象HSSFWorkbookwb=newHSSFWorkbook();  
//创建Excel工作表对象 HSSFSheetsheet=wb.createSheet("new sheet");   
//创建Excel工作表的行  HSSFRowrow=sheet.createRow((short)0); 
//创建单元格样式  cellStyle=wb.createCellStyle();
//创建Excel工作表指定行的单元格 row.createCell((short)0).setCellStyle(cellStyle);  
//设置Excel工作表的值  row.createCell((short)0).setCellValue(1); 
设置sheet名称和单元格内容wb.setSheetName(1, "第一张工作表",HSSFCell.ENCODING_UTF_16);          
cell.setEncoding((short) 1);      
cell.setCellValue("单元格内容");  
获取sheet的数目wb.getNumberOfSheets();
根据index取得sheet对象HSSFSheetsheet=wb.getSheetAt(0);  
取得有效的行数introwcount=sheet.getLastRowNum();  
取得一行的有效单元格个数row.getLastCellNum();   
单元格值类型读写//设置单元格为STRING类型  cell.setCellType(HSSFCell.CELL_TYPE_STRING); 
//读取为数值类型的单元格内容  cell.getNumericCellValue();

1.6.2 实际操作

【代码】

//获取生成的供应商 统计excel路径publicstaticStringgetExcelUrl(List<SupDetailsRankingVO>supDetailsRankingVOList) throwsException {
// 读取源文件InputStreamfis=ttServiceImpl.class.getResourceAsStream("/excelTemplate/salesReportExcelTemplate/supDetailsRankingEmail.xlsx");
XSSFWorkbookworkBook=newXSSFWorkbook(fis);
StringsupplierName="供应商销售排名";
// 进行模板操作XSSFSheetsheet=workBook.getSheetAt(0);
workBook.setSheetName(0, supplierName); // 给sheet命名//设置excel模板详情intt=0;
XSSFRowrow=sheet.createRow(++t);
XSSFCellcell1=null;
for (inti=0;i<supDetailsRankingVOList.size();i++){
SupDetailsRankingVOsdr=supDetailsRankingVOList.get(i);
//外层需要合并的初始列数intcol=0;
//供应商名字+IDcell1=row.createCell(col);
cell1.setCellValue("(ID: "+sdr.getSid()+")");
//供应商名字cell1=row.createCell(++col);
cell1.setCellValue(sdr.getName());
//供应商订单数量cell1=row.createCell(++col);
cell1.setCellValue(sdr.getOrderVolume());
//供应商采购成本cell1=row.createCell(++col);
cell1.setCellValue("");
//供应商订单数量-排名cell1=row.createCell(++col);
cell1.setCellValue(sdr.getOrderVolumeRanking());
//统计时间cell1=row.createCell(++col);
cell1.setCellValue(sdr.getStatisticsDate());
row=sheet.createRow(++t);
    }
// 输出为一个新的Excel,也就是动态修改完之后的excelStringfileName=supplierName+System.currentTimeMillis() +".xlsx";
StringfileURL="D:/"+fileName;
OutputStreamout=newFileOutputStream(fileURL);
workBook.write(out);
fis.close();
out.flush();
out.close();
returnfileURL;
}

1.7 压缩单个excel文件,格式zip并加密

  1. 传入需要压缩的文件路径,输出zip压缩包的文件夹,设置压缩密码
  2. 删除原文件excel要注意,关闭文件流,才能执行删除,否则是被占用无法删除
  3. file.delete()不会报错,只会返回false删除失败

【代码】

/*** 压缩单个文件并加密*/publicstaticStringzipFile(Stringfile, StringfileOutPath, StringpassWord) throwsException {
FileInputStreamfileInputStream=newFileInputStream(file);
ZipParametersparameters=newZipParameters();
// 压缩方式parameters.setCompressionMethod(Zip4jConstants.COMP_DEFLATE);
// 压缩级别parameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL);
// 开启加密parameters.setSourceExternalStream(true);
// 文件名称StringfileName=newFile(file).getName();
parameters.setFileNameInZip(fileName);
if (!"".equals(passWord)) {
parameters.setEncryptFiles(true);
// 加密方式parameters.setEncryptionMethod(Zip4jConstants.ENC_METHOD_STANDARD);
// 设置加密密码parameters.setPassword(passWord.toCharArray());
    }
//zip压缩后的名字StringzipName=fileOutPath+fileName.substring(0,fileName.indexOf(".xlsx"))+".zip";
try {
ZipFilezipFile=newZipFile(zipName);
zipFile.addStream(fileInputStream, parameters);
//关流fileInputStream.close();
//删除源文件 exceldeleteFile(file);
    } catch (ZipExceptione) {
e.printStackTrace();
    }
returnzipName;
}

1.8 压缩完成后,删除excel源文件

【代码】

/*** 删除文件*/publicstaticbooleandeleteFile(StringsPath) throwsIOException {
booleanflag=false;
Filefile=newFile(sPath);
// 路径为文件且不为空则进行删除if (file.isFile() &&file.exists()) {
flag=file.delete();
    }
returnflag;
}

1.9 测试

【代码】

@TestpublicvoidtestExcel01() throwsException {
//获取数据List<SupDetailsRankingVO>supDetailsRankingVOList=ExcelUtil.getListSup();
//获取供应商 excle路径StringexcelUrl=ExcelUtil.getExcelUrl(supDetailsRankingVOList);
System.out.println(excelUrl);
//压缩为zip,并且加密,返回zip压缩包路径Stringzipurl=ExcelUtil.zipFile(excelUrl,"D:/","test-mima");
System.out.println(zipurl);
}

(二)结果展示

2.1 excel模板位置

2.2 excel前后数据对比

模板

数据填充后

zip加密后

目录
相关文章
|
1月前
|
Java API Apache
Java编程如何读取Word文档里的Excel表格,并在保存文本内容时保留表格的样式?
【10月更文挑战第29天】Java编程如何读取Word文档里的Excel表格,并在保存文本内容时保留表格的样式?
136 5
|
1月前
|
Java BI API
Java Excel报表生成:JXLS库的高效应用
在Java应用开发中,经常需要将数据导出到Excel文件中,以便于数据的分析和共享。JXLS库是一个强大的工具,它基于Apache POI,提供了一种简单而高效的方式来生成Excel报表。本文将详细介绍JXLS库的使用方法和技巧,帮助你快速掌握Java中的Excel导出功能。
70 6
|
1月前
|
SQL 数据可视化 数据挖掘
想让Excel表格设计更美观?试试这几款好用工具!
Excel表格设计在项目管理和数据分析中至关重要。本文推荐四款辅助工具:板栗看板、Excel自动图表助手、Think-Cell Chart 和 Power BI,分别在任务管理、图表生成、数据可视化等方面表现突出,帮助你设计出更专业、美观的表格。
76 2
|
1月前
|
Java API Apache
|
2月前
|
数据安全/隐私保护 Python
Zipfile学习笔记(二)::通过zipfile模块暴力破解加密的压缩文件
如何使用Python的zipfile模块生成密码表并尝试暴力破解加密的ZIP压缩文件。
50 1
Zipfile学习笔记(二)::通过zipfile模块暴力破解加密的压缩文件
|
1月前
|
存储 Java API
Java实现导出多个excel表打包到zip文件中,供客户端另存为窗口下载
Java实现导出多个excel表打包到zip文件中,供客户端另存为窗口下载
70 4
|
2月前
|
JavaScript 前端开发 数据处理
Vue导出el-table表格为Excel文件的两种方式
Vue导出el-table表格为Excel文件的两种方式
110 6
|
2月前
|
Java Maven 数据安全/隐私保护
如何实现Java打包程序的加密代码混淆,避免被反编译?
【10月更文挑战第15天】如何实现Java打包程序的加密代码混淆,避免被反编译?
229 2
|
2月前
|
easyexcel Java UED
SpringBoot中大量数据导出方案:使用EasyExcel并行导出多个excel文件并压缩zip后下载
在SpringBoot环境中,为了优化大量数据的Excel导出体验,可采用异步方式处理。具体做法是将数据拆分后利用`CompletableFuture`与`ThreadPoolTaskExecutor`并行导出,并使用EasyExcel生成多个Excel文件,最终将其压缩成ZIP文件供下载。此方案提升了导出效率,改善了用户体验。代码示例展示了如何实现这一过程,包括多线程处理、模板导出及资源清理等关键步骤。
|
2月前
|
安全 Java Android开发
JavaWeb解压缩漏洞之ZipSlip与Zip炸弹
JavaWeb解压缩漏洞之ZipSlip与Zip炸弹
80 5