EsayExcel使用--自定义单元格样式、合并单元格、自定义表头表尾、合并单元格、多个sheet......

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

  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值