我是初學Codeigniter,使用其檔案上傳類將csv或者excel檔案上傳,同時,使用過PHPExcel來讀取內容,裝入資料庫。我的程式如下:
controllers/products.php檔案:
$memsn = $this->session->userdata('MEMSN');
$this->load->library('Excel_Read_Operat');
$groups = array('purchaser', 'salesman', 'viewer','merchant');
if ($this->ion_auth->in_group($groups))
{
$this->session->set_flashdata('message', $this->lang->line("access_denied"));
$data['message'] = (validation_errors() ? validation_errors() : $this->session->flashdata('message'));
redirect('module=products', 'refresh');
}
$this->form_validation->set_rules('userfile', $this->lang->line("upload_file"), 'xss_clean');
if ($this->form_validation->run() == true)
{
if ( isset($_FILES["userfile"])){
$this->load->library('upload_photo');
$dest_dir = 'uploads/'.$memsn.'/';
$this->dest_dir_fortest = $dest_dir;
if($this->upload_photo->direct_is_exists($dest_dir)){
}else{
redirect("module=products&view=upload_csv", 'refresh');
}
$config['upload_path'] = $dest_dir;
$config['allowed_types'] = 'csv|xls|xlsx';
$config['max_size'] = '2048';
$config['overwrite'] = TRUE;
$old_file_name = $_FILES["userfile"]["name"];
$new_file_name = $this->getSystemTime().$_FILES["userfile"]["name"];
$config['file_name'] = $new_file_name;
//Initialize
$this->upload_photo->initialize($config);
if( ! $this->upload_photo->do_upload()){
//echo the errors
$error = $this->upload_photo->display_errors();
$this->session->set_flashdata('message', $error.$dest_dir);
redirect("module=products&view=upload_csv", 'refresh');
}
if ($this->upload_photo->file_ext == '.csv') {
$csv = $this->upload_photo->file_name;
Excel_Read_Operat::initialized($dest_dir.$new_file_name);
$phpexcel_csv_arr_table = Excel_Read_Operat::GetArrTable_CVS();
if(!empty($phpexcel_csv_arr_table)){
$keys = array('code','name','category_id','STATUS','DESCRIPTION','DECDESCTION','CUSTPRICE','LENGTH','HEIGHT','WIDTH','STATUS');
$final = array();
foreach ($phpexcel_csv_arr_table as $row_csv_value){
$final[] = array_combine($keys, $value);
foreach($final as $csv_pr) {
if($this->products_model->getProductByCode($csv_pr['code'])) {
$this->session->set_flashdata('message', $this->lang->line("check_product_code")." (".$csv_pr['code']."). ".$this->lang->line("code_already_exist"));
redirect("module=products&view=upload_csv", 'refresh');
}
}
}
在libraries/下,有Excel_Read_Operat.php類檔案,和Excel檔案夾,檔案夾下是PHPExcel.php和PHPExcel檔案夾。Excel_Read_Operat.php類如下:
if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class Excel_Read_Operat {
public $_filepath;
private $_arrayTable;
private $_Feature;
public static Function initialized($filepath){
if (file_exists($filePath)) {
$this->_filepath = $filepath;
}else{
return array();
}
}
public static Function GetData($val) {
$jd = GregorianToJD ( 1, 1, 1970 );
$gregorian = JDToGregorian ( $jd + intval ( $val ) - 25569 );
return $gregorian;
}
public static Function GetArrTable_CVS(){
require_once 'EXCEL/PHPExcel.php';
require_once 'EXCEL/PHPExcel/IOFactory.php';
$PHPReader_CSV = new PHPExcel_Reader_CSV();
$file_ext=strtolower(pathinfo($this->_filepath, PATHINFO_EXTENSION));
$PHPReader_CSV->setInputEncoding('GBK');
$PHPReader_CSV->setDelimiter(',');
if(!$PHPReader_CSV->canRead($this->_filepath)){
return array();
}
$PHPExcel = $PHPReader_CSV->load($this->_filepath);
$currentSheet = $PHPExcel->getSheet ( 0 );
$allColumn = $currentSheet->getHighestColumn ();
$allColumn = PHPExcel_Cell::columnIndexFromString ( $allColumn );
$allRow = $currentSheet->getHighestRow ();
echo 'row is : '.$allRow.'
';
echo 'allColumn is : '.$allColumn.'
';
for($currentRow = 2; $currentRow <= $allRow; $currentRow ++) {
for($currentColumn = 0; $currentColumn < $allColumn; $currentColumn ++) {
$val = $currentSheet->getCellByColumnAndRow ( $currentColumn , $currentRow )->getValue ();
$this->_Feature[$currentColumn] = $val;
}
$this->_arrayTable [$currentRow] = $this->_Feature;
}
echo "\n";
return $this->_arrayTable;
}
public static Function GetArrTable_Excel() {
require_once 'EXCEL/PHPExcel.php';
require_once 'EXCEL/PHPExcel/IOFactory.php';
$PHPReader = new PHPExcel_Reader_Excel2007 ();
if (! $PHPReader->canRead ( $this->_filepath )) {
$PHPReader = new PHPExcel_Reader_Excel5 ();
if (! $PHPReader->canRead ( $this->_filepath )) {
echo 'no Excel';
return;
}
}
$PHPExcel = $PHPReader->load ( $this->_filepath );
$currentSheet = $PHPExcel->getSheet ( 0 );
$allColumn = $currentSheet->getHighestColumn ();
$allColumn = PHPExcel_Cell::columnIndexFromString ( $allColumn );
$allRow = $currentSheet->getHighestRow ();
echo 'row is : '.$allRow.'
';
echo 'allColumn is : '.$allColumn.'
';
for($currentRow = 2; $currentRow <= $allRow; $currentRow ++) {
for($currentColumn = 0; $currentColumn < $allColumn; $currentColumn ++) {
$val = $currentSheet->getCellByColumnAndRow ( $currentColumn , $currentRow )->getValue ();
$this->_Feature[$currentColumn] = $val;
}
$this->_arrayTable [$currentRow] = $this->_Feature;
}
echo "\n";
return $this->_arrayTable;
}
}
?>
我要調用GetArrTable_CVS這個方法,將表格中的資料讀出來,然後放到數組表中返回,為什麼我這裡不能用require_once啊?我該怎麼來調用PHPExcel呢?請指教了。謝謝
回複討論(解決方案)
require_once 'EXCEL/PHPExcel.php';
require_once 'EXCEL/PHPExcel/IOFactory.php';
應放在程式檔案的開始處
並確認路徑是正確的
放在檔案開始的地方,整個程式都無法運行了。我發現這兩句放哪裡哪裡不能運行,太奇怪了。
路徑應該是對的,就在同一個目錄下,麻煩您給看看
給出錯誤資訊!
麻煩問下,我去哪裡找錯誤資訊呢?
require_once、require 失敗則必然有錯誤資訊
這與在哪裡找,要看你的 php.ini 的設定
如果 display_errors = On 則會顯示在頁面中
我按照你說的設定了,可是沒有錯誤資訊出來哦。是不是在程式裡要寫什麼顯示錯誤資訊的語句啊?
這個問題已經解決了,天啊,試了好多好多的方法!!!頭大。不過謝謝版主了