From 7d6341a9c2a822ce654d933ae80790a9f14918a8 Mon Sep 17 00:00:00 2001 From: wangwei <1610949092@qq.com> Date: Mon, 17 Apr 2023 16:18:05 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AF=BC=E5=87=BAexcel?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 15 + .../controller/inv/ApiExcelController.java | 100 +++++++ .../com/glxp/api/dao/inout/IoStatDayDao.java | 4 +- .../com/glxp/api/entity/inout/ExcelVO.java | 104 +++++++ .../idc/service/impl/ConnectServiceImpl.java | 6 +- .../api/idc/service/impl/IdcServiceImpl.java | 1 + .../com/glxp/api/req/inout/ExcelRequest.java | 14 + .../glxp/api/service/inout/ExcelService.java | 63 ++++ .../api/service/inout/IoStatDayService.java | 2 + .../service/inout/impl/ExcelServiceImpl.java | 223 ++++++++++++++ .../inout/impl/IoStatDayServiceImpl.java | 5 + .../com/glxp/api/util/Excel/ExcelHandler.java | 274 ++++++++++++++++++ .../api/util/Excel/ExcelTemplateEnum.java | 66 +++++ .../util/Excel/Exception/RenException.java | 56 ++++ .../api/util/Excel/UploadDataListener.java | 61 ++++ .../mybatis/mapper/inout/IoStatDayDao.xml | 8 +- 16 files changed, 997 insertions(+), 5 deletions(-) create mode 100644 src/main/java/com/glxp/api/controller/inv/ApiExcelController.java create mode 100644 src/main/java/com/glxp/api/entity/inout/ExcelVO.java create mode 100644 src/main/java/com/glxp/api/req/inout/ExcelRequest.java create mode 100644 src/main/java/com/glxp/api/service/inout/ExcelService.java create mode 100644 src/main/java/com/glxp/api/service/inout/impl/ExcelServiceImpl.java create mode 100644 src/main/java/com/glxp/api/util/Excel/ExcelHandler.java create mode 100644 src/main/java/com/glxp/api/util/Excel/ExcelTemplateEnum.java create mode 100644 src/main/java/com/glxp/api/util/Excel/Exception/RenException.java create mode 100644 src/main/java/com/glxp/api/util/Excel/UploadDataListener.java diff --git a/pom.xml b/pom.xml index 1d0809fb1..e06eef846 100644 --- a/pom.xml +++ b/pom.xml @@ -294,6 +294,21 @@ iTextAsian 3.0 + + + com.alibaba + easyexcel + 2.2.10 + + + + + hu.blackbelt.bundles.swagger-parser + io.swagger.parser + 1.0.47_1 + + + diff --git a/src/main/java/com/glxp/api/controller/inv/ApiExcelController.java b/src/main/java/com/glxp/api/controller/inv/ApiExcelController.java new file mode 100644 index 000000000..27c0b980c --- /dev/null +++ b/src/main/java/com/glxp/api/controller/inv/ApiExcelController.java @@ -0,0 +1,100 @@ +package com.glxp.api.controller.inv; + +import com.glxp.api.common.res.BaseResponse; +import com.glxp.api.entity.inout.IoStatDayEntity; +import com.glxp.api.req.inout.FilterStatDataDetailRequest; +import com.glxp.api.service.inout.ExcelService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import java.util.List; + +/** + * @author : zhangsan + * @date : 2023/4/17 11:14 + * @modyified By : + */ + +@RestController +@Api(tags = "文件接口") +public class ApiExcelController { + + @Resource + private ExcelService excelService; + + /** + * excel导入-单个sheet + * + * @param multipartFile 文件流 + * @return + * @throws Exception + */ + @PostMapping("/excelImport") + @ApiOperation(value = "excel导入") + public BaseResponse excelImport(@RequestParam("file") MultipartFile multipartFile){ + excelService.excelImport(multipartFile); + return new BaseResponse<>(); + } + + /** + * excel导出-单个sheet + * + * @param response 响应流 + */ + @GetMapping("/udiwms/inv/excelExportOut") + public void export(HttpServletResponse response,String billNo) { + excelService.excelExport(response,billNo); + } + + /** + * excel导入-多个sheet + * + * @param multipartFile 文件流 + * @return 响应体 + */ + @PostMapping("/excelSheetImport") + @ApiOperation(value = "excel导入-多个sheet") + public BaseResponse excelSheetImport(@RequestParam("file") MultipartFile multipartFile){ + excelService.excelSheetImport(multipartFile); + return new BaseResponse<>(); + } + + /** + * excel导出-多个sheet + * + * @param response 响应流 + */ + @ApiOperation(value = "excel导出-多个sheet", httpMethod = "GET") + @GetMapping("/excelSheetExport") + public void excelSheetExport(HttpServletResponse response) { + excelService.excelSheetExport(response); + } + + /** + * excel模板导出-单个sheet + * + * @param response 响应流 + */ + @ApiOperation(value = "excel模板导出", httpMethod = "GET") + @GetMapping("/excelTemplate") + public void excelTemplate(HttpServletResponse response) { + + excelService.excelTemplate(response); + } + + /** + * excel模板导出-多个sheet + * + * @param response 响应流 + */ + @ApiOperation(value = "excel模板导出-多个sheet", httpMethod = "GET") + @GetMapping("/excelSheetTemplate") + public void excelSheetTemplate(HttpServletResponse response) throws Exception { + excelService.excelSheetTemplate(response); + } + +} diff --git a/src/main/java/com/glxp/api/dao/inout/IoStatDayDao.java b/src/main/java/com/glxp/api/dao/inout/IoStatDayDao.java index d03fbd7e0..6a272f80c 100644 --- a/src/main/java/com/glxp/api/dao/inout/IoStatDayDao.java +++ b/src/main/java/com/glxp/api/dao/inout/IoStatDayDao.java @@ -18,4 +18,6 @@ public interface IoStatDayDao extends BaseMapper { * @return */ List filterList(FilterStatDataDetailRequest statDataDetailRequest); -} \ No newline at end of file + + List filterListByRecordKey(String recordKey); +} diff --git a/src/main/java/com/glxp/api/entity/inout/ExcelVO.java b/src/main/java/com/glxp/api/entity/inout/ExcelVO.java new file mode 100644 index 000000000..a6c28cfb1 --- /dev/null +++ b/src/main/java/com/glxp/api/entity/inout/ExcelVO.java @@ -0,0 +1,104 @@ +package com.glxp.api.entity.inout; + +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; + +/** + * @author : zhangsan + * @date : 2023/4/17 11:11 + * @modyified By : + */ + +@Data +@ApiModel(value = "导出实体") +public class ExcelVO { + + @ColumnWidth(80) + @ExcelProperty("序号") + @ApiModelProperty(value = "序号") + private Integer id; + + @ColumnWidth(80) + @ExcelProperty("产品通用名") + @ApiModelProperty(value = "产品通用名") + private String productName; + + @ColumnWidth(80) + @ExcelProperty("规格型号") + @ApiModelProperty(value = "规格型号") + private String ggxh; + + @ColumnWidth(80) + @ExcelProperty("批次号") + @ApiModelProperty(value = "批次号") + private String batchNo; + + @ColumnWidth(80) + @ExcelProperty("数量") + @ApiModelProperty(value = "数量") + private Integer beginCount; + + @ColumnWidth(80) + @ExcelProperty("价格") + @ApiModelProperty(value = "价格") + private BigDecimal beginPrice; + + @ColumnWidth(80) + @ExcelProperty("金额") + @ApiModelProperty(value = "金额") + private BigDecimal beginAmount; + + @ColumnWidth(80) + @ExcelProperty("数量") + @ApiModelProperty(value = "数量") + private Integer inCount; + + @ColumnWidth(80) + @ExcelProperty("价格") + @ApiModelProperty(value = "价格") + private BigDecimal inPrice; + + @ColumnWidth(80) + @ExcelProperty("金额") + @ApiModelProperty(value = "金额") + private BigDecimal inAmount; + + @ColumnWidth(80) + @ExcelProperty("数量") + @ApiModelProperty(value = "数量") + private Integer outCount; + + @ColumnWidth(80) + @ExcelProperty("价格") + @ApiModelProperty(value = "价格") + private BigDecimal outPrice; + + @ColumnWidth(80) + @ExcelProperty("金额") + @ApiModelProperty(value = "金额") + private BigDecimal outAmount; + + @ColumnWidth(80) + @ExcelProperty("数量") + @ApiModelProperty(value = "数量") + private Integer balanceCount; + + @ColumnWidth(80) + @ExcelProperty("价格") + @ApiModelProperty(value = "价格") + private BigDecimal balancePrice; + + @ColumnWidth(80) + @ExcelProperty("金额") + @ApiModelProperty(value = "金额") + private BigDecimal balanceAmount; + + //无需导出字段使用此注解 + //@JsonSerialize(using = ToStringSerializer.class) + +} diff --git a/src/main/java/com/glxp/api/idc/service/impl/ConnectServiceImpl.java b/src/main/java/com/glxp/api/idc/service/impl/ConnectServiceImpl.java index 6a599e4bf..f83aad1f6 100644 --- a/src/main/java/com/glxp/api/idc/service/impl/ConnectServiceImpl.java +++ b/src/main/java/com/glxp/api/idc/service/impl/ConnectServiceImpl.java @@ -43,7 +43,7 @@ public class ConnectServiceImpl implements ConnectService { Map map = new HashMap(); map.put("level", level); Map config = new HashMap<>(); - try + try { if(level==0) { config = dbDao.get("select syncIp as paramValue from sync_data_set limit 1"); @@ -51,7 +51,7 @@ public class ConnectServiceImpl implements ConnectService { config = dbDao.get("select * from system_param_config where paramKey='upper_server_ip'"); } } catch (Exception ex) { - + } String msg = "UDI管理系统"; for(int i=1;i filterList(FilterStatDataDetailRequest statDataDetailRequest); + + List filterListByRecordKey(String recordKey); } diff --git a/src/main/java/com/glxp/api/service/inout/impl/ExcelServiceImpl.java b/src/main/java/com/glxp/api/service/inout/impl/ExcelServiceImpl.java new file mode 100644 index 000000000..1615e631c --- /dev/null +++ b/src/main/java/com/glxp/api/service/inout/impl/ExcelServiceImpl.java @@ -0,0 +1,223 @@ +package com.glxp.api.service.inout.impl; + +/** + * @author : zhangsan + * @date : 2023/4/17 11:13 + * @modyified By : + */ + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.glxp.api.entity.inout.ExcelVO; +import com.glxp.api.entity.inout.IoStatDayEntity; +import com.glxp.api.req.inout.FilterStatDataDetailRequest; +import com.glxp.api.service.inout.ExcelService; +import com.glxp.api.service.inout.IoStatDayService; +import com.glxp.api.util.Excel.ExcelHandler; +import com.glxp.api.util.Excel.ExcelTemplateEnum; +import com.glxp.api.util.Excel.Exception.RenException; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import java.util.*; + +/** + * 导出业务实现 + */ +@Slf4j +@Service +public class ExcelServiceImpl implements ExcelService { + + @Resource + ExcelHandler excelHandler; + + @Resource + private IoStatDayService statDayService; + + /** + * excel导入-单个sheet + * + * @param multipartFile 文件流 + */ + @Override + public void excelImport(MultipartFile multipartFile) { + try { + List voList = excelHandler.importExcel(multipartFile, ExcelVO.class, null); + if (CollectionUtils.isNotEmpty(voList)) { + System.out.println("本次成功导出:" + voList.size() + "条,数据如下---------------"); + voList.forEach(vo -> { + System.out.println("vo=" + vo.toString()); + }); + + } + } catch (Exception e) { + throw new RenException("导入失败"); + } + } + + /** + * excel导出-单个sheet + * + * @param response 响应体 + */ + @Override + public void excelExport(HttpServletResponse response, String billNo) { + try { + List excelVOS = structureDate(billNo); + excelHandler.exportExcel(response, excelVOS, ExcelVO.class, "excel导出-单et", "excel导出heet"); + } catch (Exception e) { + throw new RenException("导出失败"); + } + } + + /** + * excel导入-多个sheet + * + * @param multipartFile 文件流 + */ + @Override + public void excelSheetImport(MultipartFile multipartFile) { + try { + List indexList = new ArrayList<>(); + indexList.add(0); + indexList.add(1); + indexList.add(2); + indexList.add(3); + indexList.add(4); + indexList.add(5); + List objList = new ArrayList<>(); + objList.add(new ExcelVO()); + objList.add(new ExcelVO()); + objList.add(new ExcelVO()); + objList.add(new ExcelVO()); + objList.add(new ExcelVO()); + objList.add(new ExcelVO()); + List> resultList = excelHandler.importExcelsByIndex(multipartFile, objList, 6, indexList); + System.out.println("resultList="+resultList.size()); + resultList.forEach(vo->{ + List voList = JSON.parseArray(JSON.toJSONString(vo), ExcelVO.class); + System.out.println("voList="+voList.size()+"条数据"); + }); + } catch (Exception e) { + throw new RenException("导入失败"); + } + } + + /** + * excel导出-多个sheet + * + * @param response 响应体 + */ + @Override + public void excelSheetExport(HttpServletResponse response) { +// try { +// //构建多集合集合 +// List> lists = new ArrayList<>(); +// lists.add(structureDate(10)); +// lists.add(structureDate(20)); +// lists.add(structureDate(30)); +// lists.add(structureDate(40)); +// lists.add(structureDate(50)); +// lists.add(structureDate(60)); +// //Sheet页初始化 +// Map clazzMap = new HashMap<>(); +// clazzMap.put(0, "一年级成绩表"); +// clazzMap.put(1, "二年级成绩表"); +// clazzMap.put(2, "三年级成绩表"); +// clazzMap.put(3, "四年级成绩表"); +// clazzMap.put(4, "五年级成绩表"); +// clazzMap.put(5, "六年级成绩表"); +// excelHandler.exportExcels(response, Collections.singletonList(lists), clazzMap, "excel导出-单sheet"); +// } catch (Exception e) { +// throw new RenException("导出失败"); +// } + } + + /** + * excel模板导出-单个sheet + * + * @param response 响应流 + */ + @Override + public void excelTemplate(HttpServletResponse response) { +// try { +// //准备数据 +// JSONObject obj = new JSONObject(); +// obj.put("date","2022年"); +// obj.put("season","秋季"); +// obj.put("user","王远"); +// obj.put("userDate",new Date()); +// List list = structureDate(20); +// excelHandler.exportTemplateExcels(response,list,obj, ExcelTemplateEnum.TEMPLATE_1.getDesc(),ExcelTemplateEnum.TEMPLATE_1.getDesc()); +// }catch (Exception e){ +// log.error("导出错误:{}", e.getMessage()); +// throw new RenException("导出错误"); +// } + } + + /** + * excel模板导出-多个sheet + * + * @param response 响应流 + */ + @Override + public void excelSheetTemplate(HttpServletResponse response) throws Exception { +// 准备数据 +// JSONObject obj = new JSONObject(); +// obj.put("date","2022年"); +// obj.put("season","秋季"); +// obj.put("user","王远"); +// obj.put("userDate",new Date()); +// List list = structureDate(20); +// excelHandler.exportSheetTemplateExcels(response,list,list,obj,obj, ExcelTemplateEnum.TEMPLATE_1.getDesc(),ExcelTemplateEnum.TEMPLATE_1.getDesc()); + } + + /** + * 构造数据 + * + * @return 数据集合 + */ + private List structureDate(String billNo) { + List list = new ArrayList<>(); + + List ioStatDayEntities = statDayService.filterListByRecordKey(billNo); + ExcelVO vo = new ExcelVO(); + for (int i=0; i < ioStatDayEntities.size(); i++) { + vo.setId(i+1); + vo.setProductName(ioStatDayEntities.get(i).getProductName()); + vo.setGgxh(ioStatDayEntities.get(i).getGgxh()); + vo.setBatchNo(ioStatDayEntities.get(i).getBatchNo()); + vo.setBeginCount(ioStatDayEntities.get(i).getBeginCount()); + vo.setBeginPrice(ioStatDayEntities.get(i).getBeginPrice()); + vo.setBeginAmount(ioStatDayEntities.get(i).getBeginAmount()); + vo.setInCount(ioStatDayEntities.get(i).getInCount()); + vo.setInPrice(ioStatDayEntities.get(i).getInPrice()); + vo.setInAmount(ioStatDayEntities.get(i).getInAmount()); + vo.setOutCount(ioStatDayEntities.get(i).getOutCount()); + + vo.setOutPrice(ioStatDayEntities.get(i).getOutPrice()); + vo.setOutAmount(ioStatDayEntities.get(i).getOutAmount()); + vo.setBalanceCount(ioStatDayEntities.get(i).getBalanceCount()); + vo.setBalancePrice(ioStatDayEntities.get(i).getBalancePrice()); + vo.setBalanceAmount(ioStatDayEntities.get(i).getBalanceAmount()); + list.add(vo); + } + + +// for (int i = 0; i < size; i++) { +// ExcelVO vo = new ExcelVO(); +// vo.setId(i); +//// vo.setAge(i); +//// vo.setName("张三" + i); +//// vo.setWen(new Random().nextInt(99)); +//// vo.setRichard(new Random().nextInt(99)); +//// vo.setSum(vo.getWen() + vo.getRichard()); +// list.add(vo); +// } + return list; + } +} diff --git a/src/main/java/com/glxp/api/service/inout/impl/IoStatDayServiceImpl.java b/src/main/java/com/glxp/api/service/inout/impl/IoStatDayServiceImpl.java index 1a25c5450..f6eb7bb96 100644 --- a/src/main/java/com/glxp/api/service/inout/impl/IoStatDayServiceImpl.java +++ b/src/main/java/com/glxp/api/service/inout/impl/IoStatDayServiceImpl.java @@ -99,6 +99,11 @@ public class IoStatDayServiceImpl implements IoStatDayService { return statDayDao.filterList(statDataDetailRequest); } + @Override + public List filterListByRecordKey(String recordKey) { + return statDayDao.filterListByRecordKey(recordKey); + } + /** * 获取统计数据 * diff --git a/src/main/java/com/glxp/api/util/Excel/ExcelHandler.java b/src/main/java/com/glxp/api/util/Excel/ExcelHandler.java new file mode 100644 index 000000000..e6fdcb91b --- /dev/null +++ b/src/main/java/com/glxp/api/util/Excel/ExcelHandler.java @@ -0,0 +1,274 @@ +package com.glxp.api.util.Excel; + +import com.alibaba.excel.EasyExcel; +import com.alibaba.excel.EasyExcelFactory; +import com.alibaba.excel.ExcelWriter; +import com.alibaba.excel.read.builder.ExcelReaderBuilder; +import com.alibaba.excel.write.metadata.WriteSheet; +import com.alibaba.excel.write.metadata.fill.FillConfig; +import com.glxp.api.util.Excel.Exception.RenException; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; +import org.springframework.util.StringUtils; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; + +/** + * @author : zhangsan + * @date : 2023/4/17 11:06 + * @modyified By : + */ +@Slf4j +@Component +public class ExcelHandler { + /** + * 导入简单excel数据 + * @param file :文件流 + * @param clazz:数据对象 + * @param sheetName:要读取的sheet [不传:默认读取第一个sheet] + * @throws Exception + */ + public List importExcel(MultipartFile file, Class clazz, String sheetName) throws Exception{ + this.checkFile(file); + UploadDataListener uploadDataListener = new UploadDataListener<>(); + ExcelReaderBuilder builder = EasyExcelFactory.read(file.getInputStream(), clazz, uploadDataListener); + if (StringUtils.isEmpty(sheetName)) { + builder.sheet().doRead(); + } else { + builder.sheet(sheetName).doRead(); + } + return uploadDataListener.getList(); + } + /** + * 指定sheet页导入通用方法 + * @param multipartFile 传入文件 + * @param objList 需要导入的sheet页实体类型集合 + * @param index sheet页个数 + * @param indexList 需要导入sheet页下标集合 + * @param + * @return List> + * @throws Exception + */ + public List> importExcelsByIndex(MultipartFile multipartFile, List objList, int index,List indexList) throws Exception { + if (multipartFile == null) { + throw new RenException("文件为空"); + } + List> resultList = new LinkedList<>(); + //初始化导入sheet页实体类型下标 + int objListClass = 0; + for (int i = 0; i < index; i++) { + if(indexList.contains(i)){ + UploadDataListener uploadDataListener = new UploadDataListener<>(); + List excels; + EasyExcelFactory.read(multipartFile.getInputStream(), objList.get(objListClass).getClass(), uploadDataListener).sheet(i).doRead(); + excels = uploadDataListener.getList(); + resultList.add(excels); + objListClass++; + } + } + return resultList; + } + /** + * 读取多个sheet + * @param file:文件流 + * @param index:需要读取的sheet个数 [默认0开始,如果传入3,则读取0 1 2] + * @param params:每个sheet里面需要封装的对象[如果index为3,则需要传入对应的3个对象] + * @param + * @return + */ + public List> importExcels(MultipartFile file, int index, List params) throws Exception { + this.checkFile(file); + List> resultList = new LinkedList<>(); + for (int i=0; i uploadDataListener = new UploadDataListener<>(); + ExcelReaderBuilder builder = EasyExcelFactory.read(file.getInputStream(), params.get(i).getClass(), uploadDataListener); + builder.sheet(i).doRead(); + List list = uploadDataListener.getList(); + resultList.add(list); + } + return resultList; + } + + /** + * 导出excel表格 + * @param response : + * @param dataList :数据列表 + * @param clazz :数据对象 + * @param fileName :文件名称 + * @param sheetName:sheet名称 + * @throws Exception + */ + public void exportExcel(HttpServletResponse response, List dataList, Class clazz, String fileName, String sheetName) throws Exception { + response.setContentType("application/vnd.ms-excel"); + response.setCharacterEncoding(StandardCharsets.UTF_8.name()); + fileName = URLEncoder.encode(fileName, StandardCharsets.UTF_8.name()); + response.setHeader("Content-disposition", "attachment;filename=" + fileName + ExcelTemplateEnum.TEMPLATE_SUFFIX.getDesc()); + EasyExcelFactory.write(response.getOutputStream(), clazz).sheet(sheetName).doWrite(dataList); + } + + /** + * 导出多个sheet + * @param response: + * @param dataList:多个数据列表 + * @param clazzMap:对应每个列表里面的数据对应的sheet名称 + * @param fileName:文件名 + * @param + * @throws Exception + */ + public void exportExcels(HttpServletResponse response, List> dataList, Map clazzMap, String fileName) throws Exception { + response.setContentType("application/vnd.ms-excel"); + response.setCharacterEncoding(StandardCharsets.UTF_8.name()); + fileName = URLEncoder.encode(fileName, StandardCharsets.UTF_8.name()); + response.setHeader("Content-disposition", "attachment;filename=" + fileName + ExcelTemplateEnum.TEMPLATE_SUFFIX.getDesc()); + ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).build(); + int len = dataList.get(0).size(); + for (int i=0; i objects = (List) dataList.get(0).get(i); + Class aClass = objects.get(0).getClass(); + WriteSheet writeSheet0 = EasyExcel.writerSheet(i, clazzMap.get(i)).head(aClass).build(); + excelWriter.write(objects, writeSheet0); + } + excelWriter.finish(); + } + + /** + * 根据模板将集合对象填充表格-单个sheet + * @param list:填充对象集合 + * @param object :填充对象 + * @param fileName:文件名称 + * @param templateName:模板名称 + * @throws Exception + */ + public void exportTemplateExcels(HttpServletResponse response, List list, Object object, String fileName, String templateName) throws Exception{ + String template = ExcelTemplateEnum.TEMPLATE_PATH.getDesc() + File.separator + templateName + ExcelTemplateEnum.TEMPLATE_SUFFIX.getDesc(); + InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream(template); + FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build(); + ExcelWriter excelWriter = EasyExcelFactory.write(getOutputStream(fileName, response)).withTemplate(inputStream).build(); + WriteSheet writeSheet0 = EasyExcelFactory.writerSheet(0).build(); + excelWriter.fill(object, fillConfig, writeSheet0); + excelWriter.fill(list, fillConfig, writeSheet0); + excelWriter.finish(); + } + + /** + * 根据模板将集合对象填充表格-多个sheet + * @param list1:填充对象集合 + * @param list2:填充对象集合 + * @param object1 :填充对象 + * @param object2 :填充对象 + * @param fileName:文件名称 + * @param templateName:模板名称 + * @throws Exception + */ + public void exportSheetTemplateExcels(HttpServletResponse response, List list1,List list2, Object object1,Object object2, String fileName, String templateName) throws Exception{ + String template = ExcelTemplateEnum.TEMPLATE_PATH.getDesc() + File.separator + templateName + ExcelTemplateEnum.TEMPLATE_SUFFIX.getDesc(); + InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream(template); + FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build(); + ExcelWriter excelWriter = EasyExcelFactory.write(getOutputStream(fileName, response)).withTemplate(inputStream).build(); + WriteSheet writeSheet0 = EasyExcelFactory.writerSheet(0).build(); + WriteSheet writeSheet1 = EasyExcelFactory.writerSheet(1).build(); + excelWriter.fill(object1, fillConfig, writeSheet0); + excelWriter.fill(list1, fillConfig, writeSheet0); + excelWriter.fill(object2, fillConfig, writeSheet1); + excelWriter.fill(list2, fillConfig, writeSheet1); + excelWriter.finish(); + } + + /** + * 根据模板将单个对象填充表格 + * @param object :填充对象 + * @param templateName:模板名称 + * @param fileName :文件名称 + * @param sheetName :需要写入的sheet名称 [不传:填充到第一个sheet] + * @throws Exception + */ + public void exportTemplateExcel(HttpServletResponse response, Object object, String templateName, String fileName, String sheetName) throws Exception{ + String template = ExcelTemplateEnum.TEMPLATE_PATH.getDesc() + File.separator + templateName + ExcelTemplateEnum.TEMPLATE_SUFFIX.getDesc(); + InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream(template); + if (StringUtils.isEmpty(sheetName)) { + EasyExcelFactory.write(getOutputStream(fileName, response)).withTemplate(inputStream).sheet().doFill(object); + } else { + EasyExcelFactory.write(getOutputStream(fileName, response)).withTemplate(inputStream).sheet(sheetName).doFill(object); + } + } + + /** + * 根据模板将集合对象填充表格 + * @param list:填充对象集合 + * @param fileName:文件名称 + * @param templateName:模板名称 + * @param sheetName:需要写入的sheet [不传:填充到第一个sheet] + * @throws Exception + */ + public void exportTemplateExcelList(HttpServletResponse response, List list, String fileName, String templateName, String sheetName) throws Exception{ + log.info("模板名称:{}", templateName); + String template = ExcelTemplateEnum.TEMPLATE_PATH.getDesc() + File.separator + templateName + ExcelTemplateEnum.TEMPLATE_SUFFIX.getDesc(); + log.info("模板路径:{}", template); + InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream(template); + // 全部填充:全部加载到内存中一次填充 + if (StringUtils.isEmpty(sheetName)) { + EasyExcelFactory.write(getOutputStream(fileName, response)).withTemplate(inputStream).sheet().doFill(list); + } else { + EasyExcelFactory.write(getOutputStream(fileName, response)).withTemplate(inputStream).sheet(sheetName).doFill(list); + } + } + /** + * 根据模板将集合对象填充表格 + * @param list:填充对象集合 + * @param fileName:文件名称 + * @param templateName:模板名称 + * @throws Exception + */ + public void exportTemplateExcel2(HttpServletResponse response, List list, String fileName, String templateName) throws Exception{ + String template = ExcelTemplateEnum.TEMPLATE_PATH.getDesc() + File.separator + templateName + ExcelTemplateEnum.TEMPLATE_SUFFIX.getDesc(); + InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream(template); + ExcelWriter excelWriter = EasyExcelFactory.write(getOutputStream(fileName, response)).withTemplate(inputStream).build(); + WriteSheet writeSheet = EasyExcelFactory.writerSheet().build(); + excelWriter.fill(list, writeSheet); + excelWriter.finish(); + } + /** + * 构建输出流 + * @param fileName:文件名称 + * @param response: + * @return + * @throws Exception + */ + private OutputStream getOutputStream(String fileName, HttpServletResponse response) throws Exception { + fileName = URLEncoder.encode(fileName, StandardCharsets.UTF_8.name()); + response.setContentType("application/vnd.ms-excel"); + response.setCharacterEncoding(StandardCharsets.UTF_8.name()); + response.setHeader("Content-Disposition", "attachment;filename=" + fileName + ExcelTemplateEnum.TEMPLATE_SUFFIX.getDesc()); + return response.getOutputStream(); + } + + /** + * 文件格式校验 + * @param file: + */ + private void checkFile(MultipartFile file) { + if (file == null) { + throw new RenException("文件不能为空"); + } + String fileName = file.getOriginalFilename(); + if (StringUtils.isEmpty(fileName)) { + throw new RenException("文件不能为空"); + } + if (!fileName.endsWith(ExcelTemplateEnum.TEMPLATE_SUFFIX.getDesc()) + && !fileName.endsWith(ExcelTemplateEnum.TEMPLATE_SUFFIX_XLS.getDesc())) { + throw new RenException("请上传.xlsx或.xls文件"); + } + } + + + +} diff --git a/src/main/java/com/glxp/api/util/Excel/ExcelTemplateEnum.java b/src/main/java/com/glxp/api/util/Excel/ExcelTemplateEnum.java new file mode 100644 index 000000000..5bf5867e7 --- /dev/null +++ b/src/main/java/com/glxp/api/util/Excel/ExcelTemplateEnum.java @@ -0,0 +1,66 @@ +package com.glxp.api.util.Excel; + +import lombok.Getter; + +/** + * @author : zhangsan + * @date : 2023/4/17 11:09 + * @modyified By : + */ + +@Getter +public enum ExcelTemplateEnum { + /**单sheet导出*/ + TEMPLATE_1("1","complex"), + + /**模板格式*/ + TEMPLATE_SUFFIX("xlsx",".xlsx"), + TEMPLATE_SUFFIX_XLS("xls",".xls"), + TEMPLATE_SUFFIX_DOCX("docx",".docx"), + /**模板路径*/ + TEMPLATE_PATH("path","excel"), + ; + + private final String code; + private final String desc; + + ExcelTemplateEnum(String code, String desc) { + this.code = code; + this.desc = desc; + } + + /** + * 通过code获取msg + * + * @param code 枚举值 + * @return + */ + public static String getMsgByCode(String code) { + if (code == null) { + return null; + } + ExcelTemplateEnum enumList = getByCode(code); + if (enumList == null) { + return null; + } + return enumList.getDesc(); + } + + public static String getCode(ExcelTemplateEnum enumList) { + if (enumList == null) { + return null; + } + return enumList.getCode(); + } + + public static ExcelTemplateEnum getByCode(String code) { + for (ExcelTemplateEnum enumList : values()) { + if (enumList.getCode().equals(code)) { + return enumList; + } + } + return null; + } + +} + diff --git a/src/main/java/com/glxp/api/util/Excel/Exception/RenException.java b/src/main/java/com/glxp/api/util/Excel/Exception/RenException.java new file mode 100644 index 000000000..915a1c3ff --- /dev/null +++ b/src/main/java/com/glxp/api/util/Excel/Exception/RenException.java @@ -0,0 +1,56 @@ +package com.glxp.api.util.Excel.Exception; + +/** + * @author : zhangsan + * @date : 2023/4/17 11:21 + * @modyified By : + */ + + +public class RenException extends RuntimeException { + private static final long serialVersionUID = 1L; + + private String msg; + private int code = 500; + + public RenException(String msg) { + super(msg); + this.msg = msg; + } + + public RenException(String msg, Throwable e) { + super(msg, e); + this.msg = msg; + } + + public RenException(String msg, int code) { + super(msg); + this.msg = msg; + this.code = code; + } + + public RenException(String msg, int code, Throwable e) { + super(msg, e); + this.msg = msg; + this.code = code; + } + + public String getMsg() { + return msg; + } + + public void setMsg(String msg) { + this.msg = msg; + } + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + +} + diff --git a/src/main/java/com/glxp/api/util/Excel/UploadDataListener.java b/src/main/java/com/glxp/api/util/Excel/UploadDataListener.java new file mode 100644 index 000000000..ee3c11114 --- /dev/null +++ b/src/main/java/com/glxp/api/util/Excel/UploadDataListener.java @@ -0,0 +1,61 @@ +package com.glxp.api.util.Excel; + +import com.alibaba.excel.context.AnalysisContext; +import com.alibaba.excel.event.AnalysisEventListener; +import com.alibaba.excel.exception.ExcelDataConvertException; +import com.glxp.api.util.Excel.Exception.RenException; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author : zhangsan + * @date : 2023/4/17 11:09 + * @modyified By : + */ + +public class UploadDataListener extends AnalysisEventListener { + + /**数据集*/ + private final List list = new ArrayList<>(); + + public List getList(){ + return this.list; + } + + /** + * 每条数据都会进入 + * @param object: + * @param analysisContext: + */ + @Override + public void invoke(T object, AnalysisContext analysisContext) { + this.list.add(object); + } + + /** + * 数据解析完调用 + * @param analysisContext: + */ + @Override + public void doAfterAllAnalysed(AnalysisContext analysisContext) { + + } + + /** + * 异常时调用 + * @param exception: + * @param context: + * @throws Exception + */ + @Override + public void onException(Exception exception, AnalysisContext context) throws Exception { + // 数据解析异常 + if (exception instanceof ExcelDataConvertException) { + ExcelDataConvertException excelDataConvertException = (ExcelDataConvertException)exception; + throw new RenException("第" + excelDataConvertException.getRowIndex() + "行" + excelDataConvertException.getColumnIndex() + "列" + "数据解析异常"); + } + // 其他异常... + } +} + diff --git a/src/main/resources/mybatis/mapper/inout/IoStatDayDao.xml b/src/main/resources/mybatis/mapper/inout/IoStatDayDao.xml index 884e07224..0139ed839 100644 --- a/src/main/resources/mybatis/mapper/inout/IoStatDayDao.xml +++ b/src/main/resources/mybatis/mapper/inout/IoStatDayDao.xml @@ -20,4 +20,10 @@ - \ No newline at end of file + + +