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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 07:54:01