一个线上老项目导出数据功能出现bug, 采用PHPExcel导出excel文件打开后一半的数据不完整,并且打开的时候Excel提示”发现不可读取的内容”。
一、尝试解决
0、尝试解决一
看起来是内容有问题,导出的时候把数据打印在页面上,发现中文乱码。用之前及其熟悉解决中文乱码问题的2中方法快速测试发现无果。
# 方法一、设置编码 header("Content-type:text/html;charset=utf-8"); # 方法二、加BOM头 $bom = "\xEF\xBB\xBF"; $content .= $bom;
1、尝试解决二
Google搜索Excel提示”发现不可读取的内容”?
找到的解决办法:参考这里
1.0、save后要加exit
$objWriter->save('php://output') exit;
代码中确实没加,加上了问题依旧。【后来仔细看这个方法解决的是打开excel有发现不可读取的内容的提示,但内容是正常的】
1.1、BOM头的问题
1.2、换浏览器打开生成excel文件。【不同的浏览器都有问题】
1.3、文件开头多了换行或空格。
2、尝试解决三【定位问题】
问题看起来不严重,也不紧急,自己也不想花时间看不熟悉的代码。之前看了一眼是用PHPExcel来实现导出的,心里很排斥用这个工具,甚至认为是工具的问题,有用直接生成csv这种方案替代的想法。
但是打开文件观察,中文都是正常的,异常数据是从某一行起的。测试导出的时候不勾选这一行,导出数据正常。然后把全部数据记录在log中,分析log的时候看到了下面的字符💯,问题这才算定位。
12月01日 00:10, 2350925457,八卦综艺君,3045347,17460819, 4444480566047926,#佟大为太好哭了# 今晚被佟大为和薛佳凝在巅峰对决上的表现震撼!俩人的《归来》细腻又感人,细节把控到位。佟大为在采访里说他演老人的时候,心里一直想着张国立老师的仪态,转身要转肩。细心满分了💯今晚你为佟大为的陆焉识流泪了吗?[泪] http://t.cn/AigOTwG9 <a target=_blank href=http://weibo.com/2350925457/IiF8Qpnlc>博文链接</a>,http://wx3.sinaimg.cn/sq480/8c204691ly1g9ginju9ypj21hc0u0jtp.jpg,http://wx1.sinaimg.cn/sq480/8c204691ly1g9ginju878j21hc0u0tbi.jpg,http://wx2.sinaimg.cn/sq480/8c204691ly1g9ginju5k6j21hc0u0mzk.jpg,http://wx2.sinaimg.cn/sq480/8c204691ly1g9ginju8vwj21hc0u0gnw.jpg,http://wx1.sinaimg.cn/sq480/8c204691ly1g9ginju7c0j21hc0u0q55.jpg,1034:4444479717891535,<a href="/tv/open/uve_edit.php?uve_id=258">12月01日 00:10:06 : 巅峰对决</a>,http://weibo.com/2350925457/IiF8Qpnlc
就是下面博文的正文:https://weibo.com/2350925457/IiF8Qpnlc?display=0&retcode=6102&type=comment
二、临时解决
定位了问题,解决就很easy, 直接过滤就好了。
$content = str_replace("💯", " ", $content);
三、终极解决分析
但是仔细分析这种Emoji字符无处不在,各种设备都有差异。
Github上有一个php-emoji的库,但是据说也不完整。不过看到了一篇文章(Emoji识别和过滤)通过代码来处理,可以参考。
四、总结
0、每种设备自带的这种Emoji,很炫酷,比如💯。但是这种字符对数据处理就是一种灾难,会引发莫名其妙的问题,Excel打开带这种字符的文本就会崩溃。还是倡导用应用自带的Emoji,一般App存的都是图。
1、对自己不熟悉的项目(代码不是自己写的,之前也没有看过代码),debug的过程,一定是建立在理解产生问题根源的基础上。而不是想快速的解决,用看起来适用的方法。
2、这里总结解决问题的两个要点
欲速则不达
遇到问题切忌猜
加日志,比直接打印更真实