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;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值