用户
 找回密码
 入住 CI 中国社区
搜索
查看: 12914|回复: 11
收起左侧

[已解决] CI框架中如何使用PHPExcel导出表格

[复制链接]
发表于 2016-2-3 16:09:57 | 显示全部楼层 |阅读模式
最新在研究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

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



发表于 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复制代码
 
<?php if(!defined('BASEPATH')) exit('No direct script access allowed');
 
require('PHPExcel.php');
 
class Excel extends PHPExcel{
 
}
 
 
复制代码


libraries/Excelread.php
这个主要用户读操作
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;
    }
}
 
 
复制代码


这样就可以通过
PHP复制代码
 
$this->load->[font=-apple-system, BlinkMacSystemFont, &quot] libraries("excel");[/font]
$this->load->[font=-apple-system, BlinkMacSystemFont, &quot] libraries("e
xcelread");[/font]
 
复制代码


2.3.应用范例

一段使用的代码片段:
PHP复制代码
 
 
        $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的相关操作了。

评分

参与人数 1威望 +5 收起 理由
Hex + 5 赞一个!

查看全部评分

 楼主| 发表于 2016-2-3 16:10:49 | 显示全部楼层
忘了贴了,控制器中的调用语句:
$this->load->library('PHPExcel');
$this->load->library('PHPExcel/Iofactory');
发表于 2017-4-17 10:30:37 | 显示全部楼层
扛着大炮的佬宝 发表于 2017-4-16 19:04
我也有个这个问题。楼主怎么解决呀

直接 include 不应该有问题
 楼主| 发表于 2016-2-6 20:43:17 | 显示全部楼层
顶一顶,等待大神解答。
发表于 2016-3-17 16:57:34 | 显示全部楼层
直接include文件,应该可以吧
发表于 2016-3-17 18:07:57 | 显示全部楼层
建议您看一下这个:
http://codeigniter.org.cn/forums/thread-17590-1-1.html
不知道你能否用得上。
发表于 2016-3-17 20:18:22 | 显示全部楼层
load这个:PHPExcel.php
发表于 2016-5-5 18:29:06 | 显示全部楼层
大神,你的功能写好了么?能不能给小弟源码膜拜膜拜!之前也没写过
发表于 2016-5-6 17:06:32 | 显示全部楼层
把网上的导出例子加入,把数据进行循环遍历就可以导出来数据来,由于没有之前的代码了,就不贴了
发表于 2017-4-16 19:04:59 | 显示全部楼层
我也有个这个问题。楼主怎么解决呀

本版积分规则