Velocity实战笔记

news2024/9/21 17:54:30

基础准备

velocity模板语法简介
官方实例

版本环境

		<dependency>
            <groupId>org.apache.velocity</groupId>
            <artifactId>velocity</artifactId>
            <version>1.7</version>
        </dependency>

标签介绍

<Workbook>
	<DocumentProperties></DocumentProperties>
	<CustomDocumentProperties></CustomDocumentProperties>
	<ExcelWorkbook></ExcelWorkbook>
	<Styles></Styles>
	<Worksheet></Worksheet>
</Workbook>

workbook

一个workbook对应一个工作薄,下面是常见的约定命名空间。

<Workbook 
	xmlns="urn:schemas-microsoft-com:office:spreadsheet" 
	xmlns:o="urn:schemas-microsoft-com:office:office" 
	xmlns:x="urn:schemas-microsoft-com:office:excel" 
	xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" 
	xmlns:html="http://www.w3.org/TR/REC-html40" 
	xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882">
</Workbook>

DocumentProperties

约定属性配置

    <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
        <LastAuthor>16056</LastAuthor>
        <Created>2019-07-25T02:16:00Z</Created>
        <LastSaved>2019-07-26T02:55:46Z</LastSaved>
    </DocumentProperties>

CustomDocumentProperties

自定义属性配置

 	<CustomDocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
        <KSOProductBuildVer dt:dt="string">2052-11.1.0.8894</KSOProductBuildVer>
    </CustomDocumentProperties>

ExcelWorkbook

excel相关的属性

    <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
        <WindowWidth>19200</WindowWidth>
        <WindowHeight>7070</WindowHeight>
        <ProtectStructure>False</ProtectStructure>
        <ProtectWindows>False</ProtectWindows>
    </ExcelWorkbook>

Style

			<!-- 
				ID:这个样式的唯一值
				Name:这个样式的名称
			-->
        <Style ss:ID="s69" ss:Name="这个样式的名称">
        		<!-- Horizontal:水平居中 Vertical:垂直居中 WrapText:自动换行 -->
            <Alignment ss:Horizontal="Center" ss:Vertical="Center"  ss:WrapText="1"/> 
           		<!-- 单元格边框  上下左右(可不全,写什么地方,画什么地方)-->
            <Borders>
            		<!-- Weight:线宽-->
                <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
                <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"/>
                <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/>
                <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
            </Borders>
            		<!-- 字体样式 
	            		微软雅黑:字体名称
	            		Size:大小
	            		Bold:字体加粗
            		-->
            <Font ss:FontName="微软雅黑" x:CharSet="134" ss:Size="10" ss:Bold="1"/>
            	<!-- 后续补充 -->
            <Interior ss:Color="#FFFFFF" ss:Pattern="Solid"/>
           		<!-- 后续补充 -->
            <NumberFormat ss:Format="[$-F800]dddd\,\ mmmm\ dd\,\ yyyy"/>
            	<!-- 后续补充 -->
            <Protection/>
        </Style >

Worksheet

	<Worksheet ss:Name="sheetName">
        <Table 
        	 ss:ExpandedColumnCount="21" ss:ExpandedRowCount="4" 
        	 x:FullColumns="1" x:FullRows="1" 
        	 ss:DefaultColumnWidth="默认列宽" ss:DefaultRowHeight="默认行高">
			<!-- 第几列样式生效 -->
            <Column ss:Index="第几列(从1开始)" ss:StyleID="样式id" ss:AutoFitWidth="0" ss:Width="宽度:如84"/>
            
            <Row ss:Height="行高 如:33.75">
                <Cell ss:StyleID="样式id" ss:MergeAcross="单元格合并数量(向右)不包括自己">
                    <Data ss:Type="值类型:如String"></Data>
                </Cell>
                <Cell ss:StyleID="s73" ss:MergeDown="单元格合并数量(向下)不包括自己">
                    <Data ss:Type="值类型:如String"></Data>
            	</Cell>
            </Row>
        </Table>
        <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
            <PageSetup>
                <Header x:Margin="0.3"/>
                <Footer x:Margin="0.3"/>
                <PageMargins x:Left="0.7" x:Right="0.7" x:Top="0.75" x:Bottom="0.75"/>
            </PageSetup>
            <Selected/>
            <TopRowVisible>0</TopRowVisible>
            <LeftColumnVisible>0</LeftColumnVisible>
            <PageBreakZoom>100</PageBreakZoom>
            <Panes>
                <Pane>
                    <Number>3</Number>
                    <ActiveRow>12</ActiveRow>
                    <ActiveCol>13</ActiveCol>
                    <RangeSelection>R13C14</RangeSelection>
                </Pane>
            </Panes>
            <ProtectObjects>False</ProtectObjects>
            <ProtectScenarios>False</ProtectScenarios>
        </WorksheetOptions>
	</Worksheet>

