php/thinkphp使用PHPExcel解析表格数据,生成表格案例

来源:互联网 发布:mac打不开word文档 编辑:程序博客网 时间:2024/05/20 06:41

我使用的是thinkphp框架


遇到个一场景,发货员发货之后需要一个一个给用户发通知短信,效率太低,所以我就想到了模板短信,

降到效率问题,我是这样设计的,他把Excel导入,我通过phpExcel进行解析,匹配到姓名,电话,和订单号,订单类型

然后向用户发送通知短信,根据订单类型发送不同的订单查询地址和通知信息

------------------------------------------------------------------------------------------------------------------------------------------

这篇主要记录下我使用PHPExcel的过程

这篇不是远创,是看了好多大神的帖子后整理的,甚至说复制的代码,但是具体的原文我没有做记录,就不一点一点贴出来了

写此文仅供自己记录学习之用

----------------------------------------------------------------------------------------------------------------------------------------

1:下载PHPExcel

可以从官网下载,我也把文档上传了http://download.csdn.net/detail/fei003/9851672

2 把PHPExcel放入项目中

把PHPExcel解压后的文件放入Thinkphp/Library/Vendor中

3.把操作方法封装成函数(或者类库),方便自己使用

excel.php 函数

<?php/** * Created by PhpStorm. * User:  * Date: 2017/6/13 * Time: 10:20 * 导入excel文件,对表格进行解析 */function importExecl($file,$filetype){    if(!file_exists($file)){        return array("error"=>0,'message'=>'file not found!');    }    // 判断文档类型,使用相应的方法,可以解析多种文件,这只是判断两个,其余的自己判断    if($filetype == 'xlsx'){        $filetype = 'Excel2007';    }elseif($filetype == 'xls'){        $filetype = 'Excel5';    }    // 引入扩展    Vendor("PHPExcel.PHPExcel.IOFactory");    $objReader = \PHPExcel_IOFactory::createReader($filetype);    try{        $PHPReader = $objReader->load($file);    }catch(Exception $e){}    if(!isset($PHPReader)) return array("error"=>0,'message'=>'read error!');    // 获得所有的sheets表格    $allWorksheets = $PHPReader->getAllSheets();    $i = 0;    //sheet表格遍历分析    foreach($allWorksheets as $objWorksheet){        // 获得sheet表格的标题        $sheetname=$objWorksheet->getTitle();        // 获得总行数        $allRow = $objWorksheet->getHighestRow();        $highestColumn = $objWorksheet->getHighestColumn();        // 获得总列数        $allColumn = \PHPExcel_Cell::columnIndexFromString($highestColumn);        $array[$i]["Title"] = $sheetname;        $array[$i]["Cols"] = $allColumn;        $array[$i]["Rows"] = $allRow;        $arr = array();        // 对合并的单元格进行分析        $isMergeCell = array();        foreach ($objWorksheet->getMergeCells() as $cells) {//merge cells            foreach (\PHPExcel_Cell::extractAllCellReferencesInRange($cells) as $cellReference) {                $isMergeCell[$cellReference] = true;            }        }        for($currentRow = 1 ;$currentRow<=$allRow;$currentRow++){            $row = array();            for($currentColumn=0;$currentColumn<$allColumn;$currentColumn++){;                $cell =$objWorksheet->getCellByColumnAndRow($currentColumn, $currentRow);                $afCol = \PHPExcel_Cell::stringFromColumnIndex($currentColumn+1);                $bfCol = \PHPExcel_Cell::stringFromColumnIndex($currentColumn-1);                $col = \PHPExcel_Cell::stringFromColumnIndex($currentColumn);                $address = $col.$currentRow;                $value = $objWorksheet->getCell($address)->getValue();                if(substr($value,0,1)=='='){                    return array("error"=>0,'message'=>'can not use the formula!');                    exit;                }                if($cell->getDataType()==\PHPExcel_Cell_DataType::TYPE_NUMERIC){                    // $cellstyleformat=$cell->getParent()->getStyle( $cell->getCoordinate() )->getNumberFormat();                    // $formatcode=$cellstyleformat->getFormatCode();                    if (preg_match('/^([$[A-Z]*-[0-9A-F]*])*[hmsdy]/i', $formatcode)) {                        $value=gmdate("Y-m-d", \PHPExcel_Shared_Date::ExcelToPHP($value));                    }else{                        $value=\PHPExcel_Style_NumberFormat::toFormattedString($value,$formatcode);                    }                }                if($isMergeCell[$col.$currentRow]&&$isMergeCell[$afCol.$currentRow]&&!empty($value)){                    $temp = $value;                }elseif($isMergeCell[$col.$currentRow]&&$isMergeCell[$col.($currentRow-1)]&&empty($value)){                    $value=$arr[$currentRow-1][$currentColumn];                }elseif($isMergeCell[$col.$currentRow]&&$isMergeCell[$bfCol.$currentRow]&&empty($value)){                    $value=$temp;                }                $row[$currentColumn] = $value;            }            $arr[$currentRow] = $row;        }        $array[$i]["Content"] = $arr;        $i++;    }    // spl_autoload_register('Think');//must, resolve ThinkPHP and PHPExcel conflicts    unset($objWorksheet);    unset($PHPReader);    unset($PHPExcel);    unlink($file);    return array("error"=>1,"data"=>$array);}
注意:实例化时命名空间要加\

使用的时候就简单了,下面是使用代码

<?phpnamespace PhpExcel\Controller;use Think\Controller;/** * Created by PhpStorm. * User:  * Date: 2017/6/7 * Time: 11:26 */class IndexController extends Controller{    public function index()    {        $this->display();    }    public function importExcel()    {        // 表单提交文件过来        // 获得文件路径        $file = $_FILES[excel][tmp_name];        if(!file_exists($file)){            echo '文件不存在';            exit;        }        //        $fileMessage = explode('.',$_FILES[excel][name]);        // $filename = $fileMessage[0];        // 获得文件扩展名        $filetype = $fileMessage[1];        //使用函数,获得excel数据        $re = importExecl($file,$filetype);        $content = $re['data'][0]['Content'];        // P助手函数,自己扩展        P($content);exit; /*逻辑代码*/    }}

然后在页面中打印如下



从页面上来看,数据解析的很不错

当然,拿到数据后,是不是想干什么就干什么呢。。。嘿嘿

---------------------------------------------------------------------------------------------------

另外一种场景就是把自己的数据生成excel表格

代码如下

public function outPortExcel(){    // 引入文件    Vendor("PHPExcel.PHPExcel");    vendor('PHPExcel/PHPExcel/Writer/Excel2007.php');    $phpExcel = new \PHPExcel();    $phpExcel->getProperties()->setTitle("Office 2007 XLSX Test Document title");    $phpExcel->getProperties()->setSubject("Office 2007 XLSX Test Document subject");    //单独添加数据    $phpExcel->setActiveSheetIndex(0);    $phpExcel->getActiveSheet()->setCellValue('A1', '姓名');//可以指定位置    $phpExcel->getActiveSheet()->setCellValue('B1', '年龄');    $phpExcel->getActiveSheet()->setCellValue('C1', '性别');    $phpExcel->getActiveSheet()->setCellValue('D1', '家庭');    //循环添加数据(根据自己的逻辑)    for($i = 2;$i<200;$i++) {        $phpExcel->getActiveSheet()->setCellValue('A' . $i, '张鹏飞'.$i);        $phpExcel->getActiveSheet()->setCellValue('B' . $i, rand(25,28));        $phpExcel->getActiveSheet()->setCellValue('C' . $i, rand(0,1));        $phpExcel->getActiveSheet()->setCellValue('D' . $i, 'yes');    }    $objWriter = new \PHPExcel_Writer_Excel2007($phpExcel);    // 文件名    $filename = './a.xlsx';    // 存储文件    $objWriter->save($filename);    // 下载文件    // 强制下载函数 代码请转至 http://blog.csdn.net/fei003/article/details/54614097    download('./a.xlsx');}



原创粉丝点击