zoukankan      html  css  js  c++  java
  • phpexcel常见问题的解决办法

    首先,你需要打开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/

    转载保留链接

  • 相关阅读:
    疫情环境下的网络学习笔记 python 5.8 数据库入门终章
    疫情环境下的网络学习笔记 python 5.7 navicat数据库,例题,sql注入
    疫情环境下的网络学习笔记 python 5.6 暂时看看
    疫情环境下的网络学习笔记 python 5.5 MYSql 表关系,外键
    疫情环境下的网络学习笔记 python 5.4 数据库基础
    疫情环境下的网络学习笔记 python 4.30 初识数据库
    疫情环境下的网络学习笔记 python 4.29 网络小项目
    XJOI 夏令营501-511测试11 游戏
    XJOI 夏令营501-511测试11 统计方案
    CF1197D Yet Another Subarray Problem
  • 原文地址:https://www.cnblogs.com/xwblog/p/1971886.html
Copyright © 2011-2022 走看看