阿里巴巴EasyExcel使用(2)-高亮和合并单元格

转自:https://www.cnblogs.com/coloz/p/12522229.html
一、自定义一个单元格样式

public class CustomCellWriteHandler implements CellWriteHandler { 
    private static final Logger LOGGER = LoggerFactory.getLogger(CustomCellWriteHandler.class);
    //标黄行宽集合
    private Set<Integer> yellowRowIndexs;

    //构造
    public CustomCellWriteHandler(Set<Integer> yellowRowIndexs) {
        this.yellowRowIndexs = yellowRowIndexs;
    }

    public CustomCellWriteHandler() {
    }

    @Override
    public void beforeCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Head head, Integer columnIndex, Integer relativeRowIndex, Boolean isHead) {
        LOGGER.info("beforeCellCreate~~~~");
    }

    @Override
    public void afterCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Cell cell,         Head head, Integer relativeRowIndex, Boolean isHead) {
        LOGGER.info("afterCellCreate~~~~");
    }

    @Override
    public void afterCellDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, List<CellData> cellDataList,           Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) {
        // 这里可以对cell进行任何操作
        LOGGER.info("第{}行,第{}列写入完成。", cell.getRowIndex(), cell.getColumnIndex());
        if (CollectionUtils.isNotEmpty(yellowRowIndexs)) {
            Workbook workbook = writeSheetHolder.getSheet().getWorkbook();
            CellStyle cellStyle = workbook.createCellStyle();
            //字体
            Font cellFont = workbook.createFont();
            cellFont.setBold(true);
            cellStyle.setFont(cellFont);
            //标黄,要一起设置
            cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND); //设置前景填充样式
            cellStyle.setFillForegroundColor(IndexedColors.YELLOW.getIndex());//前景填充色

            if (yellowRowIndexs.contains(cell.getRowIndex())) {
                cell.setCellStyle(cellStyle);
            }
        }
    }
}

二、测试方法

/**
     * 写入到固定文件中,高亮显示某一行
     *
     * @throws IOException
     */
    @Test
    public void writeToExcelFile3() {
        //这里自定义一个单元格的格式(标黄的行高亮显示)
        Integer[] yellowRows = {3, 5, 7, 9};
        Set<Integer> yellowRowsSet = new HashSet<>(Arrays.asList(yellowRows));
        CustomCellWriteHandler customCellWriteHandler = new CustomCellWriteHandler(yellowRowsSet);

        //写入的文excel文件
        String fileName = "I:\\temp\\writeDemo3.xlsx";
        /*------------------------------分割线------------------------------*/
        //获取头和内容的策略
        HorizontalCellStyleStrategy horizontalCellStyleStrategy = getHorizontalCellStyleStrategy();

        //列宽的策略,宽度是小单位
        Integer columnWidthArr[] = {3000, 3000, 2000, 6000};
        List<Integer> columnWidths = Arrays.asList(columnWidthArr);
        CustomSheetWriteHandler customSheetWriteHandler = new CustomSheetWriteHandler(columnWidths);

        // 根据自定义导出的字段
        String[] filds = {"uid", "name", "age", "birthday"};

        String[] headers = {"唯一识别码", "姓名", "年龄", "生日"};

        List head = getHeadByFilds(headers);

        //获取模拟的实体数据集合
        List<User> userList = getUserList();

        //这里指定头的名字去写入,然后写到第一个sheet,名字为模板 然后文件流会自动关闭
        EasyExcel.write(fileName)
                .head(head)
                .registerWriteHandler(horizontalCellStyleStrategy)
                .registerWriteHandler(customSheetWriteHandler)
                //注册单元格式
                .registerWriteHandler(customCellWriteHandler)
                .includeColumnFiledNames(Arrays.asList(filds))
                .sheet("模板")
                .doWrite(userList);
    }

效果
在这里插入图片描述
三、自定义合并单元格的策略

/**
 * 自定义的合并策略,参考官方文档的LoopMergeStrategy
 */
public class MyMergeStrategy extends AbstractMergeStrategy {
    //合并坐标集合
    private List<CellRangeAddress> cellRangeAddresss;

    //构造
    public MyMergeStrategy(List<CellRangeAddress> cellRangeAddresss) {
        this.cellRangeAddresss = cellRangeAddresss;
    }

    /**
     * merge
     *
     * @param sheet
     * @param cell
     * @param head
     * @param relativeRowIndex
     */
    @Override
    protected void merge(Sheet sheet, Cell cell, Head head, Integer relativeRowIndex) {
        //合并单元格
        /**
         *  ****加个判断:if (cell.getRowIndex() == 1 && cell.getColumnIndex() == 0) {}****
         * 保证每个cell被合并一次,如果不加上面的判断,因为是一个cell一个cell操作的,
         * 例如合并A2:A3,当cell为A2时,合并A2,A3,但是当cell为A3时,又是合并A2,A3,
         * 但此时A2,A3已经是合并的单元格了
         */

        if (CollectionUtils.isNotEmpty(cellRangeAddresss)) {
            if (cell.getRowIndex() == 1 && cell.getColumnIndex() == 0) {
                for (CellRangeAddress item : cellRangeAddresss) {
                    sheet.addMergedRegionUnsafe(item);
                }
            }
        }
    }
}

四、测试合并

/**
     * 模拟合并单元格的位置
     *
     * @return
     */
    private List<CellRangeAddress> getCellRangeAddresss() {
        List<CellRangeAddress> list = new ArrayList<>();
        //合并第4行
        CellRangeAddress item1 = new CellRangeAddress(3, 3, 0, 3);
        //合并第第6行的第一列和第二列
        CellRangeAddress item2 = new CellRangeAddress(5, 5, 0, 1);
        //合并第9行和第10行
        CellRangeAddress item3 = new CellRangeAddress(10, 11, 0, 3);

        list.add(item1);
        list.add(item2);
        list.add(item3);
        return list;

    }
