Python Excel表格列数的字母表达与数字的相互转换

简介: Python Excel表格列数的字母表达与数字的相互转换

Excel表格的列数用字母:A,B,C,...,Y,Z,AA,AB,AC,....来表示的,就称它为“列数”。

它的本质就是整数的二十六进制记数,但又有些不一样:若把A看作0,Z之后是AA相当于是“00”,这就是和普通进位制不同的地方。



与普通数制转换的差异

使用内置函数int(x, base=10)转换,把基权设置为26和36进行测试:


>>> int('A',base=26)-int('9',base=26)
1
>>> int('AA',base=26)-int('99',base=26)
27
>>> int('AAA',base=26)-int('999',base=26)
703
>>> int('P',base=26)-int('9',base=26)
16
>>> int('Q',base=26)-int('9',base=26)
Traceback (most recent call last):
  File "<pyshell#194>", line 1, in <module>
    int('Q',base=26)-int('9',base=26)
ValueError: invalid literal for int() with base 26: 'Q'
>>> int('Q',base=36)-9
17
>>> int('Z',base=36)-9
26


普通数制转换从0开始的,10进制以上的数字9以后才用到字母ABC...来代表各位上的数字;而“列数”的表达是从A开始的没有0~9。通过上面的测试规律可知,对“列数”中出现的字母,分段A~P和Q~Z各用26进制和36进制转换,然后乘以各自的位权后累加即可得到结果:

>>> def A2N(s:str)->int:
  ret = 0
  if s[0]>'P': t = int(s[0],base=36)-9
  else: t = int(s[0],base=26)-int('9',base=26)
  ret += t*26**(len(s)-1)
  s = s[1:]
  if s: ret += A2N(s)
  return ret
>>> A2N('A')
1
>>> A2N('AA')
27
>>> A2N('ZY')
701
>>> A2N('ZZ')
702
>>> A2N('AAA')
703
>>> A2N('ZZZ')
18278
>>> 


上面这个代码有个好处, 不区分字母大小写,这是因为int()自带的就这样的。以下内容中所有字符串转整数类的函数,如果也要支持小字字母,只需在函数首行位置添加 s=s.upper() 即可实现。

 



Excel "列数"转成整数

如果不使用现成的int()函数,就按权展开求和,这也是非十进制转化十进制的普遍方法。以下代码的主体就一个return语句,我把按位展开用了一个推导式来完成:


>>> def Col2Int(s:str)->int:
    assert(isinstance(s, str))
    for i in s:
        if not 64<ord(i)<91:
            raise ValueError('Excel Column ValueError')
    return sum([(ord(n)-64)*26**i for i,n in enumerate(list(s)[::-1])])
>>> Col2Int('A')
1
>>> Col2Int('Z')
26
>>> Col2Int('AA')
27
>>> Col2Int('ZZ')
702
>>> Col2Int('ZJX')
17860
>>> Col2Int('ZZZ')
18278
>>> 26*26**2+26*26+26
18278
>>> Col2Int('ABCD')
19010
>>> 1*26**3+2*26**2+3*26**1+4*26**0
19010
>>> 



整数转换成“列数”

反过来整数转非十进制数的普遍方法是反复“除权求余”获取各位上的数字,先建一个字母列表 ['A', 'B', 'C', ...., 'Z'] 用于映射各位上的“数字”:

>>> def ExcelColumn(n:int)->str:
    assert(isinstance(n, int) and n>0)
    num = [chr(i) for i in range(65,91)]
    ret = []
    while n>0:
        n,m = divmod(n-1, len(num))
        ret.append(num[m])
    return ''.join(ret[::-1])
>>> ExcelColumn(703)
'AAA'
>>> ExcelColumn(26**2+26+1)
'AAA'
>>> ExcelColumn(5*26**4+4*26**3+3*26**2+2*26**1+1*26**0)
'EDCBA'
>>> 5*26**4+4*26**3+3*26**2+2*26**1+1*26**0
2357265
>>> ExcelColumn(2357265)
'EDCBA'
>>> 


或者不建列表,各位分别转换;和上段代码一样其中的 (n-1) 非常关键,原因是“列数”中没有“零”而是从“一”开始的,同样没有“10”直接从“Z”跳到“AA”:

>>> def num2chr(n:int)->str:
  ret = ''
  while n//26:
    n,m = divmod(n-1,26)
    ret += chr(65+m)
  if n: ret += chr(65+n-1)
  return ret[::-1]



递归法实现转换

>>> def ExcelColumn(n:int)->str:
  num = [chr(i) for i in range(65,91)]
  ret,(n,m) = '',divmod(n-1,26)
  if n: ret += ExcelColumn(n)
  ret += num[m]
  return ret
>>> ExcelColumn(1)
'A'
>>> ExcelColumn(26)
'Z'
>>> ExcelColumn(27)
'AA'
>>> ExcelColumn(702)
'ZZ'
>>> ExcelColumn(703)
'AAA'
>>> 
>>> 
>>> def Col2Int(s:str)->int:
  ret=0
  ret += (ord(s[0])-64)*26**(len(s)-1)
  s = s[1:]
  if s: ret += Col2Int(s)
  return ret
>>> Col2Int('Z')
26
>>> Col2Int('AA')
27
>>> Col2Int('XFD')
16384
>>> Col2Int('ILOVEYOU')
76181660199
>>> Col2Int('HANNYANG')
64736574559
>>> 



用第三方库函数转换

需要安装openpyxl库,另外它限制了“列数”最大值为三位字母,实际上 Excel2007+ 的列数最大值是16384 (是XFD并非ZZZ),而EXCEL2003等老版本的最大列数只有256。