操作记录

样例模板

首先给出我们要实现的模板。其中啦啦可以看作是我们常见的标题部分。本次我们的导出模板是向右的。
在这里插入图片描述

操作过程

为了能使样式效果生效,我们提前配置如下:

        <Table
                ss:ExpandedColumnCount="21" ss:ExpandedRowCount="4"
                x:FullColumns="1" x:FullRows="1"
                <!--暂不做配置-->
                ss:DefaultColumnWidth="49.5" ss:DefaultRowHeight="14" >
            <!--标题-->
            <Column ss:Index="1" ss:Width="60"/>
            <!--1级表头-->
            <Column ss:Index="2" ss:Width="90"/>
            <!--2级表头-->
            <Column ss:Index="3" ss:Width="180"/>
        </Table>

第一行

Row表示行,cell表示单元格,当前第一行我们处理两个cell(依次向右),其中第一个单元格向下合并四个单元格,所以ss:MergeDown="4",第二个单元格需要向右合并一个所以ss:MergeAcross="1"

        <Row ss:Height="33.75">
            <Cell ss:StyleID="s73" ss:MergeDown="4">
                <Data ss:Type="String">啦啦</Data>
            </Cell>
            <Cell ss:StyleID="s72" ss:MergeAcross="1">
                <Data ss:Type="String">啦啦啦1</Data>
            </Cell>
        </Row>

当前效果如下所示:
在这里插入图片描述

第二行

由第一行操作过程我们知道单元格默认从第一列开始处理,此时我们的表头哈哈在第二列,因此我们要指定处理的列ss:Index="2",同时指定 ss:MergeDown="1"向下拓展一个。同理哈哈1指定ss:Index="3"

        <Row ss:Height="33.75" >
            <Cell ss:Index="2" ss:StyleID="s71" ss:MergeDown="1" >
                <Data ss:Type="String">哈哈</Data>
            </Cell>
            <Cell ss:Index="3" ss:StyleID="s70" >
                <Data ss:Type="String">哈哈1</Data>
            </Cell>
        </Row>

当前效果如下所示:
在这里插入图片描述
如何把哈哈2放入里面呢?答案是再写一个Row。

        <Row ss:Height="33.75">
            <Cell ss:Index="3" ss:StyleID="s70">
                <Data ss:Type="String">哈哈2</Data>
            </Cell>
        </Row">

哈哈2在第3行,此时Row标签数量总数应该为3。添加完成后效果如下:
在这里插入图片描述
同理喜喜也如同第二行操作一样。

常见问题

取值问题

<Cell ss:StyleID="s69">
    <Data ss:Type="String">${smokeInfo.result}</Data>
</Cell>

当smokeInfo.result的值为null时,导出的excel值为${smokeInfo.result},此时需要在模板进行空值判断。$!{smokeInfo.result}

<Cell ss:StyleID="s69">
    <Data ss:Type="String">$!{smokeInfo.result}</Data>
</Cell>

线框丢失

我们变量取值时,我们使用了!进行空值判断后,会出现部分单元格线框丢失的问题,此时我们需要给一个默认值。

#if("$!{smokeInfo.result}" == "")
    <Cell ss:StyleID="s69">
         <Data ss:Type="String">${nullValue}</Data>
    </Cell>
#else
    <Cell ss:StyleID="s69">
         <Data ss:Type="String">$!{smokeInfo.result}</Data>
	</Cell>
#end

其中nullValue来自于我们设置的一个默认值。可以发现是一个空字符串。

paramMap.put("nullValue","");

循环填充

如下图所示,喜喜1喜喜2存在多个值,对于实体属性来说则是一个list。那么我们该如何填充这个值呢?
当某个

        <Row ss:Height="33.75">
            <Cell ss:Index="2" ss:StyleID="s71" ss:MergeDown="1" >
                <Data ss:Type="String">喜喜</Data>
            </Cell>
            <Cell ss:Index="3" ss:StyleID="s70">
                <Data ss:Type="String">喜喜1</Data>
            </Cell>
                #foreach($device in ${deviceList})
                    #if(${device.smokeInfos.size()} > 0)
                        #set($smokeInfoRowCount = (${device.smokeInfos.size()} - 1))
                    #else
                        #set($smokeInfoRowCount = 0)
                    #end
                    #foreach($smokeInfo in ${device.smokeInfos})
                        #if("$!{smokeInfo.result}" == "")
                            <Cell ss:StyleID="s69">
                                <Data ss:Type="String">${nullValue}</Data>
                            </Cell>
                        #else
                            <Cell ss:StyleID="s69">
                                <Data ss:Type="String">$!{smokeInfo.result}</Data>
                            </Cell>
                        #end
                    #end
                    #if($smokeInfoRowCount == 0)
                    <Cell ss:StyleID="s69">
                        <Data ss:Type="String">${nullValue}</Data>
                    </Cell>
                    #end
                #end
        </Row>

