ThinkPHP用PHPExcle导出Excel文件

2023-10-24 02:08
文章标签 excel 导出 thinkphp phpexcle

本文主要是介绍ThinkPHP用PHPExcle导出Excel文件,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

原文出处: 

http://lql.life/2017/06/10/ThinkPHP%E7%94%A8PHPExcle%E5%AF%BC%E5%87%BAExcel%E6%96%87%E4%BB%B6/



本篇博客主要讲述,如何在thinkPHP中使用PHPExcel中导出Excel文件,是博主在实践了好多篇别人的帖子之后,总结归纳出来的文章,亲测可用。

准备工作

下载、配置PHPExcel扩展插件

  1. 去PHPExcel的官网或者github去下载最新PHPExcel放到ThinkPHP/Library/Vendor目录下,Vendor目录是放置PHP扩展包的默认文件夹,在Vendor目录下建立PHPExcel文件夹,将下载的文件,解压到此处。

  2. PHPExcel.php文件,重命名成PHPExcel.class.php

    至此,插件安装已经做好,目录结构如下图,接下来做功能部分。

    Markdown

创建Excel方法

生成Excel文件方法

     
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
     
/**
* 数据导出为.xls格式
* @param string $fileName 导出的文件名
* @param $expCellName array -> 数据库字段以及字段的注释
* @param $expTableData Model -> 连接的数据库
*/
public function exportExcel($fileName='table',$expCellName,$expTableData){
$xlsTitle = iconv('utf-8', 'gb2312', $fileName);//文件名称
$xlsName = $fileName.date("_Y.m.d_H.i.s"); //or $xlsTitle 文件名称可根据自己情况设定
$cellNum = count($expCellName);
$dataNum = count($expTableData);
import("Vendor.PHPExcel.PHPExcel");
import("Vendor.PHPExcel.Writer.Excel5");
import("Vendor.PHPExcel.IOFactory.php");
$objPHPExcel = new \PHPExcel();
$cellName = array('A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','AA','AB','AC','AD','AE','AF','AG','AH','AI','AJ','AK','AL','AM','AN','AO','AP','AQ','AR','AS','AT','AU','AV','AW','AX','AY','AZ');
$objPHPExcel->getActiveSheet(0)->mergeCells('A1:'.$cellName[$cellNum-1].'1');//合并单元格
$objPHPExcel->setActiveSheetIndex(0)->setCellValue('A1', $fileName.' Export time:'.date('Y-m-d H:i:s'));
for($i=0;$i<$cellNum;$i++){
$objPHPExcel->setActiveSheetIndex(0)->setCellValue($cellName[$i].'2', $expCellName[$i][1]);
}
// Miscellaneous glyphs, UTF-8
for($i=0;$i<$dataNum;$i++){
for($j=0;$j<$cellNum;$j++){
$objPHPExcel->getActiveSheet(0)->setCellValue($cellName[$j].($i+3), $expTableData[$i][$expCellName[$j][0]]);
}
}
header('pragma:public');
header('Content-type:application/vnd.ms-excel;charset=utf-8;name="'.$xlsTitle.'.xls"');
header("Content-Disposition:attachment;filename=$xlsName.xls");//attachment新窗口打印inline本窗口打印
$objWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
$objWriter->save('php://output');
exit;
}

方法生成说明

  1. 第9行的

    $xlsName = $fileName.date("_Y.m.d_H.i.s"); //or $xlsTitle 文件名称可根据自己情况设定

    是设置文件名,上面所写是文件名_Y.m.d_H.i.s_Y.m.d_H.i.s即是导出的时间,因为windows下,文件名中不能含有:,所以即便写成_Y.m.d_H:i:s,导出的文件也是_Y.m.d_H.i.s这种样式。

  2. 第13行~15行的

           
    1
    2
    3
           
    import("Vendor.PHPExcel.PHPExcel");
    import("Vendor.PHPExcel.Writer.Excel5");
    import("Vendor.PHPExcel.IOFactory.php");

    这三行即是引入PHPExcel,因为当时的文件目录结构是ThinkPHP/Library/Vendor/PHPExcel,所以import("Vendor.PHPExcel.PHPExcel");,注意目录结构,只要引入的位置和放置PHPExcel的目录相同即可;

  3. 第20、21行的

           
    1
    2
           
    $objPHPExcel->getActiveSheet(0)->mergeCells('A1:'.$cellName[$cellNum-1].'1');//合并单元格
    $objPHPExcel->setActiveSheetIndex(0)->setCellValue('A1', $fileName.' Export time:'.date('Y-m-d H:i:s'));

    此作用是,在Excel文件的第一行合并一行单元格,用作表格的标题或简介。如下图所示:

    Markdown

    setCellValue('A1', $fileName.' Export time:'.date('Y-m-d H:i:s'));值可以根据自己需求修改;

  4. 第34行的
    header("Content-Disposition:attachment;filename=$xlsName.xls");//attachment新窗口打印inline本窗口打印

    可以设置输出的文件格式,此处写的是.xls,可修改成.xlsx

  5. 此方法调用时需要传入三个参数(在方法开头的注释中已经说了),这里再具体说明一下:

           
    1
    2
    3
           
    $fileName 导出的文件的文件名
    $expCellName 数据库字段以及字段的注释(数组)
    $expTableData 连接的数据库

