模版导出excel、word

原创 2016年05月30日 10:37:23

记录一下上周弄的一个模版导出,解决导出样式难以控制的问题。

常规导出,需要人为的判定各种样式,遇到表头合并之类的更麻烦,于是就想到现在比较火的模版导出。

然后,网上的资料大多都是复制粘贴,甚至直接就是转载,而且大多都是直接指定保存路劲,没有实现导出下载功能,这里我记录下自己的一些操作步骤,希望对大家有用。

第一步:导出freemarker的依赖(我的所有项目都是基于maven)

<!-- freemarker -->
        <dependency>
            <groupId>org.freemarker</groupId>
            <artifactId>freemarker</artifactId>
            <version>${freemarker-version}</version>
        </dependency>
第二步:构建导出后的模版(.ftl文件,例如:export.ftl)(按照习惯,在根目录创建一个template文件夹存放模版文件)
<table border="1">
    <tr>
        <th class="text-center" rowspan="2">序号</th>
        <th class="text-center" rowspan="2">姓名</th>
    <#if docTypeNums??&&docTypeNums?size>0>
        <#list docTypeNums as obj>
            <th class="text-center" colspan="${obj["num"]!}">${obj["type_name"]!}</th>
        </#list>
    </#if>
    </tr>
    <tr>
    <#if docTypes??>
        <#list docTypes as obj>
            <th class="text-center">${obj.typeName!}</th>
        </#list>
    </#if>
    </tr>
    <tbody>
    <#if obj??&&(obj?size>0)>
        <#list obj?keys as key>
        <tr>
            <td>${1+key_index}</td>
            <td>${obj[key][key]!}(${key})</td>
            <#assign map = obj[key]>
            <#if docTypes??>
                <#list docTypes as ob>
                    <td>${map[ob.id]!"0"}</td>
                </#list>
            </#if>
        </tr>
        </#list>
    </#if>
    </tbody>
</table>
一个模版用一个table进行构建,当然,如果你又特殊需求,可以使用多个table进行构建。

如果不懂freemarker标签的可以百度,这里我不解释了,我的业务有特殊需求,所以不用看我的数据是怎么操作的,看不懂的(看懂也没用)。

第三步:获取数据(上面模版中的参数,均由map传递)

Map<String,Object> map1 = new HashMap<>();
        map1.put("docTypes",docTypes);
        map1.put("obj",maps);
        map1.put("docTypeNums",docTypeNums);

第四步:渲染模版并导出(渲染时,freemarker会将map解析,获取每一个key,在模版中,我们直接调用key进行操作就可以了)

/***
     * 通用导出Excel模版
     * @param map       模版需要的数据
     * @param filePath  模版所在项目路劲,如:"\\template\\statistics",表示在项目根路劲去找该路劲
     * @param fileName  文件名
     * @param response  用于输出
     * @param request   用于获取项目根目录
     * @throws Exception
     */
    public void exportExcel(Map<String, Object> map,String filePath,String fileName,HttpServletResponse response,HttpServletRequest request) throws Exception{
        //创建一个文件流
        File file = new File(request.getSession().getServletContext().getRealPath("/")+filePath);
        //初始化freemarker模版引擎的设置
        Configuration configuration = new Configuration();
<span style="white-space:pre">	configuration.setDefaultEncoding("UTF-8");</span>
        configuration.setDirectoryForTemplateLoading(file);
        //获取模版
        Template template = configuration.getTemplate(fileName+".ftl","UTF-8");<span style="font-family: Arial, Helvetica, sans-serif; color: rgb(169, 183, 198);"></span>
        //创建输出文件流
        File outfile = new File(request.getSession().getServletContext().getRealPath("/")+filePath+"/"+fileName+".xlsx");
        //创建输出流
        Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outfile),"UTF-8"));
        //渲染模版
        template.process(map, out);

        out.flush();
        out.close();
        //用response进行导出
        String fileName1 = fileName+".xlsx";
        response.setCharacterEncoding("UTF-8");
        response.setContentType("application/octet-stream");
        response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(fileName1, "UTF-8"));
        /*创建输入流*/
        FileInputStream in = new FileInputStream(outfile);
        BufferedInputStream buff = new BufferedInputStream(in);
        IOUtils.copy(buff, response.getOutputStream());

        response.flushBuffer();
        in.close();
        outfile.delete();
    }
