Freemarker使用mht制作导出word模板

Freemarker使用mht制作导出word模板

一、制作word导出模板时,我们使用官方的Office Word编辑样式,编辑好之后,另存为mhtml格式,这样我们就可以看到源代码了。注意:创建word文档时,使用doc后缀,docx与doc的操作不一样

二、导出mhtml文件后,我们可以用任意文本编辑器打开,当然别使用word打开,不然没有意义。word打开还是word文档。此时我们就可以看到类似这样的代码:

MIME-Version: 1.0 //版本号,不用管
Content-Type: multipart/related; boundary="----=_NextPart_01D71A83.BC861220"
This document is a Single File Web Page,
also known as a Web Archive file.
If you are seeing this message, your browser or editor doesn't support Web Archive files.
Please download a browser that supports Web Archive, such as Microsoft Internet Explorer.------=_NextPart_01D71A83.BC861220
//这边是提示,乱码的话可以拿去修改,但是----=_NextPart_01D71A83.BC861220值要使用你生成的值哦,不使用的话,暂时没测试

Content-Location: file:///C:/D914DAE1/mettingSta.htm //指定文件在哪,是什么名字,路径可以不修改,但是文件名一定要跟你模板名一致,不然会导出数据存在,但是看不到数据,
Content-Transfer-Encoding: quoted-printable
Content-Type: text/html; charset="utf-8" //设置编码格式为UTF-8

//下方代码均为自主生成,不必修改
<html xmlns:v=3D"urn:schemas-microsoft-com:vml"
      xmlns:o=3D"urn:schemas-microsoft-com:office:office"
      xmlns:w=3D"urn:schemas-microsoft-com:office:word"
      xmlns:dt=3D"uuid:C2F41010-65B3-11d1-A29F-00AA00C14882"
      xmlns:m=3D"http://schemas.microsoft.com/office/2004/12/omml"
      xmlns=3D"http://www.w3.org/TR/REC-html40">
      <head>
    <meta http-equiv=3DContent-Type content=3D"text/html; charset=3Dx-utf-8">
    <meta name=3DProgId content=3DWord.Document>
    <meta name=3DGenerator content=3D"Microsoft Word 15">
    <meta name=3DOriginator content=3D"Microsoft Word 15">
    <link rel=3DFile-List href=3D"mettingSta.files/filelist.xml">
    <!--[if gte mso 9]><xml>
        <o:DocumentProperties>
            <o:Author>1</o:Author>
            <o:LastAuthor>jinrunkeji</o:LastAuthor>
            <o:Revision>2</o:Revision>
            <o:TotalTime>7</o:TotalTime>
            <o:Created>2021-03-16T08:45:00Z</o:Created>
            <o:LastSaved>2021-03-16T08:45:00Z</o:LastSaved>
            <o:Pages>1</o:Pages>
            <o:Words>89</o:Words>
            <o:Characters>512</o:Characters>
            <o:Lines>4</o:Lines>
            <o:Paragraphs>1</o:Paragraphs>
            <o:CharactersWithSpaces>600</o:CharactersWithSpaces>
            <o:Version>16.00</o:Version>
        </o:DocumentProperties>
        <o:CustomDocumentProperties>
            <o:KSOProductBuildVer dt:dt=3D"string">2052-11.1.0.10356</o:KSOProductBui=
                ldVer>
                <o:ICV dt:dt=3D"string">2865940DDB3B4E3CA6A0A3A08EB88BC7</o:ICV>
        </o:CustomDocumentProperties>
        <o:OfficeDocumentSettings>
            <o:AllowPNG/>
        </o:OfficeDocumentSettings>
    </xml><![endif]-->
    <link rel=3DthemeData href=3D"mettingSta.files/themedata.thmx">
    <link rel=3DcolorSchemeMapping href=3D"mettingSta.files/colorschememapping.xml">

三、代码具体修改内容:

