遇到个一场景,发货员发货之后需要一个一个给用户发通知短信,效率太低,所以我就想到了模板短信,
降到效率问题,我是这样设计的,他把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<table id="demo" lay-filter="test"></table>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