Как прочитать несколько таблиц на листе из Excel в DataFrame, где таблицы имеют недетерминированные местоположения? - PullRequest
0 голосов
/ 27 августа 2018

Какой самый простой способ прочитать выделенную таблицу на скриншоте ниже из Excel в Pandas DataFrame? Предположим, у меня есть тысячи таких листов. Область, которую я хочу прочитать, имеет «Col4» в верхнем левом углу и не имеет всю пустую строку или столбец. «Col4» может появиться в любом (строка, столбец) на листе.

Полагаю, я всегда могу пойти с применением метода грубой силы, где я сначала читаю весь лист, нахожу позицию "Col4", а затем извлекаю нужную мне часть. Но мне интересно, есть ли более простой способ сделать это.

Кроме того, до сих пор я работал только с Пандами. Я знаю, что есть много других пакетов, кроме панд, таких как xlwings или xlrd. Если вы знаете, что любой из этих пакетов может быть полезен, пожалуйста, дайте мне знать, и он будет очень признателен.

enter image description here

Обратите внимание, что этот вопрос не является дубликатом pandas read_excel нескольких таблиц на одном листе , поскольку решение в этом посте обрабатывает только случай, когда смещение строки известно заранее.

Бизнес-проблема, стоящая за этим, я решаю, состоит в том, чтобы прочитать много электронных таблиц, созданных неинженерными бригадами (HR, бухгалтерия и т. Д.) В моей компании, и, к сожалению, они не создали электронные таблицы в последовательном и дружественном для программирования путь.

1 Ответ

0 голосов
/ 07 ноября 2018

Python довольно мощный, но я не думаю, что вы получите ту гибкость, которую вы ищете, используя его в Excel. Может быть, кто-то опубликует решение, но если нет, вы можете использовать VBA для этой задачи, а когда все объединено в один лист, используйте Python для чтения из этого единственного источника.

Sub CopyRangeFromMultipleSheets()

'Declaring variables
Dim Source As Worksheet
Dim Destination As Worksheet
Dim SourceLastRow, DestLastRow As Long

Application.ScreenUpdating = False

'Looping through all sheets to check whether "Master" sheet exist
For Each Source In ThisWorkbook.Worksheets
    If Source.Name = "Master" Then
        MsgBox "Master sheet already exist"
        Exit Sub
    End If
Next

'Inserting a new sheet after the "Main" sheet
Set Destination = Worksheets.Add(after:=Sheets("Sheet1"))

Destination.Name = "Master"

'Looping through all the sheets in the workbook
For Each Source In ThisWorkbook.Worksheets

    'Preventing consolidation of data from "Main" and "Master" sheet
    If Source.Name <> "Master" Then

        SourceLastRow = Source.Range("A1").SpecialCells(xlLastCell).Row

        Source.Activate

        If Source.UsedRange.Count > 1 Then

            DestLastRow = Sheets("Master").Range("A1").SpecialCells(xlLastCell).Row

            If DestLastRow = 1 Then
                'copying data from the source sheet to destination sheet
                Source.Range("D1", Range("T1").SpecialCells(xlLastCell)).Copy Destination.Range("A" & DestLastRow)
            Else
                Source.Range("D1", Range("T1").SpecialCells(xlCellTypeLastCell)).Copy Destination.Range("A" & (DestLastRow + 1))
            End If

        End If
    End If
Next

Destination.Activate

Application.ScreenUpdating = True

End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...