java最简单的导出excel 表格(一学就会)

16.Excel导出数据(一学就会)

① 导入 Hutool 和 poi 的依赖(版本不易太低)

     
       <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
        </dependency>
       <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>5.2.2</version>
        </dependency>

② 前端 只需要一个a标签即可

 <a href="/api/export">导出excel</a>

③ 准备 sql 脚本 表名为users

/*
 Navicat Premium Data Transfer

 Source Server         : 123
 Source Server Type    : MySQL
 Source Server Version : 80029 (8.0.29)
 Source Host           : 192.168.11.30:3306
 Source Schema         : mall

 Target Server Type    : MySQL
 Target Server Version : 80029 (8.0.29)
 File Encoding         : 65001

 Date: 14/03/2024 16:22:41
*/

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for users
-- ----------------------------
DROP TABLE IF EXISTS `users`;
CREATE TABLE `users`  (
  `id` int NOT NULL AUTO_INCREMENT,
  `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
  `age` int NULL DEFAULT NULL,
  `sex` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of users
-- ----------------------------
INSERT INTO `users` VALUES (1, '11', 11, '11');
INSERT INTO `users` VALUES (2, '22', 22, '22');

SET FOREIGN_KEY_CHECKS = 1;

④ 准备实体类 Users

package com.beiyou.model;
import lombok.Data;
/**
* 用户表;
* @date : 2024-3-1
*/
@Data
public class Users {
   private Integer id ;
   private String name ;
   private Integer age ;
   private String sex ;
}

⑤ UsersController

package com.beiyou.controller;

import cn.hutool.poi.excel.ExcelUtil;
import cn.hutool.poi.excel.ExcelWriter;
import com.beiyou.service.UsersService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import com.beiyou.model.*;
import com.beiyou.service.UserService;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.List;
import java.util.stream.Collectors;

@RestController
@RequestMapping("/api/export")
public class UsersController{
    @Autowired
    private UsersService usersService;
    /**
     * 导出Excel
     * @param response
     * @throws IOException
     */
    @GetMapping
    public void exportExcel(HttpServletResponse response) throws IOException {
        // 创建Excel写入器   参数 true 表示追加数据,即在已有的 Excel 文件上追加新数据。如果设为 false,则会覆盖已有的数据。
        List<Users> users = usersService.selectAll();
        // 创建ExcelWriter对象
        ExcelWriter writer = ExcelUtil.getWriter(true);
        int i = 0;
        while (true) {
            List<Users> list = users.stream().skip(i * 100000).limit(100000).parallel().collect(Collectors.toList());
            if (list.isEmpty()) {
                break;
            }
            writer.setSheet("users" + i);
            // 写入表头
            writer.addHeaderAlias("id", "Id");
            writer.addHeaderAlias("name", "姓名");
            writer.addHeaderAlias("age", "年龄");
            writer.addHeaderAlias("sex", "性别");
            // 写入当前批次的数据
            writer.write(list, true);
            i++;
        }
        //response为HttpServletResponse对象   设置响应的内容类型为Excel文件
//        response.setContentType("application/xlsx;charset=utf-8");
        response.setCharacterEncoding("UTF-8");

        //test.xls是弹出下载对话框的文件名,不能为中文,中文请自行编码
        //设置响应头,告诉浏览器以附件形式下载文件,文件名为test.xlsx。这样设置可以让浏览器弹出文件下载对话框。
        /**
         * 这种会导致中文表明变下划线
         */
//        response.setHeader("Content-Disposition", "attachment;filename="+"哈哈.xlsx");
        /**
         * 这种不会
         */
        response.setHeader("Content-Disposition", "attachment;filename=" + java.net.URLEncoder.encode("学生评教数据导出表.xlsx", "UTF-8"));
        //获取响应输出流,它是用于将响应的数据发送给客户端的流。
        ServletOutputStream out = response.getOutputStream();
        //将Excel数据写入输出流。第二个参数为true表示追加写入,即将数据追加到已有的Excel文件中。
        writer.flush(out, true);
        writer.close();
        //关闭输出流
        out.close();
    }

}

⑥ UsersService

package com.beiyou.service;
/**
 * 用户表;(205_user)表服务实现类
 * @date : 2024-3-1
 */
@Service
@Slf4j
public class UsersService {
     
    @Autowired
    private UserDao userDao;
    public List<Users> selectAll() {
        return userDao.selectAll();
    }
}

⑦ UsersDao

    List<Users> selectAll();

⑧ UsersMapper.xml

<!--    导出excel-->
    <select id="selectAll" resultType="com.beiyou.model.Users">
        select * from users
    </select>
```![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/14c58e3f7f4344dd9a3ea21d3bcbcf55.png)

  • 13
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

今天的接口写完了吗?

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

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

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

打赏作者

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

抵扣说明:

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

余额充值