欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

freemarker制作word模板

程序员文章站 2022-03-08 12:16:39
...

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<Map<String, Object>> listTab1_1;


test类中赋值
List<Map<String, Object>> listTab1_1 = new ArrayList<>();
		for (int i = 0; i < 4; i++) {
			Map<String, Object> 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模板

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

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

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

freemarker制作word模板

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

freemarker制作word模板

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

<w:tcBorders>
<w:left w:val="single" w:sz="4" w:space="0" w:color="000000"/>
<w:bottom w:val="single" w:sz="4" w:space="0" w:color="000000"/>
<w:right w:val="single" w:sz="4" w:space="0" w:color="000000"/>
</w:tcBorders>

可通过这种方法添加边框
方法2.在<w:tcW w:w="1506" w:type="dxa"/>下面可添加此标签
<w:vMerge w:val="restart"/>为有值单元格所有的标签
<w:vMerge/>为空值单元格的标签

3.如何插入图片

根据<v:imagedata r:id="rId8" o:title="1521623111(1)"/> 此处的id值搜索。找到target属性值media/image2.png。搜索此值。找到一段64位编码的符号。在<pkg:binaryData>中。删除这些符号。使用vo中的属性值代替

<pkg:part pkg:name="/word/media/image2.png" pkg:contentType="image/png" pkg:compression="store">
   <pkg:binaryData> ${image4_1} </pkg:binaryData>
</pkg:part>
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的心得,以后遇到更多问题会持续更新。