package com.cosy.utils;
/**
* @author: why
* @Date: 2020/4/11 10:24
* @Description: 解决word成文格式显示问题
*/
public class FreemarkerWordFormatUtil {
/**
* @Description 格式化文本内容,使其freemarker解析的word文本内容成文格式与用户页面文本格式相同
* @Author why
* @Date 2020/4/11 10:12
* @Param text 带有格式的文本内容
*/
public static String getFormatText(String text){
//处理转义字符
text = transform(text);
//TODO 此处只考虑word成文过程中换行、空格显示问题,在实际开发过程中,可能会遇到其他格式显示,可在此处根据业务需求进行维护
//freemarker 换行
text = text.replaceAll("\r\n","");
//freemarker enter换行
text = text.replaceAll("\n","");
//freemarker 空格 采用ASCII编码值进行替换
text = text.replaceAll(" "," ");
//freemarker tab
text = text.replaceAll("\t"," ");
return text ;
}
}
根据ftl模板导出word时,如果填充的字符含有特殊字符< 、>、&,那么导出的word是无法打开的。因为这些字符在导出word时被认为是ftl的标签,正常导出后再打开是会报错。如果以xml的方式打开,会发现所有内容都是完整的,唯独上面三个特殊字符出问题。 为了解决这个问题,首先我新建一个word,在里面填上上面三个特殊字符,然后保存为xml。在该xml中找到对应的字符,发现已经转义了 ; 对应< ;对应> ;对应& 可以看出,如果填充的是转义后的字符是可以正常打开的。所以要在填充字符之前检测私服是否含有上述特殊字符,如果有就需要转义。代码如下:
/**
* 处理转义字符
* @param str
* @return
*/
private String transform(String str){
if(str.contains("")||str.contains("&")){
str=str.replaceAll("&", ";");
str=str.replaceAll("", ";");
}
return str;
}
|