java运用freemark生成word文档(类似论文的格式)问题总览

freemark导出word的文档

相关的工具类:工具类

  • 1、引入freemark依赖:

<!-- freemaker引擎 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
  • 2、拿到word文档之后,先将需要变更的地方用占位符代替,如下:

在这里插入图片描述

  • 3、将文档另存为,xml格式的

  • 4、在项目中resource下,建立template文件夹,放入xml文件,并且把后缀改成ftl

在这里插入图片描述

  • 5、打开生成好的ftl文件,这个时候会发现生成的格式有问题,如下

在这里插入图片描述
这个时候需要删掉多余的部分,改成如下:注意格式不要误删了!
在这里插入图片描述

需要了解一下,freemark中,word.xml的标签

<w:p> <!--表示一个段落-->
<w:val > <!--表示一个值-->
<w:r> <!--表示一个样式串,指明它包括的文本的显示样式,表示一个特定的文本格式-->
<w:t> <!--表示真正的文本内容-->
<w:rPr> <!--是<w:r>标签内的标签,对Run文本属性进行修饰-->
<w:pPr> <!--是<w:p>标签内的标签,对Paragraph文本属性进行修饰-->
<w:rFronts> <!--字体-->
<w:drawing > <!--图片-->
<wp:extent> <!--绘图对象大小-->
<wp:effectExtent > <!--嵌入图形的效果-->
  • 6、了解freemark标签语法

http://www.51gjie.com/javaweb/1093.html
在这里插入图片描述

  • 7、替换模版中的数据,如图: 这种写法跟前端相似,拿到数据,进行循环遍历,以下是职责任务的遍历,list中嵌套list

在这里插入图片描述

  • 8、图片的问题

  • id不要大于1000,会变成1,000,然后就打不开了
    首先要将手册所有的动态图片,放进一个list中
    图片要求:
1、图片名字:image开头,如image1.png,后面要加后缀
2、还需要返回图片类型,有如下类型:image/png,image/jpeg,image/gif,image/jpeg,image/webp
3、 id必须唯一
4、 value值(图片值)必修是base64

在这里插入图片描述

5、开始修改模版数据,先把所有图片添加进资源里面,循环list

binaryData :图片的base64格式数据包

