public class ExportExcel {
/**
* 导出Excel
*
* @param fields 要导出的字段
* @param t 实例化空的T对象
* @param list 要导出数据的集合
* @param excelName 导出excel名称
* @param response 导出excel序列化到Response中
* @param <T> 导出Excel的T对象
*/
public <T> void exportExcel(String[] fields, T t, List<T> list, String excelName, HttpServletResponse response) {
CreateExcel createExcel = new CreateExcel().newInstance(t, list, fields, excelName);
createExcel.drawExcel();
createExcel.saveAsResponse(response);
}
/**
* 导出excel包含单位
*
* @param fields 要导出的字段
* @param t 实例化空的T对象
* @param list 要导出数据的集合
* @param excelName 导出excel名称
* @param unit 单位名称
* @param response 导出excel序列化到Response中
* @param <T> 导出Excel的T对象
*/
public <T> void exportExcelWithUnit(String[] fields, T t, List<T> list, String excelName, String unit, HttpServletResponse response) {
CreateExcel createExcel = new CreateExcel().newInstance(t, list, fields, excelName);
createExcel.setUnit("单位:亩");
createExcel.drawExcel();
createExcel.saveAsResponse(response);
}
/**
* 导出excel包含字典
*
* @param fields 要导出的字段
* @param t 实例化空的T对象
* @param list 要导出数据的集合
* @param excelName 导出excel名称
* @param map 字典集合
* @param response 导出excel序列化到Response中
* @param <T> 导出Excel的T对象
*/
public <T> void exportExcelWithDic(String[] fields, T t, List<T> list, String excelName, Map<String, Map<Object, Object>> map, HttpServletResponse response) {
CreateExcel createExcel = new CreateExcel().newInstance(t, list, fields, excelName);
createExcel.setDicMap(map);
createExcel.drawExcel();
createExcel.saveAsResponse(response);
}
/**
* 导出excel包含单位和字典
*
* @param fields 要导出的字段
* @param t 实例化空的T对象
* @param list 要导出数据的集合
* @param excelName 导出excel名称
* @param unit 单位名称
* @param map 字典集合
* @param response 导出excel序列化到Response中
* @param <T> 导出Excel的T对象
*/
public <T> void exportExcelWithUnitAndDic(String[] fields, T t, List<T> list, String excelName, String unit, Map<String, Map<Object, Object>> map, HttpServletResponse response) {
CreateExcel createExcel = new CreateExcel().newInstance(t, list, fields, excelName);
createExcel.setUnit(unit);
createExcel.setDicMap(map);
createExcel.drawExcel();
createExcel.saveAsResponse(response);
}
/**
* 导出双表头Excel
*
* @param fields 要导出的字段
* @param t 实例化空的T对象
* @param list 要导出数据的集合
* @param excelName 导出excel名称
* @param queue2 合并表头
* @param response 导出excel序列化到Response中
* @param <T> 导出Excel的T对象
*/
public <T> void exportExcelWithCoupleTitle(String[] fields, T t, List<T> list, String excelName, Queue<ThreeTuple<Integer, Integer, String>> queue2, HttpServletResponse response) {
CreateExcel createExcel = new CreateExcel().newInstance(t, list, fields, excelName);
createExcel.setQueue2(queue2);
createExcel.setExcelTitleEnum(CreateExcel.ExcelTitleEnum.TWO);
createExcel.drawExcel();
createExcel.saveAsResponse(response);
}
/**
* 导出双表头excel包含单位
*
* @param fields 要导出的字段
* @param t 实例化空的T对象
* @param list 要导出数据的集合
* @param excelName 导出excel名称
* @param unit 单位名称
* @param response 导出excel序列化到Response中
* @param <T> 导出Excel的T对象
*/
public <T> void exportExcelWithCoupleTitleAndUnit(String[] fields, T t, List<T> list, String excelName, Queue<ThreeTuple<Integer, Integer, String>> queue2, String unit, HttpServletResponse response) {
CreateExcel createExcel = new CreateExcel().newInstance(t, list, fields, excelName);
createExcel.setQueue2(queue2);
createExcel.setExcelTitleEnum(CreateExcel.ExcelTitleEnum.TWO);
createExcel.setUnit(unit);
createExcel.drawExcel();
createExcel.saveAsResponse(response);
}
/**
* 导出三表头Excel
* @param fields 要导出的字段
* @param t 实例化空的T对象
* @param list 要导出数据的集合
* @param excelName 导出excel名称
* @param queue2 合并第二列表头
* @param response 导出excel序列化到Response中
* @param <T> 导出Excel的T对象
*/
public <T> void exportExcelWithThreeTitle(String[] fields, T t, List<T> list, String excelName, Queue<ThreeTuple<Integer, Integer, String>> queue2, Queue<ThreeTuple<Integer, Integer, String>> queue3, HttpServletResponse response) {
CreateExcel createExcel = new CreateExcel().newInstance(t, list, fields, excelName);
createExcel.setQueue2(queue2);
createExcel.setQueue3(queue3);
createExcel.setExcelTitleEnum(CreateExcel.ExcelTitleEnum.TWO);
createExcel.drawExcel();
createExcel.saveAsResponse(response);
}
/**
* 导出三表头excel包含单位
*
* @param fields 要导出的字段
* @param t 实例化空的T对象
* @param list 要导出数据的集合
* @param excelName 导出excel名称
* @param unit 单位名称
* @param response 导出excel序列化到Response中
* @param <T> 导出Excel的T对象
*/
public <T> void exportExcelWithThreeTitleAndUnit(String[] fields, T t, List<T> list, String excelName, Queue<ThreeTuple<Integer, Integer, String>> queue2, Queue<ThreeTuple<Integer, Integer, String>> queue3, String unit, HttpServletResponse response) {
CreateExcel createExcel = new CreateExcel().newInstance(t, list, fields, excelName);
createExcel.setQueue2(queue2);
createExcel.setQueue3(queue3);
createExcel.setExcelTitleEnum(CreateExcel.ExcelTitleEnum.TWO);
createExcel.setUnit(unit);
createExcel.drawExcel();
createExcel.saveAsResponse(response);
}
}
public class CreateExcel<T> {
/**
* Excel title enum
*/
public enum ExcelTitleEnum {
ONE, TWO, THREE
}
/**
* 创建一个excel
*/
private HSSFWorkbook wb;
/**
* 创建单个sheet
*/
private HSSFSheet sheet;
private HSSFCellStyle normalStyle;
private HSSFCellStyle doubleCellStyle;
private HSSFCellStyle dateCellStyle;
private HSSFCellStyle fontCellStyle;
private boolean bTitleVis = true;
/**
* excel title num. default one
*/
private ExcelTitleEnum excelTitleEnum = ExcelTitleEnum.ONE;
/**
* 绘制表头
*/
private T t;
/**
* 填写表内容
*/
private List<T> arrays;
/**
* excel的名称,用于画表头,sheet名称,输出文件名称
*/
private String excelName;
private String unit;
private String[] fields;
/**
* 两行表头
*/
private Queue<ThreeTuple<Integer, Integer, String>> queue2;
/**
* 三行表头
*/
private Queue<ThreeTuple<Integer, Integer, String>> queue3;
private int index = 0;
private Map<String, Map<Object, Object>> dicMap = new HashedMap();
public void setbTitleVis(boolean bTitleVis) {
this.bTitleVis = bTitleVis;
}
public HSSFWorkbook getWb() {
return wb;
}
public void setDicMap(Map<String, Map<Object, Object>> dicMap) {
this.dicMap = dicMap;
}
public void setExcelTitleEnum(ExcelTitleEnum excelTitleEnum) {
this.excelTitleEnum = excelTitleEnum;
}
public void setQueue2(Queue<ThreeTuple<Integer, Integer, String>> queue2) {
this.queue2 = queue2;
}
public void setQueue3(Queue<ThreeTuple<Integer, Integer, String>> queue3) {
this.queue3 = queue3;
}
/**
* 实例化一个excel
*
* @return
*/
public CreateExcel newInstance(T t, List<T> arrays, String[] fields, String excelName) {
this.t = t;
this.arrays = arrays;
this.excelName = excelName;
this.fields = fields;
return this;
}
public void drawExcel(String title[],String []end) {
createSheet(); //创建表格
createTitle(); //绘制表格头部
createUnit(title); // 绘制单位
createTableTitle(); // 绘制表格表头
createTableContent(); //填充表格内容
index=index+2;
createUnit(end); //绘制表格尾部
}
public void drawExcel() {
createSheet(); //创建表格
createTitle(); //绘制表格头部
createUnit(); // 绘制单位
createTableTitle(); // 绘制表格表头
createTableContent(); //填充表格内容
}
/**
* 将excel数据缓存到response中
*
* @param response
*/
public void saveAsResponse(HttpServletResponse response) {
try {
response.setHeader("content-disposition", "attachment;filename=" + URLEncoder.encode(this.excelName, "utf-8") + ".xls");
OutputStream out = response.getOutputStream();
ByteArrayOutputStream stream = new ByteArrayOutputStream();
wb.write(stream);
byte[] bytes = stream.toByteArray();
out.write(bytes);
out.close();
} catch (
UnsupportedEncodingException e)
{
e.printStackTrace();
} catch (
IOException e)
{
e.printStackTrace();
}
}
public void saveAsFile(String filePath) {
try {
File file = new File(filePath);
if (!file.exists()) {
file.createNewFile();
}
//保存excel
FileOutputStream fileOutputStream = new FileOutputStream(file);
wb.write(fileOutputStream);
fileOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
private void createSheet() {
// 第一步,创建一个webbook,对应一个Excel文件
this.wb = new HSSFWorkbook();
// 第二步,在webbook中添加一个sheet,对应Excel文件中的sheet
this.sheet = wb.createSheet(excelName);
// 设置样式
this.normalStyle = setNormalStyle(wb.createCellStyle());
this.dateCellStyle = setDateStyle(wb.createCellStyle());
this.doubleCellStyle = setDoubleStyle(wb.createCellStyle());
this.fontCellStyle = setFontStyle(wb.createCellStyle());
}
/**
* 绘制表的title
*/
private void createTitle() {
if (!StrUtil.isNullOrEmpty(this.excelName) && true == bTitleVis) {
HSSFRow row = sheet.createRow(index++);
row.setHeight((short) (30 * 20));
//setCellBorder(row); //设置边框
HSSFCell cell = row.createCell(0);
cell.setCellValue(excelName);
cell.setCellStyle(this.fontCellStyle);
sheet.addMergedRegion(new CellRangeAddress(index - 1, index - 1, 0, fields.length - 1));
}
}
/**
* 添加单位
*/
private void createUnit(String [] title) {
HSSFRow row = sheet.createRow(index++);
if(title.length>0){
//setCellBorder(row); //设置边框
int length = title.length;
for(int i=0;i<length;i++){
int num =i*4;
HSSFCell cell = row.createCell(num);
cell.setCellValue(title[i]);
}
}
}
/**
* 添加单位
*/
private void createUnit() {
if (!StrUtil.isNullOrEmpty(unit)) {
HSSFRow row = sheet.createRow(index++);
//setCellBorder(row); //设置边框
HSSFCell cell = row.createCell(0);
cell.setCellValue(unit);
}
}
/**
* 是否存在属性
* @param clz
* @param fieldName
* @return
*/
public static boolean existsField(Class clz,String fieldName){
if(null!=clz){
Field[] fields = clz.getDeclaredFields();
for(Field f : fields) {
if(fieldName.equals(f.getName())){
return true;
}
}
}
return false;
}
/**
* 根据@ExcelTitle注解获取表头定义文字
* @param clz
* @param fieldName
* @return
*/
public ExcelTitle getExcelTitle(Class<?> clz,String fieldName){
ExcelTitle excelTitle =null;
try {
//Class<?> clazzChild =t.getClass();
Class<?> clazz=clz.getSuperclass();
if(null!=clazz){
if(existsField(clazz,fieldName)){
excelTitle = clazz.getDeclaredField(fieldName).getAnnotation(ExcelTitle.class);
}else{
if(existsField(clz,fieldName)){
excelTitle = clz.getDeclaredField(fieldName).getAnnotation(ExcelTitle.class);
}
}
}else{
if(existsField(clz,fieldName)){
excelTitle = clz.getDeclaredField(fieldName).getAnnotation(ExcelTitle.class);
}
}
} catch (Exception e) {
return null;
}
return excelTitle;
}
/**
* 绘制表头
*/
private void createTableTitle() {
if (excelTitleEnum == ExcelTitleEnum.ONE) {
//绘制一级表头
HSSFRow row = sheet.createRow(index++);
setCellBorder(row);
for (int i = 0; i < fields.length; i++) {
HSSFCell cell = row.getCell(i);
try {
ExcelTitle excelTitle =getExcelTitle(t.getClass(),fields[i]);
//ExcelTitle excelTitle = t.getClass().getDeclaredField(fields[i]).getAnnotation(ExcelTitle.class);
if (null != excelTitle) {
cell.setCellValue(excelTitle.value());
} else {
cell.setCellValue("");
}
} catch (Exception e) {
cell.setCellValue("");
}
this.sheet.setColumnWidth(i, 15 * 256);
}
} else if (excelTitleEnum == ExcelTitleEnum.TWO) {
// 绘制二级表头
int titleIndex = index;
HSSFRow row1 = sheet.createRow(index++);
setCellBorder(row1);
HSSFRow row2 = sheet.createRow(index++);
setCellBorder(row2);
boolean queueStart = false;
ThreeTuple<Integer, Integer, String> tuple = null;
for (int i = 0; i < fields.length; i++) {
HSSFCell cell1 = row1.getCell(i);
HSSFCell cell2 = row2.getCell(i);
try {
//ExcelTitle excelTitle = t.getClass().getDeclaredField(fields[i]).getAnnotation(ExcelTitle.class);
ExcelTitle excelTitle =getExcelTitle(t.getClass(),fields[i]);
if (!queueStart && queue2.size() > 0) {
tuple = queue2.poll();
queueStart = true;
}
if (i >= tuple.first && i <= tuple.second) {
//合并的表头
if (i == tuple.first) {
sheet.addMergedRegion(new CellRangeAddress(titleIndex, titleIndex, tuple.first, tuple.second));
cell1.setCellValue(tuple.third);
}
if (null != excelTitle) {
cell2.setCellValue(excelTitle.value());
} else {
cell2.setCellValue("");
}
if (i == tuple.second) {
queueStart = false;
}
} else {
sheet.addMergedRegion(new CellRangeAddress(titleIndex, titleIndex + 1, i, i));
if (null != excelTitle) {
cell1.setCellValue(excelTitle.value());
} else {
cell1.setCellValue("");
}
}
} catch (Exception e) {
cell1.setCellValue("");
cell2.setCellValue("");
}
this.sheet.setColumnWidth(i, 15 * 256);
}
} else if (excelTitleEnum == ExcelTitleEnum.THREE) {
// 绘制二级表头
int titleIndex = index;
HSSFRow row1 = sheet.createRow(index++);
setCellBorder(row1);
HSSFRow row2 = sheet.createRow(index++);
setCellBorder(row2);
HSSFRow row3 = sheet.createRow(index++);
setCellBorder(row3);
boolean queueTwoStart = false;
boolean queueThreeStart = false;
ThreeTuple<Integer, Integer, String> tupleTwo = null;
ThreeTuple<Integer, Integer, String> tupleThree = null;
for (int i = 0; i < fields.length; i++) {
HSSFCell cell1 = row1.getCell(i);
HSSFCell cell2 = row2.getCell(i);
HSSFCell cell3 = row3.getCell(i);
try {
// ExcelTitle excelTitle = t.getClass().getDeclaredField(fields[i]).getAnnotation(ExcelTitle.class);
ExcelTitle excelTitle =getExcelTitle(t.getClass(),fields[i]);
if (!queueTwoStart && queue2.size() > 0) {
tupleTwo = queue2.poll();
queueTwoStart = true;
}
if (!queueThreeStart && queue3.size() > 0) {
tupleThree = queue3.poll();
queueThreeStart = true;
}
if (i >= tupleTwo.first && i <= tupleTwo.second) {
if (i == tupleTwo.first) {
sheet.addMergedRegion(new CellRangeAddress(titleIndex, titleIndex, tupleTwo.first, tupleTwo.second));
cell1.setCellValue(tupleTwo.third);
}
if (i == tupleThree.first) {
sheet.addMergedRegion(new CellRangeAddress(titleIndex + 1, titleIndex + 1, tupleThree.first, tupleThree.second));
cell2.setCellValue(tupleThree.third);
}
if (i == tupleThree.second) {
queueThreeStart = false;
}
if (null != excelTitle) {
cell3.setCellValue(excelTitle.value());
} else {
cell3.setCellValue("");
}
} else {
if (i == tupleTwo.second) {
queueTwoStart = false;
}
sheet.addMergedRegion(new CellRangeAddress(titleIndex, titleIndex + 2, i, i));
if (null != excelTitle) {
cell1.setCellValue(excelTitle.value());
} else {
cell1.setCellValue("");
}
}
} catch (Exception e) {
cell1.setCellValue("");
cell2.setCellValue("");
cell3.setCellValue("");
}
this.sheet.setColumnWidth(i, 15 * 256);
}
}
}
/**
* 绘制表的内容
*/
private void createTableContent() {
if (0 != arrays.size()) {
for (int i = 0; i < arrays.size(); i++) {
HSSFRow row = sheet.createRow(index++);
setCellBorder(row);
Class<?> clazzChild =arrays.get(i).getClass();
Class<?> clazz=clazzChild.getSuperclass();
for (int j = 0; j < fields.length; j++) {
Object value = null;
Field field = null;
try {
if(null!=clazz){
if(existsField(clazz,fields[j])){
field = clazz.getDeclaredField(fields[j]);
}else{
if(existsField(clazzChild,fields[j])){
field = clazzChild.getDeclaredField(fields[j]);
}
}
}else{
if(existsField(clazzChild,fields[j])){
field = clazzChild.getDeclaredField(fields[j]);
}
}
//field = arrays.get(i).getClass().getDeclaredField(fields[j]);
field.setAccessible(true);
value = field.get(arrays.get(i));
if (null != value && null != dicMap && 0 != dicMap.size()) { //将字典转换为实际值
if (null != dicMap.get(fields[j])) {
value = dicMap.get(fields[j]).get(value);
}
}
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
setCellValue(row, j, value);
}
}
}
}
private void setCellValue(HSSFRow row, int colIndex, Object value) {
HSSFCell hssfCell = row.createCell(colIndex);
hssfCell.setCellStyle(this.normalStyle);
if (null == value) {
hssfCell.setCellValue("");
} else if (value instanceof Integer) {
hssfCell.setCellValue((Integer) value);
} else if (value instanceof Short) {
hssfCell.setCellValue((Short) value);
} else if (value instanceof Double) {
hssfCell.setCellValue((Double) value);
hssfCell.setCellStyle(this.doubleCellStyle);
} else if (value instanceof Boolean) {
hssfCell.setCellValue((Boolean) value);
} else if (value instanceof Short) {
hssfCell.setCellValue((Short) value);
} else if (value instanceof Date) {
hssfCell.setCellValue((Date) value);
hssfCell.setCellStyle(this.dateCellStyle);
} else if (value instanceof Long) {
hssfCell.setCellValue((Long) value);
} else if (value instanceof BigDecimal) {
hssfCell.setCellValue(((BigDecimal) value).doubleValue());
hssfCell.setCellStyle(this.doubleCellStyle);
} else {
hssfCell.setCellValue((String) value);
}
}
/**
* 公共样式
*
* @param style
* @return
*/
private HSSFCellStyle setNormalStyle(HSSFCellStyle style) {
style.setAlignment(HSSFCellStyle.VERTICAL_CENTER);
style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
style.setBorderBottom(HSSFCellStyle.BORDER_THIN); // 下边框
style.setBorderLeft(HSSFCellStyle.BORDER_THIN);// 左边框
style.setBorderTop(HSSFCellStyle.BORDER_THIN);// 上边框
style.setBorderRight(HSSFCellStyle.BORDER_THIN);// 右边框
return style;
}
private HSSFCellStyle setFontStyle(HSSFCellStyle style) {
//设置字体
HSSFFont font = this.wb.createFont();
font.setFontHeightInPoints((short) 18);//.setFontHeight();
style.setFont(font);
style.setAlignment(HSSFCellStyle.VERTICAL_CENTER);
style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
return style;
}
/**
* 设置double类型格式数据
*
* @param style
* @return
*/
private HSSFCellStyle setDoubleStyle(HSSFCellStyle style) {
setNormalStyle(style);
style.setDataFormat(HSSFDataFormat.getBuiltinFormat("0.00"));
return style;
}
/**
* 设置日期类型格式数据
*
* @param style
* @return
*/
private HSSFCellStyle setDateStyle(HSSFCellStyle style) {
setNormalStyle(style);
HSSFDataFormat format = wb.createDataFormat();
style.setDataFormat(format.getFormat("yyyy年m月d日"));
return style;
}
private void setCellBorder(HSSFRow row) {
for (int i = 0; i < fields.length; i++) {
HSSFCell cell = row.createCell(i);
cell.setCellStyle(normalStyle);
}
}
public void setUnit(String unit) {
this.unit = unit;
}
}