diff --git a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/api/user/OriginalBomApi.java b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/api/user/OriginalBomApi.java index b6f5597b..477fde68 100644 --- a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/api/user/OriginalBomApi.java +++ b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/api/user/OriginalBomApi.java @@ -2,24 +2,37 @@ package com.nflg.product.bomnew.api.user; import cn.hutool.core.collection.CollUtil; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.google.common.collect.ImmutableList; import com.nflg.product.base.core.api.BaseApi; import com.nflg.product.base.core.conmon.util.SessionUtil; +import com.nflg.product.base.core.exception.NflgBusinessException; +import com.nflg.product.bomnew.pojo.dto.BomNewOriginalExcelDTO; import com.nflg.product.bomnew.pojo.dto.OriginalSaveBomDTO; import com.nflg.product.bomnew.pojo.query.OriginalBomQuery; import com.nflg.product.bomnew.pojo.vo.BomOriginalListVO; import com.nflg.product.bomnew.service.BomNewOriginalParentService; +import com.nflg.product.bomnew.util.EecExcelUtil; import com.nflg.product.bomnew.util.TreeNode; import com.nflg.product.bomnew.util.VUtils; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; +import nflg.product.common.constant.STATE; import nflg.product.common.vo.ResultVO; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; +import org.ttzero.excel.entity.ListMapSheet; +import org.ttzero.excel.entity.ListSheet; +import org.ttzero.excel.entity.Workbook; import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; import javax.validation.Valid; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; import java.util.List; +import java.util.Map; import java.util.concurrent.ExecutionException; /** @@ -106,14 +119,24 @@ public class OriginalBomApi extends BaseApi { } + @GetMapping("getOriginalBomExcelTemplate") + @ApiOperation("原始BOM导入模板下载") + public void getAttrGroupExcelTemplate(HttpServletResponse response) throws IOException { + EecExcelUtil.setResponseExcelHeader(response, "OriginalBomTemplate"); + new Workbook("物料导入", "").addSheet(new ListSheet<>("sheet1", ImmutableList.of(new BomNewOriginalExcelDTO()))).writeTo(response.getOutputStream()); + + } + @ApiOperation("导入") @PostMapping("importBom") @Transactional(rollbackFor = Exception.class) - public ResultVO importBom(@RequestParam(value = "file")MultipartFile file){ + public ResultVO importBom(@RequestParam(value = "file")MultipartFile file) throws IOException { if (file != null && !file.getOriginalFilename().endsWith("xls") && !file.getOriginalFilename().endsWith("xlsx")) { return ResultVO.error("请上传Excel文件"); } + originalParentService.importBom(file); + originalParentService.computeLevelNumAndRootState(); return ResultVO.success(true); } diff --git a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/pojo/dto/BaseImportExcelDTO.java b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/pojo/dto/BaseImportExcelDTO.java new file mode 100644 index 00000000..51a87135 --- /dev/null +++ b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/pojo/dto/BaseImportExcelDTO.java @@ -0,0 +1,16 @@ +package com.nflg.product.bomnew.pojo.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @decription + * @Author 大米 + * @Date 2022/8/9 15:43 + **/ +@Data +public class BaseImportExcelDTO { + + @ApiModelProperty("行号") + private int rowNum; +} diff --git a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/pojo/dto/BomNewOriginalExcelDTO.java b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/pojo/dto/BomNewOriginalExcelDTO.java index 07a79c29..1a417038 100644 --- a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/pojo/dto/BomNewOriginalExcelDTO.java +++ b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/pojo/dto/BomNewOriginalExcelDTO.java @@ -1,6 +1,7 @@ package com.nflg.product.bomnew.pojo.dto; import com.baomidou.mybatisplus.annotation.TableField; +import com.nflg.product.base.core.conmon.util.SessionUtil; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import org.ttzero.excel.annotation.ExcelColumn; @@ -11,40 +12,60 @@ import java.math.BigDecimal; * 原始BOM-excel 导入DTO */ @Data -public class BomNewOriginalExcelDTO { +public class BomNewOriginalExcelDTO extends BaseImportExcelDTO { + + @ApiModelProperty("uuid") + private String uuid; @ExcelColumn("层次") - private String levelNo; + private Integer levelNo; @ExcelColumn("物料编码") private String materialNo; @ExcelColumn("图号") - private String drawingNo; + private String chartNo; @ExcelColumn("名称") private String materialName; @ExcelColumn("材料") - private String materialTexture; + private String material; @ExcelColumn(value = "数量") - private BigDecimal num; + private Integer qty; @ExcelColumn("单位") private String unitName; @ExcelColumn(value = "版本") - private String currentVersion; + private String rev; @ExcelColumn(value = "单重") - private BigDecimal unitWeight; + private BigDecimal weight; @ExcelColumn(value = "备注") private String remark; + @ApiModelProperty("父标识") + private String parentKey; + private String designBy; + + @ApiModelProperty("排序号") + private Integer orderNo; + + public String getDesignBy() { + return SessionUtil.getUserCode(); + } + + @ApiModelProperty(value = "创建人") + private String createdBy; + + public String getCreatedBy() { + return SessionUtil.getUserCode(); + } } diff --git a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/BomNewOriginalParentService.java b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/BomNewOriginalParentService.java index bd35cd32..8948bca9 100644 --- a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/BomNewOriginalParentService.java +++ b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/BomNewOriginalParentService.java @@ -2,32 +2,39 @@ package com.nflg.product.bomnew.service; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.nflg.product.base.core.config.SpringContextUtils; import com.nflg.product.base.core.conmon.util.SessionUtil; import com.nflg.product.bomnew.constant.OriginalConstant; import com.nflg.product.bomnew.constant.OriginalEditStatusEnum; import com.nflg.product.bomnew.constant.OriginalSourceEnum; import com.nflg.product.bomnew.constant.OriginalStatusEnum; import com.nflg.product.bomnew.mapper.master.BomNewOriginalParentMapper; +import com.nflg.product.bomnew.pojo.dto.BomNewOriginalExcelDTO; import com.nflg.product.bomnew.pojo.dto.OriginalSaveBomDTO; import com.nflg.product.bomnew.pojo.entity.BomNewOriginalChildEntity; import com.nflg.product.bomnew.pojo.entity.BomNewOriginalParentEntity; import com.nflg.product.bomnew.pojo.entity.BomOriginalCadParentEntity; import com.nflg.product.bomnew.pojo.query.OriginalBomQuery; import com.nflg.product.bomnew.pojo.vo.BomOriginalListVO; +import com.nflg.product.bomnew.pojo.vo.BomOriginalPlmBomVO; import com.nflg.product.bomnew.service.domain.OriginalBom.OriginalBomDetailTask; import com.nflg.product.bomnew.service.domain.OriginalBom.OriginalBomToEBomConvert; import com.nflg.product.bomnew.service.domain.OriginalBom.PlmBomToOriginalConvert; import com.nflg.product.bomnew.util.*; +import org.apache.commons.collections.map.LinkedMap; +import org.bouncycastle.cert.dane.DANEEntry; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; -import java.util.List; -import java.util.Map; -import java.util.Objects; +import java.io.IOException; +import java.io.InputStream; +import java.util.*; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; import java.util.concurrent.ForkJoinPool; @@ -147,23 +154,22 @@ public class BomNewOriginalParentService extends ServiceImpl> getChildTree(Long rowId) throws ExecutionException, InterruptedException { List bomTree = getBomTree(rowId); @@ -242,7 +246,7 @@ public class BomNewOriginalParentService extends ServiceImpl delRowIds = parents.stream().map(u -> u.getRowId()).collect(Collectors.toList()); - if(CollUtil.isNotEmpty(delRowIds)) { + if (CollUtil.isNotEmpty(delRowIds)) { originalCadParentService.getBaseMapper().deleteBatchIds(delRowIds); originalCadParentService.getBaseMapper().delChildByParentRowIds(delRowIds); } - + } /** * 计算层级数和根节点状态 */ - public void computeLevelNumAndRootState() { + public void computeLevelNumAndRootState() { //计算树的层级数 - CompletableFuture.runAsync(()->{ + CompletableFuture.runAsync(() -> { try { this.compucteLevelNum(); this.getBaseMapper().updateRootState(); @@ -278,7 +282,6 @@ public class BomNewOriginalParentService extends ServiceImpl bomTree = getBomTree(bomRowId); @@ -347,11 +350,65 @@ public class BomNewOriginalParentService extends ServiceImpl rowNum = new ThreadLocal<>(); + + public static ThreadLocal> excelContextTL = new ThreadLocal<>(); + + /** + * 原始BOM导入 + */ + @Transactional(rollbackFor = Exception.class) + public void importBom(MultipartFile file) throws IOException { + rowNum.set(1); + excelContextTL.set(new ArrayList<>()); + EecExcelUtil.handlerExcel(file.getInputStream(), BomNewOriginalExcelDTO.class, BomNewOriginalParentService::handlerExcelRow); + List excelContext = excelContextTL.get(); + List noLevelNo = excelContext.stream().filter(u -> Objects.isNull(u.getLevelNo())).map(u->u.getRowNum()).collect(Collectors.toList()); + VUtils.isTure(CollUtil.isNotEmpty(noLevelNo)).throwMessage(StrUtil.join(",",noLevelNo )+"层次为空"); + List noDrawingNo = excelContext.stream().filter(u -> StrUtil.isBlank(u.getChartNo())).map(u->u.getRowNum()).collect(Collectors.toList()); + VUtils.isTure(CollUtil.isNotEmpty(noDrawingNo)).throwMessage(StrUtil.join(",",noDrawingNo )+"图号为空"); + List noNum = excelContext.stream().filter(u -> Objects.isNull(u.getQty())).map(u->u.getRowNum()).collect(Collectors.toList()); + VUtils.isTure(CollUtil.isNotEmpty(noNum)).throwMessage( StrUtil.join(",",noNum )+"数量为空"); + + for (BomNewOriginalExcelDTO data : excelContext) { + List parentData = excelContext.stream().filter(u -> u.getLevelNo().equals(data.getLevelNo() - 1) && u.getRowNum() < data.getRowNum()) + .sorted(Comparator.comparing(BomNewOriginalExcelDTO::getRowNum).reversed()).limit(1).collect(Collectors.toList()); + data.setParentKey(CollUtil.isNotEmpty(parentData) ? StrUtil.join("-", parentData.get(0).getLevelNo(), parentData.get(0).getRowNum()) : "0"); + + } + //转换 + for (BomNewOriginalExcelDTO data : excelContext) { + PlmBomToOriginalConvert convert = new PlmBomToOriginalConvert(); + List chileds = excelContext.stream().filter(u -> u.getParentKey().equals(data.getLevelNo() + "-" + data.getRowNum())).collect(Collectors.toList()); + if (CollUtil.isNotEmpty(chileds)) { + convert.convertOriginalBomFromExcel(Convert.convert(BomOriginalPlmBomVO.class, data), Convert.toList(BomOriginalPlmBomVO.class, chileds)); + + if (CollUtil.isNotEmpty(convert.getResultParent())) { + this.saveOrUpdateBatch(convert.getResultParent()); + } + if (CollUtil.isNotEmpty(convert.getResultChild())) { + originalChildService.saveOrUpdateBatch(convert.getResultChild()); + } + } + } + excelContextTL.remove(); + } + + public static void handlerExcelRow(BomNewOriginalExcelDTO data) { + data.setRowNum(rowNum.get()); + data.setOrderNo(data.getLevelNo()); + data.setChartNo(StrUtil.trim(data.getChartNo()).replace("(","(").replace(")",")").replace(" ","")); + rowNum.set(rowNum.get() + 1); + + excelContextTL.get().add(data); + + } + } diff --git a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/domain/OriginalBom/BaseConvert.java b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/domain/OriginalBom/BaseConvert.java index b5e3d61e..d1ecea33 100644 --- a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/domain/OriginalBom/BaseConvert.java +++ b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/domain/OriginalBom/BaseConvert.java @@ -100,7 +100,7 @@ public abstract class BaseConvert { * * @param material */ - protected BomNewOriginalParentEntity buildParentEntity(BomOriginalPlmBomVO material ,String preVersion) { + protected BomNewOriginalParentEntity buildParentEntity(BomOriginalPlmBomVO material ,String preVersion,OriginalSourceEnum originalSourceEnum) { BomNewOriginalParentEntity parentEntity = new BomNewOriginalParentEntity(); @@ -123,7 +123,7 @@ public abstract class BaseConvert { parentEntity.setEditStatus(OriginalEditStatusEnum.HANDLER_CREATED.getValue()); parentEntity.setDeptRowId(SessionUtil.getPartRowId()); parentEntity.setDeptName(SessionUtil.getFullDeptName()); - parentEntity.setSource(OriginalSourceEnum.CAD_IMPORT.getValue()); + parentEntity.setSource(originalSourceEnum.getValue()); parentEntity.setCreatedBy(material.getCreatedBy()); parentEntity.setCreatedTime(LocalDateTime.now()); diff --git a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/domain/OriginalBom/PlmBomToOriginalConvert.java b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/domain/OriginalBom/PlmBomToOriginalConvert.java index 5ce37af2..e297c302 100644 --- a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/domain/OriginalBom/PlmBomToOriginalConvert.java +++ b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/domain/OriginalBom/PlmBomToOriginalConvert.java @@ -7,6 +7,7 @@ import com.github.xiaoymin.knife4j.core.util.StrUtil; import com.google.common.collect.ImmutableList; import com.nflg.product.bomnew.constant.EBomStatusEnum; import com.nflg.product.bomnew.constant.OriginalConstant; +import com.nflg.product.bomnew.constant.OriginalSourceEnum; import com.nflg.product.bomnew.constant.OriginalStatusEnum; import com.nflg.product.bomnew.mapper.master.MaterialMainMapper; import com.nflg.product.bomnew.pojo.entity.*; @@ -45,16 +46,30 @@ public class PlmBomToOriginalConvert extends BaseConvert { SpringUtil.getBean(MaterialMainService.class).intiMaterialInfo(ImmutableList.of(parent)); SpringUtil.getBean(MaterialMainService.class).intiMaterialInfo(childs); //开始转原始BOM - handlerBom(); + handlerBom(OriginalSourceEnum.CAD_IMPORT); } + public void convertOriginalBomFromExcel(BomOriginalPlmBomVO inParent, List inChilds) { + childs = inChilds; + parent=inParent; + //初始化物料信息 + SpringUtil.getBean(MaterialMainService.class).intiMaterialInfo(ImmutableList.of(parent)); + SpringUtil.getBean(MaterialMainService.class).intiMaterialInfo(childs); + //开始转原始BOM + handlerBom(OriginalSourceEnum.MANUAL_IMPORT); + + } + + + + /** * 处理父类 */ - private void handlerBom() { + private void handlerBom(OriginalSourceEnum originalSourceEnum) { //检查BOM checkBom(); @@ -65,11 +80,11 @@ public class PlmBomToOriginalConvert extends BaseConvert { BomNewOriginalParentEntity originalBom = getOriginalBomForMaterial(parent.getChartNo()); //沒有原始BOM if (Objects.isNull(originalBom)) { - BomNewOriginalParentEntity parentEntity = buildParentEntity(parent, ""); + BomNewOriginalParentEntity parentEntity = buildParentEntity(parent, "",originalSourceEnum); if (StrUtil.isNotBlank(parent.getMaterialCategoryCode()) && parent.getMaterialCategoryCode().equals(OriginalConstant.COMMON_MATERIAL_CATEGORY_CODE) && CollUtil.isEmpty(childs)) { handlerCommonMaterial(parentEntity); } else { - handlerChild(parentEntity); + handlerChild(parentEntity,originalSourceEnum); } } else { //有原始BOM //草稿状态 @@ -79,7 +94,7 @@ public class PlmBomToOriginalConvert extends BaseConvert { if (originalBom.getCreatedBy().equals(parent.getCreatedBy()) ) { // 删除旧的内容 delBomChild(originalBom.getRowId()); - handlerChild(originalBom); + handlerChild(originalBom,originalSourceEnum); } else { //用户不一致 if (isSame(getBomChild(originalBom.getRowId()), Convert.toList(BomNewOriginalChildEntity.class, childs))) { VUtils.isTure(true).throwMessage("数据和" + originalBom.getCreatedBy() + "导入的数据不一致,请沟通处理"); @@ -102,10 +117,10 @@ public class PlmBomToOriginalConvert extends BaseConvert { } else { //ebom为正式状态 // BOM结构不相同 if (!isSame(getBomChild(originalBom.getRowId()), Convert.toList(BomNewOriginalChildEntity.class, childs))) { - BomNewOriginalParentEntity parentEntity = buildParentEntity(parent, originalBom.getCurrentVersion()); + BomNewOriginalParentEntity parentEntity = buildParentEntity(parent, originalBom.getCurrentVersion(),originalSourceEnum); originalBom.setLastVersionIs(0); this.resultParent.add(originalBom); - handlerChild(parentEntity); + handlerChild(parentEntity,originalSourceEnum); } } } @@ -116,7 +131,7 @@ public class PlmBomToOriginalConvert extends BaseConvert { { BomNewOriginalParentEntity oBOM =getOriginalBomForMaterial(parent.getChartNo()); if(Objects.isNull(oBOM)){ - BomNewOriginalParentEntity parentEntity = buildParentEntity(parent,""); + BomNewOriginalParentEntity parentEntity = buildParentEntity(parent,"",originalSourceEnum); if (StrUtil.isNotBlank(parent.getMaterialCategoryCode()) && parent.getMaterialCategoryCode().equals(OriginalConstant.COMMON_MATERIAL_CATEGORY_CODE) && CollUtil.isEmpty(childs)) { handlerCommonMaterial(parentEntity); @@ -126,7 +141,7 @@ public class PlmBomToOriginalConvert extends BaseConvert { } - private void handlerChild(BomNewOriginalParentEntity parentEntity) { + private void handlerChild(BomNewOriginalParentEntity parentEntity ,OriginalSourceEnum originalSourceEnum) { for (BomOriginalPlmBomVO childVo : childs) { //一般零部件 @@ -136,7 +151,7 @@ public class PlmBomToOriginalConvert extends BaseConvert { List parentResultOne = this.resultParent.stream().filter(u -> u.getDrawingNo().equals(childVo.getChartNo())).collect(Collectors.toList()); if (Objects.isNull(originalBomForMaterial) && CollUtil.isEmpty(parentResultOne) ) { childVo.setCreatedBy(parentEntity.getCreatedBy()); - BomNewOriginalParentEntity parentEntity1 = buildParentEntity(childVo, ""); + BomNewOriginalParentEntity parentEntity1 = buildParentEntity(childVo, "",originalSourceEnum); handlerCommonMaterial(parentEntity1); } buildChildEntity(childVo,parentEntity); diff --git a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/util/EecExcelUtil.java b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/util/EecExcelUtil.java new file mode 100644 index 00000000..c46d98e6 --- /dev/null +++ b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/util/EecExcelUtil.java @@ -0,0 +1,167 @@ +package com.nflg.product.bomnew.util; + +import com.nflg.product.base.core.exception.NflgBusinessException; +import com.nflg.product.bomnew.pojo.dto.BaseImportExcelDTO; +import nflg.product.common.constant.STATE; +import org.ttzero.excel.entity.ListSheet; +import org.ttzero.excel.entity.Workbook; +import org.ttzero.excel.reader.ExcelReader; +import org.ttzero.excel.reader.Row; +import org.ttzero.excel.reader.Sheet; + +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.Iterator; +import java.util.List; +import java.util.function.BiConsumer; +import java.util.function.Consumer; +import java.util.stream.Collectors; + +/** + * eecExcel + * + * @Author 大米 + * @Date 2022-03-23 + */ +public class EecExcelUtil { + + /** + * 下载本地文件 + * + * @param filePath 文件地址 + * @param response 输出流 + * @param fileName 文件名 + * @param format + */ + public static void downLocalFile(String filePath, HttpServletResponse response, String fileName, String format) throws IOException { + response.setHeader("content-Type", "application/octet-stream"); + response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "utf-8")); + File file = new File(filePath); + if (file.exists()) { + System.out.println("开始下载文件"); + InputStream inputStream = new FileInputStream(file); + ServletOutputStream ouputStream = response.getOutputStream(); + byte b[] = new byte[1024]; + int n; + while ((n = inputStream.read(b)) != -1) { + ouputStream.write(b, 0, n); + } + ouputStream.close(); + inputStream.close(); + } + + } + + public static void setResponseExcelHeader(HttpServletResponse response, String fileName) throws UnsupportedEncodingException { + response.setHeader("content-Type", "application/octet-stream"); + response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName + ".xlsx", "utf-8")); + + } + + public static void eecExcel(String fileName, ListSheet sheet, HttpServletResponse response) throws IOException { + setResponseExcelHeader(response, fileName); + new Workbook().addSheet(sheet + ).writeTo(response.getOutputStream()); + + } + + /** + * 行读取excel sheet 0 + * + * @param hanlder + * @param inputStream + */ + public static void iteratorRead(BiConsumer hanlder, InputStream inputStream, Class cls, U u) { + try (ExcelReader reader = ExcelReader.read(inputStream)) { + Sheet sheet = reader.sheet(0); + Iterator ite = sheet.iterator(); + while (ite.hasNext()) { + hanlder.accept(ite.next().to(cls), u); + } + } catch (IOException e) { + throw new NflgBusinessException(STATE.BusinessError, "读取EXCEL 失败:" + e.getMessage()); + } + } + + + /** + * 获取EXCEL 所有内容 + * + * @param inputStream + * @param clc + * @param + * @return + * @throws IOException + */ + public static List getExcelContext(InputStream inputStream, Class clc) throws IOException { + try { + return ExcelReader.read(inputStream) + .sheet(0) + .dataRows() // 所有数据列,会过滤掉表头 + .map(row -> row.to(clc))// 列数据转Stock对象 + .collect(Collectors.toList());// 转为对象数组 + + } catch (Exception e) { + throw new NflgBusinessException(STATE.BusinessError, "读取EXCEL 失败,请检查模板是否正确:" + e.getMessage()); + } + + } + + /** + * 每行excel 做处理 + * + * @param inputStream + * @param clc + * @param handler + * @param + * @param + * @return + */ + public static List handlerExcel(InputStream inputStream, Class clc, Consumer handler) { + + try (ExcelReader reader = ExcelReader.read(inputStream)) { + + reader.sheet(0).dataRows().map(row-> row.to(clc) +// T t= row.too(clc); +// t.setRowNum(row.getRowNum()); +// return t ; + ).forEach(u -> { + if(handler!=null) { + handler.accept(u); + } + }); + } catch (IOException e) { + throw new NflgBusinessException(STATE.ParamErr, "excel 解析失败,请检查模板是否正确"); + } + + return null; + } + + + + + + /** + * 获取sheet名称 + * @param inputStream + * @return + */ + public static String getSheetName(InputStream inputStream){ + try (ExcelReader reader = ExcelReader.read(inputStream)) { + return reader.sheet(0).getName(); + } catch (IOException e) { + throw new NflgBusinessException(STATE.ParamErr, "excel 解析失败,请检查模板是否正确"); + } + } + + /** + * 去除excel单元格中的空格,excel导入时的字符串空格ASCII值为160,而空格(space)的ASCII值是32 + * + * @return + */ + public static String StringTrim(String str) { + return str.replaceAll("[\\s\\u00A0]+", "").trim(); + } +}