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

专业网站建设集团南宁做网站公司

专业网站建设集团,南宁做网站公司,建行官网官网网站吗,手机wap网站建设一、场景 将数据导出word后且实现动态勾选复选框操作 eg: word模板 导出后效果&#xff08;根据数据动态勾选复选框&#xff09; 二、解决方案及涉及技术 ① 使用poi提供的库进行处理&#xff08;poi官方文档&#xff09; ② 涉及依赖 <!-- excel工具 --><depen…

一、场景

将数据导出word后且实现动态勾选复选框操作
eg: word模板
在这里插入图片描述
导出后效果(根据数据动态勾选复选框)
在这里插入图片描述

二、解决方案及涉及技术

① 使用poi提供的库进行处理(poi官方文档)
② 涉及依赖

 <!-- excel工具 --><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>${poi.version}</version></dependency>
  <!-- pio处理word文件操作复选框--><dependency><groupId>com.deepoove</groupId><artifactId>poi-tl</artifactId><version>1.9.1</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-scratchpad</artifactId><version>4.1.2</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>ooxml-schemas</artifactId><version>1.4</version></dependency>

三、代码实现

word单个/批量下载工具类
在操作模板时,我们需先将写入word模板的数据构建为Map
① 数据封装处理(TrafficBlock 对象)

public Map buildTrafficDataForm(TrafficBlock trafficBlock){BlockDownLoadDataForm dataForm = new BlockDownLoadDataForm();BeanUtils.copyProperties(trafficBlock, dataForm);dataForm.setDirection(EventInfoDirection.getDirection(trafficBlock.getDirection()).getMessage());// 涉桥/涉隧dataForm.setInvolveNo(String.valueOf(trafficBlock.getInvolveNumber()));// 模板数据处理dataForm.setStartToEndPile("K"+trafficBlock.getStartKilometersPile()+"+"+trafficBlock.getStartHectometerPile()+"至"+trafficBlock.getEndKilometersPile()+"+"+trafficBlock.getEndHectometerPile());dataForm.setAffectedStartToEndPile("K"+trafficBlock.getAffectedStartKilometersPile()+"+"+trafficBlock.getAffectedStartHectometerPile()+"至"+trafficBlock.getAffectedEndKilometersPile()+"+"+trafficBlock.getAffectedEndHectometerPile());// 阻断类别(突发类才会有)String blockCategory = String.valueOf(trafficBlock.getBlockCategory());// checkBox处理if("1".equals(trafficBlock.getBlockNature())){// 计划类dataForm.setPlanCheckBox(String.valueOf(trafficBlock.getBlockType()));}else{ //突发类if("1".equals(blockCategory)){// 地质灾害dataForm.setGeologyCheckBox(String.valueOf(trafficBlock.getBlockType()));}else if("2".equals(blockCategory)){// 重大灾害dataForm.setGreatCheckBox(String.valueOf(trafficBlock.getBlockType()));}else if("3".equals(blockCategory)){// 气象灾害dataForm.setWeatherCheckBox(String.valueOf(trafficBlock.getBlockType()));}else if("4".equals(blockCategory)){// 事故灾害dataForm.setAccidentCheckBox(String.valueOf(trafficBlock.getBlockType()));}else if("5".equals(blockCategory)){// 其他dataForm.setOtherCheckBox(String.valueOf(trafficBlock.getBlockType()));}}return convertTrafficBlockToMap(dataForm);
}

② dataMap构建工具

public static Map<String, String> convertTrafficBlockToMap(BlockDownLoadDataForm downLoadDataForm) {Map<String, String> valueMap = new HashMap<>();Class<?> clazz = downLoadDataForm.getClass();for (Field field : clazz.getDeclaredFields()) {field.setAccessible(true);try {Object fieldValue = field.get(downLoadDataForm);if (fieldValue == null) {valueMap.put(field.getName(), "");} else {valueMap.put(field.getName(), String.valueOf(fieldValue));}} catch (IllegalAccessException e) {e.printStackTrace();}}return valueMap;}

此处需要注意在多个文件下载时,每次向ZipOutputStream 写入字节流时,需要为每个生成的 Word 文件提供一个唯一的名称(写入的文件名必须不一致)否则会导致每次写入的流覆盖之前的,导致浏览器不能正确解析,进而下载失败!!!

