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 createState() => SheetJSFlutterState(); } class SheetJSFlutterState extends State { String _version = '0.0.0'; List> _data = []; late JavascriptRuntime _engine; @override void initState() { super.initState(); _async(); } void _async() async { await _initEngine(); await _fetch(); } Future _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 _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() ), ); } }