简体   繁体   English

您如何使用颤振/飞镖 package 电子表格解码器?

[英]How do you use the flutter/dart package spreadsheet_decoder?

When I try to use the package 'spreadsheet_decoder' in my flutter app like so:当我尝试在我的 flutter 应用程序中使用 package 'spreadsheet_decoder' 时,如下所示:

var file = Uri.file('spreadsheets/Contact_list.xlsx');
  var bytes = File.fromUri(file).readAsBytesSync();
  var decoder = SpreadsheetDecoder.decodeBytes(bytes);

where I created a folder called spreadsheets inside the app and added it to the pubspec.我在应用程序中创建了一个名为电子表格的文件夹,并将其添加到 pubspec。 I got the following error:我收到以下错误:

[VERBOSE-2:ui_dart_state.cc(157)] Unhandled Exception: FileSystemException: Cannot open file, path = 'spreadsheets/Contact_list.xlsx' (OS Error: No such file or directory, errno = 2)
#0      _File.throwIfError (dart:io/file_impl.dart:645:7)
#1      _File.openSync (dart:io/file_impl.dart:489:5)
#2      _File.readAsBytesSync (dart:io/file_impl.dart:549:18)
#3      getData (package:cvr/extract_excel.dart:8:34)
#4      _TransferScreenState.transferPeopleFromExcelToFirebase (package:cvr/utilities/transfer_data.dart:35:5)
<asynchronous suspension>
#5      _TransferScreenState.build.<anonymous closure> (package:cvr/utilities/transfer_data.dart:52:11)
#6      _InkResponseState._handleTap (package:flutter/src/material/ink_well.dart:706:14)
#7      _InkResponseState.build.<anonymous closure> (package:flutter/src/material/ink_well.dart:789:36)
#8      GestureRecognizer.invokeCallback (package:flutter/src/gestures/recognizer.dart:182:24)
#9      TapGestureRecognizer.handleTapUp (package:flutter/src/gestures/tap.<…>

If I use the exact same code in a stand alone dart file and run it separately I do not get this error.如果我在独立的 dart 文件中使用完全相同的代码并单独运行它,我不会收到此错误。 Does anyone know where I can save the excel document and what path I should use to access it?有谁知道我可以在哪里保存 excel 文档以及我应该使用什么路径来访问它?

You can use https://pub.dev/packages/path_provider and get temp directory via getTemporaryDirectory()您可以使用https://pub.dev/packages/path_provider并通过getTemporaryDirectory()获取临时目录

You can copy paste run full code below您可以在下面复制粘贴运行完整代码
and need to put your file in /data/user/0/your_domain.your_project/cache/test.xlsx并且需要将您的文件放在/data/user/0/your_domain.your_project/cache/test.xlsx

在此处输入图片说明

code snippet代码片段

Directory tempDir = await getTemporaryDirectory();
String tempPath = tempDir.path;

var file = '${tempDir.path}/test.xlsx';
print('file full path $file');
var bytes = File(file).readAsBytesSync();
var decoder = SpreadsheetDecoder.decodeBytes(bytes, update: true);

output of full code完整代码的输出

I/flutter (  515): file full path /data/user/0/your_domain.your_proejct/cache/test.xlsx
I/flutter (  515): wosksheet1
I/flutter (  515): 1
I/flutter (  515): 2
I/flutter (  515): [test]
I/flutter (  515): [123]

full code完整代码

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

void main() => 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() async {
    Directory tempDir = await getTemporaryDirectory();
    String tempPath = tempDir.path;

    var file = '${tempDir.path}/test.xlsx';
    print('file full path $file');
    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");
      }
      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),
      ),
    );
  }
}

Try using the Uri.parse or Uri.tryParse mehod尝试使用Uri.parseUri.tryParse

Example Code:示例代码:

var readbytes = File.fromUri(Uri.parse('path/THISisCOOL.xlsx')).readAsBytesSync();

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM