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.
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);
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
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);