openpyxl将表读取到python

问题描述

我正在尝试将excel表对象读入python,但找不到任何语法。 将整个表读入例如字典(我正在尝试不将熊猫作为该特定项目的依赖项)。 我找不到任何方法

解决方法

下面的代码将逐行读取表格,您也可以指定范围

import openpyxl  
  
wb = openpyxl.load_workbook('example.xlsx')  

sheet = wb.active

sheet['A1':'B7']

for i1,i2 in sheet:  
    print("{0:8} {1:8}".format(i1.value,i2.value))  

输出:

Student_name        Marks
Tony Stark           47
Loki                 59
Oddin                73
Nick Fury            62
Samaul               75
Peter Parkar         80

Output screenshot

,

我的工作方式如下:

import openpyxl


def all_tables_data(filename: str) -> dict:
    """
    Get values for all tables in a spreadsheet.
    Returns a dict of tables,keyed by table name.
    Table values are given as lists of lists.
    """
    workbook = openpyxl.load_workbook(filename)
    tables_by_name = {}
    table_worksheets = {}
    for worksheet in workbook.worksheets:
        for table in worksheet._tables:
            tables_by_name[table.name] = table
            table_worksheets[table.name] = worksheet

    def get_vals(table_name: str) -> list:
        worksheet = table_worksheets[table_name]
        cell_range = worksheet[tables_by_name[table_name].ref]
        return [[cell.value for cell in row] for row in cell_range]

    return {table_name: get_vals(table_name) for table_name in tables_by_name}


if __name__ == "__main__":
    FILENAME = "my_spreadsheet.xlsx"
    TABLES = all_tables_data(FILENAME)
    print(TABLES)

我对将表转换为字典很感兴趣。 通常,表中的行/条目可能具有> 1键。 假设表有标题行,我还将下面的代码拼凑在一起。 它可用于将表转换为行的字典,每行都是值的字典,由列标题作为键。

class WorkbookWithTables:
    def __init__(self,workbook):
        self.workbook = workbook
        self.tables_by_name = {}
        self.table_worksheets = {}
        for worksheet in self.workbook.worksheets:
            for table in worksheet._tables:
                self.tables_by_name[table.name] = table
                self.table_worksheets[table.name] = worksheet

    @classmethod
    def from_file(cls,filename):
        _workbook = openpyxl.load_workbook(filename)
        return cls(_workbook)

    def table_to_dict(self,table_name,n_keys=1):
        worksheet = self.table_worksheets[table_name]
        cell_range = worksheet[self.tables_by_name[table_name].ref]
        table_dict = {}
        value_headers = tuple(cell.value for cell in cell_range[0][n_keys:])
        for row in cell_range[1:]:
            if n_keys == 1:
                key = row[0].value
            else:
                key = tuple(partial_key.value for partial_key in row[:n_keys])
            values = {
                value_headers[i]: cell.value
                for i,cell in enumerate(row[n_keys:])
            }
            table_dict[key] = values
        return table_dict


if __name__ == "__main__":
    FILENAME = "my_spreadsheet.xlsx"
    WB = WorkbookWithTables.from_file(FILENAME)
    MY_SINGLE_KEYED_TABLE = WB.table_to_dict("my_single_keyed_table")
    MY_DOUBLE_KEYED_TABLE = WB.table_to_dict("my_double_keyed_table",2)