Thinkphp5.*+AJAX导出
由于项目需要,导出只能使用ajax无刷新导出,关于ajax导出的详细代码做一个展示,由于项目时间紧急,没来得及封装,如果有更好的方式请在评论中留言,我会及时改正,代码质量问题大胆提出,我会加以改正,上代码!
jquery:
$.post(options.extend.download_url,{'type':ids},function (msg) {
if (msg.code==1){
// 请求回来的文件进行导出
window.location.href = msg.path;
//删除导出文件
$.post('Tools/del_file',{'path':msg.delpath},function (msg) {
// TOOL你的逻辑代码
});
}
});
PHP:
<?php
namespace app\admin\controller;
use think\Controller;
use think\Request;
use think\Db;
/**
* 工具类
* @author Liu-yuanhang
* Class Tools
* @package app\admin\controller
*/
class Tools
{
// 自定义配置参数
protected $setting=[];
// 导出参数
protected $exportsSetting=[];
public function __construct ($setting=[],$exportsSetting=[]){
$this->setting = $setting;
$this->exportsSetting = $exportsSetting;
}
/**
* AJAX导出
* @param string $expTitle 表格标题
* @param string $expFileName 导出文件名
* @param string $expFileType 导出文件后缀:xls,csv
* @param array $expHeadArr 导出文件列名
* @param array $expDataList 导出数据
* @author Liu-Yuanhang
* @return string|string[]
* @throws \PHPExcel_Exception
* @throws \PHPExcel_Reader_Exception
* @throws \PHPExcel_Writer_Exception
*/
static function ajax_excel_prot($expFileName,$expDataList,$expHeadArr,$expFileType='xlsx'){
$time = date('YmdHis',time());
$expFileName .= "_".$time.".".$expFileType;
//设置保存路径
$basePath = request()->env('ROOT_PATH').'uploads';
$baseUrl = DIRECTORY_SEPARATOR.implode(DIRECTORY_SEPARATOR, ['excel',date('Y-m-d',time())]). DIRECTORY_SEPARATOR;
$path = $basePath.$baseUrl;
//路径不存在则创建路径
if(!is_dir($path)){
mkdir($path, 0777, true);
}
$path = $path.$expFileName;
//这里引入PHPExcel文件注意路径修改
vendor("PHPExcel");
vendor("PHPExcel.Writer.Excel5");
vendor("PHPExcel.Writer.Excel2007");
vendor("PHPExcel.IOFactory");
$objPHPExcel = new \PHPExcel();
//设置Excel属性
$objPHPExcel->getProperties()
->setCreator("Maarten Balliauw") //创建人
->setLastModifiedBy("Maarten Balliauw") //最后修改人
->setTitle("Office 2007 XLSX Test Document") //设置标题
->setSubject("Office 2007 XLSX Test Document") //设置主题
->setDescription("Test document ") //设置备注
->setKeywords( "office 2007 openxml php") //设置关键字
->setCategory( "Test result file"); //设置类别
//设置Excel样式
//设置第一行(标题)合并单元格
$key = ord('A');
//设置表头信息
foreach($expHeadArr as $head){
$colum = chr($key);
$objPHPExcel->getActiveSheet()->setCellValue($colum.'1',$head);
$objPHPExcel->getActiveSheet()->getStyle($colum.'1')->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER); //表头文字居中
$objPHPExcel->getActiveSheet()->getStyle($colum.'1')->getFont()->setSize(12);
$objPHPExcel->getActiveSheet()->getStyle($colum.'1')->getFont()->setBold(true);
$key += 1;
}
//写入数据
$colum = 2;
foreach($expDataList as $key =>$row){
//行写入
$span = ord("A");
foreach($expDataList[$key] as $keyName => $value){
//列写入
$objPHPExcel->getActiveSheet()->setCellValue(chr($span).$colum,$value);
$objPHPExcel->getActiveSheet()->getStyle(chr($span).$colum)->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_LEFT); //文字左对齐中
$objPHPExcel->getActiveSheet()->getColumnDimension(chr($span))->setWidth(17);//设置宽度
$span ++;
}
$colum ++;
}
$objPHPExcel->setActiveSheetIndex(0);
ob_end_clean();//清除缓冲区,避免乱码
//"Excel2007"生成2007版本的xlsx,"Excel5"生成2003版本的xls
$objWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel,'Excel5');
//保存路径
$objWriter->save($path);
$filePath = str_replace('\\','/',$path);
$filePaths = $_SERVER['HTTP_ORIGIN'].'/'.$filePath;
return ['code'=>1,'msg'=>'导出成功!','path'=>$filePaths,'delpath'=>$filePath];
}
/**
* AJAX导出
* @author Liu-Yuanhang
* @return array
* @throws \PHPExcel_Exception
* @throws \PHPExcel_Reader_Exception
* @throws \PHPExcel_Writer_Exception
*/
public function del_file(){
$return_arr =['code'=>1,'msg'=>''];
$param = input('path');
if (!$param){
$return_arr['code']=2;
$return_arr['msg']='文件不存在,删除失败!';
return $return_arr;
}
$path = $param;
if (file_exists($path)) {
unlink($path);//删除文件
$return_arr['msg']='删除成功!';
return $return_arr;
}else{
$return_arr['code']=2;
$return_arr['msg']='删除失败!';
return $return_arr;
}
}
}
第三方拓展包:PHPEXCEL,下载地址:phpexcel
放到tp项目的vendor下即可
注意:
PHPExcel 已经停止维护了,我现在做的是老项目,老项目php版本较低,而且对性能没太大的要求所以才会使用PHPExcel,如果是新项目最好是用PhpSpreadsheet
本文章只是为了方便大家参考,也是为了我的方便来进行个记录。
代码质量可能没有大家写的好,一是项目太急了,在一个是项目毕竟非常小,没有时间和精力去完美的封装,如有不足还请大家谅解!