EasyExcel web动态表格导出

使用EasyExcel动态导出无对象模型的数据
该博客主要介绍了如何在Java中利用EasyExcel库实现动态表头的Excel导出,无需预先创建实体类。内容包括从JSON数据中解析表单字段,封装表头和数据,以及处理动态无对象的数据写入Excel的过程。示例代码详细展示了整个流程,适用于需要动态导出数据的场景。

场景:

需求:动态表头,web导出
实体类不适应,可以用EasyExcel提供的不创建对象写出

表单字段表:

结果表:
在这里插入图片描述
form_content内容实例:(需要取出的是value的值)

[
    {
        "id": 45,
        "activityId": 165353669805091,
        "formField": "姓名",
        "inputType": 0,
        "value": "1",
        "ztAppValue": "姓名:1\n"
    },
    {
        "id": 46,
        "activityId": 165353669805091,
        "formField": "联系方式",
        "inputType": 0,
        "value": "1",
        "ztAppValue": "联系方式:1\n"
    },
    {
        "id": 47,
        "activityId": 165353669805091,
        "formField": "爱好",
        "inputType": 2,
        "optionContent": [
            "吃饭",
            "睡觉",
            "打豆豆"
        ],
        "value": [
            "睡觉"
        ],
        "ztAppValue": "爱好:睡觉"
    },
    {
        "id": 48,
        "activityId": 165353669805091,
        "formField": "性别",
        "inputType": 1,
        "optionContent": [
            "男",
            "女"
        ],
        "value": "女",
        "ztAppValue": "性别:女\n"
    },
    {
        "id": 49,
        "activityId": 165353669805091,
        "formField": "学科",
        "inputType": 2,
        "optionContent": [
            "语",
            "数",
            "英",
            "物",
            "化"
        ],
        "value": [
            "数"
        ],
        "ztAppValue": "学科:数"
    },
    {
        "id": 50,
        "activityId": 165353669805091,
        "formField": "不良嗜好",
        "inputType": 1,
        "optionContent": [
            "睡觉",
            "打豆豆",
            "磨牙"
        ],
        "value": "打豆豆",
        "ztAppValue": "不良嗜好:打豆豆\n"
    },
    {
        "id": 51,
        "activityId": 165353669805091,
        "formField": "学生身份证",
        "inputType": 0,
        "optionContent": "352314200305028375",
        "value": "1",
        "ztAppValue": "学生身份证:1\n"
    },
    {
        "id": 52,
        "activityId": 165353669805091,
        "formField": "父亲姓名",
        "inputType": 0,
        "optionContent": "张三",
        "value": "1",
        "ztAppValue": "父亲姓名:1\n"
    },
    {
        "id": 53,
        "activityId": 165353669805091,
        "formField": "父亲电话",
        "inputType": 0,
        "optionContent": "12387324635",
        "value": "1",
        "ztAppValue": "父亲电话:1\n"
    }
]

注意点:

  1. 表头、数据封装成以下形式
//封装表头
List<List<String>> headList = new ArrayList<>();
//封装数据
List<List<String>> data = new ArrayList<>();
  1. 表单list长度必须和一条数据List长度对应

代码:

