docs.sheetjs.com/docz/static/flutter/main.dart
2023-06-01 00:47:33 -04:00

101 lines
2.7 KiB
Dart

import 'package:flutter/material.dart';
import 'package:flutter/services.dart' show rootBundle;
import 'dart:typed_data';
import 'dart:convert';
import 'package:http/http.dart' as http;
import 'package:flutter_js/flutter_js.dart';
import 'package:csv/csv.dart';
import 'package:collection/collection.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
title: 'SheetJS x Flutter Demo',
theme: ThemeData(
colorScheme: ColorScheme.fromSeed(seedColor: Colors.green),
useMaterial3: true,
),
home: const SheetJSFlutter(),
);
}
}
class SheetJSFlutter extends StatefulWidget {
const SheetJSFlutter({super.key});
@override
State<SheetJSFlutter> createState() => SheetJSFlutterState();
}
class SheetJSFlutterState extends State<SheetJSFlutter> {
String _version = '0.0.0';
List<List<dynamic>> _data = [];
late JavascriptRuntime _engine;
@override
void initState() {
super.initState();
_async();
}
void _async() async {
await _initEngine();
await _fetch();
}
Future<void> _initEngine() async {
/* load scripts */
_engine = getJavascriptRuntime();
String shim = await rootBundle.loadString("scripts/shim.min.js");
_engine.evaluate(shim);
String sheetjs = await rootBundle.loadString("scripts/xlsx.full.min.js");
_engine.evaluate(sheetjs);
JsEvalResult vers = _engine.evaluate("XLSX.version");
setState(() => _version = vers.stringResult);
}
Future<void> _fetch() async {
final res = await http.get(Uri.parse("https://sheetjs.com/pres.numbers"));
if (res.statusCode == 200)
_processBytes(res.bodyBytes);
else
throw Exception("Failed to fetch file");
}
void _processBytes(Uint8List bytes) {
String base64 = base64Encode(bytes);
JsEvalResult func = _engine.evaluate("""
var wb = XLSX.read('$base64');
XLSX.utils.sheet_to_csv(wb.Sheets[wb.SheetNames[0]]);
""");
setState(() {
_data = CsvToListConverter(eol: "\n").convert(func.stringResult);
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
backgroundColor: Theme.of(context).colorScheme.inversePrimary,
title: Text('SheetJS x Flutter $_version'),
),
body: Table(
children: _data.mapIndexed((R, row) => TableRow(
decoration: BoxDecoration(color: R == 0 ? Colors.blue[50] : null),
children: row.mapIndexed((C, cell) => Text(cell.toString())).toList()
)).toList()
),
);
}
}