【问题标题】:Iterate over Worksheets, Rows, Columns迭代工作表、行、列
【发布时间】:2017-08-15 21:55:03
【问题描述】:

我想使用openpyxl在python中打印特定列的所有数据(所有行)我正在以这种方式工作;

from openpyxl import load_workbook
workbook = load_workbook('----------/dataset.xlsx')
sheet = workbook.active  
for i in sheet:
   print(sheet.cell(row=i, column=2).value)

但它给了

如果行

因为我在row=i 中进行迭代。如果我使用sheet.cell(row=4, column=2).value,它会打印单元格的值。但是如何遍历所有文档呢?

编辑 1

在一些研究中,发现可以使用Sheet Name 获取数据。 Sheet 1 存在于 .xlsx 文件中,但其数据未打印。这段代码有问题吗?

workbook = load_workbook('---------------/dataset.xlsx')
print(workbook.get_sheet_names())
worksheet =workbook.get_sheet_by_name('Sheet1')
c=2
for i in worksheet: 
    d = worksheet.cell(row=c, column=2)
    if(d.value is None):
        return
    else:
        print(d.value)
    c=c+1

【问题讨论】:

标签: python openpyxl


【解决方案1】:

此代码会像读取 csv 文件一样读取工作表,并使用第一行作为列标题填充 result 中的字典列表。

        from openpyxl import load_workbook

        result = []
        wb = load_workbook(filename=file_name)
        sheet = wb.active
        col_count = sheet.max_column
        column_names = {}
        for c in range(1, col_count):
            heading = sheet.cell(row=1, column=c).value
            if not heading:
                col_count = c
                break
            column_names[c] = heading

        for r, row_cells in enumerate(sheet.iter_rows(2), 2):
            row = {}
            for c in range(1, col_count):
                value = sheet.cell(row=r, column=c).value
                if type(value) == datetime:
                    value = value.strftime('%Y-%m-%d')
                row[column_names[c]] = value
            result.append(row)

【讨论】:

    【解决方案2】:

    阅读OpenPyXL Documentation

    遍历workbook中的所有worksheets,例如:

    for n, sheet in enumerate(wb.worksheets):
        print('Sheet Index:[{}], Title:{}'.format(n, sheet.title))
    

    输出

    Sheet Index:[0], Title: Sheet    
    Sheet Index:[1], Title: Sheet1    
    Sheet Index:[2], Title: Sheet2    
    

    一个工作表中遍历所有rowscolumns

    worksheet = workbook.get_sheet_by_name('Sheet')
    
    for row_cells in worksheet.iter_rows():
        for cell in row_cells:
           print('%s: cell.value=%s' % (cell, cell.value) )
    

    输出

    <Cell Sheet.A1>: cell.value=²234
    <Cell Sheet.B1>: cell.value=12.5
    <Cell Sheet.C1>: cell.value=C1
    <Cell Sheet.D1>: cell.value=D1
    <Cell Sheet.A2>: cell.value=1234
    <Cell Sheet.B2>: cell.value=8.2
    <Cell Sheet.C2>: cell.value=C2
    <Cell Sheet.D2>: cell.value=D2  
    

    迭代一个 row中的所有columns,例如row==2

    for row_cells in worksheet.iter_rows(min_row=2, max_row=2):
        for cell in row_cells:
            print('%s: cell.value=%s' % (cell, cell.value) )  
    

    输出

    <Cell Sheet.A2>: cell.value=1234  
    <Cell Sheet.B2>: cell.value=8.2  
    <Cell Sheet.C2>: cell.value=C2  
    <Cell Sheet.D2>: cell.value=D2  
    

    迭代所有 rows,仅column 2

    for col_cells in worksheet.iter_cols(min_col=2, max_col=2):
        for cell in col_cells:
            print('%s: cell.value=%s' % (cell, cell.value))
    

    输出

    <Cell Sheet.B1>: cell.value=12.5
    <Cell Sheet.B2>: cell.value=8.2
    <Cell Sheet.B3>: cell.value=9.8
    <Cell Sheet.B4>: cell.value=10.1
    <Cell Sheet.B5>: cell.value=7.7
    

    使用 Python:3.4.2 - openpyxl:2.4.1 - LibreOffice:4.3.3.2 测试

    【讨论】:

    • 如何只获取Sheet1的数据?
    • 我需要特定列但所有行的数据。假设我只需要整个文档的第二列值。
    【解决方案3】:

    试试这个,

    from openpyxl import load_workbook
    workbook = load_workbook('----------/dataset.xlsx')
    sheet = workbook.active
    row_count = sheet.max_row
    for i in range(row_count):
       print(sheet.cell(row=i, column=2).value)
    

    【讨论】:

    • 行名和列名应以 1 开头,此解决方案将读取工作表中的每个单元格和列。
    猜你喜欢
    • 2013-09-08
    • 2023-03-17
    • 2022-06-22
    • 2010-11-16
    • 2015-05-20
    • 1970-01-01
    • 2012-10-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多