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
で一括結合します。- 列型の明示や不要行の削除を適宜挟むことで、後工程の分析が安定いたします。