Perl で表計算アプリケーションのセル名⇔行列の変換

Posted by
ぴろり
Posted at
2016/03/08 14:22
Trackbacks
関連記事 (0)
Post Comment
コメントできます
Category
開発メモ カテゴリ
カバーイメージ

 Microsoft Excel などの表計算アプリケーションにおいて使われている A1AB12 と表されたセル名から、行・列番号を求めたり、また逆に行・列番号からセル名を求める Perl コードの覚書き。CPAN モジュールとか絶対に既存だと思うんですが、自分が調べた限りでは見つけられなかったので(´・ω・`)

この記事を Delicious に追加する   このエントリーをはてなブックマークに追加  

おさらい

 A1(1,1)Z1(26,1)AA1(27,1)AZ1(52,1)BA1(53,1)、...

セル名⇒行・列番号

# cell2cr( 'B2' ) ⇒ ( 2, 1 )
sub cell2cr {
    my( $cell, $col_offset, $row_offset ) = @_;

    my( $col_name, $row ) = $cell =~ /^([A-Z]+)(\d+)$/i;
    $col_name or die;
    $row      or die;
    my $col = 0; $col = $col * 26 + ord( $_ ) - 64 foreach split //, uc $col_name;

    return ( $col + $col_offset, $row + $row_offset ); # 1 origin
}

行・列番号⇒セル名

# cr2cell( 2, 1 ) ⇒ 'B1'
sub cr2cell { # 1 origin
    my( $col, $row, $col_offset, $row_offset ) = @_;

    $col += $col_offset; 0 < $col or die;
    $row += $row_offset; 0 < $row or die;
    my $col_name = '';
    do {
        $col--;
        $col_name = chr( 65 + $col % 26 ). $col_name;
        $col = int $col / 26;
    } while $col;

    return $col_name. $row;
}

セル名とオフセット

# _cell( 'A1', 2,1 ) ⇒ 'C2'
sub _cell {
    return cr2cell( cell2cr( @_ ));
}
この記事を Delicious に追加する   このエントリーをはてなブックマークに追加  



関連記事/トラックバック

関連記事/トラックバックはまだありません

この記事にトラックバックを送るには?

コメントを投稿する

 
 (必須, 匿名可, 公開, トリップが使えます)
 (必須, 匿名可, 非公開, Gravatar に対応しています)
 (必須)
スパム コメント防止のため「投稿確認」欄に ランダムな数字 CAPTCHAについて を入力してから送信してください。お手数ですがご協力のほど宜しくお願いいたします。