@RequestMapping(value = "/exportData", method = RequestMethod.GET)
    public Map<String, Object> exportData(Long activityId,HttpServletResponse response) throws Exception {

        try {
            response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
            response.setCharacterEncoding("utf-8");
            // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
            String fileName = URLEncoder.encode("活动报名表", "UTF-8").replaceAll("\\+", "%20");
            response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");

            // 取表头
            // 查出数据库的表头字段
            List<ActivityForm> activityFormList = activityFormService.getByActivityId(activityId);
            List<String> fieldList = new ArrayList<>();
            for (ActivityForm activityForm : activityFormList) {
                fieldList.add(activityForm.getFormField());
            }

            // 封装表头
            List<List<String>> headList = new ArrayList<>();
            for (String str : fieldList) {
                List<String> head = new ArrayList<>();
                head.add(str);
                headList.add(head);
            }
            List<String> head0 = new ArrayList<>();
            head0.add("报名状态");
            List<String> head1 = new ArrayList<>();
            head1.add("签到");
            List<String> head2 = new ArrayList<>();
            head2.add("签退");
            headList.add(head0);
            headList.add(head1);
            headList.add(head2);


            // 动态无对象封装数据
            List<List<String>> data = new ArrayList<>();

            // 将所有的formContent数据封装成一个list
            List<ActivityFormResult> resultList = activityFormResultService.getResultListExcel(activityId);
            List<String> resultString = new ArrayList<>();
            for (ActivityFormResult activityFormResult : resultList) {
                String formContent = activityFormResult.getFormContent();
                resultString.add(formContent);
            }


            for (int i = 0; i < resultList.size(); i++) {
                // 处理formContent数据
                JSONArray jsonArray = JSONArray.fromObject(resultString.get(i));
                List<String> valueList = new ArrayList<>();
                for (int j = 0; j < jsonArray.size(); j++) {
                    JSONObject jsonObject = jsonArray.getJSONObject(j);
                    Object value = jsonObject.get("value");
                    valueList.add(value.toString());

                }
                // 处理固定字段:报名状态、签到、签退
                valueList.add(resultList.get(i).getAuthState().toString());
                if (resultList.get(i).getSignIn() != null) {
                    valueList.add(resultList.get(i).getSignIn().toString());
                } else {
                    valueList.add("");
                }
                if (resultList.get(i).getSignOff() != null) {
                    valueList.add(resultList.get(i).getSignOff().toString());
                } else {
                    valueList.add("");
                }
                data.add(valueList);
            }

            // 写出Excel
            EasyExcel.write(response.getOutputStream())
                    .autoCloseStream(Boolean.FALSE)
                    .head(headList)
                    .sheet("data")
                    .doWrite(data);

            resultMap.put("status", 200);
            resultMap.put("message", "请求成功!");
        } catch (Exception e) {
            response.reset();
            response.setContentType("application/json");
            response.setCharacterEncoding("utf-8");
            resultMap.put("status", 500);
            resultMap.put("message", "请求失败!");
            LoggerUtils.fmtError(getClass(), e, "请求失败。");
        }

        return resultMap;
    }
