java利用模板导出word文档

这篇具有很好参考价值的文章主要介绍了java利用模板导出word文档。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一.通过XDocReport和FreeMarker模板引擎生成Word文档的方法。

1.依赖:

</dependency>
<dependency>
    <groupId>fr.opensagres.xdocreport</groupId>
    <artifactId>fr.opensagres.xdocreport.document.docx</artifactId>
    <version>2.0.2</version>
</dependency>
<dependency>
    <groupId>fr.opensagres.xdocreport</groupId>
    <artifactId>fr.opensagres.xdocreport.template.freemarker</artifactId>
    <version>2.0.2</version>
</dependency>
<dependency>
    <groupId>org.freemarker</groupId>
    <artifactId>freemarker</artifactId>
    <version>2.3.30</version>
</dependency>

二.数据类型

1.普通数据

java word按模板导出,java,word

2.表格

java word按模板导出,java,word

三.实现

3.1编辑模板:选中区域,按ctrl+F9,右键编辑域,选择邮件合并,输入参数

参数后面加“!”可以避免参数为null而报错,

java word按模板导出,java,word

java word按模板导出,java,word 3.2.代码: 

//获取Word模板,模板存放路径在项目的resources目录下
InputStream ins = this.getClass().getResourceAsStream("/RE22-08.docx");
//注册xdocreport实例并加载FreeMarker模板引擎
IXDocReport report = XDocReportRegistry.getRegistry().loadReport(ins,TemplateEngineKind.Freemarker);
//创建xdocreport上下文对象
IContext context = report.createContext();
//往模板里填充数据(普通数据)
context.put("projectFile",itemPlanVo.getNumber());
context.put("projectName",itemPlanVo.getProjectName());
context.put("startTime",Handler.dateToString1(itemPlanVo.getStartTime()));
context.put("endTime",Handler.dateToString1(itemPlanVo.getEndTime()));
context.put("sumDay",itemPlanVo.getSumDay());
context.put("step1StartTime",Handler.dateToString2(itemPlanVo.getStep1StartTime()));
context.put("step1EndTime",Handler.dateToString2(itemPlanVo.getStep1EndTime()));
context.put("step2StartTime",Handler.dateToString2(itemPlanVo.getStep2StartTime()));
context.put("step2EndTime",Handler.dateToString2(itemPlanVo.getStep2EndTime()));
context.put("step3StartTime",Handler.dateToString2(itemPlanVo.getStep3StartTime()));
context.put("step3EndTime",Handler.dateToString2(itemPlanVo.getStep3EndTime()));
context.put("step4StartTime",Handler.dateToString2(itemPlanVo.getStep4StartTime()));
context.put("step4EndTime",Handler.dateToString2(itemPlanVo.getStep4EndTime()));
context.put("step5StartTime",Handler.dateToString2(itemPlanVo.getStep5StartTime()));
context.put("step5EndTime",Handler.dateToString2(itemPlanVo.getStep5EndTime()));
context.put("step6StartTime",Handler.dateToString2(itemPlanVo.getStep6StartTime()));
context.put("step6EndTime",Handler.dateToString2(itemPlanVo.getStep6EndTime()));
context.put("step7StartTime",Handler.dateToString2(itemPlanVo.getStep7StartTime()));
context.put("step7EndTime",Handler.dateToString2(itemPlanVo.getStep7EndTime()));
context.put("step8StartTime",Handler.dateToString2(itemPlanVo.getStep8StartTime()));
context.put("step8EndTime",Handler.dateToString2(itemPlanVo.getStep8EndTime()));
context.put("step9StartTime",Handler.dateToString2(itemPlanVo.getStep9StartTime()));
context.put("step9EndTime",Handler.dateToString2(itemPlanVo.getStep9EndTime()));
context.put("step10StartTime",Handler.dateToString2(itemPlanVo.getStep10StartTime()));
context.put("step10EndTime",Handler.dateToString2(itemPlanVo.getStep10EndTime()));
context.put("step11StartTime",Handler.dateToString2(itemPlanVo.getStep11StartTime()));
context.put("step11EndTime",Handler.dateToString2(itemPlanVo.getStep11EndTime()));
context.put("step12StartTime",Handler.dateToString2(itemPlanVo.getStep12StartTime()));
context.put("step12EndTime",Handler.dateToString2(itemPlanVo.getStep12EndTime()));
context.put("step13StartTime",Handler.dateToString2(itemPlanVo.getStep13StartTime()));
context.put("step13EndTime",Handler.dateToString2(itemPlanVo.getStep13EndTime()));
context.put("step1Hour",itemPlanVo.getStep1Hour());
context.put("step2Hour",itemPlanVo.getStep2Hour());
context.put("step3Hour",itemPlanVo.getStep3Hour());
context.put("step4Hour",itemPlanVo.getStep4Hour());
context.put("step5Hour",itemPlanVo.getStep5Hour());
context.put("step6Hour",itemPlanVo.getStep6Hour());
context.put("step7Hour",itemPlanVo.getStep7Hour());
context.put("step8Hour",itemPlanVo.getStep8Hour());
context.put("step9Hour",itemPlanVo.getStep9Hour());
context.put("step10Hour",itemPlanVo.getStep10Hour());
context.put("step11Hour",itemPlanVo.getStep11Hour());
context.put("step12Hour",itemPlanVo.getStep12Hour());
context.put("step13Hour",itemPlanVo.getStep13Hour());
context.put("sumHour1",itemPlanVo.getSumHour1());
context.put("sumHour",itemPlanVo.getSumHour());
往模板里填充数据(表格)
int j = 0;
List<ProjectTestItemsRelationEntity> projectTestItemsRelationEntities = projectTestItemsRelationRepository.findAllByFileNumber(fileNumber);
ArrayList<TestItemDocx> testItemDocxes = new ArrayList<>();
for (ProjectTestItemsRelationEntity entity : projectTestItemsRelationEntities) {
    TestItemDocx testItemDocx = new TestItemDocx();
    BeanUtils.copyProperties(entity,testItemDocx);
    testItemDocx.setIndex(++j);
    testItemDocxes.add(testItemDocx);
}
context.put("testItemDocx", testItemDocxes);

