先貼數字轉大寫字母的代碼:數字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;
}