PHPExcel导出文件遇到Emoji导致数据丢失

一个线上老项目导出数据功能出现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、这里总结解决问题的两个要点
欲速则不达
遇到问题切忌猜
加日志,比直接打印更真实

发表评论

电子邮件地址不会被公开。 必填项已用*标注