phpexcel常见问题的解决办法

时间:2022-02-28 19:42:17

首先,你需要打开php_zip扩展,找到你起作用的PHP.INI文件,并打开这个扩展,将php文件夹里面的ext文件夹中的php_zip.dll文件找到,并复制到system32系统文件夹中(具体要看你的配置方法)。网上最多的问题就是使用phpexcel的时候,没有打开这个扩展。就会显示诸如<Fatal error:Class ‘ZipArchive’ not found in …..的错误,就是这个原因。然后,就可以使用它了,最好的办法是看 它自带的test示例文档,就可以大概知 道它的基本用法,当然看完自带的test示 例文档后,这篇文章也可能对你整体理解有一定好处。http://www.zeali.net/entry/556
 下 面我只想说说一些需要注意和容易错的地方。
1.创建excel文档对象有2种。

一 种是直接创建
include ‘PHPExcel/Writer/Excel2007.php’;
$objPHPExcel = new PHPExcel();
另外一种是通过reader类进行读取创建
require ‘PHPExcel/Reader/Excel2007.php’;
$objReader = new PHPExcel_Reader_Excel2007;
$objPHPExcel = $objReader->load(“mytest.xlsx”);
我这里想说明的是,这里包含excel2007.php,就是 创建的xlsx类型的excel,也就是ms office2007打开的,如果要创建以前的xls的话(office2007以前版本),就需要包含excel5.php,而不是 excel2007,不管是reader类还是writer类,这个要注意。比如上面 说的2种用法就应该直接创建:
include ‘PHPExcel/Writer/Excel5.php’;
$objPHPExcel = new PHPExcel();
通过reader类进行读取创建
require ‘PHPExcel/Reader/Excel5.php’;
$objReader = new PHPExcel_Reader_Excel5;
$objPHPExcel = $objReader->load(“mytest.xlsx”);

2.看了phpexcel给出的文档之后很有可能问,我就是想读取excel的一个单元格的值,怎么没有给出怎么读呢?

这个开始我也遇到过,你可以这样
$sheet = $objPHPExcel->getActiveSheet();
$string = $sheet->getCell(‘F2′)->getValue();
当然,这个一般情况下也是能用了,如果你的excel是公式,你就应该
$sheet = $objPHPExcel->getActiveSheet();
$string = $sheet->getCell(‘F2′)-> getCalculatedValue();

3.关于长数字被转换成科学计数法的问题。

并且最后几位被忽略为0,这个问题困扰了我很久,就是比如身份证,学号这样的数字,如果 你直接setValue的话,出来的excel被自动转换成科学计数法,网上本来这样的资料少,而且我发现大多数还是错的。我查到了一篇文档,是通过改动 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());
}
改为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());} 然后写入excel的时候通过以文本格式写入就可以了(不修改源代码以文本格式写入也是科学技术法)$objPHPExcel->getActiveSheet()->setCellValueExplicit($letters_arr[$j+1] . ($i+1),$this->student_info[$i][$j],PHPExcel_Cell_DataType::TYPE_STRING);
$objPHPExcel->getActiveSheet()->getStyle($letters_arr[$j+1] . ($i+1))->getNumberFormat()->setFormatCode(“@”);
4.如何得到excel的列数和 行数?

往往开始使用phpexcel会觉得不好用的地方也是如此,因为它的test示例程序也没有给出这个。以下是我在codeplex 问的问题以及解答。大家看了也就知道了(帖子后面图片)。
5.如何通过循环得到每一个单元格的值。

ObjPhpExcel这个对象你print_r输出会看到很多复杂的东西,其实通过自 带的方法会很简单。我是采用这样的方法。$letters_arr = array(1=>’A',2=>’B',3=>’C',4=>’D',5=>’E',6=>’F',7=>’G',8=>’H',9=>’I',10=>’J',11=>’K',12=>’L',13=>’M', 14=>’N',15=>’O',16=>’P',17=>’Q',18=>’R',19=>’S',20=>’T',21=>’U',22=>’V',23=>’W',24=>’X',25=>’Y',26=>’Z');通过设置一个字符的数组,就可以用循环变量循环列数了。这里我还出了 个小笑话,以前我居然想通过A字符转换为ASC码来循环,未果,我翻了一下php的书才知道php转换字符成整形和C,C++不是一样的,真是基础不扎实 啊。
6.关于数据库和excel的编码问题。

这个也需要大家注 意,excel是采用的UTF-8编码,于是你每次从数据库读出数据后,应该不要忘了转换一次。
$this->student_info[$i][$j]=iconv(“gbk”,”UTF-8″,$this->student_info[$i][$j]);但是记住,问题却没有这样简单,当你用phpexcel从excel读取数据的时候,可能会发 现居然有汉字的列会没有读出来,是空的。用print_r打印出来一看,那个单元格也是空的,这个并不是转换编码问题,因为如果是编码,应该打印出乱码,这个却是phpexcel没有读出那一列的汉字。 这个问题我也不是太明白,我打开reader的excel5.php文件把$this->_defaultEncoding = ‘isoXXXXX’;改为$this->_defaultEncoding = ‘UTF-8′;解决的,就能读出乱码了,之后可以通过转换编码解决。我 在官方网站问了也未果,大家有更好的方法也可以跟我说说,谢谢。

转载本站文章请注明,转载自:法月博客博客 – http://www.zhangpingyong.com/