2018年5月

Excel.php

<?php
//没有命名空间类加载方式 调用类用\
require_once IA_ROOT . '/framework/library/phpexcel/PHPExcel.php';
require_once IA_ROOT . '/framework/library/phpexcel/PHPExcel/IOFactory.php';

class Excel{

   
    private $xls='.xls';//保存文件后缀
     private $xlsx='.xlsx';//保存文件后缀
    private $excelPath;//文件保存的绝对位置
    private $letter=["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"];
    //Excel5和Excel2007
    private $ExcelVersion=['Excel2007','Excel5'];

    private $sheetNum=0;
    //phpExcel实例化对象
    private $phpExcel;
    private $phpWriter;
    private $xlsReader;
    private $phpSheet;

    public function __construct()
    {
        //  实例化PHPExcel类
        $this->phpExcel = new PHPExcel();
       
    }

    /**
     * 创建新的Sheet 支持链式操作
     * @param string $sheet_title
     * @param array  $data       导出数据内容
     * @param array  $excelHeader导出表头
     * @return $this
     * @throws \Exception
     * @throws \PHPExcel_Exception
     */
    public function createSheet($sheet_title='Sheet1',$data=[],$excelHeader=[])
    {
        if ( empty($excelHeader)||!is_array($excelHeader)){
            throw new Exception("Parameter is incorrect");
            return $this;
        }
        $sheet_num = $this->getNewSheetNum();
        $objPHPExcel=$this->phpExcel;
        $objPHPExcel->createSheet($sheet_num);
        //设置当前的sheet
        
        $objPHPExcel->setActiveSheetIndex($sheet_num);
        //设置sheet的name
        $objPHPExcel->getActiveSheet()->setTitle($sheet_title);
        $sheet=$objPHPExcel->getActiveSheet();
       //表头设置
        $excelHeader=array_values($excelHeader);
        foreach($excelHeader as $item=>$value){
            $sheet->setCellValue($this->letter[$item]."1",$value);
        }
       //表内容设置
        foreach($data as $item=>$value ){
            $value=array_values($value);
            foreach($value as $i=>$v)
            //$sheet->setCellValue($this->letter[$i].($item+2),$value[$i]);
            $sheet->setCellValueExplicit($this->letter[$i].($item+2),$value[$i], PHPExcel_Cell_DataType::TYPE_STRING);
        }
        return $this;
    }


