From 861200b968f21a748aa322635f55e48e79dafb1e Mon Sep 17 00:00:00 2001 From: zhaoxiaohao <279049017@qq.com> Date: Mon, 28 Dec 2020 14:10:46 +0800 Subject: [PATCH] 添加excel导出的功能 --- kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/utils/excelModel/BackPatientOrderParam.java | 20 +++ kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/utils/excelModel/ExportField.java | 30 +++++ kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/utils/ExcelUtils.java | 290 ++++++++++++++++++++++++++++++++++++++++++++++++ kidgrow-web/kidgrow-web-manager/src/main/resources/static/module/apiUrl.js | 2 pom.xml | 11 + 5 files changed, 352 insertions(+), 1 deletions(-) diff --git a/kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/utils/ExcelUtils.java b/kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/utils/ExcelUtils.java new file mode 100644 index 0000000..c6c572b --- /dev/null +++ b/kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/utils/ExcelUtils.java @@ -0,0 +1,290 @@ +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); + } +} \ No newline at end of file diff --git a/kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/utils/excelModel/BackPatientOrderParam.java b/kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/utils/excelModel/BackPatientOrderParam.java new file mode 100644 index 0000000..4d6eb1e --- /dev/null +++ b/kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/utils/excelModel/BackPatientOrderParam.java @@ -0,0 +1,20 @@ +package com.kidgrow.common.utils.excelModel; + +//import io.swagger.annotations.ApiModel; +//import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @program family_dr_api + * @description: 管理后台患者订单 + * @author: luqiang + * @create: 2019/05/24 19:14 + */ +//@ApiModel(value = "管理后台患者订单") +@Data +public class BackPatientOrderParam { +// @ApiModelProperty("导出字段,逗号分割") + private List<ExportField> exportField; +} \ No newline at end of file diff --git a/kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/utils/excelModel/ExportField.java b/kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/utils/excelModel/ExportField.java new file mode 100644 index 0000000..e449512 --- /dev/null +++ b/kidgrow-commons/kidgrow-common-spring-boot-starter/src/main/java/com/kidgrow/common/utils/excelModel/ExportField.java @@ -0,0 +1,30 @@ +package com.kidgrow.common.utils.excelModel; + +import lombok.Data; + +import java.util.List; + +/** + * @author : heyanfeng + * create at: 2019-05-27 22:00 + * @description: + */ +//@ApiModel(value = "管理后台患者订单导出的字段") +@Data +public class ExportField { + +// @ApiModelProperty("实体映射的字段") + private String entityAttrName; + +// @ApiModelProperty("导出字段,中文描述") + private String filedChineseName; + +// @ApiModelProperty("组装sql 字段") + private String filed; + +// @ApiModelProperty("sql-group-by去除字段:0 否 1是") + private Integer groupBy; + +// @ApiModelProperty("合并单元格") + private List<ExportField> children; +} \ No newline at end of file diff --git a/kidgrow-web/kidgrow-web-manager/src/main/resources/static/module/apiUrl.js b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/module/apiUrl.js index dbb5291..3c0c6dc 100644 --- a/kidgrow-web/kidgrow-web-manager/src/main/resources/static/module/apiUrl.js +++ b/kidgrow-web/kidgrow-web-manager/src/main/resources/static/module/apiUrl.js @@ -1,7 +1,7 @@ var my_api_server_url = 'http://127.0.0.1:8888/'; // var my_api_server_url = 'http://192.168.2.240:8888/'; // var my_api_server_url = 'http://open.zuul.kidgrow.cloud/'; - // var my_api_server_url = 'zuul.kidgrow.cloud/'; +// var my_api_server_url = 'https://zuul.kidgrow.cloud/'; //var my_api_server_url = 'https://zuul.kidgrow.cloud/'; if(my_api_server_url.indexOf("http")<0) diff --git a/pom.xml b/pom.xml index b4fcfd1..d991724 100644 --- a/pom.xml +++ b/pom.xml @@ -431,11 +431,22 @@ <artifactId>easypoi-base</artifactId> <version>${easypoi.version}</version> </dependency> +<!-- <dependency>--> +<!-- <groupId>cn.afterturn</groupId>--> +<!-- <artifactId>easypoi-web</artifactId>--> +<!-- <version>${easypoi.version}</version>--> +<!-- </dependency>--> + <dependency> + <groupId>cn.afterturn</groupId> + <artifactId>easypoi-annotation</artifactId> + <version>${easypoi.version}</version> + </dependency> <dependency> <groupId>org.modelmapper</groupId> <artifactId>modelmapper</artifactId> <version>${modle-mapper.version}</version> </dependency> + <!-- swagger --> <dependency> <groupId>io.springfox</groupId> -- Gitblit v1.8.0