ThinkPHP Excel导入导出示例

ThinkPHP官方的帖子感觉写的很含糊,还是借鉴了另外一篇博客http://home.51.com/love0221/diary/item/10053281.html,才跑成功了,其中出了一些小问题,也是通过各种百度才得以解决,分享如下:

一、前期准备

  1. 下载PHPExcel包,解压出PHPExcel文件夹和PHPExcel.php文件,放到/ThinkPHP/Extend/Vendor目录下
  2. 可以在ThinkPHP同目录下新建一个Public文件夹,在路径/Public/upfile/Excel下存放上传的excel文件
  3. 在你的数据库中建一张测试用的表,比如:think_kucun,假设有4个field分别为name1, name2, name3, name4。
二、导入

新建一个模版类,用于上传excel文件:

<form method="post" action="__URL__/import" enctype="multipart/form-data">
    <h3>导入Excel表:</h3><input  type="file" name="file_stu" />
    <input type="submit"  value="导入" />
</form>

在Action的.class.php文件中实现导入的函数:

public function import(){ 
    	if (!empty ( $_FILES ['file_stu'] ['name'])){
		    $tmp_file = $_FILES ['file_stu'] ['tmp_name'];
		    $file_types = explode ( ".", $_FILES ['file_stu'] ['name'] );
		    $file_type = $file_types [count ( $file_types ) - 1];

		    /*判别是不是.xls文件,判别是不是excel文件*/
		    if (strtolower($file_type)!="xls" && strtolower($file_type)!="xlsx")              
		    {
		        $this->error ( '不是Excel文件,重新上传' );
		    }

		    /*设置上传路径*/

		   $savePath = './Public/upfile/Excel/';
		   //echo $savePath;

		    /*以时间来命名上传的文件*/
		    $str = date ('Ymdhis'); 
		    $file_name = $str.".".$file_type;

		    /*是否上传成功*/
		    if (!copy ($tmp_file,$savePath.$file_name)) {
		        $this->error ('上传失败');
		    }
			
		    /*读取Excel内容,函数具体实现后文有说明*/
		    $res = readExcel($savePath.$file_name,"UTF-8",$file_type);

	  	    /*重要代码 解决Thinkphp M、D方法不能调用的问题  
		    如果在thinkphp中遇到M 、D方法失效时就加入下面一句代码
		    */
		    spl_autoload_register ( array ('Think', 'autoload' ) );

		    /*对生成的数组进行数据库的写入*/
			foreach ( $res as $k => $v ) {
			    if ($k != 0) {
			        $data ['name1'] = $v[0];
			        $data ['name2'] = $v[1];
			        $data ['name3'] = $v[2];
				$data ['name4'] = $v[3];

			        $result = M ('kucun')->add($data);
			        if ($result===false) {
			            $this->error ('导入数据库失败');
			        }
			    }
			}
			$this->success('导入成功','__URL__/read');
		}
    }


在工程目录的Common目录下新建common.php文件,实现readExcel()函数,不过实际上xlsx导入会出错,不知道和PHPExcel的版本是不是有关系,还希望解决此问题的网友前来讨论:

function readExcel($file_name,$encode,$file_type)
{
      //引用PHPExcel相关类,放在vendor目录下即可如此引用
      Vendor("PHPExcel"); 
      Vendor("PHPExcel.IOFactory");  


      if(strtolower ($file_type)=='xls')//判断excel表类型为2003还是2007
      {  
          Vendor("Excel.PHPExcel.Reader.Excel5");   
          $objReader = PHPExcel_IOFactory::createReader('Excel5');  
      }elseif(strtolower ($file_type)=='xlsx')  
      {  
          Vendor("Excel.PHPExcel.Reader.Excel2007");   
          $objReader = PHPExcel_IOFactory::createReader('Excel2007');  
      }  
      
      $objReader->setReadDataOnly(true);  
      $objPHPExcel = $objReader->load($file_name);

      $objWorksheet = $objPHPExcel->getActiveSheet();  
      $highestRow = $objWorksheet->getHighestRow();  
      $highestColumn = $objWorksheet->getHighestColumn();  
      $highestColumnIndex = PHPExcel_Cell::columnIndexFromString($highestColumn);  
      $excelData = array();  
      for ($row = 1; $row <= $highestRow; $row++) {  
          for ($col = 0; $col < $highestColumnIndex; $col++) {  
              $excelData[$row][] =(string)$objWorksheet->getCellByColumnAndRow($col, $row)->getValue();  
              }  
      }  
      return $excelData; 

}
导入完毕。

三、导出

在Action的.class.php文件中实现导出的函数:

public function export(){
    	
		spl_autoload_register(array('Think','autoload'));

    	$data= M('kucun')->select();  //查出数据
		$name='Excelfile';    //生成的Excel文件文件名
		pushExcel($data,$name); 
    }

在common.php里实现pushExcel():

function pushExcel($data,$name='Excel')
{
    /* 导出excel函数*/
    Vendor("PHPExcel");  
    Vendor("PHPExcel.IOFactory");  
    error_reporting(E_ALL);
    date_default_timezone_set('Europe/London');
    
    $xlsTitle = iconv('utf-8','gb2312',$name);//文件名称
    $objPHPExcel = new PHPExcel();

    /*以下是一些设置 ,什么作者  标题啊之类的*/
    $objPHPExcel->getProperties()->setCreator("SEIEE")
                          ->setLastModifiedBy("SEIEE")
                          ->setTitle("Data export")
                          ->setSubject("Data export")
                          ->setDescription("Data Backup")
                          ->setKeywords("excel")
                          ->setCategory("result file");
    /*以下就是对处理Excel里的数据, 横着取数据,主要是这一步,其他基本都不要改,这里最好能够做成对$data的遍历*/
    foreach($data as $k => $v){
        $num=$k+1;
        $objPHPExcel->setActiveSheetIndex(0)
        //Excel的第A列,uid是你查出数组的键值,下面以此类推
          ->setCellValue('A'.$num, $v['name1'])    
          ->setCellValue('B'.$num, $v['name2'])
          ->setCellValue('C'.$num, $v['name3']);
    }

    $objPHPExcel->getActiveSheet()->setTitle('Sheet1');
    $objPHPExcel->setActiveSheetIndex(0);
    ob_end_clean();  //清空缓存          
    header("Pragma: public"); //下面是一堆header的设置,测试的时候加了好多,现在不清楚哪个没用
    header("Expires: 0");
    header('Content-Type: application/vnd.ms-excel;charset=utf-8;name="'.$xlsTitle.'.xls"');
    header("Content-Type: application/force-download");
    header("Content-Type: application/octet-stream");
    header("Content-Type: application/download");
    header('Content-Disposition: attachment;filename="'.$name.'.xls"');
    header('Cache-Control: max-age=0');
    header("Content-Transfer-Encoding:binary");
    $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
    $objWriter->save('php://output');
    exit;  
}

这里注意一个很重要的问题,有些人可能在导出的时候网页出现乱码,是因为php文件有BOM头,所以用notepad++把php文件改成无BOM头编码就OK了,导出时候就会弹出一个对话框,保存即可。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值