65

我正在开发一个处理大型 Excel 2007 文件的应用程序,我正在使用OpenPyXL来完成它。OpenPyXL 有两种不同的读取 Excel 文件的方法——一种是“普通”方法,即一次将整个文档加载到内存中,另一种方法是使用迭代器逐行读取。

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

那么,有没有办法在不先将整个文档加载到内存中的情况下获得行/列数和列宽?

4

6 回答 6

128

加上 Hubro 所说的,显然get_highest_row()已被弃用。使用max_rowandmax_column属性返回行数和列数。例如:

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

    row_count = sheet.max_row
    column_count = sheet.max_column
于 2015-09-10T22:52:10.113 回答
17

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


看一下 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

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

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

于 2012-11-14T14:32:13.663 回答
3

蟒蛇 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.
于 2019-10-15T07:55:39.653 回答
2

这可能非常令人费解,我可能会遗漏明显的内容,但是如果没有 OpenPyXL 填充 Iterable Worksheets 中的 column_dimensions (请参阅我上面的评论),我可以看到在不加载所有内容的情况下找到列大小的唯一方法是直接解析 xml :

from xml.etree.ElementTree import iterparse
from openpyxl import load_workbook
wb=load_workbook("/path/to/workbook.xlsx", use_iterators=True)
ws=wb.worksheets[0]
xml = ws._xml_source
xml.seek(0)

for _,x in iterparse(xml):

    name= x.tag.split("}")[-1]
    if name=="col":
        print "Column %(max)s: Width: %(width)s"%x.attrib # width = x.attrib["width"]

    if name=="cols":
        print "break before reading the rest of the file"
        break
于 2012-11-15T12:27:49.483 回答
1

使用熊猫的选项。

  1. 获取具有行数和列数的所有工作表名称。
import pandas as pd
xl = pd.ExcelFile('file.xlsx')
sheetnames = xl.sheet_names
for sheet in sheetnames:
    df = xl.parse(sheet)
    dimensions = df.shape
    print('sheetname', ' --> ', dimensions)
  1. 行和列的单张计数。
import pandas as pd
xl = pd.ExcelFile('file.xlsx')
sheetnames = xl.sheet_names
df = xl.parse(sheetnames[0])   # [0] get first tab/sheet.
dimensions = df.shape
print(f'sheetname: "{sheetnames[0]}" - -> {dimensions}')

输出sheetname "Sheet1" --> (row count, column count)

于 2021-07-21T14:57:14.217 回答
0

https://pythonhosted.org/pyexcel/iapi/pyexcel.sheets.Sheet.html 参见:row_range() 实用函数获取行范围

如果你使用 pyexcel,可以调用 row_range 获取最大行数。

python 3.4 测试通过。

于 2016-01-08T03:41:31.983 回答