首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Openpyxl中找到最后一个非空白单元格?

如何在Openpyxl中找到最后一个非空白单元格?
EN

Stack Overflow用户
提问于 2018-12-19 13:21:44
回答 1查看 9.5K关注 0票数 3

Openpyxl可以告诉我max_rowmax_col,这是Excel表的“使用范围”。但是,如果以前选择或更改了没有内容的单元格,则此范围可以包括这些单元格。

我想知道有内容的最后一列和最后一行。

(这是VBA的讨论。)

例如,如果-在这里表示已使用范围中的空白,而_表示在已使用范围之外的空白,则我希望选择标记为b的列和标记为c的行,即使Openpyxl和将在计算max_rowmax_col时包含带有虚线的行/列。

代码语言:javascript
运行
复制
aaaaa---__
aaaaa-b-__
aaaaa---__
--------__
--c-----__
--------__
__________
__________
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-12-19 14:20:06

我发现openpyxl确实报告了保存的文件的max_row和max_col的正确值,但是如果您在保存之前操作工作表的内容并需要这些值,那么问题仍然存在。

没有内置的方法来实现这一点,所以您的最佳选择是自己搜索行和列,最好是从报告的值开始搜索,然后向上搜索和向左搜索。

工作表对象允许您单独访问行,但只能通过.itercols()访问单个列。这是否更快,扫描所有列在一个循环将取决于您期望的工作表是多么空。

代码语言:javascript
运行
复制
from openpyxl import load_workbook
wb = load_workbook('test.xlsx')
wb.worksheets[0]['h6'] = None

print((wb.worksheets[0].max_row, wb.worksheets[0].max_column))

def find_edges(sheet):
    row = sheet.max_row
    while row > 0:
        cells = sheet[row]
        if all([cell.value is None for cell in cells]):
            row -= 1
        else:
            break
    if row == 0:
        return 0, 0

    column = sheet.max_column
    while column > 0:
        cells = next(sheet.iter_cols(min_col=column, max_col=column, max_row=row))
        if all([cell.value is None for cell in cells]):
            column -= 1
        else:
            break
    return row, column

print(find_edges(wb.worksheets[0]))

在本例中,我加载了一个包含您建议的数据的Excel表,其中的值仍然在H6中,该值将在第3行中删除。

它首先打印由max_row报告的max_columnopenpyxl,然后用工作表调用find_edges,以找到所需的实际值。

对于数据很少的大型工作表,一旦确定了最后一行(以限制大小),您可能希望尝试替换列扫描的速度,只需迭代所有列,如下所示:

代码语言:javascript
运行
复制
columns = sheet.iter_cols(max_row=row)
column = 1
ci = 1
while True:
    try:
        cells = next(columns)
        if not all([cell.value is None for cell in cells]):
            column = ci
        ci += 1
    except StopIteration:
        break

但我认为,对于大多数有用的用例来说,第一种方法是最快的。

如果你喜欢短小而不是可读的:

代码语言:javascript
运行
复制
def find_edges2(sheet):
    def row():
        for r in range(sheet.max_row, 0, -1):
            if not all([cell.value is None for cell in sheet[r]]):
               return r

    row = row()
    if not row:
        return 0, 0

    def column():
        for c in range(sheet.max_column, 0, -1):
            if not all([cell.value is None for cell in next(sheet.iter_cols(min_col=c, max_col=c, max_row=row))]):
                return c

    return row, column()
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53852149

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档