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