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