>>> from openpyxl.utils import get_column_letter as ExcelColumn
>>> from openpyxl.utils import column_index_from_string as Col2Int
>>> 
>>> ExcelColumn(18278)
'ZZZ'
>>> ExcelColumn(17376)
'YRH'
>>> 
>>> Col2Int('XFD')
16384
>>> Col2Int('ZZZ')
18278
>>> Col2Int('AAAA')
Traceback (most recent call last):
  File "D:\Python38-32\lib\site-packages\openpyxl\utils\cell.py", line 121, in column_index_from_string
    return _COL_STRING_CACHE[str_col.upper()]
KeyError: 'AAAA'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
  File "<pyshell#127>", line 1, in <module>
    Col2Int('AAAA')
  File "D:\Python38-32\lib\site-packages\openpyxl\utils\cell.py", line 123, in column_index_from_string
    raise ValueError("{0} is not a valid column name".format(str_col))
ValueError: AAAA is not a valid column name
>>> 


leetcode题号168和171


   Excel Sheet Column Title

   Given a positive integer, return its corresponding column title as appear in an Excel sheet.    [#168]

   Excel Sheet Column Number

   Given a column title as appear in an Excel sheet, return its corresponding column number.     [#171]


本篇完,方便的话请点个赞再走^_^



目录
相关文章
|
SQL 自然语言处理 数据库
【Azure Developer】分享两段Python代码处理表格(CSV格式)数据 : 根据每列的内容生成SQL语句
本文介绍了使用Python Pandas处理数据收集任务中格式不统一的问题。针对两种情况:服务名对应多人拥有状态(1/0表示),以及服务名与人名重复列的情况,分别采用双层for循环和字典数据结构实现数据转换,最终生成Name对应的Services列表(逗号分隔)。此方法高效解决大量数据的人工处理难题,减少错误并提升效率。文中附带代码示例及执行结果截图,便于理解和实践。
407 5
|
10月前
|
人工智能 Java Linux
Python高效实现Excel转PDF:无Office依赖的轻量化方案
本文介绍无Office依赖的Python方案,利用Spire.XLS、python-office、Aspose.Cells等库实现Excel与PDF高效互转。支持跨平台部署、批量处理、格式精准控制,适用于服务器环境及自动化办公场景,提升转换效率与系统稳定性。
1026 7
|
10月前
|
机器学习/深度学习 监控 数据挖掘
Python 高效清理 Excel 空白行列:从原理到实战
本文介绍如何使用Python的openpyxl库自动清理Excel中的空白行列。通过代码实现高效识别并删除无数据的行与列,解决文件臃肿、读取错误等问题,提升数据处理效率与准确性,适用于各类批量Excel清理任务。
872 0
|
移动开发 JavaScript
(H5查看CAD)网页CAD提取图纸表格到excel
本文介绍如何通过自定义MxCAD插件,在Web端智能识别CAD图纸中的表格,实现自动合并与高效导出至Excel,提升数据提取效率与准确性。内容涵盖区域选择、图形识别、表格结构重建、单元格合并及内容导出等关键技术,适用于工程图纸数据自动化处理场景。
|
开发工具 Python
使用Python和OpenAPI将云上的安全组规则填写入Excel
本文介绍如何通过Python脚本自动化获取阿里云安全组及其规则信息,并将结果导出为Excel表格。相比CLI命令行方式,Python实现更高效、便捷,适用于需要批量处理和交付的场景。
使用Python和OpenAPI将云上的安全组规则填写入Excel
|
机器学习/深度学习 数据采集 数据可视化
Python数据分析,别再死磕Excel了!
Python数据分析,别再死磕Excel了!
547 2
|
存储 机器学习/深度学习 人工智能
多模态RAG实战指南:完整Python代码实现AI同时理解图片、表格和文本
本文探讨了多模态RAG系统的最优实现方案,通过模态特定处理与后期融合技术,在性能、准确性和复杂度间达成平衡。系统包含文档分割、内容提取、HTML转换、语义分块及向量化存储五大模块,有效保留结构和关系信息。相比传统方法,该方案显著提升了复杂查询的检索精度(+23%),并支持灵活升级。文章还介绍了查询处理机制与优势对比,为构建高效多模态RAG系统提供了实践指导。
3004 0
多模态RAG实战指南:完整Python代码实现AI同时理解图片、表格和文本
|
JavaScript 前端开发 数据可视化
20.6K star!Excel级交互体验!这款开源Web表格神器绝了!
Handsontable 是一款功能强大的 JavaScript 数据表格组件,提供类 Excel 的交互体验。支持实时协作、数据绑定、公式计算等企业级功能,可轻松集成到 React/Vue/Angular 等主流框架。
3152 11
|
人工智能 数据可视化 前端开发
Probly:开源 AI Excel表格工具,交互式生成数据分析结果与可视化图表
Probly 是一款结合电子表格功能与 Python 数据分析能力的 AI 工具,支持在浏览器中运行 Python 代码,提供交互式电子表格、数据可视化和智能分析建议,适合需要强大数据分析功能又希望操作简便的用户。
1963 2
如何根据Excel某列数据为依据分成一个新的工作表
在处理Excel数据时,我们常需要根据列值将数据分到不同的工作表或文件中。本文通过Python和VBA两种方法实现该操作:使用Python的`pandas`库按年级拆分为多个文件,再通过VBA宏按班级生成新的工作表,帮助高效整理复杂数据。

推荐镜像

更多