FieldsMetadata fm = report.createFieldsMetadata();
//Word模板中的表格数据对应的集合类型
fm.load("roleAndDutyDocx", RoleAndDutyDocx.class,true);
fm.load("testItemDocx", TestItemDocx.class, true);
fm.load("hardWareDocx", HardWareDocx.class, true);
fm.load("softWareDocx", SoftWareDocx.class, true);

//输出到本地目录
FileOutputStream out = new FileOutputStream(new File("D:\\Desktop\\RE22-08 测试实施方案.docx"));
report.process(context, out);

3.3展示

java word按模板导出,java,word

java word按模板导出,java,word

四.freemaker不同数据类型取值方法

1.数据类型

布尔型:等价于java的Boolean类型,不同的是不能直接输出,可转化为字符串输出

日期型:等价于java的Date类型,不同的是不能直接输出,需要转换为字符串再输出

数值型:等价于java中int,float,double等数值类型   (有三种显示形式:数值型(默认)、货币型、百分比型)

字符型:等价于java中的字符串,有很多内置函数

sequence类型:等价于java中的数组,list,set等集合类型

hash类型:等价于java中的Map类型

2.取值

1.布尔类型

在freeMarker页面中不能直接输出,如果要输出需要转换成字符串

方式一:?c
方式二:?string 或 ?string('为true时显示的内容','为false时显示的内容')
方式三:?then('为true时显示的内容','为false时显示的内容')
-->

Boolean flage = true
${flag?c}
${flag?string}
${flag?string('yes','no')}
${flag?string('喜欢','不喜欢')}
${flag?then('yes','no')}
${flag?then('喜欢','不喜欢')}

2.日期类型

在freemarker中日期类型不能直接输出:如果输出要先转成日期型或字符串
1.年月日   ?date
2.时分秒   ?time
3.年月日时分秒 ?datetime
4.指定格式   ?string ("自定义格式")
y: 年 M:月 d:日
H: 时 m:分 s:秒
-->
<#-- 输出日期格式 -->
    ${createDate?date}
<#-- 输出时间格式 -->
    ${createDate?time}
<#-- 输出日期时间格式 -->
    ${createDate?datetime} 
<#-- 输出格式化日期格式 -->
    ${createDate?string("yyyy年MM月dd日 HH:mm:ss")}

3.数值类型