```groovy
<#if imageList??>
    <#list imageList as image>
        <pkg:part pkg:name="/word/media/${image.name}" pkg:contentType="${image.type}" pkg:compression="store">
            <pkg:binaryData>
                ${image.value}
            </pkg:binaryData>
        </pkg:part>
    </#list>
</#if>

图片的源定义,创建关联:
Relationship:图片展示位置与数据包的关联
放在如图红线位置里面:通过图片名字与图片数据资源进行绑定
在这里插入图片描述

如下图:所有图片定义好了,展示图片时只需要通过id就可以绑定图片资源了
在这里插入图片描述

展示图片:需要注意的地方,id前面要加rId
在这里插入图片描述

下面是展示图片的代码:

<w:drawing>
    <wp:inline distT="0" distB="0"
               distL="0"
               distR="0"
               wp14:anchorId="4E968DF3"
               wp14:editId="00D0897C">
        <#--  <wp:extent cx="624840" cy="509676"/>-->
        <wp:extent cx="1249680"
                   cy="1019352"/>

        <wp:effectExtent l="0" t="0"
                         r="0"
                         b="0"/>
        <wp:docPr id="3"
                  name="图片 3"/>
        <wp:cNvGraphicFramePr>
            <a:graphicFrameLocks
                    xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main"
                    noChangeAspect="1"/>
        </wp:cNvGraphicFramePr>
        <a:graphic
                xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main">
            <a:graphicData
                    uri="http://schemas.openxmlformats.org/drawingml/2006/picture">
                <pic:pic
                        xmlns:pic="http://schemas.openxmlformats.org/drawingml/2006/picture">
                    <pic:nvPicPr>
                        <pic:cNvPr
                                id="1"
                                name="图片 1"/>
                        <pic:cNvPicPr/>
                    </pic:nvPicPr>
                    <pic:blipFill>
                        <a:blip r:embed="rId${image.id}"
                                cstate="print">
                            <a:extLst>
                                <a:ext uri="{28A0092B-C50C-407E-A947-70E740481C1C}">
                                    <a14:useLocalDpi
                                            xmlns:a14="http://schemas.microsoft.com/office/drawing/2010/main"
                                            val="0"/>
                                </a:ext>
                            </a:extLst>
                        </a:blip>
                        <a:stretch>
                            <a:fillRect/>
                        </a:stretch>
                    </pic:blipFill>
                    <pic:spPr>
                        <a:xfrm>
                            <a:off x="0"
                                   y="0"/>
                            <a:ext cx="1617272"
                                   cy="1319192"/>
                            <#--<a:ext cx="808636" cy="659596"/>-->
                        </a:xfrm>
                        <a:prstGeom
                                prst="rect">
                            <a:avLst/>
                        </a:prstGeom>
                    </pic:spPr>
                </pic:pic>
            </a:graphicData>
        </a:graphic>
    </wp:inline>
</w:drawing>
6、图片变形问题

导致图片变形,压缩或者拉伸。下面看一下图片位置里面代码有两个核心的地方:

<wp:extent cx="1249680" cy="1019352"/>
<a:ext cx="1617272" cy="1319192"/>

这里我采用固定图片的格式:
在这里插入图片描述

  • 9、动态模版(动态表格)

首先,取到步骤模版的表头,组成一个list,做成动态表头:
在这里插入图片描述

将数据内容组装成List结构循环:
在这里插入图片描述

这个时候,拿到模版的数据,要判断一下,如果是模版一和模版二,是有图片,这个时候要插入图片数据,判断如果是第三列数据,就换成图片格式,if,else判断
在这里插入图片描述

  • 10、分页问题

判断如果是第一页(首页)不需要分页,其他需要分页,红色标注为分页标签
在这里插入图片描述

  • 11、创建目录

目录有一部分是固定数据,一部分是动态数据,职责任务和阶段性绩效评估表是动态数据,动态加,其他保留之前格式。
在这里插入图片描述

  • 12、合并单元格

根据list索引判断,如果第一个开始合并,<w:vMerge w:val=“restart”/>,否则 合并结束

<w:vMerge/>
<#if (task_index??) &&(task_index==0)>
    <w:vMerge w:val="restart"/>
<#else>
    <w:vMerge/>
</#if>
  • 13、换行、空格

换行:<w:br />
空格:&#160;
  • 14、表格渲染

动态表头和数据,<w:tbl>标签 tr为行,tc为列
在这里插入图片描述

  • 15、创建freemark工具类

需要传递的参数有:模版名称,文档名称,相关数据map,HttpServletResponse等参数
在这里插入图片描述

自动装配
在这里插入图片描述

获取装配的模版:
在这里插入图片描述

输出文档路径及名称 ,以临时文件的形式
在这里插入图片描述

导出文件,返回前端
在这里插入图片描述

需要整体注意的是,改一个地方就要运行生成看看,不然到后面很难发现问题,因为freemark对格式要求很严格,多符号,少符号,word就打不开,改的时候本地留备份!

参考网址:
https://blog.csdn.net/qq_40535641/article/details/117031064
https://blog.51cto.com/kaigejava/4851882?b=totalstatistic
http://www.51gjie.com/javaweb/1093.html
https://blog.csdn.net/hui008/article/details/106784534
https://blog.csdn.net/king_zzzzz/article/details/118764855
https://blog.csdn.net/weixin_44516305/article/details/88049964
https://blog.csdn.net/qq53167889/article/details/115003435
https://blog.csdn.net/qq_30168227/article/details/121363240
https://www.cnblogs.com/of-course/p/5944822.html
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Freemarker 本身并不支持生成图片,它是一个模板引擎,用于生成文本文件。但是,你可以使用 Java 的图形库(如 AWT 或 JavaFX)来生成图片,然后将图片插入到模板中。 以下是一个简单的示例,使用 AWT 绘制一张图片并将其插入到 Freemarker 模板中: Java 代码: ```java import java.awt.Color; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; public class ImageGenerator { public static void generateImage(String text, String outputFileName) throws IOException { // 创建 BufferedImage 对象 BufferedImage image = new BufferedImage(200, 100, BufferedImage.TYPE_INT_RGB); // 获取 Graphics2D 对象 Graphics2D g2d = image.createGraphics(); // 设置画布背景色为白色 g2d.setColor(Color.WHITE); g2d.fillRect(0, 0, 200, 100); // 设置字体和颜色 g2d.setColor(Color.BLACK); g2d.drawString(text, 50, 50); // 保存图片 ImageIO.write(image, "png", new File(outputFileName)); } } ``` Freemarker 模板: ```html <html> <body> <h1>欢迎使用 Freemarker</h1> <img src="${imagePath}" /> </body> </html> ``` Java 代码: ```java import freemarker.template.Configuration; import freemarker.template.Template; import java.io.File; import java.io.IOException; import java.io.StringWriter; import java.util.HashMap; import java.util.Map; public class Main { public static void main(String[] args) throws IOException { // 生成图片 ImageGenerator.generateImage("Hello, Freemarker!", "image.png"); // 创建 Freemarker 配置对象 Configuration cfg = new Configuration(Configuration.VERSION_2_3_31); cfg.setDirectoryForTemplateLoading(new File("templates")); // 加载模板文件 Template template = cfg.getTemplate("index.ftl"); // 设置模板变量 Map<String, Object> data = new HashMap<>(); data.put("imagePath", "image.png"); // 渲染模板 StringWriter out = new StringWriter(); template.process(data, out); // 输出渲染结果 System.out.println(out.toString()); } } ``` 在这个示例中,我们创建了一个名为 `ImageGenerator` 的类,其中包含一个名为 `generateImage` 的静态方法,该方法接受要绘制的文本和输出文件名作为参数。该方法使用 AWT 创建一个 `BufferedImage` 对象,并在图像上绘制文本。最后,它将图像保存为 PNG 文件。 在 `Main` 类中,我们使用 `ImageGenerator.generateImage` 方法生成一张图片,并将图片路径传递给 Freemarker 模板中的变量 `imagePath`。然后,我们加载模板文件并使用 `Template.process` 方法渲染模板,将变量 `imagePath` 替换为实际的图片路径。最后,我们将渲染结果输出到控制台。 请注意,这只是一个简单的示例,实际情况可能更为复杂。你需要根据自己的需求进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值