如何使用 flutter 从 excel 或 google 电子表格或 CSV 导入 firebase firestore 数据库中的批量数据

问题描述 投票:0回答:3

我有一个 flutter 应用程序,用户可以在其中填写一份长表单。但我想添加另一个按钮,当用户想要单击并上传具有与表单相同的数据的“excel 或电子表格或 CSV”时,该数据存储在 firebase firestore 中。 请帮助我克服这个问题。

android firebase flutter google-cloud-firestore
3个回答
2
投票

没有 API 可以执行此操作,Firestore 没有可供您上传 Excel 或 CSV 文件并将数据自动转换为 Firestore 的选项。要解决这个问题,您应该为此编写一些代码。正如 Krish Bhanushali 在他的评论中建议的那样,您需要逐行“读取文件”,将该数据保存到自定义类的对象中,然后将所有数据写入 Firestore。这意味着您阅读的每一行都将作为文档添加到 Firestore 中。


0
投票

它是试用版,但运行完美


0
投票
file_picker

csv 并尝试点击此功能(此功能会将.csv文件中的所有数据获取到您的应用程序)

var csvData = <List<dynamic>>[].obs; Future<void> pickFile() async { try { FilePickerResult? result = await FilePicker.platform.pickFiles(); if (result != null) { PlatformFile file = result.files.first; if (file.path != null) { final input = File(file.path!).openRead(); final fields = await input .transform(utf8.decoder) .transform(const CsvToListConverter()) .toList(); csvData.value = fields; print(">>>>>>>>>>>>CSV Data: $fields"); } else { Get.snackbar('Error', 'File path is null.'); } } else { Get.snackbar('Error', 'No file selected.'); } } catch (e) { Get.snackbar('Error', 'Failed to pick the file: $e'); } }

现在您可以使用此函数将该数据映射到 firestore

List<List<String>> skippedRows = []; var uploadComplete = false.obs; Future<void> uploadLeadsToFirestore() async { skippedRows.clear(); if (csvData.isNotEmpty) { for (int i = 1; i < csvData.length; i++) { final row = csvData[i]; // Check if required fields are not empty (if empty then skip them) if (row.length > 0 && row[0].toString().isNotEmpty && row.length > 1 && row[1].toString().isNotEmpty && row.length > 2 && row[2].toString().isNotEmpty && row.length > 4 && row[4].toString().isNotEmpty && row.length > 5 && row[5].toString().isNotEmpty) { // Mapping row to lead fields final leadData = { 'leadName': row.length > 0 && row[0].toString().isNotEmpty ? row[0].toString() : null, 'leadEmail': row.length > 1 && row[1].toString().isNotEmpty ? row[1].toString() : null, 'leadPhone': row.length > 2 && row[2].toString().isNotEmpty ? row[2].toString() : null, 'propertySize': row.length > 3 && row[3].toString().isNotEmpty ? row[3].toString() : null, 'city': row.length > 4 && row[4].toString().isNotEmpty ? row[4].toString() : null, 'projectName': row.length > 5 && row[5].toString().isNotEmpty ? row[5].toString() : null, 'status': 'New Lead', 'label': 'Hot', 'lastAction': '', 'createdByUid': createdByUid, 'createdAt': FieldValue.serverTimestamp(), 'updatedAt': FieldValue.serverTimestamp(), }; await FirebaseFirestore.instance.collection('leads').add(leadData); } else { // Convert row elements to String before adding to skippedRows skippedRows.add(row.map((e) => e.toString()).toList()); } } uploadComplete.value = true; Get.snackbar('Success', 'Leads uploaded successfully!'); } else { Get.snackbar('Error', 'No data to upload.'); } }

	
© www.soinside.com 2019 - 2024. All rights reserved.