thinkphp5 使用PHPExcel 导入导出

Posted Yayaa2

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了thinkphp5 使用PHPExcel 导入导出相关的知识,希望对你有一定的参考价值。

首先下载phpExcel类。网上很多,自行下载。

然后把文件放到vendor文件里面。

一般引用vendor里面的类或者插件用vendor();

里面加载的就是vendor文件,然后想要加载哪个文件,直接写就行,中间的“.”相当于文件路径的“/”。

例如加载excel5这个文件:

 

先把html代码贴出来(整个导入导出的):

    <form enctype="multipart/form-data" method="post" id="form-admin-role-add">
        <div class="form-group col-sm-2">
            <input type="file" name="file_stu" />
        </div>
        <div class="form-group col-sm-2">
            <input type="submit" value="导入" class="btn btn-w-m btn-primary btn-outline" />
        </div>
    </form>

    <div class="form-group col-sm-2">
        <a class="btn btn-w-m btn-primary btn-outline" href="{:url(\'EquipmentList/out\')}">下载excel表格</a>
    </div>

这里有个要注意的地方,我导入是做了异步的,导出不能做异步。

然后先放导入的方法吧:

//导入Excel
    public function into()
    {
        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) != "xlsx") {
                $this->error(\'不是Excel文件,重新上传\');
            }
            /*设置上传路径*/
            /*百度有些文章写的上传路径经过编译之后斜杠不对。不对的时候用大写的DS代替,然后用连接符链接就可以拼凑路径了。*/
            $savePath = ROOT_PATH . \'public\' . DS . \'uploads\' . DS;/*以时间来命名上传的文件*/
            $str = date(\'Ymdhis\');
            $file_name = $str . "." . $file_type;
            
            /*是否上传成功*/
           
            if (!copy($tmp_file, $savePath . $file_name)) {
                $this->error(\'上传失败\');
            }
            /*
            *对上传的Excel数据进行处理生成编程数据,这个函数会在下面第三步的ExcelToArray类中
            *注意:这里调用执行了第三步类里面的read函数,把Excel转化为数组并返回给$res,再进行数据库写入
            */
            require THINK_PATH.\'library/think/ExcelToArrary.php\';//导入excelToArray类
          //引入这个类试了百度出来的好几个方法都不行。最后简单粗暴的使用了require方式。这个类想放在哪里放在哪里。只要路径对就行。
         
            $ExcelToArrary = new ExcelToArrary();//实例化
            
            $res=$ExcelToArrary->read($savePath.$file_name,"UTF-8",$file_type);//传参,判断office2007还是office2003
           
            /*对生成的数组进行数据库的写入*/
            foreach ($res as $k => $v) {
                if ($k > 1) {
                    $data[$k][\'pname\'] = $v[0];
                    $data[$k][\'access\'] = $v[1];
                   $data[$k][\'jointime\'] = time();
                }
            }

            
            //插入的操作最好放在循环外面

            $result = model(\'ProductAccess\')->insertAll($data);
            
            if($result){
                return [\'state\'=>true, \'msg\'=>\'导入成功\'];
            }else{
                return [\'state\'=>false, \'msg\'=>\'导入失败\'];
            }

        }

    }

这里面有要引入ExcelToArray,代码如下:

<?php
namespace think;

use PHPExcel_IOFactory;
use PHPExcel_Cell;
use PHPExcel;
/** 
 * 读取Excel数据
 */
class ExcelToArrary
{
    public function __construct() {
        //这些文件需要下载phpexcel,然后放在vendor文件里面。具体参考上一篇数据导出。
        vendor("PHPExcel.PHPExcel.PHPExcel");
        vendor("PHPExcel.PHPExcel.Writer.IWriter");
        vendor("PHPExcel.PHPExcel.Writer.Abstract");
        vendor("PHPExcel.PHPExcel.Writer.Excel5");
        vendor("PHPExcel.PHPExcel.Writer.Excel2007");
        vendor("PHPExcel.PHPExcel.IOFactory");
    }

    public function read($filename,$encode,$file_type){
            if(strtolower ( $file_type )==\'xls\')//判断excel表类型为2003还是2007
            {
                Vendor("Excel.PHPExcel.Reader.Excel5"); 
                $objReader = PHPExcel_IOFactory::createReader(\'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($filename);
            $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;
    }

}

只要类都引入成功了,代码直接贴上去就能用了

这里改成你自己的。导入就完成啦。

然后就是导出。

//导出Excel
    public function out()
    {
        
        //导出
        $path = dirname(__FILE__); //找到当前脚本所在路径
        vendor("PHPExcel.PHPExcel.PHPExcel");
        vendor("PHPExcel.PHPExcel.Writer.IWriter");
        vendor("PHPExcel.PHPExcel.Writer.Abstract");
        vendor("PHPExcel.PHPExcel.Writer.Excel5");
        vendor("PHPExcel.PHPExcel.Writer.Excel2007");
        vendor("PHPExcel.PHPExcel.IOFactory");
        $objPHPExcel = new \\PHPExcel();
        $objWriter = new \\PHPExcel_Writer_Excel5($objPHPExcel);
        $objWriter = new \\PHPExcel_Writer_Excel2007($objPHPExcel);


        // 实例化完了之后就先把数据库里面的数据查出来
        $sql = model(\'ProductAccess\')->select();

        // 设置表头信息
        $objPHPExcel->setActiveSheetIndex(0)
        ->setCellValue(\'A1\', \'机型\')
        ->setCellValue(\'B1\', \'机型编号\')
        ->setCellValue(\'C1\', \'生产日期\');

        /*--------------开始从数据库提取信息插入Excel表中------------------*/

        $i=2;  //定义一个i变量,目的是在循环输出数据是控制行数
        $count = count($sql);  //计算有多少条数据
        for ($i = 2; $i <= $count+1; $i++) {
            $objPHPExcel->getActiveSheet()->setCellValue(\'A\' . $i, $sql[$i-2][\'pname\']);
            $objPHPExcel->getActiveSheet()->setCellValue(\'B\' . $i, $sql[$i-2][\'access\']);
            $objPHPExcel->getActiveSheet()->setCellValue(\'C\' . $i, $sql[$i-2][\'jointime\']);
        }

        
        /*--------------下面是设置其他信息------------------*/

        $objPHPExcel->getActiveSheet()->setTitle(\'productaccess\');      //设置sheet的名称
        $objPHPExcel->setActiveSheetIndex(0);                   //设置sheet的起始位置
        $objWriter = \\PHPExcel_IOFactory::createWriter($objPHPExcel, \'Excel5\');   //通过PHPExcel_IOFactory的写函数将上面数据写出来
        
        $PHPWriter = \\PHPExcel_IOFactory::createWriter( $objPHPExcel,"Excel2007");
            
        header(\'Content-Disposition: attachment;filename="设备列表.xlsx"\');
        header(\'Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\');
        
        $PHPWriter->save("php://output"); //表示在$path路径下面生成demo.xlsx文件
        
    }

这部分相应改成自己的就成了。

我做这个,遇到的问题也基本就是类引入不成功。只要都引入成功了。就改相应代码就OK了。

 

以上是关于thinkphp5 使用PHPExcel 导入导出的主要内容,如果未能解决你的问题,请参考以下文章

thinkphp5中的excel表的导入导出

ThinkPHP5调用PHPExcel类实现导入导出

ThinkPhp5-PHPExcel导出数据

thinkphp5.0 如何导入phpexcel插件,能详细些点吗

ThinkPHP5.1导出excel表

ThinkPHP5.1导出excel表