使用easyexcel完成导出功能

使用EasyExcel导出Excel数据
该博客介绍了如何使用EasyExcel库在Java中导出Excel数据。首先在pom.xml中添加EasyExcel的依赖,然后在Controller中设置响应头和内容类型,并调用service获取数据。通过Java 8的Stream流处理数据,过滤掉空值,再将数据转换为UserBo对象。最后设置Excel文件名,使用EasyExcel的write方法写入数据并下载。注意设置实体类的注解以自定义Excel样式。
  1. 先在pom文件里面导入jar包
		<!--版本号根据你项目而定-->
		<dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>2.2.6</version>
        </dependency>
2.可以开始写代码逻辑了
	@GetMapping("/testExport")
    public void listHospitalIllness(HttpServletResponse response) {
        try {
        	//  设置内容格式 以及 编码方式
            response.setContentType("application/vnd.ms-excel");
            response.setCharacterEncoding("utf-8");
            //   调用service去获取数据
            List<UserPo>  resultList= exportService.selectAll();
            //  使用java8新特性的stream流去处理数据,把空的数据过滤掉
            List<UserBo> resultBo = resultList.stream().filter(Objects::nonNull)
                    .map(t -> {
                        return UserBo.builder()
                                .name(t.getName())
                                .sex(t.getSex())
                                .age(t.getAge())

                                .build();
                    }).collect(Collectors.toList());
            //  设置文件名称
            // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
            String fileName = URLEncoder.encode("测试导出", "UTF-8");
            response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
            //  sheet名称
            EasyExcel.write(response.getOutputStream(), UserBo.class).sheet("测试导出").doWrite(resultBo);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

3、userPo是返回的实体类

@Data
@AllArgsConstructor
@NoArgsConstructor
public class UserPo {

    private String Id;

    private String name;

    private String sex;

    private String age;
}

4、userBo是导出excel需要用的实体

@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
//内容高度
@ContentRowHeight(25)
//表头行高度
@HeadRowHeight(25)
//列的宽度
@ColumnWidth(25)
public class UserBo {

	//表头名称
    @ExcelProperty("姓名")
    private String name;

    @ExcelProperty("性别")
    private String sex;

    @ExcelProperty("年龄")
    private String age;
}

5、直接上输出结果

在这里插入图片描述
这都是在上面可以设置的,具体可以查看第二步骤 controller里面的注释
easyexcel的默认样式是表头加粗,至于@Data和其他实体类上的注解 不起作用的话,记得下载lombok插件
基本步骤就是这样的,祝你们成功!

<think>我们正在使用MagicAPI,这是一个基于Java的接口快速开发框架。用户希望在MagicAPI中使用EasyExcel实现数据导出功能。 根据用户提供的上下文,我们得知: - 后端运行在localhost:8080,MagicAPI的开发页面在/magic/web/index.html - 需要配置数据库等信息,但我们现在关注的是导出功能 步骤: 1. 添加EasyExcel依赖到项目中(Maven项目) 2. 在MagicAPI中编写一个接口,该接口使用EasyExcel将数据写入HttpServletResponse的输出流 3. 前端通过访问该接口实现文件下载 由于MagicAPI支持直接编写Java代码,我们可以使用`<!-- java -->`标签嵌入Java代码。 具体步骤: 步骤1:在pom.xml中添加EasyExcel依赖 如果项目还没有引入EasyExcel,需要在pom.xml中添加: ```xml <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>3.1.1</version> <!-- 请使用最新版本 --> </dependency> ``` 步骤2:在MagicAPI中创建接口 在MagicAPI的开发页面中,创建一个新的接口,选择POST或GET(根据情况,一般导出用GET),然后编写脚本。 注意:MagicAPI中可以直接使用Java代码,并且可以通过`import`语句导入所需的类。 示例脚本: ```java <!-- java --> import com.alibaba.excel.EasyExcel; import com.alibaba.excel.ExcelWriter; import com.alibaba.excel.write.metadata.WriteSheet; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.net.URLEncoder; import java.util.ArrayList; import java.util.List; // 假设我们要导出的数据是一个用户列表,这里用一个内部类表示(实际使用中替换为你的实体类) public class User { private String name; private Integer age; // 构造方法、getter和setter省略,实际需要加上 } // 获取HttpServletResponse对象 HttpServletResponse response = context.getResponse(); // 设置响应内容类型和头信息 response.setContentType("application/vnd.ms-excel"); response.setCharacterEncoding("utf-8"); String fileName = URLEncoder.encode("用户列表", "UTF-8"); response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx"); // 模拟数据(实际应从数据库获取) List<User> userList = new ArrayList<>(); userList.add(new User("张三", 20)); userList.add(new User("李四", 22)); // 使用EasyExcel将数据写入响应输出流 EasyExcel.write(response.getOutputStream(), User.class).sheet("用户信息").doWrite(userList); // 注意:在MagicAPI中,我们不需要手动返回,因为数据已经写入响应流 return null; // 这里返回null,表示我们不使用MagicAPI的默认响应,而是自己处理响应 ``` 步骤3:测试接口 在MagicAPI中保存并运行该接口,前端可以通过访问该接口的URL来下载Excel文件。 注意事项: - 实际开发中,需要替换User类为你自己的数据模型,并确保有对应的getter和setter。 - 数据来源应该是数据库查询,这里只是模拟数据。 - 如果数据量很大,可以考虑分页查询并分批次写入,避免内存溢出。 关于从数据库查询数据,可以在MagicAPI中调用Mapper或Service(如果项目整合了MyBatis等),这里不再展开。 如果用户需要更详细的步骤(如整合MyBatis查询数据),可以进一步说明。 由于用户需求是导出功能,上述代码已经实现了基本导出。但请注意,在MagicAPI中,我们通常使用脚本形式,所以需要将Java代码放在`<!-- java -->`标签内。 另外,MagicAPI也支持使用Groovy脚本,但这里我们使用Java。 下面是一个在MagicAPI中完整的接口配置示例(在MagicAPI开发页面中): - 请求路径:/export/user - 请求方法:GET - 脚本内容:如上Java代码 最后,用户在前端访问 http://localhost:8080/export/user 即可下载Excel文件。 如果遇到问题,请检查: - 依赖是否添加正确 - 响应头设置是否正确 - 数据模型是否与写入的类一致 根据用户提供的引用信息,系统使用了Spring Boot,所以上述代码在Spring Boot环境下是可行的。 生成相关问题: 1. 如何在MagicAPI中连接数据库查询数据并导出? 2. 使用EasyExcel导出大数据量时如何避免内存溢出? 3. 如何在前端调用MagicAPI的导出接口?</think>在MagicAPI中使用EasyExcel实现数据导出功能,可以通过以下步骤完成: ### 一、添加依赖 在项目的`pom.xml`中添加EasyExcel依赖: ```xml <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>3.3.1</version> <!-- 使用最新稳定版 --> </dependency> ``` ### 二、创建导出接口 在MagicAPI开发页面(`http://localhost:8080/magic/web/index.html`)新建接口: ```java <!-- java --> import com.alibaba.excel.EasyExcel; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.net.URLEncoder; import java.util.ArrayList; import java.util.List; // 1. 定义数据模型(示例) public class UserExport { @ExcelProperty("姓名") private String name; @ExcelProperty("年龄") private Integer age; // 构造方法/getters/setters } // 2. 获取HttpServletResponse HttpServletResponse response = context.getResponse(); // 3. 设置响应头 response.setContentType("application/vnd.ms-excel"); response.setCharacterEncoding("utf-8"); String fileName = URLEncoder.encode("用户数据", "UTF-8"); response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx"); // 4. 模拟数据(替换为真实数据源) List<UserExport> dataList = new ArrayList<>(); dataList.add(new UserExport("张三", 25)); dataList.add(new UserExport("李四", 30)); // 5. 写入ExcelEasyExcel.write(response.getOutputStream(), UserExport.class) .sheet("用户列表") .doWrite(dataList); return null; // 禁用默认响应 ``` ### 三、接口配置说明 1. **请求方式**:GET/POST 2. **访问路径**:如`/export/users` 3. **响应处理**: - 设置`Content-disposition`实现文件下载 - 通过`response.getOutputStream()`直接写入流 - 返回`null`避免MagicAPI重复输出响应 ### 四、前端调用 前端通过链接或按钮触发下载: ```html <a href="http://localhost:8080/export/users" download>导出用户数据</a> ``` 或使用AJAX: ```javascript fetch('/export/users') .then(res => res.blob()) .then(blob => { const url = URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; a.download = '用户数据.xlsx'; a.click(); }); ``` ### 五、数据库数据导出(进阶) 替换模拟数据为真实数据库查询: ```java <!-- java --> import org.springframework.jdbc.core.JdbcTemplate; // 获取Spring管理的JdbcTemplate JdbcTemplate jdbcTemplate = applicationContext.getBean(JdbcTemplate.class); List<UserExport> dataList = jdbcTemplate.query( "SELECT name, age FROM sys_user", (rs, rowNum) -> new UserExport(rs.getString("name"), rs.getInt("age")) ); ``` ### 六、常见问题解决 1. **中文乱码**: ```java response.setHeader("Content-disposition", "attachment;filename*=UTF-8''" + fileName + ".xlsx"); ``` 2. **内存溢出**: ```java // 分页查询写入(百万级数据) ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).build(); WriteSheet sheet = EasyExcel.writerSheet("大数据").head(UserExport.class).build(); for (int page = 0; ; page++) { List<UserExport> chunk = queryChunk(page, 5000); // 分页查询 if(chunk.isEmpty()) break; excelWriter.write(chunk, sheet); } excelWriter.finish(); ``` 3. **动态表头**: ```java List<List<String>> head = Arrays.asList( Arrays.asList("基本信息", "姓名"), Arrays.asList("基本信息", "年龄") ); EasyExcel.write(stream) .head(head) .sheet().doWrite(data); ``` > **注意事项**: > 1. 确保MagicAPI配置了正确的数据库连接(`application-dev.yml`) > 2. 导出大量数据时建议使用分页查询 > 3. 生产环境需添加权限验证(在接口顶部添加`?('admin'==#session.user.role)`) [^1]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值