Codeigniter(CI)結合PHPExcel類完成數據導入


1. 安裝PHPExcel到Codeigniter

1) 解壓壓縮包裏的Classes文件夾中的內容到application\libraries\目錄下,目錄結構以下: php

– application\libraries\PHPExcel.php mysql

– application\libraries\PHPExcel (文件夾) sql

2)修改application\libraries\PHPExcel\IOFactory.php 文件 數據庫

– 將其類名從PHPExcel_IOFactory改成IOFactory,聽從CI類命名規則。 數組

– 將其構造函數改成public(__construct) 服務器


2. 安裝完畢,寫一個導出excel的控制器(Controller)

    public function index(){


            //判斷上傳文件存在值

            if(!empty($_FILES)){

                $filename = $_FILES['file']['name'];//被上傳文件的名稱
                $filetype = $_FILES["file"]["type"];//被上傳文件的類型
                $filesize = $_FILES["file"]["size"];// 被上傳文件的大小,以字節計
                $filetmp = $_FILES["file"]["tmp_name"];//存儲在服務器的文件的臨時副本的名稱
                $fileerror = $_FILES["file"]["error"];//由文件上傳致使的錯誤代碼


                //判斷是否上傳成功
                if($fileerror==0){
                    //判斷是不是excel表格
                    if($filetype=="application/vnd.ms-excel" || $filetype=="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"){

                        /*設置保存路徑*/
                        $filePath = 'uploads/excel/';
                        $str = "";   
                          
                        /*加載PHPExcel*/
                        $this->load->library('PHPExcel.php');
                        $this->load->library('PHPExcel/IOFactory.php');
                        //$this->load->library('PHPExcel/Reader/Excel5.php');

                         //注意設置時區
                        $time=date("YmdHis");//去當前上傳的時間
                        //獲取上傳文件的擴展名
                        $extend=strrchr ($filename,'.');
                        //上傳後的文件名
                        $name=$time.$extend;
                        //上傳後的文件名地址
                        $uploadfile=$filePath.$name;//上傳後的文件名地址
                        
                        //move_uploaded_file() 函數將上傳的文件移動到新位置。若成功,則返回 true,不然返回 false。
                        $result=move_uploaded_file($filetmp,$uploadfile);//假如上傳到當前目錄下
                        


                        //echo $result;
                        //若是上傳文件成功,就執行導入excel操做

                       if($result){

                               $inputFileType = IOFactory::identify($uploadfile);//肯定輸入文件的格式
                            $objReader = IOFactory::createReader($inputFileType);//穿件相對應的閱讀器
                            $objPHPExcel = $objReader->load($uploadfile);          //加載要讀取的文件
                            $sheet = $objPHPExcel->getSheet();                    //獲得當前活動sheet
                            $highestRow = $sheet->getHighestRow();           //取得總行數
                            $highestColumn = $sheet->getHighestColumn(); //取得總列數
                           // print_r($highestRow);
                            //print_r($highestColumn);
                            /* 第一種方法

                            //循環讀取excel文件,讀取一條,插入一條
                            for($j=1;$j<=$highestRow;$j++)                        //從第一行開始讀取數據
                            {
                                for($k='A';$k<=$highestColumn;$k++)            //從A列讀取數據
                                {
                                    //
                                    //這種方法簡單,但有不妥,以'\\'合併爲數組,再分割\\爲字段值插入到數據庫
                                    //實測在excel中,若是某單元格的值包含了\\導入的數據會爲空        
                                    //
                                    $str .=$objPHPExcel->getActiveSheet()->getCell("$k$j")->getValue().'\\';//讀取單元格
                                }
                                //echo $str; die();
                                //explode:函數把字符串分割爲數組。
                                $strs = explode("\\",$str);
                                print_r($strs);
                                $sql = "INSERT INTO te(`id`, `name`) VALUES (
                                '{$strs[0]}',
                                '{$strs[1]}')";
                                //die($sql);

                                if(!mysql_query($sql))
                                {
                                    return false;
                                    echo 'sql語句有誤';
                                }
                                mysql_query($sql);
                                $str = "";
                            }
                            unlink($uploadfile); //刪除上傳的excel文件
                            $msg = "導入成功!";
                            */

                            /* 第二種方法*/
                            $objWorksheet = $objPHPExcel->getActiveSheet();
                            $highestRow = $objWorksheet->getHighestRow();
                            
                            $highestColumn = $objWorksheet->getHighestColumn();
                            $highestColumnIndex = PHPExcel_Cell::columnIndexFromString($highestColumn);//總列數
                            
                            $headtitle=array();  
                            for ($row = 2;$row <= $highestRow;$row++){

                                $arr=array();
                                //注意highestColumnIndex的列數索引從0開始
                                for ($col = 0;$col < $highestColumnIndex;$col++){


                                        $arr[$col] =$objWorksheet->getCellByColumnAndRow($col, $row)->getValue();
                                }
                                

                                // $sql = "INSERT INTO admins(`account`, `pwd`, `username`, `power`, `tel`,`sex`,`work_numjob`,`job`,`sector`) VALUES (
                                // '{$strs[0]}',
                                // '{$strs[1]}',
                                // '{$strs[2]}',
                                // '{$strs[3]}',
                                // '{$strs[4]}',
                                // '{$strs[5]}',
                                // '{$strs[6]}',
                                // '{$strs[7]}',
                                // '{$strs[8]}',)";

                                $data=array(
                                            'account'=>$arr['0'],
                                            'pwd'=>$arr['1'],
                                            'username'=>$arr['2'],
                                            'power'=>$arr['3'],
                                            'tel'=>$arr['4'],
                                            'sex'=>$arr['5'],
                                            'work_num'=>$arr['6'],
                                            'job'=>$arr['7'],
                                            'sector'=>$arr['8'],

                                        );

                                $this->db->insert("admins",$data);

                            }
                            unlink($uploadfile);
                            show_msg("導入成功",site_url("連接地址"));//跳轉地址
                             //刪除上傳的excel文件

                    }

                    }else{

                        show_msg("上傳文件非cvs格式,請從新上傳");
                    }


                }else{

                    switch ($fileerror){
                            case 1:
                             show_msg("上傳的文件超過了 php.ini 中 upload_max_filesize 選項限制的值.");
                              break;
                            case 2:
                              show_msg("上傳文件的大小超過了 HTML 表單中 MAX_FILE_SIZE 選項指定的值");
                              break;
                            case 3:
                             show_msg("文件只有部分被上傳");
                              break;
                            case 4:
                                show_msg("沒有文件被上傳");
                              break;
                    }


                }

            }

    } app

