Easyexcel(1-注解使用)

相关文章链接:

  1. Easyexcel(1-注解使用)

版本依赖

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>easyexcel</artifactId>
    <version>3.3.3</version>
</dependency>

@ExcelProperty

指定当前字段对应excel中的那一列,可以根据名字或者Index去匹配,当然也可以不写。

  1. value:指定写入的列头,如果不指定则使用成员变量的名字作为列头;如果要设置复杂的头,可以为value指定多个值
  2. order:优先级高于value,会根据order的顺序来匹配实体和excel中数据的顺序
  3. index:优先级高于value和order,指定写到第几列,如果不指定则根据成员变量位置排序;默认第一个字段就是index=0
  4. converter:指定当前字段用什么转换器,默认会自动选择。可以用来设置类型转换器,需要实现Converter接口

value

指定属性名

@Data
public class User {
   
   

    private Integer userId;

    private String name;

    private String phone;

    private String email;

    private Date createTime;
}
@RestController
public class TestController {
   
   

    @GetMapping("/test1")
    public void test1(HttpServletResponse response) {
   
   
        try {
   
   
            response.setContentType("application/vnd.ms-excel");
            response.setCharacterEncoding("utf-8");
            String fileName = URLEncoder.encode("test1", "UTF-8").replaceAll("\\+", "%20");
            response.setHeader("Content-disposition", "attachment;filename" + fileName + ".xls");

            User user = new User();
            user.setUserId(123);
            user.setName("as");
            user.setPhone("15213");
            user.setEmail("5456");
            user.setCreateTime(13213L);
            EasyExcel.write(response.getOutputStream(), User.class)
                    .sheet("test")
                    .doWrite(Arrays.asList(user));
        } catch (Exception e) {
   
   
            e.printStackTrace();
        }
    }
}

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

默认情况下,使用类的属性名作为Excel的列表,当然也可以使用@ExcelProperty 注解来重新指定属性名称。

@Data
public class User {
   
   
    @ExcelProperty(value = "用户Id")
    private Integer userId;
    
    @ExcelProperty(value = "姓名")
    private String name;
    
    @ExcelProperty(value = "手机")
    private String phone;
    
    @ExcelProperty(value = "邮箱")
    private String email;
    
    @ExcelProperty(value = "创建时间")
    private Date createTime;
}

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

表头合并

value在写的时候,如果指定了多个值,会自动进行合并

@Data
public class User {
   
   
    @ExcelProperty(value = "用户Id")
    private Integer userId;
    
    @ExcelProperty(value = {
   
   "用户基本信息", "姓名"})
    
<think>好的,我需要帮助用户找到在EasyExcel中不使用注解的实现方式。用户之前可能已经尝试过注解,比如@ExcelProperty,但现在希望用无注解的方法。 首先,我应该回忆一下EasyExcel的文档和常见用法。记得EasyExcel支持注解方式,但用户需要的是非注解方式。那有没有其他方式呢?比如使用自定义的Converter或者在写入时动态指定表头? 接下来,我需要确认用户的需求。他们可能希望动态生成Excel,而不需要修改实体类添加注解。这在某些场景下很有用,比如实体类不可修改,或者需要根据不同情况生成不同的表头。 然后,思考如何实现。记得EasyExcel的write方法可以传入WriteHandler,或者使用Map来构建数据。或者使用动态表头的方法,通过调用registerWriteHandler来设置自定义的处理器。 另外,可能涉及到在写入时动态指定字段的顺序和标题,而不依赖注解。例如,使用LinkedHashMap来保持字段顺序,并在write时指定表头。 还需要考虑数据转换的问题,比如如果有枚举值需要转换,可能需要自定义Converter,而不使用@ExcelProperty的converter属性。这时候可以用RegisterConverter来注册全局的转换器。 可能还需要参考用户提供的引用内容,比如引用[2]中的代码示例,使用EasyExcel.write并注册WriteHandler,这可能是一个线索。引用[3]提到自定义注解和转换器,但用户不需要注解,所以需要调整这部分。 最后,要确保示例代码正确,比如如何动态设置表头,如何将数据写入,以及如何处理字段的映射。需要验证代码是否可以在不依赖注解的情况下运行,并且正确生成Excel文件。 总结步骤:1. 动态设置表头,使用head方法指定列名。2. 使用Map或自定义的DTO来承载数据。3. 注册自定义转换器处理特定数据类型。4. 提供示例代码,展示如何在不使用注解的情况下进行读写操作。</think>在EasyExcel中实现无注解Excel读写操作,可以通过动态表头配置和自定义数据转换器实现。以下是具体实现方式和示例: --- ### 一、无注解写入Excel的步骤 1. **动态定义表头**:通过`List<List<String>>`手动指定列标题 2. **构建数据集合**:使用`List<Map<Integer, Object>>`或自定义DTO承载数据 3. **注册转换器**:处理复杂数据类型(如日期、枚举) #### 示例代码 ```java // 1. 定义动态表头(列名) List<List<String>> head = new ArrayList<>(); head.add(Collections.singletonList("姓名")); head.add(Collections.singletonList("年龄")); head.add(Collections.singletonList("入职日期")); // 2. 构建数据集合(Map按列顺序存储数据) List<Map<Integer, Object>> dataList = new ArrayList<>(); Map<Integer, Object> rowData = new HashMap<>(); rowData.put(0, "张三"); rowData.put(1, 28); rowData.put(2, new Date()); dataList.add(rowData); // 3. 写入Excel(不依赖注解) String fileName = "D:\\no_annotation.xlsx"; EasyExcel.write(fileName) .head(head) // 动态设置表头 .registerConverter(new DateStringConverter()) // 自定义日期转换器 .sheet("员工信息") .doWrite(dataList); ``` --- ### 二、无注解读取Excel的步骤 1. **定义监听器**:通过`ReadListener`逐行处理数据 2. **映射字段顺序**:根据表头索引绑定数据 #### 示例代码 ```java // 1. 定义数据接收实体(无需注解) public class EmployeeDTO { private String name; private Integer age; private Date hireDate; // Getter/Setter省略 } // 2. 创建读取监听器 ReadListener<EmployeeDTO> listener = new ReadListener<>() { @Override public void invoke(EmployeeDTO data, AnalysisContext context) { System.out.println("读取到数据: " + data.getName()); } @Override public void doAfterAllAnalysed(AnalysisContext context) {} }; // 3. 读取Excel文件 EasyExcel.read("D:\\no_annotation.xlsx", EmployeeDTO.class, listener) .headRowNumber(1) // 表头行数 .registerConverter(new StringDateConverter()) // 自定义日期解析 .sheet().doRead(); ``` --- ### 三、关键配置说明 1. **自定义转换器**(示例:日期格式处理) ```java public class DateStringConverter implements Converter<Date> { @Override public Class<Date> supportJavaTypeKey() { return Date.class; } @Override public void write(WriteContext context, Date data, WriteCellData<?> cellData) { SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); cellData.setStringValue(format.format(data)); } } ``` 2. **动态表头与数据映射** - 写入时`head()`方法定义列顺序 - 读取时表头索引与DTO字段顺序自动匹配[^2] --- ### 四、适用场景 - **动态报表生成**:根据配置实时调整输出列 - **遗留系统集成**:无法修改原有实体类时 - **数据清洗工具**:灵活处理不同结构的Excel文件 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值