继上一个需求后呢,最近又在另一个项目中遇到了一个相似的需求,就是用户要求将业务数据详情中的所有文件全部下载下来方便查看。
需求描述:
a、业务详情文件
b、实现效果
此时业务详情页面有导出按钮,要求导出时,要求所有文件打包成zip压缩包返回给用户,实现效果如下:
c、实现过程
1.添加pom依赖
<dependency> <groupId>org.docx4j</groupId> <artifactId>docx4j-JAXB-MOXy</artifactId> <version>8.3.13</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>5.2.5</version> </dependency> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.13.0</version> </dependency> <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.8.32</version> <scope>compile</scope> </dependency>
2.代码实现
a、文件操作工具类
package com.yinhai.stagetwo.util; import cn.hutool.core.date.DatePattern; import cn.hutool.core.date.DateUtil; import cn.hutool.core.io.FileUtil; import cn.hutool.core.map.MapUtil; import cn.hutool.core.util.ZipUtil; import com.yinhai.stagetwo.entity.export.ProjectData; import org.apache.poi.xwpf.usermodel.*; import org.docx4j.jaxb.Context; import org.docx4j.openpackaging.exceptions.Docx4JException; import org.docx4j.openpackaging.exceptions.InvalidFormatException; import org.docx4j.openpackaging.packages.WordprocessingMLPackage; import org.docx4j.openpackaging.parts.PartName; import org.docx4j.openpackaging.parts.WordprocessingML.AlternativeFormatInputPart; import org.docx4j.openpackaging.parts.WordprocessingML.MainDocumentPart; import org.docx4j.relationships.Relationship; import org.docx4j.wml.CTAltChunk; import javax.xml.bind.JAXBException; import java.io.*; import java.lang.reflect.Field; import java.net.HttpURLConnection; import java.net.URL; import java.nio.file.Files; import java.nio.file.Paths; import java.util.*; /** * @author gc * @date 2025/1/6 14:11 */ public class GenerateOnWordTemplateKit { public static final String TEMPLATE_PATH = "本地项目地址 + /src/main/resources/template/"; public static final String FILE_PATH = TEMPLATE_PATH + "file/"; public static final String OUTPUT_PATH = TEMPLATE_PATH + "output/"; public static void main(String[] args) throws Exception { // 程序入口,主要作用是为多个项目分别根据模版组装数据后合并成一个word // 1. 准备数据(模拟从数据库中查询,key为项目名称,value为项目数据) Map<String, ProjectData> dataMap = queryData(); // 2. 为每个项目生成一个以项目名为名称的文件夹,文件夹内包括word文档、附件 // 2.1 创建一个临时文件夹 String tempDirPath = FileUtil.mkParentDirs("temp/" + UUID.randomUUID()).getAbsolutePath(); // 2.2 在这个临时文件夹下面,根据数据生成多个项目文件夹及word文档、附件 generateAllWordDocument(dataMap, tempDirPath); // 3. 打包整个临时文件夹为zip压缩包 File projectZipFile = compressIntoAZipFile(tempDirPath); System.out.println("压缩包路径保存:" + projectZipFile.getAbsolutePath()); // 4. 删除所有临时文件 deleteAllTempFiles(tempDirPath); } /** * 打包整个临时文件夹为zip压缩包 * * @param tempDirPath 需要打包的文件夹目录 * @return 压缩包文件 */ public static File compressIntoAZipFile(String tempDirPath) { return ZipUtil.zip(tempDirPath, OUTPUT_PATH + "慈善奖附件_" + DateUtil.format(new Date(), DatePattern.PURE_DATETIME_PATTERN) + ".zip"); } /** * 删除所有临时文件 * * @param tempDirPath 临时文件夹路径 */ public static void deleteAllTempFiles(String tempDirPath) { FileUtil.del(tempDirPath); } /** * 生成所有项目文档 * * @param dataMap 所有项目信息,key为项目名称,value为项目数据 * @param tempDirPath 临时目录,用于存储多个临时Word文档 * @throws Exception 异常 *