我的查询是关于正在开发的解析脚本的一部分的函数。我正在尝试编写一个python函数来查找与excel中匹配值对应的列号。 excel已经使用openpyxl动态创建,并且它具有第一行(从第3列)标题,每个标题将4个列合并为一个。在我的后续函数中,我正在解析一些要添加到与匹配头相对应的列的内容。 (附加信息:我正在解析的内容是blast +输出。我正在尝试创建一个摘要电子表格,每个列中的命中名称包含命中,间隙,跨度和标识的子列。前两列是查询重叠群,其中长度。)
我最初为xlrd编写了一个类似的函数,但它确实有效。但是当我尝试为openpyxl重写它时,我发现max_row和max_col函数错误地返回了比实际存在的更多的行和列。例如,我有20行用于此导频输入,但它报告为82。 请注意,我手动选择了空行&列,并右键单击并删除它们,如本论坛其他地方所建议的那样。这并没有改变错误。
def find_column_number(x):
col = 0
print "maxrow = ", hrsh.max_row
print "maxcol = ", hrsh.max_column
for rowz in range(hrsh.max_row):
print "now the row is ", rowz
if(rowz > 0):
pass
for colz in range(hrsh.max_column):
print "now the column is ", colz
name = (hrsh.cell(row=rowz,column=colz).value)
if(name == x):
col = colz
return col
这里讨论了max_row和max_col的问题https://bitbucket.org/openpyxl/openpyxl/issues/514/cell-max_row-reports-higher-than-actual我在这里应用了这个建议。但是max_row仍然是错误的。
for row in reversed(hrsh.rows):
values = [cell.value for cell in row]
if any(values):
print("last row with data is {0}".format(row[0].row))
maxrow = row[0].row
然后,我在https://www.reddit.com/r/learnpython/comments/3prmun/openpyxl_loop_through_and_find_value_of_the/尝试了该建议,并尝试获取列值。一次,脚本再次考虑空列并报告比实际存在的列数更多的列。
for currentRow in hrsh.rows:
for currentCell in currentRow:
print(currentCell.value)
你能帮我解决这个错误,或者提出另一种方法来实现我的目标吗?
答案 0 :(得分:2)
我与openpyxl的最新版本3.0.3具有相同的行为。我使用XLSX文件作为模板(从XLS文件创建),将其打开,添加一些数据,然后以其他名称保存。我发现max_row设置为49,但不知道为什么。
但是,在阅读在线文档https://openpyxl.readthedocs.io/en/stable/api/openpyxl.worksheet.worksheet.html之后,此行:
不要自己创建工作表,请使用 而是使用openpyxl.workbook.Workbook.create_sheet()
我直接从openpyxl创建了我的XLSX模板,如下所示:
Xamarin.Essentials
现在可以正常使用(max_row = 1)。希望对您有所帮助。
答案 1 :(得分:1)
正如错误报告中所述,您链接到工作表报告的维度与这些维度是否包含空行或列之间存在差异。如果max_row
和max_column
未报告您要查看的内容,则需要编写自己的代码以查找第一个完全为空的代码。当然,最有效的方法是从max_row
开始并向后工作,但以下内容可能就足够了:
for max_row, row in enumerate(ws, 1):
if all(c.value is None for c in row):
break
答案 2 :(得分:1)
我确认OP发现的错误。我发现较新的帖子报告max_row太大。 此错误无法修复。
就我而言,当我将工作表中所有单元格的值都设置为“无”时,它就会出现。 执行此操作后,工作表仍会报告旧尺寸。
对ws.calculate_dimensions()的调用不会更改任何内容。 关闭并重新启动excel仍然使openpyxl报告相同的错误尺寸。
这是一个问题,因为ws.append()从ws.max_row开始,并且没有任何方法可以覆盖此行为。您最终得到一个空白的工作表,然后在某处向下显示您添加的数据。
我发现解决此错误的唯一方法是在excel中手动删除整行。然后,openpyxl显示正确的max_row。
我发现,这与成员ws._cells不为空链接,因为将所有单元格都设置为None后应该如此。但是,由于该词典是私人成员,因此用户无法删除。
答案 3 :(得分:0)
今天我也遇到了同样的情况。我编辑了.xlsx
中使用的openpyxl
文件。我从最右边的列中删除了所有值,发现max_column
没有给出确切的max_column
。然后,我删除了先前删除了单元格值的columns
(右键单击“ ID”列并删除)。现在我发现它报告了正确的值。
答案 4 :(得分:0)
我使用了 Dharman 的方法并解决了问题。 我有一个超过 10 万行的 Excel 文件。我已经删除了这个文件中的重复项。 起初,max_row 报告的是删除前的总行数。 我使用 workbook.save(filename='another_filename.xlsx") 方法将原始 Excel 文件保存到一个新文件。 然后我使用 openpyxl 打开新文件(another_filanem.xlsx)。 max_row 现在报告正确的数字。
答案 5 :(得分:0)
当使用openpyxl max_row函数获取sheet中包含数据的最大行数时,有时甚至会统计空行,这是因为max_row函数返回的是sheet的最大行索引,而不是包含该数据的行数数据。
示例:假设创建一个 excel/google-sheet 文件,其中包含 10 行数据并删除了 5 行数据,openpyxl 的 max_row 函数返回最大行数为 10,作为最大值文件的行索引将为 10,因为文件最初包含 10 行。
所以要获取openpyxl中包含数据的最大行数
def get_maximum_rows(*, sheet_object):
rows = 0
for max_row, row in enumerate(sheet_object, 1):
if not all(col.value is None for col in row):
rows += 1
return rows
import openpyxl
workbook = openpyxl.load_workbook(<filepath>)
sheet_object = workbook.active
max_rows = get_maximum_rows(sheet_object=sheet_object)
答案 6 :(得分:0)
通常 max_row 和 max_col 会使您的脚本运行缓慢,也许最好检测 None 并存储行或 col 以防万一。