package org.jeecgframework.core.util.excel;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.imageio.ImageIO;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFClientAnchor;
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.Drawing;
import org.apache.poi.ss.usermodel.Font;
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.util.CellRangeAddress;
import org.jeecgframework.core.annotation.excel.Excel;
import org.jeecgframework.core.annotation.excel.ExcelCollection;
import org.jeecgframework.core.annotation.excel.ExcelEntity;
import org.jeecgframework.core.annotation.excel.ExcelTarget;
import org.jeecgframework.core.util.excel.entity.ComparatorExcelField;
import org.jeecgframework.core.util.excel.entity.ExcelExportEntity;
import org.jeecgframework.core.util.excel.entity.ExcelTitle;
/**
* excel 导出工具类
*
* @author guanxf
* 解决问题:
* 1、导出Excel分sheet页的问题
* 2、绘制表格失败的问题
*/
public class ExcelExportUtil {
private static int SHEET_MAX_NUM=1000;
/**
* 一个excel 创建多个sheet
*
* @param list
* 多个Map key title 对应表格Title key entity 对应表格对应实体 key data
* Collection 数据
* @return
*/
public static HSSFWorkbook exportExcel(List> list) {
HSSFWorkbook workbook = new HSSFWorkbook();
for (Map map : list) {
createSheetInUserModel2File(workbook,
(ExcelTitle) map.get("title"),
(Class>) map.get("entity"),
(Collection>) map.get("data"));
}
return workbook;
}
/**
*
* @param entity
* 表格标题属性
* @param pojoClass
* Excel对象Class
* @param dataSet
* Excel对象数据List
* @param out
* 输出流
*/
public static HSSFWorkbook exportExcel(ExcelTitle entity,
Class> pojoClass, Collection> dataSet) {
HSSFWorkbook workbook = new HSSFWorkbook();
//createSheetInUserModel2File(workbook, entity, pojoClass, dataSet);
//创建Sheet
createSheetInExcel(workbook, entity, pojoClass, dataSet);
return workbook;
}
/**
* 创建sheet页
* @param workbook
* @param entity
* @param pojoClass
* @param dataSet
*/
private static void createSheetInExcel(HSSFWorkbook workbook,
ExcelTitle entity, Class> pojoClass, Collection> dataSet) {
Sheet sheet =null;
List dataSetDataBySheet=new ArrayList();
HSSFCellStyle style = workbook.createCellStyle();
HSSFCellStyle titleStyle = workbook.createCellStyle();
int index=0;
int sheetNo=0;//sheet页的编号
Iterator> its = dataSet.iterator();
while (its.hasNext()) {
Object t = its.next();
dataSetDataBySheet.add(t);
if(index%SHEET_MAX_NUM==0 && index>0){
++sheetNo;
sheet= workbook.createSheet(entity.getSheetName()+"_"+sheetNo);
createUserModel2File(workbook, sheet,style, titleStyle, entity, pojoClass, dataSetDataBySheet);
dataSetDataBySheet=new ArrayList();
}
index++;
}
//创建最后一页的数据
sheet= workbook.createSheet(entity.getSheetName()+"_"+(sheetNo+1));
createUserModel2File(workbook, sheet,style, titleStyle, entity, pojoClass, dataSetDataBySheet);
}
/***
* 根据sheet页生成数据
* @param sheet
* @param entity
* @param pojoClass
* @param dataSet
*/
private static void createUserModel2File(HSSFWorkbook workbook,Sheet sheet,HSSFCellStyle style,HSSFCellStyle titleStyleSet,
ExcelTitle entity, Class> pojoClass, Collection> dataSet) {
try {
Drawing patriarch = sheet.createDrawingPatriarch();
List excelParams = new ArrayList();
// 得到所有字段
Field fileds[] = getClassFields(pojoClass);
ExcelTarget etarget = pojoClass.getAnnotation(ExcelTarget.class);
String targetId = null;
if (etarget != null) {
targetId = etarget.id();
}
getAllExcelField(targetId, fileds, excelParams, pojoClass, null);
sortAllParams(excelParams);
int index = 0;
int feildWidth = getFieldWidth(excelParams);
if (entity.getTitle() != null) {
int i = createHeaderRow(entity, sheet, workbook, feildWidth);
sheet.createFreezePane(0, 2+i, 0, 2+i);
index += i;
} else {
sheet.createFreezePane(0, 2, 0, 2);
}
createTitleRow(entity,sheet, workbook,titleStyleSet, index, excelParams);
index += 2;
setCellWith(excelParams, sheet);
Iterator> its = dataSet.iterator();
while (its.hasNext()) {