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

建站平台与建站系统美工培训费用

建站平台与建站系统,美工培训费用,广西企业网站有哪些,智慧团建电脑版登录1. 看一下需要导出什么样子的表格 如图所示#xff0c;这里的所有数据行都是动态的#xff0c;需要根据查询出来的数据循环展示。 如果只是这样的话#xff0c;使用freemarker应该都可以搞定#xff0c;但是他一列中内容相同的单元格#xff0c;需要合并。 这对于表格样式…1. 看一下需要导出什么样子的表格 如图所示这里的所有数据行都是动态的需要根据查询出来的数据循环展示。 如果只是这样的话使用freemarker应该都可以搞定但是他一列中内容相同的单元格需要合并。 这对于表格样式固定的freemarker就搞不定了。 经过一通百度发现了一个导出文档很好用的框架 poi-tl实际用的时候也并不怎么好用学习成本高功能全 下面上实战 2. 引入poi-tl 的相关依赖 dependencygroupIdcom.deepoove/groupIdartifactIdpoi-tl/artifactIdversion1.12.1/version/dependency关于版本问题老版比新版好用新版太过规范 官方文档地址 3.先放一个docx的模版模版样子如下 生产装置下面哪一行小字是{{templateRowRenderData}}用来填充数据的使用双花括号标记。 放在根目录下面不然找不到哦 3.开始建立实体类查询数据填充数据渲染模版 实体类如果类中有什么字典数字标识字段需要转成所表示的字符串 package com.ruoyi.prevention.inventory.domain.vo;import lombok.Data;/*** 安全风险管控措施对象 prevention_risk_measures** author ruoyi* date 2023-06-27*/ Data public class AllInventoryVo {private String id;/*** 管控对象分析对象名称*/private Integer zoneType;private String zoneTypeStr;/*** 责任部门名称*/private String responsibleDepartmentName;/*** 责任人名称*/private String responsibleStaffName;/*** 风险分析单元名称*/private String riskUnitName;/*** 风险单元id*/private String riskUnitId;/*** 安全风险事件*/private String riskEventName;/** 风险事件id */private String riskEventId;/** 管控措施分类 1 */private String controlMeasuresClassify1;/** 管控措施分类 2 */private String controlMeasuresClassify2;/** 管控措施分类 3 */private String controlMeasuresClassify3;/** 管控措施描述 */private String controlMeasuresDescription;/** 隐患排查内容 */private String treacherousContent;/** 管控措施id */private String riskMeasuresId;/** 岗位负责人 */private String postResponsible;/** 巡检周期 */private Integer checkCycle;/** 巡检周期单位 */private Integer checkCycleUnit;private String checkCycleUnitStr;} 渲染数据到templateRowRenderData这里和模版的参数名要保持一致 package com.ruoyi.prevention.inventory.word;import com.deepoove.poi.expression.Name; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor;/*** author: fanbaolin* Date: 2023/12/12* Description: 基础数据动态数据即* Version: 1.0*/ Data NoArgsConstructor AllArgsConstructor public class TemplateData {Name(templateRowRenderData)private TemplateRowRenderData templateRowRenderData;} 定义哪一列需要填充哪一个字段的值 package com.ruoyi.prevention.inventory.word;import com.deepoove.poi.data.CellRenderData; import com.deepoove.poi.data.ParagraphRenderData; import com.deepoove.poi.data.RowRenderData; import com.deepoove.poi.data.style.CellStyle; import com.deepoove.poi.data.style.ParagraphStyle; import com.deepoove.poi.data.style.RowStyle; import com.deepoove.poi.data.style.Style; import com.ruoyi.prevention.inventory.domain.vo.AllInventoryVo; import lombok.Data; import org.apache.commons.collections4.CollectionUtils; import org.apache.poi.xwpf.usermodel.ParagraphAlignment; import org.apache.poi.xwpf.usermodel.XWPFTableCell;import java.util.ArrayList; import java.util.Collections; import java.util.List;/*** author: fanbaolin* Date: 2023/12/12* Description: 将实体类转化为一个表格 因为渲染只接受RowRenderData类型* ps:新版真的难用* Version: 1.0*/ Data public class TemplateRowRenderData {/*** 管控分类措施*/private ListRowRenderData typeRowRenderDataList;private RowStyle rowStyle;public TemplateRowRenderData(ListAllInventoryVo inventoryVos) {// 初始化样式initStyle();// 初始化动态数据initData(inventoryVos);}private void initStyle() {// 字体样式Style style new Style(宋体, 10);// 段落样式ParagraphStyle paragraphStyle new ParagraphStyle();paragraphStyle.setDefaultTextStyle(style);// ps:这里才是字体居中对齐paragraphStyle.setAlign(ParagraphAlignment.CENTER);// 表格样式CellStyle cellStyle new CellStyle();// ps:表格也需要居中否则字体不在正中间会偏上cellStyle.setVertAlign(XWPFTableCell.XWPFVertAlign.CENTER);cellStyle.setDefaultParagraphStyle(paragraphStyle);// 行样式this.rowStyle new RowStyle();rowStyle.setDefaultCellStyle(cellStyle);}private void initData(ListAllInventoryVo inventoryVos) {// 管控分类ListRowRenderData newTypeRowRenderDataList new ArrayList();if (CollectionUtils.isNotEmpty(inventoryVos)) {for (AllInventoryVo inventoryVo : inventoryVos) {// 共有14列ListCellRenderData cellDataList new ArrayList();cellDataList.add(new CellRenderData().addParagraph(new ParagraphRenderData().addText(inventoryVo.getZoneTypeStr())));cellDataList.add(new CellRenderData().addParagraph(new ParagraphRenderData().addText(inventoryVo.getResponsibleDepartmentName())));cellDataList.add(new CellRenderData().addParagraph(new ParagraphRenderData().addText(inventoryVo.getResponsibleStaffName())));cellDataList.add(new CellRenderData().addParagraph(new ParagraphRenderData().addText(inventoryVo.getRiskUnitName())));cellDataList.add(new CellRenderData().addParagraph(new ParagraphRenderData().addText(inventoryVo.getRiskEventName())));cellDataList.add(new CellRenderData().addParagraph(new ParagraphRenderData().addText(inventoryVo.getControlMeasuresClassify1())));cellDataList.add(new CellRenderData().addParagraph(new ParagraphRenderData().addText(inventoryVo.getControlMeasuresClassify2())));cellDataList.add(new CellRenderData().addParagraph(new ParagraphRenderData().addText(inventoryVo.getControlMeasuresClassify3())));cellDataList.add(new CellRenderData().addParagraph(new ParagraphRenderData().addText(inventoryVo.getControlMeasuresDescription())));cellDataList.add(new CellRenderData().addParagraph(new ParagraphRenderData().addText(inventoryVo.getTreacherousContent())));cellDataList.add(new CellRenderData().addParagraph(new ParagraphRenderData().addText(inventoryVo.getPostResponsible())));cellDataList.add(new CellRenderData().addParagraph(new ParagraphRenderData().addText(inventoryVo.getCheckCycle() null ? :inventoryVo.getCheckCycle() )));cellDataList.add(new CellRenderData().addParagraph(new ParagraphRenderData().addText(inventoryVo.getCheckCycleUnitStr())));// 备注先空着cellDataList.add(new CellRenderData().addParagraph(new ParagraphRenderData().addText()));RowRenderData rowRenderData new RowRenderData();// 样式rowRenderData.setRowStyle(rowStyle);rowRenderData.setCells(cellDataList);newTypeRowRenderDataList.add(rowRenderData);}this.typeRowRenderDataList newTypeRowRenderDataList;}else{this.typeRowRenderDataList Collections.emptyList();}} } 渲染数据并合并列这里我的数据是摊平的用了两个指针首指针和尾指针找同一列上数据相同挨着的单元格然后把它们合并 package com.ruoyi.prevention.inventory.word;import com.deepoove.poi.data.RowRenderData; import com.deepoove.poi.policy.DynamicTableRenderPolicy; import com.deepoove.poi.policy.TableRenderPolicy; import com.deepoove.poi.util.TableTools; import lombok.NoArgsConstructor; import org.apache.commons.collections4.CollectionUtils; import org.apache.poi.xwpf.usermodel.XWPFTable; import org.apache.poi.xwpf.usermodel.XWPFTableRow;import java.util.List;/*** author: fanbaolin* Date: 2023/12/12* Description: 自定义渲染插件-for循环* 这里因为需要操作表格-所以集成DynamicTableRenderPolicy动态表格插件允许直接操作表格对象* 详情请看http://deepoove.com/poi-tl/#_%E9%BB%98%E8%AE%A4%E6%8F%92%E4%BB%B6* Version: 1.0*/ NoArgsConstructor public class TemplateTableRenderPolicy extends DynamicTableRenderPolicy {private XWPFTable xwpfTable;Overridepublic void render(XWPFTable xwpfTable, Object data) throws Exception {if (null data) {return;}this.xwpfTable xwpfTable;TemplateRowRenderData templateRowRenderData (TemplateRowRenderData) data;// 分类和管控措施的数据ListRowRenderData typeRowRenderDataList templateRowRenderData.getTypeRowRenderDataList();if (CollectionUtils.isNotEmpty(typeRowRenderDataList)) {// 表头下面那一行int typeMemberRow 1;// 移除空白的表头下面那一行xwpfTable.removeRow(typeMemberRow);// 得到表头那一行的数据XWPFTableRow xwpfTableRow xwpfTable.getRow(0);for (int i typeRowRenderDataList.size() - 1; i -1; i--) {// 重新插入表格XWPFTableRow insertNewTableRow xwpfTable.insertNewTableRow(typeMemberRow);// 统一高度insertNewTableRow.setHeight(xwpfTableRow.getHeight());for (int j 0; j 14; j) {insertNewTableRow.createCell();}// 渲染数据TableRenderPolicy.Helper.renderRow(xwpfTable.getRow(typeMemberRow), typeRowRenderDataList.get(i));}// 合并行 下标为1的行开始合并去除表头必须一个一个catchcatchMergeRow(typeRowRenderDataList,0);catchMergeRow(typeRowRenderDataList,1);catchMergeRow(typeRowRenderDataList,2);catchMergeRow(typeRowRenderDataList,3);catchMergeRow(typeRowRenderDataList,4);catchMergeRow(typeRowRenderDataList,5);catchMergeRow(typeRowRenderDataList,6);catchMergeRow(typeRowRenderDataList,7);}}private void catchMergeRow(ListRowRenderData typeRowRenderDataList, int cell){try {mergeRow(typeRowRenderDataList,cell,1,1,false);}catch (RuntimeException ignore){}}/*** 首尾指针递归判断列表下一个值是否和自己相同** param typeRowRenderDataList* param cell* param from* param to* param hasDef*/private void mergeRow(ListRowRenderData typeRowRenderDataList, int cell, int from, int to, boolean hasDef) {if(from typeRowRenderDataList.size()){throw new RuntimeException(跳出递归);}else{for (int i from - 1 ; i typeRowRenderDataList.size() - 1; i) {String content typeRowRenderDataList.get(i).getCells().get(cell).getParagraphs().get(0).getContents().toString();String nextContent typeRowRenderDataList.get(i 1).getCells().get(cell).getParagraphs().get(0).getContents().toString();if(nextContent.equals(content)){to to 1;}else{if(from to){return;}if(from to){// 整体下移一个单位from 1;to 1;}else{// 合并行TableTools.mergeCellsVertically(xwpfTable, cell, from, to);// 合并完成 首指针指向尾端from to;}// 递归调用mergeRow(typeRowRenderDataList,cell,from,to,true);}}}// 如果这一列没有不同的值 全给他合并了if(!hasDef){if(from to){return;}TableTools.mergeCellsVertically(xwpfTable, cell, from, to);}} } 4.service层掉用 这里我还做了一个word转pdf的操作(用的aspose)没有需求的老铁可以不用要 /*** 导出安全风险清单*/Overridepublic void report() {ServletRequestAttributes requestAttributes (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();HttpServletResponse response requestAttributes.getResponse();response.setContentType(application/pdf);response.setHeader(Content-Disposition, attachment; filename report.pdf);ListAllInventoryVo allInventoryVos flatList();clearTreacherousContentLabel(allInventoryVos);TemplateRowRenderData templateRowRenderData3 new TemplateRowRenderData(allInventoryVos);// 2完整数据TemplateData templateData new TemplateData(templateRowRenderData3);try {Configure config Configure.builder().bind(templateRowRenderData, new TemplateTableRenderPolicy()).build();// 四、导出ClassPathResource classPathResource new ClassPathResource(templates File.separator prevention.docx);XWPFTemplate template XWPFTemplate.compile(classPathResource.getInputStream(), config).render(templateData);String filePath ;if (SystemUtil.getOsInfo().isWindows()) {filePath d:/tmp\\work\\report.doc;}else{filePath /tmp/work/report.doc;}template.writeAndClose(Files.newOutputStream(Paths.get(filePath)));File file new File(filePath);// 生成word filePath是将要被转化的word文档Document doc new Document(filePath);// 转换 字体不一样doc.save(response.getOutputStream(), SaveFormat.PDF);// 删除临时文件file.delete();} catch (Exception e) {throw new RuntimeException(e);}}5.controller就不写了结果如下 学习成本一天半刚入门的新手建议不要看了
http://www.pierceye.com/news/34832/

