Excel 单元格列名转换
单元格列索引的问题
在 Excel 中,一个单元格被行列名唯一确定。
例如,A1
单元格表示左上角第 1 个单元格。
行索引为数字,列索引为 A-Z 的字母。
实际上列索引是一种由 26 个字母组成的 26 进制数。当列数超过 26(Z)时,显示为两位字母;超过702(ZZ)时,显示为三位字母,依此类推。
所以一旦我们的数据多起来,列索引成了一个很大的麻烦。
代码实现与原理
好在这种规律实际上是按照进制规律设计的,下面写一个简单的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
上述代码基本原理就是短除法,以二进制为例,过程如下:
这里我们只不过将26进制数翻译成了A-Z。需要特别注意的是当余数为 0 时需要特殊处理一下, 因为 0 没有对应的字符。
测试与验证
测试以下效果:
clear;close all;clc;
colId = 1542;
colName = getCellColIndex(colId)
输出结果如下:
colName =
BGH
查验表格,结果一致。
未经作者授权,禁止转载
THE END