猫薰雲 发表于 2016-2-3 16:09:57

CI框架中如何使用PHPExcel导出表格

最新在研究PHPExcel,在本地文件已经可以实现导出功能,但是将PHPExcel整合至CI时报错:不能重新定义Iofactory class
A PHP Error was encounteredSeverity: Compile Error
Message: Cannot redeclare class Iofactory
Filename: PHPExcel/Iofactory.php
Line Number: 46
Backtrace:

但不知如何修改,我是这样安装PHPExcel的:
1) 解压压缩包里的Classes文件夹中的内容到application\libraries\目录下,目录结构如下:
-- application\libraries\PHPExcel.php
-- application\libraries\PHPExcel (文件夹)
2)修改application\libraries\PHPExcel\IOFactory.php 文件
--将其文件名改为Iofactory.php
-- 将其类名从PHPExcel_IOFactory改为Iofactory。
-- 将其构造函数改为public

请问各位还需修改那处,或哪里修改有问题么?



jadexo 发表于 2017-4-18 18:02:01

1.简单除暴的方法就是直接
include() 到你要执行代码的控制器里。

2.优雅一点方案(我是这么认为,毕竟这个是我自己写的方案):

2.1.创建两个libraries库
libraries/Excel.php
libraries/Excelread.php

2.2.在这两个库里做include然后再

libraries/Excel.php
这个文件主要用于写、创建操作


<?php if(!defined('BASEPATH')) exit('No direct script access allowed');

require('PHPExcel.php');

class Excel extends PHPExcel{

}



libraries/Excelread.php
这个主要用户读操作

<?php if(!defined('BASEPATH')) exit('No direct script access allowed');

require('PHPExcel.php');
require('PHPExcel/IOFactory.php');
class Excelread extends PHPExcel_IOFactory{

    private $OBJExcel;
    private $SHEET;

    public $data;
    public $dateFeild;

    function __construct(){
      $this->data = array();
    }

    /**
   * 初始化当前XLS文件读取,并选择需要读取SHEET索引
   * @param int $sheet
   * @throws PHPExcel_Exception
   */
    function init($File,$sheet = 0){
      $this->OBJExcel = PHPExcel_IOFactory::load($File);
      $this->SHEET = $this->OBJExcel->getSheet($sheet);
    }

    /**
   * 如果需要指定某一个sheet那么直接使用该方法并传入索引
   * @param $sheet
   */
    function sheet($sheet){
      $this->data = array();//初始化数据存储对象
      $this->SHEET = $this->OBJExcel->getSheet($sheet);
    }

    /**
   * 构造读取的SHEET中的数据,并转为数组形式
   * @param int $oneRow 从第几行开始作为起始行
   * @param bool $showFeild 是否将第一行作为字段名称,默认为false
   * @throws PHPExcel_Exception
   */
    function ExcelData($oneRow = 0,$showFeild = false,$dateFlag = false){
      $this->data = array();//每次获取需要重新初始化一次
      //获取行数与列数,注意列数需要转换
      $highestRowNum = $this->SHEET->getHighestRow();
      $highestColumn = $this->SHEET->getHighestColumn();
      $highestColumnNum = PHPExcel_Cell::columnIndexFromString($highestColumn);

      $filed = array();

      for ($i = $oneRow; $i < $highestColumnNum; $i++) {
            $CellName = PHPExcel_Cell::stringFromColumnIndex($i) . "1";
            $CellVal = $this->SHEET->getCell($CellName)->getValue();
            $filed[] = $CellVal;
      }

      //开始取出数据并存入数组
      $i = $oneRow + 1;
      for($i = $i;$i<=$highestRowNum;$i++){//ignore row 1
            $row = array();
            for($j=0; $j<$highestColumnNum;$j++){
                $cellName = PHPExcel_Cell::stringFromColumnIndex($j).$i;
                $cellVal = $this->SHEET->getCell($cellName)->getValue();
                if($this->isDateValue($j) && $cellVal){//该CELL是否为日期数据
                  $cellVal = gmdate("Y-m-d",PHPExcel_Shared_Date::ExcelToPHP($cellVal));
                }

                if($showFeild){
                  $row[ $filed[$j] ] = $cellVal;
                }else{
                  $row[] = $cellVal;
                }

            }
            $this->data []= $row;
      }
    }

    function isDateValue($CELL){
      $rs = false;
      foreach($this->dateFeild as $ROW){
            if($CELL == intval($ROW)){
                $rs = true;
                break;
            }
      }

      return $rs;
    }
}



这样就可以通过

$this->load-> libraries("excel");
$this->load-> libraries("excelread");


2.3.应用范例

一段使用的代码片段:


      $this->load->library("excel");
      $objExcel = new Excel();
      $objWriter = new PHPExcel_Writer_Excel5($objExcel);

      //绘制表格边框 - 针对单个表格
      $DrawBorder = array(
            'borders' => array (
                'outline' => array (
                  'style' => PHPExcel_Style_Border::BORDER_THIN,//设置border样式
                  //'style' => PHPExcel_Style_Border::BORDER_THICK, 另一种样式
                  'color' => array ('argb' => '#000000')    //设置border颜色
                )
            )
      );


      //设置文档基本属性.因为平台的编码的缘故该处不能使用,使用了也会导致乱码
      $objProps = $objExcel->getProperties();
      $objProps->setCreator("MOM");//作者
      $objProps->setLastModifiedBy("MOM");//最后一次保存者
      $objProps->setTitle("MOM The Worktimes for Pro");//标题
      $objProps->setSubject("MOM The Worktimes for Pro");//主题


      ......


到了这部你就是phpexcel的相关操作了。

猫薰雲 发表于 2016-2-3 16:10:49

忘了贴了,控制器中的调用语句:
$this->load->library('PHPExcel');
$this->load->library('PHPExcel/Iofactory');

Hex 发表于 2017-4-17 10:30:37

扛着大炮的佬宝 发表于 2017-4-16 19:04
我也有个这个问题。楼主怎么解决呀

直接 include 不应该有问题

猫薰雲 发表于 2016-2-6 20:43:17

顶一顶,等待大神解答。

木浪——hd 发表于 2016-3-17 16:57:34

直接include文件,应该可以吧:lol

921025 发表于 2016-3-17 18:07:57

建议您看一下这个:
http://codeigniter.org.cn/forums/thread-17590-1-1.html
不知道你能否用得上。

suxiaolu 发表于 2016-3-17 20:18:22

load这个:PHPExcel.php

活在城市的边缘 发表于 2016-5-5 18:29:06

大神,你的功能写好了么?能不能给小弟源码膜拜膜拜!之前也没写过

xiaonniqiu2015 发表于 2016-5-6 09:28:07

:lol:lol:lol:lol:lol

gl36 发表于 2016-5-6 17:06:32

把网上的导出例子加入,把数据进行循环遍历就可以导出来数据来,由于没有之前的代码了,就不贴了

扛着大炮的佬宝 发表于 2017-4-16 19:04:59

我也有个这个问题。楼主怎么解决呀
页: [1] 2
查看完整版本: CI框架中如何使用PHPExcel导出表格