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

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

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

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

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

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

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

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

1:下载PHPExcel

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

2 把PHPExcel放入项目中

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

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

excel.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 ) ; } 注意:实例化时命名空间要加\

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

namespace 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');
                                    一、参考资料:1.thinkphp: https://www.kancloud.cn/special/thinkphp5_quickstart2.layui: http://www.layui.com/doc/modules/table.html二、代码:主体html&lt;table id="demo" lay-filter="test"&gt;&lt;/table&gt;JS构建:(此处采用自...
基于ThinkPHP的表单信息收集系统实现了一个简单的信息收集与管理的功能,用户在表单处提交信息,后台管理员对信息进行统一管理及导出Excel表格thinkphp+mysql+bootstrap+vscode+phpstudy
二 主要功能
0 用户提交表单
1 管理员登录/注销
2 管理员管理(增删改查)
3 信息展示/搜索/删除
4 导出Excel表格
三 系统演示
                    ThinkPHP表单信息收集
                                    事务管理系统是一款基于ThinkPHP框架开发的智慧表单事务流程CRM系统,面向企业与终端消费者,并结合了拖拽 DIY 页面、支持 20多种组件的自定义表单、自定义任务流程功能的软件。通过自研的工作流,管理人员只需预先设计好工作流程与字段,接下来系统将根据流程将任务派发给不同受理人员,所以无论是ToB还是ToC,事务管理系统均能应付大多数场景。1、智能派单事务管理系统支持多种派单方式:系统自动指派、抢单模式、他人指派模式。抢单模式:可设置权限组,仅限部分人员抢单受理。他人指派模式:指定某一个人派发任务。
                                    thinkphp标准数据表设计:
创建时间字段:create_time更新时间字段:update_time删除时间字段:delete_time类型选int,如下图: 一、创建model的文件夹
在application文件夹下的二级对象目录中新建名为model的文件夹,该文件夹与对应的controller和view目录同级,如下图: 如果有多个模块(比如前台index,后台admin),操作的数据都差不多,那么可以把model模型放到common公共模块里,如下: 二、创建model模型类
1、在mode
                                    第一步:先将以下两个方法写入公共控制器中
    public function exportExcel($expTitle,$expCellName,$expTableData){
        $xlsTitle = iconv('gb2312', 'UTF8', $expTitle);//文件名称
        $fileName = $_SESSION['loginAccount
2、做成动态的数据,如按照一定的表格样式构建数据,然后上传,获取文件地址,开始解析excel,获取数据
以上两个方法都可以用如下方法,便可以解析excel 里面的数据
  public function handle_data(){
/*读取excel文件,并进行相应处理*/
        //s$fileName = "F:/handle_data/data.xlsx"; 这是第一个方法,直接获取文件excel的地址
        //$fil
                                    在实际使用的过程中,解析一两百行的Excel没有问题,遇到上万行的Excel时,phpexcel的内存使用量会飙升,很容易就能超过128M甚至更多。但我们使用PHP框架进行项目开发的时候,难免会遇到一些数据导入的需求,比如后台导入用户,导入订单数据等等,通常解决方案都是compose引入excel插件,先将文件上传到服务器,将文件中的数据读取到内存中,再插入数据表中。XLSX表格中,如果单元格的内容是一串字符串时,实际保存的时候只保存一个stringId,字符串真正的内容保存在一个String字典中。
                                    在文件中new PHPExcel()类的时候,报not found错误,但是实际这个类是存在的:
查找了网上的资料,说是没有composer.json与composer.lock这两个文件导致的,但是我项目中也是有的:
请教了大佬,说是好像是自动加载类没这个类啥的,但是具体问题我还不知道什么原因,希望有大佬知道的指点一二。
目前我的解决办法是使用require_once引入PHPExcel.php文件
require_once(CORE_PATH  . '/vendor/phpoffice/phpexc