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

Flutter使用excel 2.1.0包追加Excel文件时总是被覆盖求助

Flutter Excel 2.1.0 追加数据覆盖问题解决

问题根源

你的代码核心错误是每次操作都创建全新的Excel实例,而非加载已存在的文件内容:

  • 调用Excel.createExcel()会生成一个空的新Excel,即使文件已存在,你也没有读取原文件的数据到这个实例里
  • 后续用FileMode.append把新Excel的字节追加到原文件后,会彻底破坏Excel的文件结构,导致打开时系统只能识别为新文件(看起来像是被覆盖)

修正方案

当文件存在时,先读取原文件的字节,用Excel.decodeBytes()加载已有数据到Excel实例,修改后再完整写入原文件(无需FileMode.append,因为修改后的实例包含原数据+新数据)。

修正后的代码

var dir = "/storage/emulated/0/Download/";
String name = "ExcelTest2.xlsx";
final filePath = join(dir, name);
var excel = Excel.createExcel();
var sheet;

if (await File(filePath).exists()) {
  // 读取已有文件并加载到Excel实例
  final fileBytes = await File(filePath).readAsBytes();
  excel = Excel.decodeBytes(fileBytes);
  sheet = excel.sheets[excel.getDefaultSheet() as String];
  
  // 追加新行
  List<String> data = ["data"];
  sheet!.appendRow(data);
  
  // 写入修改后的完整数据(覆盖原文件,因为实例包含所有内容)
  var bytes = excel.save();
  File(filePath)
    ..writeAsBytesSync(bytes!);
  print("appended");
} else {
  print('File is Being Written To File System');
  sheet = excel.sheets[excel.getDefaultSheet() as String];
  
  // 设置表头和自动列宽
  for (int i = 0; i < 7; i++) {
    sheet!.setColAutoFit(i);
  }
  sheet.cell(CellIndex.indexByColumnRow(columnIndex: 0, rowIndex: 0)).value = "Date/Time";
  sheet.cell(CellIndex.indexByColumnRow(columnIndex: 1, rowIndex: 0)).value = "Type";
  sheet.cell(CellIndex.indexByColumnRow(columnIndex: 2, rowIndex: 0)).value = "data5";
  sheet.cell(CellIndex.indexByColumnRow(columnIndex: 3, rowIndex: 0)).value = "data4";
  sheet.cell(CellIndex.indexByColumnRow(columnIndex: 4, rowIndex: 0)).value = "data3";
  sheet.cell(CellIndex.indexByColumnRow(columnIndex: 5, rowIndex: 0)).value = "data1 ";
  sheet.cell(CellIndex.indexByColumnRow(columnIndex: 6, rowIndex: 0)).value = "data2";
  
  var filebytes = excel.save();
  File(filePath)
    ..createSync(recursive: true)
    ..writeAsBytes(filebytes!);
}

关键说明

  • 读取已有文件必须用Excel.decodeBytes(),这是excel包提供的加载现有Excel的正确方式
  • 修改后的Excel实例包含原所有数据+新追加的行,直接用默认的FileMode.write写入原文件即可,无需追加字节
  • 优化了列宽设置的代码,用循环替代重复调用,更简洁

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 13:57:49