android - 如何在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
谢谢,用爱发帖。
解决方案
您可以在下面复制粘贴运行完整代码
您需要使用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),
),
);
}
}
推荐阅读
- r - 如何在ggplot的镜像条形图上添加颜色编码的图例?
- sorting - 按函数结果的弹性搜索顺序(sqrt)
- database - 带有复选框和布尔值到数据库的 Laravel 问题
- javascript - 在多个非条件下用过滤器替换数组会返回错误的结果
- python - 如何将来自不同 Python 进程的日志事件流式传输到同一终端
- c# - C#初始化仅获取具有动态对象范围的列表属性
- angular - 角度输入验证器,承诺未定义错误
- c++ - Protobuf:如果赋予枚举的值在枚举集中不存在怎么办?
- ffmpeg - 如何使用 ffmpeg 录制视频和音频帧
- python - 无法使用线程化 FlaskAPI 显示 PyQt5 GUI