    /**
     * 导出下载
     * @return output  
     */ 
    public function downFile($excelName='',$ver='xls')
    {
        ob_start();
        if(empty($excelName)){
            $excelName = 'Excel'.date("Ymdhis");
        }
        try{
            if($ver=='xls'){
              $this->phpWriter = PHPExcel_IOFactory::createWriter($this->phpExcel,$this->ExcelVersion[1]);
              $ext = $this->xls;
            }else{
              $this->phpWriter = PHPExcel_IOFactory::createWriter($this->phpExcel,$this->ExcelVersion[0]);
              $ext = $this->xlsx;
            }   
        }catch(Exception $e){
            throw new Exception("Export failed");
        }
        header('Content-Type: application/vnd.ms-excel; charset=utf-8');
        header("Content-Disposition: attachment;filename=".$excelName.$ext);
        header('Cache-Control: max-age=0');
        $this->phpWriter->save('php://output');  
        ob_end_flush();
        die();
    }
    /**
     * 导出保存服务器上
     * @param  String  $path 保存路径
     * @param  boolean $activate 自定义保存路径需要将此处设置为true
     * @return Object  
     */ 
    public function saveFile($excelName='',$filepath='',$ver='xls')
    {
        
        if (empty($filepath)) {
            $filepath  =  IA_ROOT.'/data/Excel/';
        }
        if(empty($excelName)){
            $excelName = 'Excel'.date("Ymdhis");
        }
        if(!$this->checkPath($filepath)){
            throw new Exception("The current directory is not writable");
        } else{
            try{
                 if($ver=='xls'){
              $this->phpWriter = PHPExcel_IOFactory::createWriter($this->phpExcel,$this->ExcelVersion[1]);
              $ext = $this->xls;
            }else{
              $this->phpWriter = PHPExcel_IOFactory::createWriter($this->phpExcel,$this->ExcelVersion[0]);
              $ext = $this->xlsx;
            }  
            }catch(Exception $e){
                throw new Exception("Export failed");
            }
          
            $this->excelPath=$filepath.$excelName.$ext;
            $this->phpWriter->save($this->excelPath); 
            return $this;
        }

    }
    /**
     * 导入基本设置
     * @param  String  $path 保存路径
     * @param  boolean $activate 自定义保存路径需要将此处设置为true
     * @return Object  
     * @throws Exception
     * @throws \PHPExcel_Exception
     */ 
    public function loadExcel($filepath)
    {
      if(!is_file($filepath)){
        throw new Exception("File does not exist");
      }
       try{$type = strtolower( pathinfo($filepath, PATHINFO_EXTENSION) );
            if($type=='xlsx'){
                $xlsReader =  PHPExcel_IOFactory::createReader($this->ExcelVersion[0]);
                $xlsReader->setReadDataOnly(true); 
                $xlsReader->setLoadSheetsOnly(true);
                $this->xlsReader=$xlsReader->load($filepath);
            }elseif('xls'==$type){
                $xlsReader =  PHPExcel_IOFactory::createReader($this->ExcelVersion[1]);
                $xlsReader->setReadDataOnly(true); 
                $xlsReader->setLoadSheetsOnly(true);
                $this->xlsReader=$xlsReader->load($filepath);
            }elseif('csv'==$type){
              $handle = fopen($filepath, 'r');
        $dataArray = array();
        $row = 0;
        while ($data = fgetcsv($handle)) {
            $num = count($data);

            for ($i = 0; $i < $num; $i++) {
                $dataArray[$row][$i] = mb_convert_encoding($data[$i], "utf-8", 'GBK');
            }
            $row++;

        }

        $this->xlsReader= $dataArray;
            }
       }catch(Exception $e){
            throw new Exception("Reading failed");
       }
      return $this->xlsReader;
    }
    /**
     * 获取新的Sheet编号
     * @return int
     */
    protected function getNewSheetNum(){
        $sheet_num=$this->sheetNum;
        $this->sheetNum=$sheet_num+1;
        return $sheet_num;
    }

    /**
     * 检查目录是否可写
     * @param  string   $path    目录
     * @return boolean
     */
    protected function checkPath($path)
    {
        if (is_dir($path)) {
            return true;
        }
        if (mkdir($path, 0755, true)) {
            return true;
        } else {
            return false;
        }
    }
    /**
     * 返回数组的维度
     * @param  Array   $arr 任意数组
     * @return number  数组维度
     */
    protected function array_depth($arr)
    {
        if(!is_array($arr)) return 0;
        $max_depth = 0;
        foreach($arr as $item1)
        {
            $t1 = $this->array_depth($item1);
            if( $t1 > $max_depth) $max_depth = $t1;
        }
        return $max_depth + 1;
    }
}

包含方法有导入,导出,导出模板,支持导入xls,xlsx,csv,导出支持xls,xlsx,使用非常简单

$csv = new Excel();

foreach($rs as $k=>$v){
$data[] = ['用户名'=>$v['username'],'密码'=>$v['password']];
}
$csv = $csv->createSheet('导出表',[],['用户名','密码'])->downFile('文件名','xls');//下载 saveFile('文件名','./','xls')保存到服务器

$csv->loadExcel($_SERVER['DOCUMENT_ROOT'].'/1.xls')->getSheet(0)->toArray();//可读xls,xlsx成数组

$qq = $csv->loadExcel($_SERVER['DOCUMENT_ROOT'].'/1.csv');//读取csv成数组

需要说明 如果导入的数组,数据有空格去除使用下面函数即可

//去除数组中值两端空格
function TrimArray($Input){
    if (!is_array($Input))
        return preg_replace("/(\s|\&nbsp\;| |\xc2\xa0)/","",$Input);

    return array_map('TrimArray', $Input);
}

