java使用freemarker模版下载成Excel文件

本文介绍了如何使用Java结合Freemarker模板技术生成Excel文件供用户下载。首先建立Excel模版,用${变量名}替换变量,保存为.ftl文件。接着在Java工程中引入Freemarker库,将变量值存入Map,动态生成唯一文件名和路径,最后利用Freemarker的Template类处理模板并写入文件,完成下载。对于列表数据,使用<#list>标签遍历并填充到模板中。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

下载整个过程:通过已有的Excel模版,前台显示的某些变量通过后台传到模版中,在后台系统自动组装下载路径和下载名,此下载有一个缺陷就是不能够在页面选择下载路径。

实现过程:

  1.建立模版

        (1)如果要下载的是word,首先通过word建立模版;如果要下载的是Excel,首先通过Excel建立模版。

        (2)将里边的变量使用${变量名}代替

        (3)另存为以后缀.xml的格式(这里要注意:如果转成xml之后,里边有${&**&*&8%$变量名**************}的,则需去掉多余的保证freemarker标签完整的前提下将这里改为${变量名}

        (4)将xml后缀改为ftl后缀

 2.在工程中加入freemarker.jar

 3.在工程中加入以下代码

        1)将变量的值存入map中:

    

/** 用于组装word页面需要的数据 */
            Map<String, Object> dataMap = new HashMap<String, Object>();
            /** 组装数据 */
            SimpleDateFormat sdf=new SimpleDateFormat("yyyy年MM月dd日");
            dataMap.put("currentday",sdf.format(new Date()));
            dataMap.put("jhxf",jhxf);
            dataMap.put("jhyf",map.get("jhyf"));
            dataMap.put("jksz",map.get("jksz") );
            dataMap.put("jhxfse", map.get("jhxfse"));
            dataMap.put("ldjxbd", ldjxbd);
            dataMap.put("ldbdse", map.get("ldbdse"));
            dataMap.put("jhyc", jhyc);
            dataMap.put("jhycse", map.get("jhycse"));
            dataMap.put("dwmc", map.get("dwmc"));
            dataMap.put("swjg", map.get("swjg"));
            dataMap.put("jssbyf", map.get("jssbyf"));
            dataMap.put("nsrsbh", map.get("nsrsbh"));

       2)组装文件的文件名(每次的文件名都不一样)

           /** 文件名称,唯一字符串 */
            Random r=new Random();
            SimpleDateFormat sdf1=new SimpleDateFormat("yyyyMMdd_HHmmss_SSS");
            StringBuffer sb=new StringBuffer();
            sb.append(sdf1.format(new Date()));
            sb.append("_");
            sb.append(r.nextInt(100));

         3)设置保存路径

            //文件路径
            filePath="F:/HGJKS_tzsxz";
            //文件唯一名称
            fileOnlyName = "exportWord_"+sb+".xls";
            /** 生成word */

  }

          4)生成word


try {
                //创建配置实例
                Configuration configuration = new Configuration();
                //设置编码
                configuration.setDefaultEncoding("UTF-8");
                //ftl模板文件统一放至 com.lun.template 包下面
                configuration.setClassForTemplateLoading(WordUtil.class,"/com/foresee/hgjks/front/template");
                //获取模板
                Template template = configuration.getTemplate("zzstzsqr.ftl");
                //输出文件
                File outFile = new File(filePath+File.separator+fileOnlyName);
                //如果输出目标文件夹不存在,则创建
                if (!outFile.getParentFile().exists()){
                    outFile.getParentFile().mkdirs();
                }
                //将模板和数据模型合并生成文件
                Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile),"UTF-8"));
                //生成文件
                template.process(dataMap, out);
                //关闭流
                out.flush();
                out.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }


******************如果有要遍历的列表*******************

  java代码中:  

    1.定义一个list

    2.将list放入要存的map里边

   freemarker中:

     给要遍历的地方加上<#list></#list>

<#list xflist as xftest>----xflist是java中map里边的要遍历的list,xftest是别名。

  遍历的时候${xftest.xfxh}。

整体如下:

<#list xflist as xftest>
   <Row ss:Height="14.25">
    <Cell ss:StyleID="s64"><Data ss:Type="String">${xftest.xfxh}</Data></Cell>
    <Cell ss:StyleID="s65"><Data ss:Type="String">海关缴款书</Data></Cell>
    <Cell ss:StyleID="s65"><Data ss:Type="String">-</Data></Cell>
    <Cell ss:StyleID="s64"><Data ss:Type="String">${xftest.xfpzhm}</Data></Cell>
    <Cell ss:StyleID="s65"><Data ss:Type="String">-</Data></Cell>
    <Cell ss:StyleID="s64"><Data ss:Type="String">${xftest.xfkjrq}</Data></Cell>
    <Cell ss:StyleID="s65"><Data ss:Type="String">-</Data></Cell>
    <Cell ss:StyleID="s64"><Data ss:Type="String">${xftest.xfse}</Data></Cell>
   </Row>
</#list>




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值