Power QueryでPDFの表を読み込み、ヘッダーを昇格して結合する方法

PDFに含まれる表を、Power Queryで直接読み込み、ヘッダー行を昇格させたうえで単一のテーブルに結合する手順をご説明いたします。ファイルパスや列名、変数名は本記事用に変更しております。


目次

Mコード(「詳細エディター」に記述)

let
    // 1) PDFファイルを読み込み
    PdfBinary   = File.Contents("C:\Data\Samples\reports\sample_tables.pdf"),

    // 2) PDF内の要素をテーブル化
    PdfTables   = Pdf.Tables(PdfBinary),

    // 3) 「表」だけに限定(Kind 列で判定)
    OnlyTables  = Table.SelectRows(PdfTables, each [Kind] = "Table"),

    // 4) Data 列(各表の本体テーブル)を取り出してリスト化
    TableList   = Table.Column(OnlyTables, "Data"),

    // 5) 各表の先頭行をヘッダーに昇格(必要に応じて後で列名を修正)
    WithHeader  = List.Transform(
                    TableList,
                    each Table.PromoteHeaders(_, [PromoteAllScalars = true])
                  ),

    // 6) すべての表を縦結合(列名でアライン)
    Combined    = Table.Combine(WithHeader)

in
    Combined

補足と実務上の注意点

  • 列型の明示
    並べ替えや集計を行う前に、必要に応じて列型を設定してください。例: powerqueryコピーする編集するTyped = Table.TransformColumnTypes( Combined, {{"Date", type date}, {"Amount", type number}, {"Category", type text}} )
  • 表の自動抽出が不完全な場合
    PDFのレイアウトによっては、表が分割されたり、想定と異なる列見出しになることがあります。WithHeader 前に不要行の削除や列名の置換を入れて調整してください。
  • スキャンPDF(画像)について
    画像ベースのPDFは Pdf.Tables で表を抽出できない場合があります。OCRでテキスト化したPDFを用意するか、発行元からCSVやExcel等のデータ形式を入手することをご検討ください。
  • Web上のPDFを扱う場合
    認証不要のURLであれば、File.Contents の代わりに Web.Contents("https://example.org/sample.pdf") を用いて同様に処理できます。組織のデータ接続ポリシーにより設定が必要な場合があります。

まとめ

  • Pdf.Tables でPDF内の表要素を取得し、Kind = "Table" で表のみ抽出します。
  • Data 列から各表本体を取り出し、Table.PromoteHeaders でヘッダーを整え、Table.Combine で一括結合します。
  • 列型の明示や不要行の削除を適宜挟むことで、後工程の分析が安定いたします。
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次