平常建立网站都希望,www.x.com与x.com是一个网站,如何做到呢?
创建网站时候站点域名一定要带上www.x.com这样去创建网站.
然后我们建立一个.htaccess文件,内容如下,编码utf-8

<IfModule mod_rewrite.c>
RewriteEngine onRewriteCond %{http_host} ^yoby123.cn [NC]
RewriteRule ^(.*)$ https://www.yoby123.cn/$1 [L,R=301]
</IfModule>

里面网站自己改吧
然后把这个文件上传到/www/web/www_yoby123_cn/public_html这样一个目录下就可以,
以后就会自动跳转到带www

我收集制作的 (https://packagist.org/packages/logoove/)

常用函数工具类

composer require logoove/fn dev-master
phpexcel导入导出类

composer require logoove/phpexcel dev-master
pdo操作封装类,类名同微擎1.7版本

composer require logoove/pdo dev-master
oauth2

composer require logoove/oauth2 dev-master
拼音类

composer require logoove/pinyin dev-master
验证码类

composer require logoove/verify dev-master
smarty模板

composer require logoove/smarty dev-master
smtp发送邮件20kb大小类无任何依赖

composer require logoove/smtp dev-master

如果随着php命名空间使用,采用composer会非常方便,不用些重复代码,每个项目只需要通过composer就能重复利用库代码.

1 . 在github上注册一个项目,比如我的,注册为名称fn,项目版权选择的是MIT,然后更新到本地电脑,方便编写库.在本地fn目录下创建src目录,并新建文件Fn.php在src目录下.
2 . 通过cmd命令切换到fn目录下,输入composer init,来创建composer.json文件,注意编码要改成utf-8,生成的好像不是,当然也可以找一个复制过来修改.
composer.json更容是

{
    "name": "logoove/fn",
    "description": "这是一个函数组成的类库,包含大量自定义函数,后续都会从这里更新,以后不用重复定义常见方法",
        "type": "library",
          "license": "MIT",    
    "authors": [{
        "name": "yoby",
        "email": "logove@qq.com"
    }],
  "minimum-stability": "dev",
    "require": {},
    "autoload": {
        "psr-4": {
            "logoove\\fn\\": "src"
        }
    }
}

具体参数意思是name为项目名字,通过/隔开,logoove是我github账号名,fn是项目名字
description是描述,type不用改,authors自己改成你自己的,autoload是自动加载规则,改成你自己路径
完成以后就能够编写Fn.php自己了.
我们可以使用命名空间,命名空间最好统一采用 用户名\项目名
文件名要和你定义的类名相同.
没有使用命名空间的类的加载采用 require_once "PHPExcel.php";这种方式即可
这样我们就可以把以前一些项目改写成符合自动加载类库.

3 . 编写好以后记得提交到到github,然后去 (https://packagist.org) 注册一个帐号,最好也采用github帐号登录.你的每一个库在github上都有独立项目名.最后提交github地址到packagist.org即可.我们以后修改项目在github,那么composer这边如何更新呢,那就是设置同步.
先切换到profile,可以看到底部有个Your API Token,复制下来,然后去github项目的settings->Integrations & services->add server->Packagist,这时候有user,token,domain三个要填写的,我的就是 logoove,刚刚复制的Token,域名就是https://packagist.org/,这样就能自动同步了.
4 . 最后你的库就完成了,任何php项目都能使用了,一个命令搞定,免去每次复制粘贴库代码,你也能分享给更多用户使用

windows安装composer,运行 Composer 需要 PHP 5.3.2+ 以上版本

  • 下载(https://getcomposer.org/Composer-Setup.exe)
  • 安装需要选择php.exe路径,比如phpstudy里面包含很多php,所以可以选择一个合适php版本
  • 安装完成后,需要打开cmd命令,输入composer可以查看安装的信息
  • 更改为国内镜像
    composer config -g repo.packagist composer https://packagist.phpcomposer.com
  • 使用,在cmd下,用cd命令进入到项目目录,执行composer.json文件,命令是
composer install

如果有composer.lock文件需要删除,这样就能执行了