<body lang=3DZH-CN style=3D'tab-interval:21.0pt;word-wrap:break-word;text-justify-trim:punctuation'>
<div class=3DWordSection1 style=3D'layout-grid:15.6pt'>
    <p class=3DMsoNormal align=3Dcenter style=3D'margin-bottom:12.0pt;text-align:center'>		<b style=3D'mso-bidi-font-weight:normal'>
        <span style=3D'font-size:18.0pt;font-family:SimSun;color:green'>自定义内容</span>
        </b>
        <b style=3D'mso-bidi-font-weight:normal'>
        <span lang=3DEN-US style=3D'font-size:14.0pt;font-family:SimSun'>
        <o:p></o:p>
        </span>
        </b>
    </p>
</div>
</body>
//此处代码为部分代码,其中可以像我们写html一样编写,具体样式的写法,可以自行百度官方查看
//常用标签:<table><tr><td></td></tr></table>样式可以自行设置,字体颜色,边框大小,页边距等等。

四、配合Java使用:

<body lang=3DZH-CN style=3D'tab-interval:21.0pt;word-wrap:break-word;text-justify-trim:punctuation'>
<div class=3DWordSection1 style=3D'layout-grid:15.6pt'>
<#list testResource as tr> //使用Freemarker的定义方式,
    <p class=3DMsoNormal align=3Dcenter style=3D'margin-bottom:12.0pt;text-align:center'>		<b style=3D'mso-bidi-font-weight:normal'>
        <span style=3D'font-size:18.0pt;font-family:SimSun;color:green'>
        ${tr.title}//此处直接取值即可
        </span>
        </b>
        <b style=3D'mso-bidi-font-weight:normal'>
        <span lang=3DEN-US style=3D'font-size:14.0pt;font-family:SimSun'>
        <o:p></o:p>
        </span>
        </b>
    </p>
</#list>//当然别忘了结尾哦,table的写法与之相同,具体怎么操作,可以按照自身需求写
</div>
</body>

五、总结

A:为什么我们使用这样的方式来做word导出模板?

B:这样的方式可以使我们很快的做出符合要求的,且非常漂亮的模板。

A:这样写有什么注意的地方?

B:修改内容时,进来不懂样式的参数,只修改对应位置即可,样式会根据你的设定自主生成。

A:用这种方法有什么弊端?

B:额,唯一的缺点就是,导出源代码时,会出现换行符变成 ”=“ 需要手动删除一下,由于暂时还没有很好的解决办法,先手动吧,找到了,会即时更新。示例:

 <td width=3D58 style=3D'width:43.2pt;border-top:none;border-left:none;bor=
                der-bottom:
                solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;mso-border-top=
                -alt:
                solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;mso-border=
                -bottom-alt:
                solid windowtext .5pt;mso-border-right-alt:solid windowtext .5pt;padding:
                0cm 5.9pt 0cm 5.9pt;height:20.55pt'>
            <p class=3DMsoNormal align=3Dcenter style=3D'text-align:center'><span cla=
                                                                                  ss=3DSpellE><b
                            style=3D'mso-bidi-font-weight:normal'><span lang=3DEN-US style=3D'font-si=
                                                                        ze:9.0pt;
                                                                        font-family:SimSun'>${totalMeeting}</span></b></span><b style=3D'mso-bidi-fo=
                                                                                                                             nt-weight:
                                                                                                                             normal'><span lang=3DEN-US style=3D'font-size:9.0pt;font-family:SimSun'><=
o:p></o:p></span></b></p>
            </td>
            
//导出,不加修改的源代码

