引入 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());
}
合并后效果
下篇文章讲述如何自定义单元格样式: 点击跳转下篇文章