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 相关文章推荐
php jquery 实现新闻标签分类与无刷新分页
Dec 18 PHP
phpMyadmin 用户权限中英对照
Apr 02 PHP
PHP+Mysql树型结构(无限分类)数据库设计的2种方式实例
Jul 15 PHP
ThinkPHP做文字水印时提示call an undefined function exif_imagetype()解决方法
Oct 30 PHP
THINKPHP项目开发中的日志记录实例分析
Dec 01 PHP
彻底删除thinkphp3.1案例blog标签的方法
Dec 05 PHP
php获取从html表单传递数组的方法
Mar 20 PHP
PHP基于文件存储实现缓存的方法
Jul 20 PHP
PHP 中使用ajax时一些常见错误总结整理
Feb 27 PHP
php封装json通信接口详解及实例
Mar 07 PHP
php中青蛙跳台阶的问题解决方法
Oct 14 PHP
PHP错误提示It is not safe to rely on the system……的解决方法
Mar 25 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
特详细的PHPMYADMIN简明安装教程
2008/08/01 PHP
PHP中防止直接访问或查看或下载config.php文件的方法
2012/07/07 PHP
提高PHP编程效率的方法
2013/11/07 PHP
Yii框架引用插件和ckeditor中body与P标签去除的方法
2017/01/19 PHP
swoole和websocket简单聊天室开发
2017/11/18 PHP
jQuery中setTimeout的几种使用方法小结
2013/04/07 Javascript
js中关于一个分号的崩溃示例
2013/11/11 Javascript
js实现window.open不被拦截的解决方法汇总
2014/10/30 Javascript
分享javascript计算时间差的示例代码
2020/03/19 Javascript
js图片轮播手动切换特效
2017/01/12 Javascript
codeMirror插件使用讲解
2017/01/16 Javascript
js与jQuery实现的用户注册协议倒计时功能实例【三种方法】
2017/11/09 jQuery
关于Vue在ie10下空白页的debug小结
2018/05/02 Javascript
vue+axios+promise实际开发用法详解
2018/10/15 Javascript
如何用Node写页面爬虫的工具集
2018/10/26 Javascript
vue cli3.0 引入eslint 结合vscode使用
2019/05/27 Javascript
Javascript和jquery在selenium的使用过程
2019/10/31 jQuery
vue+element-ui JYAdmin后台管理系统模板解析
2020/07/28 Javascript
Python 元组(Tuple)操作详解
2014/03/11 Python
零基础写python爬虫之抓取百度贴吧代码分享
2014/11/06 Python
Python中getpass模块无回显输入源码解析
2018/01/11 Python
将python文件打包exe独立运行程序方法详解
2020/02/12 Python
重写django的model下的objects模型管理器方式
2020/05/15 Python
python中逻辑与或(and、or)和按位与或异或(&amp;、|、^)区别
2020/08/05 Python
塑料制成的可水洗的编织平底鞋和鞋子:Rothy’s
2018/09/16 全球购物
Footshop法国:购买运动鞋
2020/01/19 全球购物
中学家长会邀请函
2014/01/17 职场文书
公务员保密承诺书
2014/03/27 职场文书
《春天来了》教学反思
2014/04/07 职场文书
公务员政审单位鉴定材料
2014/05/16 职场文书
关于国庆节的广播稿
2015/08/19 职场文书
优秀党员主要事迹范文
2015/11/05 职场文书
2016思想纪律作风整顿心得体会
2016/01/23 职场文书
2016年暑期社会实践活动总结报告
2016/04/06 职场文书
酒店工程部的岗位职责汇总大全
2019/10/23 职场文书
Java循环队列与非循环队列的区别总结
2021/06/22 Java/Android