如何解决如何在Flutter中将Datatable Form Firestore创建为CSV文件
好的,这是故事:
我的应用程序可以创建报告,现在这些报告可以整齐地显示在表格中。数据正在从Firestore中流式传输。
问题:
有一个必须具备的功能,能够将报告导出到应用程序之外,例如通过电子邮件发送报告。因此,我尝试将其导出为PDF,但是它只保存了当前在支架中查看的内容,这意味着需要滚动才能显示/看到的行和列不会导出到PDF。目前,我正在尝试执行相同操作,但要对包含从Firestore实例流式传输的所有数据的CSV文件进行格式化,并在数据表视图中对其进行格式化
import 'dart:io';
import 'package:basic_utils/basic_utils.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:csv/csv.dart';
import 'package:Flutter/material.dart';
import 'package:path_provider/path_provider.dart';
import 'package:Flutter_email_sender/Flutter_email_sender.dart';
class AdminPage extends StatefulWidget {
static final TextEditingController _emailController = TextEditingController();
@override
_AdminPageState createState() => _AdminPageState();
}
class _AdminPageState extends State<AdminPage> {
final GlobalKey<FormState> _formkey = GlobalKey<FormState>();
DocumentSnapshot _currentDocument;
String filePath;
String currentProcess;
bool isProcessing = false;
Future<String> get _localPath async {
final directory = await getApplicationSupportDirectory();
return directory.absolute.path;
}
Future<File> get _localFile async {
final path = await _localPath;
filePath = '$path/clouddata.csv';
return File('$path/clouddata.csv').create();
}
List<List<dynamic>> rows = List<List<dynamic>>();
getCsv(DocumentSnapshot document) async {
setState(() {
currentProcess = "Getting data from the cloud";
isProcessing = true;
});
Firestore.instance
.collection('Airline_Transactions').document(_currentDocument.documentID)
.snapshots();
{
setState(() {
currentProcess = "Decoding data";
});
}
rows.add([
"Date","Airline","Flight Number","Terminal","pax","Infant","Transit",]);
if (document.data != null) {
for (int i = 0; i < document.data.length; i++) {
List<dynamic> row = List<dynamic>();
row.add(document.data[i]["date"].toString());
row.add(document.data[i]["airline"].toString());
row.add(document.data[i]["flight_number"].toString());
row.add(document.data[i]["terminal"].toString());
row.add(document.data[i]["pax"].toString());
row.add(document.data[i]["infant"].toString());
row.add(document.data[i]["transit"].toString());
rows.add(row);
}
File f = await _localFile.whenComplete(() {
setState(() {
currentProcess = "Writing to CSV";
});
});
String csv = const ListToCsvConverter().convert(rows);
f.writeAsstring(csv);
filePath = f.uri.path;
}
}
sendMailAndAttachment() async {
final Email email = Email(
body:
'Data Collected and Compiled by the Datum App. <br> A CSV file is attached to this <b>mail</b> <hr><br> Compiled at ${DateTime.Now()}',subject: 'Datum Entry for ${DateTime.Now().toString()}',recipients: [AdminPage._emailController.text],isHTML: true,attachmentPath: filePath,);
await FlutterEmailSender.send(email);
}
GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
@override
Widget build(BuildContext context) {
return Scaffold(
key: _scaffoldKey,appBar: AppBar(title: Text("Datum Dash")),body: ListView(
padding: EdgeInsets.only(top: 45,right: 10,left: 10,bottom: 20),children: <Widget>[
Text("Welcome to DashBoard",style: TextStyle(fontSize: 30,fontWeight: FontWeight.w500)),Form(
key: _formkey,child: Column(
crossAxisAlignment: CrossAxisAlignment.start,children: <Widget>[
Padding(
padding: const EdgeInsets.only(top: 20.0),child: TextFormField(
controller: AdminPage._emailController,validator: (str) => (str.length == 0)
? "please enter your email"
: (!EmailUtils.isEmail(str))
? "please enter a valid email"
: null,decoration: Inputdecoration(
labelText: "Enter your email",border: OutlineInputBorder(),suffixIcon: Icon(Icons.email)),),Padding(
padding: const EdgeInsets.only(top: 8.0),child: RaisedButton(
color: Theme.of(context).accentColor,child: Text("Compile and Send"),onpressed: (isProcessing)
? null
: () async {
if (_formkey.currentState.validate()) {
try {
final result =
await InternetAddress.lookup('google.com');
if (result.isNotEmpty &&
result[0].rawAddress.isNotEmpty) {
await getCsv(_currentDocument).then((v) {
setState(() {
currentProcess =
"Compiling and sending mail";
});
sendMailAndAttachment().whenComplete(() {
setState(() {
isProcessing = false;
});
_scaffoldKey.currentState
.showSnackBar(SnackBar(
content: Text("Data Sent"),));
});
});
}
} on SocketException catch (_) {
_scaffoldKey.currentState.showSnackBar(SnackBar(
content: Text(
"Connect your device to the internet,and try again"),));
}
}
},Padding(
padding: const EdgeInsets.all(8.0),child: Visibility(
visible: (isProcessing) ? true : false,child: Row(
children: <Widget>[
SizedBox(
child: CircularProgressIndicator(),height: 25,width: 25),Padding(
padding: const EdgeInsets.all(8.0),child: Text("$currentProcess"),)
],],)
],);
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。