Flutter Excel文件处理插件excel的使用

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

Flutter Excel文件处理插件excel的使用

Excel 是一个用于在 Flutter 和 Dart 中读取、创建和更新 XLSX 文件的库。本文将详细介绍如何使用 excel 插件来处理 Excel 文件,并提供完整的示例代码。

依赖安装

首先,在你的 pubspec.yaml 文件中添加 excel 依赖:

dependencies:
  flutter:
    sdk: flutter
  excel: ^4.0.0 # 请根据最新的版本进行调整

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

基本用法

读取 XLSX 文件

以下是如何从本地文件系统读取 XLSX 文件并打印其内容:

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

void readLocalExcelFile() {
  var file = 'Path_to_pre_existing_Excel_File/excel_file.xlsx';
  var bytes = File(file).readAsBytesSync();
  var excel = Excel.decodeBytes(bytes);

  for (var table in excel.tables.keys) {
    print('Sheet Name: $table');
    print('Max Columns: ${excel.tables[table]!.maxColumns}');
    print('Max Rows: ${excel.tables[table]!.maxRows}');
    
    for (var row in excel.tables[table]!.rows) {
      for (var cell in row) {
        final value = cell?.value;
        if (value != null) {
          print('Cell [${cell.rowIndex}/${cell.columnIndex}]: $value');
        }
      }
    }
  }
}

在 Flutter Web 中读取 XLSX 文件

在 Flutter Web 中,可以使用 file_picker 包来选择文件:

import 'package:file_picker/file_picker.dart';
import 'package:excel/excel.dart';

Future<void> readWebExcelFile() async {
  FilePickerResult? pickedFile = await FilePicker.platform.pickFiles(
    type: FileType.custom,
    allowedExtensions: ['xlsx'],
    allowMultiple: false,
  );

  if (pickedFile != null) {
    var bytes = pickedFile.files.single.bytes;
    var excel = Excel.decodeBytes(bytes!);

    for (var table in excel.tables.keys) {
      print('Sheet Name: $table');
      print('Max Columns: ${excel.tables[table]!.maxColumns}');
      print('Max Rows: ${excel.tables[table]!.maxRows}');
      
      for (var row in excel.tables[table]!.rows) {
        print(row.map((e) => e?.value).toList());
      }
    }
  }
}

创建新的 XLSX 文件

import 'package:excel/excel.dart';

void createNewExcelFile() {
  var excel = Excel.createExcel();
  var sheet = excel['Sheet1'];

  // 添加一些数据
  sheet.cell(CellIndex.indexByString('A1')).value = TextCellValue('Hello');
  sheet.cell(CellIndex.indexByString('B1')).value = IntCellValue(123);
  
  // 保存文件
  List<int>? fileBytes = excel.save();
  if (fileBytes != null) {
    File('output_file.xlsx')
      ..createSync(recursive: true)
      ..writeAsBytesSync(fileBytes);
  }
}

更新单元格样式

import 'package:excel/excel.dart';

void updateCellStyle() {
  var excel = Excel.createExcel();
  var sheet = excel['Sheet1'];

  CellStyle cellStyle = CellStyle(
    bold: true,
    italic: true,
    textWrapping: TextWrapping.WrapText,
    fontFamily: getFontFamily(FontFamily.Comic_Sans_MS),
    rotation: 0,
  );

  var cell = sheet.cell(CellIndex.indexByString("A1"));
  cell.value = TextCellValue("Styled Text");
  cell.cellStyle = cellStyle;

  // 保存文件
  List<int>? fileBytes = excel.save();
  if (fileBytes != null) {
    File('styled_output_file.xlsx')
      ..createSync(recursive: true)
      ..writeAsBytesSync(fileBytes);
  }
}

合并单元格

import 'package:excel/excel.dart';

void mergeCellsExample() {
  var excel = Excel.createExcel();
  var sheet = excel['Sheet1'];

  // 合并 A1 到 E4 的单元格
  sheet.merge(
    CellIndex.indexByString('A1'),
    CellIndex.indexByString('E4'),
    customValue: TextCellValue('Merged Content'),
  );

  // 保存文件
  List<int>? fileBytes = excel.save();
  if (fileBytes != null) {
    File('merged_output_file.xlsx')
      ..createSync(recursive: true)
      ..writeAsBytesSync(fileBytes);
  }
}

完整示例 Demo

以下是一个完整的示例程序,展示了如何创建一个新的 Excel 文件,添加数据,设置样式,合并单元格,并保存文件:

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

