当前位置: 首页 > article >正文

Java 批量导出Word模板生成ZIP文件到浏览器默认下载位置

是不是你们要找的!是不是你们要找的!是不是你们要找的!

先看效果:

        

1.word模板格式

2.模板位置

3.需要的依赖

        <!--POI-TL实现数据导出到word模板-->
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.8.0.M2</version>
        </dependency>
        <dependency>
            <groupId>com.deepoove</groupId>
            <artifactId>poi-tl</artifactId>
            <version>1.9.1</version>
        </dependency>
        <!--支持Zip-->
        <dependency>
            <groupId>net.lingala.zip4j</groupId>
            <artifactId>zip4j</artifactId>
            <version>2.11.5</version>
        </dependency>

4.直上代码

    @Override
    public Result exportReportAAndF1List(HttpServletResponse response,List<Integer> ids) throws Exception {

        List<Map<String, Object>> arrayMap = new ArrayList<>();

        for(Integer sonId:ids) {
            //导出A 单个导出
            TestRecord testRecord = testRecordMapper.selectById(sonId);
            List<VehicleParts> vehiclePartsList = vehiclePartsMapper.selectList(new LambdaQueryWrapper<VehicleParts>().eq(VehicleParts::getModelId,
                    testRecord.getModelId()));
            Map<Integer, VehicleParts> vehiclePartsMap = vehiclePartsList.stream().collect(Collectors.toMap(VehicleParts::getId, vehicleParts -> vehicleParts));
            JSONObject vehicle = new JSONObject();
            Unit unit = null;
            if (StringUtils.isNotBlank(testRecord.getVehicleInfo())) {
                vehicle = JSONObject.parseObject(testRecord.getVehicleInfo());
                Integer unitId = vehicle.getInteger("unitId");
                if (unitId != null) {
                    unit = unitMapper.selectById(unitId);
                }
            }

            // 1 设置编码格式、文件名称
            response.setCharacterEncoding("utf-8");

            Map<String, Object> map = new HashMap<>();

            // 1.基本属性填充
            map.put("fName", "F" + testRecord.getModelId());
            map.put("fileName", Optional.ofNullable(testRecord.getFileName()).orElse("--"));
            map.put("modelName", Optional.ofNullable(testRecord.getModelName()).orElse("--")); //Optional.ofNullable().orElse("--")
            map.put("powerHours", (int) Math.floor(Optional.ofNullable(vehicle.getDouble("powerHours")).orElse(0.0)));
            map.put("plateNumber", Optional.ofNullable(vehicle.get("plateNumber")).orElse("--"));
            map.put("powerPackWorkingHours", (int) Math.floor(Optional.ofNullable(vehicle.getDouble("powerPackWorkingHours")).orElse(0.0)));
            if (!unit.getParent().equals(0)) {
                Unit unitFather = unitMapper.selectById(unit.getParent());
                map.put("unitName", Optional.ofNullable(unitFather.getUnitName() + "/" + unit.getUnitName()).orElse("--"));
            } else {
                map.put("unitName", Optional.ofNullable(unit.getUnitName()).orElse("--"));
            }
            map.put("powerPackYieldHours", (int) Math.floor(Optional.ofNullable(vehicle.getDouble("powerPackYieldHours")).orElse(0.0)));
            map.put("factoryDate", Optional.ofNullable(vehicle.get("factoryDate")).orElse("--"));
            map.put("taskPayloadWorkingHours", (int) Math.floor(Optional.ofNullable(vehicle.getDouble("taskPayloadWorkingHours")).orElse(0.0)));
            map.put("mileage", (int) Math.floor(Optional.ofNullable(testRecord.getMileage()).orElse(0.0)));
            map.put("createTime", Optional.ofNullable(testRecord.getCreateTime()).orElse("--"));
            map.put("remark", Optional.ofNullable(testRecord.getRemark()).orElse("--"));

            //list所属系统

            //拼接数据结构
            // 2.商品详情列表填充
            List<Map<String, Object>> goodsWordList = new ArrayList<>();

            //下面的行数
            List<FillData> data = data(testRecord.getDetail(), vehiclePartsMap);
            for (int i = 0; i < data.size(); i++) {
                Map<String, Object> goodsMap = new HashMap<>();
                goodsMap.put("id", i + 1);
                goodsMap.put("item", Optional.ofNullable(data.get(i).getItem()).orElse("--"));
                goodsMap.put("result", Optional.ofNullable(data.get(i).getResult()).orElse("--"));
                goodsMap.put("partsName", Optional.ofNullable(data.get(i).getPartsName()).orElse("--"));
                goodsMap.put("subsystemName", Optional.ofNullable(data.get(i).getSubsystemName()).orElse("--"));
                goodsMap.put("trueOrFalse", Optional.ofNullable(data.get(i).getTrueOrFalse()).orElse("--"));
                goodsWordList.add(goodsMap);
            }
            map.put("goods", goodsWordList);

            arrayMap.add(map);
        }

        // 设置响应的内容类型
        response.setContentType("application/zip");

        response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");

        String zipName = URLEncoder.encode("F1检测信息报表.zip", "UTF-8").replaceAll("\\+", "%20");

        response.setHeader("Content-Disposition", "attachment;filename=" + zipName);

        try (ZipOutputStream zipOutputStream = new ZipOutputStream(response.getOutputStream())){

            for (Map<String, Object> data : arrayMap){

                //使用 ByteArrayOutputStream 来创建内存中的 Word 文件
                ByteArrayOutputStream wordOut = new ByteArrayOutputStream();

                //数据写入模板
                XWPFDocument document = new MyXWPFDocument(Objects.requireNonNull(this.getClass().getResourceAsStream("/template/testAF1.docx")));
                // 读取模板
                WordExportUtil.exportWord07(document, data);

                document.write(wordOut);

                // 添加Word文件到Zip包中
                zipOutputStream.putNextEntry(new ZipEntry(data.get("fileName") + ".docx"));
                zipOutputStream.write(wordOut.toByteArray());
                zipOutputStream.closeEntry();
            }

            zipOutputStream.finish();

        }catch (IOException e){

            e.printStackTrace();
            throw new RuntimeException("Error creating ZIP file",e);

        }

        return Result.success();
    }


