导出EXcel工具类如下:

package com.yyw.utils;

import jxl.Sheet;
import jxl.Workbook;
import jxl.biff.DisplayFormat;
import jxl.format.Alignment;
import jxl.format.VerticalAlignment;
import jxl.write.*;

import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.text.SimpleDateFormat;
import java.util.*;


/**
 * Excel处理工具类
 */
public class ExcelUtils {

	private static SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd");
    /**
     * Excel模板下载
     * @param filePath
     * @param response
     * @param fileName
     * @return
     * @throws Exception
     */
    public static boolean downLoadFile(String filePath,HttpServletResponse response,
    		String fileName)throws Exception {
        File file = new File(filePath);
        
        response.setContentType("application/msexcel;charset=UTF-8");
        response.setHeader("Content-Disposition", "attachment;filename=\""
                + new String(fileName.getBytes("GB2312"), "ISO8859-1") + "\"");
        response.setContentLength((int)file.length());
        
        byte[] buffer = new byte[4096];//缓冲区
        BufferedOutputStream output = null;
        BufferedInputStream input = null;
        
        try {
        	 output = new BufferedOutputStream(response.getOutputStream());
             input = new BufferedInputStream(new FileInputStream(file));
             int n = -1;

            //遍历,开始下载
            while ((n = input.read(buffer, 0, 4096)) > -1) {
                output.write(buffer, 0, n);
             }
            output.flush();   
            response.flushBuffer();
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
			throw new Exception("Excel模板下载异常:"+e.getMessage());
		}finally{
			 //关闭流
	         if (input != null){
				 input.close();
			 }
	         if (output != null){
				 output.close();
			 }
	    }
	    return true;
    }

  //控制Excel里面每个sheet单元最多有多少行
  	private static int MAX_ROWS = 50000;
  	