方法调用

调用方法

     
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
     
/**导出**/
public function msgOut(){
$excel = A('Excel');
$xlsCell = array(
array('id', 'ID'),
array('staff_name', '昵称'),
array('staff_real', '真实姓名'),
array('mobile', '手机号'),
array('card_id', '身份证号'),
array('referee', '推荐人'),
array('game_id', '游戏ID'),
array('money', '余额'),
array('consume_coin', '消费币'),
array('create_time', '注册时间'),
array('status', '状态'),
);
$xlsName = 'Staff表搜索结果导出';
$field = null;
foreach ($xlsCell as $key => $value) {
if($key == 0){
$field = $value[0];
}else{
$field .= "," . $value[0];
}
}
$xlsModel = M('Staff');
if (IS_POST) {
$map = $this -> _queryTime();
$staff_name = I('staff_name');
if($staff_name) {
if (is_numeric($staff_name)) {
$map["id|staff_name"] = array(intval($staff_name), array('like', '%' . $staff_name . '%'), '_multi' => true);
} else {
$map['staff_name'] = array('like', '%' . (string)$staff_name . '%');
}
}
$xlsData = $xlsModel->Field($field)->where($map)->order('id DESC')->select();
}
foreach ($xlsData as $k => $v) {
$xlsData[$k]['create_time'] = $v['create_time'] == null ? '-' : date("Y-m-d H:i",$v['create_time']);
$xlsData[$k]['status'] = $v['status'] == 1 ? '正常' : '禁用';
}
$excel->exportExcel($xlsName,$xlsCell,$xlsData);
}

调用说明

  1. 第3行
    $excel = A('Excel');
    这个方法我写在了Application/Admin/Controller/ExcelController.class.php中,当前用的控制器是MainController.class.php,调用其他控制器中的方法,用TP中自带的A(),所以第51行,用的是$excel->exportExcel($xlsName,$xlsCell,$xlsData);,如果你的exportExcel()方法和当前调用的方法在同一个控制器内,那么第三行可以不写,第51行改成$this->exportExcel($xlsName,$xlsCell,$xlsData);

  2. 第4行
    $xlsCell是导出这张表中所有的字段,以及字段的注释,导出后,不能把字段作为表格的列名,不知道数据库字段是什么意思的用户,看了这张表也不知所以然。

  3. 第17~24行
    是根据$xlsCell数组中,提取出来字段名,作为一个字符串,在查询时使用。当然也可以把这个字段名的字符串手写出来,我这里用的是foreach处理。

  4. 第27~38行
    是查询条件和查询结果,如果没有查询条件,想把整张表导出的话,直接用$xlsData = $xlsModel->Field($field)->order('id DESC')->select();即可。

  5. 第47~50行
    是对$xlsData结果进行处理,我写的两个意思是:
    1、当create_time字段为空的时候,值为 - ,有值的时候,就用date()函数把时间戳处理成日期;
    2、当status字段的值为1的时候,显示为正常,当值为0的时候禁用

有点罗嗦了,见谅。

模板文件

模板文件很简单,就一个提交。

     
1
2
3
4
5
6
7
8
9
10
     
<form action="{:U('Main/msgOut')}" method="post" class="form-horizontal">
<div class="search-form fr cf">
<div class="sleft">
<input type="text" class="search-input" onClick="WdatePicker()" name="start_time" style="cursor: pointer;" value="{:I('start_time')}" id="start" placeholder="开始日期" />
<input type="text" class="search-input" onClick="WdatePicker()" name="end_time" style="cursor: pointer;" value="{:I('end_time')}" id="end" placeholder="结束日期" />
<input type="text" name="staff_name" class="search-input" value="{:I('staff_name')}" id="name" placeholder="输入推广专员的昵称或者ID">
<button type="submit" class="btn" id="out">导出</button>
</div>
</div>
</form>

form表单中三个input,是搜索条件,如果没有的话,直接写button即可。

文章结束,欢迎转载。




