diff --git a/epdc-commons-tools/src/main/java/com/elink/esua/epdc/commons/tools/enums/UserSexEnum.java b/epdc-commons-tools/src/main/java/com/elink/esua/epdc/commons/tools/enums/UserSexEnum.java index 3bcc815..01b7b75 100644 --- a/epdc-commons-tools/src/main/java/com/elink/esua/epdc/commons/tools/enums/UserSexEnum.java +++ b/epdc-commons-tools/src/main/java/com/elink/esua/epdc/commons/tools/enums/UserSexEnum.java @@ -26,6 +26,11 @@ public enum UserSexEnum { */ FEMALE("0"), + /** + * 未知 + */ + UNKNOWN_SEX("2"), + /** * 男 */ diff --git a/epdc-commons-tools/src/main/java/com/elink/esua/epdc/commons/tools/utils/ExcelSelectionDto.java b/epdc-commons-tools/src/main/java/com/elink/esua/epdc/commons/tools/utils/ExcelSelectionDto.java new file mode 100644 index 0000000..f6c6e04 --- /dev/null +++ b/epdc-commons-tools/src/main/java/com/elink/esua/epdc/commons/tools/utils/ExcelSelectionDto.java @@ -0,0 +1,28 @@ +package com.elink.esua.epdc.commons.tools.utils; + +import lombok.Data; + +/** + * @author songyunpeng + * @Description excel导出模板的下拉列表实体 + * @create 2020-09-03 + */ +@Data +public class ExcelSelectionDto { + /** + * sheet页索引 0开始 + */ + private Integer sheetIndex; + /** + * 区域中第一个单元格的列号 (下标0开始) + */ + private Integer firstCol; + /** + * 区域中最后一个单元格的列号 + */ + private Integer lastCol; + /** + * 下拉数据 + */ + private String[] excelSelections; +} diff --git a/epdc-commons-tools/src/main/java/com/elink/esua/epdc/commons/tools/utils/ExcelUtils.java b/epdc-commons-tools/src/main/java/com/elink/esua/epdc/commons/tools/utils/ExcelUtils.java index 6fccf45..1841987 100644 --- a/epdc-commons-tools/src/main/java/com/elink/esua/epdc/commons/tools/utils/ExcelUtils.java +++ b/epdc-commons-tools/src/main/java/com/elink/esua/epdc/commons/tools/utils/ExcelUtils.java @@ -15,10 +15,15 @@ import cn.afterturn.easypoi.excel.export.ExcelBatchExportService; import cn.afterturn.easypoi.handler.inter.IExcelExportServer; import com.elink.esua.epdc.commons.tools.exception.RenException; import org.apache.commons.lang3.StringUtils; +import org.apache.poi.hssf.usermodel.DVConstraint; +import org.apache.poi.hssf.usermodel.HSSFDataValidation; +import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellType; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; +import org.apache.poi.ss.util.CellRangeAddressList; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.springframework.beans.BeanUtils; import org.springframework.web.multipart.MultipartFile; @@ -26,6 +31,7 @@ import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse; import java.io.ByteArrayOutputStream; import java.io.IOException; +import java.io.InputStream; import java.net.URLEncoder; import java.util.*; @@ -251,4 +257,111 @@ public class ExcelUtils { public static boolean isExcel2007(String filePath) { return filePath.matches("^.+\\.(?i)(xlsx)$"); } + + /** + * 得到Workbook对象 + * + * @param file + * @return + * @throws IOException + */ + public static Workbook getWorkBook(MultipartFile file) throws IOException { + //这样写 excel 能兼容03和07 + InputStream is = file.getInputStream(); + Workbook hssfWorkbook = null; + try { + hssfWorkbook = new HSSFWorkbook(is); + } catch (Exception ex) { + is = file.getInputStream(); + hssfWorkbook = new XSSFWorkbook(is); + } + return hssfWorkbook; + } + + /** + * Excel导出,先sourceList转换成List,再导出 + * + * @param response response + * @param fileName 文件名 + * @param sourceList 原数据List + * @param sheetNames sheet名字列表 + */ + public static void exportExcelToTargetWithSheets(HttpServletResponse response, String fileName, List sheetNames, + List> targetClassList, List excelSelectionDtos, Collection... sourceList) throws Exception { + if (sheetNames.size() != targetClassList.size() && targetClassList.size() != sourceList.length) { + throw new RenException("参数传递出错"); + } + // 将sheets使用得map进行包装 + List> sheetsList = new ArrayList<>(); + for (int i = 0; i < sheetNames.size(); i++) { + Map deptDataMap = new HashMap<>(4); + ExportParams exportParams = new ExportParams(); + exportParams.setSheetName(sheetNames.get(i)); + deptDataMap.put("title", exportParams); + // 模版导出对应得实体类型 + deptDataMap.put("entity", targetClassList.get(i)); + // sheet中要填充得数据 + deptDataMap.put("data", sourceList[i]); + sheetsList.add(deptDataMap); + } + exportExcelWithSheets(response, fileName, sheetsList, excelSelectionDtos); + + } + + /** + * 多sheetExcel导出 + * + * @param response response + * @param fileName 文件名 + * @param sheetsList 多sheet组装 + */ + public static void exportExcelWithSheets(HttpServletResponse response, String fileName, List> sheetsList, List excelSelectionDtos) throws IOException { + + if (StringUtils.isBlank(fileName)) { + //当前日期 + fileName = DateUtils.format(new Date()); + } + Workbook workbook = null; + try { + workbook = ExcelExportUtil.exportExcel(sheetsList, ExcelType.HSSF); + } catch (Exception ex) { + workbook = ExcelExportUtil.exportExcel(sheetsList, ExcelType.XSSF); + } + //插入下拉列表 + if (excelSelectionDtos != null && excelSelectionDtos.size() > 0) { + for (ExcelSelectionDto excelSelectionDto : excelSelectionDtos) { + selectList(workbook, excelSelectionDto.getSheetIndex(), excelSelectionDto.getFirstCol(), excelSelectionDto.getLastCol(), excelSelectionDto.getExcelSelections()); + } + } + response.setCharacterEncoding("UTF-8"); + response.setHeader("content-Type", "application/vnd.ms-excel"); + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8") + ".xls"); + ServletOutputStream out = response.getOutputStream(); + workbook.write(out); + out.flush(); + out.close(); + } + + /** + * firstRow 開始行號 根据此项目,默认为2(下标0开始) + * lastRow 根据此项目,默认为最大65535 + * firstCol 区域中第一个单元格的列号 (下标0开始) + * lastCol 区域中最后一个单元格的列号 + * strings 下拉内容 + */ + public static void selectList(Workbook workbook, Integer sheetIndex, int firstCol, int lastCol, String[] strings) { + + + Sheet sheet = workbook.getSheetAt(sheetIndex); + // 生成下拉列表 + // 只对(x,x)单元格有效 + CellRangeAddressList cellRangeAddressList = new CellRangeAddressList(1, 65535, firstCol, lastCol); + // 生成下拉框内容 + DVConstraint dvConstraint = DVConstraint.createExplicitListConstraint(strings); + HSSFDataValidation dataValidation = new HSSFDataValidation(cellRangeAddressList, dvConstraint); + // 对sheet页生效 + sheet.addValidationData(dataValidation); + + } } diff --git a/epdc-commons-tools/src/main/java/com/elink/esua/epdc/commons/tools/utils/StreamUtils.java b/epdc-commons-tools/src/main/java/com/elink/esua/epdc/commons/tools/utils/StreamUtils.java new file mode 100644 index 0000000..0f62ea6 --- /dev/null +++ b/epdc-commons-tools/src/main/java/com/elink/esua/epdc/commons/tools/utils/StreamUtils.java @@ -0,0 +1,56 @@ +package com.elink.esua.epdc.commons.tools.utils; + +import com.elink.esua.epdc.commons.tools.exception.RenException; +import org.springframework.web.multipart.MultipartFile; + +import java.io.*; + +/** + * 接收文件转化File + * Created by liuhongwei on 2019/6/21. + */ +public class StreamUtils { + + + + public static File conversionFile(MultipartFile file){ + + File toFile =null; + InputStream ins = null; + try { + // 转化字节流 + ins = file.getInputStream(); + // 获取文件名字 + toFile = new File(file.getOriginalFilename()); + // 字节转化文件 + inputStreamToFile(ins, toFile); + ins.close(); + } catch (IOException e) { + new RenException(500,"文件转化失败"); + } + return toFile; + } + + + /** + * 流转化 + * @param ins file + * @return + * @author liuhongwei + * @date 2019/6/14 14:07 + */ + public static void inputStreamToFile(InputStream ins, File file) { + try { + OutputStream os = new FileOutputStream(file); + int bytesRead = 0; + byte[] buffer = new byte[8192]; + while ((bytesRead = ins.read(buffer, 0, 8192)) != -1) { + os.write(buffer, 0, bytesRead); + } + os.close(); + ins.close(); + } catch (Exception e) { + e.printStackTrace(); + } + } +}