其中第一个foreach是数据源循环,第二个foreach是每一条数据中的一个集合属性的遍历。

其他问题

excel无法打开,详见问题原因。

源代码

gitee仓库

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

STM32 DFU模式烧录代码

什么是DFU? dfu的本质是isp&#xff0c;usb接口的isp&#xff0c;在系统编程&#xff0c;进入isp的方式我们先了解 如下图 boot0为高电平 boot1为低电平即可进入isp模式。 熟悉的场景 在我们使用flymcu软件下载代码时&#xff0c;本质也是isp 串口接口的isp。 傻瓜使用方式…

RF电路的分布参数集中参数化

文章目录1.威尔金森功分器的集总参数设计例1&#xff1a;ADS仿真:设计一个工作在1GHz的威尔金森功分器2.分支线定向耦合器的集总参数设计例2&#xff1a;ADS仿真设计一个分支线的定向耦合器&#xff0c;中心频率&#xff1a;920MHz3.总结射频电路的分析会引入分布参数分析的理论…

刷题专练之翻转题练习

文章目录一、 编写函数实现字符串翻转二、轮转数组总结一、 编写函数实现字符串翻转 描述 编写一个函数&#xff0c;实现字符串的翻转 输入描述&#xff1a; 输入一个字符串 输出描述&#xff1a; 输出翻转后的字符串 写法一&#xff1a; 这种方法是定义begin和end&#xff0…

Nacos详细使用操作文档(图文详细)

文章目录Nacos详细使用操作文档(图文详细)1、安装2、Nacos作为注册中心2.1、Nacos服务注册【ICRMS】2.2、Nacos 服务调用2.2.1、Feign 远程调用【Personnel】2.2.2)、RestTemplateRibbon 远程调用【Personnel】3、Nacos作为配置中心4、Nacos 命令空间5、Nacos配置文件参数详解N…

Java 基础面试题——异常

目录1.Exception 和 Error 有什么区别&#xff1f;2.Throwable 类中常用方法有哪些&#xff1f;3.Checked Exception 和 Unchecked Exception 有什么区别&#xff1f;4.throw 和 throws 的区别是什么&#xff1f;5.try-catch-finally 如何使用&#xff1f;6.finally 块中的代码…

4.3 PBR

1. 实验目的 熟悉PBR的应用场景掌握PBR的配置方法2. 实验拓扑 PBR实验拓扑如图4-8所示: 图4-8:PBR 3. 实验步骤 (1) IP地址的配置 R1的配置 <Huawei>system-view

缓存Redis常见面试题

一、Redis概念Redis是⼀个⾼性能的key-value数据库&#xff0c;它是完全开源免费的&#xff0c;⽽且redis是⼀个NOSQL类型数据库&#xff0c;是为了解决⾼并发、⾼扩展&#xff0c;⼤数据存储等⼀系列的问题⽽产⽣的数据库解决⽅案&#xff0c;是⼀个⾮关系型的数据库。二、Red…

【Git】git常用命令总结

简言 git是一个开源的分布式版本控制系统&#xff0c;可以有效、高速地处理从很小到非常大的项目版本管理。 里面有很多常用的命令语法&#xff0c;在此做一个常用命令总结记录&#xff0c;以备不时之需。 命令总结 由于git是基于linux开发的工具&#xff0c;所以有个特点&a…

网安新基建!国内首个“网络安全卓越中心”落地南京江宁

​​近日&#xff0c;国内首个网络安全卓越中心&#xff08;“CyberPeace Center of Excellence”简称“CPCOE”&#xff09;落地南京市江宁区&#xff0c;项目金额数千万元&#xff0c;由赛宁网安建设运营。CPCOE旨在提高全民数字素养、培育网安人才、提升关基防御能力、促进安…

阿里P6细谈Python简易接口自动化测试框架设计与实现,我直呼内行

