diff --git a/easypoi-base/src/main/java/cn/afterturn/easypoi/excel/export/ExcelBatchExportService.java b/easypoi-base/src/main/java/cn/afterturn/easypoi/excel/export/ExcelBatchExportService.java index 9f0d8ee..9f9d784 100644 --- a/easypoi-base/src/main/java/cn/afterturn/easypoi/excel/export/ExcelBatchExportService.java +++ b/easypoi-base/src/main/java/cn/afterturn/easypoi/excel/export/ExcelBatchExportService.java @@ -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 THREAD_LOCAL = new ThreadLocal(); - - private Workbook workbook; - private Sheet sheet; - private List 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(); - 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 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 excelParams = new ArrayList(); - 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 THREAD_LOCAL = new ThreadLocal(); + + private Workbook workbook; + private Sheet sheet; + private List excelParams; + private ExportParams entity; + private int titleHeight; + private Drawing patriarch; + private short rowHeight; + private int index; + + public void init(ExportParams entity, Class pojoClass) { + List excelParams = createExcelExportEntityList(entity, pojoClass); + init(entity, excelParams); + } + + public void init(ExportParams entity, List 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 createExcelExportEntityList(ExportParams entity, Class pojoClass) { + try { + List excelParams = new ArrayList(); + 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 excelParams) { + if (LOGGER.isDebugEnabled()) { + LOGGER.debug("Excel export start ,List 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 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 excelParams = new ArrayList(); + 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 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(); + + } + +}