在后端开发中,做产品后台时总会涉及到数据导出,导出excel,相信大家都做过吧。接下来推荐集中导出的写法,供个参考。
1.使用第三方类库进行实现
说起用第三方的话,phpExcel一定很不陌生,使用composer可以直接整下来了
# 原来的,该软件包已**被放弃**,不再维护。作者的建议是用下面那个新的
composer require phpoffice/phpexcel
# 新的
composer require phpoffice/phpspreadsheet
,不行可以直接github下载
# 原来的,该软件包已**被放弃**,不再维护。作者的建议是用下面那个新的
https://github.com/PHPOffice/PHPExcel
# 新的
https://github.com/PHPOffice/PhpSpreadsheet
使用方式也是很简单的,具体的看文档吧,不过这个的话相对于内存使用较高一些,不过个人绝对,如果只是针对于简单的数据导出,直接写csv就好了,所以不是很推崇这个
https://phpoffice.github.io/PhpSpreadsheet/master/
2.使用CSV直接输出的形式
如果采用同步的操作的时候,可以直接以header的形式输出
实现方式如下
// 换行符
$csv_terminated = pma_whichCrlf();
$data = [];// 需要输出的内容
$data = array_map(function($item){
// TODO: 对于数据做一些处理
}, $data);
// 拼接str
// $strs = join(',', $row).$csv_terminated;
header("Content-type:text/csv");
header("Content-Disposition:attachment;filename=文件名.csv");
header('Cache-Control:must-revalidate,post-check=0,pre-check=0');
header('Expires:0');
header('Pragma:public');
echo $strs;
接下来,咱们进一步的优化这个程序,首要想到的优化,肯定是将同步的转化为异步的。也就是导出实际上就是发起一个命令,生成一个文件,然后进行文件写入。
// TODO: 任务参数,根据任务出数据
$fp = fopen('文件路径加文件名.csv', 'w');
$data = [];// 需要输出的内容
$data = array_map(function($item){
// TODO: 对于数据做一些处理
}, $data);
// 将数据写入文件,当然可以在array_map中就完成这个动作
// fputcsv($fp, $row);
fclose($fp);
// TODO: 处理任务状态
emmm,这种程度一般是够用了,但是嘛,本着极客思维,这种还是不能让咱们就此满足,毕竟嘛,实话实说,PHP文件操作还是很差,如果我中间循环用了file_put_contents(),那简直慢死,上面的虽然只有一个资源句柄,但是能不用还是不用了。那怎么做呢?借助个shell脚本 php artisan 命令 >> 文件.csv / php think 命令 >> 文件.csv
// TODO: 任务参数,根据任务出数据
$csv_terminated = pma_whichCrlf();
$fp = fopen('文件路径加文件名.csv', 'w');
$data = [];// 需要输出的内容
$data = array_map(function($item){
// TODO: 对于数据做一些处理
}, $data);
// 将内容循环输出,当然可以在array_map中就完成这个动作
// echo join(',', $row).$csv_terminated;
fclose($fp);
// TODO: 处理任务状态
3.写CSV要注意哪些东西
写csv要注意,挺多东西的,例如换行,有例如科学技术法,又例如有人不会用utf8格式打开CSV等。
1. 换行问题
说起来也简单,如果就是转译掉 里面的 ",和去掉换行符
// 在array_map 中写就好,注意要把那个$csv_terminated use进去
foreach($item as $field => $value) {
$item[$field] = addslashes($value);
$item[$field] = str_replace($csv_terminated, '', $value);
}
return $item;
2.科学计数法
很多比较长的数字串会被转成科学计数法,网上很多人说的解决方案是插入一个字母或者制表符,我觉得这个方法还是不太可取的,可以采用“写个excel公式”式的方式,解决这个问题,具体方法是
foreach($item as $field => $value) {
$item[$field] = '="' . $value . '"';
}
return $item;
3.至于遇到不会用utf8查看文件的
这个就喊他去谷歌吧,没有梯子就去百度吧,搜出来一般有两者方式
1.新建一个excel,然后进入数据,倒入数据,来自文本,将你的csv当作数据源倒入进去
2.第二张是在文本中有选项查看的格式
如果有遇到什么其他的问题,或者更好的方式,也欢迎留言共同探讨
网友评论