카테고리 없음

flutter 엑셀 파일 가져오기

방뎁 2024. 11. 7. 16:21

엑셀을 파싱하여 사용할 수 있게 해달라는 요청을 받았다.

하기 싫어....

파싱한 후에 서버에 올려야하는데,, 서버에서 해주면 안될까...?

돈 벌어야지...

우선 'file_picker' 'excel' 패키지 추가해야한다. 

https://pub.dev/packages/file_picker

 

file_picker | Flutter package

A package that allows you to use a native file explorer to pick single or multiple absolute file paths, with extension filtering support.

pub.dev

 

https://pub.dev/packages/excel

 

excel | Dart package

A flutter and dart library for reading, creating, editing and updating excel sheets with compatible both on client and server side.

pub.dev

 

  file_picker: ^8.1.3
  excel: ^4.0.6

 

파일을 먼저 가져와야하니깐, 

String? filePath = await FilePicker.platform.pickFiles(
  type: FileType.custom,
  allowedExtensions: [
    'xls',
    'xlsx'
  ]).then((result) => result?.files.single.path);

 

파싱하려면 

  void parseExcel(File file) async {
    var bytes = await file.readAsBytes();
    var excel = Excel.decodeBytes(bytes);

    setState(() {
      columns = excel.tables[excel.tables.keys.first]!.rows.first
          .map((e) => e?.value.toString() ?? '')
          .toList();
      selectedColumnData = [];
    });
  }

 

대충 전체 코드는 아래와 같습니다. 

List<String> columns = [];
  List<List<String>> selectedColumnData = [];
  File? file;

  Future<void> pickExcelFile() async {
    FilePickerResult? result = await FilePicker.platform
        .pickFiles(type: FileType.custom, allowedExtensions: [
      'xlsx',
      'xls',
    ]);
    if (result != null) {
      file = File(result.files.single.path!);
      parseExcel(file!);
    }
  }

  void parseExcel(File file) async {
    var bytes = await file.readAsBytes();
    var excel = Excel.decodeBytes(bytes);

    setState(() {
      columns = excel.tables[excel.tables.keys.first]!.rows.first
          .map((e) => e?.value.toString() ?? '')
          .toList();
      selectedColumnData = [];
    });
  }

  void parseSelectedColumn(int columnIndex) {
    var bytes = file!.readAsBytesSync();
    var excel = Excel.decodeBytes(bytes);
    var table = excel.tables[excel.tables.keys.first]!;

    setState(() {
      selectedColumnData = table.rows
          .map((row) => row[columnIndex]?.value.toString() ?? '')
          .where((cell) => cell.isNotEmpty)
          .map((cell) => [cell])
          .toList();
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Excel Parser'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          children: [
            ElevatedButton(
              onPressed: pickExcelFile,
              child: Text('Select Excel File'),
            ),
            if (columns.isNotEmpty)
              DropdownButton<int>(
                hint: Text("Select Column"),
                items: List.generate(
                  columns.length,
                  (index) => DropdownMenuItem(
                    child: Text(columns[index]),
                    value: index,
                  ),
                ),
                onChanged: (columnIndex) {
                  if (columnIndex != null) {
                    parseSelectedColumn(columnIndex);
                  }
                },
              ),
            SizedBox(height: 20),
            Expanded(
              child: ListView.builder(
                itemCount: selectedColumnData.length,
                itemBuilder: (context, index) {
                  return ListTile(
                    title: Text(selectedColumnData[index].join(', ')),
                  );
                },
              ),
            ),
          ],
        ),
      ),
    );
  }

 

그렇다면, 응용을 해봐야겠죠?

다음 포스팅에서 Model 형태로 파싱을 해보겠습니다.