他丟了篇文章『[C#]Export PowerPoint file to photos』給我,學習學習XD
首先,先將MS PowerPoint 12.0 Object Library加入參考
將以下程式碼貼到程式內
using System;
using System.ComponentModel;
using System.IO;
using System.Threading;
using System.Windows.Forms;
using Microsoft.Office.Core;
namespace PowerPointToPhotos
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private static string type;
private static string filePath;
private static string fileName;
private static string outPath;
private void button1_Click(object sender, EventArgs e)
{
OpenFileDialog dialog = new OpenFileDialog();
dialog.Filter = "PowerPoint 97|*.ppt|PowerPoint 2007|*.pptx";
if (dialog.ShowDialog() == DialogResult.OK)
{
type = dialog.FileName.Substring(dialog.FileName.LastIndexOf('.') + 1);
filePath = dialog.FileName;
fileName = Path.GetFileNameWithoutExtension(filePath);
outPath = dialog.FileName.Substring(0, dialog.FileName.LastIndexOf('\\') + 1);
BackgroundWorker worker = new BackgroundWorker();
worker.WorkerReportsProgress = true;
worker.WorkerSupportsCancellation = true;
worker.DoWork += backgroundWorker_DoWork;
worker.RunWorkerCompleted += backgroundWorker_RunWorkerCompleted;
worker.RunWorkerAsync();
}
}
private void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Cancelled == true)
{
MessageBox.Show("以取消");
}
else if (e.Error != null)
{
MessageBox.Show("error");
}
else
{
MessageBox.Show("輸出完成");
}
}
private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
try
{
var pp = new Microsoft.Office.Interop.PowerPoint.Application();
int index = 0;
if (type.Equals("ppt"))
{
var ppt = pp.Presentations.Open(filePath, MsoTriState.msoFalse, MsoTriState.msoFalse, MsoTriState.msoFalse);
foreach (Microsoft.Office.Interop.PowerPoint.Slide s in ppt.Slides)
{
s.Export(Path.Combine(outPath, string.Format("{0}{1}.jpg", fileName, index)), "jpg", Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height);
index++;
}
ppt.Close();
}
else if (type.Equals("pptx"))
{
var ppt = pp.Presentations.Open2007(filePath, MsoTriState.msoFalse, MsoTriState.msoFalse, MsoTriState.msoFalse);
foreach (Microsoft.Office.Interop.PowerPoint.Slide s in ppt.Slides)
{
s.Export(Path.Combine(outPath, string.Format("{0}{1}.jpg", fileName, index)), "jpg", Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height);
index++;
}
ppt.Close();
}
}
catch (NullReferenceException ex)
{
}
finally
{
type = string.Empty;
filePath = string.Empty;
fileName = string.Empty;
outPath = string.Empty;
}
}
}
}
這隻程式出發點是從點擊按鈕觸發的
private void button1_Click(object sender, EventArgs e)
{
OpenFileDialog dialog = new OpenFileDialog();
dialog.Filter = "PowerPoint 97|*.ppt|PowerPoint 2007|*.pptx";
if (dialog.ShowDialog() == DialogResult.OK)
{
type = dialog.FileName.Substring(dialog.FileName.LastIndexOf('.') + 1);
filePath = dialog.FileName;
fileName = Path.GetFileNameWithoutExtension(filePath);
outPath = dialog.FileName.Substring(0, dialog.FileName.LastIndexOf('\\') + 1);
BackgroundWorker worker = new BackgroundWorker();
worker.WorkerReportsProgress = true;
worker.WorkerSupportsCancellation = true;
worker.DoWork += backgroundWorker_DoWork;
worker.RunWorkerCompleted += backgroundWorker_RunWorkerCompleted;
worker.RunWorkerAsync();
}
}
可以看到點擊按鈕時,會開啟檔案選取視窗,並且只能選取2003和2007的PowerPoint檔案
OpenFileDialog dialog = new OpenFileDialog();
dialog.Filter = "PowerPoint 97|*.ppt|PowerPoint 2007|*.pptx";
如果開啟開始分解參數,type是檔案的副檔名、filePath是取得來源位址、fileName則是來源檔案名稱,最後outPath則是要輸出的路徑檔;在這邊我不用Thread,反而用BackgroundWorker
原因是BackgroundWorker能夠取得目前的進度,完成也會有提示
且是跑在背後的一個執行緒,對這個應用比較適合
if (dialog.ShowDialog() == DialogResult.OK)
{
type = dialog.FileName.Substring(dialog.FileName.LastIndexOf('.') + 1);
filePath = dialog.FileName;
fileName = Path.GetFileNameWithoutExtension(filePath);
outPath = dialog.FileName.Substring(0, dialog.FileName.LastIndexOf('\\') + 1);
BackgroundWorker worker = new BackgroundWorker();
worker.WorkerReportsProgress = true;
worker.WorkerSupportsCancellation = true;
worker.DoWork += backgroundWorker_DoWork;
worker.RunWorkerCompleted += backgroundWorker_RunWorkerCompleted;
worker.RunWorkerAsync();
}
如果是使用WPF的朋友應該會發覺沒辦法取得到目前是否有開啟的狀態,可以參考『OpenFileDialog in WPF』與『WPF Dialogs and DialogResult』
BackgroundWorker工作的方法是backgroundWorker_DoWork,所以來解析一下backgroundWorker_DoWork吧
private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
try
{
var pp = new Microsoft.Office.Interop.PowerPoint.Application();
int index = 0;
if (type.Equals("ppt"))
{
var ppt = pp.Presentations.Open(filePath, MsoTriState.msoFalse, MsoTriState.msoFalse, MsoTriState.msoFalse);
foreach (Microsoft.Office.Interop.PowerPoint.Slide s in ppt.Slides)
{
s.Export(Path.Combine(outPath, string.Format("{0}{1}.jpg", fileName, index)), "jpg", Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height);
index++;
}
ppt.Close();
}
else if (type.Equals("pptx"))
{
var ppt = pp.Presentations.Open2007(filePath, MsoTriState.msoFalse, MsoTriState.msoFalse, MsoTriState.msoFalse);
foreach (Microsoft.Office.Interop.PowerPoint.Slide s in ppt.Slides)
{
s.Export(Path.Combine(outPath, string.Format("{0}{1}.jpg", fileName, index)), "jpg", Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height);
index++;
}
ppt.Close();
}
}
catch (NullReferenceException ex)
{
}
finally
{
type = string.Empty;
filePath = string.Empty;
fileName = string.Empty;
outPath = string.Empty;
}
}
可以看到pp是一個PowerPoint,而index是用來紀錄圖片第幾張,接著判斷2003與2007
if (type.Equals("ppt"))
{
....
}
else if (type.Equals("pptx"))
{
....
}
為什麼要判斷2003還是2007呢?原因是開啟的方式有分2003以前以及2007的開啟方式
ppt是指到目前開啟的PowerPoint,並透過Slide去走訪每一張投影片,在透過Export輸出圖片
要更改大小可以將Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height這段改成你想要得大小
var ppt = pp.Presentations.Open(filePath, MsoTriState.msoFalse, MsoTriState.msoFalse, MsoTriState.msoFalse);
foreach (Microsoft.Office.Interop.PowerPoint.Slide s in ppt.Slides)
{
s.Export(Path.Combine(outPath, string.Format("{0}{1}.jpg", fileName, index)), "jpg", Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height);
index++;
}
拿學校講義來測試XDDD
輸出不少檔案XDDD
結果就是這樣啦XD
資料參考:
http://www.dotblogs.com.tw/larrynung/archive/2012/08/29/74356.aspx
http://stackoverflow.com/questions/4316789/how-to-convert-powerpoint-ppt-pptx-to-several-images-of-each-slide
http://msdn.microsoft.com/zh-tw/library/system.componentmodel.backgroundworker.aspx
http://www.c-sharpcorner.com/uploadfile/mahesh/openfiledialog-in-wpf/
http://marlongrech.wordpress.com/2008/05/28/wpf-dialogs-and-dialogresult/