注意事項:閱讀方式excel方式不能指定死,讓他自動識別文件來自動讀取。

3. 讀取excel詳細資料


1.      導入一個Excel最簡單的方法是使用PHPExel的IO Factory,調用PHPExcel_IOFactory類的靜態法load,它能夠自動識別文檔格式,包括Excel200七、 Excel2003XML、OOCalcSYLK、Gnumeric、CSV。返回一個PHPExcel的實例。 ide

 

//加載工廠類 函數

include'PHPExcel/IOFactory.php';
//
要讀取的xls文件路徑 this

$inputFileName './sampleData/example1.xls';

/** PHPExcel_IOFactoryload方法獲得excel操做對象  **/
$objPHPExcel = PHPExcel_IOFactory::load($inputFileName);

//獲得當前活動表格,調用toArray方法,獲得表格的二維數組

$sheetData =$objPHPExcel->getActiveSheet()->toArray(null,true,true,true);

var_dump($sheetData);

 

1.  建立一個ExcelReader去加載一個Excel文檔

若是你知道這個Excel文檔的格式,能夠創建一個相應的Reader去加載要讀取的Excel文檔。可是若是你加載了錯誤的文檔類型,可會產生不可預知的錯誤。

 

 

$inputFileName './sampleData/example1.xls';

/** Create a new Excel5 Reader  **/
$objReader = new PHPExcel_Reader_Excel5();
//    $objReader = new PHPExcel_Reader_Excel2007();
//    $objReader = new PHPExcel_Reader_Excel2003XML();
//    $objReader = new PHPExcel_Reader_OOCalc();
//    $objReader = new PHPExcel_Reader_SYLK();
//    $objReader = new PHPExcel_Reader_Gnumeric();
//    $objReader = new PHPExcel_Reader_CSV();
/** Load $inputFileName to a PHPExcel Object  **/
$objPHPExcel $objReader->load($inputFileName);

//獲得當前活動sheet

$curSheet =$objPHPExcel->getActiveSheet();

//以二維數組形式返回該表格的數據

$sheetData = $curSheet->toArray(null,true,true,true);

var_dump($sheetData);

 

也能夠用PHPExcel_IOFactory的createReader方法去獲得一個Reader對象,無需知道要讀取文件的格式。

 

 

$inputFileType 'Excel5';
//    $inputFileType = 'Excel2007';
//    $inputFileType = 'Excel2003XML';
//    $inputFileType = 'OOCalc';
//    $inputFileType = 'SYLK';
//    $inputFileType = 'Gnumeric';
//    $inputFileType = 'CSV';

$inputFileName './sampleData/example1.xls';

/**  Create a new Reader of the type defined in $inputFileType  **/
$objReader PHPExcel_IOFactory::createReader($inputFileType);
/**  Load $inputFileName to a PHPExcel Object  **/
$objPHPExcel $objReader->load($inputFileName);

//獲得當前活動sheet

$curSheet = $objPHPExcel->getActiveSheet();

//以二維數組形式返回該表格的數據

$sheetData = $curSheet->toArray(null,true,true,true);

var_dump($sheetData);

若是在讀取文件以前,文件格式未知,你能夠經過IOFactory 的 identify()方法獲得文件類型,而後經過createReader()方法去穿件閱讀器。

$inputFileName './sampleData/example1.xls';

/**  肯定輸入文件的格式  **/
$inputFileType PHPExcel_IOFactory::identify($inputFileName);
/** 穿件相對應的閱讀器  **/
$objReader PHPExcel_IOFactory::createReader($inputFileType);
/**  加載要讀取的文件  **/
$objPHPExcel $objReader->load($inputFileName);

2.  設置Excel的讀取選項

在使用load()方法加載文件以前,能夠設置讀取選項來控制load的行爲.

2.1.ReadingOnly Data from a Spreadsheet File

setReadDataOnly()方法,配置閱讀器不關注表格數據的數據類型,都以string格式返回


$inputFileType 'Excel5';
$inputFileName './sampleData/example1.xls';

/**  Create a new Reader of the type defined in $inputFileType  **/
$objReader PHPExcel_IOFactory::createReader($inputFileType);
/**  配置單元格數據都以字符串返回  **/
$objReader->setReadDataOnly(true);
/**  Load $inputFileName to a PHPExcel Object  **/
$objPHPExcel $objReader->load($inputFileName);

$sheetData =$objPHPExcel->getActiveSheet()->toArray(null,true,true,true);

var_dump($sheetData);


詳細資料:http://blog.csdn.net/andy1219111/article/details/7673796;

相關文章
相關標籤/搜索