【发布时间】:2021-10-12 20:34:29
【问题描述】:
我很难找到与我的问题相关的任何内容。到目前为止,我发现的只是根据静态范围选择范围,但不幸的是,数据可能每周都在变化。
在同一张工作表中有多个具有不同行和列的数据块,但在数据上方有标题。我的目标是找到一个标题,即第 36 行或第 40 行,向下移动一行并基本上执行 ctrl+down ctrl+right 来选择一个范围,然后创建一个表格并根据标题命名一个表格。
import openpyxl
def tables(title):
for cell in pws_sheet["A"]: #pws_sheet["A"] will return all cells on the A column until the last one
if (cell.value is not None): #check if cell is not empty
if title in cell.value: #check if the value of the cell contains the title
row_coord = cell.row #put row number into a variable
tables("All Call Distribution by Hour")
我目前能够根据标题找到行,将标题保存到变量中,但我不知道如何选择每个数据块的右下角并将其选择为范围并创建该范围内的表格。
编辑 1: 标题行是正确的,结束行的行为类似于 max_row,num_cols 显示的是 cell.values 而不是该表的单个最大列。
def find_table(title, sheet):
title_row = None
for row in sheet.iter_rows():
if row[0].value == title:
#Find the title row
title_row = row[0].row
if row[0].value is None and title_row:
end_row = row[0].row - 1
num_cols = [cell.value for cell in sheet[title_row+1] if cell.value is not None]
else:
#The last row in the sheet
end_row = row[0].row
print(f"Row: {title_row}, Column: {num_cols}, End Row: {end_row}")
return title_row, num_cols, end_row
输出:Row: 40, Column: ['Within', '# Calls', '% Calls'], End Row: 138
【问题讨论】:
-
我尝试了 max_row 和 max_column 的变体,但无论我在哪个数据块中,max_column 都会给出最远的列。
-
您是否尝试过检测空单元格/行/列来确定表格的限制?
-
不幸的是,从某种意义上说,这些都是使用过的单元格。所以我不太确定如何将它插入到循环中。理想情况下,由于所有内容都可以在“A”列中找到,我可以搜索:标题,找到空白行,从标题下方的行到空白行上方选择,创建表格。在这一点上,虽然我只想能够选择标题下面的行到空白行并称之为好。我已经研究了一周,但我发现的一切都与静态范围有关。
-
理想情况下应该是
Loop until BLANK cell, select row below title(top-left cell) and max_column(bot-right cell), create table -
一种可能会有所帮助(甚至可能需要让您解决问题的策略)是每个工作表只有一个表格,因此表格总是从左上角向下延伸,没有撞到另一张桌子的风险