Flutter电子表格解析插件spreadsheet_decoder的使用

发布于 1周前 作者 yibo5220 来自 Flutter

Flutter电子表格解析插件spreadsheet_decoder的使用

Spreadsheet Decoder 简介

Spreadsheet Decoder 是一个用于解码和更新ODS和XLSX文件的库。它允许开发者在Flutter应用程序中读取、修改电子表格数据,并可以将修改后的数据保存回文件。

使用方法

服务端使用

import 'dart:io';
import 'package:spreadsheet_decoder/spreadsheet_decoder.dart';

main() {
  // 从文件读取字节流
  var bytes = File.fromUri(fullUri).readAsBytesSync();
  // 解码字节流为电子表格对象
  var decoder = SpreadsheetDecoder.decodeBytes(bytes);
  // 获取指定工作表的数据
  var table = decoder.tables['Sheet1'];
  var values = table.rows[0];
  // 更新单元格内容
  decoder.updateCell('Sheet1', 0, 0, 1337);
  // 将修改后的电子表格编码为字节流并写入文件
  File(join(fullUri)).writeAsBytesSync(decoder.encode());
}

客户端使用

import 'dart:html';
import 'package:spreadsheet_decoder/spreadsheet_decoder.dart';

main() {
  var reader = FileReader();
  reader.onLoadEnd.listen((event) {
    // 当文件加载完成后,解码为电子表格对象
    var decoder = SpreadsheetDecoder.decodeBytes(reader.result);
    var table = decoder.tables['Sheet1'];
    var values = table.rows[0];
    // 更新单元格内容
    decoder.updateCell('Sheet1', 0, 0, 1337);
    // 编码为字节流(客户端通常不会直接写入文件)
    var bytes = decoder.encode();
  });
}

示例代码

以下是一个完整的示例,展示了如何使用spreadsheet_decoder来读取、修改并保存Excel文件:

import 'dart:io';
import 'package:path/path.dart';
import 'package:spreadsheet_decoder/spreadsheet_decoder.dart';

void main(List<String> args) {
  // 指定要读取的Excel文件路径
  var file = 'test/files/test.xlsx';
  // 读取文件的字节流
  var bytes = File(file).readAsBytesSync();
  // 解码字节流为电子表格对象,允许修改
  var decoder = SpreadsheetDecoder.decodeBytes(bytes, update: true);

  // 遍历所有工作表,打印其名称、最大列数、最大行数以及每一行的内容
  for (var table in decoder.tables.keys) {
    print(table);
    print(decoder.tables[table]!.maxCols);
    print(decoder.tables[table]!.maxRows);
    for (var row in decoder.tables[table]!.rows) {
      print('$row');
    }
  }

  // 修改第一个工作表的内容
  var sheet = decoder.tables.keys.first;
  decoder
    ..updateCell(sheet, 0, 0, "L'oiseau <\"coucou\">")
    ..updateCell(sheet, 1, 0, 'B')
    ..updateCell(sheet, 2, 0, 'C')
    ..updateCell(sheet, 1, 1, 42.3)
    ..insertRow(sheet, 1)
    ..insertRow(sheet, 13)
    ..updateCell(sheet, 0, 13, 'A14')
    ..updateCell(sheet, 0, 12, 'A13')
    ..insertColumn(sheet, 0)
    ..removeRow(sheet, 1)
    ..removeColumn(sheet, 2);

  // 将修改后的内容保存到新的文件中
  File(join('test/out/${basename(file)}'))
    ..createSync(recursive: true)
    ..writeAsBytesSync(decoder.encode());

  print('************************************************************');
  // 再次遍历所有工作表,查看修改后的结果
  for (var table in decoder.tables.keys) {
    print(table);
    print(decoder.tables[table]!.maxCols);
    print(decoder.tables[table]!.maxRows);
    for (var row in decoder.tables[table]!.rows) {
      print('$row');
    }
  }
}

