PHP实现导出带样式的Excel


Posted in PHP onAugust 28, 2016

工作中做导出的时候,需要导出自定义的表格或嫌弃导出的Excel格式太难看了。

需要设置颜色、字号大小、加粗、合并单元格等等。

效果图:

PHP代码:

/**
* 导出文件
* @return string
*/
public function export()
{
$file_name  = "成绩单-".date("Y-m-d H:i:s",time());
$file_suffix = "xls";
header("Content-Type: application/vnd.ms-excel");
header("Content-Disposition: attachment; filename=$file_name.$file_suffix");
//根据业务,自己进行模板赋值。
$this->display();
}

HTML代码:

<html xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:x="urn:schemas-microsoft-com:office:excel"
xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv=Content-Type content="text/html; charset=utf-8">
<meta name=ProgId content=Excel.Sheet>
<meta name=Generator content="Microsoft Excel 11">
</head>
<body>
<table border=1 cellpadding=0 cellspacing=0 width="100%" >
<tr>
<td colspan="5" align="center">
<h2>成绩单</h2>
</td>
</tr>
<tr>
<td style='width:54pt' align="center">编号</td>
<td style='width:54pt' align="center">姓名</td>
<td style='width:54pt' align="center">语文</td>
<td style='width:54pt' align="center">数学</td>
<td style='width:54pt' align="center">英语</td>
</tr>
<tr>
<td align="center">1</td>
<td style="background-color: #00CC00;" align="center">Jone</td>
<td style="background-color: #00adee;" align="center">90</td>
<td style="background-color: #00CC00;" align="center">85</td>
<td style="background-color: #00adee;" align="center">100</td>
</tr>
<tr>
<td align="center">2</td>
<td style="background-color: #00CC00;" align="center">Tom</td>
<td style="background-color: #00adee;" align="center">99</td>
<td style="background-color: #00CC00;" align="center">85</td>
<td style="background-color: #00adee;" align="center">80</td>
</tr>
</table>
</body>
</html>

我们再来看一个更方便的组件

在这里需要用到PEAR的两个软件包 Spreadsheet Excel Writer 和 OLE,如果没有可以分别从 http://pear.php.net/package/Spreadsheet_Excel_Writer/ 和 http://pear.php.net/package/OLE/ 下载,解压放在PEAR目录下。

全部代码如下:

<?php
include 'Writer.php';

/* *** 准备导出的数据 *** */
$head = 'One Week Schedule';
$data = array('Monday' =>   array( array('time' => '09:00', 'event' => '公司例会例会'),
                      array('time' => '14:00', 'event' => '部门例会')
                    ),
         'Tuesday' =>   array( array('time' => '09:30', 'event' => '和 Mr. Stinsen 早餐')),
         'Wednesday' =>   array(array('time' => '12:10', 'event' => '市场中阶报告'),
                    array('time' => '15:30', 'event' => '市场部战略部署会议') ),
         'Thursday' =>   array( array('time' => '', 'event' => '')),
         'Friday' =>   array( array('time' => '16:00', 'event' => 'WoC Stock 研讨会'),
                    array('time' => '17:00', 'event' => '飞往华尔街'),
                    array('time' => '21:00', 'event' => '会见克林顿'))
     );
/* *** *** */

$workbook = new Spreadsheet_Excel_Writer();
$filename = date('YmdHis').'.xls';//csv
$workbook->send($filename); // 发送 Excel 文件名供下载
$workbook->setVersion( 8 );

$sheet = &$workbook->addWorksheet("Sheet1");   // 创建工作表
$sheet->setInputEncoding('utf-8');          // 字符集
$headFormat = &$workbook->addFormat(array('Size' => 14, 'Align' => 'center','Color' => 'white', 'FgColor' => 'brown', 'Bold'=>'1', 'Border' => '1'));//定义格式
$dayFormat = &$workbook->addFormat(array('Size' => 12, 'Align' => 'center', 'VAlign' => 'vcenter', 'FgColor' => 'green', 'Color' => 'white', 'Border' => '1'));//定义格式
$dataFormat = &$workbook->addFormat(array('Size' => 10, 'Align' => 'left', 'Border' => '1', 'Color' => 'black', 'FgColor'=> 'cyan'));//定义格式

$sheet->setColumn(0, 0, 20);   // 设置宽度
$sheet->setColumn(1, 1, 15);   // 设置宽度
$sheet->setColumn(2, 2, 30);   // 设置宽度

$r = 0;   
$sheet->write(0, $r, $head, $headFormat);   // 表格标题
$sheet->mergeCells(0, 0, 0, 2);   // 跨列显示