最后总结:这种方式有一个弊端,就是每次都会在服务器保存一个文件,最后由程序去删除。如果能够做到临时文件流存储,那就圆满了,大大减少服务器的负担。我对文件流不熟悉,如果有大神能够搞定这个功能,还请不吝赐教。

版权声明:本文为博主原创文章,未经博主允许不得转载。

WPF 根据Word模版导出数据到Word

WPF 根据Excel模版导出数据到Word前台.xaml文件:
  • csmzl
  • csmzl
  • 2017年05月24日 15:03
  • 795

velocity往word/excel模版填充数据并导出

国企或政府单位的项目,经常有这样的需求,把用户填写的数据填充到word或excel模版,然后导出的需求。网上也有解决方案。现在记录下自己的学习过程。采取的方案也是把word或excel转为2003的x...
  • dream_broken
  • dream_broken
  • 2016年09月20日 17:29
  • 2741

导出word使用模版

还是在我们的那个项目中,我通过看别人写的代码,看到了一个特别值得学习的地方...
  • u013045878
  • u013045878
  • 2015年12月31日 15:28
  • 1924

jasperreport 导出excel xlsx格式、word docx格式

基本原理,就是jasperreport的声明周期,jrxml---->jasperreport---->jasperprint---->目标文件 我选择的方式,是根据jrxml生成文件,而且不...
  • wangjun5159
  • wangjun5159
  • 2016年01月08日 11:43
  • 4869

velocity导出Word,excel模板的工具类

1,先把要导出的模板转成xml格式,然后加到项目中,将后缀名改成.vm 2.以下是工具类,两种(一个是导出指定位置,一个是浏览器下载) public class VelocityUtil {     ...
  • qq_35978746
  • qq_35978746
  • 2016年12月16日 16:50
  • 649

java后台利用模板生成Word文档提供前台下载

java后台利用模板生成Word文档提供前台下载,freeMarker思路
  • u010251278
  • u010251278
  • 2016年11月25日 16:26
  • 14416

Java用freemarker导出word

最近一个项目要导出word文档,折腾老半天,发现还是用freemarker的模板来搞比较方便省事,现总结一下关键步骤,供大家参考,这里是一个简单的试卷生成例子。 一、模板的制作 先用Word做一个模板...
  • wangqiuyun
  • wangqiuyun
  • 2014年05月20日 11:27
  • 52054

Word模板导出

一、步骤: 1.在Word中建立书签; 2.编写C#代码:  (1) 数据准备 [html] view plain copy /// summary>          //...
  • wang__wei
  • wang__wei
  • 2016年12月07日 15:16
  • 541

Asp.net开发经验-利用Aspose.Words按模板导出Word

估计很多开发人员都为导出Excel或者Word烦扰吧..网上有各种各样的导出方法...经常用到的方法就是画网页..例如下面的GridView导出excel的代码..这段代码虽然有效..但是其实非常不好...
  • whfsk
  • whfsk
  • 2017年02月14日 11:59
  • 271

java利用poi 读写(导入导出)word、excel(数组越界求解决办法)

java 读写 word excel 简单的实例 需要的jar包有 poi-3.8-20120326.jar poi-examples-3.8-20120326.jar poi-exc...
  • prefectjava
  • prefectjava
  • 2014年01月09日 15:51
  • 2409
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:模版导出excel、word
举报原因:
原因补充:

(最多只允许输入30个字)