freemarker生成的word文件打不开

 

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;
        }
    }
}