  	/**
  	 * 填充Excel各单元格的值
  	 * @param <T>
  	 * @param list 数据list
  	 * @param os 输出流
  	 * @param colNames 第一行列字段的中文名称
  	 * @param colParams 各列对应对象的属性
  	 * @param sheetName sheet的名称
  	 */
  	public static <T> void setExcel(List<T> list,OutputStream os,String[] colNames,String[] colParams,
  			String sheetName,Integer col)throws Exception{
  	
  		try {
  			WritableWorkbook workbook = Workbook.createWorkbook(os);
  			//设定一个sheet里面只能放50000条数据
  			int num = list.size()/MAX_ROWS + 1;
  			
  			for(int i=0;i<num;i++){
  				
  				WritableSheet sheet = null;
  				if(StringUtil.isEmpty(sheetName)){
  					sheet = workbook.createSheet("sheet"+i, 0);
  				}else{
  				    sheet = workbook.createSheet(sheetName+i, 0);
  				}
  				
  				jxl.write.WritableFont wfc = new jxl.write.WritableFont(
  						WritableFont.ARIAL, 10, WritableFont.NO_BOLD, false,
  						jxl.format.UnderlineStyle.NO_UNDERLINE
  						);
  				jxl.write.WritableCellFormat wcfFC = new jxl.write.WritableCellFormat(
  						wfc,NumberFormats.TEXT);
  				
  				wcfFC.setVerticalAlignment(VerticalAlignment.CENTRE); // 文字垂直对齐
  				wcfFC.setAlignment(Alignment.CENTRE); // 文字水平对齐
  				
  				jxl.write.WritableFont wfc1 = new jxl.write.WritableFont(
  						WritableFont.ARIAL, 10, WritableFont.NO_BOLD, false,
  						jxl.format.UnderlineStyle.NO_UNDERLINE,
  						jxl.format.Colour.RED);
  				jxl.write.WritableCellFormat wcfFC1 = new jxl.write.WritableCellFormat(
  						wfc1,NumberFormats.TEXT);
  				wcfFC1.setVerticalAlignment(VerticalAlignment.CENTRE); // 文字垂直对齐
  				wcfFC1.setAlignment(Alignment.CENTRE); // 文字水平对齐
  				
  				//设置单元格值的样式
  				jxl.write.WritableCellFormat wcf_cell = new jxl.write.WritableCellFormat(NumberFormats.TEXT);
  				wcf_cell.setVerticalAlignment(VerticalAlignment.CENTRE); // 文字垂直对齐
  				wcf_cell.setAlignment(Alignment.CENTRE); // 文字水平对齐
  				
  				//给Excel第一行的列名赋予中文名称
  				for(int j=0;j<colNames.length;j++){
  					if(col != null && j < col){
  						jxl.write.Label labelCFC = new jxl.write.Label(j, 0, colNames[j],
  								wcfFC1);
  						sheet.addCell(labelCFC);
  					}else{
  						jxl.write.Label labelCFC = new jxl.write.Label(j, 0, colNames[j],
  	  							wcfFC);
  						sheet.addCell(labelCFC);
  					}
  					sheet.setColumnView(j, 25); // 设置列的宽度
  				}
  				
  				//参数list集合遍历循环的起始值和结束值
  				int num_start = i*MAX_ROWS;
  				int num_end = (i+1)*MAX_ROWS;
  				int rowNum = 0;
  				
  				if(num_end > list.size()){
  					num_end = list.size();
  				}
  				for(int k=num_start;k<num_end;k++){
  					Map obj = ObjectUtil.beanToMap(list.get(k));
  					Label label = null;
  					int colNum = 0;
  					
  					//循环遍历各列对应对象的属性,并取出值,填充单元格
  					for(String temp:colParams){
  						String value = String.valueOf(obj.get(temp));
  						if(StringUtil.isEmpty(value) || "null".equals(value)){
  							label = new jxl.write.Label(colNum++,rowNum+1,"",wcf_cell);
  						}else{
  							label = new jxl.write.Label(colNum++,rowNum+1,value,wcf_cell);
  						}
  						sheet.addCell(label);
  					}
  					
  					rowNum++;
  				}
  				
  			}
  			
  			workbook.write();
  			workbook.close();
  			os.close();
  		} catch (Exception e) {
  			e.printStackTrace();
  			throw new Exception("填充Excel各单元格异常:"+e.getMessage());
  		}
  		
  	}
	/**
	 * 填充Excel各单元格的值
	 * @param <T>
	 * @param list 需要导出的数据
	 * @param os 输出流
	 * @param colNames 第一行列字段的中文名称
	 * @param colParams 各列对应对象的属性
	 * @param sheetName sheet的名称
	 * @param remakeMap 每一列对应的的数字代表什么意思,例如 sex 1,男;2,女;,导出时希望显示汉字而不是显示数字
	 */
	public static <T> void setExcelWithExpectNum(List<T> list,OutputStream os,String[] colNames,String[] colParams,
									String sheetName,Integer col,Map<String,Map<String,String>> remakeMap)throws Exception{

		try {
			WritableWorkbook workbook = Workbook.createWorkbook(os);
			//设定一个sheet里面只能放50000条数据
			int num = list.size()/MAX_ROWS + 1;

			for(int i=0;i<num;i++){

				WritableSheet sheet = null;
				if(StringUtil.isEmpty(sheetName)){
					sheet = workbook.createSheet("sheet"+i, 0);
				}else{
					sheet = workbook.createSheet(sheetName+i, 0);
				}

				jxl.write.WritableFont wfc = new jxl.write.WritableFont(
						WritableFont.ARIAL, 10, WritableFont.NO_BOLD, false,
						jxl.format.UnderlineStyle.NO_UNDERLINE
				);
				jxl.write.WritableCellFormat wcfFC = new jxl.write.WritableCellFormat(
						wfc,NumberFormats.TEXT);

				wcfFC.setVerticalAlignment(VerticalAlignment.CENTRE); // 文字垂直对齐
				wcfFC.setAlignment(Alignment.CENTRE); // 文字水平对齐

				jxl.write.WritableFont wfc1 = new jxl.write.WritableFont(
						WritableFont.ARIAL, 10, WritableFont.NO_BOLD, false,
						jxl.format.UnderlineStyle.NO_UNDERLINE,
						jxl.format.Colour.RED);
				jxl.write.WritableCellFormat wcfFC1 = new jxl.write.WritableCellFormat(
						wfc1,NumberFormats.TEXT);
				wcfFC1.setVerticalAlignment(VerticalAlignment.CENTRE); // 文字垂直对齐
				wcfFC1.setAlignment(Alignment.CENTRE); // 文字水平对齐

				//设置单元格值的样式
				jxl.write.WritableCellFormat wcf_cell = new jxl.write.WritableCellFormat(NumberFormats.TEXT);
				wcf_cell.setVerticalAlignment(VerticalAlignment.CENTRE); // 文字垂直对齐
				wcf_cell.setAlignment(Alignment.CENTRE); // 文字水平对齐

				//给Excel第一行的列名赋予中文名称
				for(int j=0;j<colNames.length;j++){
					if(col != null && j < col){
						jxl.write.Label labelCFC = new jxl.write.Label(j, 0, colNames[j],
								wcfFC1);
						sheet.addCell(labelCFC);
					}else{
						jxl.write.Label labelCFC = new jxl.write.Label(j, 0, colNames[j],
								wcfFC);
						sheet.addCell(labelCFC);
					}
					sheet.setColumnView(j, 25); // 设置列的宽度
				}

				//参数list集合遍历循环的起始值和结束值
				int num_start = i*MAX_ROWS;
				int num_end = (i+1)*MAX_ROWS;
				int rowNum = 0;

				if(num_end > list.size()){
					num_end = list.size();
				}
				for(int k=num_start;k<num_end;k++){
					Map obj = ObjectUtil.beanToMap(list.get(k));
					Label label = null;
					int colNum = 0;

					//循环遍历各列对应对象的属性,并取出值,填充单元格
					for(String temp:colParams){
						String value = "";
						Object tempObj = obj.get(temp);
						if(tempObj instanceof Date){
							value = sf.format((Date)tempObj);
						}else{
							value = String.valueOf(tempObj);
						}

						for (Map.Entry<String,Map<String,String>> entry : remakeMap.entrySet()){
							if (temp.equals(entry.getKey())){
								value = entry.getValue().get(value);
							}
						}
						if(StringUtil.isEmpty(value) || "null".equals(value)){
							label = new jxl.write.Label(colNum++,rowNum+1,"",wcf_cell);
						}else{
							label = new jxl.write.Label(colNum++,rowNum+1,value,wcf_cell);
						}
						sheet.addCell(label);
					}

					rowNum++;
				}

			}

			workbook.write();
			workbook.close();
			os.close();
		} catch (Exception e) {
			e.printStackTrace();
			throw new Exception("填充Excel各单元格异常:"+e.getMessage());
		}

	}
  	/**
  	 * 填充Excel各单元格的值
  	 * @param <T>
  	 * @param list
  	 * @param os
  	 * @param colNames 第一行列字段的中文名称
  	 * @param colParams 各列对应对象的属性
  	 * @param sheetName sheet的名称
  	 */
  	public static <T> void setToExcel(List<T> list,OutputStream os,String[] colNames,String[] colParams,
  			String sheetName)throws Exception{
  	
  		try {
  			WritableWorkbook workbook = Workbook.createWorkbook(os);
  			//设定一个sheet里面只能放50000条数据
  			int num = list.size()/MAX_ROWS + 1;
  			
  			for(int i=0;i<num;i++){
  				
  				WritableSheet sheet = null;
  				if(StringUtil.isEmpty(sheetName)){
  					sheet = workbook.createSheet("sheet"+i, 0);
  				}else{
  				    sheet = workbook.createSheet(sheetName+i, 0);
  				}
  				
  				jxl.write.WritableFont wfc = new jxl.write.WritableFont(
  						WritableFont.ARIAL, 10, WritableFont.NO_BOLD, false,
  						jxl.format.UnderlineStyle.NO_UNDERLINE
  						);
  				jxl.write.WritableCellFormat wcfFC = new jxl.write.WritableCellFormat(
  						wfc,NumberFormats.TEXT);
  				
  				wcfFC.setVerticalAlignment(VerticalAlignment.CENTRE); // 文字垂直对齐
  				wcfFC.setAlignment(Alignment.CENTRE); // 文字水平对齐
  				
  				jxl.write.WritableFont wfc1 = new jxl.write.WritableFont(
  						WritableFont.ARIAL, 10, WritableFont.NO_BOLD, false,
  						jxl.format.UnderlineStyle.NO_UNDERLINE,
  						jxl.format.Colour.RED);
  				jxl.write.WritableCellFormat wcfFC1 = new jxl.write.WritableCellFormat(
  						wfc1,NumberFormats.TEXT);
  				wcfFC1.setVerticalAlignment(VerticalAlignment.CENTRE); // 文字垂直对齐
  				wcfFC1.setAlignment(Alignment.CENTRE); // 文字水平对齐
  				
  				//设置单元格值的样式
  				jxl.write.WritableCellFormat wcf_cell = new jxl.write.WritableCellFormat();
  				wcf_cell.setVerticalAlignment(VerticalAlignment.CENTRE); // 文字垂直对齐
  				wcf_cell.setAlignment(Alignment.CENTRE); // 文字水平对齐
  				
  				//给Excel第一行的列名赋予中文名称
  				for(int j=0;j<colNames.length;j++){
					jxl.write.Label labelCFC = new jxl.write.Label(j, 0, colNames[j],
  							wcfFC);
					sheet.addCell(labelCFC);
  					sheet.setColumnView(j, 25); // 设置列的宽度
  				}
  				
  				//参数list集合遍历循环的起始值和结束值
  				int num_start = i*MAX_ROWS;
  				int num_end = (i+1)*MAX_ROWS;
  				int rowNum = 0;
  				
  				if(num_end > list.size()){
  					num_end = list.size();
  				}
  				for(int k=num_start;k<num_end;k++){
  					Map obj = ObjectUtil.beanToMap(list.get(k));
  					Label label = null;
  					int colNum = 0;
  					
  					//循环遍历各列对应对象的属性,并取出值,填充单元格
  					for(String temp:colParams){
  						String value = "";
						try {
							//Object tempObj = MethodUtils.invokeMethod(obj, "get"+temp.substring(0,1).toUpperCase()+temp.substring(1, temp.length()), null);
							Object tempObj = obj.get(temp);
							if(tempObj instanceof Date){
								value = sf.format((Date)tempObj);
							}else{
								value = String.valueOf(tempObj);
							}
						} catch (Exception e) {
						}finally{
							if(StringUtil.isEmpty(value) || "null".equals(value)){
								label = new jxl.write.Label(colNum++,rowNum+1,"",wcf_cell);
							}else{
								label = new jxl.write.Label(colNum++,rowNum+1,value,wcf_cell);
							}
							sheet.addCell(label);
						}
  					}
  					
  					rowNum++;
  				}
  				
  			}
  			
  			workbook.write();
  			workbook.close();
  			os.close();
  		} catch (Exception e) {
  			e.printStackTrace();
  			throw new Exception("填充Excel各单元格异常:"+e.getMessage());
  		}
  		
  	}
  	
