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;
}
}
在项目中自己写的一个导出Excel的工具类,自己用着比较顺手,在这备份一下
猜你喜欢
转载自blog.csdn.net/ZhaoyuMing568/article/details/88012167
今日推荐
周排行