zoukankan      html  css  js  c++  java
  • ThinkPHP5 excel 导入/导出

    首先vendor下引入phpexcel

     

    use phpexcelphpexcelClassesPHPExcel;//excel引入
    
    
    /**
    * excel导入
    * @author gyj  <375023402@qq.com>
    * @createtime 2018-10-30 10:12:16
    * @param $file 导入文件
    * @return data
    */
    if (!function_exists('import_excel')) {
    
        function import_excel($file){
    
            //引入excel类
            vendor('phpexcel.phpexcel.Classes.PHPExcel');
    
            //判断文件是否存在
            if (!file_exists($file)) {
                die('no file!');
            }
    
            // 判断文件是什么格式
            $extension = strtolower( pathinfo($file, PATHINFO_EXTENSION) );
    
            //根据文件类型执行对应的数据获取方法
            if($extension === 'csv'){
                //获取文件内容
                $data=file_get_contents($file);
                $data=explode("
    ", $data);
    
                //解析数组
                foreach ($data as $key => $value) {
                    if($key > 0){
                        $tmp_data[] = explode(",", $value);
                    }
                }
    
                //将解析结果组装进数组
                $data = $tmp_data;
            }else{
                //设置最大执行时间
                ini_set('max_execution_time', '0');
    
                //根据文件后缀获取,文件对象
                $inputFileType = PHPExcel_IOFactory::identify($file);
                $objReader = PHPExcel_IOFactory::createReader($inputFileType);
                $objExcel = $objReader->load($file);
    
                $sheet = $objExcel ->getActiveSheet();
    
    
                // 取得总行数 
                $highestRow = $sheet->getHighestDataRow();     
                // 取得总列数,并将列的字母转成数字序号使用      
                $highestColumn = PHPExcel_Cell::columnIndexFromString($sheet->getHighestDataColumn()); 
    
                //循环读取excel文件,读取一条,插入一条
                $data=array();
    
                
                //从第二行开始读取数据
                for($y=2;$y<=$highestRow;$y++){
    
                    //为空的行 
                    $empty_col = 0;
    
                    //从A列读取数据
                    for($i=0;$i<$highestColumn;$i++){
    
                        //将列的数字序号转成字母使用
                        $x = PHPExcel_Cell::stringFromColumnIndex($i);
                        // 读取单元格
                        $value = $sheet->getCell($x.$y)->getValue();
    
                        //判断单元格数据是否为空
                        if(empty($value)){
                            $empty_col++;
                        }
    
                        //将单元格数据填充入数组
                        $data[$y-2][]=$value;
                    } 
    
                    //判断是否整行为空,如果是 跳出循环
                    if($empty_col == $highestColumn){
                        unset($data[$y-2]);
                        break;
                    }
                }  
            }
            return $data;
        }
    }
    
    
    /**
    * excel导出
    * @author gyj  <375023402@qq.com>
    * @createtime 2018-10-29 15:01:51
    * @param $data 数据源
    * @param $filename 文件名
    * @param $sheet_title 表头
    * @return excel
    */
    if (!function_exists('export_excel')) {
    
        function export_excel($data,$filename,$sheet_title){
            vendor('phpexcel.phpexcel.Classes.PHPExcel');//引入excel类
            $PHPExcel = new PHPExcel(); //实例化PHPExcel类,类似于在桌面上新建一个Excel表格
            $PHPSheet = $PHPExcel->getActiveSheet(); //获得当前活动sheet的操作对象
            $PHPSheet->setTitle($filename); //给当前活动sheet设置名称
            /*--------------设置表头信息------------------*/
            $x = 'A';
            foreach ($sheet_title as $value) {
                $PHPSheet->setCellValue($x.'1', $value)->getStyle($x.'1')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
                $x++;
            }
            /*--------------表格数据填充------------------*/
            $y =2;
            foreach ($data as $value) {
                $x = 'A';
               
                foreach ($value as $val) {
                    $PHPSheet->setCellValue($x.$y,$val)->getStyle($x.$y)->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
                    $PHPSheet->getColumnDimension($x)->setAutoSize(true);
                    $x++;    
                }
               $y++; 
            }
            $PHPExcelWriter = new PHPExcel_Writer_Excel2007($PHPExcel);
            /* 生成到浏览器,提供下载 */ 
            ob_end_clean();  //清空缓存             
            header("Pragma: public");
            header("Expires: 0");
            header("Cache-Control:must-revalidate,post-check=0,pre-check=0");
            header("Content-Type:application/force-download");
            header("Content-Type:application/vnd.ms-execl");
            header("Content-Type:application/octet-stream");
            header("Content-Type:application/download");
            header('Content-Disposition:attachment;filename="'.$filename.'.xlsx"');
            header("Content-Transfer-Encoding:binary"); 
            $PHPExcelWriter->save('php://output');
            exit;
        }
    }

    调用

    //导入
    // 获取上传文件表单字段名
    $fileKey = array_keys(request()->file());
    // 获取表单上传文件
    $file = request()->file($fileKey['0']);
    // 移动到框架应用根目录/public/uploads/ 目录下
    $info = $file->move(ROOT_PATH . 'public' . DS . 'uploads' . DS . 'excel');
    $path=str_replace('\','/',$info->getSaveName());
    $url = ROOT_PATH . 'public' . DS . 'uploads' . DS . 'excel' . DS.$path;
    $data = import_excel($url);
    var_dump($data);
    
    //导出
    $data = db('device')->field('id,device_no,name')->select();
    $title = ["编号","设备序号","名称"];
    $res = export_excel($data,"test",$title);
    var_dump($res);exit;

    注意事项:

    加载测试文件

    下面主要判断Excel2007和Excel5类型,即xlsx/xlsm/xltx/xltm和xls/xlt格式文件

    try {
        $inputFileType = PHPExcel_IOFactory::identify($filePath);
        if ($inputFileType !== "Excel5" && $inputFileType !== "Excel2007" ) {
            unlink($filePath) && str_alert(-1,"请确保导入的文件格式正确!");
        }
        $objReader = PHPExcel_IOFactory::createReader($inputFileType);
        $objPHPExcel = $objReader->load($filePath);
    } catch(Exception $e) {
        unlink($filePath) && str_alert(-1,'加载文件发生错误:”'.pathinfo($filePath,PATHINFO_BASENAME).'”: '.$e->getMessage());
    }

    获取工作表行数和列数

    $highestRow = $sheet->getHighestRow();
    $highestColumn = $sheet->getHighestColumn();

    注意:有时候你会发现你的表格明明有内容的行数就5行,但是获取到的$highestRow却有7,8行或者更多,这可能是因为你在操作你的表格的时候不小心点击了其它行数,虽然没有填写内容,但getHighestRow也是能够识别出行数;

    想要获取有内容的行数应该使用getHighestDataRow和getHighestDataColumn,

    源码注释是这样介绍的string Highest row number that contains data,即包含数据的字符串最高行数.

    转换时间

    获取表格中时间格式的内容,需要PHPExcel_Shared_Date::ExcelToPHP()来转换为php可识别的时间格式

    date('Y-m-d',PHPExcel_Shared_Date::ExcelToPHP($sometime);

     或者在读取的时候进行处理

    读出的时间是天数

    excel 的日期是从 1900-01-01 开始计算的(php 是从 1970-01-01)
    两者间有一个天数差 25569
    时间是格林威治时间
    所以有

    $d = 25569;
    $t = 24 * 60 * 60;
    echo gmdate('Y-m-d H:i:s', (41728.732916667 - $d) * $t);

    本文部分内容摘自:https://blog.csdn.net/weixin_36595597/article/details/81132472

  • 相关阅读:
    通信架构
    通信架构
    17.2?Replication Implementation 复制实施:
    17.2?Replication Implementation 复制实施:
    17.1.1.8?Setting Up Replication with Existing Data设置复制使用存在的数据
    17.1.1.8?Setting Up Replication with Existing Data设置复制使用存在的数据
    17.1.1.7 Setting Up Replication with New Master and Slaves 设置复制对于新的Master和Slaves:
    Hi3531用SPI FLASH启动 使用Nand做文件系统 分类: HI3531 2013-08-28 10:26 884人阅读 评论(0) 收藏
    Hi3531支持2GByte内存 分类: HI3531 2013-08-28 10:25 738人阅读 评论(0) 收藏
    Hi3531添加16GByte(128Gbit) NAND Flash支持 分类: HI3531 2013-08-28 10:23 861人阅读 评论(0) 收藏
  • 原文地址:https://www.cnblogs.com/jiafeimao-dabai/p/9559851.html
Copyright © 2011-2022 走看看