1、开发环境 操作系统&#xff1a;Ubuntu18 开发工具&#xff1a;IDEAPyCharm插件 Python版本&#xff1a;3.6 2、用到的模块 requests&#xff1a;用于发送请求 xlrd&#xff1a;操作Excel&#xff0c;组织测试用例 smtplib&#xff0c;email&#xff1a;发送测试报告 l…

2023年美国大学生数学建模A题:受干旱影响的植物群落建模详解+模型代码(一)

目录 前言 一、题目理解 背景 解析&#xff1a; 要求 二、建模 1.相关性分析 2.相关特征权重 只希望各位以后遇到建模比赛可以艾特认识一下我&#xff0c;我可以提供免费的思路和部分源码&#xff0c;以后的数模比赛只要我还有时间肯定会第一时间写出免费开源思路&…

计量地理学(Quantitative Geography)的学习笔记

目录 1.什么是主成分分析 2.什么是Thile指数&#xff08;锡尔系数&#xff09;&#xff0c;是用来干什么的 3.罗伦次&#xff08;洛伦兹&#xff09;曲线的含义&#xff0c;表征什么样的现象 4.什么是偏相关分析&#xff0c;偏相关分析系数的含义&#xff0c;主要作用 5.多…

Homekit智能家居-智能插座

WiFi智能插座对于新手接触智能家居产品更加友好&#xff0c;不需要额外购买网关设备 很多智能小配件也给我们得生活带来极大的便捷&#xff0c;智能插座就是其中之一&#xff0c;比如外出忘记关空调&#xff0c;可以拿起手机远程关闭。 简单说就是&#xff1a;插座可以连接wi…

2023版最新最强大数据面试宝典

此套面试题来自于各大厂的真实面试题及常问的知识点&#xff0c;如果能理解吃透这些问题&#xff0c;你的大数据能力将会大大提升&#xff0c;进入大厂指日可待&#xff01;目前已经更新到第4版&#xff0c;广受好评&#xff01;复习大数据面试题&#xff0c;看这一套就够了&am…

m0n0防火墙的安装(11)

实验目的 1、了解m0n0的安装过程 2、培养学生动手能力预备知识 1、VirtualBox的使用&#xff0c;及基础英文阅读能力实验环境 本实验的实验环境为&#xff0c;在实验机上安装VirtualBox虚拟机软件&#xff0c;并用VirtualBox创建了一台虚拟机来安装m0n0&#xff0c;并设置了相关…

47.在ROS中实现global planner(3)

接着之前45.在ROS中实现global planner&#xff08;1&#xff09;和46.在ROS中实现global planner&#xff08;2&#xff09;的铺垫&#xff0c;在ROS中实现AStar Global Planner 1. planner package 照着之前的模板&#xff0c;修改下名称 git clone -b https://gitee.com/…

OpenCV 图像金字塔算子

本文是OpenCV图像视觉入门之路的第14篇文章&#xff0c;本文详细的介绍了图像金字塔算子的各种操作&#xff0c;例如&#xff1a;高斯金字塔算子 、拉普拉斯金字塔算子等操作。 高斯金字塔中的较高级别&#xff08;低分辨率&#xff09;是通过先用高斯核对图像进行卷积再删除偶…

大疆车载更新产品矩阵,覆盖从主动安全到城区领航的全场景

新年智驾供应商的攻势&#xff0c;也像车企一样猛烈。大疆车载近期趁着官网更新&#xff0c;对外公布了梳理后的智驾方案序列&#xff0c;覆盖8大功能产品&#xff1a;主动安全、行车辅助、泊车辅助、记忆泊车、记忆行车、跨层记忆泊车、领航高速、领航城区。需要关注的是&…

金融帝国实验室(Capitalism Lab)《官方中文社群抽奖规则》(修订)

★修 订 说 明★ 为进一步完善社群决策制定程序&#xff0c;提高抽奖活动公平化、丰富化水平&#xff0c;切实提升抽奖活动质量&#xff0c;现对《官方中文社群抽奖规则》进行修订&#xff08;第四次&#xff09;。 ————————————— ◎〖本次修订内容〗&#xf…

C++ 浅谈之 AVL 树和红黑树

C 浅谈之 AVL 树和红黑树 HELLO&#xff0c;各位博友好&#xff0c;我是阿呆 &#x1f648;&#x1f648;&#x1f648; 这里是 C 浅谈系列&#xff0c;收录在专栏 C 语言中 &#x1f61c;&#x1f61c;&#x1f61c; 本系列阿呆将记录一些 C 语言重要的语法特性 &#x1f3…