鱼C论坛

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

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

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

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

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

x
  1. t1 = sh1.used_range.last_cell
  2. 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 的字符串处理方法来达到同样的效果。以下是一个更直观的方法:

  1. import re

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

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

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

  8. print(column)  # 输出列号:R
  9. print(int(row))  # 输出行号:606
复制代码

这段代码首先将地址中的"$"符号去掉,然后利用 Python 的字符串 split 方法将列号和行号分割开。这个方法更直观,但是假设单元格地址的格式始终是先列后行,并且列名中不包含数字。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-5-10 23:15:47 | 显示全部楼层
可以使用xlwings中的 address 方法来获取单元格地址,然后使用正则表达式提取出列号和行号。具体实现如下:
  1. import re
  2. # 获取单元格地址
  3. cell_address = sh1.used_range.last_cell.address
  4. # 提取出列号和行号
  5. match = re.match(r'\$?([A-Z]+)\$?(\d+)', cell_address)
  6. column = match.group(1)
  7. row = int(match.group(2))
  8. print(column)  # 输出列号:R
  9. print(row)  # 输出行号:606
复制代码

其中,正则表达式 \$?([A-Z]+)\$?(\d+) 可以匹配类似于 $R$606 、 R606 、 $R606 、 R$606 等格式的单元格地址。 match.group(1) 获取到的是列号, match.group(2) 获取到的是行号。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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


  1. import xlwings as xw

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

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

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

  9. print(f"列:{col_letter},行:{row_num}")
复制代码


注意,需要将列字母转化为列号,可以使用`xw.utils.column_index_from_string`函数实现,它会返回一个 int 类型的列号。
有用请设置最佳答案
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-10 23:21:02 | 显示全部楼层
  1. print(str(t1)[str(t1).find('!')+1:-1].replace('$', ''))
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

将简单的问题复杂化
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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


您好,我这出现了错误提示,是不是哪不对?另外,需要 提取“R”,不是18哦,谢谢!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

谢谢回复,这个能实现结果,但好像正则表达式有点难,有没有更易于理解的方法?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

  1. import re

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

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

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

  8. print(column)  # 输出列号:R
  9. print(int(row))  # 输出行号:606
复制代码

这段代码首先将地址中的"$"符号去掉,然后利用 Python 的字符串 split 方法将列号和行号分割开。这个方法更直观,但是假设单元格地址的格式始终是先列后行,并且列名中不包含数字。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-11 08:53:04 | 显示全部楼层
感谢,小甲鱼师傅,yyds!!!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-12 08:58:51 | 显示全部楼层
感激分享,认真学习。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-24 01:16

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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