Delphi Programming / Object Pascal
サイトのトップページへ リンクのページへ ロゴマーク
[掲載 2015年04月21日] [更新 2015年04月22日] エクセル操作フォームEx
エクセル操作フォームEx   参考コード類
PDF 形式の文書で保存
動作確認等 Windows 7 U64(SP1) + Delphi XE(UP1) Pro + Excel 2010







エクセルの PDF 形式の保存機能


Excel 2007 以降であれば,システムに Acrobat 関係のアプリがインストールされていなくても,エクセルのブックを PDF 形式の文書として保存できます.
Excel 2007 では,[ファイル] [名前を付けて保存] で PDF 文書としてで保存できます.Excel 2013 では,[ファイル] メニューに [エクスポート] という項目が追加されています.[エクスポート] で,[PDF/XPS ドキュメントの作成] を選択して,PDF 形式の文書で保存できます.

本ページのサンプルは,PDF 形式の文書として保存する操作をコードで実行するものです.
ワードでは,SaveAs メソッドで PDF 形式で保存できました.エクセルの場合は,SaveAs で PDF 形式の定数である 57 を指定すれば PDF 文書として保存できますが,現在アクティブなシートだけの保存となります.
エクセルの場合は,ブック,シートあるいはレンジオブジェクトの ExportAsFixedFormat メソッドを使用した方が便利です.本ページのコードは,この ExportAsFixedFormat を使用しています.






ブック全体を PDF 形式の文書で保存


ブック全体を PDF 形式の文書として保存する例です.


リスト1
ブック全体を PDF 形式の文書で保存
//=============================================================================
//  ブック全体をPDF形式の文書で保存
//=============================================================================
procedure TplExcelFormEx2.Button1Click(Sender: TObject);
const
  xlTypePDF = 0;
  xlTypeXPS = 1;
var
  objExcelBook : OleVariant;
  pFilePath    : OleVariant;
begin
  //引数を省略するため,ブックのオブジェクトをOleVariantに変更
  objExcelBook := xlfExcelApp.ActiveWorkbook;
  //保存ファイル名のフルパス
  pFilePath := ChangeFileExt(xlfBookFullPath, '.pdf');

  SaveDialog1.InitialDir := ExtractFileDir(xlfBookFullPath);
  SaveDialog1.Filter     := 'PDF文書|*.pdf';
  SaveDialog1.DefaultExt := '.pdf';
  SaveDialog1.FileName   := ExtractFileName(pFilePath);

  if SaveDialog1.Execute then begin
    try
      //保存ファイル名以外はデフォルトの設定で保存
      objExcelBook.ExportAsFixedFormat(Type     := xlTypePDF,
                                       Filename := SaveDialog1.FileName,
                                       IncludeDocProperties := False);
      //保存したことにする
      xlfExcelBook.Saved[0] := True;
    except
      //エラー処理
    end;
  end;
end;




指定のシートだけを PDF 形式の文書で保存


指定のシートだけを PDF 形式の文書として保存する例です.ここでは,現在アクティブなシートを対象としています.シート名で指定する場合は,xlfExcelApp.Worksheets[] が使用できます.[] 内はシード番号 (1 番目のシートは 1) またはシート名とします.


リスト2
指定のシートだけを PDF 形式の文書で保存
//=============================================================================
//  アクティブなシートだけをPDF形式の文書で保存
//=============================================================================
procedure TplExcelFormEx2.Button2Click(Sender: TObject);
const
  xlTypePDF = 0;
  xlTypeXPS = 1;
var
  objExcelSheet : OleVariant;
  pFilePath     : OleVariant;
begin
  //引数を省略するため,シートのオブジェクトをOleVariantに変更
  objExcelSheet := xlfExcelApp.ActiveSheet;
  //保存ファイル名のフルパス
  pFilePath := ExtractFilePath(Application.ExeName) + xlfActiveSheetName + '.pdf';

  SaveDialog1.InitialDir := ExtractFileDir(xlfBookFullPath);
  SaveDialog1.Filter     := 'PDF文書|*.pdf';
  SaveDialog1.DefaultExt := '.pdf';
  SaveDialog1.FileName   := ExtractFileName(pFilePath);

  if SaveDialog1.Execute then begin
    try
      //保存ファイル名以外はデフォルトの設定で保存
      objExcelSheet.ExportAsFixedFormat(Type     := xlTypePDF,
                                        Filename := SaveDialog1.FileName,
                                        IncludeDocProperties := False);
      //保存したことにする
      xlfExcelBook.Saved[0] := True;
    except
      //エラー処理
    end;
  end;
end;




複数のシートを PDF 形式の文書で保存


指定した複数のシートを PDF 形式の文書として保存する例です.複数のシート名を文字列配列に代入し,VarArrayFromStrings でバリアント型の配列に変換しています.


