JavaScript中Excel列名与序号互相转换的方法
在处理Excel或类似表格数据时,经常需要在字母列名(如“A”、“AA”)与数字索引(如0, 27)之间进行转换。由于这种结构本质上是一种变体的26进制运算,我们可以通过编写简洁的JavaScript算法来实现。本文将介绍具体的转换原理及可直接使用的代码。
核心算法:26进制转换基础
Excel的列名系统类似一个不标准的26进制数:
- 10进制数字对应:A=0, B=1 ... Z=25(如果是从0开始的索引),或者 A=1...Z=26(如果是常规计数)。
- 超过26的组合如“AA”,本质上是高位进位。
为了实现转换,首先构建两个辅助函数:一个用于处理普通的K进制转换逻辑,另一个建立字符映射关系。
// Excel列名元素集 (A-Z)
const COL_ABC = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M",
"N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"];
/**
* 通用方法:十进制数转为K进制数组
* @param {number} num 十进制数
* @param {number} k 进制基数
* @returns {number[]} K进制各位数字数组(逆序后为从左到右的高到低)
*/
function ckqy(num, k) {
let y = [];
while (num > 0) {
let s = Math.floor(num / k);
let _y = num % k;
if (s == 0) {
y.push(num);
num = 0;
} else {
y.push(_y);
num = s;
}
}
return y.reverse();
}
/**
* 通用方法:K进制数组转为十进制数
* @param {number[]} kArray K进制数组
* @param {number} k 进制基数
* @returns {number} 十进制数值
*/
function kTo10(kArray, k) {
let v10 = 0;
let kArrayLen = kArray.length;
for(let ind = 0; ind < kArrayLen; ind++) {
v10 += kArray[ind] * Math.pow(k, kArrayLen - 1 - ind);
}
return v10;
}从列序号获取列名(Index to Name)
该方法的逻辑是将数字索引转换为对应的字符串。需要注意区分“从0开始”还是“从1开始”的计算模式。以下为兼容处理逻辑:
/**
* 根据列序号获取Excel列名
* @param {number} colIndex 列序号(从0开始,即A=0, B=1)
* @returns {string} 列名字符串
*/
function getColName(colIndex) {
if(colIndex < 0) {
return '';
}
let colNames = [];
// 判断是否需要进行偏移调整
let isAdd1 = colIndex > 25 || colIndex < 1;
// 将(0-based)索引转为类26进制序列
let kArray = ckqy(colIndex + (isAdd1 ? 1 : 0), 26);
// 映射回字母表
for (let i = 0; i < kArray.length; i++) {
colNames.push(COL_ABC[kArray[i] - (isAdd1 ? 1 : 0)] || '');
}
return colNames.join('');
}从列名获取列序号(Name to Index)
反向操作是将字母字符串拆解,计算其代表的数值。步骤包括字符查找和累加计算。
/**
* 获取列名中每个字符在COL_ABC中的下标
*/
function getABCIndex(colName) {
let kArray = [];
let colNames = colName.split('');
for(let ind = 0; ind < colNames.length; ind++) {
let k = COL_ABC.indexOf(colNames[ind]);
if(k > -1) {
kArray.push(k);
}
}
return kArray;
}
/**
* 根据列名获取对应的列序号(从0开始)
* @param {string} colName 列名,例如 'A', 'AA'
* @returns {number} 列序号
*/
function getColIndex(colName) {
if(!colName) {
return -1;
}
// 1. 提取字符索引序列
let kArray = getABCIndex(colName);
let kArrayLen = kArray.length;
if(kArrayLen == 0) {
return -1;
}
let colIndex = 0;
for(let ind = 0; ind < kArrayLen; ind++) {
// 处理每一位的权重和偏移
let k = kArray[ind] + ((kArrayLen - 1) == ind ? 0 : 1);
let p = kArrayLen - 1 - ind;
colIndex += k * Math.pow(26, p);
}
return colIndex;
}使用示例
你可以直接在控制台验证上述函数的正确性:
// 测试用例:'ABC' 列
let _colName = 'ABC';
let colIndex = getColIndex(_colName);
console.log("列序号:", colIndex);
let colName = getColName(colIndex);
console.log("还原列名:", colName);
console.log("校验结果:", _colName == colName);
以上代码即可在纯前端JS环境中完成Excel列名的双向转换,无需依赖庞大的第三方库。以上就是JavaScript中Excel列名与列序号互相转换的详细内容,更多关于JavaScript表格处理技巧的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









