package com.kidgrow.common.utils;
|
|
import cn.afterturn.easypoi.excel.ExcelExportUtil;
|
import cn.afterturn.easypoi.excel.ExcelImportUtil;
|
import cn.afterturn.easypoi.excel.entity.ExportParams;
|
import cn.afterturn.easypoi.excel.entity.ImportParams;
|
import cn.afterturn.easypoi.excel.entity.enmus.ExcelType;
|
import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity;
|
import com.google.common.collect.Lists;
|
import com.kidgrow.common.utils.excelModel.ExportField;
|
import lombok.extern.slf4j.Slf4j;
|
import org.apache.commons.lang3.StringUtils;
|
import org.apache.poi.ss.usermodel.Workbook;
|
import org.springframework.util.CollectionUtils;
|
import org.springframework.web.multipart.MultipartFile;
|
|
import javax.servlet.http.HttpServletResponse;
|
import java.io.File;
|
import java.io.IOException;
|
import java.io.InputStream;
|
import java.lang.reflect.Method;
|
import java.net.URLEncoder;
|
import java.util.*;
|
|
/**
|
* @author : heyanfeng
|
* create at: 2019-05-27 19:11
|
* @description: excel
|
*/
|
@Slf4j
|
public class ExcelUtils {
|
public static void exportExcel(List<?> list, String title, String sheetName, Class<?> pojoClass, String fileName, boolean isCreateHeader, HttpServletResponse response){
|
ExportParams exportParams = new ExportParams(title, sheetName);
|
exportParams.setCreateHeadRows(isCreateHeader);
|
defaultExport(list, pojoClass, fileName, response, exportParams);
|
|
}
|
public static void exportExcel(List<?> list, String title, String sheetName, Class<?> pojoClass,String fileName, HttpServletResponse response){
|
defaultExport(list, pojoClass, fileName, response, new ExportParams(title, sheetName));
|
}
|
public static void exportExcel(List<Map<String, Object>> list, String fileName, HttpServletResponse response){
|
defaultExport(list, fileName, response);
|
}
|
public static void exportExcel(String fileName,ExportParams exportParams, List<ExcelExportEntity> entities,List<Map<String, Object>> list,HttpServletResponse response){
|
defaultExport(fileName,exportParams,entities,list,response);
|
}
|
|
private static void defaultExport(String fileName,ExportParams exportParams, List<ExcelExportEntity> entities,List<Map<String, Object>> list,HttpServletResponse response ){
|
Workbook workbook = ExcelExportUtil.exportExcel(exportParams, entities, list);
|
if (workbook != null){
|
downLoadExcel(fileName, response, workbook);}
|
}
|
|
private static void defaultExport(List<?> list, Class<?> pojoClass, String fileName, HttpServletResponse response, ExportParams exportParams) {
|
Workbook workbook = ExcelExportUtil.exportExcel(exportParams,pojoClass,list);
|
if (workbook != null) {
|
downLoadExcel(fileName, response, workbook);
|
}
|
}
|
|
private static void downLoadExcel(String fileName, HttpServletResponse response, Workbook workbook) {
|
try {
|
response.setCharacterEncoding("UTF-8");
|
response.setHeader("content-Type", "application/vnd.ms-excel");
|
response.setHeader("Content-Disposition",
|
"attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
|
workbook.write(response.getOutputStream());
|
} catch (IOException e) {
|
log.error("excel异常:{}",e.getMessage());
|
}
|
}
|
private static void defaultExport(List<Map<String, Object>> list, String fileName, HttpServletResponse response) {
|
Workbook workbook = ExcelExportUtil.exportExcel(list, ExcelType.HSSF);
|
if (workbook != null){
|
downLoadExcel(fileName, response, workbook);}
|
}
|
public static <T> List<T> importExcel(String filePath, Integer titleRows, Integer headerRows, Class<T> pojoClass){
|
ImportParams params = new ImportParams();
|
params.setTitleRows(titleRows);
|
params.setHeadRows(headerRows);
|
List<T> list = null;
|
try {
|
File file = new File(filePath);
|
list = ExcelImportUtil.importExcel(file, pojoClass, params);
|
}catch (NoSuchElementException e){
|
throw new IllegalArgumentException("模板不能为空");
|
} catch (Exception e) {
|
log.error("excel异常:{}",e.getMessage());
|
}
|
return list;
|
}
|
|
public static <T> List<T> importExcel(InputStream inputStream, Integer titleRows, Integer headerRows, Class<T> pojoClass){
|
ImportParams params = new ImportParams();
|
params.setTitleRows(titleRows);
|
params.setHeadRows(headerRows);
|
List<T> list = null;
|
try {
|
list = ExcelImportUtil.importExcel(inputStream, pojoClass, params);
|
}catch (NoSuchElementException e){
|
throw new IllegalArgumentException("模板不能为空");
|
} catch (Exception e) {
|
log.error("excel异常:{}",e.getMessage());
|
}
|
return list;
|
}
|
public static <T> List<T> importExcel(MultipartFile file, Integer titleRows, Integer headerRows, Class<T> pojoClass){
|
if (file == null){
|
return null;
|
}
|
ImportParams params = new ImportParams();
|
params.setTitleRows(titleRows);
|
params.setHeadRows(headerRows);
|
List<T> list = null;
|
try {
|
list = ExcelImportUtil.importExcel(file.getInputStream(), pojoClass, params);
|
}catch (NoSuchElementException e){
|
throw new IllegalArgumentException("excel文件不能为空");
|
} catch (Exception e) {
|
log.error("excel异常:{}",e.getMessage());
|
}
|
return list;
|
}
|
|
|
/**
|
* description: 动态生成excel 列
|
* create by heyanfeng at 2019-05-29 18:02
|
* @param ef
|
* @param entities
|
*/
|
public static void dynamicNewAddExcel(List<ExportField> ef, List<ExcelExportEntity> entities) {
|
//单元格的excel 表头
|
ef.forEach(item -> {
|
//需要合并单元格的表头
|
List<ExportField> children = item.getChildren();
|
if(!CollectionUtils.isEmpty(children)){
|
ExcelExportEntity parent = new ExcelExportEntity(item.getFiledChineseName(), item.getEntityAttrName());
|
List<ExcelExportEntity> entitiesChildren = Lists.newArrayList();
|
children.forEach(e -> {
|
entitiesChildren.add(new ExcelExportEntity(e.getFiledChineseName(),e.getEntityAttrName(),30));
|
});
|
parent.setNeedMerge(true);
|
parent.setList(entitiesChildren);
|
entities.add(parent);
|
}else{
|
entities.add(new ExcelExportEntity(item.getFiledChineseName(),item.getEntityAttrName(),30));
|
}
|
});
|
}
|
|
|
/**
|
* description: 根据属性名称 获取属性的值
|
* create by heyanfeng at 2019-05-29 19:26
|
* @return Object
|
* @param fieldName
|
* @param o
|
*/
|
public static Object getFieldValueByName(String fieldName,Object o){
|
try{
|
String firstLetter = fieldName.substring(0, 1).toUpperCase();
|
String getter = "get" + firstLetter + fieldName.substring(1);
|
Method method = o.getClass().getMethod(getter, new Class[] {});
|
Object value = method.invoke(o, new Object[]{});
|
return value;
|
}catch (Exception e){
|
log.error(e.getMessage(),e);
|
return null;
|
}
|
}
|
|
/**
|
* description: 组装excel 数据
|
* create by heyanfeng at 2019-05-29 20:30
|
* @return List<Map<String, Object>>
|
* @param ef
|
* @param statisData
|
*/
|
public static List<Map<String, Object>> dynamicListDataByKey(List<ExportField> ef, List<?> statisData) {
|
//最终的数据
|
List<Map<String, Object>> datas = new ArrayList<>();
|
Map map;
|
for (Object t : statisData) {
|
map = new HashMap();
|
for (int j = 0; j < ef.size(); j++) {
|
List<ExportField> children = ef.get(j).getChildren();
|
if(!CollectionUtils.isEmpty(children)){
|
//遍历需要合并单元格的子列
|
traversechildren(map, t, children,ef.get(j).getEntityAttrName());
|
}else if(StringUtils.isNotBlank(ef.get(j).getEntityAttrName())){
|
map.put(ef.get(j).getEntityAttrName(),getFieldValueByName(ef.get(j).getEntityAttrName(),t));
|
}
|
}
|
datas.add(map);
|
}
|
return datas;
|
}
|
|
/**
|
* description: 遍历需要合并单元格的子列
|
* create by heyanfeng at 2019-05-31 14:19
|
*/
|
private static void traversechildren(Map map, Object t, List<ExportField> children,String entityAttrName) {
|
ArrayList<Map<String,Object>> childrenMaps = Lists.newArrayList();
|
Map<String,Object> childrenMap= new HashMap();
|
for (int k = 0; k < children.size(); k++) {
|
if(StringUtils.isNotBlank(children.get(k).getEntityAttrName())){
|
childrenMap.put(children.get(k).getEntityAttrName(),getFieldValueByName(children.get(k).getEntityAttrName(),t));
|
}
|
}
|
childrenMaps.add(childrenMap);
|
map.put(entityAttrName,childrenMaps);
|
}
|
|
|
/**
|
* description: 组装sql 查询条件
|
* create by heyanfeng at 2019-05-30 10:09
|
*/
|
// public static String getExcelSql(List<ExportField> exportField) {
|
// String fileds;
|
// StringBuilder stringBuilder = new StringBuilder();
|
// exportField.forEach(item -> {
|
// //如果存在需要合并表头的列 则遍历
|
// List<ExportField> children = item.getChildren();
|
// if(!CollectionUtils.isEmpty(children)){
|
// children.forEach(e -> {
|
// if(StringUtils.isNotBlank(e.getFiled())){
|
// stringBuilder.append(e.getFiled() + GlobalConstant.PIC_SPLIT);
|
// }
|
// });
|
// }else if(StringUtils.isNotBlank(item.getFiled())){
|
// stringBuilder.append(item.getFiled() + GlobalConstant.PIC_SPLIT);
|
// }
|
// });
|
// stringBuilder.deleteCharAt(stringBuilder.lastIndexOf(GlobalConstant.PIC_SPLIT));
|
// fileds = stringBuilder.toString();
|
// return fileds;
|
// }
|
|
/**
|
* description: 组装sql 查询条件
|
* create by heyanfeng at 2019-05-30 10:09
|
*/
|
// public static String getGroupBySql(List<ExportField> exportField) {
|
// String fileds;
|
// //是否加入 group by
|
// Boolean[] flag = {false};
|
// StringBuilder stringBuilder = new StringBuilder();
|
// exportField.forEach(item -> {
|
// if(item.getGroupBy() == null && StringUtils.isNotBlank(item.getFiled())){
|
// stringBuilder.append(item.getFiled() + GlobalConstant.PIC_SPLIT);
|
// }else if(item.getGroupBy() != null && item.getGroupBy() == YESNOEnum.YES.getValue()){
|
// flag[0] = true;
|
// }
|
// });
|
// stringBuilder.deleteCharAt(stringBuilder.lastIndexOf(GlobalConstant.PIC_SPLIT));
|
// fileds = stringBuilder.toString();
|
// if (flag[0]){
|
// fileds = " group by " + fileds;
|
// return fileds;
|
// }
|
// return "";
|
// }
|
|
|
/**
|
* description: 检查导出字段是否为空
|
* create by heyanfeng at 2019-05-30 10:10
|
*/
|
public static void checkExportField( List<ExportField> exportField) {
|
if(CollectionUtils.isEmpty(exportField)){
|
throw new IllegalArgumentException("导出的字段不能为空");
|
}
|
}
|
|
/**
|
* description: 动态导出生成excel
|
* create by heyanfeng at 2019-05-30 10:37
|
*/
|
public static void DynamicExcel(String fileName, String title,String sheet,List<ExportField> exportField, HttpServletResponse response, List<?> list) {
|
//生成动态列
|
List<ExcelExportEntity> entities = Lists.newArrayList();
|
ExcelUtils.dynamicNewAddExcel(exportField, entities);
|
//组装数据entities
|
List<Map<String, Object>> maps = ExcelUtils.dynamicListDataByKey(exportField, list);
|
ExcelUtils.exportExcel(fileName,new ExportParams(title, sheet),entities,maps,response);
|
}
|
}
|