You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter使用excel1.1.5读取Excel时数据带多余包裹如何提取单元格真实值

Flutter读取excel包单元格真实值问题

问题场景

在Flutter开发中使用excel 1.1.5包读取Excel文件,目标Excel数据如下:
Excel文件数据预览
初始读取代码如下:

List<String> rowdetail = [];

_importFromExcel() async {
var file =
    "storage/emulated/0/Android/data/com.xxxx.xxxx/files/Download/Input.xlsx";
var bytes = File(file).readAsBytesSync();
var excel = Excel.decodeBytes(bytes);

    for (var table in excel.tables.keys) {
      for (var row in excel.tables[table]!.rows) {
        rowdetail.add(row.toString());
      }
    }
}

运行后打印的读取结果带额外冗余内容:

I/flutter (12873): [Data(1, 0, 0, null, Sheet1), Data(Assets, 1, 0, null, Sheet1), Data(Bank accounts, 2, 0, null, Sheet1), Data(Cb 7723, 3, 0, null, Sheet1), Data(2022-05-26 10:46:07.679579, 4, 0, null, Sheet1), Data(27, 5, 0, null, Sheet1), Data(6269, 6, 0, null, Sheet1), Data(, 7, 0, null, Sheet1)]

比如第一行第一列的预期取值是1,实际输出却带了Data(前缀和, 0, 0, null, Sheet1)后缀,无法直接拿到真实单元格数据。

解决方法

出现这个问题的原因是:遍历行拿到的每个元素都是excel包内置的Data类型单元格对象,直接对对象调用toString()会输出对象的完整结构信息,而非单元格存储的内容。
Data对象提供了value属性,专门存储单元格的真实值,读取这个属性就能拿到目标内容,修改后的代码如下:

List<String> rowdetail = [];

_importFromExcel() async {
  var file = "storage/emulated/0/Android/data/com.xxxx.xxxx/files/Download/Input.xlsx";
  var bytes = File(file).readAsBytesSync();
  var excel = Excel.decodeBytes(bytes);

  for (var table in excel.tables.keys) {
    for (var row in excel.tables[table]!.rows) {
      // 逐单元格取值
      List<String> singleRowContent = [];
      for (var cell in row) {
        // 空单元格做判空处理,避免报错
        singleRowContent.add(cell?.value?.toString() ?? "");
      }
      // 按需求拼接单行内容后加入列表
      rowdetail.add(singleRowContent.join(","));
    }
  }
}
  • 如果需要处理数字、日期、公式等特殊格式的单元格,可以先判断cell.value的具体类型,再做针对性格式化,无需直接转成字符串。
  • 不要直接对Data实例调用toString()取值,该方法仅用于输出对象调试信息,不会返回业务需要的单元格内容。

内容的提问来源于stack exchange,提问作者gputhige

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.31 22:09:20