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 の初期設定値