(一)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压缩包,方便发给供应商对账。
- ZIP4J 是一个支持处理ZIP文件的开源库
- 支持创建,修改,添加,删除,解压 压缩文件
- 支持读/写密码保护
- 支持AES加密 128/256
- 支持标准ZIP加密
- 支持进度监视器
- 自持Unicode 文件名
- 支持创建分卷压缩文件
- 支持将文件添加到压缩包中但不进行压缩
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 供应商实体类
【代码】
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并加密
- 传入需要压缩的文件路径,输出zip压缩包的文件夹,设置压缩密码
- 删除原文件excel要注意,关闭文件流,才能执行删除,否则是被占用无法删除
- 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 测试
【代码】
publicvoidtestExcel01() 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加密后