  	/**
  	 * 填充Excel,并对某一列设置其格式样式和宽度
  	 * @param list
  	 * @param os
  	 * @param colNames
  	 * @param colParams
  	 * @param sheetName
  	 * @param colStyle 数组的含义//0:取该列的值对应的属性,1:表示该列的样式,2:第几列,3:该列宽度
  	 */
  	public static <T> void setExcelByCol(List<T> list,OutputStream os,String[] colNames,String[] colParams,
  			String sheetName,Object[] colStyle)throws Exception{
  	
  		try {
  			WritableWorkbook workbook = Workbook.createWorkbook(os);
  			//设定一个sheet里面只能放50000条数据
  			int num = list.size()/MAX_ROWS + 1;
  			
  			for(int i=0;i<num;i++){
  				
  				WritableSheet sheet = null;
  				if(StringUtil.isEmpty(sheetName)){
  					sheet = workbook.createSheet("sheet"+i, 0);
  				}else{
  				    sheet = workbook.createSheet(sheetName+i, 0);
  				}
  				
  				jxl.write.WritableFont wfc = new jxl.write.WritableFont(
  						WritableFont.ARIAL, 10, WritableFont.BOLD, false,
  						jxl.format.UnderlineStyle.NO_UNDERLINE,
  						jxl.format.Colour.RED);
  				jxl.write.WritableCellFormat wcfFC = new jxl.write.WritableCellFormat(
  						wfc,NumberFormats.TEXT);
  				wcfFC.setBackground(jxl.format.Colour.YELLOW);
  				wcfFC.setVerticalAlignment(VerticalAlignment.CENTRE); // 文字垂直对齐
  				wcfFC.setAlignment(Alignment.CENTRE); // 文字水平对齐
  				
  				//设置单元格值的样式
  				jxl.write.WritableCellFormat wcf_cell = new jxl.write.WritableCellFormat(NumberFormats.TEXT);
  				wcf_cell.setVerticalAlignment(VerticalAlignment.CENTRE); // 文字垂直对齐
  				wcf_cell.setAlignment(Alignment.CENTRE); // 文字水平对齐
  				
  				//设置某一列宽度
  				if(colStyle.length == 4){
  					sheet.setColumnView(Integer.valueOf(colStyle[2].toString()),Integer.valueOf(colStyle[3].toString()));
  				}
  				//给单独某一列设置样式
  				jxl.write.WritableCellFormat wcfCol = new jxl.write.WritableCellFormat((DisplayFormat)colStyle[1]); //定义一个单元格样式  NumberFormats.FORMAT7
  				wcfCol.setAlignment(Alignment.CENTRE);
  				wcfCol.setVerticalAlignment(VerticalAlignment.CENTRE);
  				
  				jxl.write.Number number = null;
  				 //CellView cv = new CellView(); //定义一个列显示样式 
  			     //cv.setFormat(wcfCol);//把定义的单元格格式初始化进去
  			     //cv.setSize(20);//设置列宽度(不设置的话是0,不会显示)
  				//sheet.setColumnView(Integer.valueOf(colStyle[0].toString()), cv);
  				
  				//给Excel第一行的列名赋予中文名称
  				for(int j=0;j<colNames.length;j++){
  					jxl.write.Label labelCFC = new jxl.write.Label(j, 0, colNames[j],
  							wcfFC);
  					sheet.addCell(labelCFC);
  				}
  				
  				//参数list集合遍历循环的起始值和结束值
  				int num_start = i*MAX_ROWS;
  				int num_end = (i+1)*MAX_ROWS;
  				int rowNum = 0;
  				
  				if(num_end > list.size()){
  					num_end = list.size();
  				}
  				for(int k=num_start;k<num_end;k++){
  					Map obj = ObjectUtil.beanToMap(list.get(k));
  					Label label = null;
  					int colNum = 0;
  					
  					//循环遍历各列对应对象的属性,并取出值,填充单元格
  					for(String temp:colParams){
  						String value = String.valueOf(obj.get(temp));
  						if(temp.equals(colStyle[0].toString()) && isNum(value)){
  							number = new jxl.write.Number(colNum++,rowNum+1,Double.parseDouble(value),wcfCol);
  							sheet.addCell(number);
  						}else{
  							if(StringUtil.isEmpty(value) || "null".equals(value)){
  								label = new jxl.write.Label(colNum++,rowNum+1,"",wcf_cell);
  							}else{
  								label = new jxl.write.Label(colNum++,rowNum+1,value,wcf_cell);
  							}
  							sheet.addCell(label);
  						}
  					}
  					
  					rowNum++;
  				}
  				
  			}
  			
  			workbook.write();
  			workbook.close();
  			os.close();
  		} catch (Exception e) {
  			e.printStackTrace();
  			throw new Exception("填充Excel各单元格异常:"+e.getMessage());
  		}
  		
  	}
  	
