как преобразовать лист Excel в json в flutter

#flutter #dart #flutter-layout #flutter-dependencies #flutter-web

#flutter #dart #flutter-layout #flutter-зависимости #flutter-web

Вопрос:

как преобразовать лист Excel в json в flutter.

У меня есть таблица Excel с именами и классами учащихся, и я хочу преобразовать ее в json, чтобы упростить запуск приложения или другой способ загрузки даты в firestore.

 Future<String> excelToJson() async {
var file = await FilePicker.getFilePath(
    type: FileType.custom, allowedExtensions: ['xlsx', 'csv', 'xls']);
var bytes = File(file).readAsBytesSync();
var excel = Excel.decodeBytes(bytes);
int i = 0;
List<dynamic> keys = new List<dynamic>();
List<Map<String, dynamic>> json = new List<Map<String, dynamic>>();
for (var table in excel.tables.keys) {
  for (var row in excel.tables[table].rows) {
    if (i == 0) {
      keys = row;
      i  ;
    } else {
      Map<String, dynamic> temp = Map<String, dynamic>();
      int j = 0;
      String tk = '';
      for (var key in keys) {
        tk = "u201C"   key   "u201D";
        temp[tk] = (row[j].runtimeType==String)?"u201C"   row[j].toString()   "u201D":row[j];
        j  ;
      }
      json.add(temp);
    }
  }
}
print(json.length);
String fullJson = json.toString().substring(1, json.toString().length - 1);
return fullJson;}
 

Я хочу узнать, как использовать этот скрипт в моем приложении или другим способом, более простым и простым

Спасибо

Ответ №1:

Используйте эти методы:

 Future<void> excelToJson(String fileName, String fileDirectory,GlobalKey<ScaffoldState> scaffoldKey) async {
  ByteData data = await rootBundle.load(fileDirectory);
  var bytes = data.buffer.asUint8List(data.offsetInBytes, data.lengthInBytes);
  var excel = Excel.decodeBytes(bytes);
  int i = 0;
  List<dynamic> keys = new List<dynamic>();
  List<Map<String, dynamic>> json = new List<Map<String, dynamic>>();
  for (var table in excel.tables.keys) {
    for (var row in excel.tables[table].rows) {
      if (i == 0) {
        keys = row;
        i  ;
      } else {
        Map<String, dynamic> temp = Map<String, dynamic>();
        int j = 0;
        String tk = '';
        for (var key in keys) {
          tk = '"'   key   '"';
          temp[tk] = (row[j].runtimeType == String)
              ? '"'   row[j].toString()   '"'
              : row[j];
          j  ;
        }
        json.add(temp);
      }
    }
  }
  print(json.length);
  String fullJson = json.toString().substring(1, json
      .toString()
      .length - 1);

  fullJson = '{ "DATA" : [$fullJson]}';
  final directory = await getExternalStorageDirectory();

  File file = await File('${directory.path}/$fileName.json').create();
  await file.writeAsString(fullJson).then((value) =>
      scaffoldKey.currentState
          .showSnackBar(SnackBar(content: Text("Completed")))
  );
  print(file.exists().toString());
}

Future<void> jsonToExcel(String fileName, String fileDirectory,GlobalKey<ScaffoldState> scaffoldKey) async{
  String jsonString = await rootBundle.loadString(fileDirectory);

  List<dynamic> jsonResult = jsonDecode(jsonString)["DATA"];


  var excel = Excel.createExcel();
  Sheet sheetObject = excel['Sheet1'];

  Map<String,dynamic> result = jsonResult[0];
  sheetObject.appendRow(result.keys.toList());

  for(int i =0;i<jsonResult.length;i  ){
    Map<String,dynamic> result = jsonResult[i];
    sheetObject.appendRow(result.values.toList());
  }
  final directory = await getExternalStorageDirectory();

  excel.encode().then((onValue) {
    File(("${directory.path}/$fileName.xlsx"))
      ..createSync(recursive: true)
      ..writeAsBytesSync(onValue);
    scaffoldKey.currentState
        .showSnackBar(SnackBar(content: Text("Completed")));
  });


  print(sheetObject);
}
 

Комментарии:

1. hii я хочу знать, как мы можем изменить форматирование ячеек или предопределить форматирование ячеек с помощью этого пакета.

2. привет, если вы хотите отредактировать что-либо в формате ячейки, вы можете использовать эту библиотеку syncfusion_flutter_xlsio

3. на самом деле я попробовал этот пакет, но проблема в том, что когда мой список данных вводит в него целые данные в 1 отдельную ячейку и проходит через ваш метод, и Excel правильно упаковывает мои наборы данных в лист Excel

Ответ №2:

Немного обновил ваш код….

  Future<String> excelToJson() async {
        FilePickerResult result =await FilePicker.platform.pickFiles(type:FileType.custom,allowedExtensions: ['xls','xlsx','csv']);
       if (result != null) {
        File excelFile = File(result.files.single.path);}
        var bytes = File(excelFilePath).readAsBytesSync();
        var excel = Excel.decodeBytes(bytes);
        int i = 0;
        List<dynamic> keys = [];
        var jsonMap = [];
    
        for (var table in excel.tables.keys) {
          dev.log(table.toString());
          for (var row in excel.tables[table].rows) {
            dev.log(row.toString());
            if (i == 0) {
              keys = row;
              i  ;
            } else {
              var temp = {};
              int j = 0;
              String tk = '';
              for (var key in keys) {
                tk = '"${key.toString()}"';
                temp[tk] = (row[j].runtimeType == String)
                    ?  '"${row[j].toString()}"'
                    : row[j];
                j  ;
              }
    
              jsonMap.add(temp);
            }
          }
        }
        dev.log(
          jsonMap.length.toString(),
          name: 'excel to json',
        );
        dev.log(jsonMap.toString(), name: 'excel to json');
        String fullJson =
            jsonMap.toString().substring(1, jsonMap.toString().length - 1);
        dev.log(
          fullJson.toString(),
          name: 'excel to json',
        );
        return fullJson;
      }