diff --git a/nflg_project_dev/nflg-technology/pom.xml b/nflg_project_dev/nflg-technology/pom.xml index 058aaa39..1b360c6a 100644 --- a/nflg_project_dev/nflg-technology/pom.xml +++ b/nflg_project_dev/nflg-technology/pom.xml @@ -123,7 +123,11 @@ 2.2.8 - + + cn.idev.excel + fastexcel + 1.0.0 + diff --git a/nflg_project_dev/nflg-technology/src/main/java/com/nflg/product/technology/api/ProductCostAnalysisApi.java b/nflg_project_dev/nflg-technology/src/main/java/com/nflg/product/technology/api/ProductCostAnalysisApi.java index d3b8d5cb..39e35519 100644 --- a/nflg_project_dev/nflg-technology/src/main/java/com/nflg/product/technology/api/ProductCostAnalysisApi.java +++ b/nflg_project_dev/nflg-technology/src/main/java/com/nflg/product/technology/api/ProductCostAnalysisApi.java @@ -5,6 +5,7 @@ import com.nflg.product.technology.pojo.query.MaterialVersionCostQuery; import com.nflg.product.technology.pojo.query.SaveCostQuery; import com.nflg.product.technology.pojo.vo.*; import com.nflg.product.technology.service.ProductCostAnalysisService; +import com.nflg.product.technology.util.ExcelUtil; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import nflg.product.common.vo.ResultVO; @@ -12,11 +13,14 @@ import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; import javax.validation.Valid; import javax.validation.constraints.Min; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotEmpty; +import java.io.IOException; import java.math.BigDecimal; +import java.util.ArrayList; import java.util.List; /** @@ -45,18 +49,78 @@ public class ProductCostAnalysisApi extends BaseApi { return ResultVO.success(productCostAnalysisService.getHighValuePurchasedParts(materialNo, price)); } + @GetMapping("exportHighValuePurchasedParts") + @ApiOperation("导出高价值外购件") + public void exportHighValuePurchasedParts(HttpServletResponse response + , @Validated @RequestParam @NotBlank String materialNo + , @Valid @RequestParam @Min(value = 0, message = "价格应大于等于0") BigDecimal price) throws IOException { + HighValuePurchasedPartsVO vo = productCostAnalysisService.getHighValuePurchasedParts(materialNo, price); + //HighValuePurchasedPartsVO vo = new HighValuePurchasedPartsVO(); + //MaterialCostVO cost = new MaterialCostVO() + // .setMaterialNo("1100003735") + // .setPrice(new BigDecimal("5044.25")) + // .setNum(new BigDecimal("10000")) + // .setTotalPrice(new BigDecimal("18437.25")) + // .setMaterialDesc("梅花弹性联轴器 ROTEX 90 ST 98SHA 1B-32/1B-60 图号727576-0") + // .setMaterialCategoryName("梅花弹性联轴器") + // .setMaterialUnit("SET") + // .setInventory(new BigDecimal("100000")) + // .setLeadTime("100"); + //vo.getCosts().add(cost); + + ExcelUtil.export(response, vo.getCosts(), MaterialCostVO.class, materialNo + "高价值外购件", "价格高于" + price); + } + + @GetMapping("getBomCostSingleLayer") @ApiOperation("获取Bom组件成本(单层)") - public ResultVO> getBomCostSingleLayer(@Valid @RequestParam @NotBlank String materialNo) { + public ResultVO> getBomCostSingleLayer(@Valid @RequestParam @NotBlank String materialNo) { return ResultVO.success(productCostAnalysisService.getBomCostSingleLayer(materialNo)); } + @GetMapping("exportBomCostSingleLayer") + @ApiOperation("导出Bom组件成本(单层)") + public void exportBomCostSingleLayer(HttpServletResponse response + , @Valid @RequestParam @NotBlank String materialNo) throws IOException { + List vos = productCostAnalysisService.getBomCostSingleLayer(materialNo); + //List vos = new ArrayList<>(); + //BomCostSingleLayerVO vo = new BomCostMultilayerVO() + // .setMaterialNo("2100032594") + // .setMaterialDesc("六角头螺栓 M20×55 GB/T 5783 全螺纹 8.8级 镀锌 耐96H盐雾") + // .setMaterialCategoryName("梅花弹性联轴器") + // .setMaterialUnit("SET") + // .setPrice(new BigDecimal("1000.00")) + // .setNum(new BigDecimal(100)) + // .setTotalNum(new BigDecimal("10000")) + // .setTotalCost(new BigDecimal("2299.3814")); + //vos.add(vo); + + ExcelUtil.export(response, vos, BomCostSingleLayerVO.class, materialNo + "组件成本(单层)", materialNo); + } + @GetMapping("getBomCostMultilayer") @ApiOperation("获取Bom组件成本(多层)") public ResultVO getBomCostMultilayer(@Valid @RequestParam @NotBlank String materialNo) { return ResultVO.success(productCostAnalysisService.getBomCostMultilayer(materialNo)); } + @GetMapping("exportBomCostMultilayer") + @ApiOperation("导出Bom组件成本(多层)") + public void exportBomCostMultilayer(HttpServletResponse response + , @Valid @RequestParam @NotBlank String materialNo) throws IOException { + BomCostMultilayerVO vo = productCostAnalysisService.getBomCostMultilayer(materialNo); + List vos = new ArrayList<>(); + vos.add(vo); + vo.getChildren().forEach(c -> add(c, vos)); + + ExcelUtil.export(response, vos, BomCostMultilayerVO.class, materialNo + "组件成本(多层)", materialNo); + } + + private void add(BomCostMultilayerVO child, List vos) { + vos.add(child); + child.getChildren().forEach(c -> add(c, vos)); + } + @GetMapping("getMaterialComposition") @ApiOperation("查询材料组成分析(物料属性)") public ResultVO getMaterialComposition(@Valid @RequestParam @NotBlank String materialNo) { diff --git a/nflg_project_dev/nflg-technology/src/main/java/com/nflg/product/technology/pojo/vo/BomCostMultilayerVO.java b/nflg_project_dev/nflg-technology/src/main/java/com/nflg/product/technology/pojo/vo/BomCostMultilayerVO.java index f6a470b4..ef6a1b34 100644 --- a/nflg_project_dev/nflg-technology/src/main/java/com/nflg/product/technology/pojo/vo/BomCostMultilayerVO.java +++ b/nflg_project_dev/nflg-technology/src/main/java/com/nflg/product/technology/pojo/vo/BomCostMultilayerVO.java @@ -1,15 +1,17 @@ package com.nflg.product.technology.pojo.vo; -import com.fasterxml.jackson.annotation.JsonFormat; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.nflg.product.base.core.config.BigDecimalSerializer; +import cn.idev.excel.annotation.ExcelIgnore; +import cn.idev.excel.annotation.ExcelProperty; +import cn.idev.excel.annotation.write.style.*; +import cn.idev.excel.enums.poi.HorizontalAlignmentEnum; +import cn.idev.excel.enums.poi.VerticalAlignmentEnum; +import com.fasterxml.jackson.annotation.JsonIgnore; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.experimental.Accessors; import java.io.Serializable; -import java.math.BigDecimal; import java.util.ArrayList; import java.util.List; @@ -20,68 +22,20 @@ import java.util.List; @Data @Accessors(chain = true) @ApiModel(value = "com-nflg-product-technology-pojo-vo-BomCostMultilayerVO") -public class BomCostMultilayerVO implements Serializable { +@HeadStyle(horizontalAlignment = HorizontalAlignmentEnum.CENTER, verticalAlignment = VerticalAlignmentEnum.CENTER) +@ContentStyle(horizontalAlignment = HorizontalAlignmentEnum.RIGHT, verticalAlignment = VerticalAlignmentEnum.CENTER) +@HeadFontStyle(fontHeightInPoints = 10) +@ContentFontStyle(fontHeightInPoints = 10) +public class BomCostMultilayerVO extends BomCostSingleLayerVO implements Serializable { - @ApiModelProperty("物料编码") - private String materialNo; - - @ApiModelProperty("物料描述") - private String materialDesc; - - @ApiModelProperty("物料类别") - private String materialCategoryName; - - @ApiModelProperty("单位") - private String materialUnit; - - @ApiModelProperty("单件成本") - @JsonFormat(pattern = "#.##") - @JsonSerialize(using = BigDecimalSerializer.class) - private BigDecimal price; - - @ApiModelProperty("单层数量") - private BigDecimal num; - - @ApiModelProperty("累乘数量") - private BigDecimal totalNum; - - @ApiModelProperty("总成本") - @JsonFormat(pattern = "#.##") - @JsonSerialize(using = BigDecimalSerializer.class) - private BigDecimal totalCost; - - @ApiModelProperty("单件材料成本") - private String materialCost = "-"; - - @ApiModelProperty("材料成本") - private String totalMaterialCost = "-"; - - @ApiModelProperty("单件油漆成本") - private String paintCost = "-"; - - @ApiModelProperty("油漆成本") - private String totalPaintCost = "-"; - - @ApiModelProperty("单件标准人工工资") - private String directManualProductionCost = "-"; - - @ApiModelProperty("标准人工工资") - private String totalDirectManualProductionCost = "-"; - - @ApiModelProperty("单件辅助费用") - private String auxiliaryManufacturingCost = "-"; - - @ApiModelProperty("辅助费用") - private String totalAuxiliaryManufacturingCost = "-"; + @ApiModelProperty("层级") + @JsonIgnore + @ExcelProperty(value = "层级", index = 0) + @ColumnWidth(5) + @ContentStyle(horizontalAlignment = HorizontalAlignmentEnum.CENTER, verticalAlignment = VerticalAlignmentEnum.CENTER) + private Integer level; @ApiModelProperty("子物料列表") + @ExcelIgnore private List children = new ArrayList<>(); - - @ApiModelProperty("物料行id") - private Long materialRowId; - - @ApiModelProperty("是否有下级") - private boolean hasChildren = false; - - private String relCategoryCode; } diff --git a/nflg_project_dev/nflg-technology/src/main/java/com/nflg/product/technology/pojo/vo/BomCostSingleLayerVO.java b/nflg_project_dev/nflg-technology/src/main/java/com/nflg/product/technology/pojo/vo/BomCostSingleLayerVO.java index 6f2ac1f6..fe7e7435 100644 --- a/nflg_project_dev/nflg-technology/src/main/java/com/nflg/product/technology/pojo/vo/BomCostSingleLayerVO.java +++ b/nflg_project_dev/nflg-technology/src/main/java/com/nflg/product/technology/pojo/vo/BomCostSingleLayerVO.java @@ -1,5 +1,11 @@ package com.nflg.product.technology.pojo.vo; +import cn.idev.excel.annotation.ExcelIgnore; +import cn.idev.excel.annotation.ExcelProperty; +import cn.idev.excel.annotation.format.NumberFormat; +import cn.idev.excel.annotation.write.style.*; +import cn.idev.excel.enums.poi.HorizontalAlignmentEnum; +import cn.idev.excel.enums.poi.VerticalAlignmentEnum; import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.nflg.product.base.core.config.BigDecimalSerializer; @@ -18,53 +24,110 @@ import java.math.BigDecimal; @Data @Accessors(chain = true) @ApiModel(value = "com-nflg-product-technology-pojo-vo-BomCostSingleLayerVO") +@HeadStyle(horizontalAlignment = HorizontalAlignmentEnum.CENTER, verticalAlignment = VerticalAlignmentEnum.CENTER) +@ContentStyle(horizontalAlignment = HorizontalAlignmentEnum.RIGHT, verticalAlignment = VerticalAlignmentEnum.CENTER) +@HeadFontStyle(fontHeightInPoints = 10) +@ContentFontStyle(fontHeightInPoints = 10) public class BomCostSingleLayerVO implements Serializable { @ApiModelProperty("物料编码") + @ExcelProperty("物料编码") + @ColumnWidth(15) + @ContentStyle(horizontalAlignment = HorizontalAlignmentEnum.CENTER, verticalAlignment = VerticalAlignmentEnum.CENTER) private String materialNo; - @ApiModelProperty("单价") - @JsonFormat(pattern = "#.##") - @JsonSerialize(using = BigDecimalSerializer.class) - private BigDecimal price; - - @ApiModelProperty("数量") - private BigDecimal num; - - @ApiModelProperty("总价格") - @JsonFormat(pattern = "#.##") - @JsonSerialize(using = BigDecimalSerializer.class) - private BigDecimal totalPrice; - @ApiModelProperty("物料描述") + @ExcelProperty("物料描述") + @ColumnWidth(50) + @ContentStyle(horizontalAlignment = HorizontalAlignmentEnum.LEFT, verticalAlignment = VerticalAlignmentEnum.CENTER) private String materialDesc; @ApiModelProperty("物料类别") + @ExcelProperty("物料类别") + @ColumnWidth(20) + @ContentStyle(horizontalAlignment = HorizontalAlignmentEnum.LEFT, verticalAlignment = VerticalAlignmentEnum.CENTER) private String materialCategoryName; @ApiModelProperty("单位") + @ExcelProperty("单位") + @ColumnWidth(5) + @ContentStyle(horizontalAlignment = HorizontalAlignmentEnum.CENTER, verticalAlignment = VerticalAlignmentEnum.CENTER) private String materialUnit; - @ApiModelProperty("版本号") - private String version; - - @ApiModelProperty("材料总价") - @JsonFormat(pattern = "#.##") + @ApiModelProperty("单件成本") + @JsonFormat(pattern = "0.##") @JsonSerialize(using = BigDecimalSerializer.class) - private BigDecimal materialTotalPrice; + @ExcelProperty("单件成本") + @ColumnWidth(10) + @NumberFormat("0.##") + private BigDecimal price; - @ApiModelProperty("直接人工费用") - @JsonFormat(pattern = "#.##") - @JsonSerialize(using = BigDecimalSerializer.class) - private BigDecimal laborCosts; + @ApiModelProperty("单层数量") + @ExcelProperty("单层数量") + @ColumnWidth(10) + private BigDecimal num; - @ApiModelProperty("辅助制造成本") - @JsonFormat(pattern = "#.##") + @ApiModelProperty("累乘数量") + @ExcelProperty("累乘数量") + @ColumnWidth(10) + private BigDecimal totalNum; + + @ApiModelProperty("总成本") + @JsonFormat(pattern = "0.##") @JsonSerialize(using = BigDecimalSerializer.class) - private BigDecimal auxiliaryManufacturingCost; + @ExcelProperty("总成本") + @ColumnWidth(10) + @NumberFormat("0.##") + private BigDecimal totalCost; + + @ApiModelProperty("单件材料成本") + @ExcelProperty("单件材料成本") + @ColumnWidth(10) + private String materialCost = "-"; + + @ApiModelProperty("材料成本") + @ExcelProperty("材料成本") + @ColumnWidth(10) + private String totalMaterialCost = "-"; + + @ApiModelProperty("单件油漆成本") + @ExcelProperty("单件油漆成本") + @ColumnWidth(10) + private String paintCost = "-"; + + @ApiModelProperty("油漆成本") + @ExcelProperty("油漆成本") + @ColumnWidth(10) + private String totalPaintCost = "-"; + + @ApiModelProperty("单件标准人工工资") + @ExcelProperty("单件标准人工工资") + @ColumnWidth(10) + private String directManualProductionCost = "-"; + + @ApiModelProperty("标准人工工资") + @ExcelProperty("标准人工工资") + @ColumnWidth(10) + private String totalDirectManualProductionCost = "-"; + + @ApiModelProperty("单件辅助费用") + @ExcelProperty("单件辅助费用") + @ColumnWidth(10) + private String auxiliaryManufacturingCost = "-"; + + @ApiModelProperty("辅助费用") + @ExcelProperty("辅助费用") + @ColumnWidth(10) + private String totalAuxiliaryManufacturingCost = "-"; @ApiModelProperty("物料行id") + @ExcelIgnore private Long materialRowId; + @ApiModelProperty("是否有下级") + @ExcelIgnore + private boolean hasChildren = false; + + @ExcelIgnore private String relCategoryCode; } diff --git a/nflg_project_dev/nflg-technology/src/main/java/com/nflg/product/technology/pojo/vo/MaterialCostVO.java b/nflg_project_dev/nflg-technology/src/main/java/com/nflg/product/technology/pojo/vo/MaterialCostVO.java index 87214aaa..6029b8e7 100644 --- a/nflg_project_dev/nflg-technology/src/main/java/com/nflg/product/technology/pojo/vo/MaterialCostVO.java +++ b/nflg_project_dev/nflg-technology/src/main/java/com/nflg/product/technology/pojo/vo/MaterialCostVO.java @@ -1,5 +1,11 @@ package com.nflg.product.technology.pojo.vo; +import cn.idev.excel.annotation.ExcelIgnore; +import cn.idev.excel.annotation.ExcelProperty; +import cn.idev.excel.annotation.format.NumberFormat; +import cn.idev.excel.annotation.write.style.*; +import cn.idev.excel.enums.poi.HorizontalAlignmentEnum; +import cn.idev.excel.enums.poi.VerticalAlignmentEnum; import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.databind.annotation.JsonSerialize; @@ -19,22 +25,37 @@ import java.math.BigDecimal; @Data @Accessors(chain = true) @ApiModel(value = "com-nflg-product-technology-pojo-vo-MaterialCostVO") +@HeadStyle(horizontalAlignment = HorizontalAlignmentEnum.CENTER, verticalAlignment = VerticalAlignmentEnum.CENTER) +@ContentStyle(horizontalAlignment = HorizontalAlignmentEnum.RIGHT, verticalAlignment = VerticalAlignmentEnum.CENTER) +@HeadFontStyle(fontHeightInPoints = 10) +@ContentFontStyle(fontHeightInPoints = 10) public class MaterialCostVO implements Serializable { @ApiModelProperty("物料编号") + @ExcelProperty("物料编号") + @ColumnWidth(15) + @ContentStyle(horizontalAlignment = HorizontalAlignmentEnum.CENTER, verticalAlignment = VerticalAlignmentEnum.CENTER) private String materialNo; @ApiModelProperty("单价") @JsonFormat(pattern = "#.##") @JsonSerialize(using = BigDecimalSerializer.class) + @ExcelProperty("单价") + @ColumnWidth(10) + @NumberFormat("#.##") private BigDecimal price = BigDecimal.ZERO; @ApiModelProperty("数量") + @ExcelProperty("数量") + @ColumnWidth(10) private BigDecimal num = BigDecimal.ZERO; @ApiModelProperty("总价格") - @JsonFormat(pattern = "#.##") + @JsonFormat(pattern = "0.##") @JsonSerialize(using = BigDecimalSerializer.class) + @ExcelProperty("总价格") + @ColumnWidth(10) + @NumberFormat("0.##") private BigDecimal totalPrice = BigDecimal.ZERO; //public BigDecimal getTotalPrice() { @@ -42,31 +63,48 @@ public class MaterialCostVO implements Serializable { //} @ApiModelProperty("物料描述") + @ExcelProperty("物料描述") + @ColumnWidth(60) + @ContentStyle(horizontalAlignment = HorizontalAlignmentEnum.LEFT, verticalAlignment = VerticalAlignmentEnum.CENTER) private String materialDesc; @ApiModelProperty("物料类别") + @ExcelProperty("物料类别") + @ColumnWidth(30) + @ContentStyle(horizontalAlignment = HorizontalAlignmentEnum.LEFT, verticalAlignment = VerticalAlignmentEnum.CENTER) private String materialCategoryName; @ApiModelProperty("单位") + @ExcelProperty("单位") + @ColumnWidth(10) + @ContentStyle(horizontalAlignment = HorizontalAlignmentEnum.CENTER, verticalAlignment = VerticalAlignmentEnum.CENTER) private String materialUnit; @ApiModelProperty("库存") + @ExcelProperty("库存") + @ColumnWidth(10) private BigDecimal inventory = BigDecimal.ZERO; @ApiModelProperty("交期") + @ExcelProperty("交期") + @ColumnWidth(10) private String leadTime; @ApiModelProperty("物料行id") + @ExcelIgnore private Long materialRowId; + @ExcelIgnore private String relCategoryCode; /** * 是否外购件 */ @JsonIgnore + @ExcelIgnore private boolean isPurchasedParts; @JsonIgnore + @ExcelIgnore private String categoryCode; } diff --git a/nflg_project_dev/nflg-technology/src/main/java/com/nflg/product/technology/service/ProductCostAnalysisService.java b/nflg_project_dev/nflg-technology/src/main/java/com/nflg/product/technology/service/ProductCostAnalysisService.java index aef8c3f0..3a68a320 100644 --- a/nflg_project_dev/nflg-technology/src/main/java/com/nflg/product/technology/service/ProductCostAnalysisService.java +++ b/nflg_project_dev/nflg-technology/src/main/java/com/nflg/product/technology/service/ProductCostAnalysisService.java @@ -1,6 +1,7 @@ package com.nflg.product.technology.service; import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.convert.Convert; import cn.hutool.core.util.StrUtil; import com.nflg.product.technology.constant.BomConstant; import com.nflg.product.technology.pojo.dto.EBomCostCacheDTO; @@ -47,7 +48,7 @@ public class ProductCostAnalysisService { @Resource private BomCostService bomCostService; - public List getBomCostSingleLayer(String materialNo) { + public List getBomCostSingleLayer(String materialNo) { List datas = bomCostCalculateService.calculate(materialNo); if (CollectionUtil.isEmpty(datas)) { return Collections.emptyList(); @@ -58,7 +59,7 @@ public class ProductCostAnalysisService { vo.setTotalNum(BigDecimal.ONE); vo.setHasChildren(true); buildMultilayerChildren(parent.getRowId(), vo, materials, datas, false); - return vo.getChildren(); + return Convert.toList(BomCostSingleLayerVO.class, vo.getChildren()); } public BomCostMultilayerVO getBomCostMultilayer(String materialNo) { @@ -71,6 +72,7 @@ public class ProductCostAnalysisService { BomCostMultilayerVO vo = new BomCostMultilayerVO(); vo.setMaterialNo(parent.getMaterialNo()); vo.setHasChildren(true); + vo.setLevel(1); EBomDTO pm = materials.stream().filter(m -> StrUtil.equals(m.getMaterialNo(), parent.getMaterialNo())).findFirst().orElse(null); if (Objects.nonNull(pm)) { vo.setMaterialDesc(pm.getMaterialDesc()); @@ -104,6 +106,9 @@ public class ProductCostAnalysisService { if (!StrUtil.equals(child.getProjectType(), BomConstant.PROJECT_TYPE_TEMPORARY)) { BomCostMultilayerVO cvo = new BomCostMultilayerVO(); cvo.setMaterialNo(child.getMaterialNo()); + if (Objects.nonNull(pvo.getLevel())) { + cvo.setLevel(pvo.getLevel() + 1); + } EBomDTO cpm = materials.stream().filter(m -> StrUtil.equals(m.getMaterialNo(), child.getMaterialNo())).findFirst().orElse(null); if (Objects.nonNull(cpm)) { cvo.setMaterialDesc(cpm.getMaterialDesc()); diff --git a/nflg_project_dev/nflg-technology/src/main/java/com/nflg/product/technology/util/ExcelUtil.java b/nflg_project_dev/nflg-technology/src/main/java/com/nflg/product/technology/util/ExcelUtil.java new file mode 100644 index 00000000..66afd3d5 --- /dev/null +++ b/nflg_project_dev/nflg-technology/src/main/java/com/nflg/product/technology/util/ExcelUtil.java @@ -0,0 +1,22 @@ +package com.nflg.product.technology.util; + +import cn.idev.excel.FastExcel; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; + +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.net.URLEncoder; +import java.util.List; + +public class ExcelUtil { + + public static void export(HttpServletResponse response, List data, Class clazz, String fileName, String sheetName) throws IOException { + response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE); + fileName = URLEncoder.encode(fileName, "UTF-8").replaceAll("\\+", "%20"); + response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename*=utf-8''" + fileName + ".xlsx"); + FastExcel.write(response.getOutputStream(), clazz) + .sheet(sheetName) + .doWrite(data); + } +}