不支持的功能

  • 注释
  • 合并行
  • 合并列
  • 隐藏行(在结果表中可见)
  • 隐藏列(在结果表中可见)

对于XLSX格式,此实现仅支持日期、时间和布尔类型的原生Excel格式转换。换句话说,不支持自定义格式的日期、时间、布尔类型,因此从LibreOffice导出的文件可能无法正确解析。

许可证

该库采用MIT许可证,详情请参见LICENSE


更多关于Flutter电子表格解析插件spreadsheet_decoder的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter电子表格解析插件spreadsheet_decoder的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何使用Flutter插件spreadsheet_decoder来解析电子表格的示例代码。这个插件支持解析Excel(.xlsx)和CSV格式的文件。以下示例展示了如何读取并解析一个Excel文件。

首先,确保你已经在pubspec.yaml文件中添加了spreadsheet_decoder依赖:

dependencies:
  flutter:
    sdk: flutter
  spreadsheet_decoder: ^3.0.0  # 请检查最新版本号

然后,运行flutter pub get来安装依赖。

接下来,编写一个Flutter应用,用于选择并解析Excel文件。我们将使用file_picker插件来选择文件,因为spreadsheet_decoder本身不提供文件选择功能。你同样需要在pubspec.yaml中添加file_picker依赖:

dependencies:
  flutter:
    sdk: flutter
  spreadsheet_decoder: ^3.0.0  # 请检查最新版本号
  file_picker: ^4.0.0  # 请检查最新版本号

安装完依赖后,创建一个简单的Flutter应用,代码如下:

import 'dart:typed_data';
import 'package:flutter/material.dart';
import 'package:file_picker/file_picker.dart';
import 'package:spreadsheet_decoder/spreadsheet_decoder.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: SpreadsheetParserScreen(),
    );
  }
}

class SpreadsheetParserScreen extends StatefulWidget {
  @override
  _SpreadsheetParserScreenState createState() => _SpreadsheetParserScreenState();
}

class _SpreadsheetParserScreenState extends State<SpreadsheetParserScreen> {
  List<List<dynamic>>? parsedData;

  Future<void> _pickFile() async {
    final result = await FilePicker.platform.pickFiles(
      type: FileType.custom,
      allowedExtensions: ['xlsx', 'csv'],
    );

    if (result != null) {
      final file = result.files.single;
      final Uint8List bytes = await file.readAsBytes();

      try {
        final sheets = await SpreadsheetDecoder.decodeBytes(bytes);
        final firstSheet = sheets.first;
        setState(() {
          parsedData = firstSheet.rows;
        });
      } catch (e) {
        print('Error decoding spreadsheet: $e');
      }
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Spreadsheet Parser'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            ElevatedButton(
              onPressed: _pickFile,
              child: Text('Pick Spreadsheet File'),
            ),
            if (parsedData != null)
              Expanded(
                child: ListView.builder(
                  itemCount: parsedData!.length,
                  itemBuilder: (context, index) {
                    return ListTile(
                      title: Text(parsedData![index].join(', ')),
                    );
                  },
                ),
              ),
          ],
        ),
      ),
    );
  }
}

解释

  1. 依赖添加

    • spreadsheet_decoder用于解析电子表格文件。
    • file_picker用于从设备中选择文件。
  2. UI布局

    • 使用ScaffoldAppBar创建基本的Material Design应用布局。
    • 使用ElevatedButton触发文件选择对话框。
    • 使用ListView.builder展示解析后的电子表格数据。
  3. 文件选择和解析

    • 使用FilePicker.platform.pickFiles选择文件。
    • 读取文件内容为字节数组。
    • 使用SpreadsheetDecoder.decodeBytes解析字节数组为电子表格数据。
    • 将解析后的数据存储在parsedData变量中,并在UI中展示。

运行这个应用,你将能够选择一个Excel或CSV文件,并在应用界面中看到解析后的数据。注意,这个示例仅展示了基本的文件选择和解析功能,你可能需要根据实际需求进行进一步的错误处理和UI优化。

回到顶部