Excel单元格列标索引数字和26个字母转换函数

浏览:81 发布日期:2019/10/23 分类:基础算法 关键字: Excel 列标 数字 字母 转换
最近项目中用到表格设计器,数据太多使用Excel单元格索引方式进行在线交互,交互中需要导出导入表格数据,分享个Excel 单元格列标规则下,数字(索引)与26个英文字母 (索引)转换函数
/**
     * 数字(索引)转26个英文字母 (索引)(Excel 单元格列标规则)
     * @param integer $index
     * @return string|false 返回字母 false表示无效
     * 函数从 索引 0  开始转换计算,这里减 1 为了与实际应用表意相符,如用户参数1表示第1列(A),对应的索引实际为 0
     */
    final static public function indexToChar(int $index=null)
    {
        if(!is_numeric($index) || $index < 1){
            //DEBUG && EasyCall::debug(__CLASS__.' -> indexToChar(integer $index), Argument 1 must be than 0 ');
            return false;
        }
        $index=intval($index);
        if($index<27){
            return chr(65+$index-1);
        }
        $result=[];
        while ($index > 0){
            $index--;
            $n = $index % 26;
            $result[]=chr($n + 65);
            $index = ($index - $n) / 26;
        }
        return implode('',array_reverse($result));
    }
    /**
     * 英文字母(索引) (Excel 单元格列标规则)转数字(索引)
     * @param string $chars
     * @return int|false 返回数字(索引)false表示无效
     * 函数从 索引 0  开始转换计算,这里减 1 与 表意相符,如用户参数1表示第1列(A),对应的索引实际为 0
     */
    final static public function charToIndex(string $chars = null)
    {
        if (!is_string($chars) || empty($chars) || !preg_match('/^[A-Z]+$/', $chars)) {
            //DEBUG && EasyCall::debug(__CLASS__.' -> charToIndex(string $chars), Argument 1 must be character [A-Z]');
            return false;
        }
        $chars = strtoupper(trim((string)$chars));
        $length = strlen($chars);
        if($length==1){
            return ord($chars)-65+1;
        }
        $chars=str_split($chars,1);
        $index = 0;
        for ($i = 0; $i < $length; $i++) {
            $index += (ord($chars[$i]) - ord('A') + 1) * (int)pow(26, $length - $i - 1);
        }
        return $index;
    }
测试代码:        echo("<br />".EasyTable::indexToChar(1).'==>'.EasyTable::charToIndex('A'));
        echo("<br />".EasyTable::indexToChar(2).'==>'.EasyTable::charToIndex('B'));
        echo("<br />".EasyTable::indexToChar(3).'==>'.EasyTable::charToIndex('C'));
        echo("<br />".EasyTable::indexToChar(26).'==>'.EasyTable::charToIndex('Z'));
        echo("<br />".EasyTable::indexToChar(27).'==>'.EasyTable::charToIndex('AA'));
        echo("<br />".EasyTable::indexToChar(28).'==>'.EasyTable::charToIndex('AB'));
        echo("<br />".EasyTable::indexToChar(29).'==>'.EasyTable::charToIndex('AC'));
        echo("<br />".EasyTable::indexToChar(31).'==>'.EasyTable::charToIndex('AE'));
        echo("<br />".EasyTable::indexToChar(32).'==>'.EasyTable::charToIndex('AF'));
        echo("<br />".EasyTable::indexToChar(33).'==>'.EasyTable::charToIndex('AG'));
        echo("<br />".EasyTable::indexToChar(703).'==>'.EasyTable::charToIndex('AAA'));
        echo("<br />".EasyTable::indexToChar(704).'==>'.EasyTable::charToIndex('AAB'));
将会输出:

A==>1
B==>2
C==>3
Z==>26
AA==>27
AB==>28
AC==>29
AE==>31
AF==>32
AG==>33
AAA==>703
AAB==>704
评论( 相关
后面还有条评论,点击查看>>