鱼C论坛

 找回密码
 立即注册
查看: 2660|回复: 9

[已解决]Excel 中行号和列号提取

[复制链接]
发表于 2023-5-10 23:15:21 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
t1 = sh1.used_range.last_cell
print (t1)

使用xlwings得到了已使用区域的last_cell,地址如下:
<Range [Test.xls]Sheet0!$R$606>

怎么把对应的列“R”和行“606”提取出来?
(需要提取“R”,而不是序号18)
最佳答案
2023-5-10 23:42:39
horacepython 发表于 2023-5-10 23:32
谢谢回复,这个能实现结果,但好像正则表达式有点难,有没有更易于理解的方法?

当然,对于不熟悉正则表达式的人来说,这种方法可能会显得有些复杂。你也可以使用 Python 的字符串处理方法来达到同样的效果。以下是一个更直观的方法:
import re

# 获取单元格地址
cell_address = sh1.used_range.last_cell.address

# 去除"$"符号
cell_address = cell_address.replace('$', '')

# 分割字符串,提取列号和行号
column, row = re.split('(\d+)', cell_address)

print(column)  # 输出列号:R
print(int(row))  # 输出行号:606
这段代码首先将地址中的"$"符号去掉,然后利用 Python 的字符串 split 方法将列号和行号分割开。这个方法更直观,但是假设单元格地址的格式始终是先列后行,并且列名中不包含数字。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-5-10 23:15:47 | 显示全部楼层
可以使用xlwings中的 address 方法来获取单元格地址,然后使用正则表达式提取出列号和行号。具体实现如下:
import re# 获取单元格地址cell_address = sh1.used_range.last_cell.address# 提取出列号和行号match = re.match(r'\$?([A-Z]+)\$?(\d+)', cell_address)column = match.group(1)row = int(match.group(2))print(column)  # 输出列号:Rprint(row)  # 输出行号:606
其中,正则表达式 \$?([A-Z]+)\$?(\d+) 可以匹配类似于 $R$606 、 R606 、 $R606 、 R$606 等格式的单元格地址。 match.group(1) 获取到的是列号, match.group(2) 获取到的是行号。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-10 23:18:59 | 显示全部楼层
可以使用xlwings的Range对象的row和column属性分别获取对应的行号和列字母。如下所示:
import xlwings as xw

# 打开工作簿
wb = xw.Book('Test.xls')

# 获取已使用区域的last_cell
t1 = wb.sheets['Sheet0'].used_range.last_cell

# 分别获取行、列信息
row_num = t1.row
col_letter = xw.utils.column_index_from_string(t1.column)

print(f"列:{col_letter},行:{row_num}")

注意,需要将列字母转化为列号,可以使用`xw.utils.column_index_from_string`函数实现,它会返回一个 int 类型的列号。
有用请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-10 23:21:02 | 显示全部楼层
print(str(t1)[str(t1).find('!')+1:-1].replace('$', ''))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-10 23:21:29 | 显示全部楼层
isdkz 发表于 2023-5-10 23:15
可以使用xlwings中的 address 方法来获取单元格地址,然后使用正则表达式提取出列号和行号。具体实现如下: ...

将简单的问题复杂化
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-5-10 23:31:11 | 显示全部楼层
sfqxx 发表于 2023-5-10 23:18
可以使用xlwings的Range对象的row和column属性分别获取对应的行号和列字母。如下所示:
col_letter = xw.utils.column_index_from_string(t1.column)
Traceback (most recent call last):
  File "<pyshell#31>", line 1, in <module>
    col_letter = xw.utils.column_index_from_string(t1.column)
AttributeError: module 'xlwings.utils' has no attribute 'column_index_from_string'

您好,我这出现了错误提示,是不是哪不对?另外,需要 提取“R”,不是18哦,谢谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-5-10 23:32:36 | 显示全部楼层
isdkz 发表于 2023-5-10 23:15
可以使用xlwings中的 address 方法来获取单元格地址,然后使用正则表达式提取出列号和行号。具体实现如下: ...

谢谢回复,这个能实现结果,但好像正则表达式有点难,有没有更易于理解的方法?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-10 23:42:39 | 显示全部楼层    本楼为最佳答案   
horacepython 发表于 2023-5-10 23:32
谢谢回复,这个能实现结果,但好像正则表达式有点难,有没有更易于理解的方法?

当然,对于不熟悉正则表达式的人来说,这种方法可能会显得有些复杂。你也可以使用 Python 的字符串处理方法来达到同样的效果。以下是一个更直观的方法:
import re

# 获取单元格地址
cell_address = sh1.used_range.last_cell.address

# 去除"$"符号
cell_address = cell_address.replace('$', '')

# 分割字符串,提取列号和行号
column, row = re.split('(\d+)', cell_address)

print(column)  # 输出列号:R
print(int(row))  # 输出行号:606
这段代码首先将地址中的"$"符号去掉,然后利用 Python 的字符串 split 方法将列号和行号分割开。这个方法更直观,但是假设单元格地址的格式始终是先列后行,并且列名中不包含数字。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-11 08:53:04 | 显示全部楼层
感谢,小甲鱼师傅,yyds!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-12 08:58:51 | 显示全部楼层
感激分享,认真学习。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-28 03:16

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表