freemarker生成的word文件打不开

80 篇文章 0 订阅

 

原因1:编码格式不对:

https://blog.csdn.net/g084120209/article/details/50579507

原因2:对象中的  空字段  在转化成  Map  时被省略,导致本该传递到XML的数据未定义。解决方案:从数据库查询出对象之后,要把空字段设置成空字符串。

https://blog.csdn.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;
        }
    }
}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用freemarker生成word ,并集成struts2 同时生成及下载文档 资料附有Java源代码和自己总结的使用说明及注意事项 大至预览如下: 1、用word编辑好模板 普通字符串替换为 ${string} 表格循环用标签 姓名:${user.userName} , 性别:${user.sex} 2、将word模板另存为xml格式 3、将xml模板文件后缀名改为.ftl 4、编辑ftl文件 注意 编辑word模板时,${string} 标签最好是手动一次性输入完毕,或者使用记事本统一将整个${string}编辑好之后,粘贴至word里边。 也就是说,不要在word里首先打完 ${ } 之后,又从其它地方把 string 字符串粘贴至 { } 之间,这样在 word 转化为 xml时,解析会有问题,freemarker解析时,会报错。 /** * @Desc:生成word文件 * @Author:张轮 * @Date:2014-1-22下午05:33:42 * @param dataMap word中需要展示的动态数据,用map集合来保存 * @param templateName word模板名称,例如:test.ftl * @param filePath 文件生成的目标路径,例如:D:/wordFile/ * @param fileName 生成文件名称,例如:test.doc */ @SuppressWarnings("unchecked") public static void createWord(Map dataMap,String templateName,String filePath,String fileName){ try { //创建配置实例 Configuration configuration = new Configuration(); //设置编码 configuration.setDefaultEncoding("UTF-8"); //ftl模板文件统一放至 com.lun.template 包下面 configuration.setClassForTemplateLoading(WordUtil.class,"/com/lun/template/"); //获取模板 Template template = configuration.getTemplate(templateName); //输出文件 File outFile = new File(filePath+File.separator+fileName); //如果输出目标文件夹不存在,则创建 if (!outFile.getParentFile().exists()){ outFile.getParentFile().mkdirs(); } //将模板和数据模型合并生成文件 Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile),"UTF-8")); //生成文件 template.process(dataMap, out); //关闭流 out.flush(); out.close(); } catch (Exception e) { e.printStackTrace(); } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值