Excel 单元格列名转换

单元格列索引的问题

在 Excel 中,一个单元格被行列名唯一确定。

例如,A1 单元格表示左上角第 1 个单元格。

image

行索引为数字,列索引为 A-Z 的字母。

实际上列索引是一种由 26 个字母组成的 26 进制数。当列数超过 26(Z)时,显示为两位字母;超过702(ZZ)时,显示为三位字母,依此类推。

image

image

所以一旦我们的数据多起来,列索引成了一个很大的麻烦。

代码实现与原理

好在这种规律实际上是按照进制规律设计的,下面写一个简单的10进制转26进制,并由数字进制数转到 Excel 这种字母进制数。

function colName = getCellColIndex(colId)
%getCellColIndex 根据列序号获取excel单元格列索引名
%   colName = getCellColIndex(colId)
%   num_input 单元格列序号
%   colName 单元格列索引名

colName = [];  % 记录单元格纵向索引名
getChar = @(input) char(input+64); % 1-26转A-Z字符,ASCII码中 A=65
base = 26; % 26进制数

if(colId <= 0)
    error('单元格列序号必须为正整数 !');
elseif (colId<=base) % 26以内直接转换成 A-Z 字符
    colName = getChar(colId);
else % 大于26,使用短除法转换
    while(colId~=0) % 除以 base 直到商为 0
        num = rem(colId, base);                 % 取余
        % 当余数为0时,找不到对应的A-Z,需要特殊处理
        % 如52,应为AZ
        if(num==0)  
            num = base; 
            colId = colId - 1;
        end
        colName = strcat(getChar(num),colName); % 向高位拼接字符
        colId = fix(colId/base);                % 取商
    end
end
end

上述代码基本原理就是短除法,以二进制为例,过程如下:
image
这里我们只不过将26进制数翻译成了A-Z。需要特别注意的是当余数为 0 时需要特殊处理一下, 因为 0 没有对应的字符。

测试与验证

测试以下效果:

clear;close all;clc;
colId = 1542;
colName = getCellColIndex(colId)

输出结果如下:

colName =

BGH

查验表格,结果一致。

image

posted @ 2022-06-19 14:38  GShang  阅读(372)  评论(0编辑  收藏  举报