diff --git a/easypoi-base/src/main/java/org/jeecgframework/poi/excel/ExcelExportUtil.java b/easypoi-base/src/main/java/org/jeecgframework/poi/excel/ExcelExportUtil.java index d21038c..e4345f8 100644 --- a/easypoi-base/src/main/java/org/jeecgframework/poi/excel/ExcelExportUtil.java +++ b/easypoi-base/src/main/java/org/jeecgframework/poi/excel/ExcelExportUtil.java @@ -27,6 +27,7 @@ import org.jeecgframework.poi.excel.entity.ExportParams; import org.jeecgframework.poi.excel.entity.TemplateExportParams; import org.jeecgframework.poi.excel.entity.enmus.ExcelType; import org.jeecgframework.poi.excel.entity.params.ExcelExportEntity; +import org.jeecgframework.poi.excel.export.ExcelBatchExportServer; import org.jeecgframework.poi.excel.export.ExcelExportServer; import org.jeecgframework.poi.excel.export.template.ExcelExportOfTemplateUtil; @@ -42,6 +43,27 @@ public class ExcelExportUtil { private ExcelExportUtil() { } + /** + * @param entity + * 表格标题属性 + * @param pojoClass + * Excel对象Class + * @param dataSet + * Excel对象数据List + */ + public static Workbook exportBigExcel(ExportParams entity, Class pojoClass, + Collection dataSet) { + ExcelBatchExportServer batachServer = ExcelBatchExportServer + .getExcelBatchExportServer(entity, pojoClass); + return batachServer.appendData(dataSet); + } + + public static void closeExportBigExcel() { + ExcelBatchExportServer batachServer = ExcelBatchExportServer.getExcelBatchExportServer(null, + null); + batachServer.closeExportBigExcel(); + } + /** * @param entity * 表格标题属性 diff --git a/easypoi-base/src/main/java/org/jeecgframework/poi/excel/export/ExcelBatchExportServer.java b/easypoi-base/src/main/java/org/jeecgframework/poi/excel/export/ExcelBatchExportServer.java new file mode 100644 index 0000000..0a4f24b --- /dev/null +++ b/easypoi-base/src/main/java/org/jeecgframework/poi/excel/export/ExcelBatchExportServer.java @@ -0,0 +1,153 @@ +package org.jeecgframework.poi.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 org.jeecgframework.poi.excel.annotation.ExcelTarget; +import org.jeecgframework.poi.excel.entity.ExportParams; +import org.jeecgframework.poi.excel.entity.enmus.ExcelType; +import org.jeecgframework.poi.excel.entity.params.ExcelExportEntity; +import org.jeecgframework.poi.excel.export.styler.IExcelExportStyler; +import org.jeecgframework.poi.exception.excel.ExcelExportException; +import org.jeecgframework.poi.exception.excel.enums.ExcelExportEnum; +import org.jeecgframework.poi.util.PoiPublicUtil; + +/** + * 提供批次插入服务 + * @author JueYue + * @date 2016年8月29日 + */ +public class ExcelBatchExportServer extends ExcelExportServer { + + 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; + 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); + try { + sheet = workbook.createSheet(entity.getSheetName()); + } catch (Exception e) { + // 重复遍历,出现了重名现象,创建非指定的名称Sheet + sheet = workbook.createSheet(); + } + } catch (Exception e) { + LOGGER.error(e.getMessage(), e); + throw new ExcelExportException(ExcelExportEnum.EXPORT_ERROR, e.getCause()); + } + } + + 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; + } + + protected void insertDataToSheet(Workbook workbook, ExportParams entity, + List entityList, Collection dataSet, + Sheet sheet) { + try { + dataHanlder = entity.getDataHanlder(); + if (dataHanlder != null && dataHanlder.getNeedHandlerFields() != null) { + needHanlderList = Arrays.asList(dataHanlder.getNeedHandlerFields()); + } + // 创建表格样式 + setExcelExportStyler((IExcelExportStyler) entity.getStyle() + .getConstructor(Workbook.class).newInstance(workbook)); + patriarch = sheet.createDrawingPatriarch(); + 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 ExcelBatchExportServer getExcelBatchExportServer(ExportParams entity, + Class pojoClass) { + if (THREAD_LOCAL.get() == null) { + ExcelBatchExportServer batchServer = new ExcelBatchExportServer(); + 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); + + } + +} diff --git a/easypoi-base/src/main/java/org/jeecgframework/poi/excel/export/ExcelExportServer.java b/easypoi-base/src/main/java/org/jeecgframework/poi/excel/export/ExcelExportServer.java index eda8460..2d17046 100644 --- a/easypoi-base/src/main/java/org/jeecgframework/poi/excel/export/ExcelExportServer.java +++ b/easypoi-base/src/main/java/org/jeecgframework/poi/excel/export/ExcelExportServer.java @@ -38,8 +38,6 @@ import org.jeecgframework.poi.excel.export.styler.IExcelExportStyler; import org.jeecgframework.poi.exception.excel.ExcelExportException; import org.jeecgframework.poi.exception.excel.enums.ExcelExportEnum; import org.jeecgframework.poi.util.PoiPublicUtil; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * Excel导出服务 @@ -49,12 +47,10 @@ import org.slf4j.LoggerFactory; */ public class ExcelExportServer extends ExcelExportBase { - private final static Logger LOGGER = LoggerFactory.getLogger(ExcelExportServer.class); - // 最大行数,超过自动多Sheet private int MAX_NUM = 60000; - private int createHeaderAndTitle(ExportParams entity, Sheet sheet, Workbook workbook, + protected int createHeaderAndTitle(ExportParams entity, Sheet sheet, Workbook workbook, List excelParams) { int rows = 0, feildWidth = getFieldLength(excelParams); if (entity.getTitle() != null) { @@ -156,7 +152,7 @@ public class ExcelExportServer extends ExcelExportBase { insertDataToSheet(workbook, entity, entityList, dataSet,sheet); } - private void insertDataToSheet(Workbook workbook, ExportParams entity, + protected void insertDataToSheet(Workbook workbook, ExportParams entity, List entityList, Collection dataSet, Sheet sheet) { try { diff --git a/easypoi-base/src/main/java/org/jeecgframework/poi/excel/export/base/ExcelExportBase.java b/easypoi-base/src/main/java/org/jeecgframework/poi/excel/export/base/ExcelExportBase.java index 01c567b..061a6a4 100644 --- a/easypoi-base/src/main/java/org/jeecgframework/poi/excel/export/base/ExcelExportBase.java +++ b/easypoi-base/src/main/java/org/jeecgframework/poi/excel/export/base/ExcelExportBase.java @@ -44,8 +44,6 @@ import org.jeecgframework.poi.excel.entity.vo.PoiBaseConstants; import org.jeecgframework.poi.excel.export.styler.IExcelExportStyler; import org.jeecgframework.poi.util.PoiMergeCellUtil; import org.jeecgframework.poi.util.PoiPublicUtil; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * 提供POI基础操作服务 @@ -56,9 +54,6 @@ import org.slf4j.LoggerFactory; @SuppressWarnings("unchecked") public abstract class ExcelExportBase extends ExportBase { - private static final Logger LOGGER = LoggerFactory - .getLogger(ExcelExportBase.class); - private int currentIndex = 0; protected ExcelType type = ExcelType.HSSF; diff --git a/easypoi-base/src/main/java/org/jeecgframework/poi/excel/export/base/ExportBase.java b/easypoi-base/src/main/java/org/jeecgframework/poi/excel/export/base/ExportBase.java index 10a420b..518a207 100644 --- a/easypoi-base/src/main/java/org/jeecgframework/poi/excel/export/base/ExportBase.java +++ b/easypoi-base/src/main/java/org/jeecgframework/poi/excel/export/base/ExportBase.java @@ -37,6 +37,8 @@ import org.jeecgframework.poi.excel.entity.vo.PoiBaseConstants; import org.jeecgframework.poi.handler.inter.IExcelDataHandler; import org.jeecgframework.poi.util.PoiPublicUtil; import org.jeecgframework.poi.util.PoiReflectorUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * 导出基础处理,不设计POI,只设计对象,保证复用性 @@ -46,6 +48,9 @@ import org.jeecgframework.poi.util.PoiReflectorUtil; */ @SuppressWarnings("rawtypes") public class ExportBase { + + protected static final Logger LOGGER = LoggerFactory + .getLogger(ExportBase.class); protected IExcelDataHandler dataHanlder;