java使用freemarker导出word文档

一、创建word文档模板

1. 生成想要生成的word样式,保存为xml文件

在这里插入图片描述

在这里插入图片描述
2.修改为ftl文件,并用编辑器打开,将需要填入的地方用占位符表示
在这里插入图片描述
3.需要一些语法操作的地方,要使用ftl语法,具体参考ftl基础语法
这次用到了插入多张图片,因为图片数量不是固定的,通过对for循环遍历和if判断完成每4张图片换行,根据取余判断是否需要行标签
在这里插入图片描述
在这里插入图片描述

还有最重要的三个关键地方需要进行占位符替换

在这里插入图片描述

在这里插入图片描述
③ 此处是将原文档加入的图片base64码进行占位符替换
在这里插入图片描述
至此,文档模板制作完成了

二、用poi导出文档代码

1.设置为附件下载

在这里插入图片描述
2.用Map封装模板数据,此处以图片示例,图片需要传入base64码
在这里插入图片描述
在这里插入图片描述
3.加载模板(此处踩坑),读取模板时百度搜有三个方法,其中使用setClassForTemplateLoading时,本地可以读取成功,但是到测试环境则读不到模板,其他两种方法,也没试成功。其中还有“/”开头为绝对路径,没有“/”为相对路径的坑,最后改用setTemplateLoader解决问题,在resource下新建template文件夹放入模板文件
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
附上代码:

public Response exportNpsInformReportsDetails(String id, HttpServletResponse response) {
   
        LogUtil.info("请求参数:" + id);
        response.reset();
        OutputStream out = null;
        response.setContentType("application/x-msdownload");
        try {
   
            out = response.getOutputStream();
            response.setHeader("Content-Disposition",
                    "attachment;filename=" + URLEncoder.encode("文件名称" + ".doc", "UTF-8"));
            ExportWordSupport exportWordSupport = new ExportWordSupport();
            Map<String, Object> dataMap = getExportMap(id, exportWordSupport);
            exportWordSupport.createWord(dataMap, out);
        } catch (Exception e) {
   
            LogUtil.info("导出失败: " + e.getMessage());
            return Response.responseCode(GlobalConst.ErroCode.SERVICE_EXPORT_ERROR, null);
        } finally {
   
            if (null != out) {
   
                try {
   
                    out.close();
                } catch (IOException e) {
   
                    LogUtil.error(e, "export");
                }
            }
        }
        return Response.responseCode(GlobalConst.ErroCode.SERVICE_SUCCESS, null);
    }

```java
/**
     * 导出举报详情数据
     *
     * @param id
     * @return
     */
    private Map<String, Object> getExportMap(String id, ExportWordSupport exportWordSupport) {
   
        VideoReportEntity videoReportEntity = npsInformDao.queryNpsInformReportDetails(id);
        LogUtil.info("详情数据: " + videoReportEntity);
        Map<String, Object> dataMap = new HashMap<>();
        if (VideoInformType.CONTENT.equals(videoReportEntity.getReportSort())) {
   
            String reportTime = DateTimeUtil.formatTime(videoReportEntity.getReportTime(), DateTimeUtil.yyyyMMddHHmmss);
            dataMap.put("reportTime", reportTime);
            dataMap.put("userPhone", videoReportEntity.getUserPhone() == null? ""
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值