JAVA语言工具类封装-基于poi的excel导出功能

http://blog.csdn.net/caisini_vc/article/details/52387842

excel导出基本上是必备的功能,如果条目超过65535  是csv,否则xls。


一句话使用:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. OrderInfoExcelBuilder.getInstance().createExcel(OrderType.MAIN_ORDER, orderInfoDetailList, response);  

结构比较简单,抽象类+子类实现。
先看下抽象类:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <pre name="code" class="java">package com.qunar.flight.ib2b.trade.center.util.excel;  
  2.   
  3. import java.io.OutputStream;  
  4. import java.net.URLEncoder;  
  5. import java.util.List;  
  6.   
  7. import javax.mail.internet.MimeUtility;  
  8. import javax.servlet.http.HttpServletResponse;  
  9.   
  10. import org.apache.commons.lang3.StringUtils;  
  11. import org.apache.poi.ss.usermodel.Row;  
  12. import org.apache.poi.ss.usermodel.Sheet;  
  13. import org.apache.poi.xssf.usermodel.XSSFCellStyle;  
  14. import org.apache.poi.xssf.usermodel.XSSFDataFormat;  
  15. import org.apache.poi.xssf.usermodel.XSSFSheet;  
  16. import org.apache.poi.xssf.usermodel.XSSFWorkbook;  
  17. import org.slf4j.Logger;  
  18. import org.slf4j.LoggerFactory;  
  19.   
  20. import com.google.common.base.Throwables;  
  21. import com.qunar.flight.ib2b.trade.center.enums.OrderType;  
  22.   
  23. /** 
  24.  * Excel文件导出 定义类 
  25.  *  
  26.  * @author xiongxo.chen 
  27.  */  
  28. public abstract class AbstractExcelBuilder<T> {  
  29.   
  30.     private static final Logger logger = LoggerFactory.getLogger(AbstractExcelBuilder.class);  
  31.   
  32.     public void createExcel(final OrderType type, List<T> datas, HttpServletResponse response) {  
  33.         if (0 == datas.size()) {  
  34.             return;  
  35.         }  
  36.         XSSFWorkbook workBook = new XSSFWorkbook();  
  37.   
  38.         OutputStream os;  
  39.         try {  
  40.             Sheet sheet = createSheet(workBook);  
  41.             if (sheet == null)  
  42.                 return;  
  43.   
  44.             // 写表头  
  45.             writeHead(type, sheet, datas);  
  46.   
  47.             // 写内容  
  48.             XSSFCellStyle cellStyle = workBook.createCellStyle();  
  49.             XSSFDataFormat format = workBook.createDataFormat();  
  50.             writeBody(type, cellStyle, format, sheet, datas);  
  51.             response.setContentType("application/vnd.ms-excel");  
  52.             response.setHeader("Content-disposition""attachment;filename=OrderDetail.xls");  
  53.             os = response.getOutputStream();  
  54.             workBook.write(response.getOutputStream());  
  55.             os.flush();  
  56.         } catch (Throwable t) {  
  57.             logger.error("导出 excel出错!", t);  
  58.             Throwables.propagate(t);  
  59.         }  
  60.     }  
  61.   
  62.     /** 
  63.      * 写表头 
  64.      */  
  65.     protected void writeHead(OrderType type, Sheet sheet, List<T> datas) {  
  66.         String[] head = getHead(type, datas.get(0));  
  67.         Row row = sheet.createRow(0);  
  68.         for (int i = 0; i < head.length; i++) {  
  69.             row.createCell(i).setCellValue(head[i]);  
  70.             sheet.setColumnWidth(i, head[i].getBytes().length * 256);  
  71.         }  
  72.     }  
  73.   
  74.     /** 
  75.      * 写表体 
  76.      */  
  77.     protected abstract void writeBody(OrderType type, XSSFCellStyle cellStyle, XSSFDataFormat format, Sheet sheet, List<T> datas)  
  78.             throws Exception;  
  79.   
  80.     /** 
  81.      * 表头内容 
  82.      */  
  83.     protected abstract String[] getHead(OrderType type, T datas);  
  84.   
  85.     /** 
  86.      * Sheet页名称 
  87.      */  
  88.     protected String getSheetName() {  
  89.         return "xo";  
  90.     }  
  91.   
  92.     /** 
  93.      * 来个Sheet 
  94.      */  
  95.     private XSSFSheet createSheet(XSSFWorkbook workBook) {  
  96.         if (StringUtils.isBlank(getSheetName())) {  
  97.             return workBook.createSheet();  
  98.         } else {  
  99.             return workBook.createSheet(getSheetName());  
  100.         }  
  101.     }  
  102.   
  103.     /** 
  104.      * 设置下载文件中文件的名称 
  105.      */  
  106.     public static String encodeFilename(String filename) {  
  107.         /** 
  108.          * 获取客户端浏览器和操作系统信息 在IE浏览器中得到的是:User-Agent=Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Maxthon; Alexa 
  109.          * Toolbar) 在Firefox中得到的是:User-Agent=Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.7.10) Gecko/20050717 
  110.          * Firefox/1.0.6 
  111.          */  
  112.         try {  
  113.             // 先检查IE浏览器的  
  114.             String newFileName = URLEncoder.encode(filename, "UTF-8");  
  115.             newFileName = StringUtils.replace(newFileName, "+""%20");  
  116.             if (newFileName.length() > 150) {  
  117.                 newFileName = new String(filename.getBytes("GB2312"), "ISO8859-1");  
  118.                 newFileName = StringUtils.replace(newFileName, " ""%20");  
  119.             }  
  120.             if (StringUtils.isBlank(newFileName)) {  
  121.                 // 若不是IE,则检查Firxbox  
  122.                 return MimeUtility.encodeText(filename, "UTF-8""B");  
  123.             }  
  124.             return filename;  
  125.         } catch (Exception ex) {  
  126.             return filename;  
  127.         }  
  128.     }  
  129. }  


