tp3.2.3 讀取excel的列號問題,用到A-Z轉成對應的1-26,數字也迴轉的方式去實現。

先貼數字轉大寫字母的代碼:數字1-26轉A-Z,超過26,例如:27,轉成AA,一直到ZZ,再從AAA開始。

  (這裏在整數倍的的時候會出問題,因爲通過26進制的方式去做。沒有辦法,只能特殊處理。如果有大佬能改進,歡迎討論區進行改進)

/**
 * 將數字轉化成對應的大寫字母(衍生:AA對應的數字爲27,依次類推)
 * @param  string $str  需要轉換的字母
 * @return str_lenth    返回的數字
 */
function numToStr($num)
{
    $decimal = base_convert($num, 10, 26);
    // echo $decimal."  ";
    $array   = str_split($decimal);
    $lenth = strlen($decimal);
    //方法可處理675列以內的excel的轉化,超過會報錯,待優化,做特殊處理,可出禮到727以內;
    if ($num==676) {
        $str = 'YZ';
    }elseif ($num==702) {
        $str = 'ZZ';
    }
    if ($str) {
        return $str;
    }
    for ($i=$lenth; $i >0 ; $i--) {
        $key = $lenth - $i;
        if ($array[$key]=="0") {
            if ($array[$key-1]==1&&$key==1) {
                $str = 'Z';
            }elseif ($array[$key-1]==1&&$key>1) {
                $str .= 'Z';
            }else{
                $str = numToStr(base_convert($array[$key-1], 26, 10)-1).'Z';
            }
        }else{
            $str .= chr(base_convert($array[$key], 26, 10)+64);
        }
    }
    return $str;
}

 

正文:在開發中經常遇到導入excel的問題,開始用的以前項目中的function,發現只能讀取到A-Z列的數據,但是經常會超過26列,即超過AA列。這是原本的代碼,$k='A',k++的方式,因爲字符串比較大小方式的原因,其實行不通。

function import_excel($file){
    //判斷文件是什麼格式
    $type = pathinfo($file); 
    $type = strtolower($type["extension"]);
    if ($type=='xlsx') { 
        $type='Excel2007'; 
    }elseif($type=='xls') { 
        $type = 'Excel5'; 
    } 
    ini_set('max_execution_time', '0');
    Vendor('PHPExcel.PHPExcel');
    // 判斷使用哪種格式
    $objReader = PHPExcel_IOFactory::createReader($type);
    $objPHPExcel = $objReader->load($file); 
    $sheet = $objPHPExcel->getSheet(0); 
    // 取得總行數 
    $highestRow = $sheet->getHighestRow();     
    // 取得總列數      
    $highestColumn = $sheet->getHighestColumn(); 
    //循環讀取excel文件,讀取一條,插入一條
    $data=array();
    //從第一行開始讀取數據
    for($j=1;$j<=$highestRow;$j++){
        //從A列讀取數據
        for($k='A';$column<=$highestColumn;$k++){
            // 讀取單元格
            $data[$j][]=$objPHPExcel->getActiveSheet()->getCell("$k$j")->getValue();
        }
    }  
    return $data;
}

改進後有點問題,已經在開頭說明,但是現在能用於1-727的轉化。

/**
 * 導入excel文件
 * @param  string $file excel文件路徑
 * @return array        excel文件內容數組
 */
function import_excel($file){
    //判斷文件是什麼格式
    $type = pathinfo($file); 
    $type = strtolower($type["extension"]);
    if ($type=='xlsx') { 
        $type='Excel2007'; 
    }elseif($type=='xls') { 
        $type = 'Excel5'; 
    } 
    ini_set('max_execution_time', '0');
    Vendor('PHPExcel.PHPExcel');
    // 判斷使用哪種格式
    $objReader = PHPExcel_IOFactory::createReader($type);
    $objPHPExcel = $objReader->load($file); 
    $sheet = $objPHPExcel->getSheet(0); 
    // 取得總行數 
    $highestRow = $sheet->getHighestRow();     
    // 取得總列數      
    $highestColumn = $sheet->getHighestColumn(); 
    //循環讀取excel文件,讀取一條,插入一條
    // p($highestColumn);
    $columnLenth = strToNum($highestColumn);
    $data=array();
    //從第一行開始讀取數據
    for($j=1;$j<=$highestRow;$j++){
        //從A列讀取數據
        for($column=1;$column<=$columnLenth;$column++){
            // 讀取單元格
            $k = numToStr($column);
            $data[$j][]=$objPHPExcel->getActiveSheet()->getCell("$k$j")->getValue();
        }
    }  
    return $data;
}
/**
 * 將大寫字母轉化成對應的1-26的數字(衍生:AA對應的數字爲27,依次類推)
 * @param  string $str  需要轉換的字母
 * @return str_lenth    返回的數字
 */
function strToNum($str)
{
    $array = str_split(strtoupper($str));
    $lenth = strlen($str);
    for ($i=$lenth; $i >0 ; $i--) {
        $key = $lenth - $i; 
        $str_lenth += pow(26,($i-1))*(ord($array[$key]) - 64);
        // p($key);p($str_lenth);
    }
    return $str_lenth;
}
/**
 * 將數字轉化成對應的大寫字母(衍生:AA對應的數字爲27,依次類推)
 * @param  string $str  需要轉換的字母
 * @return str_lenth    返回的數字
 */
function numToStr($num)
{
    $decimal = base_convert($num, 10, 26);
    // echo $decimal."  ";
    $array   = str_split($decimal);
    $lenth = strlen($decimal);
    //方法可處理675列以內的excel的轉化,超過會報錯,待優化,做特殊處理,可出禮到727以內;
    if ($num==676) {
        $str = 'YZ';
    }elseif ($num==702) {
        $str = 'ZZ';
    }
    if ($str) {
        return $str;
    }
    for ($i=$lenth; $i >0 ; $i--) {
        $key = $lenth - $i;
        if ($array[$key]=="0") {
            if ($array[$key-1]==1&&$key==1) {
                $str = 'Z';
            }elseif ($array[$key-1]==1&&$key>1) {
                $str .= 'Z';
            }else{
                $str = numToStr(base_convert($array[$key-1], 26, 10)-1).'Z';
            }
        }else{
            $str .= chr(base_convert($array[$key], 26, 10)+64);
        }
    }
    return $str;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章