엑셀을 파싱하여 사용할 수 있게 해달라는 요청을 받았다.
하기 싫어....
파싱한 후에 서버에 올려야하는데,, 서버에서 해주면 안될까...?
돈 벌어야지...
우선 '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 형태로 파싱을 해보겠습니다.