是否可以在不将整个文档加载到内存中的情况下获取Excel文档的行数?

Hub*_*bro 44 python openpyxl

我正在处理一个处理大量Excel 2007文件的应用程序,而我正在使用OpenPyXL来完成它.OpenPyXL有两种不同的读取Excel文件的方法 - 一种是"普通"方法,其中整个文档一次加载到内存中,另一种方法是使用迭代器逐行读取.

问题是,当我使用迭代器方法时,我没有得到任何文档元数据,如列宽和行/列数,我真的需要这些数据.我假设这些数据存储在靠近顶部的Excel文档中,因此不必将整个10MB文件加载到内存中以访问它.

那么,有没有办法获得行/列数和列宽,而无需先将整个文档加载到内存中?

dra*_*m90 92

除了Hubro所说的,显然get_highest_row()已经被弃用了.使用max_rowmax_column属性返回行和列计数.例如:

    wb = load_workbook(path, use_iterators=True)
    sheet = wb.worksheets[0]

    row_count = sheet.max_row
    column_count = sheet.max_column
Run Code Online (Sandbox Code Playgroud)

  • @Hussain `sheet = wb.active` 使用该版本对我来说效果很好 (3认同)

Hub*_*bro 16

此答案中建议的解决方案已被弃用,可能不再有效.


看一下OpenPyXL(IterableWorksheet)的源代码,我已经找到了如何从迭代器工作表中获取列数和行数:

wb = load_workbook(path, use_iterators=True)
sheet = wb.worksheets[0]

row_count = sheet.get_highest_row() - 1
column_count = letter_to_index(sheet.get_highest_column()) + 1
Run Code Online (Sandbox Code Playgroud)

IterableWorksheet.get_highest_column 返回一个字符串,其中包含您可以在Excel中看到的列字母,例如"A","B","C"等.因此,我还编写了一个函数来将列字母转换为基于零的索引:

def letter_to_index(letter):
    """Converts a column letter, e.g. "A", "B", "AA", "BC" etc. to a zero based
    column index.

    A becomes 0, B becomes 1, Z becomes 25, AA becomes 26 etc.

    Args:
        letter (str): The column index letter.
    Returns:
        The column index as an integer.
    """
    letter = letter.upper()
    result = 0

    for index, char in enumerate(reversed(letter)):
        # Get the ASCII number of the letter and subtract 64 so that A
        # corresponds to 1.
        num = ord(char) - 64

        # Multiply the number with 26 to the power of `index` to get the correct
        # value of the letter based on it's index in the string.
        final_num = (26 ** index) * num

        result += final_num

    # Subtract 1 from the result to make it zero-based before returning.
    return result - 1
Run Code Online (Sandbox Code Playgroud)

我仍然没有弄清楚如何获得列大小,所以我决定使用固定宽度的字体并在我的应用程序中自动缩放列.

  • 好吧,出于完全相同的原因,在读取时希望在文件的早期包含此信息,但在流式传输到文件时将其放在那里是不切实际的。这就是为什么它在规范中被视为可选功能的原因。所以你不会在 Google 的导出或 openpyxl 自己的只写模式中找到它。更好的解决方案是将元数据包含在包中的其他位置,但我们仍坚持原样的规范。openpyxl 会让您知道数据是否丢失并让您计算它(通过阅读整个工作表)。 (2认同)

小智 8

蟒蛇3

import openpyxl as xl

wb = xl.load_workbook("Sample.xlsx", enumerate)

#the 2 lines under do the same. 
sheet = wb.get_sheet_by_name('sheet') 
sheet = wb.worksheets[0]

row_count = sheet.max_row
column_count = sheet.max_column

#this works fore me.
Run Code Online (Sandbox Code Playgroud)

  • 为什么有一个“enumerate”作为“load_workbook()”的第二个参数。在文档中找不到这个。 (2认同)