zoukankan      html  css  js  c++  java
  • 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了。

    原文:https://www.cnblogs.com/yayaa/p/8006919.html

  • 相关阅读:
    mysql 之 double( totalsize, decimal)
    java8 实战--- Map merge用法
    java8 stream接口 终端操作 min,max,findFirst,findAny
    tinyint(1)详解
    表单插件——form
    表单验证插件——validate
    使用ajaxStart()和ajaxStop()方法
    使用ajaxSetup()方法设置全局Ajax默认选项
    使用ajax()方法加载服务器数据
    使用serialize()方法序列化表单元素值
  • 原文地址:https://www.cnblogs.com/showcase/p/10894166.html
Copyright © 2011-2022 走看看