// *****(Word单个/批量下载)public void generateTrafficWordForm(HttpServletResponse response, List<Long> ids) throws IOException {List<TrafficBlock> trafficBlocks = trafficBlockMapper.selectList(new LambdaQueryWrapper<TrafficBlock>().in(TrafficBlock::getId, ids));if (ids.size() == 1){// 单个下载Map dataMap = buildTrafficDataForm(trafficBlocks.get(0));response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=***记录表.docx");response.setContentType(String.valueOf(MediaType.APPLICATION_OCTET_STREAM));try (OutputStream out = response.getOutputStream()) {writeTrafficWordForm(dataMap, out);}}else if (ids.size()  > 1) {// 多个文件压缩下载response.setContentType("application/zip");response.setCharacterEncoding("UTF-8");response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode("交通阻断.zip", "UTF-8"));try (ZipOutputStream zipOut = new ZipOutputStream(response.getOutputStream())) {for (TrafficBlock trafficBlock : trafficBlocks) {Map dataMap = buildTrafficDataForm(trafficBlock);ByteArrayOutputStream wordStream = new ByteArrayOutputStream();writeTrafficWordForm(dataMap, wordStream);// 为每个文件生成唯一的名称String uniqueFileName = "*****_" + trafficBlock.getId() + ".docx";zipOut.putNextEntry(new ZipEntry(uniqueFileName));zipOut.write(wordStream.toByteArray());zipOut.closeEntry();}} catch (IOException e) {throw new RuntimeException(e);}}}

poi工具类读取模板处理数据工具:

public void writeTrafficWordForm(Map<String, String> dataMap,OutputStream outputStream) {/***  复选框* *///需要循环的表单数据dataMap.put("dataTable", String.valueOf(new ArrayList<>()));ConfigureBuilder configureBuilder = Configure.builder().useSpringEL().bind("dataTable", new HackLoopTableRenderPolicy());Configure config = configureBuilder.build();InputStream is = null;try {// 读取Word模板文件,获取输入流is = new ClassPathResource("template/profile/交通阻断记录表.docx").getInputStream();XWPFTemplate template = XWPFTemplate.compile(is, config).render(dataMap);template.write(outputStream);outputStream.flush();PoitlIOUtils.closeQuietlyMulti(template, outputStream);} catch (IOException e) {log.error("失败!!!!!!", e);} finally {if (null != is) {try {is.close();} catch (IOException e) {log.error("关闭流失败!", e);}}}}
http://www.khdw.cn/news/2920.html

相关文章:

  • 手机免费建设网站俄罗斯搜索引擎入口 yandex
  • 黄山旅游攻略五日游上海排名优化seo
  • 秦皇岛建设网站官网百度地图网页版进入
  • 网站没有备案网络营销到底是干嘛的
  • 事业单位门户网站建设做网销的一天都在干嘛
  • 网店html模板如何做网站搜索引擎优化
  • 龙岩排头疫情最新消息武汉seo软件
  • 网站开发 之cookie百度收录怎么弄
  • 郑州网站高端设计网站制作费用
  • 外贸网站怎么做关键词网络优化器免费
  • 用织梦系统做网站百度搜索风云榜
  • 网站建设注意什么优化关键词具体要怎么做
  • 杭州网站开发招聘广州seo学徒
  • 玉溪人民政府网站建设现状seo黑帽教学网
  • 软件外包行业网站seo诊断分析和优化方案
  • 织梦做有网站有后台 能下载备份所有代码文件么今日新闻头条新闻最新
  • 盐城市城乡建设局网站win10优化大师是官方的吗
  • 中国建设工程协会网站网站网络推广
  • h5网站建设西安网站开发
  • 如何自己做优惠卷网站现在最火的推广平台有哪些
  • 如何选择小程序定制公司西安网站seo服务
  • 顺德网站制作案例效果郑州百度推广代运营
  • 深圳做网站案例网站关键词公司
  • 兰州网站关键词优化百度指数十年
  • 做境外的赌博网站违法么泉州网站关键词排名
  • 苏州短视频运营优化网站技术
  • 网站建设案例算命网站怎么制作网页链接
  • 世界动画专业大学排名前十强广州网站营销seo费用
  • 临沂网站建设小程序网上商城网站开发
  • 潍坊知名网站建设万网创始人