freemarker 导出word文档(包含富文本内容和图片)

3,657 阅读2分钟
本文主要做梳理和自己实际使用时的问题总结:

xml版

一开始做导出的时候,只是简单的文字和图片导出,参考文章如下:

1、blog.csdn.net/niuweihua88…

参考文章中,主要针对

关于freemarker导出word文档,且word中包含图片的处理,网上已有很多人做过类似说明。

大致思路:

1、word模板制作;

2、另存为xml模板,抠去图片内容,用freemarker标志位替换即可;

注意事项:

java代码中设置freemarker属性值时,字段名必须相同,且属性值不能为null (可用空字符串代替),如果是list集合,需在模板文件中做list空校验(参考freemarker语法)。

mht版本

但是如果要在xml中显示富文本,则会出现格式不兼容的情况(富文本在存储到数据库中是一段html代码,包含各种html标签)

后来搜到下面两篇文章:

1、www.cnblogs.com/unruly/p/59…

2、www.cnblogs.com/liaofeifigh…

大致思路:

1、word模板制作;

2、另存为mht,抠去图片内容,用freemarker标志位替换即可

参考文章中,主要针对富文本中包含图片的问题进行处理(也就是html中包含<img>标签的处理)

注意事项:

富文本中html元素标签应该替换为3D格式,参考文章中处理方法如下:clip_image010[5]

这种替换方法,不仅替换掉html标签中的“=”为“=3D”,而且替换掉文本内容的“=”为“=3D”,这个似乎有点 不妥(虽然在导出的word文件中“=3D”仍然展示位“=”),所以针对这个地方做了如下修改:

public static String getHandledDocBodyBlock(String contentStr){   
     //先整体替换
    contentStr = contentStr.replace("=3D", "=").replace("=", "=3D");    
    Document doc = Jsoup.parseBodyFragment(contentStr);    
    Elements body = doc.getElementsByTag("body");    
    NodeTraversor.traverse(new NodeVisitor() {      
      @Override        
        public void head(Node node, int depth) {  
          //遍历文本节点,将其中的“=3D”替换为“=”
            if (node instanceof TextNode) {                
                TextNode textNode = (TextNode)node;                
                String wholeText = textNode.getWholeText();                
                if(StringUtil.isNullOrEmpty(wholeText) && wholeText.contains("=3D")){                   
                     textNode.text(wholeText.replace("=3D", "=").toString());                
                }            
            }        
        }       

     @Override        
     public void tail(Node node, int depth) {  }
     }, body);   
     return body.html();
}