EasyExcel动态表头多sheet导出,单元格操作样式,自动修改单元格格式

EasyExcel动态表头多sheet导出,单元格操作样式,自动修改单元格格式

说明

EasyExcel是一款开源的Java库,用于读取、写入和操作Excel文件。它是阿里巴巴集团开发的一款高效、功能丰富且易于使用的Excel操作工具。

EasyExcel提供了简洁的API,使得读写Excel文件变得非常方便,尤其适用于大量数据的导入导出操作。以下是EasyExcel的一些主要特性:

读取和写入Excel文件:EasyExcel提供了简单易用的API用于读取和写入Excel文件。你可以通过指定模型类来读取Excel文件的数据,并将数据写入到Excel文件中。

高性能:EasyExcel采用了基于事件驱动的模式,在读取和写入时能够更高效地处理大量数据。它能够以极快的速度读取和写入Excel文件,提高了数据处理的效率。

支持大数据量:EasyExcel使用内存友好的方式进行数据读取和写入,可以处理大量数据而不会导致内存溢出的问题。

导入导出灵活:EasyExcel支持导入和导出多种格式的Excel文件,包括xls和xlsx格式。你可以导入Excel文件的数据到Java对象中,并将Java对象的数据导出为Excel文件。

数据转换:EasyExcel提供了丰富的数据转换功能,可以方便地进行数据格式转换、数据映射、日期格式化等操作。

监听器支持:EasyExcel提供了监听器功能,你可以自定义监听器来处理Excel读取和写入的过程,实现一些自定义的业务逻辑。

多线程支持:EasyExcel支持多线程并发读写Excel,提高数据处理的速度。

自定义处理器

package com.csair.demo.util;

import com.alibaba.excel.metadata.CellData;
import com.alibaba.excel.metadata.Head;
import com.alibaba.excel.write.handler.CellWriteHandler;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.metadata.holder.WriteTableHolder;
import org.apache.poi.ss.usermodel.*;
import org.thymeleaf.util.StringUtils;

import java.util.List;

public class CustomCellWriter implements CellWriteHandler {
    @Override
    public void beforeCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Head head, Integer integer, Integer integer1, Boolean aBoolean) {

    }

    @Override
    public void afterCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Cell cell, Head head, Integer integer, Boolean aBoolean) {

    }

    @Override
    public void afterCellDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, List<CellData> list, Cell cell, Head head, Integer integer, Boolean aBoolean) {
        Sheet sheet = writeSheetHolder.getSheet();
        Workbook workbook = sheet.getWorkbook();

        Font font = workbook.createFont();
        font.setColor(IndexedColors.RED.getIndex());

        CellStyle cellStyle = workbook.createCellStyle();
        cellStyle.setFont(font);

        //获取表头总共有多少列
        short lastCellNum = writeSheetHolder.getSheet().getRow(0).getLastCellNum();
        //过滤表头
        if (!aBoolean) {
            //获取当前行数
            int rowNum = integer + 1;
            //每一个单元格都会执行afterCellDispose此方法,每执行一次单元格数据+1,此处是校验当前行的全部单元格加载完毕
            if (writeSheetHolder.getSheet().getRow(rowNum).getLastCellNum() == lastCellNum) {
                //加载完毕执行业务代码(可按照自己实际业务进行修改)
                for (int i = 0; i < lastCellNum; i++) {
                    if (i % 2 != 0) {
                        //指定单元格修改样式
                        writeSheetHolder.getSheet().getRow(rowNum).getCell(i).setCellStyle(cellStyle);
                    }
                    //录入的数据全部是String类型,直接获取就行,如果有不同类型数据,需要添加类型判断
                    String stringCellValue = writeSheetHolder.getSheet().getRow(rowNum).getCell(i).getStringCellValue();
                    //setCellValue会根据数据自动修改单元格格式
                    if (StringUtils.isEmpty(stringCellValue)) {
                        writeSheetHolder.getSheet().getRow(rowNum).getCell(i).setCellValue("");
                    } else {
                        writeSheetHolder.getSheet().getRow(rowNum).getCell(i).setCellValue(Double.parseDouble(stringCellValue));
                    }
                }
            }
        }
    }
}

实现类

@GetMapping("/export")
    public void export(HttpServletResponse response) {
        try {

            response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
            response.setCharacterEncoding("utf-8");
            // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
            String fileName = URLEncoder.encode("文件名", "UTF-8").replaceAll("\\+", "%20");
            response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");


            List<List<String>> head1 = new ArrayList<>();
            List<List<String>> data1 = new ArrayList<>();

            List<List<String>> head2 = new ArrayList<>();
            List<List<String>> data2 = new ArrayList<>();

            ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).registerWriteHandler(new CustomCellWriter()).build();
            excelWriter.write(data1, EasyExcel.writerSheet("sheet1").head(head1).build());
            excelWriter.write(data2, EasyExcel.writerSheet("sheet2").head(head2).build());

            //关闭流
            excelWriter.finish();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值