利用PHPExcel 实现excel数据的导入导出(源码实现)
利用PHPExcel 实现excel数据的导入导出(源码实现)
在开发过程中,经常会遇到导入导出的需求,利用phpexcel类实现起来也是比较容易的,下面,我们一步一步实现
提前将phpexcel类下载,并放在扩展目录中,如图所示
一、Excel导出
导出功能,相对复杂,复杂就复杂在设置导出的excel文件的样式以及内容如何循环赋值,而且导出之后的处理结果,一般是直接在通过浏览器下载到本地,或者发送邮件,在此,以下载到本地为例,下面是源码实现
1、首先是获取待导出的数据,这一步比较简单
//首先获取所有待发货的订单
$where['status'] = 2;
$order_model = new OrderModel();
$res = $order_model
->with('OGModel')
->where($where)
->select()->toArray();
if(!$res) $this->error('暂无待发货的记录');
//dump($res);die;
$count = count($res);
2、设置Excel导出文件的样式以及为每个单元格赋值,这一步是导出最重要最复杂的一步,好在我都做了注释
//引入Excel类
$objPHPExcel = new \PHPExcel();
// 设置excel文档的属性
$objPHPExcel->getProperties()->setCreator("cyf")
->setLastModifiedBy("cyf Test")
->setTitle("order")
->setSubject("Test1")
->setDescription("Test2")
->setKeywords("Test3")
->setCategory("Test result file");
//设置excel工作表名及文件名
$title = '待发货订单';
$excel_filename = '待发货订单_'.date('Ymd_His');
// 操作第一个工作表
$objPHPExcel->setActiveSheetIndex(0);
//第一行设置内容
$objPHPExcel->getActiveSheet()->setCellValue('A1',$excel_filename);
//合并
$objPHPExcel->getActiveSheet()->mergeCells('A1:AC1');
//设置单元格内容加粗
$objPHPExcel->getActiveSheet()->getStyle('A1')->getFont()->setBold(true);
//设置单元格内容水平居中
$objPHPExcel->getActiveSheet()->getStyle('A1')->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
//设置excel的表头
$sheet_title = array('订单编号','下单时间','订单金额','订单状态','支付方式','付款时间','支付单号','配送方式',
'收货人','联系电话','省','市','区','地址','运费','商品名称','商品货号','商品规格','商品数量','商品单价',
'发货单号','卖家备注','实付金额','微信/支付宝金额','余额支付','优惠金额','买家备注','物流公司','物流单号');
// 设置第一行和第一行的行高
$objPHPExcel->getActiveSheet()->getRowDimension('1')->setRowHeight(20);
$objPHPExcel->getActiveSheet()->getRowDimension('2')->setRowHeight(25);
$letter = array('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','AA','AB','AC');
//设置单元格
$objPHPExcel->getActiveSheet()->getStyle('A2:AC2')->getBorders()->getAllBorders()->setBorderStyle(\PHPExcel_Style_Border::BORDER_THIN);
//首先是赋值表头
for ($k=0;$k<29;$k++) {
$objPHPExcel->getActiveSheet()->setCellValue($letter[$k].'2',$sheet_title[$k]);
$objPHPExcel->getActiveSheet()->getStyle($letter[$k].'2')->getFont()->setSize(10)->setBold(true);
//设置单元格内容水平居中
$objPHPExcel->getActiveSheet()->getStyle($letter[$k].'2')->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
//设置每一列的宽度
$objPHPExcel->getActiveSheet()->getColumnDimension($letter[$k])->setWidth(18);
$objPHPExcel->getActiveSheet()->getColumnDimension('P')->setWidth(30); }
//开始赋值
for ($i=0;$i<$count;$i++) {
//先确定行
$row = $i+3;//再确定列,最顶部占一行,表头占用一行,所以加3
$temp = $res[$i];
for ($j = 0;$j<29;$j++) {
//开始为每个单元格赋值
//初始化地址数据
$address_arr = [];
$address_arr = explode(',',$temp['address_address']);
//初始化商品数据
$product_name = $product_number = $product_attr = $product_num = $product_price = '';
$cl = ','.chr(10);
foreach ($temp['o_g_model'] as $v) {
$product_name .= $v['title'].$cl;
$product_number .= $v['attrid'].$cl;
$attr = [];
$attr = json_decode($v['attr_name'],true);
if ($attr) {
foreach ($attr as $vv) {
$product_attr .= $vv.' ';
}
$product_attr .= $cl;
}
$product_num .= $v['num'].$cl;
$product_price .= $v['user_price'].$cl;
}
switch ($j) {
case 0 :
//订单编号
$cellvalue = $temp['order_num'];
break;
case 1 :
//下单时间
$cellvalue = date('Y-m-d H:i:s',$temp['addtime']);
break;
case 2 :
//订单金额
$cellvalue = $temp['price_sum'];
break;
case 3 :
//订单状态
$cellvalue = lang('ORDER_STATUS')[$temp['status']];
break;
case 4 :
//支付方式
$cellvalue = lang('ORDER_PAY')[$temp['pay_type']];
break;
case 5 :
//付款时间
$cellvalue = '';
break;
case 6 :
//支付单号
$cellvalue = '';
break;
case 7 :
//配送方式
$cellvalue = lang('POST_TYPE')[$temp['post_type']];
break;
case 8 :
//收货人姓名
$cellvalue = $temp['address_name'];
break;
case 9 :
//联系电话
$cellvalue = $temp['address_phone'];
break;
case 10 :
//省
$cellvalue = $address_arr[0];
break;
case 11 :
//市
$cellvalue = $address_arr[1];
break;
case 12 :
//区
$cellvalue = $address_arr[2];
break;
case 13 :
//地址
$cellvalue = $address_arr[3];
break;
case 14 :
//运费
$cellvalue = $temp['p_price'];
break;
case 15 :
//商品名称
$cellvalue = $product_name;
break;
case 16 :
//商品货号
$cellvalue = $product_number;
break;
case 17 :
//商品规格
$cellvalue = $product_attr;
break;
case 18 :
//商品数量
$cellvalue = $product_num;
break;
case 19 :
//商品单价
$cellvalue = $product_price;
break;
case 20 :
//发货单号
$cellvalue = '已废弃';
break;
case 21 :
//卖家备注
$cellvalue = '';
break;
case 22 :
//实付金额
$cellvalue = $temp['pay_money'];
break;
case 23 :
//微信支付宝金额
$cellvalue = $temp['pay_money'];
break;
case 24 :
//余额支付
$cellvalue = $temp['static_money'];
break;
case 25 :
//优惠金额
$cellvalue = $temp['coupon'];
break;
case 26 :
//买家备注
$cellvalue = '';
break;
case 27 :
//物流公司
$cellvalue = '';
break;
case 28 :
//物流单号
$cellvalue = '';
break;
}
//赋值
$objPHPExcel->getActiveSheet()->setCellValue($letter[$j].$row, $cellvalue);
//设置字体大小
$objPHPExcel->getActiveSheet()->getStyle($letter[$j].$row)->getFont()->setSize(10);
//设置单元格内容水平居中
$objPHPExcel->getActiveSheet()->getStyle($letter[$j].$row)->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
//设置自动换行
if ((in_array($j,[15,16,17,18,19])) && "" != $cellvalue) {
$objPHPExcel->getActiveSheet()->getStyle($letter[$j].$row)->getAlignment()->setWrapText(true); // 自动换行
$objPHPExcel->getActiveSheet()->getStyle($letter[$j].$row)->getAlignment()->setVertical(\PHPExcel_Style_Alignment::VERTICAL_CENTER); // 垂直方向上中间居中
}
}
// 设置行高
$objPHPExcel->getActiveSheet()->getRowDimension($row)->setRowHeight(21);
}
unset($res);
3、设置完之后,将生成的excel文件,通过浏览器下载到本地
//赋值结束,开始输出
$objPHPExcel->getActiveSheet()->setTitle($title);
header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment;filename="'.$excel_filename.'.xls"');
header('Cache-Control: max-age=0');
$objWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
$objWriter->save('php://output');
4、也可以在服务器上生成excel文件,然后发送到用户邮箱
$filename = __ROOT__.'/upload/files/'.$excel_filename;
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
$objWriter->save($filename);
二、Excel导入
相比导出,导入就简单多了,废话不多说,直接上源码
1、利用form表单获取上传的excel文件
$file = $_FILES['file'];
if ($file['error'] == 4) $this->error('请选择上传excel文件');
$file_types = explode ( ".", $file['name'] );
$excel_type = array('xls','csv','xlsx');
if (!in_array(strtolower(end($file_types)),$excel_type)){
$this->error("不是Excel文件,请重新上传");
}
2、然后,读取excel文件里面的数据,这里是边读取边处理,或者全部读取出来再处理
//设置获取excel对象
$objReader = \PHPExcel_IOFactory::createReader('Excel5');//配置成2003版本,因为office版本可以向下兼容
$objPHPExcel = $objReader->load($file['tmp_name'],$encode='utf-8');//$file 为解读的excel文件
//dump($objPHPExcel);die;
$sheet = $objPHPExcel->getSheet(0);
$highestRow = $sheet->getHighestRow(); // 取得总行数
$success_item = $fail_item = 0;
//发货
$order_model = new OrderModel();
//开始读取数据
for($j=3;$j<=$highestRow;$j++)
{
$order_num = $objPHPExcel->getActiveSheet()->getCell('A'.$j)->getValue();
$poster = $objPHPExcel->getActiveSheet()->getCell("AB".$j)->getValue();//物流公司
$logistics = $objPHPExcel->getActiveSheet()->getCell("AC".$j)->getValue();//物流单号
$comm = $objPHPExcel->getActiveSheet()->getCell("V".$j)->getValue();//卖家备注
//判断条件
if(!is_null($order_num) && $order_num){
$res = $order_model->where('order_num',$order_num)->field('itemid,status')->find();
if ($res && $res['status'] == 2) {
if ((!is_null($poster) && $poster) || (!is_null($logistics) && $logistics)) {
//更改状态
OrderPlanModel::addLog($res['itemid'],'确认发货',$comm);
$order_model->Update([
'status'=>3,
'poster'=>$poster,
'logistics'=>$logistics,
],['itemid'=>$res['itemid']]);
$success_item ++;
} else {
$fail_item ++;
}
} else {
$fail_item ++;
}
} else {
$fail_item++;
}
}
$this->success('成功条数:'.$success_item.',失败条数:'.$fail_item);
利用PHPExcel 实现excel数据的导入导出(源码实现)的更多相关文章
- 使用phpExcel实现Excel数据的导入导出(完全步骤)
使用phpExcel实现Excel数据的导入导出(完全步骤) 很多文章都有提到关于使用phpExcel实现Excel数据的导入导出,大部分文章都差不多,或者就是转载的,都会出现一些问题,下面是本人 ...
- 循序渐进开发WinForm项目(5)--Excel数据的导入导出操作
随笔背景:在很多时候,很多入门不久的朋友都会问我:我是从其他语言转到C#开发的,有没有一些基础性的资料给我们学习学习呢,你的框架感觉一下太大了,希望有个循序渐进的教程或者视频来学习就好了. 其实也许我 ...
- thinkphp实现excel数据的导入导出
下载地址:phpexcel.rar 实现步骤: 一:在http://phpexcel.codeplex.com/下载最新PHPExcel放到Vendor下,注意位置:ThinkPHP\Extend\V ...
- 使用NPOI进行Excel数据的导入导出
- 利用PHPExcel读取Excel的数据和导出数据到Excel
PHPExcel是一个PHP类库,用来帮助我们简单.高效实现从Excel读取Excel的数据和导出数据到Excel.也是我们日常开发中,经常会遇到的使用场景.比如有个客户信息表,要批量导出发给同事,我 ...
- ThinkPHP使用PHPExcel实现Excel数据导入导出完整实例
这篇文章主要介绍了ThinkPHP使用PHPExcel实现Excel数据导入导出,非常实用的功能,需要的朋友可以参考下 本文所述实例是使用在Thinkphp的开发框架上,要是使用在其他框架也是同样的方 ...
- 使用PHPExcel实现Excel文件的导入和导出(模板导出)
在之前有写过一篇文章讲述了使用PHP快速生成excel表格文件并下载,这种方式生成Excel文件,生成速度很快,但是有缺点是:1.单纯的生成Excel文件,生成的文件没有样式,单元格属性(填充色,宽度 ...
- NPOI 操作数据库中数据的导入导出(Excel.xls文件) 和null数据的处理。
App.config: <?xml version="1.0" encoding="utf-8" ?> <configuration> ...
- MATLAB中文件的读写和数据的导入导出
http://blog.163.com/tawney_daylily/blog/static/13614643620111117853933/ 在编写一个程序时,经常需要从外部读入数据,或者将程序运行 ...
随机推荐
- Gym - 100221D 一题一直没过的dfs,,应该是纯手动码?
不写了,10年以后再回来写. http://codeforces.com/gym/100221/attachments H题
- hdu 5489——Removed Interval——————【删除一段区间后的LIS】
Removed Interval Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...
- ADO学习笔记之注入漏洞与参数化查询
ADO学习笔记之注入漏洞与参数化查询 作为新手,在学习ADO程序时,使用 sql 语言查询数据时,很容易写类似如下代码: using (SqlConnection con = new SqlConne ...
- 显示单位px、dip以及sp的区别
dip: Device Independent Pixels(设备独立像素). 不同设备有不同的显示效果,这个和设备硬件有关,一般我们为了支持WVGA.HVGA和QVGA推荐使用这个,不依赖像素. p ...
- Django之model基础(增删改查)
一.ORM 映射关系 表名 <-------> 类名 字段 <-------> 属性 表记录 <------->类实例对象二.创建表(建立模型) 在创建表之前的准备 ...
- html5 知识总结
Meta基础知识: H5页面窗口自动调整到设备宽度,并禁止用户缩放页面 //一.HTML页面结构<meta name="viewport" content=" ...
- cf1040E. Network Safety(并查集)
题意 题目链接 一张图,n个点,m条边,每个点有个权值x,x<=1e18.如果一条边的两个端点不一样,那么这条边是安全的,开始时所有边都是安全的. 现在有一个病毒y,病毒可以入侵任意的点,入侵一 ...
- Java集合框架—List
Collection |--List:元素是有序的,元素可以重复.因为该集合体系有索引. |--ArrayList:底层的数据结构使用的是数组结构.特点:查询速度很快.但是增删稍慢.线程不同步. |- ...
- CentOS下内核TCP参数优化配置详解
主动关闭的一方在发送最后一个ACK后就会进入TIME_WAIT状态,并停留2MSL(Max Segment LifeTime)时间,这个是TCP/IP必不可少的. TCP/IP的设计者如此设计,主要原 ...
- zabbix 监控项
监控项 概述 监控项是从主机收集的数据信息. 配置主机后,你需要添加一些监控项以开始获取实际数据. 一个监控项是一个独立的指标.快速添加多个监控项的一种方法是将一个预定义的模板附加到主机.然而,为了优 ...