void main() async {
  var excel = Excel.createExcel();
  var sheet = excel['Sheet1'];

  // 添加数据
  sheet.cell(CellIndex.indexByString('A1')).value = TextCellValue('Name');
  sheet.cell(CellIndex.indexByString('B1')).value = TextCellValue('Age');

  sheet.cell(CellIndex.indexByString('A2')).value = TextCellValue('Alice');
  sheet.cell(CellIndex.indexByString('B2')).value = IntCellValue(30);

  sheet.cell(CellIndex.indexByString('A3')).value = TextCellValue('Bob');
  sheet.cell(CellIndex.indexByString('B3')).value = IntCellValue(25);

  // 设置样式
  CellStyle headerStyle = CellStyle(
    bold: true,
    backgroundColorHex: '#FFCC00',
  );

  sheet.cell(CellIndex.indexByString('A1')).cellStyle = headerStyle;
  sheet.cell(CellIndex.indexByString('B1')).cellStyle = headerStyle;

  // 合并单元格
  sheet.merge(
    CellIndex.indexByString('A1'),
    CellIndex.indexByString('B1'),
    customValue: TextCellValue('User Information'),
  );

  // 保存文件
  List<int>? fileBytes = excel.save();
  if (fileBytes != null) {
    File('complete_example.xlsx')
      ..createSync(recursive: true)
      ..writeAsBytesSync(fileBytes);
  }

  print('Excel file created successfully.');
}

通过上述示例,你可以轻松地在 Flutter 应用中处理 Excel 文件。希望这些示例能帮助你更好地理解和使用 excel 插件。


更多关于Flutter Excel文件处理插件excel的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter Excel文件处理插件excel的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在处理Flutter应用中的Excel文件时,可以使用excel库或更流行的syncfusion_flutter_xlsxio库,后者提供了更强大和全面的功能。以下是一个使用syncfusion_flutter_xlsxio库来处理Excel文件的代码示例。

首先,你需要在pubspec.yaml文件中添加依赖项:

dependencies:
  flutter:
    sdk: flutter
  syncfusion_flutter_xlsxio: ^x.y.z  # 请将x.y.z替换为最新版本号

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

接下来,是一个简单的示例,展示如何读取Excel文件并显示其中的内容:

import 'package:flutter/material.dart';
import 'package:syncfusion_flutter_xlsxio/xlsxio.dart';
import 'package:path_provider/path_provider.dart';
import 'dart:io';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter Excel Handling'),
        ),
        body: ExcelHandler(),
      ),
    );
  }
}

class ExcelHandler extends StatefulWidget {
  @override
  _ExcelHandlerState createState() => _ExcelHandlerState();
}

class _ExcelHandlerState extends State<ExcelHandler> {
  List<List<String>>? excelData;

  @override
  void initState() {
    super.initState();
    _readExcelFile();
  }

  Future<void> _readExcelFile() async {
    try {
      // 获取应用文档目录
      Directory appDocDir = await getApplicationDocumentsDirectory();
      String filePath = '${appDocDir.path}/sample.xlsx';

      // 确保文件存在(这里假设你已经有了一个名为sample.xlsx的文件在应用中)
      File file = File(filePath);
      if (!file.existsSync()) {
        throw Exception("File not found");
      }

      // 打开Excel文件
      ExcelEngine excelEngine = ExcelEngine();
      XlsxIO io = XlsxIO();
      await io.open(filePath);

      // 读取第一个工作表
      IWorkbook workbook = await io.read();
      IWorksheet worksheet = workbook.worksheets[0];

      // 提取数据
      List<List<String>> data = [];
      int rowCount = worksheet.rowCount;
      for (int row = 1; row <= rowCount; row++) {
        List<String> rowData = [];
        int colCount = worksheet.columnCount;
        for (int col = 1; col <= colCount; col++) {
          ICell cell = worksheet.getCell(row, col);
          rowData.add(cell.text);
        }
        data.add(rowData);
      }

      // 更新状态
      setState(() {
        excelData = data;
      });

      // 关闭文件
      await io.close();
    } catch (e) {
      print("Error reading Excel file: $e");
    }
  }

  @override
  Widget build(BuildContext context) {
    return Padding(
      padding: const EdgeInsets.all(16.0),
      child: excelData != null
          ? ListView.builder(
              itemCount: excelData!.length,
              itemBuilder: (context, index) {
                return Row(
                  children: excelData![index].map((cellData) {
                    return Padding(
                      padding: const EdgeInsets.symmetric(horizontal: 8.0),
                      child: Text(cellData),
                    );
                  }).toList(),
                );
              })
          : Center(child: Text("Loading...")),
    );
  }
}

在这个示例中:

  1. 使用path_provider库获取应用的文档目录。
  2. 假设你已经在应用的文档目录中有一个名为sample.xlsx的Excel文件。
  3. 使用syncfusion_flutter_xlsxio库打开并读取Excel文件。
  4. 读取第一个工作表的数据并将其存储在excelData列表中。
  5. 使用ListView.builder在UI中显示数据。

请确保将sample.xlsx文件放置在你的应用文档目录中,或者根据需要修改文件路径和文件名。此外,syncfusion_flutter_xlsxio库可能需要有效的许可证密钥才能用于生产环境,请参考Syncfusion的文档获取更多信息。

回到顶部