Flutter使用excel1.1.5读取Excel时数据带多余包裹如何提取单元格真实值
Flutter读取excel包单元格真实值问题
问题场景
在Flutter开发中使用excel 1.1.5包读取Excel文件,目标Excel数据如下:
初始读取代码如下:
List<String> rowdetail = []; _importFromExcel() async { var file = "storage/emulated/0/Android/data/com.xxxx.xxxx/files/Download/Input.xlsx"; var bytes = File(file).readAsBytesSync(); var excel = Excel.decodeBytes(bytes); for (var table in excel.tables.keys) { for (var row in excel.tables[table]!.rows) { rowdetail.add(row.toString()); } } }
运行后打印的读取结果带额外冗余内容:
I/flutter (12873): [Data(1, 0, 0, null, Sheet1), Data(Assets, 1, 0, null, Sheet1), Data(Bank accounts, 2, 0, null, Sheet1), Data(Cb 7723, 3, 0, null, Sheet1), Data(2022-05-26 10:46:07.679579, 4, 0, null, Sheet1), Data(27, 5, 0, null, Sheet1), Data(6269, 6, 0, null, Sheet1), Data(, 7, 0, null, Sheet1)]
比如第一行第一列的预期取值是1,实际输出却带了Data(前缀和, 0, 0, null, Sheet1)后缀,无法直接拿到真实单元格数据。
解决方法
出现这个问题的原因是:遍历行拿到的每个元素都是excel包内置的Data类型单元格对象,直接对对象调用toString()会输出对象的完整结构信息,而非单元格存储的内容。Data对象提供了value属性,专门存储单元格的真实值,读取这个属性就能拿到目标内容,修改后的代码如下:
List<String> rowdetail = []; _importFromExcel() async { var file = "storage/emulated/0/Android/data/com.xxxx.xxxx/files/Download/Input.xlsx"; var bytes = File(file).readAsBytesSync(); var excel = Excel.decodeBytes(bytes); for (var table in excel.tables.keys) { for (var row in excel.tables[table]!.rows) { // 逐单元格取值 List<String> singleRowContent = []; for (var cell in row) { // 空单元格做判空处理,避免报错 singleRowContent.add(cell?.value?.toString() ?? ""); } // 按需求拼接单行内容后加入列表 rowdetail.add(singleRowContent.join(",")); } } }
- 如果需要处理数字、日期、公式等特殊格式的单元格,可以先判断
cell.value的具体类型,再做针对性格式化,无需直接转成字符串。 - 不要直接对
Data实例调用toString()取值,该方法仅用于输出对象调试信息,不会返回业务需要的单元格内容。
内容的提问来源于stack exchange,提问作者gputhige
相关产品推荐
相关产品推荐