子类实现: 将订单信息传入写内容到row叠加就好

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. package com.qunar.flight.ib2b.trade.center.util.excel;  
  2.   
  3. import java.util.List;  
  4.   
  5. import javax.annotation.Resource;  
  6.   
  7. import org.apache.poi.ss.usermodel.Cell;  
  8. import org.apache.poi.ss.usermodel.Row;  
  9. import org.apache.poi.ss.usermodel.Sheet;  
  10. import org.apache.poi.xssf.usermodel.XSSFCellStyle;  
  11. import org.apache.poi.xssf.usermodel.XSSFDataFormat;  
  12.   
  13. import com.qunar.flight.ib2b.trade.center.bean.OrderInfoDetail;  
  14. import com.qunar.flight.ib2b.trade.center.enums.OrderType;  
  15. import com.qunar.flight.ib2b.trade.center.persistence.dao.TOrderStatusChangeLogMapper;  
  16.   
  17. /** 
  18.  * 订单信息导出构建器 
  19.  *  
  20.  * @author xiongxo.chen 
  21.  *  
  22.  */  
  23. public class OrderInfoExcelBuilder extends AbstractExcelBuilder<OrderInfoDetail> {  
  24.   
  25.     private static OrderInfoExcelBuilder builder;  
  26.   
  27.     @Resource  
  28.     TOrderStatusChangeLogMapper tOrderStatusChangeLogMapper;  
  29.   
  30.     private OrderInfoExcelBuilder() {  
  31.     }  
  32.   
  33.     /** 
  34.      * 单例 
  35.      */  
  36.     public synchronized static OrderInfoExcelBuilder getInstance() {  
  37.         if (null == builder)  
  38.             builder = new OrderInfoExcelBuilder();  
  39.         return builder;  
  40.     }  
  41.   
  42.     /** 
  43.      * 写Excel内容 
  44.      */  
  45.     @Override  
  46.     protected void writeBody(OrderType type, XSSFCellStyle cellStyle, XSSFDataFormat format, Sheet sheet,  
  47.             List<OrderInfoDetail> datas) throws Exception {  
  48.         int columnIndex = 0;  
  49.         int rowIndex = 1;  
  50.         for (OrderInfoDetail order : datas) {  
  51.             columnIndex = 0;  
  52.             Row row = sheet.createRow(rowIndex);  
  53.             Cell idCell = row.createCell(columnIndex);  
  54.             // 文本格式  
  55.             cellStyle.setDataFormat(format.getFormat("@"));  
  56.             idCell.setCellStyle(cellStyle);  
  57.             idCell.setCellValue(order.getId());  
  58.             row.createCell(columnIndex++).setCellValue("写内容1");  
  59.             row.createCell(columnIndex++).setCellValue("写内容2");  
  60.             rowIndex++;  
  61.         }  
  62.     }  
  63.   
  64.     /** 
  65.      * 写Excel表头 
  66.      */  
  67.     @Override  
  68.     protected String[] getHead(OrderType type, OrderInfoDetail order) {  
  69.         return new String[] { "订单创建日期""订单号"};  
  70.     }  
  71.   
  72. }  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值