- 铜板
- 187
- 金币
- 0
- 在线时间
- 72 小时
- 注册时间
- 2004-9-17
- 帖子
- 511

- 铜板
- 187
- 金币
- 0
- 在线时间
- 72 小时
- 注册时间
- 2004-9-17
- 帖子
- 511
|

PHP利用Spreadsheet_Excel_Writer输出多SHEET EXCEL表
<H4 class=TextColor1 id=subjcns!820CAFC159F45D65!141 style="MARGIN-BOTTOM: 0px"> HP利用Spreadsheet_Excel_Writer输出多SHEET EXCEL表</H4>< ><FONT size=3>公司制作数据报表需要按合作伙伴名分SHEET来制作数据报表以前用过DELPHI来输出EXCEL数据.DELPHI处理EXCEL是通过COM或者OLE来处理的,当数据量很大的时候效果不是太理想,而且还要求系统必须安装过OFFICE软件.考虑到输出效率问题,想寻求一个高效的解决方法,于是再网上搜索PHP下的输出类.无意中发现PEAR下的Spreadsheet_Excel_Writer包好象不错,它是完全从EXCEL文件格式出发,不依赖与OFFICE软件的,在LINUX下也能输出正统的XLS格式文件.于是迅速配置PEAR本地环境,在线安装了Spreadsheet_Excel_Writer支持包及其OLE依赖包配置完后,利用网PEAR手册中的示例代码测试了一下环境,一切OK,正常输出EXCEL文件了下面贴出我写的处理EXCEL输出的代码,大家共享一下:</FONT></P>< ><FONT color=#ee1111><?php</FONT><FONT color=#ff0000><BR></FONT><FONT color=#3cc43c size=3>require_once("Spreadsheet/Excel/Writer.php");<BR>function txt2xls($arr,$fxls,$type=0){<BR> $time1=microtime_float();<BR> if ($type==0){//第三个参数为0则下载EXCEL文件,不为0则保存EXCEL在服务器上。<BR> $workbook = new Spreadsheet_Excel_Writer();<BR> $workbook->send($fxls);<BR> }else{<BR> $workbook = new Spreadsheet_Excel_Writer($fxls);<BR> }<BR> $format=& $workbook->addFormat(array('size' => 10));<BR> $index=array();<BR> for($i=0;$i<count($arr);$i++){//循环处理数组,处理每一行数据<BR> //每一行先判断合作伙伴,然后查找该合作伙伴的SHEET表,再写入数据。<BR> $arr_temp=explode(',',$arr[$i]);//数据格式:2006-11-01,辽一网,liao1_com_pcode1,510,sdq,vip<BR> $vipname=strtoupper($arr_temp[1]);//$arr_temp[1]为合作伙伴<BR> $index[$vipname][$arr_temp[2]]=$arr_temp[2];//建立标识索引,为了数据完整,这里只好牺牲一下性能了<BR> $exp=explode('|',$temp[$vipname][$arr_temp[0]][$arr_temp[2]]);<BR> if (trim($vipname)!='')<BR> $temp[$vipname][$arr_temp[0]][$arr_temp[2]]=strval($exp[0]+$arr_temp[3])."|".$arr_temp[4]; <BR> } <BR> //print_r($temp);<BR> while(list($vipname,$data)=each($temp)){//处理每一个sheet数据<BR> //echo $vipname."=";print_r($date);echo "<br>";<BR> $arr_sheet=$workbook->_parser->_ext_sheets;//返回所有的SHEET名数组 <BR> if (!isset($arr_sheet[$vipname])){//如果没添加过SHEET<BR> $worksheet=&$workbook->addWorksheet($vipname);<BR> }else{//已经添加过<BR> $worksheets=$workbook->sheets();<BR> $worksheet=&$worksheets[($arr_sheet[$vipname])];<BR> $worksheet->activate();<BR> }<BR> $worksheet->writeString(0,0,"日期",$format);<BR> $worksheet->writeString(0,1,"总计",$format);<BR> $i=0;<BR> while(list($date,$arr_sid)=each($data)){<BR> $i++;<BR> $worksheet->writeString($i,0,$date,$format);//处理1+$i行<BR> $j=0;<BR> $total=0;<BR> $temarr=$index[$vipname];<BR> while (list($idx,$sid)=each($temarr)){<BR> $j++;<BR> $complex=$arr_sid[$sid];<BR> $num=explode('|',$complex);//1+$i行开始写数据 <BR> $worksheet->writeString(0,1+$j,$sid,$format);//写入标识<BR> //$worksheet->writeString(0,1+$j,$num[1],$format);//写入作者<BR> $worksheet->writeNumber($i,1+$j,$num[0],$format);//写入数据<BR> $total+=$num[0]; <BR> }<BR> $worksheet->writeNumber($i,1,$total,$format);//写入总数<BR> }<BR> //$worksheet->setColumn(0,1+$j,14); <BR> }<BR> $workbook->close();<BR> $time2=microtime_float();<BR> return $time2-$time1;<BR>}<BR>function microtime_float()<BR>{<BR> list($usec, $sec) = explode(" ", microtime());<BR> return ((float)$usec + (float)$sec);<BR>}</FONT><FONT color=#ff0000>?></FONT></P>< ><FONT color=#000000 size=3>函数txt2xls($arr,$fxls,$type) $arr里书要处理的数据,格式为"日期,合作伙伴名,标识,值,作者"数组.</FONT><FONT size=3>$fxls是要输出的EXCEL的文件名,$type为0则自动下载,$type为1则自动保存在服务器上.函数返回结果是处理所需要的时间.单位为秒:</FONT></P>< ><FONT size=3>DEMO:<A href="http://mahuzi.com/demo/log2xls.php"><FONT color=#4d99d3>http://mahuzi.com/demo/log2xls.php</FONT></A></FONT><FONT size=3></FONT></P>< ><FONT size=3>完整代码:<A href="http://mahuzi.com/demo/log2xls.zip"><FONT color=#4d99d3>http://mahuzi.com/demo/log2xls.zip</FONT></A></FONT></P>< > </P><p>[此帖子已被 麻虎子 在 2006-12-4 23:02:39 编辑过] |
|