Переглянути джерело

提供大量导出功能,分批插入数据

4.1.3.A
jueyue 8 роки тому
джерело
коміт
dd6d03bc80
5 змінених файлів з 182 додано та 11 видалено
  1. +22
    -0
      easypoi-base/src/main/java/org/jeecgframework/poi/excel/ExcelExportUtil.java
  2. +153
    -0
      easypoi-base/src/main/java/org/jeecgframework/poi/excel/export/ExcelBatchExportServer.java
  3. +2
    -6
      easypoi-base/src/main/java/org/jeecgframework/poi/excel/export/ExcelExportServer.java
  4. +0
    -5
      easypoi-base/src/main/java/org/jeecgframework/poi/excel/export/base/ExcelExportBase.java
  5. +5
    -0
      easypoi-base/src/main/java/org/jeecgframework/poi/excel/export/base/ExportBase.java

+ 22
- 0
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
* 表格标题属性


+ 153
- 0
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<ExcelBatchExportServer> THREAD_LOCAL = new ThreadLocal<ExcelBatchExportServer>();
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;
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);
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<ExcelExportEntity> 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<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 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);
}
}

+ 2
- 6
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<ExcelExportEntity> 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<ExcelExportEntity> entityList, Collection<?> dataSet,
Sheet sheet) {
try {


+ 0
- 5
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;


+ 5
- 0
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;


Завантаження…
Відмінити
Зберегти