使用easy excel导出复杂表头的excel

本文介绍了如何使用EasyExcel的模板填充功能,简化双层表头Excel的导出过程。通过创建一个模板,将表头数据封装成Map,表体数据为List,调用自定义的EasyExcelUtil工具类即可实现复杂Excel的生成。文章还提供了相关依赖排除,以避免与现有项目的POI库冲突。

使用easy-excel导出复杂表头的excel

今天想写一个双层表头的excel导出,一开始使用的是poi来画发现太麻烦,
于是就想到了使用easy-excel的模板填充来实现,将导出写成了一个简单的工具类,
供参考

在这里插入图片描述
最终是要实现为这样的一个效果 , 红色为表头,绿色为表体,于是我先做出了一个模板 ,
如果不会写模板的可以去看官方文档, 十分简单 https://www.yuque.com/easyexcel/doc/fill
在这里插入图片描述
然后将表头数据封装成一个map,表体数据为一个list , 去调用工具类就实现了
在这里插入图片描述
以下为工具类代码,导入了easy-excel就可以使用

package com.org.inventory.util;

import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.support.ExcelTypeEnum;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.alibaba.excel.write.metadata.fill.FillConfig;
import org.springframework.core.io.ClassPathResource;

import javax.servlet.http.HttpServletResponse;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.util.List;
import java.util.Map;

/**
 * Description: easy excel 工具类
 *
 * @ProjectName: inventory_task
 * @ProduceName: IntelliJ IDEA
 * @author: li ji hong
 * @date: 2021/12/15 9:51
 */
public class EasyExcelUtils {
    private static final String CONTENT_TYPE = "application/vnd.ms-excel";
    private static final String CHARACTER_ENCODING = "utf-8";
    private static final String HEADER_S1 = "Content-disposition";
    private static final String HEADER_S2 = "attachment; filename=";


    /**
     * 创建excel
     *
     * 此方法为封装简单excel的导出 ,
     * 表头或者日期等信息写在map ,
     * list数据单独传可以实现简单导出
     *
     * @param response 响应
     * @param fileName 文件名称
     * @param map      map
     * @param list     列表
     * @throws IOException ioexception
     */
    public static void createExcel(HttpServletResponse response, String fileName, Map<String, Object> map, List<?> list) throws IOException {
        // 设置公共头信息
        OutputStream out = null;
        BufferedOutputStream bos = null;
        response.setContentType(CONTENT_TYPE);
        response.setCharacterEncoding(CHARACTER_ENCODING);
        response.setHeader(HEADER_S1, HEADER_S2 + fileName);

        out = response.getOutputStream();
        bos = new BufferedOutputStream(out);
        // 此处可以修改 为 classpath:/file
        ClassPathResource cpr = new ClassPathResource("file" + File.separator + fileName);
        ExcelWriter excelWriter = com.alibaba.excel.EasyExcel.write(bos)
                .withTemplate(cpr.getInputStream()).excelType(ExcelTypeEnum.XLS).build();
        WriteSheet writeSheet = com.alibaba.excel.EasyExcel.writerSheet().build();
        FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build();
        // 填充 list 数据
        excelWriter.fill(list, fillConfig, writeSheet);
        // 填充 map 数据
        excelWriter.fill(map, writeSheet);
        excelWriter.finish();
        bos.flush();
        bos.close();


    }
}

直接调用即可

补充一下依赖,因为有些人的项目可能会与poi产生冲突

<!--集成EasyExcel -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>2.2.6</version>
            <exclusions>
                <exclusion>
                    <groupId>javax.servlet</groupId>
                    <artifactId>servlet-api</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.apache.poi</groupId>
                    <artifactId>poi</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.apache.poi</groupId>
                    <artifactId>poi-ooxml</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.apache.poi</groupId>
                    <artifactId>poi-ooxml-schemas</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
