ThinkPHP中用PHPExcel导出excel文件数据例子
1.准备:自己制作一个生成的excel参考的模板文件,template.xls,我的模板为
2.大家要注意一点,我要输出的数据是从第4行开始填充的,但是最好留出一行空的,比如说第5行,并不仅仅为了查出来的数据和统计总数分开好看,也是为了方便在模板里面设置函数,比如说上面的D6,用了SUM(D4:D5)函数,我是想统计D这一列的数据,但是在D6函数不能仅仅是=SUM(D4)吧,等生成数据的时候就到达不了效果,查出来的数据就是统计D4这个了,所以记得留出一行
2.下载PHPExcel文件,网上一百度就出来了,下载下来解压后目录结构如下:(附件中也提供有下载,附件中的PHPExcel是经过我的压缩,把多余的东西删除了的)
结构目录的说明,
1.下载下来的文件夹有3个文件夹和3个txt的说明文档(说明文档就不说了):
require './include/phpexcel/Classes/PHPExcel.php';这样加载,只能是用Vendor()加载第三方类库方式加进去。(这个很重要,我之前一直不成功原因就是在这里)
5.我的项目目录如下:
6.在IndexAction中的index()内写如下方法
代码如下 | 复制代码 |
class IndexAction extends Action { /**导出的excel表格 */ function index() { //将需要导出到excel的数据查询出来 $mdata = M ( 'a' ); $data = $mdata->select (); //开始生成excel内容 /** 加载IOFactory包 */ Vendor ( 'Excel.Classes.PHPExcel' ); //Vendor路径的写法参考ThinkPHP文档 /** 错误信息 */ error_reporting ( E_ALL ); $objReader = PHPExcel_IOFactory::createReader ( 'Excel5' ); //在内存中建一个excel2003操作 //加载需要读取的模板放在内存的excel中,路径一定要对啊,我在index.php中用了define(ROOT, dirname(__FILE__));所以下面这样写 $objPHPExcel = $objReader->load ( ROOT . "/Pulice/template/template.xls" ); //设置excel格式 //$objPHPExcel->getActiveSheet ()->setCellValue ( 'B1', '统计表' ); //在B位置显示标题,可以动态添加,这个例子中我是在母版中写死了的 $objPHPExcel->getActiveSheet ()->setCellValue ( 'E1', date ( 'Y-m-d H:i:s', time () ) ); //在E位置显示时间 /**将数据用循环放进表格相对应位置S*/ $baseRow = 5; //数据从5-1行开始往下输出,具体数据看你的模板了 foreach ( $data as $r => $dataRow ) { $row = $baseRow + $r; $objPHPExcel->getActiveSheet ()->insertNewRowBefore ( $row, 1 ); //插入新的行 //将数据填充到相对应的位置 $objPHPExcel->getActiveSheet ()->setCellValue ( 'A' . $row, $r + 1 ); //序号 $objPHPExcel->getActiveSheet ()->setCellValue ( 'B' . $row, $dataRow ['codenum'] ); //编号 $objPHPExcel->getActiveSheet ()->setCellValue ( 'C' . $row, $dataRow ['name'] ); //物品名称 $objPHPExcel->getActiveSheet ()->setCellValue ( 'D' . $row, $dataRow ['price'] ); //单价 $objPHPExcel->getActiveSheet ()->setCellValue ( 'E' . $row, $dataRow ['quantity'] ); //数量 } $objPHPExcel->getActiveSheet ()->removeRow ( $baseRow - 1, 1 ); //作用:把最顶上面的那一空白行去掉 //---------上面的代码是从30template.php(加载模板)中copy下来自己改成我想要———————————————— // ----------下面的代码是从01simple-download-xls.php(下载excel表格)中copy下来的------- //将得到的数据导出到excel中提供给用户下载 // 将输出重新定向到客户端浏览器的(Excel5) $filename = date ( 'Y-m-d', time () ); header ( 'Content-Type: application/vnd.ms-excel' ); header ( 'Content-Disposition: attachment;filename="' . $filename . '.xls"' ); //要下载的excel文件的文件名,这设置了用当前时间作为文件名 header ( 'Cache-Control: max-age=0' ); $objWriter = PHPExcel_IOFactory::createWriter ( $objPHPExcel, 'Excel5' ); //在内存中准备一个excel2003文件 $objWriter->save ( 'php://output' ); exit (); } } |
7.在模板页调用上面的方法就可以了,比如<a href="{:U('Index/outexcel')}">导出excel</a>
当然啦,想根据条件来导出内容就看你怎么查数据库咯。
写最后:当然啦,我是做好了才截图上来的,所以还没有完善,还要处理一下问题滴,比如说乱码 啊(看你下载下来的有没有乱码咯)。
错误
Connection failed: SQLSTATE[HY000] [2002] No such file or directory
环境概述:
MacOS
xampp 搭建的开发环境 apache mysql php
xampp 已支持mysql oracle 测试ok,且 phpinfo已上显示支持pdo_mysql pdo_pgsql pdo_sqlite
其中mysql我用的是brew包管理安装到机器里面的,而非xampp自带的mysql
php pdo 连接报错 Connection failed: SQLSTATE[HY000] [2002] No such file or directory
开始以为找不到文件是因为 url rewrite导致的,(因为从nginx切换到apache)结果跟踪程序发现是 new pdo 报错
经过搜索一些资料研究发现:
这个是php.ini配置文件中pdo_mysql.default_socket指定的mysql.sock路径不对
我的mysql.sock文件在 /private/tmp/mysql.sock
所以要设置:
pdo_mysql.default_socket=/private/tmp/mysql.sock
如果不知道自己的mysql.sock在哪里可以搜索(因为编译安装,和yum、apt-get、或者brew等包管理工具安装的位置不一样)
sudo find / -name ‘mysql.sock’
下面是官方给出bug修复
1. Open up php.ini (mine was in /private/etc/)
2. locate this line: pdo_mysql.default_socket=/var/mysql/mysql.sock
3. Change the line to: pdo_mysql.default_socket=/tmp/mysql.sock
4. Restart apache
1、我这里需要补充下,如果是新系统或者刚玩php的同志,在Mac的系统中php.ini 文件不存在,
2、需要在/private/etc/目录下cp php.ini.default
php.ini ,然后再做修改下,
3、但是如果使用的xampp mysql作为数据库,那么就不需要使用官方的step2,直接写下面方式就可以了。
pdo_mysql.default_socket=/Applications/XAMPP/xamppfiles/var/mysql/mysql.sock
解决方法三
sudo vim /etc/php.ini
把以下三个原来空白的值都设置为 /tmp/mysql.sock
mysql.default_socket = /tmp/mysql.sock
pdo_mysql.default_socket= /tmp/mysql.sock
mysqli.default_socket =/tmp/mysql.sock
都修改了
修改完成后使用
sudo /usr/sbin/apachectl restart
phpexcel可以让开发者方便快捷的来操作xls文件了,我们下文来整理几个关于phpexcel对数据导入与导出例子。
PHPExcel读取excel文件
实例代码:
代码如下 | 复制代码 |
require_once('include/common.inc.php'); require_once(ROOTPATH . 'include/phpExcel/PHPExcel/IOFactory.php'); $filePath = './file/xls/110713.xls'; $fileType = PHPExcel_IOFactory::identify($filePath); //文件名自动判断文件类型 $objReader = PHPExcel_IOFactory::createReader($fileType); $objPHPExcel = $objReader->load($filePath); $currentSheet = $objPHPExcel->getSheet(0); //第一个工作簿 $allRow = $currentSheet->getHighestRow(); //行数 $output = array(); $preType = ''; $qh = $currentSheet->getCell('A4')->getValue(); //按照文件格式从第7行开始循环读取数据 for($currentRow = 7;$currentRow<=$allRow;$currentRow++){ //判断每一行的B列是否为有效的序号,如果为空或者小于之前的序号则结束 $xh = (int)$currentSheet->getCell('B'.$currentRow)->getValue(); if(empty($xh))break; $tmpType = (string)$currentSheet->getCell('C'.$currentRow)->getValue(); //赛事类型 if(!empty($tmpType))$preType = $tmpType; $output[$xh]['type'] = $preType; $output[$xh]['master'] = $currentSheet->getCell('F'.$currentRow)->getValue(); //主队 $output[$xh]['guest'] = $currentSheet->getCell('H'.$currentRow)->getValue(); //客队 } //从当前行开始往下循环,取出第一个不为空的行 for( ; ; $currentRow++){ $xh = (int)$currentSheet->getCell('B'.$currentRow)->getValue(); if(!empty($xh))break; } for( ; $currentRow <= $allRow; $currentRow++){ $xh = (int)$currentSheet->getCell('B'.$currentRow)->getValue(); if(empty($xh))break; $output[$xh]['rq'] = $currentSheet->getCell('I'.$currentRow)->getValue(); } header("content-type:text/html; charset=utf-8"); echo '期号:' . $qh . "\n\n"; if(!empty($output)){ printf("%-5s\t%-15s\t%-40s\t%-40s\t%-5s\n", '序号', '赛事类型', '主队', '客队', '让球值'); foreach($output as $key => $row){ $format = "%-5d\t%-15s\t%-40s\t%-40s\t%-5s\n"; printf($format, $key, $row['type'], $row['master'], $row['guest'], $row['rq']); } } ?> |
phpexcel导出excel数据
在服务器端生成静态文件
相比直接生成,这两种方法的主要区别是生成格式的不同,模板文件完全相同,下边是一个在上例基础上更改后的样子,注意与上例的区别。
代码如下 | 复制代码 |
<?php // 生成excel的基本类定义(注意文件名的大小写) // 创建phpexcel对象,此对象包含输出的内容及格式 // 模板文件,为了实现格式与内容分离,有关输出文件具体内容实现在模板文件中 // 输出文件的类型,excel或pdf $m_strOutputExcelFileName = date('Y-m-j_H_i_s').".xls"; // 输出EXCEL文件名 // 输出文件保存路径,此路径必须可写 // 如果需要输出EXCEL格式 // 如果需要输出PDF格式 |
1.下载扩展
(1)去官方下载一个SQL Server Driver for PHP的扩展包,我是在这里下载的http://www.microsoft.com/en-us/download/details.aspx?id=20098【记得下载后好像是要先安装然后再解压】
(2)您也可以直接从本站下载(我之前下载的,来源于microsoft官方)【 点击直接下载 】
将下载下来的rar文件解压后你就会得到一堆的.dll文件
下载驱动程序,下载后安装释放程序,里面有以下文件:
php_pdo_sqlsrv_52_nts.dll
php_pdo_sqlsrv_52_ts.dll
php_pdo_sqlsrv_53_nts_vc6.dll
php_pdo_sqlsrv_53_nts_vc9.dll
php_pdo_sqlsrv_53_ts_vc6.dll
php_pdo_sqlsrv_53_ts_vc9.dll
php_sqlsrv_52_nts.dll
php_sqlsrv_52_ts.dll
php_sqlsrv_53_nts_vc6.dll
php_sqlsrv_53_nts_vc9.dll
php_sqlsrv_53_ts_vc6.dll
php_sqlsrv_53_ts_vc9.dll
SQLServerDriverForPHP.chm(手册,英文够好的话,可以看看,嘿嘿)
SQLServerDriverForPHP_License.rtf
SQLServerDriverForPHP_Readme.htm(自述文件)
2.添加扩展
根据(vc6/vc9)需要选择扩展,我的环境是WAMP(php5.2.6/apache2.2.8),我选用的是php_sqlsrv_52_ts_vc6.dll,php_pdo_sqlsrv_52_ts_vc6.dll这两个文件,复制到wamp安装目录下的ext目录下,我的ext目录是在wamp/bin/php/php5.2.6/ext/
3.配置php.ini
(1)在php.ini的Dynamic Extensions中添加如下两条扩展:
extension=php_sqlsrv_52_ts_vc6.dll
extension=php_pdo_sqlsrv_52_ts_vc6.dll
(2)将;extension=php_pdo.dll前面的;去掉,开启pdo连接扩展
(3)重新启动apache
4.连接数据库(pdo连接)
代码如下 | 复制代码 |
<?php |
5.例子
链接示例:
mssql_lib.php
代码如下 | 复制代码 |
<?php
function query($sql){ function getRow($sql){ function getAll($sql){ function __destruct() { } //简单调用 |
一般来说,如果并发量不大的情况,使不使用缓存技术并没有什么影响,但如果高并发的情况,使用缓存技术就显得很重要了,可以很好的减轻数据库和服务器的压力,当然解决高并发的技术有很多,这里只是以缓存的角度来说明使用memcache的便捷性和方便性,缓存技术中,与memcache类似的还有redis,这里不做介绍!
使用memcache的前提是需要在服务端先配置好memcahche的环境!确认memcahce可以正常连接之后就可以在程序使用了!
具体代码如下:
代码如下 | 复制代码 |
<?php |
相关文章
- 安装curl扩展支持https是非常的重要现在许多的网站都使用了https了,下面我们来看一篇关于PHP安装curl扩展支持https例子吧。 问题: 线上运行的lamp服务器,默认yu...2016-11-25
- floor会产生小数了如果我们不希望有小数我们是可以去除小数点的了,下面一聚教程小编来为各位介绍php使用floor去掉小数点的例子,希望对各位有帮助。 float floor (...2016-11-25
ThinkPHP使用心得分享-ThinkPHP + Ajax 实现2级联动下拉菜单
首先是数据库的设计。分类表叫cate.我做的是分类数据的二级联动,数据需要的字段有:id,name(中文名),pid(父id). 父id的设置: 若数据没有上一级,则父id为0,若有上级,则父id为上一级的id。数据库有内容后,就可以开始写代码,进...2014-05-31- 这篇文章主要介绍了thinkPHP中多维数组的遍历方法,以简单实例形式分析了thinkPHP中foreach语句的使用技巧,需要的朋友可以参考下...2016-01-12
- 下面小编就为大家带来一篇thinkphp自定义权限管理之名称判断方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2017-04-03
- 下面我们来看一篇关于纯Css实现下拉菜单的简单例子,希望这篇文章能够给各位同学带来帮助,具体步骤如下. 大家可能会经常用到hover这属性,用hover实现鼠标经过的颜...2017-01-22
- 本文详细介绍了ThinkPHP使用方法,不懂的同学快来跟小编一起看看吧 1、下载ThinkPHP模板,整个导入到项目根目录下。2、修改index.php文件,内容如下:<?php/***临时配置,...2017-07-06
phpexcel导入xlsx文件报错xlsx is not recognised as an OLE file 怎么办
phpexcel是一款php读写excel的插件了,小编有一个这样的功能要来实现,但是在导入xlsx时发现xlsx is not recognised as an OLE file 了,但是导入xls是没有问题了,碰到这种...2016-11-25thinkphp3.x连接mysql数据库的方法(具体操作步骤)
这篇文章主要介绍了thinkphp3.x连接mysql数据库的方法,详细分析了thinkPHP3.x操作数据库的具体步骤,包括惯例配置文件设置,sql语句创建表以及针对数据库的数据插入操作等,需要的朋友可以参考下...2016-05-20- 在php中日期对比用得比较多了,还有一个日期加减也用到不少,下面我拿两个例子来给大家介绍在php中日期操作方法吧,希望文章能给你带来帮助 功能需求 文章发布时段操...2016-11-25
- 本例子不是读取Excel或生成新的Excel,而是读取现有的Excel文件,然后修改Excel中的数据,就像修改mysql中数据一样的哦。 代码如下 ...2016-11-25
- 这篇文章主要介绍了ThinkPHP 3.2.2实现事务操作的方法,简单分析了thinkPHP中事务的启动、提交、回滚等操作方法并给出了完整的事务提交与回滚操作实例,需要的朋友可以参考下...2017-05-08
- PHPExcel是php的一个插件,它可以实现读取excel文件也就是xls文件了,下面我们就来看一个PHPExcel操作excel(xls)文件例子,希望能帮助到各位。 读取中文的xls、csv文件...2016-11-25
- 正则提取图片中的地址我们介绍过很多的相关文章了,下面再来给各位介绍一个可以提取内容中第一张图片的例子,希望对各位有帮助。 代码如下 复制代码 ...2016-11-25
- 最近看到博客留言的头像有点别扭,因为游客的头像都是同一个头像,看着不是很舒服。虽然现在绝大多数的主题集成了Gavatar头像功能,先不说gavatar被墙的问题,我自己现在都没...2016-11-25
ThinkPhP+Apache+PHPstorm整合框架流程图解
这篇文章主要介绍了ThinkPhP+Apache+PHPstorm整合框架流程图解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-11-23- 这篇文章主要介绍了thinkPHP查询方式,结合实例形式总结分析了thinkPHP的普通查询、表达式查询、区间查询、统计查询及SQL直接查询的使用技巧,需要的朋友可以参考下...2016-01-12
- php判断字符串是否包含另一个字符串的实现方法有许多的办法,像我们在网上一搜索可看到大量关于字符是否包含指定字符的方法,下面我把这些实用的例子整理一起与大家分享...2016-11-25
thinkPHP5.0框架整体架构总览【应用,模块,MVC,驱动,行为,命名空间等】
这篇文章主要介绍了thinkPHP5.0框架整体架构,简单介绍了thinkPHP5.0的应用,模块,MVC,驱动,行为,命名空间等概念与基本用法,需要的朋友可以参考下...2017-04-03- date函数是php中一个非常好用的日期获取函数了,我们可以使用它来获取指定日期或者当前日期了,下面我来简单的介绍一下date函数用法与常用用法吧。 PHP星期几获取代...2016-11-25