Excel导出工具类.--POI
import java.io.OutputStream;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang3.ArrayUtils;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFRichTextString;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.RichTextString;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.anhry.app.util.bean.SystemBean;
import com.anhry.app.util.excel.annoation.Excel;
/**
* Excel导出工具类.
*/
public class ExportExcel<T> {
public static final Logger LOG = LoggerFactory.getLogger(ExportExcel.class);
/**
*
* @param title Sheet名字
* @param pojoClass Excel对象Class
* @param dataSet Excel对象数据List
* @param out 输出流
*/
public void exportExcel(String title, Class<T> pojoClass,
Collection<T> dataSet, OutputStream out) {
// 使用userModel模式实现的,当excel文档出现10万级别的大数据文件可能导致OOM内存溢出
exportExcelInUserModel(title, pojoClass, dataSet, out);
// 使用eventModel实现,可以一边读一边处理,效率较高,但是实现复杂,暂时未实现
}
private void exportExcelInUserModel(String title, Class<T> pojoClass,
Collection<T> dataSet, OutputStream out) {
try {
// 首先检查数据看是否是正确的
if (dataSet == null || dataSet.size() == 0) {
throw new Exception("导出数据为空!");
}
if (title == null || out == null || pojoClass == null) {
throw new Exception("传入参数不能为空!");
}
// 声明一个工作薄
Workbook workbook = new HSSFWorkbook();
// 生成一个表格
Sheet sheet = workbook.createSheet(title);
// 标题
List<String> exportFieldTitle = new ArrayList<String>();
List<Integer> exportFieldWidth = new ArrayList<Integer>();
// 拿到所有列名,以及导出的字段的get方法
List<Method> methodObj = new ArrayList<Method>();
Map<String, Method> convertMethod = new HashMap<String, Method>();
// 得到所有字段
Field fileds[] = pojoClass.getDeclaredFields();
// 遍历整个filed
for (int i = 0; i < fileds.length; i++) {
Field field = fileds[i];
Excel excel = field.getAnnotation(Excel.class);
// 如果设置了annottion
if (excel != null) {
// 添加到标题
exportFieldTitle.add(excel.exportName());
// 添加标题的列宽
exportFieldWidth.add(excel.exportFieldWidth());
// 添加到需要导出的字段的方法
String fieldname = field.getName();
// System.out.println(i+"列宽"+excel.exportName()+" "+excel.exportFieldWidth());
StringBuffer getMethodName = new StringBuffer("get");
getMethodName.append(fieldname.substring(0, 1)
.toUpperCase());
getMethodName.append(fieldname.substring(1));
Method getMethod = pojoClass.getMethod(getMethodName
.toString(), new Class[] {});
methodObj.add(getMethod);
if (excel.exportConvert() == true) {
StringBuffer getConvertMethodName = new StringBuffer(
"get");
getConvertMethodName.append(fieldname.substring(0, 1)
.toUpperCase());
getConvertMethodName.append(fieldname.substring(1));
getConvertMethodName.append("Convert");
Method getConvertMethod = pojoClass
.getMethod(getConvertMethodName.toString(),
new Class[] {});
convertMethod.put(getMethodName.toString(),
getConvertMethod);
}
}
}
int index = 0;
// 产生表格标题行
Row row = sheet.createRow(index);
for (int i = 0, exportFieldTitleSize = exportFieldTitle.size(); i < exportFieldTitleSize; i++) {
Cell cell = row.createCell(i);
// cell.setCellStyle(style);
RichTextString text = new HSSFRichTextString(exportFieldTitle
.get(i));
cell.setCellValue(text);
}
// 设置每行的列宽
for (int i = 0; i < exportFieldWidth.size(); i++) {
// 256=65280/255
sheet.setColumnWidth(i, 256 * exportFieldWidth.get(i));
}
Iterator its = dataSet.iterator();
// 循环插入剩下的集合
while (its.hasNext()) {
// 从第二行开始写,第一行是标题
index++;
row = sheet.createRow(index);
Object t = its.next();
for (int k = 0, methodObjSize = methodObj.size(); k < methodObjSize; k++) {
Cell cell = row.createCell(k);
Method getMethod = methodObj.get(k);
Object value = null;
if (convertMethod.containsKey(getMethod.getName())) {
Method cm = convertMethod.get(getMethod.getName());
value = cm.invoke(t, new Object[] {});
} else {
value = getMethod.invoke(t, new Object[] {});
}
cell.setCellValue(value == null ? "" : value.toString());
}
}
workbook.write(out);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
*
* @param title Sheet名字
* @param pojoClass Excel对象Class
* @param dataSet Excel对象数据List
* @param out 输出流
*/
public HSSFWorkbook exportExcel(String title, Class<T> pojoClass,
Collection<T> dataSet) {
// 使用userModel模式实现的,当excel文档出现10万级别的大数据文件可能导致OOM内存溢出
return exportExcelInUserModel2File(title, pojoClass, dataSet, null);
}
/**
*
* @param title Sheet名字
* @param pojoClass Excel对象Class
* @param dataSet Excel对象数据List
* @param exportFields Excel对象选择要导出的字段
* @param out 输出流
*/
public HSSFWorkbook exportExcel(String title, Class<T> pojoClass,
Collection<T> dataSet,List<String> exportFields) {
// 使用userModel模式实现的,当excel文档出现10万级别的大数据文件可能导致OOM内存溢出
return exportExcelInUserModel2File(title, pojoClass, dataSet, exportFields);
}
HSSFWorkbook exportExcelInUserModel2File(String title, Class<T> pojoClass,
Collection<T> dataSet) {
return exportExcelInUserModel2File(title, pojoClass, dataSet, null);
}
private HSSFWorkbook exportExcelInUserModel2File(String title, Class<T> pojoClass,
Collection<T> dataSet, List<String> exportFields) {
// 声明一个工作薄
HSSFWorkbook workbook = null;
try {
// 声明一个工作薄
workbook = new HSSFWorkbook();
// 生成一个表格
Sheet sheet = workbook.createSheet(title);
// 标题
List<String> exportFieldTitle = new ArrayList<String>();
List<Integer> exportFieldWidth = new ArrayList<Integer>();
// 拿到所有列名,以及导出的字段的get方法
List<Method> methodObj = new ArrayList<Method>();
Map<String, Method> convertMethod = new HashMap<String, Method>();
Class superClazz = null;
Field fileds[] = new Field[0];
boolean flag = true;
while (flag) {
if(superClazz != null){
superClazz = superClazz.getSuperclass();
}else{
superClazz = pojoClass.getSuperclass();
}
if(superClazz.isInstance(Object.class)){
flag = false;
}else{
Field[] sf = superClazz.getDeclaredFields();
if(sf != null && sf.length >0){
for(int m = 0;m<sf.length;m++){
fileds = ArrayUtils.addAll(fileds, sf[m]);
}
}
}
}
// 得到所有字段
Field cfileds[] = pojoClass.getDeclaredFields();
if(cfileds != null && cfileds.length >0){
for(int n = 0;n<cfileds.length;n++){
fileds = ArrayUtils.addAll(fileds, cfileds[n]);
}
}
// 遍历整个filed
int exportFieldCount = 0; // 要导出字段的数量
if(exportFields != null && exportFields.size() > 0) {
exportFieldCount = exportFields.size() ;
}
for (int i = 0; i < fileds.length; i++) {
Field field = fileds[i];
Excel excel = field.getAnnotation(Excel.class);
// 如果设置了annottion
if (excel != null) {
if(exportFieldCount > 0) {
for(String eField: exportFields) {
if(eField.equals(excel.exportName())) {
addExportField(exportFieldTitle, exportFieldWidth, excel, field, methodObj, pojoClass, convertMethod);
exportFieldCount -=1;
LOG.debug("exportFieldCount --- > " + exportFieldCount);
break;
}
}
if(exportFieldCount <= 0) {
LOG.debug("Break Field Loop! ------------ !@!");
break;
}
} else {
addExportField(exportFieldTitle, exportFieldWidth, excel, field, methodObj, pojoClass, convertMethod);
}
}
}
int index = 0;
// 产生表格标题行
Row row = sheet.createRow(index);
row.setHeight((short)450);
CellStyle titleStyle = getTitleStyle(workbook);
for (int i = 0, exportFieldTitleSize = exportFieldTitle.size(); i < exportFieldTitleSize; i++) {
Cell cell = row.createCell(i);
// cell.setCellStyle(style);
RichTextString text = new HSSFRichTextString(exportFieldTitle
.get(i));
cell.setCellValue(text);
cell.setCellStyle(titleStyle);
}
// 设置每行的列宽
for (int i = 0; i < exportFieldWidth.size(); i++) {
// 256=65280/255
sheet.setColumnWidth(i, 256 * exportFieldWidth.get(i));
}
Iterator its = dataSet.iterator();
// 循环插入剩下的集合
HSSFCellStyle oneStyle = getOneStyle(workbook);
HSSFCellStyle twoStyle = getTwoStyle(workbook);
while (its.hasNext()) {
// 从第二行开始写,第一行是标题
index++;
row = sheet.createRow(index);
row.setHeight((short)350);
Object t = its.next();
for (int k = 0, methodObjSize = methodObj.size(); k < methodObjSize; k++) {
Cell cell = row.createCell(k);
Method getMethod = methodObj.get(k);
Object value = null;
if (convertMethod.containsKey(getMethod.getName())) {
Method cm = convertMethod.get(getMethod.getName());
value = cm.invoke(t, new Object[] {});
} else {
value = getMethod.invoke(t, new Object[] {});
}
cell.setCellValue(value==null?"":value.toString());
if(index%2==0)
cell.setCellStyle(twoStyle);
else
cell.setCellStyle(oneStyle);
}
}
} catch (Exception e) {
e.printStackTrace();
}
return workbook;
}
private void addExportField(List<String> exportFieldTitle, List<Integer> exportFieldWidth, Excel excel,
Field field, List<Method> methodObj, Class<T> pojoClass, Map<String, Method> convertMethod) throws Exception{
// 添加到标题
exportFieldTitle.add(excel.exportName());
// 添加标题的列宽
exportFieldWidth.add(excel.exportFieldWidth());
// 添加到需要导出的字段的方法
String fieldname = field.getName();
// System.out.println(i+"列宽"+excel.exportName()+" "+excel.exportFieldWidth());
StringBuffer getMethodName = new StringBuffer("get");
getMethodName.append(fieldname.substring(0, 1)
.toUpperCase());
getMethodName.append(fieldname.substring(1));
Method getMethod = pojoClass.getMethod(getMethodName
.toString(), new Class[] {});
methodObj.add(getMethod);
if (excel.exportConvert() == true) {
//----------------------------------------------------------------
//update-begin--Author:Quainty Date:20130524 for:[8]excel导出时间问题
// 用get/setXxxxConvert方法名的话, 由于直接使用了数据库绑定的Entity对象,注入会有冲突
StringBuffer getConvertMethodName = new StringBuffer("convertGet");
getConvertMethodName.append(fieldname.substring(0, 1).toUpperCase());
getConvertMethodName.append(fieldname.substring(1));
//getConvertMethodName.append("Convert");
//update-end--Author:Quainty Date:20130524 for:[8]excel导出时间问题
//----------------------------------------------------------------
// System.out.println("convert: "+getConvertMethodName.toString());
Method getConvertMethod = pojoClass
.getMethod(getConvertMethodName.toString(),
new Class[] {});
convertMethod.put(getMethodName.toString(),
getConvertMethod);
}
}
/**
* 取得一个类添加了@Excel 注解的所有属性中 该注解中的exportName
* @param pojoClass
* @return
*/
public List<SystemBean> getExportFields(Class<T> pojoClass) {
// 标题
List<SystemBean> exportNames = new ArrayList<SystemBean>();
Class superClazz = null;
Field fileds[] = new Field[0];
boolean flag = true;
while (flag) {
if(superClazz != null){
superClazz = superClazz.getSuperclass();
}else{
superClazz = pojoClass.getSuperclass();
}
if(superClazz.isInstance(Object.class)){
flag = false;
}else{
Field[] sf = superClazz.getDeclaredFields();
if(sf != null && sf.length >0){
for(int m = 0;m<sf.length;m++){
fileds = ArrayUtils.addAll(fileds, sf[m]);
System.out.println(sf[m].getName());
}
}
}
}
// 得到所有字段
Field cfileds[] = pojoClass.getDeclaredFields();
if(cfileds != null && cfileds.length >0){
for(int n = 0;n<cfileds.length;n++){
fileds = ArrayUtils.addAll(fileds, cfileds[n]);
}
}
// 遍历整个filed
for (int i = 0; i < fileds.length; i++) {
Field field = fileds[i];
Excel excel = field.getAnnotation(Excel.class);
// 如果设置了annottion
if (excel != null) {
SystemBean sb = new SystemBean();
sb.setId(excel.exportName());
sb.setName(excel.exportName());
// 添加到标题
exportNames.add(sb);
}
}
return exportNames;
}
/**
* 导出excel的样式
* @param workbook
* @return
*/
public static HSSFCellStyle getTitleStyle(HSSFWorkbook workbook){
// 产生Excel表头
HSSFCellStyle titleStyle = workbook.createCellStyle();
titleStyle.setBorderBottom(HSSFCellStyle.BORDER_DOUBLE); //设置边框样式
titleStyle.setBorderLeft((short)2); //左边框
titleStyle.setBorderRight((short)2); //右边框
titleStyle.setBorderTop((short)2); //左边框
titleStyle.setBorderBottom((short)2); //右边框
titleStyle.setBorderTop(HSSFCellStyle.BORDER_DOUBLE); //顶边框
titleStyle.setFillForegroundColor(HSSFColor.SKY_BLUE.index); //填充的背景颜色
titleStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
titleStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND); //填充图案
return titleStyle;
}
public static HSSFCellStyle getTwoStyle(HSSFWorkbook workbook){
// 产生Excel表头
// 产生Excel表头
HSSFCellStyle style = workbook.createCellStyle();
style.setBorderLeft((short)1); //左边框
style.setBorderRight((short)1); //右边框
style.setBorderBottom((short)1);
style.setBorderTop((short)1);
style.setFillForegroundColor(HSSFColor.LIGHT_TURQUOISE.index); //填充的背景颜色
style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND); //填充图案
return style;
}
public static HSSFCellStyle getOneStyle(HSSFWorkbook workbook){
// 产生Excel表头
// 产生Excel表头
HSSFCellStyle style = workbook.createCellStyle();
style.setBorderLeft((short)1); //左边框
style.setBorderRight((short)1); //右边框
style.setBorderBottom((short)1);
style.setBorderTop((short)1);
return style;
}
}