<think>好的,我现在需要帮助用户解决如何使用EasyExcel导出带有格式的单元格的问题。首先,我得回想一下之前用户提到的关于POI导出下拉选项的内容,但用户现在转向了Easy Excel,所以可能需要调整方法。Easy Excel是阿里巴巴开源的库,相比POI更简便,但格式化单元格的具体步骤可能不太一样。用户需要示例代码,所以得确保提供的代码正确且符合最新版本的Easy Excel用法。 首先,格式化单元格可能包括设置字体、颜色、背景、边框等。在Easy Excel中,通常通过注解或者自定义样式处理器来实现。比如,使用@ExcelProperty注解可以定义表头,但样式可能需要通过自定义CellWriteHandler来处理。 然后,用户可能需要设置日期或数字的格式。例如,日期格式可以用@DateTimeFormat注解,数字格式用@NumberFormat。这些是EasyExcel提供的便捷方式,但如果是更复杂的样式,可能需要通过自定义样式。接下来,我需要考虑如何编写处理器。比如,实现CellWriteHandler接口,在afterCellCreate方法中获取单元格并设置样式。这里需要用到CellStyleHelper,可能需要创建字体、设置背景色等。另外,用户可能需要示例代码,所以得确保代码结构清晰,包括导包、类定义、处理器实现等。同时,要指出需要注册自定义的处理器到ExcelWriterBuilder中。还要注意可能的相关问题,比如复杂格式、动态样式、性能优化等,这些可以作为相关问题提供,帮助用户扩展了解。 最后,检查是否符合用户的要求:使用Easy Excel、格式化单元格、示例代码。确保没有提到POI,而是专注于Easy Excel的方法。同时,引用之前的POI示例可能不太相关,但用户可能希望比较,所以需要明确说明EasyExcel的不同之处。</think>### 使用EasyExcel导出带格式的单元格的方法 #### 核心步骤 1. **自定义样式处理器**:继承`CellWriteHandler`接口,在单元格创建后修改样式 2. **定义数据模型**:通过注解`@ExcelProperty`绑定数据字段 3. **设置特定格式**:使用`@DateTimeFormat`、`@NumberFormat`等注解 4. **注册样式处理器**:通过`ExcelWriterBuilder`添加自定义处理器 #### 示例代码(基于EasyExcel 3.x) ```java // 1. 定义数据模型 @Data public class FormatData { @ExcelProperty("标题") private String title; @ExcelProperty("金额") @NumberFormat("#,##0.00") // 数字格式 private BigDecimal amount; @ExcelProperty("日期") @DateTimeFormat("yyyy-MM-dd HH:mm") // 日期格式 private Date createTime; } // 2. 自定义样式处理器 public class StyleCellHandler implements CellWriteHandler { @Override public void afterCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) { // 设置表头样式 if (isHead) { CellStyle headStyle = writeSheetHolder.getSheet().getWorkbook().createCellStyle(); Font font = writeSheetHolder.getSheet().getWorkbook().createFont(); font.setBold(true); font.setColor(IndexedColors.WHITE.getIndex()); headStyle.setFont(font); headStyle.setFillForegroundColor(IndexedColors.BLUE.getIndex()); headStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND); cell.setCellStyle(headStyle); } // 设置数据单元格边框 else { CellStyle dataStyle = writeSheetHolder.getSheet().getWorkbook().createCellStyle(); dataStyle.setBorderTop(BorderStyle.THIN); dataStyle.setBorderBottom(BorderStyle.THIN); dataStyle.setBorderLeft(BorderStyle.THIN); dataStyle.setBorderRight(BorderStyle.THIN); cell.setCellStyle(dataStyle); } } } // 3. 导出调用 public void exportFormattedExcel() { List<FormatData> dataList = getData(); String fileName = "formatted_data.xlsx"; ExcelWriterBuilder writerBuilder = EasyExcel.write(fileName, FormatData.class) .registerWriteHandler(new StyleCellHandler()) // 注册样式处理器 .registerWriteHandler(new HorizontalCellStyleStrategy()); // 默认样式策略 writerBuilder.sheet("带格式数据") .doWrite(dataList); } ``` #### 关键配置说明 1. **样式处理器优先级**:多个处理器按注册顺序执行 2. **颜色索引规范**:使用`IndexedColors`预定义颜色值 3. **性能优化**:复用`CellStyle`对象避免内存溢出 4. **复杂格式组合**:支持设置字体/背景/边框/对齐等组合样式
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值