  	/**
  	 * 判断其是否为数字
  	 * @param str
  	 * @return
  	 */
  	public static boolean isNum(String str){
  		return str.matches("^[-+]?(([0-9]+)([.]([0-9]+))?|([.]([0-9]+))?)$");
  	}
  	
  	/**
  	 * 解析Excel数据
  	 * @param inputStream
  	 * @param colProperty Excel每一列对应的属性名称
  	 * @param colName Excel的列名称
  	 * @return
  	 * @throws Exception
  	 */
  	public static List<Map<String, String>> parseExcelData(InputStream inputStream,String[] colProperty,String[] colName) throws Exception{
  		 if(colProperty.length == 0){
  			 throw new Exception("每一列对应的属性值不能为空!");
  		 }
			 
  		 List<Map<String,String>> list = new ArrayList<Map<String,String>>();
  		 Workbook workbook = Workbook.getWorkbook(inputStream);  //处理输入流
  		 Sheet[] sheet = workbook.getSheets();
  		 if (sheet != null) {
//  	 for(int i=0;i<sheet.length;i++){
  			 int rows = sheet[0].getRows();//获取sheet的总行号
  			 int cols = sheet[0].getColumns();//获取sheet的总列号
  			 
  			 if(cols != colProperty.length){
  				 throw new Exception("列对应的属性与列名不匹配!");
  			 }
  			 //根据列名称判断模板是否正确
  			 for(int m=0;m<colName.length;m++){
  				 String tempName = sheet[0].getCell(m, 0).getContents().trim();
  				 if(!tempName.equals(colName[m])){
  					 throw new Exception("Excel模板不匹配!");
  				 }
  			 }
  			 //遍历获得每-行每一列信息
  			 for(int j=1;j<rows;j++){
  				 Map<String, String> map = new LinkedHashMap<String, String>();
  				 for(int k=0;k<cols;k++){
  					 String temp = sheet[0].getCell(k, j).getContents().trim();
  					 if(StringUtil.isNotEmpty(temp)){
  						 map.put(colProperty[k], temp);
  					 }
  				 }
  				 
  				 if(!map.isEmpty()){
  					list.add(map);
  				 }
  			 }
  		 }
  		 return list;
  	}
}

