使用ftl文件导出时,多层嵌套循环

核心点

//针对集合1进行循环
<#list priceDetail as pd>//对集合1中包含的集合2进行存在和判空 判断<#if pd.detail ?exists &&  pd.detail ?size!=0>	//对集合2进行循环<#list pd.detail as d>...</#list></#if></#list>

模版样式

语雀设计模版样式,导出为word,百度word转html文件,规范好编码格式Utf-8,对html文件进行修正后另存为.ftl文件即可使用.

导出效果

java代码

    public String exportSmInspect(JSONObject priceDetail) throws Exception {Map<String, Object> map = new HashMap<>();String projectName = priceDetail.getString("projectName");//虚拟路径String fileNamePath = newProfile + DateUtils.datePath() + "/" + projectName + ".doc";//数据处理populateMapWithPriceDetail(map, priceDetail);//导出成wordexporttemplateword(map, "光伏报价模版.ftl", wordPath, projectName + "报价.doc");return fileNamePath;}
  /*** 数据分析* 将传参循环存入map中** @param map* @param priceDetail*/private void populateMapWithPriceDetail(Map<String, Object> map, JSONObject priceDetail) {map.put("projectName", priceDetail.getString("projectName"));map.put("sunTime", priceDetail.getString("sunTime"));map.put("extraction", priceDetail.getString("extraction"));map.put("head", priceDetail.getString("head"));JSONArray detail = priceDetail.getJSONArray("priceDetail");if (!CollectionUtils.isEmpty(detail)) {List<Map<String, Object>> map1s = new ArrayList<>();for (Object o : detail) {if (o instanceof LinkedHashMap) {LinkedHashMap<String, Object> pds = (LinkedHashMap) o;Map<String, Object> map1 = new HashMap<>();map1.put("name", pds.get("name"));map1.put("totalPrice", pds.get("totalPrice"));map1.put("remark", pds.get("remark"));//匹配失败则没有详情if(pds.containsKey("detail")){Object detail1 = pds.get("detail");//转为集合List<?> list = Arrays.asList(detail1);if (!CollectionUtils.isEmpty(list)) {List<Map<String, Object>> map2s = new ArrayList<>();for (Object detail1Obj : list) {//查看实际类型-->注:debug显示未LinkedHashMap,判断为falseSystem.out.println(detail1Obj.getClass().getName());if (detail1Obj instanceof List) {ArrayList<LinkedHashMap> wlDetail = (ArrayList) detail1Obj;for (LinkedHashMap s : wlDetail) {Map<String, Object> map2 = new HashMap<>();map2.put("name", s.get("name"));map2.put("price", s.get("price"));map2.put("num", s.get("num"));map2.put("unit", s.get("unit"));map2s.add(map2);}}}map1.put("detail", map2s);                    }}else{//存入空Map,模版导出时进行判空跳过map1.put("detail",new HashMap<>());}map1s.add(map1);}}map.put("priceDetail", map1s);}}
  /*** 导出为word文件** @param map      数据集合* @param path     模版名称* @param wordPath 模版所在的文件路径* @param name     文件名* @throws Exception*/public void exporttemplateword(Map<String, Object> map, String path, String wordPath, String name) throws Exception {// 第一步:创建一个Configuration对象,直接new一个对象。构造方法的参数就是FreeMarker对应的版本号。Configuration configuration = new Configuration(Configuration.getVersion());// 第二步:设置模板文件所在的路径,确保目录存在File file = new File(wordPath);if (!file.isDirectory()) {throw new IllegalArgumentException("word模板文件不存在,请检查word文件夹!" + wordPath);}configuration.setDirectoryForTemplateLoading(file);// 第三步:设置模板文件使用的字符集。一般就是utf-8.configuration.setDefaultEncoding("utf-8");// 第四步:加载一个模板,创建一个模板对象。Template template = configuration.getTemplate(path);// 第六步:创建一个Writer对象,一般创建一FileWriter对象,指定生成的文件名。//实际存储路径String saveFilePath = profile + DateUtils.datePath();File file1 = new File(saveFilePath);if (!file1.exists() && !file1.mkdirs()) {file1.mkdirs();}try (Writer out = new FileWriter(saveFilePath + "/" + name)) {// 第七步:调用模板对象的process方法输出文件。template.process(map, out);} catch (TemplateException e) {// 处理模板引擎异常throw new IOException("模板处理过程中发生错误", e);}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/407106.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

wincc报警如何通过短信发送给手机

单位使用WINCC上位机监控现场&#xff0c;需要把报警信息发送到指定手机上&#xff0c;能否实现&#xff1f;通过巨控GRMOPC系列远程智能控制终端&#xff0c;简单配置即可实现wincc报警短信传送到手机。配置过程无需任何通讯程序&#xff0c;也不要写任何触发脚本。 GRMOPC模…

【数据结构】归并排序

1、介绍 归并排序&#xff08;merge sort&#xff09;是一种基于分治策略的排序算法&#xff0c;包含“划分”和“合并”阶段。 划分阶段&#xff1a;通过递归不断地将数组从中点处分开&#xff0c;将长数组的排序问题转换为短数组的排序问题。 合并阶段&#xff1a;当子数组…

基于SpringBoot的闲一品交易平台

你好呀&#xff0c;我是计算机学姐码农小野&#xff01;如果有相关需求&#xff0c;可以私信联系我。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot框架 Java技术 工具&#xff1a;IDEA/Eclipse、Navicat、Maven 系统展示 首页 管理员…

PaddleNLP 3.0 支持大语言模型开发

huggingface不支持模型并行。张量并行&#xff0c;不满足大规模预训练的需求。 1、组网部分 2、数据流 3、训练器 4、异步高效的模型存储

【探索数据结构与算法】向上调整建堆与向下调整建堆的时间复杂度

一.前言 堆排序是一种优于冒泡排序的算法, 那么在进行堆排序之前, 我们需要先创建堆, 那么这个建堆的时间复杂度是多少呢? 二.下调整算法建堆 因为堆是完全二叉树&#xff0c;而满二叉树也是完全二叉树&#xff0c;此处为了简化使用满二叉树来证明(时间复杂度本来看的就是近…

android13 隐藏状态栏里面的背光调节 隐藏下拉栏背光调节

总纲 android13 rom 开发总纲说明 目录 1.前言 2.问题分析 3.修改方法 4.编译运行 5.彩蛋 1.前言 隐藏下拉栏里面的背光调节,禁止用户在这里调节背光亮度。 2.问题分析 我们找到对应的布局,然后在里面隐藏掉。 使用之前文章介绍的布局查找工具,查找亮度条id id/bri…

Adobe Animate (AN)软件安装,硬件配置(附安装包)

目录 一、Adobe An 软件简介 Adobe An 软件的特点 Adobe An 软件的优势 下载 二、Adobe An 软件安装 安装前的准备工作 安装过程中的注意事项 安装后的设置 三、Adobe An 软件使用 高级动画技巧 交互设计 优化与性能提升 四、Adobe An 软件快捷键 选择工具快捷键…

闲置物品交易平台网站商城-计算机毕设Java|springboot实战项目

&#x1f393; 作者&#xff1a;计算机毕设小月哥 | 软件开发专家 &#x1f5a5;️ 简介&#xff1a;8年计算机软件程序开发经验。精通Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等技术栈。 &#x1f6e0;️ 专业服务 &#x1f6e0;️ 需求定制化开发源码提…

线索精细化管理实践:线上推广渠道线索管理的8个要点

在如今线索获取成本越来越高的情况下&#xff0c;如何获取增量线索、经营好存量线索、实现精细化、高效率线索管理对于企业来说至关重要。获取线索是一切行动的开始&#xff0c;与其建立起稳定、持续的信任关系&#xff0c;达成合作甚至引导复购&#xff0c;是整个线索管理链路…

在网站文章中,‌<br>标签对SEO的影响及优化策略

在网页设计和内容创作中&#xff0c;‌<br>标签常被用于实现文本的换行显示。‌然而&#xff0c;‌对于关注SEO&#xff08;‌搜索引擎优化&#xff09;‌的网站管理员和内容创作者来说&#xff0c;‌<br>标签的使用却需要更加谨慎。‌这是因为<br>标签对SEO…

入门redis

一、安装redis-py库 打开pycharm 在终端中输入 pip install redis 二、连接到redis服务器 import redis r redis.Redis(hostlocalhost, port6379, db0, decode_responsesTrue)host是 Redis 服务器的主机名或 IP 地址&#xff0c;port是端口号&#xff0c;db是要使用的数据库编…

【Word多级标题完整设置】设置各级标题样式将多级列表链接到各级标题样式中

Word多级标题完整设置 一、设置各级标题样式主标题样式设置中英文字体、字形以及字号设置段落设置&#xff08;缩进、间距和行距&#xff09; 一级标题样式设置中英文字体、字形以及字号设置段落设置&#xff08;缩进、间距和行距&#xff09; 二级标题样式设置中英文字体、字形…

看图学sql之sql 中的UNION 和union all

UNION 用于合并两个或者多个 SELECT 语句的结果集 语法&#xff1a; SELECT column1, column2 ... FROM table1, table2 [WHERE condition1]UNION / UNION ALLSELECT column1, column2 ... FROM table1, table2 [WHERE condition2] 数据分析社区直达 免费数据分析资料下载。…

JVM系列--初始JVM

根据《黑马程序员JVM虚拟机入门到实战全套视频教程》整理 1 什么是JVM JVM 全称是 Java Virtual Machine&#xff0c;中文译名 Java虚拟机。JVM 本质上是一个运行在计算机上的程序&#xff0c;他的职责是运行Java字节码文件。 Java源代码执行流程如下&#xff1a; 分为三个步…

【Canvas与艺术】环状合掌纹

【成图】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>环形合掌纹</title><style type"text/css">.…

原生js用Export2Excel导出excel单级表头和多级表头数据方式实现

原生js用Export2Excel导出excel单级表头和多级表头数据方式实现 原生js用Export2Excel导出excel单级表头和多级表头数据方式实现HTML文件导入需要的文件HTML文件中实现导出函数HTML总代码实现汇总&#xff08;直接复制代码&#xff0c;注意js引入路径&#xff09; 原生js用Expo…

Linux驱动入门实验班——DHT11、DS18B20模块驱动(附百问网视频链接)

目录 前言 一、DHT11模块 1.通信协议 2.数据格式 3.编程思路 ①入口函数 ②实现read函数 ③编写中断处理函数 ④***编写数据解析函数 ⑤应用程序 二、DS18B20模块 1. 通信时序 ① 初始化时序 ② 写时序 ③ 读时序 2. 常用命令 3. 编程思路 1.启动温度转换 2…

PPT分享:埃森哲-流程制造的智能工厂规划设计

在分享PPT之前&#xff0c;笔者与大家一起熟悉下&#xff0c;流程制造是什么&#xff0c;与离散制造有哪些区别。 往期回顾>> 125页PPT&#xff1a;某行业数据架构蓝图规划方案 170页PPT&#xff1a;制造业采购供应链及财务管控业务流程蓝图规划 60页PPT:集团SRM项目业…

xxl_job任务调度简单使用

一、概念 任务调度是为了自动完成特定任务&#xff0c;在约定的特定时刻去执行任务的过程 如以下应用场景&#xff1a; 某电商平台需要每天上午10点&#xff0c;下午3点&#xff0c;晚上8点发放一批优惠券 某银行系统需要在信用卡到期还款日的前三天进行短信提醒 某财务系统…

【图文并茂】ant design pro 如何对接后端个人信息接口

上一节我们有讲到如何对接登录接口的 【图文并茂】ant design pro 如何对接登录接口 仅仅能登录是最基本的&#xff0c;但是我们要进入后台还是需要另一个接口。 这个接口有两个作用&#xff1a; 来获取当前登录账号的信息&#xff0c;比如头像&#xff0c;用户名&#xff0…