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

如何在Flutter应用中展示并编辑Excel表格?

在Flutter中实现Excel表格的展示与编辑

一、读取Excel文件

先在pubspec.yaml中添加依赖:

dependencies:
  excel: ^2.0.0
  path_provider: ^2.0.15 # 用于获取本地存储路径

读取本地Excel文件的示例代码:

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

Future<Excel> loadLocalExcel() async {
  Directory appDocDir = await getApplicationDocumentsDirectory();
  String filePath = '${appDocDir.path}/target.xlsx';
  File file = File(filePath);
  var bytes = file.readAsBytesSync();
  return Excel.decodeBytes(bytes);
}

如果是从assets读取,需要先在pubspec.yaml声明assets路径,再通过rootBundle.load获取字节流解析。

二、展示Excel内容

用Flutter自带的DataTable组件实现表格展示,先将Excel数据转换为二维数组:

class ExcelDisplayTable extends StatefulWidget {
  final Excel excelData;
  const ExcelDisplayTable({super.key, required this.excelData});

  @override
  State<ExcelDisplayTable> createState() => _ExcelDisplayTableState();
}

class _ExcelDisplayTableState extends State<ExcelDisplayTable> {
  late Sheet _activeSheet;
  late List<List<dynamic>> _cellData;

  @override
  void initState() {
    super.initState();
    _activeSheet = widget.excelData.tables.values.first;
    // 把Sheet数据转成易处理的二维数组
    _cellData = _activeSheet.rows.map((row) {
      return row.map((cell) => cell?.value ?? '').toList();
    }).toList();
  }

  @override
  Widget build(BuildContext context) {
    return SingleChildScrollView(
      scrollDirection: Axis.horizontal,
      child: DataTable(
        columns: _activeSheet.firstRow?.map((cell) {
              return DataColumn(label: Text(cell?.value ?? ''));
            }).toList() ?? [],
        rows: _cellData.map((row) {
          return DataRow(cells: row.map((value) {
            return DataCell(Text(value.toString()), onTap: () => _editCell(_cellData.indexOf(row), row.indexOf(value)));
          }).toList());
        }).toList(),
      ),
    );
  }
}

三、实现单元格编辑功能

通过点击单元格弹出编辑对话框的方式实现基础编辑:

void _editCell(int rowIdx, int colIdx) {
  TextEditingController editController = TextEditingController(
    text: _cellData[rowIdx][colIdx].toString(),
  );
  showDialog(
    context: context,
    builder: (context) => AlertDialog(
      title: const Text('编辑单元格'),
      content: TextField(controller: editController),
      actions: [
        TextButton(onPressed: () => Navigator.pop(context), child: const Text('取消')),
        TextButton(
          onPressed: () {
            setState(() {
              _cellData[rowIdx][colIdx] = editController.text;
            });
            Navigator.pop(context);
          },
          child: const Text('保存'),
        ),
      ],
    ),
  );
}

如果需要更原生的单元格内编辑体验,可以尝试第三方组件(如flutter_tableview),但自带对话框方式足够满足基础需求。

四、保存编辑后的Excel

将修改后的二维数组写回Excel文件:

Future<void> saveEditedExcel() async {
  Excel editedExcel = Excel.createExcel();
  Sheet targetSheet = editedExcel['EditedSheet'];
  
  // 遍历数据写入单元格
  for (int i = 0; i < _cellData.length; i++) {
    for (int j = 0; j < _cellData[i].length; j++) {
      targetSheet.cell(CellIndex.indexByColumnRow(columnIndex: j, rowIndex: i)).value = _cellData[i][j];
    }
  }

  // 保存到本地目录
  Directory appDocDir = await getApplicationDocumentsDirectory();
  String savePath = '${appDocDir.path}/edited_target.xlsx';
  File saveFile = File(savePath);
  saveFile.writeAsBytesSync(editedExcel.encode()!);
}

额外说明

  • 若Excel包含合并单元格、复杂公式或样式,excel包的支持有限,这种情况可以考虑用flutter_xlsx_reader仅读取数据,或者通过WebView加载在线Excel编辑器(需依赖网络)。
  • 处理大文件时,建议分批读取和写入,避免内存占用过高。

内容的提问来源于stack exchange,提问作者shyam sojitra

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 08:45:29