excel 系列

Excel Export 踩坑注意点+导出方案设计

基于 hutool 的 EXCEL 优化实现

iexcel-excel 大文件读取和写入,解决 excel OOM 问题-01-入门介绍

iexcel-excel 大文件读取和写入-02-Excel 引导类简介

iexcel-excel 大文件读取和写入-03-@ExcelField 注解介绍

iexcel-excel 大文件读取和写入-04-order 指定列顺序

iexcel-excel 大文件读取和写入-05-file bytes 获取文件字节信息

Aapche POI java excel 操作工具包入门

java 字段重排序

一般实现都是基于 java 反射直接获取 Field 字段列表,一般而言这个顺序是固定的。

可是有时候,比如为了内存对齐,jvm 可能会对 Field 信息进行调整,从而导致顺序的不确定性。

这种概率很低,但是还是会发生。

可能你面对的是苛刻的产品,也可能是严格的客户,也可能是对技术的追求,这个问题一定要解决。

问题就是用来解决的。

order 属性

方法定义

  [java]
1
2
3
4
5
6
7
8
9
10
/** * 指定顺序编号 * 解释:默认是按照 Field 信息直接反射处理的,但是有一种情况反射的字段顺序可能会是错乱的。 * 如进行内存对齐的时候,这个概率虽然很低,但是可以通过指定 order 属性来处理。 * (1)order 值越小,生成 excel 列越靠前。 * (2)无注解的字段默认 order=0 * @return 顺序编号 * @since 0.0.5 */ int order() default 0;

解决方案

我们选择比较简单的一种方式,通过为 @ExcelField 指定一个 order 属性。

通过指定 order 属性来决定 excel 生成结果的顺序。

为了和原来兼容,默认 order=0,不指定注解时,默认 order=0。

使用简介

参见 ExcelBsOrderTest 测试类。

对象定义

  [java]
1
2
3
4
5
6
7
8
9
10
11
12
13
public class UserFieldOrdered { @ExcelField(headName = "姓名", order = 1) private String name; @ExcelField(headName = "年龄", order = 2) private int age; @ExcelField(headName = "地址", order = 0) private String address; //Getter/Setter/toString() }

测试代码

  [java]
1
2
3
final String filePath = PathUtil.getAppTestResourcesPath()+"/userOrdered.xls"; List<UserFieldOrdered> models = buildUserList(); ExcelBs.newInstance(filePath).write(models);

生成 excel 效果

  [plaintext]
1
2
地址 姓名 年龄 china one 10

其他

不知道基于 ASM 字节码直接操作结果如何,后续会做相关的优化。