freemarker导出word,包含富文本内容

maven依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
<dependency>
    <groupId>org.jsoup</groupId>
    <artifactId>jsoup</artifactId>
    <version>1.8.3</version>
</dependency>

word模板创建

创建word文档,将需要替换的内容用${XXX}替换。将文档另存为mht文件(mht文件支持html标签,而xml文件不支持),再另存为ftl文件。修改编码为UTF-8,去除{}内多余的标签代码
在这里插入图片描述

工具类

RichHtmlHandler
WordHtmlGeneratorHelper
WordImageConvertor
RichContent

测试类

String templateName = "test.ftl";
Map<String, Object> data = new HashMap<>();
data.put("author", "一路生花");
data.put("createTime", "2022-08-01");

//创建富⽂本
StringBuilder sb = new StringBuilder();
sb.append("<div>");
String cont = "<p>1、降低风险。2、8月6日开业。3、合作布局。4、服务中心。5、<span style=\"color: rgb(230, 0, 0);\">综合性交易展厅</span>。</p>";
cont = cont + "<p><img src=\"C:\\Users\\yuwen\\Desktop\\pic\\2.jpg\"></p>";
sb.append(cont);
sb.append("</div>");

RichContent richContent = new RichContent();
richContent.setHtml(sb.toString());
//----------------------------------------
//从mht⽂件中找,上面图片红框已勾出
richContent.setDocSrcLocationPrex("file:///C:/268BA2D4");
richContent.setDocSrcParent("test.files");
richContent.setNextPartId("01D8A815.D95DC390");
//从mht⽂件中找,上面图片红框已勾出
richContent.setShapeidPrex("_x56fe__x7247__x0020");
richContent.setTypeid("#_x0000_t75");
richContent.setSpidPrex("_x0000_i");
//-----------------------------------------
RichHtmlHandler richHtmlHandler = WordHtmlGeneratorHelper.createRichHtmlHandler(richContent, false);
List<RichHtmlHandler> richHtmlHandlerList = new ArrayList<>();
richHtmlHandlerList.add(richHtmlHandler);
data.put("imagesXmlHrefString", WordHtmlGeneratorHelper.getXmlImgHref(richHtmlHandlerList));
data.put("imagesBase64String", WordHtmlGeneratorHelper.getImagesBase64String(richHtmlHandlerList));
data.put("content", richHtmlHandler.getHandledDocBodyBlock());
response.addHeader("Content-Disposition", "attachment;filename=test.doc");
this.downWord(response, data, templateName);




private void downWord(HttpServletResponse response, Map<String, Object> data, String templateName) throws Exception {
       // 设置FreeMarker的版本和编码格式
       Configuration configuration = new Configuration(new Version("2.3.28"));
       configuration.setDefaultEncoding("UTF-8");

       // 设置FreeMarker生成Word文档所需要的模板的路径
       // 此处把模版文件都放在 resources 下的 templates 中
       configuration.setClassForTemplateLoading(this.getClass(), "/templates");

       response.setCharacterEncoding("utf-8");
       PrintWriter out = response.getWriter();
       // 设置FreeMarker生成Word文档所需要的模板
       Template template = configuration.getTemplate(templateName, "UTF-8");
       template.process(data, out);
       out.flush();
       out.close();
}

结果演示

在这里插入图片描述

可以使用 Apache POI 和 FreeMarker 来实现 Word 导出。具体步骤如下: 1. 引入依赖: ```xml <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>4.1.2</version> </dependency> <dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker</artifactId> <version>2.3.31</version> </dependency> ``` 2. 编写模板文件,例如 `template.ftl`: ```xml <?xml version="1.0" encoding="UTF-8"?> <w:document xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"> <w:body> <w:p> <w:r> <w:t>${title}</w:t> </w:r> </w:p> <w:p> <w:r> <w:t>${content}</w:t> </w:r> </w:p> </w:body> </w:document> ``` 3. 编写 Java 代码: ```java import freemarker.template.Configuration; import freemarker.template.Template; import org.apache.poi.xwpf.usermodel.XWPFDocument; import org.apache.poi.xwpf.usermodel.XWPFParagraph; import org.apache.poi.xwpf.usermodel.XWPFRun; import java.io.*; import java.util.HashMap; import java.util.Map; public class WordExportUtil { public static void export(Map<String, Object> dataMap, String templatePath, String outputPath) throws Exception { // 1. 创建 Configuration 对象 Configuration configuration = new Configuration(Configuration.VERSION_2_3_31); configuration.setDefaultEncoding("UTF-8"); // 2. 加载模板文件 Template template = configuration.getTemplate(templatePath); // 3. 创建 Word 文档对象 XWPFDocument document = new XWPFDocument(); // 4. 填充数据到 Word 文档中 ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream, "UTF-8"); template.process(dataMap, outputStreamWriter); outputStreamWriter.flush(); ByteArrayInputStream inputStream = new ByteArrayInputStream(outputStream.toByteArray()); BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); String line; while ((line = reader.readLine()) != null) { XWPFParagraph paragraph = document.createParagraph(); XWPFRun run = paragraph.createRun(); run.setText(line); } // 5. 输出 Word 文档 FileOutputStream fileOutputStream = new FileOutputStream(outputPath); document.write(fileOutputStream); fileOutputStream.close(); } } ``` 其中,`dataMap` 是模板中需要填充的数据,`templatePath` 是模板文件的路径,`outputPath` 是输出文件的路径。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值