thinkPHP+phpexcel实现excel报表输出功能示例


Posted in PHP onJune 06, 2017

本文实例讲述了thinkPHP+phpexcel实现excel报表输出功能。分享给大家供大家参考,具体如下:

准备工作:

1.下载phpexcel1.7.6类包;

2.解压至TP框架的ThinkPHP\Vendor目录下,改类包文件夹名为PHPExcel176,目录结构如下图;

thinkPHP+phpexcel实现excel报表输出功能示例

编写代码(以一个订单汇总数据为例):

  1. 创建数据库及表;
  2. 创建tp项目,配置项目的数据库连接,这些基本的就不说了;
  3. 在项目的Lib\Action下创建一个新的类文件ExportStatisticsAction.class.php,然后在  index方法中实现excel导出;
  4. 导出方法的步骤:
    ①查询数据
    ②导入phpexcel类库
    ③创建excel对象并设置excel对象的属性
    ④设置excel的行列样式(字体、高宽、颜色、边框、合并等)
    ⑤绘制报表表头
    ⑥将查询数据写入excel
    ⑦设置excel的sheet的名称
    ⑧设置excel报表打开后初始的sheet
    ⑨设置输出的excel的头参数及文件名
    ⑩调用创建excel的方法生成excel文件

代码如下:

<?php
/**
 * Created by lonm.shi.
 * Date: 2012-02-09
 * Time: 下午4:54
 * To change this template use File | Settings | File Templates.
 */
