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

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文件的生成写入。
  • 实现步骤:
    1. 在pubspec.yaml中添加两个依赖
    2. 读取目标.xls文件的字节流,用spreadsheet_decoder解码出所有工作表、行列数据
    3. 新建空白.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 23:12:59