freemarker制作word模板

1.调用free marker导出word

  @Test
    public void testExportWord() {
        EnergyVo vo = new EnergyVo(); // 为ftl中所用的属性集合对象
        File file = null;
        String fileName = "test.ftl";
        try {
            file = ResourceUtils.getFile(ResourceUtils.CLASSPATH_URL_PREFIX + "ftl/"+fileName);
//            file = new File()getClass().getClassLoader().getResource("lic").getFile();
//            ResourceFinder.getResourceAsStream("");
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        DocumentHandler documentHandler = new DocumentHandler();
        //保存路径
        String savePath = file.getParent()+"\\test4.doc";
        System.out.println("保存路径:"+savePath);
        setAllData(vo);
//        setImage(file, vo);
        documentHandler.createDoc(file.getParent(), file.getName(), savePath, vo);
        System.out.println("ok");
    }

1.将test.doc文件另存为test.xml格式的文件。

2.更改test.xml为test.ftl。文中的路径需要自己更改。

3.EnergyVo 为ftl中所用的属性的集合对象,如 属性 String head,在test.ftl中可${head}拿到值。

2.导出word模板

	/**
	 *
	 * @param dir 模板加载路径
	 * @param tempName 模板名称
	 * @param savePath  文件保存的路径、文件名
	 * @param sDate 数据集
	 */
	public void createDoc(String dir, String tempName, String savePath, Object sDate) {
		Template template = null;
		// 文件保存位置
		File outFile = new File(savePath);

		Writer out = null;
		try {
			// 设置模板加载路径
			configuration.setDirectoryForTemplateLoading(new File(dir));
			// 异常控制
			configuration.setTemplateExceptionHandler(TemplateExceptionHandler.IGNORE_HANDLER);
			// 加载模板
			template = configuration.getTemplate(tempName);
			//生成文件的路径及文件名
			FileOutputStream fileOutputStream = new FileOutputStream(outFile);
			OutputStreamWriter outputStreamWriter = new OutputStreamWriter(fileOutputStream, "utf-8");
			BufferedWriter bufferedWriter = new BufferedWriter(outputStreamWriter);
			out =bufferedWriter;
			// 合并模板和数据
			template.process(sDate, out);
			out.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

 

3.test.ftl文件解析

1.表格模板的制作

java类vo中建立属性

 @ApiModelProperty(value = "表1-1")
    private List> listTab1_1;


test类中赋值
List> listTab1_1 = new ArrayList<>();
		for (int i = 0; i < 4; i++) {
			Map map = new HashMap<>();
			map.put("sort", "_");
			map.put("name", "_");
			map.put("trans", "_");
			map.put("sale", "_");
			listTab1_1.add(map);
		}
		vo.setListTab1_1(listTab1_1);

ftl文件中映射取值

freemarker制作word模板_第1张图片

注意:属性命名时首字母不能大写。中间不能有特殊符号,如- +,可以为_。

为表格的行,w:t为一个单元格。处为单元格的值,为单元格长度

2. 遇到空单元格。需要合并单元格如何做

freemarker制作word模板_第2张图片

可在要遍历此单元格的属性前添加空值判断

freemarker制作word模板_第3张图片

注意:边框问题:常见边框标签







可通过这种方法添加边框
方法2.在下面可添加此标签
为有值单元格所有的标签
为空值单元格的标签

3.如何插入图片

根据 此处的id值搜索。找到target属性值media/image2.png。搜索此值。找到一段64位编码的符号。在中。删除这些符号。使用vo中的属性值代替


    ${image4_1} 
String imagepath = file.getParent() + "/image4_1.png";// 图片的路径



private static String getImageStr(String imagepath) {
		InputStream in = null;
		byte[] data = null;
		try {
			in = new FileInputStream(imagepath);
			data = new byte[in.available()];
			in.read(data);
			in.close();
			BASE64Encoder encoder = new BASE64Encoder();
			return encoder.encode(data);
		} catch (IOException e) {
			System.out.println(e.getMessage());
		}
		return null;
	}

将经过此方法的返回值赋值给vo类中的属性

vo.setImage4_1(getImageStr(imagepath));

到此。图片就可以在模板中显示

以上内容为初次使用freemaker的心得,以后遇到更多问题会持续更新。

 

你可能感兴趣的:(freemarker)