Delphi Programming / Object Pascal
[掲載 2015年04月21日] [更新 2015年04月22日] エクセル操作フォームEx
エクセル操作フォームEx 参考コード類
PDF 形式の文書で保存
動作確認等
Windows 7 U64(SP1) + Delphi XE(UP1) Pro + Excel 2010
Excel 2007 以降であれば、システムに Acrobat 関係のアプリがインストールされていなくても、エクセルのブックを PDF 形式の文書として保存できます。
Excel 2007 では、[ファイル] [名前を付けて保存] で PDF 文書としてで保存できます。Excel 2013 では、[ファイル] メニューに [エクスポート] という項目が追加されています。[エクスポート] で、[PDF/XPS ドキュメントの作成] を選択して、PDF 形式の文書で保存できます。
本ページのサンプルは、PDF 形式の文書として保存する操作をコードで実行するものです。
ワードでは、SaveAs メソッドで PDF 形式で保存できました。エクセルの場合は、SaveAs で PDF 形式の定数である 57 を指定すれば PDF 文書として保存できますが、現在アクティブなシートだけの保存となります。
エクセルの場合は、ブック、シートあるいはレンジオブジェクトの ExportAsFixedFormat メソッドを使用した方が便利です。本ページのコードは、この ExportAsFixedFormat を使用しています。
ブック全体を PDF 形式の文書として保存する例です。
copy code
// =============================================================================
// ブック全体を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 形式の文書として保存する例です。ここでは、現在アクティブなシートを対象としています。シート名で指定する場合は、xlfExcelApp.Worksheets[] が使用できます。[] 内はシード番号 (1 番目のシートは 1) またはシート名とします。
リスト2
指定のシートだけを PDF 形式の文書で保存
copy code
// =============================================================================
// アクティブなシートだけを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 形式の文書として保存する例です。複数のシート名を文字列配列に代入し、VarArrayFromStrings でバリアント型の配列に変換しています。
図1
複数のシートの選択状態
以下のシートが選択されている
第1四半期
第3四半期
年度計
リスト3
複数のシートを PDF 形式の文書で保存
copy code
// =============================================================================
// 複数のシートを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 形式の文書として保存する例です。
ExportAsFixedFormat の引数で OpenAfterPublish := True として、保存後に PDF 文章を表示するようにしていますが、PDF ピューワがインストールされていない場合は例外が発生します。
図2
選択範囲だけを PDF 文書にする
図3
作成した PDF 文書を表示
リスト4
指定範囲だけを PDF 形式の文書で保存
copy code
// =============================================================================
// 指定範囲だけを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 ;
下図は、Excel 2010 の PDF 出力オプションの設定画面です。このダイアログでデフォルトの設定を変更することができます。
[アクセシビリティ用のドキュメント構造タグ] にチェックが入ったままだと、ワードの場合、作成した PDF の操作で問題が発生することが報告されています。また、[ドキュメントのプロパティ] がオンの場合、ブックのプロパティが含まれ、個人情報等も PDF に埋め込まれる可能性があります。
エクセルの ExportAsFixedFormat
メソッドには、[アクセシビリティ用のドキュメント構造タグ] の値を設定する引数はありません。
図4
PDF 出力のオプション
保存のダイアログで [オプション] ボタンをクリックすると表示される
図は Excel 2010 の初期設定値