easyexcel 合并单元格(非注解)

引入 jar

      <!--引入 阿里的  easyexcel  如果报错 需要引入  asm   jar-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
              <version>2.2.6</version>
        </dependency>
    <!--  <dependency>
            <groupId>org.ow2.asm</groupId>
            <artifactId>asm</artifactId>
            <version>9.0-beta</version>
        </dependency>-->

1 生成表头和数据

package com.example.jddemo.excel.mergecell;

import com.alibaba.excel.EasyExcel;

import java.util.ArrayList;
import java.util.List;

public class MergeCell {


    public static void main(String[] args) {
        // 写法1
        String fileName = "D:\\" + System.currentTimeMillis() + ".xlsx";
        // 这里 需要指定写用哪个class去写,然后写到第一个sheet,名字为模板 然后文件流会自动关闭
        EasyExcel.write(fileName).head(head()).sheet("模板")
                .registerWriteHandler(new MyMergeStrategy())//自定义合并 单元格
                .doWrite(dataList());
    }

    /**
     * 创建表头
     * @return
     */
    private static List<List<String>> head() {
        List<List<String>> list = new ArrayList<List<String>>();
        List<String> head0 = new ArrayList<String>();
        head0.add("字符串");
        List<String> head1 = new ArrayList<String>();
        head1.add("数字");
        List<String> head2 = new ArrayList<String>();
        head2.add("日期");
        list.add(head0);
        list.add(head1);
        list.add(head2);
        return list;
    }

    /**
     * 创建数据
     * @return
     */
    private static List<List<Object>> dataList() {
        List<List<Object>> list = new ArrayList<List<Object>>();
        for (int i = 0; i < 3; i++) {
            List<Object> data = new ArrayList<Object>();
            data.add("字符串" + i);
            data.add("数字" + i);
            data.add("时间" + i);
            list.add(data);
        }
        return list;
    }
}

2合并单元格

package com.example.jddemo.excel.mergecell;

import com.alibaba.excel.metadata.Head;
import com.alibaba.excel.write.merge.AbstractMergeStrategy;
import org.apache.commons.collections.CollectionUtils;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.util.CellRangeAddress;

import java.util.ArrayList;
import java.util.List;

public class MyMergeStrategy extends AbstractMergeStrategy {
    //合并坐标集合
    private List<CellRangeAddress> cellRangeAddresss;
    //构造
    public MyMergeStrategy() {
        List<CellRangeAddress> list = new ArrayList<>();
        //合并 单元格坐标
        CellRangeAddress item1 = new CellRangeAddress(0, 0, 2, 5);
        CellRangeAddress item2 = new CellRangeAddress(2, 2, 2, 5);
        CellRangeAddress item3 = new CellRangeAddress(3, 3, 0, 1);
        list.add(item1);
        list.add(item2);
        list.add(item3);
        this.cellRangeAddresss = list;
    }
    /**
     * 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);
                }
            }
        }
    }
}


执行测试

public static void main(String[] args) {
        // 写法1
        String fileName = "D:\\" + System.currentTimeMillis() + ".xlsx";
        // 这里 需要指定写用哪个class去写,然后写到第一个sheet,名字为模板 然后文件流会自动关闭
        EasyExcel.write(fileName).head(head()).sheet("模板")
                .registerWriteHandler(new MyMergeStrategy())//自定义合并 单元格
                .doWrite(dataList());
    }

合并后效果

在这里插入图片描述
下篇文章讲述如何自定义单元格样式: 点击跳转下篇文章

  • 10
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 19
    评论
EasyExcel中,可以使用`@ExcelProperty`注解来声明单元格的位置和内容。如果需要合并单元格,则可以在注解中使用`@ContentRowHeight`、`@HeadRowHeight`和`@ColumnWidth`来设置合并后单元格的高度和宽度。 例如,以下是一个合并单元格的示例: ```java public class TestDto { @ExcelProperty(value = {"表头1", "表头1.1"}, index = 0) @ContentRowHeight(30) @HeadRowHeight(30) @ColumnWidth(25) private String col1; @ExcelProperty(value = {"表头2", "表头2.1"}, index = 1) @ContentRowHeight(30) @HeadRowHeight(30) @ColumnWidth(25) private String col2; @ExcelProperty(value = {"表头3", "表头3.1"}, index = 2) @ContentRowHeight(30) @HeadRowHeight(30) @ColumnWidth(25) private String col3; @ExcelProperty(value = {"表头4", "表头4.1", "表头4.2"}, index = 3) @ContentRowHeight(60) @HeadRowHeight(30) @ColumnWidth(25) private String col4; // 省略getter/setter方法 } ``` 在以上示例中,`@ExcelProperty`注解中的`value`属性表示单元格的位置,使用数组来表示多级表头。`@ContentRowHeight`、`@HeadRowHeight`和`@ColumnWidth`注解分别表示合并后单元格的高度和宽度。其中,`@ContentRowHeight`和`@HeadRowHeight`设置的是行高,`@ColumnWidth`设置的是列宽。 以上示例中,第4列的单元格需要合并三个表头,因此在`@ExcelProperty`注解中使用了一个长度为3的数组。同时,通过`@ContentRowHeight`注解设置合并后单元格的高度为60,即占用两行。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值