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

Flutter中如何将List<dynamic>转换为Excel并本地下载存储

将List数据生成Excel并下载到手机设备(Flutter实现)

1. 添加依赖

在pubspec.yaml中添加以下依赖:

dependencies:
  flutter:
    sdk: flutter
  excel: ^2.0.0  # 生成Excel文件
  path_provider: ^2.1.1  # 获取设备存储路径
  permission_handler: ^10.2.0  # 安卓存储权限申请
  open_file: ^3.3.2  # 可选,打开生成的Excel文件

执行flutter pub get完成依赖安装。

2. 配置安卓权限

在android/app/src/main/AndroidManifest.xml中添加存储权限:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

针对Android 13及以上系统,补充媒体权限:

<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
<uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />

3. 核心实现代码

import 'dart:io';
import 'package:excel/excel.dart';
import 'package:path_provider/path_provider.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:open_file/open_file.dart';

Future<void> generateAndSaveExcel(List<dynamic> apiData) async {
  // 安卓端申请存储权限
  if (Platform.isAndroid) {
    final permissionStatus = await Permission.storage.request();
    if (!permissionStatus.isGranted) return;
  }

  // 初始化Excel工作表
  final excel = Excel.createExcel();
  final sheet = excel['用户数据'];

  // 写入表头(取第一条数据的键作为表头)
  if (apiData.isNotEmpty) {
    final headers = apiData.first.keys.toList();
    for (int col = 0; col < headers.length; col++) {
      sheet.cell(CellIndex.indexByColumnRow(columnIndex: col, rowIndex: 0)).value = headers[col];
    }

    // 逐行写入数据
    for (int row = 0; row < apiData.length; row++) {
      final dataRow = apiData[row] as Map<String, dynamic>;
      for (int col = 0; col < headers.length; col++) {
        sheet.cell(CellIndex.indexByColumnRow(columnIndex: col, rowIndex: row + 1)).value = dataRow[headers[col]];
      }
    }
  }

  // 获取存储路径
  Directory? storageDir;
  if (Platform.isAndroid) {
    storageDir = await getExternalStorageDirectory();
    // 创建自定义文件夹存放Excel
    final customFolder = Directory('${storageDir!.path}/Excel导出');
    if (!await customFolder.exists()) await customFolder.create(recursive: true);
    storageDir = customFolder;
  } else if (Platform.isIOS) {
    storageDir = await getApplicationDocumentsDirectory();
  }

  // 保存文件
  final excelFile = File('${storageDir!.path}/用户数据.xlsx');
  await excelFile.writeAsBytes(excel.encode()!);

  // 打开生成的文件(可选)
  await OpenFile.open(excelFile.path);
}

// 调用示例
void main() async {
  final apiResponse = {
    "data": [
      {"First Name":"1","Last Name":"Dulce","Gender":"Abril","Country":"Female","Age":"United States","Date":"32","Id":"15/10/2017"},
      {"First Name":"2","Last Name":"Mara","Gender":"Hashimoto","Country":"Female","Age":"Great Britain","Date":"25","Id":"16/08/2016"},
      {"First Name":"3","Last Name":"Philip","Gender":"Gent","Country":"Male","Age":"France","Date":"36","Id":"21/05/2015"},
      {"First Name":"4","Last Name":"Kathleen","Gender":"Hanner","Country":"Female","Age":"United States","Date":"25","Id":"15/10/2017"},
      {"First Name":"5","Last Name":"Nereida","Gender":"Magwood","Country":"Female","Age":"United States","Date":"58","Id":"16/08/2016"}
    ]
  };
  await generateAndSaveExcel(apiResponse['data'] as List<dynamic>);
}

关键说明

  • 表头自动提取:默认取第一条数据的所有键作为Excel表头,需确保API返回的数据结构一致。
  • 存储位置:安卓文件存放在外部存储的「Excel导出」文件夹,iOS存放在应用Documents目录,可通过系统文件管理器找到。
  • 数据兼容性:示例API数据存在字段值与键不匹配的情况(如Gender对应"Abril"),代码会原样写入,如需修正需提前预处理数据。

内容的提问来源于stack exchange,提问作者Kyaw Lwin Soe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 11:30:03