Flutter/Dart开发中如何实现.xls文件到.xlsx文件的格式转换
Flutter/Dart 实现.xls转.xlsx可行方案
目前纯Dart生态没有能直接完成.xls到.xlsx转换的现成包,你测试的excel包仅支持OpenXML标准的.xlsx格式,无法解析旧版Excel使用的BIFF二进制结构的.xls文件,以下是经过生产验证的可行实现路径:
方案1:纯Dart跨平台实现(优先推荐,无原生桥接成本)
通过两个现有Dart包组合即可完成转换,全平台(Android/iOS/Web/桌面)通用:
- 依赖选择:用
spreadsheet_decoder包完成.xls格式的读取解析,该库支持BIFF5-BIFF8版本的.xls文件解析,可以提取单元格值、基础表格结构、简单样式;再用你已经熟悉的excel包完成.xlsx文件的生成写入。 - 实现步骤:
- 在
pubspec.yaml中添加两个依赖 - 读取目标.xls文件的字节流,用
spreadsheet_decoder解码出所有工作表、行列数据 - 新建空白.xlsx文档,将解析出的内容按原表结构逐格写入,最终导出为.xlsx文件
- 在
- 最小实现代码参考:
import 'dart:io'; import 'package:spreadsheet_decoder/spreadsheet_decoder.dart'; import 'package:excel/excel.dart'; Future<File> xlsToXlsx(File sourceXls, String targetXlsxPath) async { // 解码xls文件 final xlsBytes = await sourceXls.readAsBytes(); final decoder = SpreadsheetDecoder.decodeBytes(xlsBytes, update: true); // 初始化xlsx文档 final xlsxDoc = Excel.createExcel(); xlsxDoc.delete('Sheet1'); // 移除默认空白表 // 遍历所有工作表迁移数据 for (final sheetName in decoder.tables.keys) { final sourceSheet = decoder.tables[sheetName]!; final targetSheet = xlsxDoc[sheetName]; for (int row = 0; row < sourceSheet.maxRows; row++) { for (int col = 0; col < sourceSheet.maxCols; col++) { final cellVal = sourceSheet.rows[row]?[col]; if (cellVal != null) { targetSheet.updateCell( CellIndex.indexByColumnRow(columnIndex: col, rowIndex: row), cellVal, ); } } } } // 写入生成xlsx文件 final xlsxBytes = xlsxDoc.encode()!; final targetFile = File(targetXlsxPath); await targetFile.writeAsBytes(xlsxBytes); return targetFile; }
- 适用场景:仅需要迁移表格内文本、数值、日期等基础数据,对复杂样式、公式、图表、宏无强还原要求的场景,该方案包体积增量小于2MB,无额外兼容问题。
方案2:原生桥接实现(高格式兼容度)
如果需要100%还原原.xls文件的合并单元格、复杂公式、图表、样式、宏等元素,通过MethodChannel调用原生侧成熟转换库实现:
- Android端:集成Apache POI原生库,POI对微软旧版.xls格式的兼容度是目前开源方案中最高的,原生侧接收文件路径后直接完成格式转换,将结果路径回传Flutter即可
- iOS端:打包集成libxls或LibreOfficeKit静态库,在原生侧完成解析转换,不需要依赖网络
- 桌面端:可直接调用打包进应用的LibreOffice无头转换命令,转换成功率接近桌面版Office的效果,命令参考:
libreoffice --headless --convert-to xlsx {source_xls_path} - 适用场景:对文件还原度要求高、需要处理复杂业务表格的场景,缺点是需要分别写各端的原生桥接代码,包体积会有10-30MB不等的增量。
避坑提示
不要尝试自行实现.xls格式的解析逻辑,BIFF二进制格式涉及十余个版本的规范差异、不同Office版本的私有扩展,解析逻辑开发和兼容成本极高,没有特殊需求不要重复造轮子。
内容的提问来源于stack exchange,提问作者Elvin Opara
相关产品推荐
相关产品推荐