在freemarker中数值类型可以直接输出;
1.转字符串
普通字符串   ?c
货币型字符串  ?string.currency
百分比型字符串 ?string.percent
2.保留浮点型数值指定小数位(#表示一个小数位)
?string["0.##"
-->
<#-- 直接输出数值型 -->
${age} 
${salary} 
${avg} 
<#-- 将数值转换成字符串类型 -->
${salary?c} 
<#-- 将数值转化成货币类型字符串 -->
${salary?string.currency}
<#-- 将数值转化成百分比类型的字符串 -->
${avg?string.percent}
<#-- 将浮点型的数值转换成指定小数位输出(四舍五入) -->
${avg?string["0.##"]} 

4.字符串类型

 在freemarker中字符串类型可以直接输出:
        1.截取字符串(左闭右开)?substring(start,end)
        2.首字母小写输出 ?uncap_first
        3.首字母大写输出 ?cap_first
        4.字母转小写输出 ?lower_case
        5.字母转大写输出 ?upper_case
        6.获取字符串长度 ?length
        7.是否以指定字符开头(boolean 类型) ?starts_with("xx")?string
        8.是否以指定字符结尾(boolean 类型) ?ends_with("xx")?string
        9.获取指定字符的索引 ?index_of("xx")
        10.去除字符串前后空格 ?trim
        11.替换指定字符串 ?replace("xx","xx")
-->
${msg} -- ${msg2} 
${msg?string} -- ${msg2?string} 
<#--1.截取字符串(左闭右开)?substring(start,end)-->
${msg?substring(0,2)}
<#--2.首字母小写输出 ?uncap_first-->
${msg?uncap_first}
<#--3.首字母大写输出 ?cap_first-->
${msg?cap_first}
<#--4.字母转小写输出 ?lower_case-->
${msg?lower_case}
<#--5.字母转大写输出 ?upper_case-->
${msg2?upper_case}
<#--6.获取字符串长度 ?length-->
${msg?length}<
<#--7.是否以指定字符开头(boolean 类型) ?starts_with("xx")?string-->
${msg?starts_with("a")?string}
<#--8.是否以指定字符结尾(boolean 类型) ?ends_with("xx")?string-->
${msg?ends_with("o")?string}
<#--9.获取指定字符的索引 ?index_of("xx")-->
${msg2?index_of("m")}
<#--10.去除字符串前后空格 ?trim-->
${msg2?trim}
<#--11.替换指定字符串 ?replace("xx","xx")-->
${msg?replace("he","we")}

5.空值类型

<#--
字符串空值情况处理:
        FreeMarker的变量必须赋值,否则就会抛出异常。而对于FreeMarker来说,null值和不存在的变量是完全一样的,因为FreeMarker无法理解null值。
        FreeMarker提供两个运算符来避免空值:
①!:指定缺失变量的默认值
    ${value!}:如果value值为空,则默认值是空字符串
    ${value!"默认值"}:如果value值为空,则默认值是字符串“默认值”
②??:判断变量是否存在
    如果变量存在,返回true,否则返回false
    ${(value??)?string}
-->
<#-- 如果值不存在,直接输出会报错 -->
<#-- ${bb}-->
<#-- 值为null的数据 -->
<#--${str1}<br/>-->
<#-- 值为空字符串的数据 -->
${str2}<br/>
<#-- 使用!,当值不存在时,默认显示空字符串 -->
${str!}<br/>
<#-- 使用!"xx",当值不存在时,默认显示指定字符串 -->
${str!"这是一个默认值"}<br/>
<#-- 使用??,判断字符串是否为空;返回布尔类型,如果想要输出,需要将布尔类型转换成字符串-->
${(str??)?string}

6.sequence类型

<#--
    FreeMarker 数据类型
        序列类型 (数组、List、Set)
        通过list指令输出序列
        <#list 序列名 as 元素名>
            ${元素名}
        </#list>

        获取序列的长度        ${序列名?size}
        获取序列元素的下标     ${元素名?index}
        获取第一个元素        ${序列名?first}
        获取最后一个元素       ${序列名?last}
        倒序输出    序列名?reverse
        升序输出    序列名?sort
        降序输出    序列名?sort?reverse
        指定字段名排序   序列名?sort_by("字段名")
    注:一般是JavaBean集合,对应的字段名需要提供get方法
-->
<#-- 数组操作 -->
<#list stars as star>
    下标:${star?index}-姓名:${star}<br/>
</#list>
获取序列的长度:  ${stars?size}<br/>
获取第一个元素:   ${stars?first}<br/>
获取最后一个元素:  ${stars?last}<br/>

<#-- List操作 -->
<#list cityList as city>
    ${city}-
</#list>
<br/>
<#--倒序输出    序列名?reverse-->
<#list cityList?reverse as city>
    ${city}-
</#list>
<br/>
<#--升序输出    序列名?sort-->
<#list cityList?sort as city>
    ${city}-
</#list>
<br/>
<#--降序输出    序列名?sort?reverse-->
<#list cityList?sort?reverse as city>
    ${city}-
</#list>
<br/>
<#list userList as user>
    编号:${user.id}&nbsp;姓名:${user.username}&nbsp;${user.age}<br/>
</#list>
<#--指定字段名排序   序列名?sort_by("字段名")-->
<#list userList?sort_by("age") as user>
    编号:${user.id}&nbsp;姓名:${user.username}&nbsp;${user.age}<br/>
</#list>

7.hash类型

<#--
    数据类型:hash类型
        key遍历输出
            <#list hash?keys as key>
                ${key} -- ${hash[key]}
            </#list>
         value遍历输出
            <#list hash?values as value>
                ${value}
            </#list>
-->
<#-- key遍历输出 -->
<#list cityMap?keys as key>
    ${key} -- ${cityMap[key]} <br/>
</#list>
 
<#--value遍历输出-->
<#list cityMap?values as value>
    ${value}<br/>
</#list>

 参考:Java导出Word文档的几种方法_Archie_java的博客-CSDN博客

Freemarker简单概述及其数据类型的简单学习—快速入门(一)_freemark 判断日期类型_@夜魅的博客-CSDN博客文章来源地址https://www.toymoban.com/news/detail-767457.html

到了这里,关于java利用模板导出word文档的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android 基于POI库,根据模板导出word文档

    由于项目需求,需要根据用户提供的word模板,填充动态内容生成新的word,为了记录自己的踩坑日记,记录一下。 Apache POI 是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程序对文档读和写的功能。 这里给出官网链接-POI官网,同时下载版本也在官网链接中,可

    2024年01月18日
    浏览(36)
  • java根据模板导出word

    日常开发中,常常会遇到各种各样的表格进行导出,比较好的办法就是提前弄好word模版,再通过遍历的方式进行导出文档 模版编写 内容替换 目标下面模版进行多页展示 将word转换成xml 将xml格式化 再将xml改成ftl xml格式化地址 list找到起始位置和结束位置 起始位置插入#list

    2024年02月15日
    浏览(77)
  • java按照模板导出pdf或者word

    (一)制作模板  1、在word里制作模板         因为PDF常用的软件不支持编辑,所以先用Word工具,如WPS或者Office新建一个空白Word文档,里面制作出自己想要的样式。 2、 将Word转换成PDF形式          将设置好的Word文档转换成PDF形式,保存起来。 3、编辑PDF准备表单 

    2024年02月06日
    浏览(38)
  • Java文件:XWPFDocument导出Word文档

    在Java项目开发过程中经常会遇到导出Word文档的业务场景。XWPFDocument是apache基金会提供的用户导出Word文档的工具类。 XWPFDocument:代表一个docx文档 XWPFParagraph:代表文档、表格、标题等各种的段落,由多个XWPFRun组成 XWPFRun:代表具有同样风格的一段文本 XWPFTable:代表一个表格

    2024年01月18日
    浏览(25)
  • Java 实现导出 Word 文档的方法详解

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 在 Java 应用程序中,有时候我们需要将数据导出为 Word 文档,以便进行文档的编辑、打印或共享。本文将介绍如何

    2024年02月15日
    浏览(28)
  • Java导出PDF文档(模板导出和自定义)

    需要导出PDF文档,支持模板导出和自定义文档格式。 PDF模板创建可使用表单域创建表单字段,引入数据填充,或者根据实际需要生成html转换成pdf。 PDF模板可以考虑使用PDF编辑器编辑,创建表单域,配置好相应字段      

    2024年02月16日
    浏览(34)
  • Java根据word模板生成word文档并转成PDF文件

    定义完我们的模板之后,我们要将文档保存为xml的格式 生成的xml格式看起来比较乱,没有层次感, 所以需要格式化一下 格式化 基础信息的定义 基础信息的定义只要保证我们转化成的xml文件中的${name}等格式没错误即可 表格的定义 遍历实现,表格的数据填充 在xml文件中我们的

    2024年02月09日
    浏览(39)
  • Java POI导出富文本的内容到word文档

    当创建使用富文本编辑器,操作完的数据,传输到后台都是带有html标签的。 如:h1标题头/h1h2第二个标题/h2a href=\\\"www.baidu.com\\\"百度搜索/a 我们想把富文本数据转换为Word内容。 Word是完全支持html标签的,但是我们获取到的富文本内容并不是完整的html代码,所有我们需要先补全

    2024年02月09日
    浏览(37)
  • JAVA之利用easypoi将word模板导出为pdf(可带图片)

    EasyPoi是一款基于POI的Java快速导出/导入Excel工具。它在POI的基础上进行了封装,提供了更加简洁易用的API,使得生成Excel文件更加容易和高效。 使用EasyPoi可以轻松地生成Excel文件,并支持多种格式,如xlsx、xls、csv等。同时,EasyPoi也支持读取Excel文件,可以方便地获取其中的数

    2024年02月08日
    浏览(36)
  • Java POI导出Word、Excel、Pdf文档(可在线预览PDF)

    1、导入依赖Pom.xml        dependency             groupIdorg.apache.poi/groupId             artifactIdpoi/artifactId             version3.14/version         /dependency 2、Controller   3、Service a、pdfService b、wordService c、excelService  4、Utils 5、模板截图   6、前端

    2024年02月08日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包