相关文章:

  • 网站建设教学点wordpress滑块验证码
  • 网站特色怎么写wordpress怎么搜索代码
  • 网页设计与网站开发网站设计实训心得
  • python 网站开发实战搭建一个网站 优帮云
  • 广州网站推广哪家好古典网站素材
  • 做淘宝店和做网站网站推广方案注意事项?
  • 网站开发 题目书签制作 小学生 一等奖
  • shopex网站首页空白成都市住房和城乡建设厅官方网站
  • 网站建设项目立项登记 表全国新增确诊病例
  • 如何备案网站网页游戏排行榜2020排行榜
  • wordpress网站访问量学校局域网站建设
  • 手机网站代码下载天天清茶 湖南网站建设
  • 宠物用品网站建设做网站不推广
  • 肃宁哪里建网站搭建什么网站好玩
  • 建设部门电工证查询网站淘宝联盟填网站备案
  • 大型网站建设历史教育网站如何做经营
  • 江西房地产网站建设深圳建设工程交易信息网
  • cpa广告网站怎么做重庆玖玺国际做网站
  • 网站建设域名注册门户网站是指提供什么的网站
  • 公司网站开发需求文档地推拉新app推广平台
  • 集团网站品牌建设特点官方网站建设公
  • 如何优化网站重庆网站建设aiyom
  • p2p网站做牛辽宁平台网站建设公司
  • 备案期间关闭网站法律服务网站建设
  • html做音乐网站模板易语言做网站登陆
  • 中国传统文化网页设计sem跟seo的区别
  • 企业网站代维护wordpress id清空
  • 网站分栏目怎么做抖音小程序在哪里
  • 包头网站建设多少钱营销型网站及原因有哪些方面
  • 北京网站优化公司 卓立海创电商网站开发视频