如何用Lua实现Excel/LO Calc列名转换(1→A、81→CC等)
数字转Excel/LO Calc列名的完整实现
你已经搞定了1-26的转换,大于26的情况本质是无0的26进制转换(普通26进制有0位,但这里1对应A,没有0对应的列名),核心是先把数字偏移1位,再按26进制拆解,具体实现逻辑和代码如下:
实现逻辑
- 因为Excel列名没有"0"对应的标识,每次处理前先将数字减1,把范围映射为0-25(对应A-Z)
- 循环拆解数字:
- 对26取模,得到当前位的字符偏移量,转成对应字母
- 将数字更新为
(原数字-1) // 26(整数除法),处理下一位
- 由于拆解是从低位到高位,直接往前拼接字符就能得到正确顺序的列名
完整Lua代码示例
function numberToColumn(n) local columnName = "" while n > 0 do n = n - 1 -- 偏移1位,适配0-25的索引 local charOffset = n % 26 columnName = string.char(65 + charOffset) .. columnName -- 往前拼接字符 n = math.floor(n / 26) -- 计算下一位的数字 end return columnName end -- 测试验证 print(numberToColumn(1)) -- 输出: A print(numberToColumn(26)) -- 输出: Z print(numberToColumn(27)) -- 输出: AA print(numberToColumn(81)) -- 输出: CC
关键细节说明
n = n - 1:这是核心调整,解决了普通26进制中0的问题,让26能正确对应Z,27能拆解为0+1(对应A+A)string.char(65 + charOffset):65是ASCII码中'A'的十进制值,加上0-25的偏移量就能得到A-Z的字符- 往前拼接字符:避免了最后反转字符串的步骤,直接得到正确顺序的列名
内容的提问来源于stack exchange,提问作者user9228488
相关产品推荐
相关产品推荐