/**
     * 写入到固定文件中,合并单元格
     *
     * @throws IOException
     */
    @Test
    public void writeToExcelFile4() {

        //定义合并单元格的坐标范围
        List<CellRangeAddress> cellRangeAddresss = getCellRangeAddresss();
        //定义合并单元格策略
        MyMergeStrategy myMergeStrategy = new MyMergeStrategy(cellRangeAddresss);

        //写入的文excel文件
        String fileName = "I:\\temp\\writeDemo4.xlsx";

        /*------------------------------分割线------------------------------*/
        //这里自定义一个单元格的格式(标黄的行高亮显示)
        Integer[] yellowRows = {3, 5, 7, 9};
        Set<Integer> yellowRowsSet = new HashSet<>(Arrays.asList(yellowRows));
        CustomCellWriteHandler customCellWriteHandler = new CustomCellWriteHandler(yellowRowsSet);

        //获取头和内容的策略
        HorizontalCellStyleStrategy horizontalCellStyleStrategy = getHorizontalCellStyleStrategy();

        //列宽的策略,宽度是小单位
        Integer columnWidthArr[] = {3000, 3000, 2000, 6000};
        List<Integer> columnWidths = Arrays.asList(columnWidthArr);
        CustomSheetWriteHandler customSheetWriteHandler = new CustomSheetWriteHandler(columnWidths);

        // 根据自定义导出的字段
        String[] filds = {"uid", "name", "age", "birthday"};

        String[] headers = {"唯一识别码", "姓名", "年龄", "生日"};

        List head = getHeadByFilds(headers);

        //获取模拟的实体数据集合
        List<User> userList = getUserList();


        //这里指定头的名字去写入,然后写到第一个sheet,名字为模板 然后文件流会自动关闭
        EasyExcel.write(fileName)
                .head(head)
                .registerWriteHandler(horizontalCellStyleStrategy)
                .registerWriteHandler(customSheetWriteHandler)
                //注册单元格式
                .registerWriteHandler(customCellWriteHandler)
                //注册合并策略
                .registerWriteHandler(myMergeStrategy)
                .includeColumnFiledNames(Arrays.asList(filds))
                .sheet("模板")
                .doWrite(userList);
    }

在这里插入图片描述

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
EasyExcel中,要实现一对多对象的导出并合并单元格,可以按照以下步骤进行操作: 1. 创建一个DTO类,用于存储需要合并单元格的信息。该类需要包含以下属性: - cellIndex:需要合并的单元格列下标 - startRow:合并开始行 - endRow:合并结束行 2. 在导出时,根据一对多的关系,将需要合并的单元格信息存储到DTO对象中。 3. 使用EasyExcel提供的`CellRangeAddress`类来实现单元格合并。该类的构造方法需要传入合并的起始行、结束行、起始列和结束列。 4. 在导出时,根据DTO对象中的信息,创建`CellRangeAddress`对象,并将其添加到合适的地方,以实现单元格的合并。 下面是一个示例代码,演示了如何在EasyExcel中导出一对多对象并合并单元格: ```java import com.alibaba.excel.EasyExcel; import com.alibaba.excel.write.builder.ExcelWriterBuilder; import com.alibaba.excel.write.builder.ExcelWriterSheetBuilder; import com.alibaba.excel.write.metadata.style.WriteCellStyle; import com.alibaba.excel.write.style.HorizontalCellStyleStrategy; import org.apache.poi.ss.usermodel.IndexedColors; import org.apache.poi.ss.util.CellRangeAddress; import java.util.ArrayList; import java.util.List; public class ExportDemo { public static void main(String[] args) { // 创建一对多对象列表 List<ParentObject> parentList = new ArrayList<>(); // 添加一对多对象数据 // 创建DTO列表,用于存储需要合并单元格的信息 List<MergeCellDTO> mergeCellList = new ArrayList<>(); // 添加需要合并单元格的信息到DTO列表 // 导出Excel String fileName = "output.xlsx"; EasyExcel.write(fileName) .registerWriteHandler(getCellStyleStrategy()) .sheet("Sheet1") .doWrite(parentList); // 合并单元格 ExcelWriterBuilder excelWriterBuilder = EasyExcel.write(fileName); ExcelWriterSheetBuilder sheetBuilder = excelWriterBuilder.sheet("Sheet1"); for (MergeCellDTO mergeCellDTO : mergeCellList) { CellRangeAddress cellRangeAddress = new CellRangeAddress( mergeCellDTO.getStartRow(), mergeCellDTO.getEndRow(), mergeCellDTO.getCellIndex(), mergeCellDTO.getCellIndex() ); sheetBuilder.merge(cellRangeAddress); } sheetBuilder.doWrite(parentList); } // 设置单元格样式 private static HorizontalCellStyleStrategy getCellStyleStrategy() { WriteCellStyle headWriteCellStyle = new WriteCellStyle(); headWriteCellStyle.setFillForegroundColor(IndexedColors.LIGHT_BLUE.getIndex()); WriteCellStyle contentWriteCellStyle = new WriteCellStyle(); contentWriteCellStyle.setFillForegroundColor(IndexedColors.WHITE.getIndex()); return new HorizontalCellStyleStrategy(headWriteCellStyle, contentWriteCellStyle); } } ``` 请注意,上述代码中的`ParentObject`是一对多对象的父对象,你需要根据实际情况进行替换。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值