図1
複数のシートの選択状態
  • 以下のシートが選択されている
    第1四半期
    第3四半期
    年度計

リスト3
複数のシートを PDF 形式の文書で保存
//=============================================================================
//  複数のシートをPDF形式の文書で保存
//  VarArrayFromStringsの使用にはusesにProviderが必要
//=============================================================================
procedure TplExcelFormEx2.Button3Click(Sender: TObject);
const
  xlTypePDF = 0;
  xlTypeXPS = 1;
var
  LListSheets    : TStringList;
  objSheetList   : OleVariant;
  objExcelSheets : OleVariant;
  pFilePath      : OleVariant;
begin
  LListSheets := TStringList.Create;
  try
    LListSheets.Add('第1四半期');
    LListSheets.Add('第3四半期');
    LListSheets.Add('年度計');

    objSheetList := xlfExcelBook.Sheets[VarArrayFromStrings(LListSheets)];
    objSheetList.Select;
    //上のコードで指定した複数のアクティブシートが保存対象
    objExcelSheets := xlfExcelApp.ActiveSheet;
  finally
    FreeAndNil(LListSheets);
  end;

  //保存ファイル名のフルパス
  pFilePath := ChangeFileExt(xlfBookFullPath, '.pdf');

  SaveDialog1.InitialDir := ExtractFileDir(xlfBookFullPath);
  SaveDialog1.Filter     := 'PDF文書|*.pdf';
  SaveDialog1.DefaultExt := '.pdf';
  SaveDialog1.FileName   := ExtractFileName(pFilePath);

  if SaveDialog1.Execute then begin
    try
      //保存ファイル名以外はデフォルトの設定で保存
      objExcelSheets.ExportAsFixedFormat(Type     := xlTypePDF,
                                         Filename := SaveDialog1.FileName,
                                         IncludeDocProperties := False);
      //保存したことにする
      xlfExcelBook.Saved[0] := True;
    except
      //エラー処理
    end;
  end;
  //1番目のシートだけを選択
  objSheetList := xlfExcelApp.Worksheets[1];
  objSheetList.Select;
end;




指定範囲だけを PDF 形式の文書で保存


指定した範囲だけを PDF 形式の文書として保存する例です.
ExportAsFixedFormat の引数で OpenAfterPublish := True として,保存後に PDF 文章を表示するようにしていますが,PDF ピューワがインストールされていない場合は例外が発生します.


図2
選択範囲だけを PDF 文書にする
図3
作成した PDF 文書を表示

リスト4
指定範囲だけを PDF 形式の文書で保存
//=============================================================================
//  指定範囲だけをPDF形式の文書で保存
//=============================================================================
procedure TplExcelFormEx2.Button4Click(Sender: TObject);
const
  xlTypePDF = 0;
  xlTypeXPS = 1;
var
  objRange  : OleVariant;
  pFilePath : OleVariant;
begin
  objRange := xlfExcelApp.Worksheets[1];
  objRange.Select;

  //指定範囲
  objRange := xlfExcelSheet.Range['B6', 'D12'];
  //現在選択中の範囲であれば以下のコード
  //objRange := xlfExcelApp.Selection[0];

  //保存ファイル名のフルパス
  pFilePath := ChangeFileExt(xlfBookFullPath, '.pdf');

  SaveDialog1.InitialDir := ExtractFileDir(xlfBookFullPath);
  SaveDialog1.Filter     := 'PDF文書|*.pdf';
  SaveDialog1.DefaultExt := '.pdf';
  SaveDialog1.FileName   := ExtractFileName(pFilePath);

  if SaveDialog1.Execute then begin
    try
      //保存
      objRange.ExportAsFixedFormat(Type     := xlTypePDF,
                                   Filename := SaveDialog1.FileName,
                                   IncludeDocProperties := False,
                                   OpenAfterPublish := True);
      //保存したことにする
      xlfExcelBook.Saved[0] := True;
    except
      //エラー処理
    end;
    //確認のために範囲を選択状態にしてみる
    objRange.select;
  end;
end;




PDF 出力のオプションのデフォルト値


下図は,Excel 2010 の PDF 出力オプションの設定画面です.このダイアログでデフォルトの設定を変更することができます.
[アクセシビリティ用のドキュメント構造タグ] にチェックが入ったままだと,ワードの場合,作成した PDF の操作で問題が発生することが報告されています.また,[ドキュメントのプロパティ] がオンの場合,ブックのプロパティが含まれ,個人情報等も PDF に埋め込まれる可能性があります.

エクセルの ExportAsFixedFormat メソッドには,[アクセシビリティ用のドキュメント構造タグ] の値を設定する引数はありません.



図4
PDF 出力のオプション
  • 保存のダイアログで [オプション] ボタンをクリックすると表示される
  • 図は Excel 2010 の初期設定値