Android 优雅的读写Excel

作者:Hujian 时间:2021-09-19 15:10:37 

Excel

apache 为 java开发者们提供了一套excel表格读写的工具:POI ,对于一个小白来说每次读写使用POI需要写一套复杂的读写流程实属不易,这里小编为大家封装了一套简单易用的excel读写工具

注解描述
@ExcelReadCellName 标记表头名称
@ExcelTable使用类上用来指定表名
@ExcelWriteAdapter展开数据集合适配器
@ExcelWriteCell输出文件编辑列名称,列号信息。
@ExcelReadAggregate标记类成员变量用来保存没有标记的数据

读取excel文件:

数据源(表名称:测试表1):

物品编码物品名称存放位置备注日期
TY122635厨房-面团分割机0SDS-30S2021.2.1
TY122654黑白激光打印机0兄弟 HL-5590DN2021.2.2
TY122652黑白激光打印机0兄弟 HL-5590DN2021.2.3
TY122634台式计算机0联想ThinkCentre M710t-D7492021.2.4

创建实体对象:

@ExcelTable(sheetName = "测试表1")
public class Table {
   @ExcelReadCell(name = "存放位置")
   public String storageLocation;
   @ExcelReadCell(name = "物品名称")
   public String name;
   @ExcelReadCell(name = "物品编码")
   public String code;
   //指定此变量保存其他数据,也可以不处理
   @ExcelReadAggregate
   public String extend;
}

这里只指定了三列数据,其他没有指定的数据列(备注、日期),将被聚合保存到被**@ExcelReadAggregate标注extend变量中,当然如果不需要这些数据也可以不用声明变量使用@ExcelReadAggregate**标注。

被@ExcelReadAggregate标注的对象接收的是一个JsonArray String 对象。

Table
{
storageLocation='0',
note='SDS-30S',
name='厨房-面团分割机',
code='TY2023122635',
extend=
'[{"name":"日期","value":"2021.2.1","index":7},{"name":"备注","value":"SDS30S","index":8}]'

Use:

Excel.get().readWith(is).doReadXLSX(new IParseListener<Table>() {
   @Override
   public void onStartParse() {
   }
   @Override
   public void onParse(Table test, JSONArray jsonArray) {
   }
   @Override
   public void onParseError(Exception e) {
   }
   @Override
   public void onEndParse() {
   }
}, Table.class);

输出excel文件:

@ExcelTable(sheetName = "测试表1")
public class Table {
   @ExcelWriteCell(writeIndex = 2, writeName = "存放位置")
   public String storageLocation;
   @ExcelWriteCell(writeIndex = 1, writeName = "物品名称")
   public String name;
   @ExcelWriteCell(writeIndex = 0, writeName = "物品编码")
   public String code;
   //如果你将多个数据聚合在某一个变量中,可以通过实现IConvertParserAdapter接口来处理数据以便正确写入文件
   @ExcelWriteAdapter(adapter = JsonArrayConvertAdapter.class)
   public String extend;
}

@ExcelWriteCell

ExcelWriteCell注解有两个属性,writeIndex指定数据所属列,writeName指定列名称

@ExcelWriteAdapter

ExcelWriteAdapter用来辅助工具正确写入用户自定义的聚合数据。

这里extend 的数据如下:

[
   {
       "name":"日期",
       "value":"2021.2.9",
       "index":3
   },
   {
       "name":"备注",
       "value":"1.0",
       "index":4
   }
]

Name 表示列名称,value表示值,index表示列号,这里的数据结构可以自行定义。

IConvertParserAdapter 接口

使用了聚合数据,就需要实现IConvertParserAdapter接口用来解析你的聚合数据并通过ISheet接口回调数据的列名称,值,列号等信息。

针对上面的聚合数据:

public class JsonArrayConvertAdapter implements IConvertParserAdapter {
   @Override
   public void convert(ISheet sheet, Object o) {
       JSONArray jsonArray = null;
       try {
           jsonArray = new JSONArray((String) o);
       } catch (JSONException e) {
           e.printStackTrace();
       }
       for (int i = 0; i < jsonArray.length(); i++) {
           JSONObject json = (JSONObject) jsonArray.opt(i);
           String name = (String) json.opt("name");
           Object value = json.opt("value");
           int index = (int) json.opt("index");
           sheet.onCreateCell(name, value, index);
       }
   }
}

@ExcelWriteAdapter使用方法:

@ExcelWriteAdapter(adapter = JsonArrayConvertAdapter.class)
public String extend;

Use:

Excel.get().writeWith(file).doWrite(new IWriteListener() {
                       @Override
                       public void onStartWrite() {
                           Log.d(TAG, "onStartWrite: ");
                       }
                       @Override
                       public void onWriteError(Exception e) {
                           Log.d(TAG, "onWriteError: "+e);
                       }
                       @Override
                       public void onEndWrite() {
                           Log.d(TAG, "onEndWrite: ");
                       }
                   },data);

gitee地址:gitee.com/Jian-Hu/Exc&hellip;

github地址:github.com/Andihu/Exce&hellip;

来源:https://juejin.cn/post/7213771312121102394

标签:Android,读写,Excel
0
投稿

猜你喜欢

  • C#采用FileSystemWatcher实现监视磁盘文件变更的方法

    2023-12-10 02:52:49
  • 手写redis@Cacheable注解 参数java对象作为key值详解

    2022-04-26 11:30:36
  • Java中四种访问权限资料整理

    2021-12-04 13:23:58
  • javaweb学习总结——使用JDBC处理MySQL大数据

    2022-10-19 22:45:32
  • 详解JAVA中的OPTIONAL

    2022-08-22 17:09:04
  • Java接口继承和使用接口操作示例

    2023-11-29 05:08:43
  • SpringBoot深入探究@Conditional条件装配的使用

    2021-08-18 00:06:53
  • Flutter状态管理Bloc使用示例详解

    2023-08-24 09:09:10
  • java中dart类详细讲解

    2022-01-23 13:01:13
  • 使用Spring的拦截器监测每个Controller或方法的执行时长

    2021-12-19 16:36:01
  • java 字浮串提取方法汇集

    2023-11-24 14:43:16
  • Java操作IO对象流进行数据的读写

    2021-08-25 03:33:49
  • 一文了解Java读写锁ReentrantReadWriteLock的使用

    2023-10-12 19:28:21
  • jenkins+Maven从SVN上构建项目的方法

    2022-07-09 04:42:37
  • Java动态获取实现某个接口下所有的实现类对象集合

    2023-04-01 14:43:20
  • Java 集合概览(小结)

    2023-11-08 02:50:37
  • 基于WPF实现验证码控件

    2021-08-15 21:44:36
  • Java中单例模式的七种写法示例

    2021-07-16 07:57:22
  • Android Studio gradle 编译提示‘default not found’ 解决办法

    2023-07-19 09:23:06
  • Springboot jpa @Column命名大小写问题及解决

    2023-02-19 03:24:21
  • asp之家 软件编程 m.aspxhome.com