<think>我们正在使用EasyExcel库在Java导出数据到Excel。以下是一个基本的步骤指南和示例代码。 ### 步骤 1. **添加依赖**:首先,在项目的`pom.xml`中添加EasyExcel的依赖。 2. **创建数据模型**:定义一个Java类,用于表示要导出的数据,并使用注解来标记Excel的列。 3. **编写导出方法**:创建一个方法,用于将数据写入Excel文件。 ### 示例代码 #### 1. 添加Maven依赖 ```xml <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>3.1.1</version> <!-- 请检查最新版本 --> </dependency> ``` #### 2. 创建数据模型类 假设我们要导出一个学生信息的表格,包含学号、姓名和成绩。 ```java import com.alibaba.excel.annotation.ExcelProperty; public class Student { @ExcelProperty("学号") private String id; @ExcelProperty("姓名") private String name; @ExcelProperty("成绩") private Integer score; // 构造方法、getter和setter public Student() { } public Student(String id, String name, Integer score) { this.id = id; this.name = name; this.score = score; } // 省略getter和setter,实际开发中需要 } ``` #### 3. 编写导出方法 使用`EasyExcel.write`方法来导出数据。 ```java import com.alibaba.excel.EasyExcel; import java.util.ArrayList; import java.util.List; public class ExcelExporter { public static void main(String[] args) { // 1. 准备数据 List<Student> students = new ArrayList<>(); students.add(new Student("001", "张三", 90)); students.add(new Student("002", "李四", 85)); students.add(new Student("003", "王五", 92)); // 2. 指定文件路径 String fileName = "学生成绩表.xlsx"; // 3. 写入Excel EasyExcel.write(fileName, Student.class) .sheet("学生列表") .doWrite(students); } } ``` 运行上述代码,将在项目根目录生成一个名为“学生成绩表.xlsx”的Excel文件。 ### 说明 - `EasyExcel.write`方法接收文件路径和导出数据的类类型(这里为`Student.class`)。 - `sheet`方法指定工作表名称。 - `doWrite`方法传入数据列表,执行写入操作。 ### 高级功能 如果需要更复杂的功能(如合并单元格、设置样式等),可以使用`ExcelWriter`和`WriteSheet`对象,并配合样式设置。 ### 注意事项 - 确保数据模型类有无参构造方法。 - 字段的顺序由类中字段定义的顺序决定,也可以通过`@ExcelProperty`注解的`index`属性指定列的顺序(例如:`@ExcelProperty(index = 0)`)。 ### 相关问题 1. 如何设置Excel的单元格样式(如字体、颜色、对齐方式)? 2. 如何导出大数据量(百万行)的Excel而不内存溢出? 3. EasyExcel支持哪些数据类型导出Excel? 4. 如何将Excel文件导出Web响应中(例如在Spring MVC中)?</think>### 使用 EasyExcel 导出 ExcelJava 实现指南 #### 1. 添加 Maven 依赖 ```xml <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>3.3.2</version> <!-- 请检查最新版本 --> </dependency> ``` #### 2. 创建数据模型类 使用注解定义 Excel 列映射: ```java import com.alibaba.excel.annotation.ExcelProperty; public class User { @ExcelProperty("ID") // 表头名称 private Integer id; @ExcelProperty("姓名") private String name; @ExcelProperty("年龄") private Integer age; // 必须有无参构造器 public User() {} // Getter/Setter 省略... } ``` #### 3. 基础导出实现 ```java import com.alibaba.excel.EasyExcel; import java.util.ArrayList; import java.util.List; public class ExcelExporter { public static void main(String[] args) { // 1. 准备数据 List<User> data = new ArrayList<>(); data.add(new User(1, "张三", 25)); data.add(new User(2, "李四", 30)); // 2. 执行导出 String fileName = "用户列表.xlsx"; EasyExcel.write(fileName, User.class) .sheet("用户数据") // 工作表名称 .doWrite(data); // 写入数据 } } ``` #### 4. 高级功能示例 **(1) 自定义表头样式** ```java EasyExcel.write(fileName, User.class) .registerWriteHandler(new HorizontalCellStyleStrategy( // 表头样式 new WriteCellStyle().setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex()), // 内容样式 new WriteCellStyle().setWrapped(true) // 自动换行 )) .sheet("用户数据") .doWrite(data); ``` **(2) 导出Web 响应 (Spring Boot)** ```java @GetMapping("/export") public void export(HttpServletResponse response) throws IOException { response.setContentType("application/vnd.ms-excel"); response.setCharacterEncoding("utf-8"); String fileName = URLEncoder.encode("用户数据", "UTF-8"); response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx"); EasyExcel.write(response.getOutputStream(), User.class) .sheet("用户列表") .doWrite(getExportData()); // 获取数据的方法 } ``` #### 5. 性能优化建议 1. **大数据量导出**:使用分页查询避免 OOM ```java // 分批次查询写入 for (int i = 0; i < pageCount; i++) { List<User> pageData = queryPageData(i, pageSize); if (i == 0) { excelWriter = EasyExcel.write(fileName, User.class).build(); sheet = new WriteSheet(); sheet.setSheetName("大数据导出"); } excelWriter.write(pageData, sheet); } excelWriter.finish(); ``` 2. **使用模板导出**:保持样式一致性 ```java String template = "template.xlsx"; EasyExcel.write(fileName) .withTemplate(template) .sheet() .doWrite(data); ``` #### 注意事项 1. 实体类必须有无参构造器 2. 默认按字段声明顺序导出,使用 `@ExcelProperty(index = 0)` 指定列顺序 3. 处理日期格式:`@DateTimeFormat("yyyy-MM-dd HH:mm:ss")` 4. 忽略字段:`@ExcelIgnore` [^1]: EasyExcel 官方文档推荐使用模板导出保持样式一致性
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值