Search code examples
powerquerym

How to get Tables from Navigator Pane and Combine


This is the corrected code with the guidance from Alexis. My PDF returns two tables (and 1 page Table) per output page. Table001 is a throw away. I only need even numbered Tables so I use the List.Select to remove the Page Table and List.Alternate to skip odd numbered tables.

let
    Source = Pdf.Tables(File.Contents("State_Fico.pdf"), [Implementation="1.3"]),
    TableNames = List.Alternate(List.Select(Table.Column(Source, "Id"),each Text.Contains(_,"Table")),1,1),
    TableList = List.Transform(TableNames, each Source{[Id=_]}[Data]),
    CombineTables = Table.Combine(TableList)
in
    CombineTables

This allows me to generate 1 table no matter how many pages the pdf is.


Solution

  • While this doesn't really answer the question in your title, I think the best way to do what you're ultimately after is to not use Expression.Evaluate at all and, instead, use list transformation(s).

    For example, if you want to append Table002 and Table004, you can use Table.Combine on a list of tables, {Table002, Table004}.

    Here's what the code might look like:

    let
        Source = Pdf.Tables(File.Contents("State_Fico.pdf"), [Implementation="1.3"]),
        #"Transposed Table" = Table.Transpose(Source),
        #"Promoted Headers" = Table.PromoteHeaders(#"Transposed Table", [PromoteAllScalars=true]),
        #"Changed Type" = Table.TransformColumnTypes(#"Promoted Headers",{{"Page001", type any}, {"Table001", type any}, {"Page002", type any}, {"Table002", type any}, {"Table003", type any}, {"Table004", type any}}),
        ColumnNames = Table.ColumnNames(#"Changed Type"),
        TableNames = List.Alternate(List.Select(ColumnNames, each Text.Contains(_ ,"Table")),1,1),
        //--New Steps Below--//
        TableList = List.Transform(TableNames, each Source{[ID=_]}[Data]),
        CombineTables = Table.Combine(TableList)
    in
        CombineTables