Flutter中如何使用csv包更新CSV文件的指定单元格内容
核心前置说明
assets目录下的所有文件都是应用打包时内置的只读资源,无法直接修改。你需要先把assets中的csv文件复制到应用的可读写目录(例如应用文档目录),后续所有读写操作都操作该目录下的文件即可实现修改更新。
依赖准备
需要先在pubspec.yaml中添加以下依赖:
dependencies: flutter: sdk: flutter csv: ^最新稳定版本号 path_provider: ^最新稳定版本号
完整实现代码
1. 初始化:将assets中的csv复制到本地可读写目录
这个逻辑建议在应用启动后、首次操作csv前执行一次即可:
import 'dart:io'; import 'package:flutter/services.dart'; import 'package:path/path.dart' as path; import 'package:path_provider/path_provider.dart'; import 'package:csv/csv.dart'; late String localCsvPath; // 本地可读写csv文件的路径 // 初始化复制assets文件到本地 initCsvFile() async { // 获取应用文档目录 Directory appDocDir = await getApplicationDocumentsDirectory(); localCsvPath = path.join(appDocDir.path, "class01.csv"); // 如果本地文件不存在才复制 if(!await File(localCsvPath).exists()) { ByteData data = await rootBundle.load("assets/class01.csv"); List<int> bytes = data.buffer.asUint8List(data.offsetInBytes, data.lengthInBytes); await File(localCsvPath).writeAsBytes(bytes); } }
2. 读取指定单元格内容(适配本地文件版本)
readCSV(int row, int col) async { File csvFile = File(localCsvPath); String csvContent = await csvFile.readAsString(); List<List<dynamic>> csvData = const CsvToListConverter().convert(csvContent); // 下标越界判断,避免崩溃 if(row < csvData.length && col < csvData[row].length) { setState(() { displayText = csvData[row][col]; }); } }
3. 修改并更新指定单元格内容
updateCSV(int row, int col, dynamic newValue) async { File csvFile = File(localCsvPath); String csvContent = await csvFile.readAsString(); List<List<dynamic>> csvData = const CsvToListConverter().convert(csvContent); // 下标越界判断 if(row >= csvData.length || col >= csvData[row].length) { return; } // 修改指定单元格的值 csvData[row][col] = newValue; // 将修改后的二维数组转回csv字符串 String updatedCsv = const ListToCsvConverter().convert(csvData); // 回写覆盖本地文件 await csvFile.writeAsString(updatedCsv); }
注意事项
- 如果你的csv有自定义分隔符、引号规则等,需要在
CsvToListConverter和ListToCsvConverter的参数中配置和读取时一致的规则,避免转码后格式错乱 - 行号、列号默认从0开始计数,和你原有读取逻辑保持一致
内容的提问来源于stack exchange,提问作者Ian Rajkumar
相关产品推荐
相关产品推荐

