请叫我小C的gravatar头像
请叫我小C 2016-01-12 11:58:51
利用java通过freemarker模板文件生成带格式的word文档

最近做了个小项目,需要在线生成起诉状且带格式。做了个小工具分享给大家,也借鉴了网络上的东西,废话不多说,上干货

1.把需要生成固定格式的文件保存为word文档(图1)

2.把word另存为xml格式,并且格式化,好修改里面的东西

3.修改好后保存,格式改为ftl模板

下面代码:

public final static String createWord(HttpServletResponse response,Map dataMap, String templateName, String fileName) {
        String result = "系统提示:Word文件导出成功!";
        try {
            OutputStream os = response.getOutputStream();
            //设置头部文件生成格式为微软word
            response.reset();
            response.setHeader("Content-disposition", "attachment; filename=" + new String(fileName.getBytes("GB2312"), "ISO8859-1"));
            response.setContentType("application/msword");

            Configuration configuration = new Configuration();
            configuration.setDefaultEncoding("UTF-8");
            configuration.setClassForTemplateLoading(WordUtil.class, "/");//这里是指放在classes下
            // 获取模板
            Template template = configuration.getTemplate(templateName);
            // 将模板和数据模型合并生成文件
            Writer out = new BufferedWriter(new OutputStreamWriter(os, "UTF-8"));
            template.process(dataMap, out);
            // 关闭流
            out.flush();
            out.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }



public static void main(String[] args) throws IOException, TemplateException {
        String s = "{\"plaintiff\": [{ \"pUserName\": \"张三\", \"pUserSex\": \"男\", \"pAgeIcard\": \"44\",\"pNation\": \"汉族\",\"pAddress\": \"江苏\"},{\"pUserName\": \"得到\",\"pUserSex\": \"男\",\"pAgeIcard\": \"54\",\"pNation\": \"汉族\",\"pAddress\": \"湖南\"}],"
                + "\"accusedMan\": [{ \"accusedManName\": \"张三\", \"accusedManAddress\": \"男\", \"accusedManPeson\": \"张三\",\"accusedManJob\": \"班长\"}],\"signData\":{\"courtName\":\"北京\",\"copyNumber\":\"1\",\"suitor\":\"张三\"},\"lawsuitReest\":\"ddd\",\"reasonsContent\":\"dfdf\"}";
        Map dataMap = new HashMap();
        Map complaintMap = JsonUtil.getJsonToObject(s, Map.class);
        List<Map> plaintiffList = new ArrayList<Map>();
        List<Map> accusedManList = new ArrayList<Map>();
        for (Object key : complaintMap.keySet()) {
            Object contentJson = complaintMap.get(key);
            if (key.equals("plaintiff")) {
                plaintiffList.addAll(JsonUtil.queryJsonToList(contentJson.toString(), Map.class));
            } else if (key.equals("accusedman")) {
                accusedManList.addAll(JsonUtil.queryJsonToList(contentJson.toString(), Map.class));
            } else {
                dataMap.put(key, contentJson);
            }
        }
        dataMap.put("plaintiff", plaintiffList);
        dataMap.put("accusedman", accusedManList);
        Configuration configuration = new Configuration();
        configuration.setDefaultEncoding("UTF-8");
        configuration.setClassForTemplateLoading(WordUtil.class, "/");
        // 获取模板
        Template template = configuration.getTemplate("qsz.ftl");
        // 输出文件
        File outFile = new File("d:/" + File.separator + "cc.doc");
        // 如果输出目标文件夹不存在,则创建
        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();
    }

 

public class JsonUtil {

	/**
	 * 从一个JSON 对象字符格式中得到一个java对象
	 * 
	 * @param jsonString JSON 对象字符
	 * @param pojoCalss 对象class * 
	 * @return 返回java对象
	 */
	public static Object getObject4JsonString(String jsonString, Class<?> pojoCalss) {
		Object pojo;
		JSONObject jsonObject = JSONObject.parseObject(jsonString);
		pojo = JSONObject.toJavaObject(jsonObject, pojoCalss);
		return pojo;
	}

	/**
	 * 从json HASH表达式中获取一个map,改map支持嵌套功能
	 * 
	 * @param jsonString json HASH表达式
	 * @return 返回map数组
	 */
	public static Map<String,Object> getMap4Json(String jsonString) {
		JSONObject jsonObject = JSONObject.parseObject(jsonString);
		Iterator<String> keyIter = jsonObject.keySet().iterator();
		String key;
		Object value;
		Map<String,Object> valueMap = new HashMap<String,Object>();

		while (keyIter.hasNext()) {
			key = (String) keyIter.next();
			value = jsonObject.get(key);
			valueMap.put(key, value);
		}
		return valueMap;
	}

	/**
	 * 从json数组中得到相应java数组
	 * 
	 * @param jsonString json字符串
	 * @return 返回java数组
	 */
	public static Object[] getObjectArray4Json(String jsonString) {
		JSONArray jsonArray = JSONArray.parseArray(jsonString);
		return jsonArray.toArray();
	}

	/**
	 * 将一个对象转换为JSON字符串
	 * @param obj 对象
	 * @return 返回json字符串
	 */
	public static String getObjectToJsonObject(Object obj){
		return JSON.toJSON(obj).toString();
	}	
	

	/**
	 * 从json数组中解析出java字符串数组
	 * 
	 * @param jsonString json字符串
	 * @return 返回java字符串数字
	 */
	public static String[] getStringArray4Json(String jsonString) {
		JSONArray jsonArray = JSONArray.parseArray(jsonString);
		String[] stringArray = new String[jsonArray.size()];
		
		for (int i = 0; i < jsonArray.size(); i++) {
			stringArray[i] = jsonArray.get(i).toString();
		}

		return stringArray;
	}

	/**
	 * 将一个JSON数据转换为对应的JAVA对象</br>
	 * JSON数据中键的名称必须和对应JAVA对象中bean字段的名称一致</br>
	 * @param <T> java对象值
	 * @param jsonString JSON 对象字符
	 * @param cls 对象class * 
	 * @return 返回java对象
	 */
	public static <T> T getJsonToObject(String jsonString, Class<T> cls) {
		return JSONObject.parseObject(jsonString,cls);
	}
	
	/**
	 * 从json对象集合表达式中得到一个java对象集合</br>
	 * JSON数据中键的名称必须和对应JAVA对象中bean字段的名称一致</br>
	 * 
	 * @param <T> 对象值
	 * @param jsonString json字符串
	 * @param cls  JAVA Bean对象
	 * @return JAVA bean对象集合list
	 */
	public static <T> List<T> queryJsonToList(String jsonString,Class<T> cls) {
		List<T> list = JSONArray.parseArray(jsonString,cls);
		return list;
	}
	
}

 

利用java通过freemarker模板文件生成带格式的word文档

 

还有一个ftl的模板文件,可以自己写个,也可以找我要


打赏
最近浏览
wuyingya12  LV7 2021年2月2日
kinggode  LV14 2020年11月30日
rao99120  LV1 2020年9月21日
wkc  LV21 2020年6月28日
yanjianguo 2020年3月25日
暂无贡献等级
不知道用户名 2020年2月20日
暂无贡献等级
Immortal code  LV1 2019年11月29日
gky12345 2019年6月13日
暂无贡献等级
Knightjie  LV9 2019年5月30日
心灵的太阳 2019年4月21日
暂无贡献等级
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友