Web中的EasyExcel导出Excel(不创建对象且自定义合并单元格策略)

Web中的EasyExcel导出Excel(不创建对象且自定义合并单元格策略)

适用于多张表(只查单表数据就用创建对象那种方法)

Controller

@RequestMapping(value = "/downloadPlanList", method = RequestMethod.GET)
@ApiOperation(value = "下载")
public void exportExcel(HttpServletResponse response) throws IOException {
    dyplanService.exportPlanList(response);
}

Service

@Override
public void exportPlanList(HttpServletResponse response) {
        List<List<Object>> planList= getPlanList();
        try {
            response.setContentType("application/vnd.ms-excel");
            response.setCharacterEncoding("utf-8");
            response.setHeader("Content-disposition", "attachment;filename=demo.xlsx");
            //需要合并的列(不需要合并就忽略)
            int[] mergeColumeIndex = {0,1,2,5,6,7,8,9,10};
            // 从哪一行开始合并
            int mergeRowIndex = 0;
            // 创建excel
            EasyExcel.write(response.getOutputStream())
                    .head(excelHead())
                    // 自适应列宽(不需要就忽略)
                    .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy())
                    // 单元格合并策略(不需要就忽略)
                    .registerWriteHandler(new LocalCellMergeStrategy(mergeRowIndex, mergeColumeIndex))
                    // 时间转换
                    .registerConverter(new LocalDateTimeConverter())
                    .sheet("模板")
                    .doWrite(planList);
        } catch (Exception e) {
            logger.error("下载报表异常:{}", e.getMessage());
            throw new RuntimeException("下载报表异常");
        }
    }
    /**
     * 组装生成excel需要的字段
     * @param nodeId
     * @return
     */
    public List<List<Object>> getPlanList(String nodeId){
        List<Dyplan> dyplanList = dyplanMapper.getDyPlanList(nodeId);
        (中间根据具体业务组装数据)
       	....
        return dataList;
    }
/**
     * 组装excel头部
     * @return
     */
    private List<List<String>> excelHead() {
        List<List<String>> headList = new ArrayList();
        headList.add(new ArrayList() {{
            add("工作年度");
        }});
        // 下面这种写法,可以实现复杂的头
        headList.add(new ArrayList() {{
            add("工作内容");
            add("资源类型");
        }});
        headList.add(new ArrayList() {{
            add("工作内容");
            add("数量");
        }});
        (具体业务具体处理)
        ......
        return headList;
    }

上面实现的头部效果:
头部效果

自定义Converter(解决LocalDateTime日期转换的问题)
注:EasyExcel支持Date类型,可以直接导入导出

public class LocalDateTimeConverter implements Converter<LocalDateTime> {
    @Override
    public Class supportJavaTypeKey() {
        return LocalDateTime.class;
    }

    @Override
    public CellDataTypeEnum supportExcelTypeKey() {
        return CellDataTypeEnum.STRING;
    }

    @Override
    public LocalDateTime convertToJavaData(CellData cellData, ExcelContentProperty excelContentProperty, GlobalConfiguration globalConfiguration) throws Exception {
        return LocalDateTime.parse(cellData.getStringValue(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
    }

    @Override
    public CellData convertToExcelData(LocalDateTime localDateTime, ExcelContentProperty excelContentProperty, GlobalConfiguration globalConfiguration) throws Exception {
        return new CellData<>(localDateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
    }
}

自定义合并单元格策略
参考:EasyExcel导出自定义合并单元格策略.

### 使用 EasyExcel 导出并设置表头 当使用 EasyExcel 进行 Excel 文件导出时,可以通过定义实体类的方式指定表头信息。下面展示了一个完整的示例,说明如何创建一个具有特定表头的 Excel 文件。 #### 定义实体类用于映射表头 通过 Java 注解 `@Head` 和 `@ColumnWidth` 来标注字段对应的列名以及宽度: ```java import com.alibaba.excel.annotation.ExcelProperty; import com.alibaba.excel.annotation.write.style.ColumnWidth; public class User { @ExcelProperty("姓名") private String name; @ExcelProperty("年龄") @ColumnWidth(20) private Integer age; public User(String name, Integer age) { this.name = name; this.age = age; } // Getters and Setters... } ``` 此部分代码展示了如何利用注解简化表头配置过程[^1]。 #### 编写控制器实现文件下载功能 编写 Spring Boot 控制器处理 HTTP 请求,并返回文件流供前端调用下载链接触发下载动作: ```java import org.springframework.web.bind.annotation.GetMapping; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.ArrayList; import java.util.List; @RestController @RequestMapping("/export") public class ExportController { @GetMapping("/users") public void export(HttpServletResponse response) throws IOException { List<User> users = new ArrayList<>(); users.add(new User("张三", 28)); users.add(new User("李四", 30)); // 设置响应头 response.setContentType("application/vnd.ms-excel"); response.setCharacterEncoding("utf-8"); String fileName = URLEncoder.encode("用户列表.xlsx", "UTF-8").replaceAll("\\+", "%20"); response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName); // 执行写出操作 EasyExcel.write(response.getOutputStream(), User.class).sheet("Sheet1").doWrite(users); } } ``` 上述代码实现了基于 RESTful API 的文件导出服务端逻辑。 #### 自定义样式与合并单元 对于更复杂的场景比如需要自定义样式或是合并某些区域内的单元,则可以在初始化 Sheet 对象之前先构建好 TableStyle 实例,并将其应用到工作簿上;同时也可以借助于监听器机制完成更多高级定制化需求: ```java // 创建样式对象 TableStyle tableStyle = createTableStyle(); // 构建 sheet 并关联样式 EasyExcel.write(outputStream, DataClass.class) .registerWriteHandler(new CellMergeStrategy(dataList, true)) .sheet("SheetName") .doWrite(dataList); ``` 这里提到的方法 `createTableStyle()` 是用来生成 TableStyle 实例的关键函数之一,在实际项目开发过程中可以根据业务特点灵活调整其内部参数以满足同场合下的视觉呈现效果[^2]。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值