近期,有业务需求为:将页面信息导出为word文档,我才用的freemarker模板技术,将页面先制作成模板我word,再通过后台方法船体属性值,但是遇到:如果页面中有特殊字符,由于word保存的是xml格式,特殊字符嵌入其中,会导致XML文件将其视为标签,从而导致文件打开失败。
于是,在后台取值的过程中通过反射,对实体属性进行处理,再放入ftl模板,文档打开正常。
public class SpecialCharacterUtils {
/**
* 将对象中字符串属性的取值中包含的XML特殊字符替换成转义字符.
*/
public static void replaceXmlSpecialCharacter(final Object object) {
Class<?> clazz = object.getClass();
String setterMethodName = null;
Method setterMethod = null;
String methodName = null;
String value = null;
try {
Method[] methodArray = clazz.getMethods();
for (Method method : methodArray) {
// 不处理返回数据类型不是字符串的方法.
if (method.getReturnType() != String.class) {
continue;
}
methodName = method.getName();
// 不处理非Getter方法
if (!methodName.startsWith("get")) {
continue;
}
value = (String)method.invoke(object);
// 不处理空字符串或空白字符串.
if (StringUtils.isBlank(value)) {
continue;
}
// 替换特殊字符
try {
setterMethodName = "s" + methodName.substring(1);
setterMethod = clazz.getMethod(setterMethodName, String.class);
setterMethod.invoke(object, replaceSpecialCharacter(value));
} catch (Exception e) {
logger.warn(e.getMessage());
}
}
} catch (Exception e) {
logger.error(e.getMessage(), e);
}
}
/**
* XML中的特殊字符替换成转义字符.
*/
protected static String replaceSpecialCharacter(String value) {
if (value == null) {
return null;
}
value = value.replaceAll("&", "&");
value = value.replaceAll("<", "<");
value = value.replaceAll(">", ">");
value = value.replaceAll("'", "'");
value = value.replaceAll("\"", """);
return value;
}
}