2023-06-01 04:41:12 +00:00
|
|
|
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 {
|
2024-04-26 04:16:13 +00:00
|
|
|
final res = await http.get(Uri.parse("https://docs.sheetjs.com/pres.numbers"));
|
2023-06-01 04:41:12 +00:00
|
|
|
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()
|
|
|
|
),
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|