需求:每周一自动检测一个月内即将过期的用户,生成excel2007文件(xlsx文件)并发送给指定的人员。
做成一个脚本,使用定时任务即可解决。脚本分解为两步:生成Excel,发送邮件。
一.生成Excel:使用简单的更改文件头(header)和使用table标签生成Excel文件会出现各种问题——打开的时候会有提醒,或者其他语言无法解析。使用phpExcel插件(官方已不再维护),在php7.2以上版本会出现兼容性问题。
又找了个插件完美解决。就是:PHP_XLSXWriter
相比于phpExcel,PHP_XLSXWriter小而强悍,它并没有PHPExcel
功能丰富,很多高级操作比如冻结表头,并不具备,但是它导出速度非常快,非常适合于数据量特别大,报表格式不是很复杂的导出需求。github地址:https://github.com/mk-j/PHP_XLSXWriter
二.发送邮件:我使用的是自己封装的一个邮件类。(下篇博客会贴出来给大家做一个参考)
实现代码如下:(只是一个例子,供参考)
<?php
$dir=dirname(__FILE__);//查找当前脚本所在路径
include_once( $dir."/xlsxwriter.class.php");//引入
//表格头信息
$header = array(
'公司'=>'string',//text
'部门'=>'string',//text
'产品名称'=>'string',
'产品id'=>'string',
'截止时间'=>'date',
);
//表格内容
$list = array(
array('南华证券有限公司','测试1','手机炒股','M11uM+0+QwoRcI3SA','2019-01-15'),
array('北华证券有限公司','测试2','电脑炒股','M11uM+0+QwoRcI3SB','2019-01-17'),
array('东华证券有限公司','测试3','不要炒股','M11uM+0+QwoRcI3SC','2019-01-16'),
);
$writer = new XLSXWriter();
$writer->writeSheetHeader('Sheet1', $header);
foreach($list as $row)
$writer->writeSheetRow('Sheet1', $row);
/**如果想直接导出表格【浏览器中】
代码直接如下即可,写好的接口 需要用浏览器请求,使用postman 会看到乱码[类似用文本打开Excel文件]
$name = 'aaa.xlsx';
header('Content-Type:application/vnd.ms-excel');
header("Content-Disposition:attachment;filename=$name");
//输出到浏览器
$writer->writeToStdOut();
$writer = null;
exit;
**/
// 输出文件
// $writer->writeToFile('test.xlsx');
//将文件内容赋值给$data
$data = $writer->writeToString();
$attachment = array("文件名.xlsx"=>$data);
//收件人email地址
$sendMailTo = "test@mail.com,test1@mail.com,test2@mail.com";
$subject = "邮件名称";
$body = "邮件内容";
//发送邮件
sendMail($sendMailTo,$subject,$body,$attachment);
// 此处用到的邮件类下一篇贴出供参考
function sendMail($sendMailTo,$subject,$body,$attachment = null)
{
if(!empty($attachment)){
$newAttachment = array();
foreach ($attachment as $key => $value) {
$newAttachment[] = array(
'datatype' => 'data',
'data' => $value,
'filename' => $key
);
}
$attachment = $newAttachment;
}
$emailArr = explode(',', $sendMailTo);
foreach ($emailArr as $email) {
Mail::sendemail($email,$subject,$body,$attachment);
}
}
?>
定时,每周一跑一次。需求解决
关于PHP_XLSXWriter的使用,如果是用在html页面,通过点击按钮导出表格的话,可以这么用:
$name = 文件名;
header('Content-Type:application/vnd.ms-excel');
header("Content-Disposition:attachment;filename=$name");
//输出到浏览器
$writer->writeToStdOut('php://output');
$writer = null;