java使用freemarker作为模板导出Excel表格


1:首先新建一个excel表格自己弄好格式如下图

2:把excel 表格另存为xml格式文件如下图

3:这个时候的文件就是xml 格式的文件了,在myeclipse里面项目工程里面新建一个文件后缀为.ftl 然后把弄好的xml文件内容直接复制粘贴到.fl文件里面

如图

4:好了,现在我们直接java 后台action 类代码如下

/**
     * 导出订单表
     * @throws Exception 
     */
    public void exportOrder() throws Exception{
        HttpServletRequest request = ServletActionContext.getRequest();
        HttpServletResponse response = ServletActionContext.getResponse();
        Map map = new HashMap();
        BookOrder bookOrder = new BookOrder();
        bookOrder.setOrderNo(params.getOrderNo());
        bookOrder.setName(params.getName());
        bookOrder.setPhone(params.getPhone());
        if(params.getCompany() !=null && params.getCompany().getId() !=null){
            bookOrder.setCompany(companyService.load(params.getCompany().getId()));
        }
        bookOrder.setOrderStatus(params.getOrderStatus());
        bookOrder.setDistType(params.getDistType());
        bookOrder.setFoodType(params.getFoodType());
        bookOrder.setStartTime(params.getStartTime());
        bookOrder.setEndTime(params.getEndTime());
        bookOrder.setRefundStatus(params.getRefundStatus());
        bookOrder.setReminder(params.getReminder());
        if(params.getStall() !=null && params.getStall().getId() !=null){
            bookOrder.setStall(stallService.load(params.getStall().getId()));
        }
        List bookOrderList = (List)targetService.loadList(bookOrder);
        map.put("bookOrderList", bookOrderList);
        File file = null;
        InputStream inputStream = null;
        ServletOutputStream out = null;
        try {
            request.setCharacterEncoding("UTF-8");
            file = ExcelUtils.createExcel(map, "myExcel","order.ftl");//调用创建excel帮助类
            inputStream = new FileInputStream(file);
            response.setCharacterEncoding("utf-8");
            response.setContentType("application/msexcel");
            response.setHeader("content-disposition", "attachment;filename="+ URLEncoder.encode("订单统计" + ".xls", "UTF-8"));
            out = response.getOutputStream();
            byte[] buffer = new byte[512]; // 缓冲区
            int bytesToRead = -1;
            // 通过循环将读入的Excel文件的内容输出到浏览器中
            while ((bytesToRead = inputStream.read(buffer)) != -1) {
                out.write(buffer, 0, bytesToRead);
            }
            out.flush();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (inputStream != null)
                inputStream.close();
            if (out != null)
                out.close();
            if (file != null)
                file.delete(); // 删除临时文件
        }
    }

5:下面这个是Utils 公共方法如下

package com.funcanteen.business.action.pay.util;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.HashMap;
import java.util.Map;

import org.apache.struts2.ServletActionContext;

import freemarker.template.Configuration;
import freemarker.template.Template;

/**
 * 导出excel Utils
 * @author Administrator
 *
 */
public class ExcelUtils {
    private static Configuration configuration =null;
    private static Map allTemplates =null;
    private static String realPath = ServletActionContext.getServletContext().getRealPath("/");
    /*static{
        configuration = new Configuration();
        configuration.setDefaultEncoding("UTF-8");
        try {
            configuration.setDirectoryForTemplateLoading(new File(realPath+"WEB-INF/mailtemplate"));
            allTemplates = new HashMap();
            allTemplates.put("myExcel", configuration.getTemplate("order.ftl"));
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }*/
    public ExcelUtils(){
        throw new AssertionError();
    }
    /**
     * 创建excel
     * @param dataMap
     * @param type
     * @return
     */
    public static File createExcel(Map<?, ?> dataMap, String type,String valueName){
        try {
            configuration = new Configuration();
            configuration.setDefaultEncoding("UTF-8");
            configuration.setDirectoryForTemplateLoading(new File(realPath+"WEB-INF/mailtemplate"));
            allTemplates = new HashMap();
            allTemplates.put(type, configuration.getTemplate(valueName));
        } catch (IOException ex) {
            ex.printStackTrace();
            throw new RuntimeException(ex);
        }
        String name = "temp" + (int) (Math.random() * 100000) + ".xls";
         File file = new File(name);
         Template template = allTemplates.get(type);
         try {
             Writer w = new OutputStreamWriter(new FileOutputStream(file), "utf-8");
             template.process(dataMap, w);
             w.close();
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
         return file;
    }
}

 6下面是ftl 模板文件

<?xml version="1.0"?>
<?mso-application progid="Excel.Sheet"?>

 
  Administrator
  Administrator
  2008-09-11T17:22:52Z
  2016-12-22T05:40:25Z
  12.00
 
 
  5715
  12765
  0
  105
  False
  False
 
 
  
  
  
  
  
  
 
 
  
   
   
    所属饭堂
    所属档口
    订单号
    下单人
    联系电话
    地址
    下单时间
    订单原价
    订单价格
    优惠价格
    快递费
    打包费
    快递方式
    用餐类型
   
   <#if bookOrderList?? >
   <#list bookOrderList as bookOrder>
   
    <#if bookOrder.company ??>
    ${bookOrder.company.simpleName?if_exists}
    <#else>
    
    
    <#if bookOrder.stall ??>
    ${bookOrder.stall.simpleName?if_exists}
    <#else>
    
    
    ${bookOrder.orderNo?if_exists}
    ${bookOrder.name?if_exists}
    ${bookOrder.phone?if_exists}
    ${bookOrder.address?if_exists}
    ${bookOrder.createTime?string("yyyy-MM-dd HH:mm:ss")}
    ${bookOrder.orderPrice?default(0)?double + bookOrder.benefitPrice?default(0)?double - bookOrder.expressCharge?default(0)?double - bookOrder.packCharge?default(0)?double}
    ${bookOrder.orderPrice?if_exists}
    ${bookOrder.benefitPrice?if_exists}
    ${bookOrder.expressCharge?if_exists}
    ${bookOrder.packCharge?if_exists}
    
    <#if bookOrder.distType ?? && bookOrder.distType==0>
    自提
    
    <#if bookOrder.distType ?? && bookOrder.distType==1>
    快递
    
    
    <#if bookOrder.foodType ?? && bookOrder.foodType==1>
    早餐
    
    <#if bookOrder.foodType ?? && bookOrder.foodType==2>
    午餐
    
    <#if bookOrder.foodType ?? && bookOrder.foodType==3>
    晚餐
    
    <#if bookOrder.foodType ?? && bookOrder.foodType==4>
    宵夜
    
    <#if bookOrder.foodType ?? && bookOrder.foodType==5>
    下午茶
    
    <#if bookOrder.foodType ?? && bookOrder.foodType==6>
    零食
    
   
   
   
  
9 600 600 3 4 10 False False
False False
False False