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
相关产品推荐
相关产品推荐

