ThinkPHP中用PHPExcel导出excel文件数据例子

 更新时间:2016年11月25日 16:34  点击:1774
PHPExcel导出excel对于这个插件来讲是非常的简单了,但在thinkphp中并不那么简单了,有不少的朋友不知道如何操作,下面小编就为大家介绍ThinkPHP中用PHPExcel导出excel文件的过程。
下面给出步骤:

1.准备:自己制作一个生成的excel参考的模板文件,template.xls,我的模板为

在这个模板里面,你想在哪个位置显示什么样式就设置什么样式,到时候相对应位置 查出来的数据就会自动套用样式,比如说标题大小,背景颜色,用函数等,都会自动套用,就不用在后台代码控制那么麻烦了,这个也是选择用模板生成excel原因。
附:
1.某列用条件格式等高级一点的操作应该也是可以的,没有试。

2.大家要注意一点,我要输出的数据是从第4行开始填充的,但是最好留出一行空的,比如说第5行,并不仅仅为了查出来的数据和统计总数分开好看,也是为了方便在模板里面设置函数,比如说上面的D6,用了SUM(D4:D5)函数,我是想统计D这一列的数据,但是在D6函数不能仅仅是=SUM(D4)吧,等生成数据的时候就到达不了效果,查出来的数据就是统计D4这个了,所以记得留出一行

2.下载PHPExcel文件,网上一百度就出来了,下载下来解压后目录结构如下:(附件中也提供有下载,附件中的PHPExcel是经过我的压缩,把多余的东西删除了的)

psb (3)

结构目录的说明,

1.下载下来的文件夹有3个文件夹和3个txt的说明文档(说明文档就不说了):

Classes文件夹:这个文件夹是PHPExcel的主要包,也就是说只要把这个文件夹拷贝到项目,引用就可以了。这个文件夹下面有PHPExcel.php文件和PHPExcel文件夹,引用的时候用PHPEx.php就可以了。
Documentation文件夹:说明文档,略过。
Tests文件夹:这个文件夹虽然不用导入到项目,但是里面满满的都是例子啊,都是给我们用的。我测试用的就是里面01simple-download-xls.php和30template.php这两个例子的代码结合在一起,分别是下载xls和加载模板的。
3.新建一个项目,导入ThinkPHP,配置好index.php,配置文件,在Public文件夹下面放我们的excel.模板文件。特别的,在ThinkPHP下面的Extend文件夹下新建文件夹Vendor,把PHPExcel复制到其根目录下。因为ThinkPHP中用PHPExcel不能通过

require  './include/phpexcel/Classes/PHPExcel.php';这样加载,只能是用Vendor()加载第三方类库方式加进去。(这个很重要,我之前一直不成功原因就是在这里)

psb (2)

5.我的项目目录如下:

psb (3)psb (4)

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>

当然啦,想根据条件来导出内容就看你怎么查数据库咯。


写最后:当然啦,我是做好了才截图上来的,所以还没有完善,还要处理一下问题滴,比如说乱码 啊(看你下载下来的有没有乱码咯)。

下面我们来看看php pdo_mysql连接报错Connection failed: SQLSTATE[HY000] [2002] No such file or directory问题的解决办法。

错误

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 
// 包含class的基本头文件
include("./class/class.php");

// 生成excel的基本类定义(注意文件名的大小写)
include("./class/phpexcel/PHPExcel.php");
// 包含写Excel5格式的文件,如果需要生成excel2007的文件,包含对应的Writer即可
include("./class/phpexcel/PHPExcel/Writer/Excel5.php");
// 包含写PDF格式文件
include("./class/phpexcel/PHPExcel/Writer/PDF.php");

// 创建phpexcel对象,此对象包含输出的内容及格式
$m_objPHPExcel = new PHPExcel();

// 模板文件,为了实现格式与内容分离,有关输出文件具体内容实现在模板文件中
// 模板文件将对象$m_objPHPExcel进行操作
include("./include/excel.php");

// 输出文件的类型,excel或pdf
$m_exportType = "pdf";

$m_strOutputExcelFileName = date('Y-m-j_H_i_s').".xls"; // 输出EXCEL文件名
$m_strOutputPdfFileName = date('Y-m-j_H_i_s').".pdf"; // 输出PDF文件名

// 输出文件保存路径,此路径必须可写
$m_strOutputPath = "./output/";

