一、引入flutter插件
dependencies:
syncfusion_flutter_xlsio: ^20.3.50-beta
dio: ^4.0.6
open_file: ^3.2.1
二、在utils中创建helper文件夹
三、在helper中创建save_file_mobile.dart和save_file_web.dart文件
///save_file_mobile
import 'dart:io';
import 'package:open_file/open_file.dart' as open_file;
import 'package:path_provider/path_provider.dart' as path_provider;
// ignore: depend_on_referenced_packages
import 'package:path_provider_platform_interface/path_provider_platform_interface.dart';
///To save the Excel file in the device
///To save the Excel file in the device
Future<void> saveAndLaunchFile(List<int> bytes, String fileName) async {
//Get the storage folder location using path_provider package.
String? path;
if (Platform.isAndroid ||
Platform.isIOS ||
Platform.isLinux ||
Platform.isWindows) {
final Directory directory =
await path_provider.getApplicationSupportDirectory();
path = directory.path;
} else {
path = await PathProviderPlatform.instance.getApplicationSupportPath();
}
final File file =
File(Platform.isWindows ? '$path\\$fileName' : '$path/$fileName');
await file.writeAsBytes(bytes, flush: true);
if (Platform.isAndroid || Platform.isIOS) {
//Launch the file (used open_file package)
await open_file.OpenFile.open('$path/$fileName');
} else if (Platform.isWindows) {
await Process.run('start', <String>['$path\\$fileName'], runInShell: true);
} else if (Platform.isMacOS) {
await Process.run('open', <String>['$path/$fileName'], runInShell: true);
} else if (Platform.isLinux) {
await Process.run('xdg-open', <String>['$path/$fileName'],
runInShell: true);
}
}
///save_file_web
import 'dart:async';
import 'dart:convert';
// ignore: avoid_web_libraries_in_flutter
import 'dart:html';
///To save the Excel file in the device
///To save the Excel file in the device
Future<void> saveAndLaunchFile(List<int> bytes, String fileName) async {
AnchorElement(
href:
'data:application/octet-stream;charset=utf-16le;base64,${base64.encode(bytes)}')
..setAttribute('download', fileName)
..click();
}
四、在utils中创建excel.dart文件
import 'package:syncfusion_flutter_xlsio/xlsio.dart' as Flutter_xlsio;
import 'helper/save_file_mobile.dart'
if (dart.library.html) 'helper/save_file_web.dart';
class Excel {
static Future<void> generateExcel(
// Excel标题
List<String>? columnList,
// Excel数据
List? dataList,
// Excel文件名称
String? excelName,
) async {
List excelHeader = [
'A1',
'B1',
'C1',
'D1',
'E1',
'F1',
'G1',
'H1',
'I1',
'J1',
'K1',
'L1',
'M1',
'N1',
'O1',
'P1',
'Q1',
'R1',
'S1',
'T1',
'U1',
'V1',
'W1',
'X1',
'Y1',
'Z1',
];
// 创建一个Excel
final Flutter_xlsio.Workbook workbook = Flutter_xlsio.Workbook();
// 通过索引访问工作表第0个sheet.
final Flutter_xlsio.Worksheet sheet = workbook.worksheets[0];
// 设置标题
for (int i = 0; i < columnList!.length; i++) {
sheet.getRangeByName(excelHeader[i]).columnWidth = 20.00;
sheet.getRangeByName(excelHeader[i]).setText(columnList[i]);
}
// 这里循环取数据
for (int i = 0; i < dataList!.length; i++) {
int index = 1;
dataList[i].entries.forEach((element) {
sheet.getRangeByIndex(i + 2, index).setText("${element.value}");
index++;
});
}
List<int> bytes = workbook.saveAsStream();
workbook.dispose();
await saveAndLaunchFile(bytes, excelName);
}
}
五、在其他文件中引入
import 'package:***/utils/excel.dart';
MaterialButton(
onPressed: () => Excel.generateExcel(dataList, columnList),
child: Text('导出Excel'),
)