陈涉世家功宜为王的功:[PHP Excel 输出]使用 PHP 输出带格式的 Excel 文件
来源:百度文库 编辑:中财网 时间:2024/04/28 05:07:44
http://bbs.chinaunix.net/viewthread.php?action=printable&tid=745757
标题: [PHP Excel 输出]使用 PHP 输出带格式的 Excel 文件 [打印本页]
作者: rardge 时间: 2006-4-25 22:38 标题: [PHP Excel 输出]使用 PHP 输出带格式的 Excel 文件
工作中的一点心得,拿出来分享一下。
用 PHP 生成 Excel 文件早已不是什么难题了,但若生成的 Excel 文件没有格式(边框线、居中、字体等),其实就是生成文本文件再用 Excel 打开而已。
在 Windows 平台下,可能用 COM 组件可以做到这点,但在 Unix 类系统环境下就没这么幸运了。
首先看一下当时这个新闻吧:
http://bbs.chinaunix.net/viewthread.php?tid=204738&highlight=excel [微软发Office免费许可 开放其XML文件格式]
基本上还是要感谢微软,否则白搭。
我做的也就是使用其 XML 格式。注意:也就是说,这种方法生成的文件可能只对 Office 2003 有效。
至于 Excel 的 XML 格式,各位可以自己仔细研究,新建一个工作簿,然后简单的设置一些单元格,输入一些内容,然后选择另存为,保存类型选择“XML表格”即可。
用文本编辑器打开刚才那个 XML 文件,看看它是怎么描述一个单元格的格式的。它也是用
x:FullRows="1" ss:DefaultColumnWidth="54" ss:DefaultRowHeight="17.25">
不一定要和我上面这个一模一样,以上我经过少许删减,比如我把最后的 段给删掉了。
配套的 PHP 测试程序(excel.php):
[Copy to clipboard] [ - ]CODE: // 实验资料,实际作业中,这里应该是从数据库取得资料
$emps[0][‘id‘] = ‘00001‘;
$emps[0][‘name‘] = ‘ABC‘;
$emps[0][‘sexual‘] = ‘男‘;
$emps[0][‘age‘] = 28;
$emps[1][‘id‘] = ‘00002‘;
$emps[1][‘name‘] = ‘BBC‘;
$emps[1][‘sexual‘] = ‘男‘;
$emps[1][‘age‘] = 23;
$emps[2][‘id‘] = ‘00003‘;
$emps[2][‘name‘] = ‘CBA‘;
$emps[2][‘sexual‘] = ‘女‘;
$emps[2][‘age‘] = 20;
ini_set(‘include_path‘, ‘/data/website/htdocs/includes‘);
require_once(‘class.Smarty.php‘);
$smarty = new mySmarty();
$smarty->assign(‘Emps‘, $emps);
// 输出文件头,表明是要输出 excel 文件
header("Content-type: application/vnd.ms-excel");
header("Content-Disposition: attachment; filename=test.xml"); //<----- 这里,改成 test.xls 也可以,这样就可以直接用 Excel 打开了。不过本质还是 xml,用记事本打开就知道了。所以打开后,再另存一下,存为真正的 xls 格式。
$smarty->display(‘excel.tpl‘);
?>
完工,放到服务器上跑一下吧。
麻烦的地方,就是 Excel 样表转换成 XML 并修改成 Smarty 模板那一步。
我上面那个例子相对来说简单,因为格式比较单一。更复杂点的报表就要麻烦点了,要在模板中一个个单元格自己去放置 StyleID 值了。
不过,总算能输出一份漂亮的带格式的 Excel 了,这点辛苦还是值得的。
[ 本帖最后由 rardge 于 2006-4-25 23:15 编辑 ]
图片附件: [上面那个例子的效果图] 1234567.JPG (2006-4-25 23:15, 29.3 KB) / 该附件被下载次数 19
http://bbs.chinaunix.net/attachment.php?aid=137712
作者: yeff 时间: 2006-4-25 23:01
学习中。。。。。。。。。
作者: imbiss 时间: 2006-4-26 06:35
Template->XML->M$ XSL
不错。
作者: xuzuning 时间: 2006-4-26 10:46
其实你用html+css就可以了
作者: rardge 时间: 2006-4-26 10:56
QUOTE:原帖由 xuzuning 于 2006-4-26 10:46 发表
其实你用html+css就可以了
不好意思,我对 html 和 css 方面不熟。是不是在浏览器页面上显示,然后用 excel 来导入表格啊?
你是不是 CSDN 的 PHP 版版主?
作者: benxixi 时间: 2006-4-26 17:58
我有完全用php在linux下生成Excel2000的代码(生成的是一个二进制代码),
不需要任何控件
效率还可以,生成一个7M左右的Excel表格在40s左右
可以控制到打印/页码/公式/图形/单元格样式/合并/冻结行等
完全可以定制
BTW:不提供免费代码,是为公司做的一个应用
花了我三个星期的时间.
不过可以提供付费代码(以封装成class,可以直接调用)
[ 本帖最后由 benxixi 于 2006-4-26 18:03 编辑 ]
作者: scf2 时间: 2006-5-4 18:59
QUOTE:原帖由 benxixi 于 2006-4-26 17:58 发表
我有完全用php在linux下生成Excel2000的代码(生成的是一个二进制代码),
不需要任何控件
效率还可以,生成一个7M左右的Excel表格在40s左右
可以控制到打印/页码/公式/图形/单元格样式/合并/冻结行等
完全可以定 ...
能不能提供个演示啊
作者: 七星剑客 时间: 2006-5-5 08:07
QUOTE:原帖由 benxixi 于 2006-4-26 17:58 发表
我有完全用php在linux下生成Excel2000的代码(生成的是一个二进制代码),
不需要任何控件
效率还可以,生成一个7M左右的Excel表格在40s左右
可以控制到打印/页码/公式/图形/单元格样式/合并/冻结行等
完全可以定 ...
缺乏共享精神,谴责一个.
作者: benxixi 时间: 2006-5-6 20:57
QUOTE:原帖由 scf2 于 2006-5-4 18:59 发表
能不能提供个演示啊
呵呵
是公司内部产品,
没法提供演示
不过绝对真实
详细情况可以MSN和QQ联系
作者: linuxdotnet 时间: 2006-5-8 14:46
QUOTE:原帖由 benxixi 于 2006-4-26 17:58 发表
我有完全用php在linux下生成Excel2000的代码(生成的是一个二进制代码),
不需要任何控件
效率还可以,生成一个7M左右的Excel表格在40s左右
可以控制到打印/页码/公式/图形/单元格样式/合并/冻结行等
完全可以定 ...
能不能给点提示啊...
作者: james.liu 时间: 2006-5-8 14:56
支持lz.嘿嘿
网上有个在线什么类似excel,,都是js+html+css
可能还有xml+xslt,,我没仔细看
之所以说类似excel,完全是因为长得像。
作者: benxixi 时间: 2006-5-9 10:43
QUOTE:原帖由 linuxdotnet 于 2006-5-8 14:46 发表
能不能给点提示啊...
就是要知道详细的excel格式
excel一般是这样做对应
一个字段记录位置,一个记录允许的长度,一个记录字段实际内容
再把相应的转换成二进制
最后一起生成一个文件即可
一小段
[Copy to clipboard] [ - ]CODE:function _store_colinfo($_)
{
$record = 0x007D; //位置
$length = 0x000B; //允许长度
$colFirst = $_[0] ? $_[0]: 0; //第一列
$colLast = $_[1] ? $_[1]: 0; //最后一列
$width = $_[2] ? $_[2]: 8.43;//列宽
if ($width < 1)
{
$pixels = int($width *12);
}
else
{
$pixels = int($width *7 ) +5;
}
$coldx = int($pixels *256/7);
$grbit = $_[4] || 0;
$reserved = 0x00;
$format = $_[3];
if (isset($_[3]))
{
$ixfe = $format->get_xf_index();
}
else
{
$ixfe = 0x0F;
}
$level = $_[5] || 0;
if ($level < 0)
{
$level = 0;
}
if ($level > 7)
{
$level = 7;
}
$grbit |= $level << 8;
$header = pack("vv", $record, $length);//字段信息
$data = pack("vvvvvC", $colFirst, $colLast, $coldx, $ixfe, $grbit, $reserved);//实际内容
//省略存储代码
}
[ 本帖最后由 benxixi 于 2006-5-9 10:48 编辑 ]
作者: panzt 时间: 2007-12-20 11:00
也可以用php->xml->xslt->excel的纯xml解决办法
作者: dancebear 时间: 2007-12-20 17:49 标题: 回复 #6 benxixi 的帖子
你说的这种代码很久之前网上就有了。一个老外写的。不过没有继续更新了!BUG比较多!使用起来也不太方便
支持单元格颜色字体及公式等。
[ 本帖最后由 dancebear 于 2007-12-20 17:51 编辑 ]
附件: [PHP写execl类库]php_writeexcel-0.3.0.tar.gz (2007-12-20 17:50, 70.75 KB) / 该附件被下载次数 9
http://bbs.chinaunix.net/attachment.php?aid=227089
作者: hahajohn2006 时间: 2007-12-21 21:28
学习中^
作者: enous 时间: 2007-12-21 22:22
不错不错,顶一下.
标题: [PHP Excel 输出]使用 PHP 输出带格式的 Excel 文件 [打印本页]
作者: rardge 时间: 2006-4-25 22:38 标题: [PHP Excel 输出]使用 PHP 输出带格式的 Excel 文件
工作中的一点心得,拿出来分享一下。
用 PHP 生成 Excel 文件早已不是什么难题了,但若生成的 Excel 文件没有格式(边框线、居中、字体等),其实就是生成文本文件再用 Excel 打开而已。
在 Windows 平台下,可能用 COM 组件可以做到这点,但在 Unix 类系统环境下就没这么幸运了。
首先看一下当时这个新闻吧:
http://bbs.chinaunix.net/viewthread.php?tid=204738&highlight=excel [微软发Office免费许可 开放其XML文件格式]
基本上还是要感谢微软,否则白搭。
我做的也就是使用其 XML 格式。注意:也就是说,这种方法生成的文件可能只对 Office 2003 有效。
至于 Excel 的 XML 格式,各位可以自己仔细研究,新建一个工作簿,然后简单的设置一些单元格,输入一些内容,然后选择另存为,保存类型选择“XML表格”即可。
用文本编辑器打开刚才那个 XML 文件,看看它是怎么描述一个单元格的格式的。它也是用
不一定要和我上面这个一模一样,以上我经过少许删减,比如我把最后的
配套的 PHP 测试程序(excel.php):
[Copy to clipboard] [ - ]CODE: // 实验资料,实际作业中,这里应该是从数据库取得资料
$emps[0][‘id‘] = ‘00001‘;
$emps[0][‘name‘] = ‘ABC‘;
$emps[0][‘sexual‘] = ‘男‘;
$emps[0][‘age‘] = 28;
$emps[1][‘id‘] = ‘00002‘;
$emps[1][‘name‘] = ‘BBC‘;
$emps[1][‘sexual‘] = ‘男‘;
$emps[1][‘age‘] = 23;
$emps[2][‘id‘] = ‘00003‘;
$emps[2][‘name‘] = ‘CBA‘;
$emps[2][‘sexual‘] = ‘女‘;
$emps[2][‘age‘] = 20;
ini_set(‘include_path‘, ‘/data/website/htdocs/includes‘);
require_once(‘class.Smarty.php‘);
$smarty = new mySmarty();
$smarty->assign(‘Emps‘, $emps);
// 输出文件头,表明是要输出 excel 文件
header("Content-type: application/vnd.ms-excel");
header("Content-Disposition: attachment; filename=test.xml"); //<----- 这里,改成 test.xls 也可以,这样就可以直接用 Excel 打开了。不过本质还是 xml,用记事本打开就知道了。所以打开后,再另存一下,存为真正的 xls 格式。
$smarty->display(‘excel.tpl‘);
?>
完工,放到服务器上跑一下吧。
麻烦的地方,就是 Excel 样表转换成 XML 并修改成 Smarty 模板那一步。
我上面那个例子相对来说简单,因为格式比较单一。更复杂点的报表就要麻烦点了,要在模板中一个个单元格自己去放置 StyleID 值了。
不过,总算能输出一份漂亮的带格式的 Excel 了,这点辛苦还是值得的。
[ 本帖最后由 rardge 于 2006-4-25 23:15 编辑 ]
图片附件: [上面那个例子的效果图] 1234567.JPG (2006-4-25 23:15, 29.3 KB) / 该附件被下载次数 19
http://bbs.chinaunix.net/attachment.php?aid=137712
作者: yeff 时间: 2006-4-25 23:01
学习中。。。。。。。。。
作者: imbiss 时间: 2006-4-26 06:35
Template->XML->M$ XSL
不错。
作者: xuzuning 时间: 2006-4-26 10:46
其实你用html+css就可以了
作者: rardge 时间: 2006-4-26 10:56
QUOTE:原帖由 xuzuning 于 2006-4-26 10:46 发表
其实你用html+css就可以了
不好意思,我对 html 和 css 方面不熟。是不是在浏览器页面上显示,然后用 excel 来导入表格啊?
你是不是 CSDN 的 PHP 版版主?
作者: benxixi 时间: 2006-4-26 17:58
我有完全用php在linux下生成Excel2000的代码(生成的是一个二进制代码),
不需要任何控件
效率还可以,生成一个7M左右的Excel表格在40s左右
可以控制到打印/页码/公式/图形/单元格样式/合并/冻结行等
完全可以定制
BTW:不提供免费代码,是为公司做的一个应用
花了我三个星期的时间.
不过可以提供付费代码(以封装成class,可以直接调用)
[ 本帖最后由 benxixi 于 2006-4-26 18:03 编辑 ]
作者: scf2 时间: 2006-5-4 18:59
QUOTE:原帖由 benxixi 于 2006-4-26 17:58 发表
我有完全用php在linux下生成Excel2000的代码(生成的是一个二进制代码),
不需要任何控件
效率还可以,生成一个7M左右的Excel表格在40s左右
可以控制到打印/页码/公式/图形/单元格样式/合并/冻结行等
完全可以定 ...
能不能提供个演示啊
作者: 七星剑客 时间: 2006-5-5 08:07
QUOTE:原帖由 benxixi 于 2006-4-26 17:58 发表
我有完全用php在linux下生成Excel2000的代码(生成的是一个二进制代码),
不需要任何控件
效率还可以,生成一个7M左右的Excel表格在40s左右
可以控制到打印/页码/公式/图形/单元格样式/合并/冻结行等
完全可以定 ...
缺乏共享精神,谴责一个.
作者: benxixi 时间: 2006-5-6 20:57
QUOTE:原帖由 scf2 于 2006-5-4 18:59 发表
能不能提供个演示啊
呵呵
是公司内部产品,
没法提供演示
不过绝对真实
详细情况可以MSN和QQ联系
作者: linuxdotnet 时间: 2006-5-8 14:46
QUOTE:原帖由 benxixi 于 2006-4-26 17:58 发表
我有完全用php在linux下生成Excel2000的代码(生成的是一个二进制代码),
不需要任何控件
效率还可以,生成一个7M左右的Excel表格在40s左右
可以控制到打印/页码/公式/图形/单元格样式/合并/冻结行等
完全可以定 ...
能不能给点提示啊...
作者: james.liu 时间: 2006-5-8 14:56
支持lz.嘿嘿
网上有个在线什么类似excel,,都是js+html+css
可能还有xml+xslt,,我没仔细看
之所以说类似excel,完全是因为长得像。
作者: benxixi 时间: 2006-5-9 10:43
QUOTE:原帖由 linuxdotnet 于 2006-5-8 14:46 发表
能不能给点提示啊...
就是要知道详细的excel格式
excel一般是这样做对应
一个字段记录位置,一个记录允许的长度,一个记录字段实际内容
再把相应的转换成二进制
最后一起生成一个文件即可
一小段
[Copy to clipboard] [ - ]CODE:function _store_colinfo($_)
{
$record = 0x007D; //位置
$length = 0x000B; //允许长度
$colFirst = $_[0] ? $_[0]: 0; //第一列
$colLast = $_[1] ? $_[1]: 0; //最后一列
$width = $_[2] ? $_[2]: 8.43;//列宽
if ($width < 1)
{
$pixels = int($width *12);
}
else
{
$pixels = int($width *7 ) +5;
}
$coldx = int($pixels *256/7);
$grbit = $_[4] || 0;
$reserved = 0x00;
$format = $_[3];
if (isset($_[3]))
{
$ixfe = $format->get_xf_index();
}
else
{
$ixfe = 0x0F;
}
$level = $_[5] || 0;
if ($level < 0)
{
$level = 0;
}
if ($level > 7)
{
$level = 7;
}
$grbit |= $level << 8;
$header = pack("vv", $record, $length);//字段信息
$data = pack("vvvvvC", $colFirst, $colLast, $coldx, $ixfe, $grbit, $reserved);//实际内容
//省略存储代码
}
[ 本帖最后由 benxixi 于 2006-5-9 10:48 编辑 ]
作者: panzt 时间: 2007-12-20 11:00
也可以用php->xml->xslt->excel的纯xml解决办法
作者: dancebear 时间: 2007-12-20 17:49 标题: 回复 #6 benxixi 的帖子
你说的这种代码很久之前网上就有了。一个老外写的。不过没有继续更新了!BUG比较多!使用起来也不太方便
支持单元格颜色字体及公式等。
[ 本帖最后由 dancebear 于 2007-12-20 17:51 编辑 ]
附件: [PHP写execl类库]php_writeexcel-0.3.0.tar.gz (2007-12-20 17:50, 70.75 KB) / 该附件被下载次数 9
http://bbs.chinaunix.net/attachment.php?aid=227089
作者: hahajohn2006 时间: 2007-12-21 21:28
学习中^
作者: enous 时间: 2007-12-21 22:22
不错不错,顶一下.
php如何输出excle
php输出表格
php输出表格
php 文章输出问题
在使用PHP建立wap网站时,PHP输出的中文不能显示
php如何控制缓存输出?
php对输出的控制
php语法无错,输出空白
如何使用php文件
php+mysql使用问题
PHP源码的使用
怎么使用.php
php 操作excel的问题!
php使用魔术引号转义的字符如何在输出时候转回来
如何将PHP输出为静态HTML
关于PHP使用access问题
php 能使用access数据库?
PHP的$PHP_SELF使用问题
如何使用php验证代理服务器
php中的时间差如何输出?,这样怎么没有什么输出?
使用PHP开发时使用什么工具?
mysql中存储了sql语语,php怎么输出?
PHP中如何把输出的文字转成UTF-8
怎么定义PHP输出问题字体的大小