JavaScript中Excel列名与序号互相转换的方法

向北走
向北走
发布时间:2026-10-15| 6人浏览过
原创

在处理Excel或类似表格数据时,经常需要在字母列名(如“A”、“AA”)与数字索引(如0, 27)之间进行转换。由于这种结构本质上是一种变体的26进制运算,我们可以通过编写简洁的JavaScript算法来实现。本文将介绍具体的转换原理及可直接使用的代码。

核心算法:26进制转换基础

Excel的列名系统类似一个不标准的26进制数:

  • 10进制数字对应:A=0, B=1 ... Z=25(如果是从0开始的索引),或者 A=1...Z=26(如果是常规计数)。
  • 超过26的组合如“AA”,本质上是高位进位。
因此,转换的核心在于实现十进制到26进制序列的反向与正向解析。

为了实现转换,首先构建两个辅助函数:一个用于处理普通的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表格处理技巧的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。