>本实例是采用THINKPHP5.1+ajax+phpexcel 来实现导出Excel功能。
由于ajax的返回值类型是json,text,html,xml类型,或者可以说ajax的接收类型只能是string字符串,不是流类型,所以无法实现文件下载,强行使用会使response出现乱码。因此,如果需要ajax来实现导出功能,则需要在方法中生成Excel文件,构造文件路径URL返回给ajax进行响应下载。
//前端代码:获取筛选条件参数后采用post方式传递URL中,在success回调函数中进行页面重定向,重定向的地址是Excel文件路径
导出Excel
//控制器方法
* 导出Excel
* @param array $params
public function UserListExport(){
if(Request::isAjax()){
$userId = get_admin_id();
$userProfileService = new UserProfileService();
$settingService = new SettingService();
$excelUtil = new ExcelUtil();
$params = Request::post();
$where = $this->formatParams($params);
$list = $userProfileService->selectUserAndProfile($where);
$userList = $userProfileService->formatExportList($list['userList']);
$systemInfo = $settingService->getByName(SettingType::SETTING_TYPE_SYSTEM);
//设置excel表头
$header = ['id','用昵称','用户等级','用户手机号','真实姓名','身份证号','性别','实名状态','推荐人姓名','推荐人手机','推荐人等级'];
//调用导出类,接收返回值(文件路径)
$path = $excelUtil->export($userId,'用户列表','用户',$systemInfo['excel_export'],$header,$userList);
if($path){
//路径拼接域名
$webSite = $settingService->getByName(SettingType::SETTING_TYPE_WEBSITE);
$path = $webSite['basehost'].$path;
$response = ['url'=>$path];
return $this->ajaxSuccess('获取成功',$response);
return $this->ajaxError();
* 导出Excel方法
* @param int $userId 用户id
* @param string $expTitle 表格标题
* @param string $expFileName 导出文件名
* @param string $expFileType 导出文件后缀:xls,csv
* @param array $expHeadArr 导出文件列名
* @param array $expDataList 导出数据
public function export($userId,$expTitle,$expFileName,$expFileType,$expHeadArr,$expDataList){
$time = md5(date('YmdHis',time()).$userId);
$expFileName .= "_".$time.".".$expFileType;
//设置保存路径
$basePath = request()->env('ROOT_PATH').'public';
$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;
$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');
$num = count($expHeadArr);
$lastHead = chr($key+$num);
$mergeCells = 'A1:'.$lastHead.'1';
$objPHPExcel->getActiveSheet()->mergeCells($mergeCells);
//单元格居中、字体大小、粗体
$objPHPExcel->getActiveSheet()->getStyle('A1')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::VERTICAL_CENTER);
$objPHPExcel->getActiveSheet()->getStyle('A1')->getFont()->setSize(20);
$objPHPExcel->getActiveSheet()->getStyle('A1')->getFont()->setBold(true);
//设置表头信息
$objPHPExcel->setActiveSheetIndex(0)->setCellValue('A1',$expTitle);
foreach($expHeadArr as $head){
$colum = chr($key);
$objPHPExcel->getActiveSheet()->setCellValue($colum.'2',$head);
$objPHPExcel->getActiveSheet()->getStyle($colum.'2')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::VERTICAL_CENTER); //表头文字居中
$key += 1;
//写入数据
$colum = 3;
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(13);//设置宽度
$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('\\','/',$baseUrl.$expFileName);
return $filePath;
//直接弹出提示下载,不生成文件
header('pragma:public');
header("Content-Disposition:attachment;filename=$expFileName");
header('Cache-Control: max-age=0');
$objWriter = PHPExcel\_IOFactory:: *createWriter*($objPHPExcel, 'Excel2007');
$objWriter->save( 'php://output');
composer安装与使用
python
python3执行tarfile解压文件报错:tarfile.ReadError:file could not be opened successfully
golang
单元测试框架
Golang内置testing包
GoConvey库
testify库
打桩与mock
GoMock框架
Gomonkey框架
HTTP Mock
httpMock
mux库/httptest
MYSQL
SQL语言的分类
事务(重点)
导入导出数据库
优化mysql数据库的方法
MyISAM与InnoDB区别
外连接、内连接的区别
物理文件结构
PostgreSQL
pgsql常用命令
pgsql应用目录(bin目录)文件结构解析
pg_ctl
initdb
clusterdb
cluster命令
createdb
dropdb
createuser
dropuser
pg_config
pg_controldata
pg_checksums
pgbench
pg_basebackup
pg_dump
pg_dumpall
pg_isready
pg_receivewal
pg_recvlogical
pg_resetwal
pg_restore
pg_rewind
pg_test_fsync
pg_test_timing
pg_upgrade
pg_verifybackup
pg_archivecleanup
pg_waldump
postgres
reindexdb
vacuumdb
pgsql数据目录文件结构解析
pgsql数据目录文件结构解析
postgresql.conf解析
pgsql系统配置参数说明
pgsql索引类型
四种索引类型解析
索引之ctid解析
索引相关操作
pgsql函数解析
pgsql系统函数解析
pgsql窗口函数解析
pgsql聚合函数解析
pgsql系统表解析
pg_stat_all_indexes
pg_stat_all_tables
pg_statio_all_indexes
pg_statio_all_tables
pg_stat_database
pg_stat_statements
pg_extension
pg_available_extensions
pg_available_extension_versions
pgsql基本原理
进程和内存结构
数据文件的内部结构
垃圾回收机制VACUUM
事务日志WAL
事务ID-txid
元组结构-Tuple Structure
事务状态记录-Commit Log (clog)
事务快照-Transaction Snapshot
事务快照实例
事务隔离级别
读已提交-Read committed
可重复读-Repeatable read
可序列化-Serializable
读未提交-Read uncommitted
扩展机制解析
扩展的定义
扩展的安装方式
自定义创建扩展
扩展的管理
扩展使用实例
在pgsql中使用last、first聚合函数
pgsql模糊查询不走索引的解决方案
pgsql的pg_trgm扩展解析与验证
LNMP环境搭建
一键安装包
配置文件目录
服务器管理系统
宝塔(Linux)
安装与使用
开放API
自定义apache日志
一键安装包LNMP1.5
LNMP1.5:添加、删除站点
LNMP1.5:php多版本切换
LNMP1.5 部署 thinkphp项目
Operation not permitted解决方法
Nginx
Nginx的产生
正向代理和反向代理
Linux常用命令
目录与文件相关命令
目录操作命令
文件编辑命令
文件查看命令
文件查找命令
文件权限命令
文件上传下载命令
用户和群组相关命令
用户与用户组的关系
用户相关的系统配置文件
用户相关命令
用户组相关命令
压缩与解压相关命令
.zip格式
.tar.gz格式
.gz格式
.bz2格式
查看系统版本
cpuinfo详解
meminfo详解
getconf获取系统信息
磁盘空间相关命令
查看系统负载情况
系统环境变量
网络相关命令
ip命令详解
ip命令格式详解
ip address命令详解
ip link命令详解
ip rule命令详解
ip route命令详解
nslookup命令详解
traceroute命令详解
netstat命令详解
route命令详解
tcpdump命令详解
系统进程相关命令
ps命令详解
pstree命令详解
kill命令详解
守护进程-supervisord
性能监控相关命令
top命令详解
iostat命令详解
pidstat命令详解
iotop命令详解
mpstat命令详解
vmstat命令详解
ifstat命令详解
sar命令详解
iftop命令详解
定时任务相关命令
ssh登录远程主机
ssh口令登录
ssh公钥登录
ssh带密码登录
ssh端口映射
ssh配置文件
ssh安全设置
history命令详解
linux开启操作日志记录
git初始化本地仓库-https
git初始化仓库-ssh
git-查看和设置config配置
docker
docker原理
docker镜像原理
docker Overlay2 文件系统原理
docker日志原理
docker日志驱动
docker容器日志管理
验证容器的启动是作为Docker Daemon的子进程
验证syslog类型日志驱动
验证journald类型日志驱动
验证local类型日志驱动
修改容器的hostname
修改容器的hosts
验证联合挂载技术
验证启动多个容器对于磁盘的占用情况
验证写时复制原理
验证docker内容寻址原理
docker存储目录
/var/lib/docker目录
image目录
overlay2目录
具名挂载和匿名挂载
数据卷容器
Dockerfile详解
dockerfile指令详解
实例:构造centos
实例:CMD和ENTRYPOINT的区别
docker网络详解
docker-compose
redis
redis的数据类型和应用场景
redis持久化
RDB持久化
AOF持久化
redis缓存穿透、缓存击穿、缓存雪崩
常见网络攻击类型
CSRF攻击
XSS攻击
SQL注入
Cookie攻击
历史项目经验
图片上传项目实例
原生php上传方法实例
base64图片流
tp5的上传方法封装实例
多级关系的递归查询
数组转树结构
thinkphp5.1+ajax实现导出Excel
JS 删除数组的某一项
判断是否为索引数组