引用如下:

//存放信息的数组
 ArrayList<HashMap<String,Object>> acountSelf_data1 = (ArrayList<HashMap<String,Object>>)acountSelf_data.get("acountSelf_data");
 //excel表头
 String[] colNames = { 	"公司名称", "账期起始日期","账期停用日期","信用额度","省份","客户类型","门店数","MTD账期GMV","MTD自营现金GMV","MTD活动现金GMV","MTD合计GMV","剩余额度","MTD额度使用率","额度占用率","招商","运营","2017-12GMV","2018-01GMV","2018-02GMV","2018-03GMV","2018-04GMV","2018-05GMV","2018-06GMV","2018-07GMV","GMV"};
 //表头对应的字段名称
 String[] colParams = { 	"buyer_name", "start_date",	"end_date",	"credit_limit", "RCV_REG_PROV", "param_name", "CUST_Count","gmv_mtd_zq","gmv_mtd_xj1","gmv_mtd_xj2","gmv_mtd_all","avl_limit","rate_mtd_use","rate_use","op","bd","2017-12GMV","2018-01GMV","2018-02GMV","2018-03GMV","2018-04GMV","2018-05GMV","2018-06GMV","2018-07GMV","GMV"};
 //25为一共几列,sheetname是sheet名称
 ExcelUtils.setExcel(acountSelf_data1,out,colNames,colParams,null,25);