poi-tl根据模板生成word文件

基础操作

  • 本质上是通过占位符进行内容替换
  • 本文章仅操作docx格式的文档
    .doc (Word 97-2003): 使用OLE2格式,对应POI的 HWPF 组件
    .docx (Word 2007+): 使用OOXML格式,对应POI的 XWPF 组件

基础操作_模板部分

  • 将模板放入resources 资源目录下,自定义文件夹中,例如:templet/word_template/demo_template.docx

代码部分

  • maven

    xml 复制代码
    		<!-- 用于生成word版报告 -->
    		<dependency>
    		    <groupId>com.deepoove</groupId>
    		    <artifactId>poi-tl</artifactId>
    		    <version>1.12.1</version>
    		</dependency>
  • 处理过程

    java 复制代码
    	// 模板文件
        String templateFilePath = "templet/word_template/demo_template.docx";
        // 读取模板文件
        InputStream templateIn = getClass().getClassLoader().getResourceAsStream(templateFilePath);
    
        // 插入文本数据
        Map<String, Object> templateData = new HashMap<String, Object>();
        templateData.put("str1", "替换成功");
    
        // 生成模板文件
        XWPFTemplate template = XWPFTemplate.compile(templateIn).render(templateData);
        
        // 写入数据并关闭流
        template.writeAndClose(new FileOutputStream("D:/output.docx"));
        templateIn.close();
  • 此时,文件便下载到了 D:/output.docx 的位置。

  • 若为Web

java 复制代码
public void pgdExport(HttpServletResponse response) throws IOException {

        // 模板文件
        String templateFilePath = "templet/word_template/demo_template.docx";
        // 读取模板文件
        InputStream templateIn = getClass().getClassLoader().getResourceAsStream(templateFilePath);

        // 插入文本数据
        Map<String, Object> templateData = new HashMap<String, Object>();
        templateData.put("str1", "替换成功");

        // 生成模板文件
        XWPFTemplate template = XWPFTemplate.compile(templateIn).render(templateData);
        ServletOutputStream outputStream = response.getOutputStream();

        // 防止文件以及文件名乱码
        String fileName = "文件名.docx";
        String encodedFileName = URLEncoder.encode(fileName, "UTF-8").replaceAll("\\+", "%20");
        response.setContentType("application/vnd.openxmlformats-officedocument.wordprocessingml.document");
        response.setHeader("Content-Disposition", "attachment; filename=\"" + encodedFileName + "\"; filename*=utf-8''" + encodedFileName);
        response.setCharacterEncoding("UTF-8");

			  // 写入数据并关闭流
        template.writeAndClose(outputStream);
        templateIn.close();
    }
js 复制代码
// 前端js代码
// 如果此接口需要被鉴权,那么需要后端同时从Params中获取token,然后前端拼接token传递,否则此方法无法使用
// 需要注意跨域问题
window.location.href =  '你的接口地址';

插入图片

  • 模板:占位符格式是{{@xxxx}}
  • 代码
java 复制代码
import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.data.PictureType;
import com.deepoove.poi.data.Pictures;

templateData.put("img", Pictures.ofStream(in, PictureType.JPEG).size(300, 300).create());

参考文章

相关推荐
骆驼爱记录14 小时前
Word样式检查器使用指南
自动化·word·excel·wps·新人首发
缺点内向2 天前
C#: 告别繁琐!轻松移除Word文档中的文本与图片水印
c#·自动化·word·.net
徐小夕@趣谈前端2 天前
拒绝重复造轮子?我们偏偏花365天,用Vue3写了款AI协同的Word编辑器
人工智能·编辑器·word
kingwebo'sZone3 天前
C#使用Aspose.Words把 word转成图片
前端·c#·word
科技D人生3 天前
Vue.js 学习总结(20)—— Vue-Office 实战:word、pdf、excel、ppt 多种文档的在线预览
vue.js·word·vue-pdf·stylesheet·docx-preview·vue-office
weixin_416660074 天前
技术分析:豆包生成带公式文案导出Word乱码的底层机理
人工智能·word·豆包
骆驼爱记录4 天前
Word样式库不显示的8种修复方法
word·wps·新人首发
苍煜4 天前
超简单 poi-tl 学习博客:从0到1掌握Word生成(无需模板+模板填充)
学习·word
请为小H留灯4 天前
Word论文 封面、目录、页码设置步骤!(2026详细版教程)
毕业设计·word·论文格式
星尘库4 天前
在word中怎么把段落回车替换成空 删除空行
word