freemarker生成的word文件打不开
原因1:编码格式不对:
https://blog.****.net/g084120209/article/details/50579507
原因2:对象中的 空字段 在转化成 Map 时被省略,导致本该传递到XML的数据未定义。解决方案:从数据库查询出对象之后,要把空字段设置成空字符串。
https://blog.****.net/Zjruana/article/details/80929597
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import org.apache.commons.lang.StringUtils;
public class setNullField {
public static Object setNullField(Object obj) {
Class<? extends Object> clazz = obj.getClass();
// 获取实体类的所有属性,返回Field数组
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
// 可访问私有变量
field.setAccessible(true);
// 获取属性类型
String type = field.getGenericType().toString();
// 如果type是类类型,则前面包含"class ",后面跟类名
if ("class java.lang.String".equals(type)) {
// 将属性的首字母大写
String methodName = field.getName().replaceFirst(field.getName().substring(0, 1),
field.getName().substring(0, 1).toUpperCase());
//System.out.println(methodName);
try {
Method methodGet = clazz.getMethod("get" + methodName);
// 调用getter方法获取属性值
String str = (String) methodGet.invoke(obj);
if (StringUtils.isBlank(str)) {
// Method methodSet = clazz.getMethod("set" +
// methodName, new Class[] { String.class });
// methodSet.invoke(o, new Object[] { "" });
// System.out.println(field.getType()); // class java.lang.String
// 如果为null的String类型的属性则重新复制为空字符串
field.set(obj, field.getType().getConstructor(field.getType()).newInstance(""));
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
return obj;
}
}
另:对象转为 Map 代码:【先转为 Json 字符串】
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
User user = userService.find(userid);
user = (User)setNullField.setNullField(user); // null 字段 设置为 空字符串
String userJson = JSON.toJSONString(user);
Map map = Json2Map.json2Map(userJson);
Json2Map:
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
public class Json2Map {
/**
* 将json字符串转为Map结构
* 如果json复杂,结果可能是map嵌套map
* @param jsonStr 入参,json格式字符串
* @return 返回一个map
*/
public static Map<String, Object> json2Map(String jsonStr) {
Map<String, Object> map = new LinkedHashMap<>();
if(jsonStr != null && !"".equals(jsonStr)){
//最外层解析
JSONObject json = JSONObject.fromObject(jsonStr);
for (Object k : json.keySet()) {
Object v = json.get(k);
//如果内层还是数组的话,继续解析
if (v instanceof JSONArray) {
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
Iterator<JSONObject> it = ((JSONArray) v).iterator();
while (it.hasNext()) {
JSONObject json2 = it.next();
list.add(json2Map(json2.toString()));
}
map.put(k.toString(), list);
} else {
map.put(k.toString(), v);
}
}
return map;
}else{
return null;
}
}
}