`
gshxsyq
  • 浏览: 20766 次
社区版块
存档分类
最新评论
阅读更多
        本文重点利用freemarker生成word文档。基本思路是:先编辑好word模板,将模板另存为03版的xml文件,在xml文件中编辑freemarker标签,构建需要动态输出的数据,存放在一个map中,然后调用freemarker.template.Template.process(Object rootMap, Writer out)方法,将构建好的文件输出到指定的writer流中。
         提示:在编辑word模板的时候可以在需要动态输出的地方先写好freemarker标签,类似于${..}这样的,这样方便在另存为的xml文件中找到我们要编辑的地方,因为word生成的xml会很长,比较复杂。注意检查xml文件中freemarker标签的正确性,会在${}中添加word标签,要将其删除。
         在xml中找到需要循环的或者其它动态处理的地方,写上freemarker的FTL命令,以执行相应的动态输出。下面是我写的一个列子,用以动态输出数据库表结构到word文件中。
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import freemark.entity.Column;
import freemark.entity.Table;
import freemarker.template.Configuration;
import freemarker.template.DefaultObjectWrapper;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import freemarker.template.TemplateExceptionHandler;

public class DocumentHandler {
	private Configuration configuration = null;
	private Map<Object, Object> dataMap = null;

	public DocumentHandler() {
		configuration = new Configuration();
		configuration.setDefaultEncoding("UTF-8");
	}

	public void createDoc(String templateDir, String templateFileName,
			String savePath) {
		// 设置模本装置方法和路径,FreeMarker支持多种模板装载方法。可以重servlet,classpath,数据库装载,
		Template t = null;
		try {
			// 从什么地方加载freemarker模板文件
			configuration.setDirectoryForTemplateLoading(new File(templateDir));
			// 设置对象包装器
			configuration.setObjectWrapper(new DefaultObjectWrapper());
			// 设置异常处理器
			configuration
					.setTemplateExceptionHandler(TemplateExceptionHandler.IGNORE_HANDLER);
			// 定义Template对象
			t = configuration.getTemplate(templateFileName);
		} catch (IOException e) {
			e.printStackTrace();
		}
		// 输出文档路径及名称
		File outFile = new File(savePath);
		Writer out = null;
		try {
			out = new BufferedWriter(new OutputStreamWriter(
					new FileOutputStream(outFile), "UTF-8"));
		} catch (Exception e1) {
			e1.printStackTrace();
		}
		
		try {
			t.process(dataMap, out);
		} catch (TemplateException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (null != out) {
				try {
					out.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}

	//构建数据
	private Map<Object, Object> getData() {
		Map<Object, Object> map = new HashMap<Object, Object>();
		List<Table> tables = new ArrayList<Table>();
		Table table = new Table();
		table.setTableName("tableName");
		Column column = new Column();
		column.setName("ID");
		column.setType("varchar(50)");
		column.setIsRequired("Yes");
		column.setDesc("主键");
		table.getColumns().add(column);
		tables.add(table);
		Table table1 = new Table();
		table1.setTableName("tableName");
		Column column1 = new Column();
		column1.setName("ID");
		column1.setType("varchar(50)");
		column1.setIsRequired("Yes");
		column1.setDesc("主键");
		table1.getColumns().add(column1);
		tables.add(table1);
		map.put("tables", tables);
		return map;
	}

	public Map<Object, Object> getDataMap() {
		return dataMap;
	}
	
	public void setDataMap(Map<Object, Object> dataMap) {
		this.dataMap = dataMap;
	}

	public static void main(String[] args) {
		DocumentHandler dh = new DocumentHandler();
		dh.setDataMap(dh.getData());
		dh.createDoc("d:/test", "test.xml", "d:\\test\\outFile.doc");
	}

}

模板的xml文件中的关键内容如下:
<#list tables as table>
  ...
  <#list table.columns as column>
     ...
  </#list>
  ...
</#list>
分享到:
评论

相关推荐

    freemaker 生成word文档

    在Java开发中,我们可以利用FreeMarker库来生成Word文档,这在报告生成、数据导出等场景中非常实用。本篇文章将深入探讨如何使用FreeMarker结合Java技术生成Word文档。 首先,理解FreeMarker的基本原理。FreeMarker...

    freemarker模板导出word循环图片表格源码和详细教程

    在本教程中,我们将探讨如何利用Freemarker模板来导出Word文档,并实现循环插入图片和表格的功能。这对于需要批量生成定制化报告或者文档的应用场景非常有用。 首先,我们需要了解Freemarker的基本语法。在...

    freemarker根据word模板生成word的完整示例

    在这个示例中,我们将深入探讨如何使用Freemarker根据XML模板生成Word文档。 首先,你需要了解Freemarker的基本概念。Freemarker是一个基于模板的语言,它的核心是模板文件,模板文件中包含了一系列控制结构(如...

    java freemark list嵌套导出word

    通过以上步骤,我们可以利用Java和FreeMarker实现列表的嵌套导出,从而创建结构复杂的Word文档。在实际项目中,可能还需要考虑性能优化、错误处理等问题,确保程序的稳定性和效率。对于更复杂的需求,可能需要借助...

    java freemark导出word

    在这个场景中,我们讨论的是如何使用FreeMarker来生成Word文档。FreeMarker是一个纯Java库,不依赖任何外部库,因此在Java环境中非常适合用于生成各种类型的数据报告或文档。 在Java中,FreeMarker与Apache POI库...

    Freemarker导出word示例,包括jfreechart图表

    在本示例中,Freemarker被用于生成Word文档,实现数据与模板的结合,使得动态生成Word文档变得更加简单。 首先,让我们深入了解Freemarker的工作原理。Freemarker模板由纯文本组成,其中包含特定的控制结构,如`...

    freemarkerdemo 生成word 插入图片

    通过理解以上技术点,你可以构建一个能够动态生成包含图片的Word文档的Java Web应用。这个过程涉及到对Freemarker模板的理解,Java对象数据的准备,以及利用Apache POI来处理Word文档结构。在实际应用中,这种能力...

    freemarker.jar freemarker架包 freemarker生成excel、word、html、xml简单例子

    开发者需要定义一个包含Word文档结构和占位符的模板,然后将Java对象的数据填充到这些占位符中,通过Freemarker的API生成最终的.doc或.docx文件。 3. **生成HTML**:这是Freemarker最常用的功能之一,它广泛应用于...

    java+Freemarker生成word

    5. **Apache POI处理Word**:利用Apache POI库,你可以将Freemarker处理后的输出流转换为Word文档。POI提供了API来操作Word文档的各种元素,如段落、表格、字体样式等。 6. **文件输出**:最后,将生成的Word文档...

    freemarker

    通过合理的模板设计和数据模型构建,可以高效地批量生成定制化的Word文档,适用于报告生成、自动化文档处理等多种场景。提供的压缩包文件"用freemarker生成doc"很可能包含了示例代码和模板文件,可供参考学习。

    freemaker导出word的doc_docx_带动态图片及word转pdf工具类_jar_万能整理汇总rengm.zip

    在Freemarker中,我们可以利用Java代码将图片数据嵌入到模板中,比如从数据库获取图片的Base64编码,然后在Word文档中展示。这在生成报告时非常有用,例如根据用户数据生成个性化的图表或照片。 接下来,我们讨论...

    springmvc采用freemarker动态生成带图片的word

    在本项目中,我们将探讨如何利用SpringMVC与Freemarker来动态生成带有图片的Word文档。 SpringMVC是Spring框架的一部分,它是一个强大的Model-View-Controller(MVC)架构,用于开发Java Web应用程序。它提供了模型...

    freemarker导出doc及docx

    总的来说,“freemarker导出doc及docx”涉及到了Freemarker模板引擎的使用、SpringBoot的集成、以及利用Apache POI等库处理Word文档的技巧。实际操作时,你需要根据项目需求定制模板,设置数据模型,最后通过编程...

    ant + freemarker + excel解析

    在IT行业中,Ant、FreeMarker和Apache POI是三个非常重要的工具,它们分别在构建自动化、模板引擎和处理Microsoft Office文档方面发挥着关键作用。在这个"ant + freemarker + excel解析"的主题中,我们将深入探讨这...

    freemaker简单小例子+ECharts例子

    3. **构建数据模型**:创建一个Java对象或Map,其中包含了要传递到模板的数据。这些数据将在模板中被引用。 4. **渲染模板**:使用`Template`对象的`process`方法,将数据模型与模板合并,生成最终的HTML字符串。 ...

Global site tag (gtag.js) - Google Analytics