CodeIgniter with PHPExcel fatal error cannot redec

2019-03-02 17:01发布

问题:

I'm trying to use PHPExcel with CodeIgniter.

My problem is when i want to use this method below, I got PHP Fatal Error : Cannot redeclare class IOFactory

If you're uncertain of the filetype, you can use the IO Factory's identify() method to identify the reader that you need, before using the createReader() method to instantiate the reader object.

Below is my code:

$this->load->library('PHPExcel');

$this->load->library('PHPExcel/IOFactory');

$path = $upload_data['full_path'];

$inputFileType = PHPExcel_IOFactory::identify($path);

$objReader = PHPExcel_IOFactory::createReader($inputFileType);

$objPHPExcel = $objReader->load($path);

$objWorksheet = $objPHPExcel->getActiveSheet();

I try to find if the IOFactory class already created somewhere but cannot find it.

FYI, im using the latest version of CodeIgniter (2.1) and PHPExcel (1.7.6) at this time of writing.

回答1:

No need to write

$this->load->library('PHPExcel');

Just start with

$this->load->library('PHPExcel/IOFactory');

Edited :::

In my project I have done by these way,

Step1: in libraries\PHPExcel\Reader

Rename Excel5.php to PHPExcel_Reader_Excel5.php

Step2:

$filePath = $dir.$uploadedfile;
$objReader = $this->load->library('PHPExcel/Reader/PHPExcel_Reader_Excel5', $filePath);
$objReader = new PHPExcel_Reader_Excel5();
$objPHPExcel = $objReader->load($filePath);     
$rowIterator = $objPHPExcel->getActiveSheet()->getRowIterator();                        
$sheet = $objPHPExcel->getActiveSheet();
$maxRowIndex = $sheet->getHighestRow();
$highestColumn = $sheet->getHighestColumn();
$maxColIndex = PHPExcel_Cell::columnIndexFromString($highestColumn);


回答2:

all

I am using PHPExcel to upload data from Excel in Mysql with CI and grocery_CRUD. This is my way:

// My Excel CI Lib

<?php

if (!defined('BASEPATH'))     exit('No direct script access allowed');
require_once APPPATH . "/third_party/PHPExcel/IOFactory.php";
/*
 * PHPExcel Lib For CI
 *
 * Class Excel
 *
 * Using PHP Excel Class
 */
class Lib_excel extends PHPExcel_IOFactory {
    public function __construct() {
    }
}
?>

//My Excel CI Model

<?php
// My CI Model for handling all Excel methods
if (!defined('BASEPATH'))     exit('No direct script access allowed');
// Class Model extend with CI Model
class Mod_excel extends CI_Model {
    function __construct() {
        // Call the Model constructor
        parent::__construct();
    }
    /**
     * Read data from Excel file
     * 

     * @input string $excelFileName
     * @input string $columnName (starting column point)
     * @input string $startRow (starting column point)
     * @return array $cellValues
     *
     * @example code
     *  $excelFileName = $_FILES['uploadedfile']['tmp_name'];
     *  $columnName = 'B';
     *  $startRow = '2';
     *  $cellValues = readWithExcel($excelFileName, $columnName, $startRow);
     *  $iterator = new RecursiveIteratorIterator(new RecursiveArrayIterator($cellValues));
     *  foreach($iterator as $value) {
     *      $insert_data[] = $value;
     *  }
     */
    function readWithExcel($excelFileName, $columnName, $startRow) {
        //load our new Lib Excel library as object excel
        $this->load->library('Lib_excel', null, 'excel');
        // load excel file
        $objPHPExcel  = $this->excel->load($excelFileName);
        // get active sheets
        $objWorksheet = $objPHPExcel->getActiveSheet();
        // get highest row column
        $lastRow      = $objWorksheet->getHighestRow();
        // check cell value empty or not
        for ($i = $startRow; $i < $lastRow; $i++) {
            $colB = $objPHPExcel->getActiveSheet()->getCell($columnName . $i)->getValue();
            if ($colB == NULL || $colB == '') {
                die('The Cell' . ' <strong>B' . $i . '</strong> is empty. Please, remove or fill with data');
            }
        }
        // get excel data with range e.g. (B2:B56)
        $cellValues = $objPHPExcel->getActiveSheet()->rangeToArray("$columnName$startRow:$columnName$lastRow");
        // return all data as array
        return $cellValues;
    }
}
?>

// My Controller to call method

<?php
// My Admin Controller with grocery CRUD createCouponCode method (URL: admin/createCouponCode)
if (!defined('BASEPATH'))     exit('No direct script access allowed');
class Admin extends CI_Controller {
    /**
     * Just construct method to load 
     */
    function __construct() {
        parent::__construct();
        // Load Model excel and use as object ModExcel
        $this->load->model('Mod_excel', 'ModExcel', true);
        // Load CRUD lib
        $this->load->library('grocery_CRUD');
    }
    /**
     * Upload Coupon Code from Excel
     */
    public function createCouponCode() {
        $crud = new grocery_CRUD();
        $crud->set_table('coupon_code');
        $crud->fields('coupon_no');
        $crud->columns('coupon_no');
        $crud->set_subject('Coupon');
        $crud->required_fields('coupon_no');
        $crud->set_field_upload('coupon_no', '../public/uploads/');
        $crud->callback_before_upload(array(
            $this,
            '_excel_uploaded_file'
        ));
        $output = $crud->render();
        $this->_example_output($output);
    }
    /**
     * Call back Function form CRUD Upload
     * @param array $files_to_upload
     * @param array $field_info
     * @return string
     */
    function _excel_uploaded_file($files_to_upload = array(), $field_info = array()) {
        $insert_data   = array();
        $ext           = '';
        $file_tmp_path = '';
        foreach ($files_to_upload as $value) {
            $ext           = pathinfo($value['name'], PATHINFO_EXTENSION);
            $file_tmp_path = $value['tmp_name'];
        }
        $allowed_formats = array(
            "xlsx"
        );
        if (in_array($ext, $allowed_formats)) {
            $excelFileName = $file_tmp_path;
            $columnName    = 'B';
            $startRow      = '2';
            $cellValues    = $this->ModExcel->readWithExcel($excelFileName, $columnName, $startRow);
            $iterator      = new RecursiveIteratorIterator(new RecursiveArrayIterator($cellValues));
            foreach ($iterator as $value) {
                $insert_data[] = array(
                    'coupon_no' => $value
                );
            }
            $this->output->enable_profiler(TRUE); //Turns on CI debugging
            $this->db->insert_batch('coupon_code', $insert_data);
            echo ($status) ? true : false;
        } else {
            return 'Error: Wrong file format. Use Excel 2007 format';
        }
    }
}
?>

// My Folder where I put PHPExcel Lib in CI



回答3:

You could try this one and it works for me:

$filePath = "uploads/import/test.xlx";                                  
$this->load->library('PHPExcel');                         
$objReader = new PHPExcel_Reader_Excel5();                        
$objPHPExcel = $objReader->load($filePath);
$sheetData = $objPHPExcel->getActiveSheet()->toArray(null,true,true,true);