如何从Excel到DataFrame读取工作表中的多个表,其中表具有不确定的位置?

时间:2018-08-27 18:56:05

标签: python excel pandas

将以下屏幕快照中突出显示的表格从Excel读入Pandas DataFrame的最简单方法是什么?假设我有成千上万个这样的工作表。我要阅读的区域在左上角有“ Col4”,并且没有整个空白行或列。 “ Col4”可以出现在工作表上的任何位置(行,列)。

我想我总是可以采用残酷的方法,首先读取整张纸,找到“ Col4”的位置,然后提取想要的部分。但是我想知道是否有更简单的方法可以做到这一点。

此外,到目前为止,我只与Pandas合作。我知道除了熊猫还有很多其他的软件包,例如xlwings或xlrd。如果您知道这些软件包中的任何一个都可以提供帮助,请告诉我,我们也将不胜感激。

enter image description here

请注意,此问题不是pandas read_excel multiple tables on the same sheet的重复,因为该帖子中的解决方案仅处理事先知道行偏移量的情况。

我要解决的业务问题是读取公司中非工程人员(人力资源,会计等)创建的许多电子表格,但不幸的是,他们没有以一致且易于编程的方式创建电子表格办法。

1 个答案:

答案 0 :(得分:0)

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