http://www.kler.cn/a/382855.html

相关文章:

  • 分享一些在部署k8s集群时遇到的问题
  • GESP4级考试语法知识(算法概论(三))
  • 开源模型应用落地-glm模型小试-glm-4-9b-chat-vLLM集成(四)
  • 【办公类-04-04】华为助手导出照片视频分类(根据图片、视频的文件名日期导入“年-月-日”文件夹中,并转移到“年-月”文件中整理、转移到“年”文件夹中整理)
  • 金华迪加 现场大屏互动系统 mobile.do.php 任意文件上传漏洞复现
  • StandardThreadExecutor源码解读与使用(tomcat的线程池实现类)
  • 大模型与搜索引擎结合:智能体、思维链和智谱AI搜索代码案例
  • w~视觉~3D~合集1
  • LeetCode题练习与总结:O(1) 时间插入、删除和获取随机元素--380
  • xshell连接不上linux的原因
  • 【EMNLP2024】阿里云人工智能平台 PAI 多篇论文入选 EMNLP2024
  • 架构评估的方法
  • CentOS8.4 部署 k8s 1.31.2
  • XPath 实例
  • 【论文复现】KAN卷积:医学图像分割新前沿
  • 初级图像处理工具
  • 【C++刷题】力扣-#717-1比特与2比特字符
  • 【JavaScript】axios 二次封装拦截器(接口、实例、全局)
  • STM32HAL-最简单的长、短、多击按键框架(多按键)
  • hive切换表底层文件类型以及分隔符
  • I.MX6U 裸机开发2. 芯片简介、汇编基础及GPIO操作准备工作
  • 动态切换策略模式在Spring Boot项目中的实践与应用
  • 鸿蒙开发:自定义一个车牌省份简称键盘
  • Java 中的 transient 关键字:深入解析与实战
  • WebGUI之Gradio:Gradio 5的简介、安装和使用方法、案例应用之详细攻略
  • Redis - List 列表