让我头疼一下午的Excel合并单元格
Excel导出常见问题
excel导出其实不算什么难事
在网上copy下模板代码,填充自己的业务数据,提供一个http接口基本就可以得到你要导出的数据了。
但是,凡事都有例外,截止今天,excel导出我遇到的主要是两大类问题
1、大数据量的excel数据,比如几十万条甚至更多的数据导出
2、因为excel中内容的问题,导致导出后的excel不能直接打开,报错“由于一些内容不可取,Excel无法打开xxx.xlsx。是否要打开并修复此工作簿?”
针对第一种大数据量问题,我遇到的主要问题是excel存储的记录上限和导出超时等问题
解决方法是将导出格式为xls升级为xlsx,xls每个sheet最多支持65536条记录,xlsx最多支持1048576条记录;超时则可以采用前端直接返回,后端异步取数据并导出的方式避免超时。
这种情况不是今天要介绍的重点,今天要介绍的第二种情况的解决思路。
需求描述
1、层级关系最多为四级
2、对于相同层级,如果内容相同需要纵向合并单元格,空白行不需要合并
3、样例数据如下所示
一级目录1,二级目录1,三级目录1,四级目录2,
一级目录1,二级目录1,三级目录3,
一级目录1,二级目录1,三级目录5,
一级目录1,二级目录3,
一级目录1,二级目录5,三级目录5,
一级目录2,二级目录2,三级目录2,
一级目录2,二级目录2,三级目录3,
一级目录2,二级目录4,三级目录4,
一级目录2,二级目录7,
一级目录3,二级目录6,三级目录4,
一级目录3,二级目录6,三级目录10,
一级目录4,
一级目录5,二级目录8,三级目录6,
解决思路
将上面样例数据存入一个集合中,遍历每条记录并存放到相应的单元格。
如果不需要合并单元格,到这里,就可以提供导出的Excel了。
但是重点是合并单元格。
遇到的问题
初步排查
自认为代码已经就位,调用接口,Excel文件也成功下载了,结果打开的那一刻一个对话框让我头疼了一下午。
报错信息如下
第一反应是肯定数据错乱了,估计是单元格之间相互挤占,数据肯定也是不堪入目。
但是我按照智能的Excel提示,点击“打开并修复”后发现,数据没有我想的那么糟,甚至仔细看看,发现居然没有问题。
有点小激动的同时,心里还是有点不爽,总不能让别人每次导出的时候都使用这个智能的“打开并修复”功能才能看导出的数据吧。
但是光从这个报错信息来看确实没有什么线索,于是网上找了一通与“由于一些内容不可取,Excel无法打开xxx.xlsx。是否要打开并修复此工作簿?”有关的解决方法。虽然有不少人遇到过这样的问题,但是引起问题的原因不太一样,有些是因为sheet的命名包含特殊字符,有些是导出的Excel内容中有非法字符,还有说要在response的header中加入Content-length字段的。
进一步排查
搜了一通,没有什么进展,这时候想起来在刚刚点击“打开并修复”后,还弹出了一个对话框,于是点击对话框中的查看
得到线索如下
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<recoveryLog xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main"><logFileName>修复结果到 xxx.xml</logFileName><summary>在文件“/Users/jackie/Downloads/xxx.xlsx”中检测到错误</summary><removedRecords summary="以下是已删除记录的列表:"><removedRecord>已删除的记录: /xl/worksheets/sheet1.xml 的 合并单元格</removedRecord></removedRecords></recoveryLog>
排除了前面提到的种种非法字符的原因,看到线索里的“合并单元格”,基本可以断定这是因为在合并单元格的过程中出了问题。
寻找问题根本原因
结合合并单元格导致Excel表格无法打开的症状在网上搜索一通
http://www.360doc.com/content/14/0107/11/14931240_343269914.shtml这篇文章给出了解决思路
我将下载的Excel表格的后缀从xlsx改为zip并打开
打开sheet1.xml文件,找到mergeCells标签,将其内容拷贝到XML在线格式化工具中查看
经过人眼搜索,终于发现了问题所在
...