使用PHPExcel解决几个新手常见问题

http://blog.sina.com.cn/s/blog_4aacb8d90100azy5.html



最近因为做一个系统要导出Excel,使用pear的Spreadsheet_Excel_Writer没能解决几个问题,具体的问题有:

1.不能实现单元格内换行

2.长的数字会被转换成科学计数法,0开头的数字会被截0,要使它完全显示必须得以 文本格式展示。

3.需要显式设置行高,不然单元格内容较多时,在编辑栏中用鼠标选中(非改变)内容会 导致行高变化,相当不爽。

任务的时限迫使我不能在一颗树上吊死,所以继续寻求另外的库。网上说PHPExcel是最强大的Excel导入导出包,于是决定使用无比风骚(谁用谁知道)的PHPExcel。最初使用时依然无法解决后两个问题,网上搜索,发现都是COPY来COPY去,照做后却无用,一直耿耿于怀,不能总靠别人吧,于是自己仔细的看了部分源代码。(只针对调用PHPExcel_IOFactory::createWriter时参数是$objPHPExcel, 'Excel5',而非$objPHPExcel, 'Excel2007',因为PHPExcel包对Excel5的处理是修改Spreadsheet_Excel_Writer实现的)得出以上问题的解决方法如下,:

1.不需要任何其他的处理,输出内容中的/r/n都会被自动处理为单元格换行。

2.使用Style类的setFormatCode("@")方法,将formatcode设置为"@"符号就能解决,不过在此之前,你需要修改一处PHPExcel的源代码:

Writer/Excel5文件,第202行,

if ($cell->hasHyperlink()) {

 $worksheet->writeUrl($row, $column, str_replace('sheet://', 'internal:', $cell->getHyperlink()->getUrl()), $cell->getValue(), $formats[$styleHash]);

}

else {

 $worksheet->write($row, $column, $cell->getValue(), $formats[$styleHash],$style->getNumberFormat()->getFormatCode());

}

源码在这里处理时,把以0开头的数字串或者很长的数字串当做默认情况来处理,添上 一行代码后为:

if ($cell->hasHyperlink()) {

 $worksheet->writeUrl($row, $column, str_replace('sheet://', 'internal:', $cell->getHyperlink()->getUrl()), $cell->getValue(), $formats[$styleHash]);

}else if($cell->getDataType() == PHPExcel_Cell_DataType::TYPE_STRING ) {

 $worksheet->writeString($row,$column,$cell->getValue(),$formats[$styleHash]);

}

else {

 $worksheet->write($row, $column, $cell->getValue(), $formats[$styleHash],$style->getNumberFormat()->getFormatCode());

}

这里加上了字符串的判断,直接调用writeString,而不由write函数通过正则表达式来 判断是调用writeString还是writeNumber。

另外在自己的代码里向worksheet写入数据时要显示设置单元格的值,调用 setCellValueExplicitByColumnAndRow($columnIndex,$rowIndex,$cell)。

这样做后能就能解决长数字的科学计数法表示和以0开头数字串截0的问题了,相信我没错的。

3.在PHPExcel_Worksheet_ColumnDimension类中有设置列宽的函数,在PHPExcel_Worksheet_RowDimension类中有设置行高的函数,还有什么做不到呢?

?/P>

PHPExcel很强大,很风骚,还在继续研究中。

=================================================================
http://needpack.blog.hexun.com/18967567_d.html

文章来源: http://www.carronedu.com/index.php?option=com_content&task=view&id=79

平常我们用PHP生成EXCEL大都是如下代码:

ob_start();
header("Content-type:application/vnd.ms-excel");
header("Content-Disposition:filename=report.xls");

echo "公司名称/t公司地址/t公司电话";
echo "西部硅谷/t西安市雁塔中路段26号/t029-85512287";
echo "西部硅谷/t西安市雁塔中路段26号/t029-85512287";
echo "西部硅谷/t西安市雁塔中路段26号/t029-85512287";

但如果要在单元格内换行的话,可能不太好弄,一般换行都是/r/n或chr(10).chr(13),如果直接把/r/n或/r/n或chr(10).chr(13)插入到字符串中,并不是在当前单元格内换行,而是另起一行了,这并不是我们想要的效果,如下是解决办法:

ob_start();
header("Content-type:application/vnd.ms-excel");
header("Content-Disposition:filename=report.xls");

echo "公司名称/t公司地址/t公司电话/n";
echo "西部硅谷/t/"西安市雁塔路/r/n中段26号/"/t029-85512287";
echo "西部硅谷/t西安市雁塔路中段26号/t029-85512287";
echo "西部硅谷/t西安市雁塔路中段26号/t029-85512287";

现在看看第二行的效果,单元格内的文字已经换行了!

我们是用双引号把要换行的文字引了起来,这样就可以在文字中换行了。但如果我们的文字中有双引号,那我们怎么才能把双引号和上面引用文字的双引号不起冲突呢?这当然是有办法的,我们要对文字内的双引号进行处理,处理办法如下:

ob_start();
header("Content-type:application/vnd.ms-excel");
header("Content-Disposition:filename=report.xls");

echo "/"/"/"我被双引号括引来了/"/"/r/n我换行了/"/t我没有被引号括起来";

双引号(")要处理成两个双引号(""),在PHP中要单独对双引号转义,PHP中的转义符是(/)。引号比较多,但都有意义的,不能少一个。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值