一,前言
1,核心代码
PHPExcel,php处理excel插件
$objPHPExcel = new \PHPExcel();
$objPHPExcel->setActiveSheetIndex(0);
$objActive = $objPHPExcel->getActiveSheet()
2,两种写入方式
$objActive->setCellValue("A1", "content") 根据传入内容自动判断单元格内容类型
比如content = 'a' 字符串;content = 123 数值 ; content =true 布尔类型
$objActive->setCellValueExplicit("A1", "数据",$type) 显式指定内容类型
支持的类型有:TYPE_STRING TYPE_STRING2 TYPE_NULL TYPE_NUMERIC TYPE_FORMULA TYPE_BOOL TYPE_ERROR
二,问题出现
1,问题描述
从数据库获取数据,然后循环遍历写入excel的时候
有的单元格可以写入数据,有的单元格数据为空,查询数据源,发现并没有丢失的数据。
2,排查
对比了可以写入的数据和不能写入的数据
发现只有emoji表情方面的区别,原来PHPExcel不支持这种编码的
当然有解决的办法,请参考:https://github.com/iamcal/php-emoji
我选择了对表情进行过滤。
3,过滤,PHP语言
preg_replace_callback($a, function(), $c) 执行正则表达式搜索并使用回调替换
$a : 要搜索的字符串
function : 回调函数
$c : 源输入
实例:返回过滤后的数据,数组对应数组,字符对应字符
function filterEmoji($str)
{
$str = preg_replace_callback(
'/./u',
function (array $match) {
return strlen($match[0]) >= 4 ? '' : $match[0];
},
$str);return $str;
}
实例2:匹配emoji表情
function emoji_match($text)
{
$emoji = "/[\u010000-\u10FFFF]/g"; // 4字节utf-16 = emoji
return preg_match($emoji, $text);
}