在项目中自己写的一个导出Excel的工具类,自己用着比较顺手,在这备份一下

package com.lns.sport.cfamis.bimm.orgregister.util;

import java.io.OutputStream;
import java.lang.reflect.Method;
import java.net.URLEncoder;
import java.util.Collection;
import java.util.Iterator;

import javax.servlet.http.HttpServletResponse;

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class ExportExcel {
	/**
	 * 
	* @Title: export
	* @Description: 导出Excel工具类,利用了反射的原理,查询列表需要返回的是一个实体类
	* @param @param response  
	* @param @param fileName  文件名
	* @param @param excelHealder 表头数组
	* @param @param dataList  数据集合
	* @param @return
	* @param @throws Exception    参数
	* @return XSSFWorkbook    返回类型
	* @throws
	 */
	public static <T> XSSFWorkbook export(HttpServletResponse response,String fileName,String[] excelHealder,Collection<T> dataList) throws Exception{
		//设置请求
		response.setContentType("application/vnd.ms-excel.12");
		response.setHeader("Content-disposition", "attachment;filename="+URLEncoder.encode(fileName+".xlsx","UTF-8"));
		//创建一个workbook,相当于一个excel文件
		XSSFWorkbook wb = new XSSFWorkbook();
		//设置标题样式
		XSSFCellStyle titleStyle = (XSSFCellStyle)wb.createCellStyle();
		//设置单元格边框样式(3.17版本的设置方式与普通方式不同)
		titleStyle.setBorderBottom(BorderStyle.THIN);//设置下边框
		titleStyle.setBorderTop(BorderStyle.THIN);//设置上边框
		titleStyle.setBorderLeft(BorderStyle.THIN);//设置左边框
		titleStyle.setBorderRight(BorderStyle.THIN);//设置有边框
		//设置单元格的对齐方式(3.17版本的设置方式与普通方式不同)
		//设置水平居中
		titleStyle.setAlignment(HorizontalAlignment.CENTER);
		//设置垂直居中
		titleStyle.setVerticalAlignment(VerticalAlignment.CENTER);
		//设置字体样式
		Font titleFont = wb.createFont();
		titleFont.setFontHeightInPoints((short) 15);
		titleFont.setFontName("黑体");
		titleStyle.setFont(titleFont);
		//在workbook中添加一个sheet,对应excel文中的sheet
		XSSFSheet sheet = wb.createSheet(fileName);
		//标题数组
		String[] titleArray = new String[excelHealder.length];
		//字段名数组
		String[] fieldArray = new String[excelHealder.length];
		for(int i = 0;i < excelHealder.length;i++) {
			String[] tempArray = excelHealder[i].split("#");
			titleArray[i] = tempArray[0];
			fieldArray[i] = tempArray[1];
		}
		//在sheet中添加标题行
		XSSFRow row = sheet.createRow(0);//行从0开始
		XSSFCell sequenceCell = row.createCell(0);//列从0开始
		sequenceCell.setCellValue("序号");
		sequenceCell.setCellStyle(titleStyle);
		sheet.autoSizeColumn(0);//自动设置宽度
		//为标题行赋值
		for(int i = 0;i < titleArray.length;i++) {
			XSSFCell titleCell = row.createCell(i+1);//从第二行开始
			titleCell.setCellValue(titleArray[i]);
			titleCell.setCellStyle(titleStyle);
			sheet.autoSizeColumn(i+1);
		}
		//数据样式,与标题样式分开设置,以免覆盖
		XSSFCellStyle dataStyle = wb.createCellStyle();
		//设置数据边框(3.17版本的设置方式与普通方式不同)
		dataStyle.setBorderBottom(BorderStyle.THIN);//设置上边框
		dataStyle.setBorderTop(BorderStyle.THIN);//设置上边框
		dataStyle.setBorderLeft(BorderStyle.THIN);//设置左边框
		dataStyle.setBorderRight(BorderStyle.THIN);//设置有边框
		//设置数据样式(3.17版本的设置方式与普通方式不同)
		dataStyle.setAlignment(HorizontalAlignment.CENTER);//设置水平居中
		dataStyle.setVerticalAlignment(VerticalAlignment.CENTER);//设置垂直居中
		//设置数据字体
		Font dataFont = wb.createFont();
		dataFont.setFontHeightInPoints((short) 12);
		dataFont.setFontName("宋体");
		dataStyle.setFont(dataFont);
		//遍历集合中的数据,产生数据行
		Iterator<T> it = dataList.iterator();
		int index = 0;
		while(it.hasNext()) {
			index++;//从第二行开始,所以先++
			row = sheet.createRow(index);
			//为序号行赋值
			XSSFCell sequenceCellValue = row.createCell(0);//序号永远放在每行的第一列上
			sequenceCellValue.setCellValue(index);
			sequenceCellValue.setCellStyle(dataStyle);
			//sheet.autoSizeColumn(0);
			T t = (T) it.next();
			//利用反射的方式来调用get***()方法
			for(int i = 0;i < fieldArray.length;i++) {
				XSSFCell dataCell = row.createCell(i + 1);
				dataCell.setCellStyle(dataStyle);
                //设置每一行的自动列宽,如果数据量稍大,这一行尽量注释掉,会严重影响效率.
				//sheet.autoSizeColumn(i + 1);
				String fieldName = fieldArray[i];
				String getMethodName = "get"+fieldName.substring(0, 1).toUpperCase()+fieldName.substring(1);
				Class<? extends Object> tCls = t.getClass();
				Method getMethod = tCls.getMethod(getMethodName, new Class[] {});
				Object value = getMethod.invoke(t, new Object[] {});
				if(value != null) {
					dataCell.setCellValue(value.toString());
				}
			}
		}
		
		OutputStream outputStream = response.getOutputStream();
		wb.write(outputStream);
		/*wb.close();*/
		outputStream.flush();
		outputStream.close();
		return wb;
	}
}

猜你喜欢

转载自blog.csdn.net/ZhaoyuMing568/article/details/88012167