后端给前端导出 数据excal表

pom

       <!-- 读取文档 -->

        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>3.15</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>3.15</version>
        </dependency>

代码

 @GetMapping("exportData")
    public void exportData(HttpServletResponse response) {

        // 1. 创建工作空间
        Workbook workbook = new XSSFWorkbook(); // .xlsx 用 XSSFWorkbook
//        Workbook workbook = new HSSFWorkbook(); // .xls 用 HSSFWorkbook

        // 2. 创建工作表
        Sheet sheet = workbook.createSheet("信息");
        // 2.1 创建标题行(第一行)
        Row headerRow = sheet.createRow(0);


        /* 3. 定义一个字体(建议将定义字体这段代码,提取出来进行封装,后续可以定义各式各样的的字体) */
        // 3.1 创建字体
        Font headerFont = workbook.createFont();
        // 3.2 14号大小
        headerFont.setFontHeightInPoints((short) 14);


        /* 4. 声明样式 CellStyle,并设置 */
        // 4.1 创建 style
        CellStyle style = workbook.createCellStyle();
        // 4.2 将字体设置进 style 对象中
        style.setFont(headerFont);
        // 4.3 水平和垂直居中
        style.setAlignment(HorizontalAlignment.CENTER);
        style.setVerticalAlignment(VerticalAlignment.CENTER);

        /* 设置列宽和表头样式 */
        String[] headers = {"列表", "激活码",  "是否使用", "使用用户", "创建人","激活码类型", "创建时间", "激活时间", "到期时间"};
        for (int i = 0; i < headers.length; i++) {
            // 设置每一列的宽度
            sheet.setColumnWidth(i, 230 * 30);
            // 设置每一列的 style 和 标题
            Cell headerCell = headerRow.createCell(i);
            headerCell.setCellStyle(style);
            headerCell.setCellValue(headers[i]);
        }

        /* 读取数据  */
        List<returnnames> list = selectMemberEffectCode(null,null,null,null,null,null);


        /* 遍历 */
        for (int j = 0; j < list.size(); j++) {
            Row row = sheet.createRow(j + 1);
            for (int i = 0; i < headers.length; i++) {
                Cell cell = row.createCell(i);
                // 每一列的数据与表头对应上
                if (i == 0) {
                    cell.setCellValue(j+1);
                } else if (i == 1) {
                    cell.setCellValue(list.get(j).getCode());
                } else if (i == 2) {
                    cell.setCellValue(list.get(j).getIsuse()?"已使用":"未使用");
                } else if (i == 3) {
                    cell.setCellValue(list.get(j).getNickname());
                } else if (i == 4) {
                    cell.setCellValue(list.get(j).getCreateby());
                }else if (i == 5) {
                    Integer type = list.get(j).getType();
                    if (type==1){
                        cell.setCellValue("年卡");
                    }else if (type==2){
                        cell.setCellValue("月卡");
                    }else {
                        cell.setCellValue("永久卡");
                    }
                } else if (i == 6) {
                    cell.setCellValue(list.get(j).getCreatedTime());
                } else if (i == 7) {
                    cell.setCellValue(list.get(j).getActivatedTime());
                } else  {
                    cell.setCellValue(list.get(j).getExpiredTime());
                }

                // 这里将每一数据行的样式设置成和表头样式一样的,建议将 style 样式进行封装,根据不同的需求获取不同的样式
                cell.setCellStyle(style);
            }
        }

        try (OutputStream osOut = response.getOutputStream()) {
            // 设置响应类型与编码
            response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("激活码表.xlsx", "UTF-8"));
            response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8");  // .xlsx 用这个
//            response.setContentType("application/vnd.ms-excel;charset=utf-8"); // .xls 用这个
            response.setCharacterEncoding("utf-8");

            // 将指定的字节写入此输出流
            workbook.write(osOut);
            // 刷新此输出流并强制将所有缓冲的输出字节被写出
            osOut.flush();
            // 关闭流
            osOut.close();
            workbook.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

结果图
在这里插入图片描述
在这里插入图片描述

参考文章

  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,那么您可以使用Apache POI库来实现Excel导出,同时结合Spring Boot的响应体ResponseBody和HTTP状态码来实现导出Excel成功时返回Blob,失败时返回指定报错信息的功能。 具体实现步骤如下: 1. 后端使用Apache POI库创建Excel文件并写入数据。 2. 在Controller中定义一个导出Excel的接口,使用ResponseBody注解将Excel的二进制流写入响应体中,并设置Content-Type为application/vnd.ms-excel,这样前端就可以直接下载Excel文件。 3. 如果导出Excel遇到异常,可以使用try-catch语句捕获异常,并返回指定的报错信息。 4. 可以通过HTTP状态码来进一步标识导出Excel的结果,例如导出成功时返回200状态码,失败时返回500状态码。 下面是一个简单的示例代码,仅供参考: ```java @RestController public class ExcelController { @GetMapping("/exportExcel") public ResponseEntity<byte[]> exportExcel() { try { // 使用Apache POI创建Excel文件并写入数据 Workbook wb = new HSSFWorkbook(); Sheet sheet = wb.createSheet("sheet1"); Row row = sheet.createRow(0); Cell cell = row.createCell(0); cell.setCellValue("Hello World!"); // 将Excel的二进制流写入响应体中 ByteArrayOutputStream out = new ByteArrayOutputStream(); wb.write(out); HttpHeaders headers = new HttpHeaders(); headers.setContentDispositionFormData("attachment", "example.xls"); headers.setContentType(MediaType.APPLICATION_OCTET_STREAM); return new ResponseEntity<>(out.toByteArray(), headers, HttpStatus.OK); } catch (Exception e) { // 如果导出Excel遇到异常,返回指定的报错信息 return new ResponseEntity<>("导出Excel失败", HttpStatus.INTERNAL_SERVER_ERROR); } } } ``` 在前端中,您可以使用axios或其他HTTP库来调用后端导出Excel接口,例如: ```javascript axios.get('/exportExcel') .then(response => { // 导出Excel成功,使用Blob对象创建一个URL并下载Excel文件 let url = URL.createObjectURL(new Blob([response.data])); let link = document.createElement('a'); link.style.display = 'none'; link.href = url; link.setAttribute('download', 'example.xls'); document.body.appendChild(link); link.click(); }) .catch(error => { // 导出Excel失败,展示错误信息 console.error(error.response.data); alert('导出Excel失败'); }); ``` 这样就可以实现导出Excel成功时返回Blob,失败时返回指定报错信息的功能了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zzsaixuexi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值