【问题标题】:Python Openpyxl sheet.dimensionsPython Openpyxl sheet.dimensions
【发布时间】:2019-02-04 04:02:11
【问题描述】:
我有一个包含数据的电子表格,并且想知道包含数据的区域的第一个和最后一个单元格。我将 Python 与 Openpyxl 一起使用。 sheet.dimensions 属性返回非空单元格区域的左上角和右下角单元格。
如何将 sheet.dimensions 的结果放入 2 个变量中。示例:sheet.dimensions 的结果是 A2:C20。
我需要一个包含范围的第一个单元格的变量(在本例中为 A2)和另一个包含范围的最后一个单元格的变量(在本例中为 C20)。
我期待像 sheet.dimensions.first 和 .last 这样的东西,但到目前为止我找不到答案。
the spreadsheet
程序基本如下:
导入openpyxl
book = openpyxl.load_workbook('test 1.xlsx', data_only=True)
sheet = book.active
打印(sheet.dimensions)
book.save("结果测试 1.xlsx")
当程序运行时,它会给出结果 A2:C20。
【问题讨论】:
-
你能告诉我们你到目前为止尝试了什么吗?很高兴看到MCVE。
标签:
excel
python-3.x
openpyxl
【解决方案1】:
我发现openpyxl有以下属性:
- sheet.min_row
- sheet.max_row
- sheet.min_column
- sheet.max_column
这些正是我需要的数字,通过这些我知道处理整个工作表需要多少次迭代。
示例:
导入openpyxl
book = openpyxl.load_workbook('test 1.xlsx', data_only=True)
sheet = book.active
mi_row = sheet.min_row
ma_row = sheet.max_row
mi_col = sheet.min_column
ma_col = sheet.max_column
打印(mi_row,mi_col,ma_row,ma_col)
对于 sheet.iter_rows 中的行(min_row=mi_row, min_col=mi_col, max_row=ma_row, max_col=ma_col):
for cell in row:
pop = (cell.value)
print(pop)
【解决方案2】:
会认为只在字符串返回上使用split 方法会让你开始。这将为您提供两个单元格地址,然后 Openpyxl 具有用作参数的方法来返回单元格对象(在这些地址处)。
语法是这样的,不应该有超过一个冒号,但可能需要为工作表上的单个单元格捕获奇怪的情况(也许根本没有冒号)。会认为这可能会完成这项工作:
upper_left, lower_right = return_string.split(":")
【解决方案3】:
有点晚了,但对于其他使用 openpyxl 的人来说,它有一些有用的实用功能可以做到这一点,并且可以处理任何奇怪的边缘情况。
from openpyxl import load_workbook
from openpyxl.utils.cell import range_boundaries, get_column_letter
wb_path = 'test 1.xlsx'
wb = load_workbook(wb_path, data_only=True)
ws = wb.active
# utility functions offer robust handling of excel range strings
test_ranges = [
"A1:C3", # -> A1 and C3
"$A1:C$3", # -> A1 and C3
"A2", # -> A2 and A2
ws.dimensions, # OP's answer
]
for rng in test_ranges:
# where the magic happens
sc, sr, ec, er = range_boundaries(rng)
start_cell = get_column_letter(sc) + str(sr)
end_cell = get_column_letter(ec) + str(er)
print(f"{start_cell} and {end_cell}")