首页 > 解决方案 > 如何在flutter中使用fxpoi包读取CSV文件

问题描述

我有一个 3 行 3 列的 csv 文件。当我尝试读取此 CSV 文件时,什么也没有发生。我看到了 fxpoi,并且我正在按照文档中所说的那样做任何事情,但是我仍然没有得到我期望的结果。

这是fxpoi包的链接。

注意下面的代码在单击按钮后执行。

import 'package:fxpoi/fxpoi.dart';
var activitiesFilePath = "assets/local_data/Activities.csv";

    int offsetLine = 0;
    int limitLine = 999;
    int i;
    var list = await Fxpoi.readExcelCSVByPage(activitiesFilePath, offsetLine, limitLine);
    if (list.isNotEmpty)
      for (i = 0; i <= list.length; i++) {
        var item = list[i];
        debugPrint("item: $item \n");
        debugPrint("item1: ${item[0]} \n");
        debugPrint("item2: ${item[1]} \n");
        debugPrint("item3: ${item[2]} \n");
      }

里面的代码if (list.isNotEmpty)没有执行,这意味着 CSV 文件是空的。这是我没有得到的地方,因为我有一个包含 3 行和 3 列的 CSV 文件。

我希望if (list.isNotEmpty)执行里面的代码,结果应该如下所示:

item: names
item1: james
item2: jane

谢谢,用爱发帖。

标签: androidcsvflutterdart

解决方案


您可以在下面复制粘贴运行完整代码
您需要使用rootBundle来访问文件assets夹中的文件
您可以读取文件rootBundle并写入临时目录并将临时目录的路径传递给fxpoi

代码片段

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  final filename = 'Activities.csv';
  ByteData bytes = await rootBundle.load("assets/local_data/Activities.csv");
  final buffer = bytes.buffer;
  String dir = (await getApplicationDocumentsDirectory()).path;
  String activitiesFilePath = '$dir/$filename';
  await File(activitiesFilePath).writeAsBytes(
      buffer.asUint8List(bytes.offsetInBytes, bytes.lengthInBytes));

演示输出

I/System.out(28663): charset = asci
I/System.out(28663): line = a,b,c
I/System.out(28663): line = d,e,f
I/System.out(28663): line = aa,bb,cc
I/flutter (28663): item: [a,b,c] 
I/flutter (28663): 
I/flutter (28663): item1: a,b,c 
I/flutter (28663): 
I/flutter (28663): item: [d,e,f] 
I/flutter (28663): 
I/flutter (28663): item1: d,e,f 
I/flutter (28663): 
I/flutter (28663): item: [aa,bb,cc] 
I/flutter (28663): 
I/flutter (28663): item1: aa,bb,cc 

工作演示

在此处输入图像描述

完整代码

import 'package:flutter/material.dart';
import 'dart:async';
import 'dart:io';
import 'dart:typed_data';
import 'package:flutter/services.dart' show rootBundle;
import 'package:path_provider/path_provider.dart';
import 'package:fxpoi/fxpoi.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  final filename = 'Activities.csv';
  ByteData bytes = await rootBundle.load("assets/local_data/Activities.csv");
  final buffer = bytes.buffer;
  String dir = (await getApplicationDocumentsDirectory()).path;
  String activitiesFilePath = '$dir/$filename';
  await File(activitiesFilePath).writeAsBytes(
      buffer.asUint8List(bytes.offsetInBytes, bytes.lengthInBytes));

  int offsetLine = 0;
  int limitLine = 999;
  int i;
  var list = await Fxpoi.readExcelCSVByPage(activitiesFilePath, offsetLine, limitLine);
  if (list.isNotEmpty)
    for (i = 0; i < list.length; i++) {
      var item = list[i];
      debugPrint("item: $item \n");
      debugPrint("item1: ${item[0]} \n");
    }

  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;

  void _incrementCounter() {
    setState(() {
      _counter++;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'You have pushed the button this many times:',
            ),
            Text(
              '$_counter',
              style: Theme.of(context).textTheme.display1,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ),
    );
  }
}

推荐阅读