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中的转义符是(/)。引号比较多,但都有意义的,不能少一个。