Freemarker + xml 实现Java导出word

摘要:
前言最近提供了问卷导出功能。要求将维护的问题和答案导出到Word。在参考了几种方案后,选择功能强大的freemarker+固定格式wordxml进行导出。从Word导出的代码可以直接重用,所以它被发布在这里,并汇总给每个人。实施过程概述。首先,调整Word上所需的外观。然后将其保存为xml文件。另存为自由标记模板,以ftl后缀结尾。对要替换的变量使用free

前言

最近做了一个调查问卷导出的功能,需求是将维护的题目,答案,导出成word,参考了几种方案之后,选择功能强大的freemarker+固定格式之后的wordxml实现导出功能。导出word的代码是可以直接复用的,于是在此贴出,并进行总结,方便大家拿走。

实现过程概览

先在word上,调整好自己想要的样子。然后存为xml文件。保存为freemarker模板,以ftl后缀结尾。将需要替换的变量使用freemarker的语法进行替换。最终将数据准备好,和模板进行渲染,生成文件并返回给浏览器流。

详细的实现过程

准备好word的样式

我们新建一个word,我们应该使用Microsoft office,如果使用wps可能会造成样式有些不兼容。在新建的office中,设置好我们的表格样式。我们的调查问卷涉及到四种类型,单选,多选,填空,简答。我们做出四种类型的示例。
Freemarker + xml 实现Java导出word第1张
样式没有问题后,我们选择另存为word xml 2003版本。将会生成一个xml文件。
Freemarker + xml 实现Java导出word第2张

格式化xml,并用freemarker语法替换xml

我们可以先下载一个工具 firstobject xml editor,这个可以帮助我们查看xml,同时方便我们定位我们需要改的位置。
复制过去之后,按f8可以将其进行格式化,左侧是标签,右侧是内容,我们只需要关注w:body即可。
Freemarker + xml 实现Java导出word第3张
像右侧的调查问卷这个就是个标题,我们实际渲染的时候应该将其进行替换,比如我们的程序数据map中,有title属性,我们想要这里展示,我们就使用语法${title}即可。
Freemarker + xml 实现Java导出word第4张
freemarker的具体语法,可以参考freemarker的问题,在这里我给出几个简单的例子。
比如我们将所有的数据放置在dataList中,所以我们需要判断,dataList是不是空,是空,我们不应该进行下面的逻辑,不是空,我们应该先循环题目是必须的,答案是需要根据类型进行再次循环的。语法参考文档,这里不再赘述。

程序端引入freemarker

<dependency>
    <groupId>org.freemarker</groupId>
    <artifactId>freemarker</artifactId>
</dependency>

将我们的flt文件放在resources下的templates下。

后端代码实现

此代码可以复用,在此贴出

public class WordUtils {

    private static Configuration configuration = null;
    private static final String templateFolder = WordUtils.class.getClassLoader().getResource("").getPath()+"/templates/word";
    static {
        configuration = new Configuration();
        configuration.setDefaultEncoding("utf-8");
        try {
            configuration.setDirectoryForTemplateLoading(new File(templateFolder));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     *  @Description:导出word,传入request,response,map就是值,title是导出问卷名,ftl是你要使用的模板名
     */
    public static void exportWord(HttpServletRequest request, HttpServletResponse response, Map map, String title, String ftlFile) throws Exception {
        Template freemarkerTemplate = configuration.getTemplate(ftlFile);
        File file = null;
        InputStream fin = null;
        ServletOutputStream out = null;
        try {
            file = createDocFile(map,freemarkerTemplate);
            fin = new FileInputStream(file);
            String fileName = title + ".doc";
			response.setCharacterEncoding("utf-8");
			response.setContentType("application/msword");
			response.setHeader("Content-Disposition", "attachment;filename="
             +fileName);
			out = response.getOutputStream();
            byte[] buffer = new byte[512];  
            int bytesToRead = -1;
            while((bytesToRead = fin.read(buffer)) != -1) {
                out.write(buffer, 0, bytesToRead);
            }
        }finally {
            if(fin != null) fin.close();
            if(out != null) out.close();
            if(file != null) file.delete(); 
        }
    }

    /**
     *  @Description:创建doc文件
     */
    private static File createDocFile(Map<?, ?> dataMap, Template template) {
        File file = new File("init.doc");
        try {
            Writer writer = new OutputStreamWriter(new FileOutputStream(file), "utf-8");
            template.process(dataMap, writer);
            writer.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return file;
    }

}

有了工具类后,我们准备好我们的map数据。map里面的数据大家可以自行定义。然后调用utils中的导出方法即可。

WordUtils.exportWord(request, response, dataMap, "word", "demo.ftl");

结语

至此已经结束了,十分的好用,有疑问的话,可以评论交流。

免责声明:文章转载自《Freemarker + xml 实现Java导出word》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇twig一些常用的用法总结【原创】一种用buildkit打造免registry的local cd/ci工具,打通vscodeonline与openfaas模拟cloudbase打造碎片化编程开发部署环境的设想下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

biztalk中使用.net class类型的消息(一) 相关知识介绍【转】

一.概述 二.消息的结构 三.消息的类型 1.平面文件 2.Xml文档 3..net class 4.二进制数据 四..net class类型的序列化 五..net class类型的消息 1.类要设置为可序列化 2.类中只包含公共属性和字段 3.设置名称空间 4.设置可分辨字段和升级属性 4.1.设置可分辨字段 4.2.设置升级属性 5.一个.net cl...

(转)创建WebAPI文档的3个简单步骤

默认情况下,Microsoft.AspNet.WebApi.HelpPage创建的API帮助页不包含任何文档。 我们会看到所有的ApiController动作都列在No documentation available.上 要启用文档,我们只需要遵循三个简单步骤。 步骤1-在控制器级别上 为了测试目的,创建了一个新的ApiController,名为Docum...

C++开源库详细介绍

C++在“商业应用”方面,曾经是天下第一的开发语言,但这一桂冠已经被java抢走多年。因为当今商业应用程序类型,已经从桌面应用迅速转移成Web应 用。当Java横行天下之后,MS又突然发力,搞出C#语言,有大片的曾经的C++程序员,以为C++要就此沉沦,未料,这三年来,C++的生命力突然被 严重地增强了。主力原因就是开源的软件、基础软件(比如并发原生支持,...

Java bean 转为xml

Java bean 转为xml可以采用XStream类来完成 pom.xml <dependency> <groupId>com.thoughtworks.xstream</groupId> <artifactId>xstream</artifactId> <version>...

Dataset利用xsd读取xml,数值类型处理及验证

应该会有很多场景需要从xml文件读取数据,填充一个dataset。机器上没装数据库,个人觉得最好简便方法就是定义一个xml文件,模拟数据。默认,xml在datatable中的值都是字符串类型(Excel中输入数字,就知道是数值型)。如果需要dataset在调用readxml方法的时候,把是什么类型(比如xml中本意是整型,时间类型)自动转换成什么类型方便,...

JavaEE XML StAX创建

StAX创建XML文档 @author ixenos  1、 如果通过DOM树来创建XML文件时,发现这个DOM树没有其他用途,那么这种方式就不是很高效,这时我们可以使用StAX API直接将XML树写出,而不用去创建DOM树 2、 //从某个OutputStream构建一个XMLStreamWriter XMLOutputFactory factory...