本文主要做梳理和自己实际使用时的问题总结:
xml版
一开始做导出的时候,只是简单的文字和图片导出,参考文章如下:
参考文章中,主要针对
关于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格式,参考文章中处理方法如下:
这种替换方法,不仅替换掉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();
}