// 如果需要输出EXCEL格式
if($m_exportType=="excel"){
$objWriter = new PHPExcel_Writer_Excel5($m_objPHPExcel);
$objWriter->save($m_strOutputPath.$m_strOutputExcelFileName); 
}

// 如果需要输出PDF格式
if($m_exportType=="pdf"){
$objWriter = new PHPExcel_Writer_PDF($m_objPHPExcel);
$objWriter->save($m_strOutputPath.$m_strOutputPdfFileName); 
}
?>

PHP连接MSSQL2008/2005数据库与以往的连接mssql2000是不一样的,连接mssql2008/2005是需要自己添加PHP对MSSQL连接的驱动扩展了,而我们常用的hp.ini中的extension=php_mssql.dll扩展只适用连接于MSSQL2000哦,下面我们就来看看解决办法

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
  $servern="SFKFK27EL8FJ\SQLTRY";
  $coninfo=array("Database"=>"try2","UID"=>"sa","PWD"=>"123");
  $conn=sqlsrv_connect($servern,$coninfo) or die ("连接失败!");
  $val=sqlsrv_query($conn,"select * from usertable");
  while($row=sqlsrv_fetch_array($val)){
    echo $row[1]."<br />";
  }
  sqlsrv_close($conn);
?>

5.例子

链接示例:

mssql_lib.php

 代码如下 复制代码

<?php


class DB {
    var $con = null;
    function __construct($dbhost,$dbuser,$dbpass,$dbname) {
        $connectionInfo =  array("UID"=>$dbuser,"PWD"=>$dbpass,"Database"=>$dbname);
        $this->con = sqlsrv_connect($dbhost,$connectionInfo);
    }

    function query($sql){
        $result = sqlsrv_query($this->con, $sql);
    }

    function getRow($sql){
        $result = sqlsrv_query($this->con, $sql);
        $arr = array();
        while($row = sqlsrv_fetch_array($result))
        {
            $arr[] = $row;
        }
        return $arr[0];
    }

    function getAll($sql){
        $result = sqlsrv_query($this->con, $sql);
        $arr = array();
        while($row = sqlsrv_fetch_array($result))
        {
            $arr[] = $row;
        }
        return $arr;
    }

    function __destruct() {
        unset($con);
    }

}
test.php

//简单调用
$db = new DB(DB_HOST, DB_USER, DB_PASS, DB_NAME);
$sql = "select * from crm_order_batch where (status=0 or status is null) and lock_id is not null  ";
$orders_add_list = $db->getAll($sql);

memcache是一个分布式的数据处理插件,我们可以利用它来提高服务器性能,特别是对数据库的操作用了memcache它之后会有非常大的提升哦,下面我来给各位介绍一个php memcache使用例子。

一般来说,如果并发量不大的情况,使不使用缓存技术并没有什么影响,但如果高并发的情况,使用缓存技术就显得很重要了,可以很好的减轻数据库和服务器的压力,当然解决高并发的技术有很多,这里只是以缓存的角度来说明使用memcache的便捷性和方便性,缓存技术中,与memcache类似的还有redis,这里不做介绍!

使用memcache的前提是需要在服务端先配置好memcahche的环境!确认memcahce可以正常连接之后就可以在程序使用了!

具体代码如下:

 代码如下 复制代码

<?php
header("content-type:text/html;charset:utf-8");
include "../inc/str.php";
include "../Inc/mysql.php";
include "../Inc/const.php";  
if($is_memcache){    
    // $memcache操作    
    $memcache = new Memcache;    
    try{        
        $memc=@$memcache->connect($memcache_server, $memcache_port);    
        if($memc){
            $getMsg=$memcache->get("360GetMsgDate");//获取缓存中的数据
            // $memcache->delete("360GetMsgDate");
            if(!$getMsg){  
                $jsonDate = getMessage($f_serverName,$f_userName,$f_password,$f_htNewsDate);
                $memcache->set("360GetMsgDate",$jsonDate,0,3600); //设置缓存时间为一小时
                echo $jsonDate;
            }
            else{     
                 echo $getMsg;
            }       
            $memcache->close();
        }
        else{
            //code
        }
    }catch(Exception $e){
        print $e->getMessage();
    }
    unset($memcache);
    //结束$memcache操作
}else{
  echo  getMessage($f_serverName,$f_userName,$f_password,$f_htNewsDate);
}

[!--infotagslink--]

