【php】PHPExcel要点解析
2012-11-28 17:10
260 查看
我们在网站开发中经常都会用到PHP,来帮助我们实现许多功能需求。在处理数据库时,通常都会使用PHPExcel,那么在实际使用中又会出现各种问题,值得我们去深入研究。
轻松掌握PHP函数eval()应用技巧
深入探讨PHP下拉框选择的实现方法
PHP关键字this指向当前对象指针
PHP self关键字指向类静态变量
PHP parent调用父类构造函数
以前准备做一个PHP将excel导入mysql数据库的通用程序,基本完成之后就没有管它了。上个月,教务处老师叫我帮忙做一个“国家等级考试报名查询系统”,也需要将学生excel信息导入导出,照片zip压缩导入导出。
上一周刚完成这个程序,虽然用java这样的语言处理比较简单,不过PHP增加这个功能却是5.2以上的版本才能够完成(需要新增的PHP_zip扩展)。毕竟一个月的接触,也略微懂了一些最基础的用法,也遇到了一起才起手很容易碰到的问题,网上关于这个介绍比较简略,我想具体的介绍一下它的基本用法和可能遇到的基本问题。
首先,你需要打开PHP_zip扩展,找到你起作用的PHP.INI文件,并打开这个扩展,将PHP文件夹里面的ext文件夹中的PHP_zip.dll文件找到,并复制到system32系统文件夹中(具体要看你的配置方法)。
网上最多的问题就是使用PHPExcel的时候,没有打开这个扩展。就会显示诸如<Fatal error:Class 'ZipArchive' not found in …..的错误,就是这个原因。然后,就可以使用它了,最好的办法是看它自带的test示例文档,就可以大概知道它的基本用法,当然看完自带的test示例文档后,这篇文章也可能对你整体理解有一定好处。
下面我只想说说一些需要注意和容易错的地方。
1.使用PHPExcel创建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.使用PHPExcel关于长数字被转换成科学计数法的问题。
并且最后几位被忽略为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.使用PHPExcel如何得到excel的列数和行数?
往往开始使用PHPexcel会觉得不好用的地方也是如此,因为它的test示例程序也没有给出这个。以下是我在codeplex问的问题以及解答。大家看了也就知道了(帖子后面图片)。
5.使用PHPExcel如何通过循环得到每一个单元格的值。
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.使用PHPExcel关于数据库和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';解决的,就能读出乱码了,之后可以通过转换编码解决。
轻松掌握PHP函数eval()应用技巧
深入探讨PHP下拉框选择的实现方法
PHP关键字this指向当前对象指针
PHP self关键字指向类静态变量
PHP parent调用父类构造函数
以前准备做一个PHP将excel导入mysql数据库的通用程序,基本完成之后就没有管它了。上个月,教务处老师叫我帮忙做一个“国家等级考试报名查询系统”,也需要将学生excel信息导入导出,照片zip压缩导入导出。
上一周刚完成这个程序,虽然用java这样的语言处理比较简单,不过PHP增加这个功能却是5.2以上的版本才能够完成(需要新增的PHP_zip扩展)。毕竟一个月的接触,也略微懂了一些最基础的用法,也遇到了一起才起手很容易碰到的问题,网上关于这个介绍比较简略,我想具体的介绍一下它的基本用法和可能遇到的基本问题。
首先,你需要打开PHP_zip扩展,找到你起作用的PHP.INI文件,并打开这个扩展,将PHP文件夹里面的ext文件夹中的PHP_zip.dll文件找到,并复制到system32系统文件夹中(具体要看你的配置方法)。
网上最多的问题就是使用PHPExcel的时候,没有打开这个扩展。就会显示诸如<Fatal error:Class 'ZipArchive' not found in …..的错误,就是这个原因。然后,就可以使用它了,最好的办法是看它自带的test示例文档,就可以大概知道它的基本用法,当然看完自带的test示例文档后,这篇文章也可能对你整体理解有一定好处。
下面我只想说说一些需要注意和容易错的地方。
1.使用PHPExcel创建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.使用PHPExcel关于长数字被转换成科学计数法的问题。
并且最后几位被忽略为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.使用PHPExcel如何得到excel的列数和行数?
往往开始使用PHPexcel会觉得不好用的地方也是如此,因为它的test示例程序也没有给出这个。以下是我在codeplex问的问题以及解答。大家看了也就知道了(帖子后面图片)。
5.使用PHPExcel如何通过循环得到每一个单元格的值。
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.使用PHPExcel关于数据库和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';解决的,就能读出乱码了,之后可以通过转换编码解决。
相关文章推荐
- 【phpexcel】PHPExcel要点解析
- 解析PHPExcel使用的常用说明以及把PHPExcel整合进CI框架的介绍
- php/thinkphp使用PHPExcel解析表格数据,生成表格案例
- 解析PHPExcel使用的常用说明以及把PHPExcel整合进CI框架的介绍
- 使用phpexcel解析Excel数据表并存储到数据库中全过程_PHP_thinkphp_cmf
- 使用PHPExcel要点解析
- 使用phpexcel解析Excel数据表并存储到数据库中全过程_PHP_thinkphp_cmf
- 10-4 11 禁止某个目录解析PHP 限制user_agent php相关配置
- 利用phpExcel实现Excel数据的导入导出(全步骤详细解析)
- PHP获取当前url的具体方法全面解析
- CGI、FastCGI、PHP-CGI、PHP-FPM、Spawn-FCGI解析
- PHP_解析xss攻击、sql注入
- Nginx更改PHP解析后缀
- php 解析XML的几种方式
- day 50 Nginx访问控制与php解析
- android解析php输出的json格式字符串实例
- 解析PHP中$_FILES的使用以及注意事项
- 深入解析php之sphinx
- [php] 解析JSON字符串
- PHP 编程效率提升要点