这篇关于ThinkPHP用PHPExcle导出Excel文件的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/271997

相关文章

C#关闭指定时间段的Excel进程的方法

private DateTime beforeTime;            //Excel启动之前时间          private DateTime afterTime;               //Excel启动之后时间          //举例          beforeTime = DateTime.Now;          Excel.Applicat

MySQL使用mysqldump导出数据

mysql mysqldump只导出表结构或只导出数据的实现方法 备份数据库: #mysqldump 数据库名 >数据库备份名 #mysqldump -A -u用户名 -p密码 数据库名>数据库备份名 #mysqldump -d -A --add-drop-table -uroot -p >xxx.sql 1.导出结构不导出数据 mysqldump --opt -d 数据库名 -u

一步一步将PlantUML类图导出为自定义格式的XMI文件

一步一步将PlantUML类图导出为自定义格式的XMI文件 说明: 首次发表日期:2024-09-08PlantUML官网: https://plantuml.com/zh/PlantUML命令行文档: https://plantuml.com/zh/command-line#6a26f548831e6a8cPlantUML XMI文档: https://plantuml.com/zh/xmi

excel翻译软件有哪些?如何高效提翻译?

你是否曾在面对满屏的英文Excel表格时感到头疼?项目报告、数据分析、财务报表... 当这些重要的信息被语言壁垒阻挡时,效率和理解度都会大打折扣。别担心,只需3分钟,我将带你轻松解锁excel翻译成中文的秘籍。 无论是职场新人还是老手,这一技巧都将是你的得力助手,让你在信息的海洋中畅游无阻。 方法一:使用同声传译王软件 同声传译王是一款专业的翻译软件,它支持多种语言翻译,可以excel

终于解决了excel操作及cspreadsheet.h问题

困扰多日的excel操作问题终于解决:利用cspreadsheet.h!在vs2005下,不能直接应用cspreadsheet.h,所以必须解决些问题先。 首先, 出现暴多错误。解决UNICODE问题,全部添加L。 [1] +++++++++++++++++++ 其次, 出现问题: error   C2664:   &apos;SQLGetInstalledDriversW &apos;

关于使用cspreadsheet读写EXCEL表格数据的问题

前几天项目有读写EXCEL表格的需求,我就找了大概有几种,大致分为:COM方法、ODBC方法、OLE方法、纯底层格式分析方法。由于COM方法要求必须安装有OFFICE的EXCEL组件,纯底层格式分析方法又很多功能需要自行去完善,所有最终选择了数据库的方法,用数据库的方法去存取xls格式的数据。网上有一个高手写的CSpreedSheet,看了一下提供的接口,感觉挺好用的。在使用的过程中发现几个

Excel和Word日常使用记录:

Excel使用总结 表格颜色填充: 合并单元格: 选中你要合并的单元格区域。按下快捷键 Alt + H,然后松开这些键。再按下 M,接着按 C。这个组合键执行的操作是:Alt + H:打开“主页”选项卡。M:选择“合并单元格”选项。C:执行“合并并居中”操作。 插入行: 在Excel中,插入一行的快捷键是:Windows:选择整行(可以点击行号)。按下 Ctrl + Sh

SpringBoot中利用EasyExcel+aop实现一个通用Excel导出功能

一、结果展示 主要功能:可以根据前端传递的参数,导出指定列、指定行 1.1 案例一 前端页面 传递参数 {"excelName": "导出用户信息1725738666946","sheetName": "导出用户信息","fieldList": [{"fieldName": "userId","fieldDesc": "用户id"},{"fieldName": "age","fieldDe

如何在Excel中根据单元格内容作MSnbsp;…

上篇文章,我们介绍了INDEX+SMALL+IF+ROW的数组公式组合,也就是说只要在IF中通过条件的构造,基本上就可以想提取什么条件的数据都可以,数据查询肯定得心应手。 但是,我们一起强调函数公式不是万能的,尤其是数组公式在海量数据面前,既是软肋也是硬伤,而且构造这个函数组合还需要你要具备或者能理解简单数组公式逻辑,对于在函数公式方面没有深究的人,自然是一头雾水。当然,就像“数据透视表”一样,

Unity数据持久化 之 一个通过2进制读取Excel并存储的轮子(4)

本文仅作笔记学习和分享,不用做任何商业用途 本文包括但不限于unity官方手册,unity唐老狮等教程知识,如有不足还请斧正​​ Unity数据持久化 之 一个通过2进制读取Excel并存储的轮子(3)-CSDN博客  这节就是真正的存储数据了   理清一下思路: 1.存储路径并检查 //2进制文件类存储private static string Data_Binary_Pa