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

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.直上代码

    @Overridepublic 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.mrgr.cn/news/63325.html

相关文章:

  • 布谷语音源码服务器搭建环境及配置流程
  • Android启动流程_SystemServer阶段
  • Android 虚拟化框架(AVF)指南
  • 探索人工智能:从大学专业到行业应用的全面解析
  • 0基础入门matlab
  • Puppeteer 与浏览器版本兼容性:自动化测试的最佳实践
  • 【经验分享】从网页下载内嵌PDF的小妙招,亲测好用
  • OpenEuler 使用ffmpeg x11grab捕获屏幕流,rtsp推流,并用vlc播放
  • React04 State变量 组件渲染
  • fasdsdsadsa
  • 2024高性价比电容笔推荐!盘点实测西圣、绿联、酷盟电容笔!
  • qt QStackedWidget详解
  • Gemini API 和 Google AI Studio 升级,提升搜索准确性和响应能力
  • L 波段射频信号采集回放系统
  • window与Linux基础-1
  • Jenkins You‘re using ‘Known hosts file‘,known_hosts file does not exist
  • QList
  • 图片批量处理神器将每个文件夹中的多张图片拼接,一键实现横向和纵向的长图拼接效果,让你的图片处理更高效
  • 漓江景区景点推荐
  • LLMs在股票投资组合崩溃中的时间关系推理
  • 当贝F6和当贝F7Pro区别对比:新品当贝F7Pro性能配置全面升级
  • 39. 组合总和
  • SpringBoot3集成Swagger接口文档功能、接口排序以及如何设置接口页面的title/keyword/description?
  • BeanFactory与ApplicationContext的关系
  • CVPR2024:完全测试时域适应​​​​(Test-time Adaptation)的目标检测
  • k8s 小版本升级