当前位置: 首页 > news >正文

导出excel文件并在页面自动下载

好久不写博客了,今天水一篇文章

依赖

            <dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-spring-boot-starter</artifactId><version>4.5.0</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.3.2</version></dependency>

导出dto 

package com.example.demo02.dto;import cn.afterturn.easypoi.excel.annotation.Excel;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;import java.io.Serializable;
import java.math.BigDecimal;@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class StockExportResDto implements Serializable {/*** 物料编码*/@Excel(name = "物料编码", orderNum = "1", needMerge = true)private String materialCode;/*** 物料名称*/@Excel(name = "物料名称", orderNum = "2", needMerge = true)private String materialName;/*** 生产日期*/@Excel(name = "生产日期", orderNum = "3", needMerge = true)private String productionDate;/*** 库存数量*/@Excel(name = "库存数量", orderNum = 4", needMerge = true)private BigDecimal inventoryQuantity;/*** 单位*/@Excel(name = "单位", orderNum = "5", needMerge = true)private String unit;/*** 库存类型*/@Excel(name = "库存类型", orderNum = "6", needMerge = true)private String stockType;}

controller层代码 

package com.example.demo02.controller;import cn.afterturn.easypoi.excel.ExcelExportUtil;
import cn.afterturn.easypoi.excel.entity.ExportParams;
import cn.afterturn.easypoi.excel.entity.enmus.ExcelType;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateUtil;
import cn.hutool.json.JSONUtil;
import com.example.demo02.dto.StockExportResDto;
import com.example.demo02.dto.StockListReqDto;
import com.example.demo02.enums.StockTypeEnum;
import com.example.demo02.service.StockService;
import com.example.demo02.util.ExcelUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Arrays;
import java.util.Date;
import java.util.List;/*** <p>*物料库存表 前端控制器* </p>*/
@Slf4j
@RestController
@RequestMapping("/stock")
public class StockController {@Autowiredprivate StockService stockService;//    @OpLog(code = BF, title = "库存-导出", businessType = BusinessTypeEnum.OTHER, isSaveRequestData = true, isSaveResponseData = true)  //操作日志可忽略@RequestMapping(value = "/export", method = RequestMethod.GET)public void export(HttpServletResponse response, StockListReqDto reqDto) {log.info("StockController.export 库存-导出开始。param:{}", JSONUtil.toJsonStr(reqDto));try {if (reqDto == null || reqDto.getType() == null) {throw new RuntimeException("参数错误");   //自己系统里的异常如果有封装的话用自己系统封装的异常}List<StockExportResDto> inventoryExportDtos = stockService.export(reqDto);StockTypeEnum stockTypeEnum = StockTypeEnum.findByValue(reqDto.getType());if (stockTypeEnum == null) {throw new RuntimeException("参数错误");   //自己系统里的异常如果有封装的话用自己系统封装的异常}String fileName = stockTypeEnum.getDesc() + "库存导出-" + DateUtil.format(new Date(), DatePattern.NORM_DATE_PATTERN);Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(null, null, ExcelType.XSSF), StockExportResDto.class, inventoryExportDtos);ExcelUtils.setHeaderStyle(workbook, Arrays.asList(workbook.getSheetAt(0).getRow(0), workbook.getSheetAt(0).getRow(0)));ExcelUtils.downLoadExcel(fileName, workbook, response);} catch (IOException e) {log.error("StockController.export 库存-导出异常", e);throw new RuntimeException("导出异常: " + e.getMessage()); //自己系统里的异常如果有封装的话用自己系统封装的异常}}
}

service代码 

package com.example.demo02.service.impl;import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateUtil;
import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.demo02.dto.StockExportResDto;
import com.example.demo02.dto.StockListReqDto;
import com.example.demo02.entity.StockEntity;
import com.example.demo02.enums.StockTypeEnum;
import com.example.demo02.mapper.StockMapper;
import com.example.demo02.service.StockService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;import java.util.Comparator;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;@Service
@Slf4j
public class StockServiceImpl extends ServiceImpl<StockMapper, StockEntity> implements StockService {@Overridepublic List<StockExportResDto> export(StockListReqDto reqDto) {List<StockEntity> materialInventoryResDtos = this.list(Wrappers.lambdaQuery());log.info("物料库存导出前查询数据 {}", JSONUtil.toJsonStr(materialInventoryResDtos));List<StockExportResDto> inventoryExportDtos = materialInventoryResDtos.stream().map(stockEntity -> {StockExportResDto exportDto = new StockExportResDto();BeanUtils.copyProperties(stockEntity, exportDto);Long productionDate = stockEntity.getProductionDate();exportDto.setProductionDate(productionDate != null ? DateUtil.format(new Date(productionDate), DatePattern.NORM_DATE_PATTERN) : "");Integer stockType = stockEntity.getStockType();if (stockType != null) {StockTypeEnum stockTypeEnum = StockTypeEnum.findByValue(stockType);if (stockTypeEnum != null) {exportDto.setStockType(stockTypeEnum.getDesc());}}return exportDto;}).sorted(Comparator.comparing(StockExportResDto::getMaterialCode)).collect(Collectors.toList());log.info("库存导出数据列表:{}", JSONUtil.toJsonStr(inventoryExportDtos));return inventoryExportDtos;}
}

导出excel表头设置加粗工具类

 

package com.example.demo02.util;import com.alibaba.excel.support.ExcelTypeEnum;
import org.apache.poi.ss.usermodel.*;import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.List;/*** @Description:*/
public class ExcelUtils {/*** 下载** @param fileName 文件名称* @param response* @param workbook excel数据*/public static void downLoadExcel(String fileName, Workbook workbook, HttpServletResponse response) throws IOException {try {response.setCharacterEncoding("UTF-8");response.setHeader("content-Type", "application/vnd.ms-excel");response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName + "." + ExcelTypeEnum.XLSX.getValue(), "UTF-8"));workbook.write(response.getOutputStream());} catch (Exception e) {throw new IOException(e.getMessage());}}/*** 设置表头样式** @param workbook* @param headerRows 行*/public static void setHeaderStyle(Workbook workbook, List<Row> headerRows) {// 创建并配置单元格样式CellStyle cellStyle = workbook.createCellStyle();Font font = workbook.createFont();// 字体加粗font.setBold(true);cellStyle.setFont(font);// 背景色灰色cellStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);// 设置实线边框cellStyle.setBorderBottom(BorderStyle.THIN);cellStyle.setBorderTop(BorderStyle.THIN);cellStyle.setBorderLeft(BorderStyle.THIN);cellStyle.setBorderRight(BorderStyle.THIN);// 设置文字居中cellStyle.setAlignment(HorizontalAlignment.CENTER);cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);// 为表头行设置样式for (Row headerRow : headerRows) {for (Cell cell : headerRow) {cell.setCellStyle(cellStyle);}}}
}

导出效果 

相关文章:

  • TCP/IP、UDP、HTTP、HTTPS、WebSocket 一文讲解
  • 从零开始搭建CLIP模型实现基于文本的图像检索
  • elementUI中MessageBox.confirm()默认不聚焦问题处理
  • UML-共享汽车系统通信图深度解析
  • 蓝桥杯练习题2
  • Codeforces Educational Round 177 Div. 2 【B题,C待补
  • Unity:获取组件对象(GetComponent<T>())
  • MinnowBoard MAX单板UEFI BIOS代码编译教程
  • Spring 学习笔记之 @Transactional详解
  • 4N60-ASEMI开关电源与适配器专用4N60
  • 运筹学之遗传算法
  • Rust网络编程实战:全面掌握reqwest库的高级用法
  • QT+Cmake+mingw32-make编译64位的zlib-1.3.1源码成功过程
  • 深度学习--卷积神经网络CNN原理
  • 功能性高斯泼溅扩散——DiffGS: Functional Gaussian Splatting Diffusion
  • yolov8的数据处理lableimg的安装以及使用
  • 【更新完毕】2025华中杯C题数学建模网络挑战赛思路代码文章教学数学建模思路:就业状态分析与预测
  • Python 赋能区块链教育:打造去中心化学习平台
  • 一些C语言常用函数(后续会继续更新)
  • 力扣刷题Day 21:两数之和(1)
  • 中保协:当前普通型人身保险产品预定利率研究值为2.13%
  • 运油-20亮相中埃空军联训
  • 网信部门持续整治利用未成年人形象不当牟利问题
  • 42岁北京大学科学技术与医学史系副教授陈昊逝世
  • 地铁口被吐槽像棺材?杭州地铁公司回应:是一个标志性出入口
  • 郑州一废弃饭店堆砌物起火:明火被扑灭,未造成人员伤亡