Apache POI框架中,HSSFCell的setCellType和setCellStyle的区别

来看一看POI是怎么设置excel单元格类型的。

题图:from Google

引子

HSSFCell类是对Excel表格中的单元格的抽象。HSSFCell类中的setCellType和setCellStyle方法,都可以用来设置单元格格式,但是两者又有细微不同,本篇文章就简单分析下他们的不同之处。

1.铺垫

  1. HSSFCell类有两个属性与今天要说的方法有关
    1. int _cellType;
      存储单元格类型的int值
    2. CellValueRecordInterface _record;
      存储单元格数据的对象,包含单元格值与类型,对象内存储类型的属性也是int型。
      CellValueRecordInterface只是一个接口,具体不同类型单元格存的也是不同类型的实现类。
  2. 读取单元格时是如何获取单元格类型的
    一般来说,判断单元格类型,我们使用HSSFCell的getCellType方法,此方法返回_cellType属性值。

    而在构造HSSFCell时,会根据_record的类型去为_cellType赋值。

2.区别

通过跟踪源码的方式,对两种方法的不同总结如下

  1. setCellType
    setCellType方法实际上是修改了_cellType的值,并且将_record改为对应类型的CellValueRecordInterface实现类。
  2. setCellSytle
    setCellSytle方法实际上只是修改了_record对象里保存类型的int型变量的值,但是没有修改_cellType的值。

简单地说,更加推荐使用setCellType方法,因为它将两处保存单元格类型的属性都修改为正确的值了;而setCellStyle没有对_cellType进行修改。

如果在调用setCellStyle后,重新读取Excel文件之前,马上调用getCellType,就会发现得到的值并没有改变。

注意到上文着重提到的“重新读取Excel文件之前”了吗?就像铺垫中说的,在重新读取单元格时,会根据_record类型为_cellType赋值,相当于将两个属性的值都修正了。

但是,其实这两种方法在使用上可以忽略差别,因为我们基本上不会重复读取单元格进行修改。都是修改后关闭文件。