ThinkPHP Excel导入导出示例

2019-07-11 02:28栏目:技术创新

ThinkPHP官方的帖子感觉写的很含糊,还是借鉴了另外一篇博客

一、前期准备

  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了,导出时候就会弹出一个对话框,保存即可。


版权声明:本文由新浦京娱乐站_新浦京娱乐场官网_新浦京娱乐发布于技术创新,转载请注明出处:ThinkPHP Excel导入导出示例