无时无刻不在努力,但是总是离成功差一点点,别着急,稳住,我们能赢

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Freemarker可以通过使用Apache POI库来导出带有图片的Word文档。首先,需要在模板中定义一个图片占位符,然后在Java代码中将图片插入到占位符中。具体步骤如下: 1. 在Word模板中定义一个图片占位符,例如:${image}。 2. 在Java代码中,使用Apache POI库加载模板文件,并获取到模板中的图片占位符。 3. 使用POI的XWPFRun类创建一个新的段落,并将图片插入到段落中。 4. 将段落插入到模板中的图片占位符位置。 5. 保存生成的Word文档。 示例代码如下: ``` // 加载模板文件 FileInputStream fis = new FileInputStream("template.docx"); XWPFDocument doc = new XWPFDocument(fis); // 获取图片占位符 XWPFParagraph imagePlaceholder = doc.getParagraphs().stream() .filter(p -> p.getText().contains("${image}")) .findFirst().orElse(null); // 创建新的段落 XWPFParagraph newParagraph = doc.createParagraph(); // 插入图片到段落中 XWPFRun newRun = newParagraph.createRun(); newRun.addPicture(new FileInputStream("image.jpg"), XWPFDocument.PICTURE_TYPE_JPEG, "image.jpg", Units.toEMU(200), Units.toEMU(200)); // 将段落插入到图片占位符位置 int index = doc.getPosOfParagraph(imagePlaceholder); doc.removeBodyElement(index); doc.setParagraph(newParagraph, index); // 保存生成的Word文档 FileOutputStream fos = new FileOutputStream("output.docx"); doc.write(fos); fos.close(); ``` 注意:在使用POI插入图片时,需要指定图片的类型和大小。示例代码中使用的图片类型为JPEG,大小为200x200像素。 ### 回答2: Freemarker是一种模板引擎,可以将数据和模板结合生成静态文本,并且常见在Spring框架中使用。而导出Word带有图片,一般需要通过POI或者Apache POI来实现,具体步骤如下: 1.首先需要引入POI和Freemarker的jar包。 2.在模板中添加图片的占位符,例如${logo}。 3.通过Java代码将图片读入到输出流中,然后在模板中替换${logo}的内容为图片字节数组的Base64编码。 4.通过Freemarker将数据和模板结合,生成Word文件。 5.最后需要使用POI将Word文件的后缀名由.ftl改为.doc或.docx,并且编写下载逻辑进行下载。 需要注意的是,在将图片插入Word文档时,可能出现图片比例失调或者无法插入图片的情况,这时需要调整插入图片的方式,可以将图片插入一个模板中,然后将模板插入到Word文档中,以保证插入的图片比例正确。 ### 回答3: FreeMarker是一种Java模板引擎,它允许使用模板生成文本输出,其中包括MS Word文档。在导出word带图片时,需要使用FreeMarker的JDBC模式来检索数据和图片,然后将它们插入Word文档中。以下是导出Word带图片的步骤: 1.准备Word模板:首先需要创建一个Word模板,包含需要添加文本的区域和占位符来插入图片。这可以通过在Word中创建一个新文档,添加文本和占位符,然后保存为docx文件来完成。 2.准备模板数据:使用Java代码从数据库中检索需要导出的数据和图片,并将它们作为数据模型引入FreeMarker模板引擎中。 3.将数据模型应用于模板使用FreeMarker模板引擎将数据模型应用于Word模板中,并生成将要输出的Word文档。 4.插入图片:通过在FreeMarker模板使用图片占位符,将图片插入到生成的Word文档中。这可以通过将图片从数据库中检索出来并使用二进制方式插入模板中来完成。 5.保存Word文档:完成所有文本和图片的插入后,将生成的Word文档保存到文件系统或输出流中即可。 在使用FreeMarker导出Word带图片时,需要注意以下几点: 1.在Word模板中应该包含正确的占位符并设置样式和布局。 2.从数据库中检索图片时应该压缩和缩放图片以确保它们适合文档中的区域。 3.在插入图片时,正确处理可能出现的图片格式和分辨率问题。 4.应对可能出现的异常情况进行处理,以确保生成的Word文档具有良好的稳定性和可靠性。 总之,使用FreeMarker导出Word带图片是一项需要谨慎处理的复杂任务。通过遵循以上步骤和注意事项,可以生成具有高质量和稳健性的Word文档并满足客户的需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值