本篇博客,记录一下我用flutter开发Windows桌面软件的时候,读取Excel表格遇到的问题
在百度搜多有两个三方库可以读取表格,excel和spreadsheet_decoder,先开始使用的是excel这个三方库,这个垃圾,很多问题,后来使用了spreadsheet_decoder,才搞定。
我的表格数据量很大,一般都是几万条,我使用的一个4万多条数据的表格进行测试开发
excel存在的问题:
1、数据量大,读取很慢,因为要遍历读取每一行的数据,超级慢。
2、数据量大,读到8000多条的时候,数据乱了,你敢信,两行的数据,读取成一行给我了。
3、读取到的数据不正规,以下是示例,数据带有文字样式,导致不好解析,反正我按照示例代码读取的。
[
Data(蔺文辉, 0, 8378, CellStyle(false, 0, false, Underline.None, 10, 宋体, TextWrapping.WrapText, VerticalAlign.Bottom, HorizontalAlign.Left, FF000000, none, Border(borderStyle: BorderStyle.Thin, borderColorHex: null), Border(borderStyle: BorderStyle.Thin, borderColorHex: null), Border(borderStyle: BorderStyle.Thin, borderColorHex: null), Border(borderStyle: BorderStyle.Thin, borderColorHex: null), Border(borderStyle: null, borderColorHex: null), false, false), Sheet1),
Data(181352xxx95, 1, 8378, CellStyle(false, 0, false, Underline.None, 10, 宋体, TextWrapping.WrapText, VerticalAlign.Bottom, HorizontalAlign.Left, FF000000, none, Border(borderStyle: BorderStyle.Thin, borderColorHex: null), Border(borderStyle: BorderStyle.Thin, borderColorHex: null), Border(borderStyle: BorderStyle.Thin, borderColorHex: null), Border(borderStyle: BorderStyle.Thin, borderColorHex: null), Border(borderStyle: null, borderColorHex: null), false, false), Sheet1),
Data(山西太工天成控制工程有限公司, 2, 8378, CellStyle(false, 0, false, Underline.None, 10, 宋体, TextWrapping.WrapText, VerticalAlign.Bottom, HorizontalAlign.Left, FF000000, none, Border(borderStyle: BorderStyle.Thin, borderColorHex: null), Border(borderStyle: BorderStyle.Thin, borderColorHex: null), Border(borderStyle: BorderStyle.Thin, borderColorHex: null), Border(borderStyle: BorderStyle.Thin, borderColorHex: null), Border(borderStyle: null, borderColorHex: null), false, false), Sheet1),
Data(-, 3, 8378, CellStyle(false, 0, false, Underline.None, 10, 宋体, TextWrapping.WrapText, VerticalAlign.Bottom, HorizontalAlign.Left, FF000000, none, Border(borderStyle: BorderStyle.Thin, borderColorHex: null), Border(borderStyle: BorderStyle.Thin, borderColorHex: null), Border(borderStyle: BorderStyle.Thin, borderColorHex: null), Border(borderStyle: BorderStyle.Thin, borderColorHex: null), Border(borderStyle: null, borderColorHex: null), false, false), Sheet1)
]
4、垃圾玩意。
spreadsheet_decoder 完全不存在上面的问题
示例代码:
var bytes = File(xlsFilePath).readAsBytesSync();
var excel = SpreadsheetDecoder.decodeBytes(bytes);
for (var tableIndex in excel.tables.keys) {
//遍历多个sheet
var phoneIndex = -1;
var table = excel.tables[tableIndex]; //每一张表
///拿到电话是第几列
if (table!.maxRows > 0) {
var row = table.rows[0]; //0行的数据
for (var j = 0; j < row.length; j++) {
var str = row[j];
if (str == "电话") {
phoneIndex = j;
break;
}
}
if (phoneIndex != -1) {
for (var i = 1; i < table.rows.length; i++) {
//遍历每一个表格内数据
/// row 每一行的数据,是一个字符串数组,包含每一列的数据
var row = table.rows[i]; //表里的每一行数据
// print("$row");
///遍历每一行的数据,拿到每一行的电话
var str = row[phoneIndex];
print(str);
phoneList.add(str);
}
}
}
}