Java导出excel(完美封装,简单易用)

来源:互联网 发布:肇庆市网络问政 编辑:程序博客网 时间:2024/06/14 04:17

下载地址:http://download.csdn.net/download/jiwengjian123/10151425



package com.md.omp.business.util;import java.io.IOException;import java.io.OutputStreamWriter;import java.lang.reflect.Field;import java.math.BigDecimal;import java.text.DateFormat;import java.text.SimpleDateFormat;import java.util.Date;import java.util.HashMap;import java.util.List;import java.util.Map;import javax.servlet.http.HttpServletResponse; /**  * 导出excel工具类  * Project Name:md_omp_business  * File Name:ExportTools.java  * Package Name:com.md.omp.business.util  * Date:2017年10月25日上午10:12:33  * @author 吉文剑  * @param <T>  */public class ExportTools{ private StringBuffer content = new StringBuffer(); /** * 导出excel(利用反射机制) * <br> * String[] title = {"订单号","商品名称","商品价格","创建时间"};<br> * String[] field = {"orderNum","productName","productPrice","createTime"};<br> * ExportTools.export("sellJoin", title, field, list, respone);<br> * <br> * 支持字段规则转换 * <br> * 后追加 buyNum[&个] * <br> * 除法 investMoney[/100] * <br> * 乘法 investMoney[*100] * <br> * 类型转换 capitalType[1_金豆,2_钱包,3_其他] * <br> * @param filename 导出文件名称 * @param title 列标题 * @param field 要导出的对象属性字段,(与列标题要 一一对应) * @param results 导出数据list集合 * @param pesponse  * Date:2017年10月25日上午11:46:47 * @author 吉文剑 */public static void export(String filename, String[] title,String[] field,List<? extends Object> list,     HttpServletResponse pesponse){  new ExportTools().exportExcel(filename, title, field, list, pesponse);}/** * 导出excel(利用反射机制)例: * <br> * String[] title = {"订单号","商品名称","商品价格","创建时间"};<br> * String[] field = {"orderNum","productName","productPrice","createTime"};<br> * ExportTools.export("sellJoin", title, field, list, respone);<br> * <br> * 支持字段规则转换 * <br> * 后追加 buyNum[&个] * <br> * 除法 investMoney[/100] * <br> * 乘法 investMoney[*100] * <br> * 类型转换 capitalType[1_金豆,2_钱包,3_其他] * <br> * @param filename 导出文件名称 * @param title 列标题 * @param field 要导出的对象属性字段,(与列标题要 一一对应) * @param results 导出数据list集合 * @param pesponse  * Date:2017年10月25日上午11:46:47 * @author 吉文剑 */public void exportExcel(String filename, String[] title,String[] field,List<? extends Object> list,     HttpServletResponse pesponse){setTitle(title);try{      for (int i = 0; i < list.size(); i++) {     for (int j = 0; j < field.length; j++) {     Object t = list.get(i);     Field[] fields = t.getClass().getDeclaredFields();     for ( Field fd : fields ){                fd.setAccessible( true );                String fieldStr = field[j];                String fieldName = "";                //转换规则                Integer typeCode = 0;                Map<Integer, String> ruleMap = new HashMap<Integer, String>();//类型转换规则                if(fieldStr.indexOf("[") > 1){                  fieldName = fieldStr.substring(0, fieldStr.indexOf("["));                  String splits = fieldStr.substring(fieldStr.indexOf("[")+1,fieldStr.indexOf("]"));                  if(splits.indexOf(",") > -1){//替换                  typeCode = 1;                  String[] split = splits.split(",");                  for(String s : split){                  String[] types = s.split("_");                  ruleMap.put(Integer.parseInt(types[0]), types[1]);                  }                  }else if(splits.indexOf("&") > -1){//连接                  typeCode = 2;                  ruleMap.put(1, splits.substring(splits.indexOf("&")+1,splits.length()));                  }else if(splits.indexOf("/") > -1){//除法                  typeCode = 3;                  ruleMap.put(1, splits.substring(splits.indexOf("/")+1,splits.length()));                  }else if(splits.indexOf("*") > -1){//乘法                  typeCode = 4;                  ruleMap.put(1, splits.substring(splits.indexOf("*")+1,splits.length()));                  }                }else{                fieldName = fieldStr;                };                                //取值                  if(fieldName.equals(fd.getName())){                  Object value = new Object();                   if("java.util.Date".equals(fd.getType().getName())){                  value = formatDate(fd.get(t));                  }else if("java.math.BigDecimal".equals(fd.getType().getName())){                  value = fd.get(t);                  }else{                  value = fd.get(t);                  }                  //需要做转换                  if(typeCode != 0){                switch (typeCode) {  case 1:  value = ruleMap.get(value);  break;  case 2:  value = value + ruleMap.get(1);  break;  case 3:  if(null == value || "".equals(value.toString())) value = 0;  value = new BigDecimal(value.toString()).divide(new BigDecimal(ruleMap.get(1)),2,BigDecimal.ROUND_HALF_UP);  break;  case 4:  if(null == value || "".equals(value.toString())) value = 0;  value = new BigDecimal(value.toString()).multiply(new BigDecimal(ruleMap.get(1)));  break;  default:  break;  }                  }                  setField(value);                  break;                  }                }        }       content.append("\n");}     downloadFileCsv(getFileName(filename), content.toString(), pesponse);}catch ( Exception e ){System.err.println("导出文件:"+filename+" 出错");        e.printStackTrace();        }      }/** * 生成excel * @param filename * @param content * @param response * @param contentType * @throws IOException * Date:2017年10月26日下午1:36:43 * @author 吉文剑 */public void downloadFileCsv(String filename, String content, HttpServletResponse response) throws IOException {        response.addHeader("Content-Disposition", "attachment; filename=\"" + new String(filename.getBytes(), "UTF-8") + "\"");        OutputStreamWriter ow = new OutputStreamWriter(response.getOutputStream(), "UTF-16LE");        ow.write(0xFEFF);        ow.write(content);        if (null != ow) {            ow.flush();            ow.close();        }    }/** * 设置标题 * @param title * Date:2017年10月25日上午11:38:54 * @author 吉文剑 */private void setTitle(String[] title){for (int i = 0; i < title.length; i++) {content.append((title[i] == null || "null".equals(title[i].toString()) ? "" : title[i].toString()) + "\t");}content.append("\n");}/** * 设置列表数据 * @param value * Date:2017年10月25日上午11:46:30 * @author 吉文剑 */private void setField(Object value){content.append((value == null || "null".equals(value.toString()) ? "" : value.toString()) + "\t");}/** * 生成当前时间的后缀文件名 * @param fileName * @return * Date:2017年10月25日上午11:54:05 * @author 吉文剑 */private String getFileName(String fileName){    SimpleDateFormat dateFormat = new SimpleDateFormat("MMddHHmm");        return fileName + dateFormat.format(new Date()) +".csv";    }/** * 时间类型转化 * @param date * @return * Date:2017年10月25日上午11:53:10 * @author 吉文剑 */private String formatDate(Object obj){    if(obj == null){    return "";    }    DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");     return format.format((Date)obj);    }}