office 已检测到文件存在问题,编辑此文件可能存在风险

更新日期: 2019-03-22 阅读次数: 1614 字数: 270 分类: Laravel

在使用 Maatwebsite/Laravel-Excel 将后台用户数据导出到 Excel 中时,遇到一个诡异的问题。

部分用户的微信昵称在 Excel 中不显示,Excel 版本为 2019。

同时,Excel 的顶部还出现一条风险提示:

office已检测到文件存在问题 编辑此文件可能存在风险

经同事测试,发现当微信昵称中存在 emoji 表情时,就能百分比重现此问题。看来是 Excel 把 emoji 当成了非法字符。

所以解决方案就是把昵称中的 emoji 过滤掉,然后导出到 Excel。

实现方法参考这里

https://stackoverflow.com/questions/12807176/php-writing-a-simple-removeemoji-function/20208095

逻辑就是通过 emoji 的 unicode 编码区间做过滤。

public static function removeEmoji($text) {

    $clean_text = "";

    // Match Emoticons
    $regexEmoticons = '/[\x{1F600}-\x{1F64F}]/u';
    $clean_text = preg_replace($regexEmoticons, '', $text);

    // Match Miscellaneous Symbols and Pictographs
    $regexSymbols = '/[\x{1F300}-\x{1F5FF}]/u';
    $clean_text = preg_replace($regexSymbols, '', $clean_text);

    // Match Transport And Map Symbols
    $regexTransport = '/[\x{1F680}-\x{1F6FF}]/u';
    $clean_text = preg_replace($regexTransport, '', $clean_text);

    // Match Miscellaneous Symbols
    $regexMisc = '/[\x{2600}-\x{26FF}]/u';
    $clean_text = preg_replace($regexMisc, '', $clean_text);

    // Match Dingbats
    $regexDingbats = '/[\x{2700}-\x{27BF}]/u';
    $clean_text = preg_replace($regexDingbats, '', $clean_text);

    return $clean_text;
}

过滤之后,导出 Excel 的内容就能够完整显示了。

爱评论不评论

近期节日

2019年09月20日 国际爱牙日
2019年09月21日 国际和平日
2019年09月22日 世界无车日
2019年09月23日 秋分
2019年09月23日 国际聋人节
2019年09月27日 世界旅游日
2019年10月01日 国庆节
2019年10月04日 世界动物日
2019年10月07日 重阳节
2019年10月08日 寒露
2019年10月09日 世界邮政日
2019年10月10日 辛亥革命纪念日
查看更多节日