|
|
@@ -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();
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|