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());
    }

合并后效果

easyexcel 合并单元格(非注解)_第1张图片
下篇文章讲述如何自定义单元格样式: 点击跳转下篇文章

你可能感兴趣的:(easy-Excel,java,poi)