| 
									
										
										
										
											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() | 
					
						
							|  |  |  |       ), | 
					
						
							|  |  |  |     ); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 |