package com.ssi.utils;
import cn.afterturn.easypoi.excel.entity.ExportParams;
import cn.afterturn.easypoi.excel.entity.enmus.ExcelType;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.util.Collection;
import java.util.List;
import java.util.Map;
public class ExcelExportUtilAuto {
public static int USE_SXSSF_LIMIT = 100000;
private ExcelExportUtilAuto() {
}
public static Workbook exportExcel(ExportParams entity, Class<?> pojoClass,
Collection<?> dataSet) {
Workbook workbook = getWorkbook(entity.getType(), dataSet.size());
new ExcelExportServiceAuto().createSheet(workbook, entity, pojoClass, dataSet);
return workbook;
}
private static Workbook getWorkbook(ExcelType type, int size) {
if (ExcelType.HSSF.equals(type)) {
return new HSSFWorkbook();
} else if (size < USE_SXSSF_LIMIT) {
return new XSSFWorkbook();
} else {
return new SXSSFWorkbook();
}
}
public static Workbook exportExcel(List<Map<String, Object>> list, ExcelType type) {
Workbook workbook = getWorkbook(type, 0);
for (Map<String, Object> map : list) {
ExcelExportServiceAuto service = new ExcelExportServiceAuto();
service.createSheet(workbook, (ExportParams) map.get("title"),
(Class<?>) map.get("entity"), (Collection<?>) map.get("data"));
}
return workbook;
}
}
package com.ssi.utils;
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.ExcelExportService;
import cn.afterturn.easypoi.exception.excel.ExcelExportException;
import cn.afterturn.easypoi.exception.excel.enums.ExcelExportEnum;
import cn.afterturn.easypoi.util.PoiPublicUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.Workbook;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.util.*;
@Slf4j
public class ExcelExportServiceAuto extends ExcelExportService {
@Override
public void createSheet(Workbook workbook, ExportParams entity, Class<?> pojoClass, Collection<?> dataSet) {
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 || dataSet == null) {
throw new ExcelExportException(ExcelExportEnum.PARAMETER_ERROR);
}
try {
List<ExcelExportEntity> excelParams = new ArrayList<ExcelExportEntity>();
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, dataSet);
createSheetForMap(workbook, entity, excelParams, dataSet);
} catch (Exception e) {
LOGGER.error(e.getMessage(), e);
throw new ExcelExportException(ExcelExportEnum.EXPORT_ERROR, e.getCause());
}
}
private void getAllExcelField(String[] exclusions, String targetId, Field[] fields,
List<ExcelExportEntity> excelParams, Class<?> pojoClass,
Collection<?> data) throws Exception {
super.getAllExcelField(exclusions, targetId, fields, excelParams, pojoClass, null, null);
long start=System.currentTimeMillis();
excelParams.forEach(e -> {
if(e.getWidth()==10){
if (e.getList() == null) {
setWidth(data, e);
}else {
e.getList().forEach(child->{
try {
Object invoke = e.getMethod().invoke(data.iterator().next());
if(invoke!=null){
setWidth((Collection<?>) invoke,child);
}
} catch (IllegalAccessException | InvocationTargetException illegalAccessException) {
illegalAccessException.printStackTrace();
}
});
}
}
});
log.info("excel自适应耗时"+(System.currentTimeMillis()-start)+"ms");
}
private void setWidth(Collection<?> data, ExcelExportEntity e) {
data.stream().limit(10).max(Comparator.comparingDouble(r ->
{
try {
Object invoke = e.getMethod().invoke(r);
if(invoke==null){
return -1;
}
return MatrixToImageWriter.getLength(invoke.toString());
} catch (IllegalAccessException | InvocationTargetException illegalAccessException) {
illegalAccessException.printStackTrace();
}
return 0;
})).map(r -> {
try {
Object invoke = e.getMethod().invoke(r);
if(invoke==null){
return 0;
}
int i = MatrixToImageWriter.getLength(invoke.toString())/6;
if (i > e.getWidth()) {
log.info("自适应excel宽度");
e.setWidth(i);
}
} catch (IllegalAccessException | InvocationTargetException illegalAccessException) {
illegalAccessException.printStackTrace();
}
return 0;
});
}
}