forked from sheetjs/docs.sheetjs.com
		
	
		
			
				
	
	
		
			101 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
			
		
		
	
	
			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://docs.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()
 | 
						|
      ),
 | 
						|
    );
 | 
						|
  }
 | 
						|
}
 | 
						|
 |