相关文章

  • Linux下PHP安装curl扩展支持https例子

    安装curl扩展支持https是非常的重要现在许多的网站都使用了https了,下面我们来看一篇关于PHP安装curl扩展支持https例子吧。 问题: 线上运行的lamp服务器,默认yu...2016-11-25
  • php使用floor去掉小数点的例子

    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中多维数组的遍历方法,以简单实例形式分析了thinkPHP中foreach语句的使用技巧,需要的朋友可以参考下...2016-01-12
  • thinkphp自定义权限管理之名称判断方法

    下面小编就为大家带来一篇thinkphp自定义权限管理之名称判断方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2017-04-03
  • 纯Css实现下拉菜单的简单例子

    下面我们来看一篇关于纯Css实现下拉菜单的简单例子,希望这篇文章能够给各位同学带来帮助,具体步骤如下. 大家可能会经常用到hover这属性,用hover实现鼠标经过的颜...2017-01-22
  • thinkphp怎么用?ThinkPHP使用方法

    本文详细介绍了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-25
  • thinkphp3.x连接mysql数据库的方法(具体操作步骤)

    这篇文章主要介绍了thinkphp3.x连接mysql数据库的方法,详细分析了thinkPHP3.x操作数据库的具体步骤,包括惯例配置文件设置,sql语句创建表以及针对数据库的数据插入操作等,需要的朋友可以参考下...2016-05-20
  • php时间日期对比与日期加减例子

    在php中日期对比用得比较多了,还有一个日期加减也用到不少,下面我拿两个例子来给大家介绍在php中日期操作方法吧,希望文章能给你带来帮助 功能需求 文章发布时段操...2016-11-25
  • php更新修改excel中的内容例子

    本例子不是读取Excel或生成新的Excel,而是读取现有的Excel文件,然后修改Excel中的数据,就像修改mysql中数据一样的哦。 代码如下 ...2016-11-25
  • ThinkPHP 3.2.2实现事务操作的方法

    这篇文章主要介绍了ThinkPHP 3.2.2实现事务操作的方法,简单分析了thinkPHP中事务的启动、提交、回滚等操作方法并给出了完整的事务提交与回滚操作实例,需要的朋友可以参考下...2017-05-08
  • php中使用PHPExcel操作excel(xls)文件

    PHPExcel是php的一个插件,它可以实现读取excel文件也就是xls文件了,下面我们就来看一个PHPExcel操作excel(xls)文件例子,希望能帮助到各位。 读取中文的xls、csv文件...2016-11-25
  • php正则获取文章内容中图片地址例子

    正则提取图片中的地址我们介绍过很多的相关文章了,下面再来给各位介绍一个可以提取内容中第一张图片的例子,希望对各位有帮助。 代码如下 复制代码 ...2016-11-25
  • php获取QQ头像并显示的例子

    最近看到博客留言的头像有点别扭,因为游客的头像都是同一个头像,看着不是很舒服。虽然现在绝大多数的主题集成了Gavatar头像功能,先不说gavatar被墙的问题,我自己现在都没...2016-11-25
  • ThinkPhP+Apache+PHPstorm整合框架流程图解

    这篇文章主要介绍了ThinkPhP+Apache+PHPstorm整合框架流程图解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-11-23
  • thinkPHP查询方式小结

    这篇文章主要介绍了thinkPHP查询方式,结合实例形式总结分析了thinkPHP的普通查询、表达式查询、区间查询、统计查询及SQL直接查询的使用技巧,需要的朋友可以参考下...2016-01-12
  • php判断字符串是否包含另一个字符串例子

    php判断字符串是否包含另一个字符串的实现方法有许多的办法,像我们在网上一搜索可看到大量关于字符是否包含指定字符的方法,下面我把这些实用的例子整理一起与大家分享...2016-11-25
  • thinkPHP5.0框架整体架构总览【应用,模块,MVC,驱动,行为,命名空间等】

    这篇文章主要介绍了thinkPHP5.0框架整体架构,简单介绍了thinkPHP5.0的应用,模块,MVC,驱动,行为,命名空间等概念与基本用法,需要的朋友可以参考下...2017-04-03
  • PHP date函数获取时间几个例子

    date函数是php中一个非常好用的日期获取函数了,我们可以使用它来获取指定日期或者当前日期了,下面我来简单的介绍一下date函数用法与常用用法吧。 PHP星期几获取代...2016-11-25