| @@ -1,159 +1,183 @@ | |||||
| package cn.afterturn.easypoi.excel.export; | |||||
| import java.lang.reflect.Field; | |||||
| import java.util.ArrayList; | |||||
| import java.util.Arrays; | |||||
| import java.util.Collection; | |||||
| import java.util.Iterator; | |||||
| import java.util.List; | |||||
| import org.apache.poi.ss.usermodel.Drawing; | |||||
| import org.apache.poi.ss.usermodel.Sheet; | |||||
| import org.apache.poi.ss.usermodel.Workbook; | |||||
| import org.apache.poi.xssf.streaming.SXSSFWorkbook; | |||||
| import cn.afterturn.easypoi.excel.annotation.ExcelTarget; | |||||
| import cn.afterturn.easypoi.excel.entity.ExportParams; | |||||
| import cn.afterturn.easypoi.excel.entity.enmus.ExcelType; | |||||
| import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity; | |||||
| import cn.afterturn.easypoi.excel.export.styler.IExcelExportStyler; | |||||
| import cn.afterturn.easypoi.exception.excel.ExcelExportException; | |||||
| import cn.afterturn.easypoi.exception.excel.enums.ExcelExportEnum; | |||||
| import cn.afterturn.easypoi.util.PoiExcelGraphDataUtil; | |||||
| import cn.afterturn.easypoi.util.PoiPublicUtil; | |||||
| /** | |||||
| * 提供批次插入服务 | |||||
| * @author JueYue | |||||
| * 2016年8月29日 | |||||
| */ | |||||
| public class ExcelBatchExportService extends ExcelExportService { | |||||
| private static ThreadLocal<ExcelBatchExportService> THREAD_LOCAL = new ThreadLocal<ExcelBatchExportService>(); | |||||
| private Workbook workbook; | |||||
| private Sheet sheet; | |||||
| private List<ExcelExportEntity> excelParams; | |||||
| private ExportParams entity; | |||||
| private int titleHeight; | |||||
| private Drawing patriarch; | |||||
| private short rowHeight; | |||||
| private int index; | |||||
| public void init(ExportParams entity, Class<?> pojoClass) { | |||||
| LOGGER.debug("ExcelBatchExportServer only support SXSSFWorkbook"); | |||||
| entity.setType(ExcelType.XSSF); | |||||
| workbook = new SXSSFWorkbook(); | |||||
| this.entity = entity; | |||||
| super.type = entity.getType(); | |||||
| createSheet(workbook, entity, pojoClass); | |||||
| if (entity.getMaxNum() == 0) { | |||||
| entity.setMaxNum(1000000); | |||||
| } | |||||
| insertDataToSheet(workbook, entity, excelParams, null, sheet); | |||||
| } | |||||
| public void createSheet(Workbook workbook, ExportParams entity, Class<?> pojoClass) { | |||||
| if (LOGGER.isDebugEnabled()) { | |||||
| LOGGER.debug("Excel export start ,class is {}", pojoClass); | |||||
| LOGGER.debug("Excel version is {}", | |||||
| entity.getType().equals(ExcelType.HSSF) ? "03" : "07"); | |||||
| } | |||||
| if (workbook == null || entity == null || pojoClass == null) { | |||||
| throw new ExcelExportException(ExcelExportEnum.PARAMETER_ERROR); | |||||
| } | |||||
| try { | |||||
| excelParams = new ArrayList<ExcelExportEntity>(); | |||||
| if (entity.isAddIndex()) { | |||||
| excelParams.add(indexExcelEntity(entity)); | |||||
| } | |||||
| // 得到所有字段 | |||||
| Field[] fileds = PoiPublicUtil.getClassFields(pojoClass); | |||||
| ExcelTarget etarget = pojoClass.getAnnotation(ExcelTarget.class); | |||||
| String targetId = etarget == null ? null : etarget.value(); | |||||
| getAllExcelField(entity.getExclusions(), targetId, fileds, excelParams, pojoClass, | |||||
| null, null); | |||||
| sortAllParams(excelParams); | |||||
| try { | |||||
| sheet = workbook.createSheet(entity.getSheetName()); | |||||
| } catch (Exception e) { | |||||
| // 重复遍历,出现了重名现象,创建非指定的名称Sheet | |||||
| sheet = workbook.createSheet(); | |||||
| } | |||||
| } catch (Exception e) { | |||||
| throw new ExcelExportException(ExcelExportEnum.EXPORT_ERROR, e); | |||||
| } | |||||
| } | |||||
| public Workbook appendData(Collection<?> dataSet) { | |||||
| if (sheet.getLastRowNum() + dataSet.size() > entity.getMaxNum()) { | |||||
| sheet = workbook.createSheet(); | |||||
| index = 0; | |||||
| } | |||||
| Iterator<?> its = dataSet.iterator(); | |||||
| while (its.hasNext()) { | |||||
| Object t = its.next(); | |||||
| try { | |||||
| index += createCells(patriarch, index, t, excelParams, sheet, workbook, rowHeight); | |||||
| } catch (Exception e) { | |||||
| LOGGER.error(e.getMessage(), e); | |||||
| throw new ExcelExportException(ExcelExportEnum.EXPORT_ERROR, e); | |||||
| } | |||||
| } | |||||
| return workbook; | |||||
| } | |||||
| @Override | |||||
| protected void insertDataToSheet(Workbook workbook, ExportParams entity, | |||||
| List<ExcelExportEntity> entityList, Collection<?> dataSet, | |||||
| Sheet sheet) { | |||||
| try { | |||||
| dataHandler = entity.getDataHandler(); | |||||
| if (dataHandler != null && dataHandler.getNeedHandlerFields() != null) { | |||||
| needHandlerList = Arrays.asList(dataHandler.getNeedHandlerFields()); | |||||
| } | |||||
| // 创建表格样式 | |||||
| setExcelExportStyler((IExcelExportStyler) entity.getStyle() | |||||
| .getConstructor(Workbook.class).newInstance(workbook)); | |||||
| patriarch = PoiExcelGraphDataUtil.getDrawingPatriarch(sheet); | |||||
| List<ExcelExportEntity> excelParams = new ArrayList<ExcelExportEntity>(); | |||||
| if (entity.isAddIndex()) { | |||||
| excelParams.add(indexExcelEntity(entity)); | |||||
| } | |||||
| excelParams.addAll(entityList); | |||||
| sortAllParams(excelParams); | |||||
| this.index = entity.isCreateHeadRows() | |||||
| ? createHeaderAndTitle(entity, sheet, workbook, excelParams) : 0; | |||||
| titleHeight = index; | |||||
| setCellWith(excelParams, sheet); | |||||
| rowHeight = getRowHeight(excelParams); | |||||
| setCurrentIndex(1); | |||||
| } catch (Exception e) { | |||||
| LOGGER.error(e.getMessage(), e); | |||||
| throw new ExcelExportException(ExcelExportEnum.EXPORT_ERROR, e.getCause()); | |||||
| } | |||||
| } | |||||
| public static ExcelBatchExportService getExcelBatchExportService(ExportParams entity, | |||||
| Class<?> pojoClass) { | |||||
| if (THREAD_LOCAL.get() == null) { | |||||
| ExcelBatchExportService batchServer = new ExcelBatchExportService(); | |||||
| batchServer.init(entity, pojoClass); | |||||
| THREAD_LOCAL.set(batchServer); | |||||
| } | |||||
| return THREAD_LOCAL.get(); | |||||
| } | |||||
| public void closeExportBigExcel() { | |||||
| if (entity.getFreezeCol() != 0) { | |||||
| sheet.createFreezePane(entity.getFreezeCol(), 0, entity.getFreezeCol(), 0); | |||||
| } | |||||
| mergeCells(sheet, excelParams, titleHeight); | |||||
| // 创建合计信息 | |||||
| addStatisticsRow(getExcelExportStyler().getStyles(true, null), sheet); | |||||
| THREAD_LOCAL.remove(); | |||||
| } | |||||
| } | |||||
| package cn.afterturn.easypoi.excel.export; | |||||
| import cn.afterturn.easypoi.excel.annotation.ExcelTarget; | |||||
| import cn.afterturn.easypoi.excel.entity.ExportParams; | |||||
| import cn.afterturn.easypoi.excel.entity.enmus.ExcelType; | |||||
| import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity; | |||||
| import cn.afterturn.easypoi.excel.export.styler.IExcelExportStyler; | |||||
| import cn.afterturn.easypoi.exception.excel.ExcelExportException; | |||||
| import cn.afterturn.easypoi.exception.excel.enums.ExcelExportEnum; | |||||
| import cn.afterturn.easypoi.util.PoiExcelGraphDataUtil; | |||||
| import cn.afterturn.easypoi.util.PoiPublicUtil; | |||||
| import org.apache.poi.ss.usermodel.Drawing; | |||||
| import org.apache.poi.ss.usermodel.Sheet; | |||||
| import org.apache.poi.ss.usermodel.Workbook; | |||||
| import org.apache.poi.xssf.streaming.SXSSFWorkbook; | |||||
| import java.lang.reflect.Field; | |||||
| import java.util.*; | |||||
| /** | |||||
| * 提供批次插入服务 | |||||
| * @author JueYue | |||||
| * 2016年8月29日 | |||||
| */ | |||||
| public class ExcelBatchExportService extends ExcelExportService { | |||||
| private static ThreadLocal<ExcelBatchExportService> THREAD_LOCAL = new ThreadLocal<ExcelBatchExportService>(); | |||||
| private Workbook workbook; | |||||
| private Sheet sheet; | |||||
| private List<ExcelExportEntity> excelParams; | |||||
| private ExportParams entity; | |||||
| private int titleHeight; | |||||
| private Drawing patriarch; | |||||
| private short rowHeight; | |||||
| private int index; | |||||
| public void init(ExportParams entity, Class<?> pojoClass) { | |||||
| List<ExcelExportEntity> excelParams = createExcelExportEntityList(entity, pojoClass); | |||||
| init(entity, excelParams); | |||||
| } | |||||
| public void init(ExportParams entity, List<ExcelExportEntity> excelParams) { | |||||
| LOGGER.debug("ExcelBatchExportServer only support SXSSFWorkbook"); | |||||
| entity.setType(ExcelType.XSSF); | |||||
| workbook = new SXSSFWorkbook(); | |||||
| this.entity = entity; | |||||
| this.excelParams = excelParams; | |||||
| super.type = entity.getType(); | |||||
| createSheet(workbook, entity, excelParams); | |||||
| if (entity.getMaxNum() == 0) { | |||||
| entity.setMaxNum(1000000); | |||||
| } | |||||
| insertDataToSheet(workbook, entity, excelParams, null, sheet); | |||||
| } | |||||
| public List<ExcelExportEntity> createExcelExportEntityList(ExportParams entity, Class<?> pojoClass) { | |||||
| try { | |||||
| List<ExcelExportEntity> excelParams = new ArrayList<ExcelExportEntity>(); | |||||
| if (entity.isAddIndex()) { | |||||
| excelParams.add(indexExcelEntity(entity)); | |||||
| } | |||||
| // 得到所有字段 | |||||
| Field[] fileds = PoiPublicUtil.getClassFields(pojoClass); | |||||
| ExcelTarget etarget = pojoClass.getAnnotation(ExcelTarget.class); | |||||
| String targetId = etarget == null ? null : etarget.value(); | |||||
| getAllExcelField(entity.getExclusions(), targetId, fileds, excelParams, pojoClass, | |||||
| null, null); | |||||
| sortAllParams(excelParams); | |||||
| return excelParams; | |||||
| } catch (Exception e) { | |||||
| throw new ExcelExportException(ExcelExportEnum.EXPORT_ERROR, e); | |||||
| } | |||||
| } | |||||
| public void createSheet(Workbook workbook, ExportParams entity, List<ExcelExportEntity> excelParams) { | |||||
| if (LOGGER.isDebugEnabled()) { | |||||
| LOGGER.debug("Excel export start ,List<ExcelExportEntity> is {}", excelParams); | |||||
| LOGGER.debug("Excel version is {}", | |||||
| entity.getType().equals(ExcelType.HSSF) ? "03" : "07"); | |||||
| } | |||||
| if (workbook == null || entity == null || excelParams == null) { | |||||
| throw new ExcelExportException(ExcelExportEnum.PARAMETER_ERROR); | |||||
| } | |||||
| try { | |||||
| try { | |||||
| sheet = workbook.createSheet(entity.getSheetName()); | |||||
| } catch (Exception e) { | |||||
| // 重复遍历,出现了重名现象,创建非指定的名称Sheet | |||||
| sheet = workbook.createSheet(); | |||||
| } | |||||
| } catch (Exception e) { | |||||
| throw new ExcelExportException(ExcelExportEnum.EXPORT_ERROR, e); | |||||
| } | |||||
| } | |||||
| public Workbook appendData(Collection<?> dataSet) { | |||||
| if (sheet.getLastRowNum() + dataSet.size() > entity.getMaxNum()) { | |||||
| sheet = workbook.createSheet(); | |||||
| index = 0; | |||||
| } | |||||
| Iterator<?> its = dataSet.iterator(); | |||||
| while (its.hasNext()) { | |||||
| Object t = its.next(); | |||||
| try { | |||||
| index += createCells(patriarch, index, t, excelParams, sheet, workbook, rowHeight); | |||||
| } catch (Exception e) { | |||||
| LOGGER.error(e.getMessage(), e); | |||||
| throw new ExcelExportException(ExcelExportEnum.EXPORT_ERROR, e); | |||||
| } | |||||
| } | |||||
| return workbook; | |||||
| } | |||||
| @Override | |||||
| protected void insertDataToSheet(Workbook workbook, ExportParams entity, | |||||
| List<ExcelExportEntity> entityList, Collection<?> dataSet, | |||||
| Sheet sheet) { | |||||
| try { | |||||
| dataHandler = entity.getDataHandler(); | |||||
| if (dataHandler != null && dataHandler.getNeedHandlerFields() != null) { | |||||
| needHandlerList = Arrays.asList(dataHandler.getNeedHandlerFields()); | |||||
| } | |||||
| // 创建表格样式 | |||||
| setExcelExportStyler((IExcelExportStyler) entity.getStyle() | |||||
| .getConstructor(Workbook.class).newInstance(workbook)); | |||||
| patriarch = PoiExcelGraphDataUtil.getDrawingPatriarch(sheet); | |||||
| List<ExcelExportEntity> excelParams = new ArrayList<ExcelExportEntity>(); | |||||
| if (entity.isAddIndex()) { | |||||
| excelParams.add(indexExcelEntity(entity)); | |||||
| } | |||||
| excelParams.addAll(entityList); | |||||
| sortAllParams(excelParams); | |||||
| this.index = entity.isCreateHeadRows() | |||||
| ? createHeaderAndTitle(entity, sheet, workbook, excelParams) : 0; | |||||
| titleHeight = index; | |||||
| setCellWith(excelParams, sheet); | |||||
| rowHeight = getRowHeight(excelParams); | |||||
| setCurrentIndex(1); | |||||
| } catch (Exception e) { | |||||
| LOGGER.error(e.getMessage(), e); | |||||
| throw new ExcelExportException(ExcelExportEnum.EXPORT_ERROR, e.getCause()); | |||||
| } | |||||
| } | |||||
| public static ExcelBatchExportService getExcelBatchExportService(ExportParams entity, | |||||
| Class<?> pojoClass) { | |||||
| if (THREAD_LOCAL.get() == null) { | |||||
| ExcelBatchExportService batchServer = new ExcelBatchExportService(); | |||||
| batchServer.init(entity, pojoClass); | |||||
| THREAD_LOCAL.set(batchServer); | |||||
| } | |||||
| return THREAD_LOCAL.get(); | |||||
| } | |||||
| public static ExcelBatchExportService getExcelBatchExportService(ExportParams entity, | |||||
| List<ExcelExportEntity> excelParams) { | |||||
| if (THREAD_LOCAL.get() == null) { | |||||
| ExcelBatchExportService batchServer = new ExcelBatchExportService(); | |||||
| batchServer.init(entity, excelParams); | |||||
| THREAD_LOCAL.set(batchServer); | |||||
| } | |||||
| return THREAD_LOCAL.get(); | |||||
| } | |||||
| public static ExcelBatchExportService getCurrentExcelBatchExportService() { | |||||
| return THREAD_LOCAL.get(); | |||||
| } | |||||
| public void closeExportBigExcel() { | |||||
| if (entity.getFreezeCol() != 0) { | |||||
| sheet.createFreezePane(entity.getFreezeCol(), 0, entity.getFreezeCol(), 0); | |||||
| } | |||||
| mergeCells(sheet, excelParams, titleHeight); | |||||
| // 创建合计信息 | |||||
| addStatisticsRow(getExcelExportStyler().getStyles(true, null), sheet); | |||||
| THREAD_LOCAL.remove(); | |||||
| } | |||||
| } | |||||