class ExportStatisticsAction extends Action {
  public function index(){
    $model= D("OrdersView");
    $OrdersData= $model->select(); //查询数据得到$OrdersData二维数组
    vendor("PHPExcel176.PHPExcel");
    // Create new PHPExcel object
    $objPHPExcel = new PHPExcel();
    // Set properties
    $objPHPExcel->getProperties()->setCreator("ctos")
      ->setLastModifiedBy("ctos")
      ->setTitle("Office 2007 XLSX Test Document")
      ->setSubject("Office 2007 XLSX Test Document")
      ->setDescription("Test document for Office 2007 XLSX, generated using PHP classes.")
      ->setKeywords("office 2007 openxml php")
      ->setCategory("Test result file");
    //set width
    $objPHPExcel->getActiveSheet()->getColumnDimension('A')->setWidth(8);
    $objPHPExcel->getActiveSheet()->getColumnDimension('B')->setWidth(10);
    $objPHPExcel->getActiveSheet()->getColumnDimension('C')->setWidth(25);
    $objPHPExcel->getActiveSheet()->getColumnDimension('D')->setWidth(12);
    $objPHPExcel->getActiveSheet()->getColumnDimension('E')->setWidth(50);
    $objPHPExcel->getActiveSheet()->getColumnDimension('F')->setWidth(10);
    $objPHPExcel->getActiveSheet()->getColumnDimension('G')->setWidth(12);
    $objPHPExcel->getActiveSheet()->getColumnDimension('H')->setWidth(12);
    $objPHPExcel->getActiveSheet()->getColumnDimension('I')->setWidth(12);
    $objPHPExcel->getActiveSheet()->getColumnDimension('J')->setWidth(30);
    //设置行高度
    $objPHPExcel->getActiveSheet()->getRowDimension('1')->setRowHeight(22);
    $objPHPExcel->getActiveSheet()->getRowDimension('2')->setRowHeight(20);
    //set font size bold
    $objPHPExcel->getActiveSheet()->getDefaultStyle()->getFont()->setSize(10);
    $objPHPExcel->getActiveSheet()->getStyle('A2:J2')->getFont()->setBold(true);
    $objPHPExcel->getActiveSheet()->getStyle('A2:J2')->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER);
    $objPHPExcel->getActiveSheet()->getStyle('A2:J2')->getBorders()->getAllBorders()->setBorderStyle(PHPExcel_Style_Border::BORDER_THIN);
    //设置水平居中
    $objPHPExcel->getActiveSheet()->getStyle('A1')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_LEFT);
    $objPHPExcel->getActiveSheet()->getStyle('A')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
    $objPHPExcel->getActiveSheet()->getStyle('B')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
    $objPHPExcel->getActiveSheet()->getStyle('D')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
    $objPHPExcel->getActiveSheet()->getStyle('F')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
    $objPHPExcel->getActiveSheet()->getStyle('G')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
    $objPHPExcel->getActiveSheet()->getStyle('H')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
    $objPHPExcel->getActiveSheet()->getStyle('I')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
    //合并cell
    $objPHPExcel->getActiveSheet()->mergeCells('A1:J1');
    // set table header content
    $objPHPExcel->setActiveSheetIndex(0)
      ->setCellValue('A1', '订单数据汇总 时间:'.date('Y-m-d H:i:s'))
      ->setCellValue('A2', '订单ID')
      ->setCellValue('B2', '下单人')
      ->setCellValue('C2', '客户名称')
      ->setCellValue('D2', '下单时间')
      ->setCellValue('E2', '需求机型')
      ->setCellValue('F2', '需求数量')
      ->setCellValue('G2', '需求交期')
      ->setCellValue('H2', '确认BOM料号')
      ->setCellValue('I2', 'PMC确认交期')
      ->setCellValue('J2', 'PMC交货备注');
    // Miscellaneous glyphs, UTF-8
    for($i=0;$i<count($OrdersData)-1;$i++){
      $objPHPExcel->getActiveSheet(0)->setCellValue('A'.($i+3), $OrdersData[$i]['id']);
      $objPHPExcel->getActiveSheet(0)->setCellValue('B'.($i+3), $OrdersData[$i]['realname']);
      $objPHPExcel->getActiveSheet(0)->setCellValue('C'.($i+3), $OrdersData[$i]['customer_name']);
      $objPHPExcel->getActiveSheet(0)->setCellValue('D'.($i+3), toDate($OrdersData[$i]['create_time'])); //这里调用了common.php的时间戳转换函数
      $objPHPExcel->getActiveSheet(0)->setCellValue('E'.($i+3), $OrdersData[$i]['require_product']);
      $objPHPExcel->getActiveSheet(0)->setCellValue('F'.($i+3), $OrdersData[$i]['require_count']);
      $objPHPExcel->getActiveSheet(0)->setCellValue('G'.($i+3), $OrdersData[$i]['require_time']);
      $objPHPExcel->getActiveSheet(0)->setCellValue('H'.($i+3), $OrdersData[$i]['product_bom_encoding']);
      $objPHPExcel->getActiveSheet(0)->setCellValue('I'.($i+3), $OrdersData[$i]['delivery_time']);
      $objPHPExcel->getActiveSheet(0)->setCellValue('J'.($i+3), $OrdersData[$i]['delivery_memo']);
      $objPHPExcel->getActiveSheet()->getStyle('A'.($i+3).':J'.($i+3))->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER);
      $objPHPExcel->getActiveSheet()->getStyle('A'.($i+3).':J'.($i+3))->getBorders()->getAllBorders()->setBorderStyle(PHPExcel_Style_Border::BORDER_THIN);
      $objPHPExcel->getActiveSheet()->getRowDimension($i+3)->setRowHeight(16);
    }
    // sheet命名
    $objPHPExcel->getActiveSheet()->setTitle('订单汇总表');
    // Set active sheet index to the first sheet, so Excel opens this as the first sheet
    $objPHPExcel->setActiveSheetIndex(0);
    // excel头参数
    header('Content-Type: application/vnd.ms-excel');
    header('Content-Disposition: attachment;filename="订单汇总表('.date('Ymd-His').').xls"'); //日期为文件名后缀
    header('Cache-Control: max-age=0');
    $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5'); //excel5为xls格式,excel2007为xlsx格式
    $objWriter->save('php://output');
  }
}

5.调用导出方法直接  http://项目/index.php/ExportStatistics/index,项目中调用直接__APP__/ExportStatistics/index,生成的报表是下载方式来保存。phpexcel1.7.6没有发现什么编码问题,速度也很快,注意导出的方法中不能有任何页面输出信息或调试信息,否则导出的excel会提示格式不对。效果如下:

导出报表

thinkPHP+phpexcel实现excel报表输出功能示例

希望本文所述对大家基于ThinkPHP框架的PHP程序设计有所帮助。

