Считать таблицу листов Excel (Listobject) в python с пандами - PullRequest
1 голос
/ 15 октября 2019

Существует несколько способов чтения данных Excel в Python. Pandas предоставляет также API для написания и чтения

import pandas as pd
from pandas import ExcelWriter
from pandas import ExcelFile

df = pd.read_excel('File.xlsx', sheetname='Sheet1')

Это прекрасно работает.

НО: как можно получить доступ к таблицам каждого листа непосредственно в кадре данных pandas ??

enter image description here

На приведенном выше рисунке показан лист, включающий таблицу РАЗДЕЛЕННАЯ, ЧЕМ КЛЕТОЧНАЯ (1,1).

Кроме того, лист может содержать несколько таблиц(списки объектов в VBA).

Я не могу нигде найти способ прочитать их в панд.

Примечание 1: Невозможно изменить книгу, чтобы привести все таблицы к ячейке (1, 1). Примечание 2: Я хотел бы использовать только панд (если это возможно) и минимизировать необходимость импорта других библиотек. Но другого пути я не могу использовать другим lybray. В любом случае я не смог, например, справиться с xlwings.

здесь похоже, что возможно проанализировать файл excel, но не предоставляется никаких ограничений для таблиц, только для полных листов.

Документация о пандах , похоже, не дает такой возможности.

Спасибо.

1 Ответ

2 голосов
/ 15 октября 2019

Вот способ проанализировать одну таблицу, однако вам нужно знать некоторую информацию о проанализированном файле.

df = pd.read_excel("file.xlsx", usecols="B:I", index_col=3)
print(df)

Не элегантно и работает, только если внутри листа присутствует одна таблица, но это первый шаг:

import pandas as pd
import string

letter = list(string.ascii_uppercase)

df1 = pd.read_excel("file.xlsx")

def get_start_column(df):
    for i, column in enumerate(df.columns):
        if df[column].first_valid_index():
            return letter[i]

def get_last_column(df):
    columns = df.columns
    len_column = len(columns)
    for i, column in enumerate(columns):
        if df[column].first_valid_index():
            return letter[len_column - i]

def get_first_row(df):
    for index, row in df.iterrows():
        if not row.isnull().values.all():
            return index + 1

def usecols(df):
    start = get_start_column(df)
    end = get_last_column(df)
    return f"{start}:{end}"

df = pd.read_excel("file.xlsx",  usecols=usecols(df1), header=get_first_row(df1)) 
print(df)
...