Excel神办公—【四】使用EasyExcel指定冻结行列操作

举报
灰小猿 发表于 2021/12/07 18:25:24 2021/12/07
【摘要】 hello,你好呀,我是灰小猿,一个超会写bug的程序猿!关于easyexcel技术我已经和大家介绍了几篇关于它的基础操作,所以尝试过easyexcel的小伙伴一定会感受到它在读写excel表格时的强大之处其实使用easuexcel技术来读写excel文件的高端操作还有很多,今天我就来和大家分享第一个使用easyexcel来自定义单元格样式的操作——指定冻结工作表行列, 导入maven依赖在...

hello,你好呀,我是灰小猿,一个超会写bug的程序猿!
关于easyexcel技术我已经和大家介绍了几篇关于它的基础操作,所以尝试过easyexcel的小伙伴一定会感受到它在读写excel表格时的强大之处
其实使用easuexcel技术来读写excel文件的高端操作还有很多,今天我就来和大家分享第一个使用easyexcel来自定义单元格样式的操作——指定冻结工作表行列

导入maven依赖

在使用easyexcel的时候需要在pom文件中导入所需依赖。

在这里需要注意,导入依赖的时候,一定要导入poi对03和07版本支持的两个依赖,否则在进行写入的时候会出错

        <!--poi依赖03版本-->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>3.17</version>
        </dependency>
        <!--poi依赖07版本-->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>3.17</version>
        </dependency>
        <!--easyexcel依赖-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>2.2.6</version>
        </dependency>

指定冻结行列操作

在easyexcel中指定冻结行列的操作需要写在过滤器中,并且将过滤器添加到要写入的工作表中才能生效。

实现SheetWriteHandler过滤器

SheetWriteHandler过滤器(处理器)的作用就是可以让我们自定义单元格的样式,我们常用的是其中的afterSheetCreate()方法,在该方法中,我们可以对当前所在的单元格进行样式的设置,

在过滤器中实现行列冻结

想要实现行列冻结,就需要在afterSheetCreate()方法中进行操作,该方法中有一个writeSheetHolder参数,表示当前写入表格的处理器,我们可以通过该处理器来获取到当前正在操作的sheet,
实现行列冻结的方法是createFreezePane(), 该方法有两种调用方式,源码如下:

    void createFreezePane(int var1, int var2);
    void createFreezePane(int var1, int var2, int var3, int var4);

第一种传入两个参数,含义是:

  • var1 冻结的列数
  • var2 冻结的行数

默认从第0行,第0列开始冻结,

第二种传入四个参数,含义是:

  • var1 冻结的列数
  • var2 冻结的行数
  • var3 冻结后右边第一列的列号
  • var4 冻结后下边第一行的行号 这种方法下冻结会更加的精确,

该方法在afterSheetCreate()下的具体使用如下:

/**
 * 自定义固定冻结指定行列
 */
@Slf4j
public class CustomFreezeRowColHandlerUtil implements SheetWriteHandler {

    @Override
    public void beforeSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {

    }

    @Override
    public void afterSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {
        //        获取到当前的sheet
          Sheet sheet = writeSheetHolder.getSheet();
            /**
             * 执行冻结行列从操作,冻结第一行和第一列
             * void createFreezePane(int var1, int var2, int var3, int var4);
             * 第一个参数:冻结的列数
             * 第二个参数:冻结的行数
             * 第三个参数:冻结后第一列的列号
             * 第四个参数:冻结后第一行的行号
             */
            sheet.createFreezePane(1, 1, 1, 1);
            log.info("执行冻结行列从操作成功!!!!!!!!");
        }
    }
}

但是在实际使用的过程中,以上这写法显然是不合理的,对于需要冻结的行和列,我们应该以参数的形式传递进去,并且对传递过来的值进行合法性判断,只有符合参数要求的行列,才能被执行冻结,

测试冻结行列过滤器

以上就已经实现了一个简单的冻结行列的过滤器,但是该过滤器只有在传递到对应的写入操作中才可以生效。具体代码如下:

    @Test
    public void test01() {
        String fileName = FILEPATH + "test01.xlsx";
        try {
            EasyExcel.write(fileName)
                    .registerWriteHandler(new CustomHandler())
                    .head(head()).sheet().doWrite(data());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

上面的代码中head()和doWrite()方法传递进入的是表头的列表和数据的列表,我在这里没有写出,小伙伴们可以自己生成。

关于使用easyexcel来实现指定行列冻结的操作就和大家讲解到这里,有疑问的小伙伴们可以留言提出,\

我是灰小猿,我们下期间!

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。