Excelの列名を番号順にマッピングするのは0
、AZにはないので、ちょっとくだらないことです...
とにかく、私はそれらを前後に変換するための2つの関数を思いついた:
function calcCol($col) //character to number
{
if(is_numeric($col)) return intval($col);
$col=array_reverse(str_split(strtoupper(preg_replace("/[^a-z]/i","",$col))));
$num=0;
foreach($col as $i=>$ch)
{
$num+=(ord($ch)-ord('A')+1)*pow(27,$i);
}
$num-=ceil($num/27)-1;
return $num;
}
function getCol($col) //number to character
{
if(preg_match("/^[a-z]+$/i",$col)) return strtoupper($col);
$col=abs(intval($col));
$col+=ceil($col/26)-1;
$str="";
while($col>0)
{
$tmp=$col%27;
$str=chr($tmp-1+ord('A')).$str;
$col=floor($col/27);
}
return $str;
}
説明:
AZを、欠落/非表示の27ベースの0
記数法と見なします。
そして、文字から数字に変換した後、0
27が「カウント」された数を数えることによってそれらの隠されたsを削除します(ceil($num/27)
);
そして、数字から文字に変換する前に、0
「カウント」された26の数を数えて、それらの非表示のsを追加し直します(ceil($col/26)
)。