PHP 相关文章推荐
PHP中实现图片的锐化
Oct 09 PHP
给php新手谈谈我的学习心得
Feb 25 PHP
PHP缩略图等比例无损压缩,可填充空白区域补充色
Jun 10 PHP
三个类概括PHP的五种设计模式
Sep 05 PHP
php 表单提交大量数据发生丢失的解决方法
Mar 03 PHP
php实现文件编码批量转换
Mar 10 PHP
PHP5多态性与动态绑定介绍
Apr 03 PHP
CI(CodeIgniter)框架视图中加载视图的方法
Mar 24 PHP
PHP实现动态删除XML数据的方法示例
Mar 30 PHP
PHP删除数组中指定值的元素常用方法实例分析【4种方法】
Aug 21 PHP
关于Curl在Swoole协程中的解决方案详析
Sep 12 PHP
解决laravel(5.5)访问public报错的问题
Oct 12 PHP
PHP实现RSA签名生成订单功能【支付宝示例】
Jun 06 #PHP
PHP实现的激活用户注册验证邮箱功能示例
Jun 06 #PHP
PHP实现向关联数组指定的Key之前插入元素的方法
Jun 06 #PHP
PHP培训要多少钱
Jun 06 #PHP
Mac系统完美安装PHP7详细教程
Jun 06 #PHP
PHP实现的注册,登录及查询用户资料功能API接口示例
Jun 06 #PHP
PHP PDO操作MySQL基础教程
Jun 05 #PHP
You might like
解析PHP强制转换类型及远程管理插件的安全隐患
2014/06/30 PHP
PHP获得数组交集与差集的方法
2015/06/10 PHP
关于php中一些字符串总结
2016/05/05 PHP
PHP底层运行机制与工作原理详解
2020/07/31 PHP
js继承 Base类的源码解析
2008/12/30 Javascript
动感效果的TAB选项卡jquery 插件
2011/07/09 Javascript
jquery 获取自定义属性(attr和prop)的实现代码
2012/06/27 Javascript
javascript实现tabs选项卡切换效果(扩展版)
2013/03/19 Javascript
jQuery学习笔记之jQuery.fn.init()的参数分析
2014/06/09 Javascript
jQuery插件bgStretcher.js实现全屏背景特效
2015/06/05 Javascript
AngularJs 指令详解及示例代码
2016/09/01 Javascript
Vue.js每天必学之内部响应式原理探究
2016/09/07 Javascript
vue.js中$watch的用法示例
2016/10/04 Javascript
jQuery Easyui datagrid连续发送两次请求问题
2016/12/13 Javascript
AngularJS动态菜单操作指令
2017/04/25 Javascript
记React connect的几种写法(小结)
2018/09/18 Javascript
[49:20]VG vs TNC Supermajor小组赛B组败者组决赛 BO3 第二场 6.2
2018/06/03 DOTA
详解Python中的array数组模块相关使用
2016/07/05 Python
Python 模拟员工信息数据库操作的实例
2017/10/23 Python
详解Python 协程的详细用法使用和例子
2018/06/15 Python
python爬取指定微信公众号文章
2018/12/20 Python
深入了解Python iter() 方法的用法
2019/07/11 Python
Python 字符串类型列表转换成真正列表类型过程解析
2019/08/26 Python
Pytorch.nn.conv2d 过程验证方式(单,多通道卷积过程)
2020/01/03 Python
Python实现转换图片背景颜色代码
2020/04/30 Python
Django之腾讯云短信的实现
2020/06/12 Python
从Pytorch模型pth文件中读取参数成numpy矩阵的操作
2021/03/04 Python
需要知道的CSS3动画技术
2010/01/01 HTML / CSS
世界顶级俱乐部的官方球衣和套装:Subside Sports
2018/04/22 全球购物
农业大学毕业生的个人自我评价
2013/10/11 职场文书
2014元旦晚会策划方案
2014/02/19 职场文书
机关作风整顿个人整改措施2014
2014/09/17 职场文书
单位委托书
2014/10/15 职场文书
大学生求职意向书
2015/05/11 职场文书
基于python的matplotlib制作双Y轴图
2021/04/20 Python
详解Python中__new__方法的作用
2022/03/31 Python