C# パワーポイントを開いて、別ファイルのマスタファイルを合体させるサンプル
パワーポイントを開いて、別ファイルのマスタファイルを合体させるサンプル
/// <summary>
/// パワーポイント編集保存する
/// </summary>
/// <param name="strFileName"></param>
/// <param name="outputBaseFolder"></param>
/// <param name="show_message"></param>
/// <returns></returns>
private static bool _editPPT(String saveFileName, String OrigineFileName, Editfileinfos editfileinfos, String temporalyFolder, ref String ret_message)
{
bool ret_code = false;
Microsoft.Office.Interop.PowerPoint.Application objPptApp = null;
string slidemasterFileName = editfileinfos.slidemasterFileName;
string temporalyPpt_FullPath = string.Empty;
try
{
//パワーポイントオープン
objPptApp = new Microsoft.Office.Interop.PowerPoint.Application();
// 警告メッセージなどを表示しないようにする
objPptApp.DisplayAlerts = Microsoft.Office.Interop.PowerPoint.PpAlertLevel.ppAlertsNone;
//objPptApp.Visible = Microsoft.Office.Core.MsoTriState.msoTrue; //デバッグ用
//Presentations
Microsoft.Office.Interop.PowerPoint.Presentations objPresentations = objPptApp.Presentations;
try
{
#region "スライドマスタ"のパワーポイントを開く
Microsoft.Office.Interop.PowerPoint._Presentation slidemasterPresentation = null;
Microsoft.Office.Interop.PowerPoint.Slides Slidemaster_Slides = null;
Microsoft.Office.Interop.PowerPoint._Slide Slidemaster_SlideTitle = null;
Microsoft.Office.Interop.PowerPoint._Slide Slidemaster_Slide = null;
//スライドマスタ用のパワーポイントを開く
if (slidemasterFileName != "" && slidemasterFileName!= null)
{
//スライドマスタファイルを開く
slidemasterPresentation = objPresentations.Open(slidemasterFileName, Microsoft.Office.Core.MsoTriState.msoFalse, Microsoft.Office.Core.MsoTriState.msoFalse, Microsoft.Office.Core.MsoTriState.msoFalse);
Slidemaster_Slides = slidemasterPresentation.Slides;
if (Slidemaster_Slides.Count < 2)
{
ret_message = "スライドが2枚以上あるマスタファイルを選んでください";
return false;
}
Slidemaster_SlideTitle = Slidemaster_Slides[1];
Slidemaster_Slide = Slidemaster_Slides[2];
}
#endregion
#region "slidemasterPresentation"
try
{
#region ベースとなるパワーポイントオブジェクトを作成
Microsoft.Office.Interop.PowerPoint._Presentation objPres;
if (OrigineFileName != "" && OrigineFileName != null)
{
//コピーを作成する
if (createCopy_temporary(OrigineFileName, temporalyFolder, ref temporalyPpt_FullPath, ref ret_message) == false) return false;
//編集元ファイルを開く
objPres = objPresentations.Open(OrigineFileName, Microsoft.Office.Core.MsoTriState.msoFalse, Microsoft.Office.Core.MsoTriState.msoFalse, Microsoft.Office.Core.MsoTriState.msoFalse);
}
else
{
//新規プレゼンテーションファイルを作成
objPres = objPresentations.Add(Microsoft.Office.Core.MsoTriState.msoTrue);
}
#endregion
try
{
//スライド取得
Microsoft.Office.Interop.PowerPoint.Slides objSlides = objPres.Slides;
#region 編集元ファイルのスライドをすべて削除(保存さえしなければ元ファイルに影響を与えないのでここで削除しても問題ない)
int cnt = objSlides.Count;
for (int i = 0; i < cnt; i++)
{
Microsoft.Office.Interop.PowerPoint._Slide objSlide = objSlides[1];
objSlide.Delete();
System.Runtime.InteropServices.Marshal.ReleaseComObject(objSlide);
objSlide = null;
}
#endregion
try
{
#region スライドをコピーする
int slide_cnt = 0;
foreach (Editfileinfo info in editfileinfos)
{
if (info.originalFileName != null && info.originalFileName != String.Empty)
{
//新規ファイルに、作業用のパワーポイントからスライドをコピーする。
int ret = objSlides.InsertFromFile(temporalyPpt_FullPath, slide_cnt, info.originalFileSlideNo, info.originalFileSlideNo);
}
else
{
//新規ファイルに、既存ファイルからスライドをコピーする。
int ret = objSlides.InsertFromFile(info.PptFullName, slide_cnt, 1, 1);
}
//編集処理の為に、一意のスライド名を設定する。(スライド名から逆引きしてフォルダを判定するため)
Microsoft.Office.Interop.PowerPoint._Slide objSlide = objSlides[slide_cnt + 1];//objSlidesのカウンタは1始まりのため+1する
objSlide.Name = info.slide_propertyname;//スライド名を設定
//カウンタをインクリメント
slide_cnt++;
}
#endregion
#region スライドマスタをコピーする
Microsoft.Office.Interop.PowerPoint.Designs designs = objPres.Designs;
//コピーする
Microsoft.Office.Interop.PowerPoint.Design DefaultDesign = designs.Clone(slidemasterPresentation.Designs[1]);
#endregion
#region 旧スライドマスタが参照されているので、新しいスライドマスタへ参照しなおす
slide_cnt = 0;
foreach (Microsoft.Office.Interop.PowerPoint._Slide objSlide in objSlides)
{
//マスタへの参照を変更する
if (slide_cnt == 0)
{
objSlide.CustomLayout = DefaultDesign.SlideMaster.CustomLayouts[1];
}
else
{
objSlide.CustomLayout = DefaultDesign.SlideMaster.CustomLayouts[2];
}
//カウンタをインクリメント
slide_cnt++;
}
#endregion
#region デフォルトのスライドマスタを削除する
//デフォルトのスライドマスタを削除する。
for (int i = 1; i < designs.Count; i++)
{
designs[1].Delete();
}
#endregion
#region スライドマスタのヘッダー&フッターの属性をコピーする
slide_cnt = 0;
foreach (Microsoft.Office.Interop.PowerPoint._Slide objSlide in objSlides)
{
//スライドマスタのヘッダー&フッターをコピーする
if (slide_cnt == 0)
{
CopyHeaderFooter(Slidemaster_SlideTitle.HeadersFooters, objSlide.HeadersFooters);
}
else
{
CopyHeaderFooter(Slidemaster_Slide.HeadersFooters, objSlide.HeadersFooters);
}
//カウンタをインクリメント
slide_cnt++;
}
#endregion
#region 上書き保存かどうか
if (OrigineFileName == saveFileName)
{
//上書き保存であればそのまま保存
objPres.Save();
}
else
{
//名前を付けて保存であれば、ファイルが存在すれば削除する。
if (System.IO.File.Exists(saveFileName)) System.IO.File.Delete(saveFileName);
//名前を付けて保存
objPres.SaveAs(saveFileName, Microsoft.Office.Interop.PowerPoint.PpSaveAsFileType.ppSaveAsDefault, Microsoft.Office.Core.MsoTriState.msoFalse);
}
#endregion
ret_code = true;
}
finally
{
if (objSlides != null)
{
System.Runtime.InteropServices.Marshal.ReleaseComObject(objSlides);
objSlides = null;
}
}
}
finally
{
if (objPres != null)
{
objPres.Close();
System.Runtime.InteropServices.Marshal.ReleaseComObject(objPres);
objPres = null;
}
}
}
finally //slidemasterPresentation
{
#region 終了処理
if (Slidemaster_Slide != null)
{
System.Runtime.InteropServices.Marshal.ReleaseComObject(Slidemaster_Slide);
Slidemaster_Slide = null;
}
if (Slidemaster_SlideTitle != null)
{
System.Runtime.InteropServices.Marshal.ReleaseComObject(Slidemaster_SlideTitle);
Slidemaster_SlideTitle = null;
}
if (Slidemaster_Slides != null)
{
System.Runtime.InteropServices.Marshal.ReleaseComObject(Slidemaster_Slides);
Slidemaster_Slides = null;
}
if (slidemasterPresentation != null)
{
slidemasterPresentation.Close();
System.Runtime.InteropServices.Marshal.ReleaseComObject(slidemasterPresentation);
slidemasterPresentation = null;
}
#endregion
}
#endregion //slidemasterPresentation
}
finally
{
if (objPresentations != null)
{
System.Runtime.InteropServices.Marshal.ReleaseComObject(objPresentations);
objPresentations = null;
}
}
}
catch (Exception ex)
{
ret_message = ex.Message;
ret_code = false;
}
finally
{
#region //作業用のパワーポイント終了処理
if (objPptApp != null)
{
try
{
objPptApp.Quit();
//作業用のパワーポイントファイルを削除
if (System.IO.File.Exists(temporalyPpt_FullPath)) System.IO.File.Delete(temporalyPpt_FullPath);
}
finally
{
System.Runtime.InteropServices.Marshal.ReleaseComObject(objPptApp);
}
}
#endregion
}
return ret_code;
}
/// <summary>
/// スライドマスタのヘッダー&フッターをコピーする
/// ヘッダー&フッターの属性はdesigns.Cloneではコピーされないので
/// </summary>
/// <param name="Original_HeadersFooters"></param>
/// <param name="CopyTo_HeadersFooters"></param>
private static void CopyHeaderFooter(
Microsoft.Office.Interop.PowerPoint.HeadersFooters Original_HeadersFooters,
Microsoft.Office.Interop.PowerPoint.HeadersFooters CopyTo_HeadersFooters)
{
//ヘッダーのON/OFFをコピー
try
{
CopyTo_HeadersFooters.Header.Visible = Original_HeadersFooters.Header.Visible;
CopyTo_HeadersFooters.Header.Text = Original_HeadersFooters.Header.Text;
CopyTo_HeadersFooters.Header.Format = Original_HeadersFooters.Header.Format;
}
catch { }
//フッターのON/OFFをコピー
try
{
CopyTo_HeadersFooters.Footer.Visible = Original_HeadersFooters.Footer.Visible;
CopyTo_HeadersFooters.Footer.Text = Original_HeadersFooters.Footer.Text;
}
catch { }
//スライド番号
try
{
CopyTo_HeadersFooters.SlideNumber.Visible = Original_HeadersFooters.SlideNumber.Visible;
}
catch { }
}