EsayExcel使用
简单示例(写)
@Test
public void simpleWrite() {
String fileName = "测试表格"+ ".xlsx";
// 这里 需要指定写用哪个class去读,然后写到第一个sheet,名字为模板 然后文件流会自动关闭
// 如果这里想使用03 则 传入excelType参数即可
EasyExcel.write(fileName, DemoData.class).sheet("模板").doWrite(data());
}
自定义表头和表尾
表头
private List<List<String>> getHeader() {
String first = "标题";
List<List<String>> list = new ArrayList<List<String>>();
List<String> head0 = new ArrayList<String>();
//注意这里是表头的合并上下两行
head0.add(first);
head0.add("");
head0.add("行政区域");
head0.add("名称");
//注意这里是合并表头的左右两行
List<String> head1 = new ArrayList<String>();
head1.add(first);
head1.add("");
head1.add("行政区域");
head1.add("代码");
//注意这里是表头的合并上下两行
List<String> head3 = new ArrayList<String>();
head3.add(first);
head3.add("");
head3.add("合计");
List<String> head4 = new ArrayList<String>();
head4.add(first);
head4.add("");
head4.add("地类");
List<String> head5 = new ArrayList<String>();
head5.add(first);
head5.add("");
head5.add("地类合计");
list.add(head0);
list.add(head1);
list.add(head3);
list.add(head4);
list.add(head5);
for (int i = 0; i < 15; i++) {
List<String> head6 = new ArrayList<String>();
head6.add(first);
head6.add("");
head6.add(String.valueOf(i));
list.add(head6);
}
return list;
}
表尾
/**
* 插入表尾
*/
private void addTableTail(List<List<String>> data){
List<String> list = new ArrayList<>();
list.add(" 填表人: 填表日期: 检查人: 检查日期:");
data.add(list);
}
代码
List<List<Object>> list1 = new ArrayList<>();
for (int i = 0; i < 10; i++) {
// 初始化数据
List<Object> objectList = ExcelUtil.initList(20);
list1.add(objectList);
}
// 添加表尾
ExcelUtil.addTableTail(list1);
ExcelWriter excelWriter = EasyExcel.write("测试文件.xlsx").build();
int[] ints = {};
WriteSheet writeSheet = EasyExcel.writerSheet("测试")
// 自定义表头
.head(getHeader())
// 自己写的样式,后文自定义单元格会说
.registerWriteHandler(new CustomCellWriteHandler(list1.size(), 4, ints))
.build();
excelWriter.write(list1, writeSheet);
excelWriter.finish();
测试
自定义单元格格式
首先需要引用CellWriteHandler这个接口,将里面方法重写,变成我们自己想要的格式,具体方法得自己写,使得符合当前业务逻辑,此处例举出来上面用到的部分方法
public class CustomCellWriteHandler implements CellWriteHandler{
@Override
public void afterCellDispose(CellWriteHandlerContext context) {
// 写自己单元格格式,例举出常用的对象
// 获取sheet对象
Sheet sheet = context.getWriteSheetHolder().getSheet();// 获取sheet对象
Workbook workbook = sheet.getWorkbook(); // 获取 Workbook对象
CellStyle cellStyle = workbook.createCellStyle(); // 创建一个 CellStyle对象
Cell cell = context.getCell();// 获取当前单元格对象
Integer relativeRowIndex = context.getRelativeRowIndex();//相对头部的距离
int columnIndex = cell.getColumnIndex();// 获取当前列
Boolean isHead = context.getHead();//是否为头部
List<CellRangeAddress> mergedRegions = context.getWriteSheetHolder().getSheet().getMergedRegions();//合并单元格列表
Font font = workbook.createFont();//创建字体对象
//一定要将WriteCellStyle设置为null,不然会被默认样式覆盖
context.getFirstCellData().setWriteCellStyle(null);
}
}
自定义合并单元格
咱们以表尾为例,将表尾合并单元格
/**
*
* @param size 数据长度
* @param headNum 头部行数
*/
public CustomCellWriteHandler(int size, int headNum) {
this.leng = size;
this.headNum = headNum;
}
@Override
public void afterCellDispose(CellWriteHandlerContext context) {
Sheet sheet = context.getWriteSheetHolder().getSheet();
Workbook workbook = sheet.getWorkbook(); // 获取 Workbook对象
CellStyle cellStyle = workbook.createCellStyle(); // 创建一个 CellStyle对象
Cell cell = context.getCell();
Integer relativeRowIndex = context.getRelativeRowIndex();
int columnIndex = cell.getColumnIndex();
List<CellRangeAddress> mergedRegions = context.getWriteSheetHolder().getSheet().getMergedRegions();
if (context.getHead()) { // 如果是头,设置对应格式
} else {
// 设置最后一列样式
if (ObjUtil.equals(relativeRowIndex+1, leng)){
// 获取行数(包括头部)
int rowIndex = cell.getRowIndex();
// 创建合并单元格范围对象
CellRangeAddress cellRangeAddress = new CellRangeAddress(rowIndex, rowIndex, 0, 19);
// 新增合并单元格
sheet.addMergedRegion(cellRangeAddress);
// 向左对齐
cellStyle.setAlignment(HorizontalAlignment.LEFT);
}
}
cell.setCellStyle(cellStyle);
context.getFirstCellData().setWriteCellStyle(null);
}
自定义设置宽度
// 设置宽度(列数,列宽(需要计算))
sheet.setColumnWidth(0,3923);
设置边框
cellStyle.setBorderLeft(BorderStyle.THIN);//细实线
cellStyle.setBorderTop(BorderStyle.THIN);
cellStyle.setBorderRight(BorderStyle.THIN);
cellStyle.setBorderBottom(BorderStyle.THIN);
cell.setCellStyle(cellStyle);
设置单元格格式
我这里是设置0不显示和保留两位小数,具体格式可以参照
DataFormat df = workbook.createDataFormat();
cellStyle.setDataFormat(df.getFormat("[=0]\"\";0.00"));
设置字体和背景
Font font = workbook.createFont();
font.setBold(true);//加粗
font.setFontHeightInPoints((short) 11);
cellStyle.setFillBackgroundColor(IndexedColors.WHITE.getIndex());// 背景设置
font.setFontName("宋体");
cellStyle.setFont(font);
多个sheet情况
ExcelWriter excelWriter = EasyExcel.write(Path).build();
//registerWriteHandler换成自己的
for(int i =0 ;i<5;i++){
WriteSheet writeSheet = EasyExcel.writerSheet(sheetName).head(getHeader(name+stu[i]))
.registerWriteHandler(new CustomCellWriteHandler(list1.size(), 4, ints, lists, 3))
.sheetNo(i).build();
excelWriter.write(list1, writeSheet);
}
结束!有什么问题和建议也欢迎来打扰哦!Q-Q