$r++;   // 数据从第2行开始
foreach ($data as $day => $events){
   $c = 0;
   $sheet->write($r, $c, $day, $dayFormat);
   if (!$events){
     // 当天没有计划
     $r++;
   } else {
     $startRow = $r;
     foreach ($events as $e){
        $c = 1;
        $sheet->write($r, $c++, $e['time'], $dataFormat);   // 工作表写入数据
        $sheet->write($r, $c++, $e['event'], $dataFormat);   // 工作表写入数据
        $r++;
     }
     // 合并 $day 单元格
     $sheet->mergeCells($startRow, 0, $r - 1, 0);
   }
}
$workbook->close(); // 完成下载
 ?>
PHP 相关文章推荐
利用static实现表格的颜色隔行显示
Oct 09 PHP
增加反向链接的101个方法 站长推荐
Jan 31 PHP
PHP添加MySQL数据记录代码
Jun 07 PHP
PHP 各种排序算法实现代码
Aug 20 PHP
php5.3 废弃函数小结
May 16 PHP
PHP中读写文件实现代码
Oct 20 PHP
使用PHP强制下载PDF文件示例
Jan 17 PHP
php采集内容中带有图片地址的远程图片并保存的方法
Jan 03 PHP
在WordPress中实现发送http请求的相关函数解析
Dec 29 PHP
如何批量清理系统临时文件(语言:C#、 C/C++、 php 、python 、java )
Feb 01 PHP
php获取开始与结束日期之间所有日期的方法
Nov 29 PHP
浅谈PHP中try{}catch{}的使用方法
Dec 09 PHP
Linux系统中为php添加pcntl扩展
Aug 28 #PHP
mac系统下为 php 添加 pcntl 扩展
Aug 28 #PHP
PHP编写简单的App接口
Aug 28 #PHP
PHP导出带样式的Excel示例代码
Aug 28 #PHP
总结对比php中的多种序列化
Aug 28 #PHP
PHP打印输出函数汇总
Aug 28 #PHP
PHP中include/require/include_once/require_once使用心得
Aug 28 #PHP
You might like
PHP+DBM的同学录程序(5)
2006/10/09 PHP
繁体中文转换为简体中文的PHP函数
2006/10/09 PHP
js 中 document.createEvent的用法
2010/08/29 Javascript
ExtJS自定义主题(theme)样式详解
2013/11/18 Javascript
ES6之模版字符串的具体使用
2018/05/17 Javascript
C#程序员入门学习微信小程序的笔记
2019/03/05 Javascript
Vue中消息横向滚动时setInterval清不掉的问题及解决方法
2019/08/23 Javascript
教你如何用Node实现API的转发(某音乐)
2019/09/20 Javascript
vue.js实现左边导航切换右边内容
2019/10/21 Javascript
JavaScript中的函数式编程详解
2020/08/22 Javascript
探索node之事件循环的实现
2020/10/30 Javascript
Python 调用DLL操作抄表机
2009/01/12 Python
举例讲解Python设计模式编程的代理模式与抽象工厂模式
2016/01/16 Python
Python中time模块和datetime模块的用法示例
2016/02/28 Python
Flask框架的学习指南之开发环境搭建
2016/11/20 Python
使用paramiko远程执行命令、下发文件的实例
2017/10/01 Python
python中单例常用的几种实现方法总结
2018/10/13 Python
深入理解Django自定义信号(signals)
2018/10/15 Python
手把手教你如何安装Pycharm(详细图文教程)
2018/11/28 Python
django数据库自动重连的方法实例
2019/07/21 Python
Python requests.post方法中data与json参数区别详解
2020/04/30 Python
基于django micro搭建网站实现加水印功能
2020/05/22 Python
python 多线程共享全局变量的优劣
2020/09/24 Python
如何在pycharm中安装第三方包
2020/10/27 Python
python中的测试框架
2020/11/13 Python
获取邓白氏信用报告:Dun & Bradstreet
2019/01/22 全球购物
白酒业务员岗位职责
2013/12/27 职场文书
交通安全教育制度
2014/02/02 职场文书
机电职业生涯规划书范文
2014/03/08 职场文书
不错的求职信范文
2014/07/20 职场文书
党员专题组织生活会发言材料
2014/10/17 职场文书
2014年党建工作总结
2014/11/11 职场文书
社区元宵节活动总结
2015/02/06 职场文书
详解Python requests模块
2021/06/21 Python
Win11 S Mode版本泄露 正式上线后叫做Windows 11 SE
2021/11/21 数码科技
Java虚拟机内存结构及编码实战分享
2022/04/07 Java/Android