既然我有興趣,就下海來寫啦XD
我沒記錯的話,必須先安裝好Office不然到時候呼叫COM元件會有問題
安裝好Office之後,Visual Studio2010會在加入參考的.Net出現Office家族的套件
今天範例是使用WPF實做
首先專案開啟完後,加入參考
把PowerPoint以及Office都加入參考
XAML
<Window x:Class="PowerPoint.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Open PowerPoint by C.Y. Fang" Height="350" Width="525" Loaded="Window_Loaded" Unloaded="Window_Unloaded">
<Grid></Grid>
</Window>
表單載入時,就先透過OpenFileDialog開啟檔案,開啟完成後判斷是2003或2007
OpenFileDialog dialog = new OpenFileDialog();
//僅開啟2003 2007 ppt
dialog.Filter = "2003 PPT (*.ppt)|*.ppt|2007 PPT (*.pptx)|*.pptx";
//開啟檔案
if (dialog.ShowDialog() == true)
{
//取得副檔名
String tag = dialog.SafeFileName.Substring(dialog.SafeFileName.LastIndexOf('.'));
//判斷是2003或2007
if (tag.Equals(OFFICE_2003)) //2003
{
pre = app.Presentations.Open(dialog.FileName, MsoTriState.msoCTrue, MsoTriState.msoFalse, MsoTriState.msoFalse);
}
else if (tag.Equals(OFFICE_2007)) //2007
{
pre = app.Presentations.Open2007(dialog.FileName, MsoTriState.msoCTrue, MsoTriState.msoFalse, MsoTriState.msoFalse, MsoTriState.msoFalse);
}
接著透過Slider去取得每一頁的資料 在透過Shape去判斷是否為文字方塊且包涵文字在裡頭,如果有就顯示出來 每秒輪撥一頁,可手動點擊
using System;
using System.Threading;
using System.Windows;
using Microsoft.Office.Core;
using Microsoft.Win32;
using POWER_POINT = Microsoft.Office.Interop.PowerPoint;
namespace PowerPoint
{
/// <summary>
/// MainWindow.xaml 的互動邏輯
/// </summary>
public partial class MainWindow : Window
{
private POWER_POINT.Application app;
private POWER_POINT.Presentation pre;
private POWER_POINT.SlideShowSettings slider;
private const String OFFICE_2003 = ".ppt";
private const String OFFICE_2007 = ".pptx";
public MainWindow()
{
InitializeComponent();
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
app = new POWER_POINT.Application();
OpenFileDialog dialog = new OpenFileDialog();
//僅開啟2003 2007 ppt
dialog.Filter = "2003 PPT (*.ppt)|*.ppt|2007 PPT (*.pptx)|*.pptx";
//開啟檔案
if (dialog.ShowDialog() == true)
{
//取得副檔名
String tag = dialog.SafeFileName.Substring(dialog.SafeFileName.LastIndexOf('.'));
//判斷是2003或2007
if (tag.Equals(OFFICE_2003)) //2003
{
pre = app.Presentations.Open(dialog.FileName, MsoTriState.msoCTrue, MsoTriState.msoFalse, MsoTriState.msoFalse);
}
else if (tag.Equals(OFFICE_2007)) //2007
{
pre = app.Presentations.Open2007(dialog.FileName, MsoTriState.msoCTrue, MsoTriState.msoFalse, MsoTriState.msoFalse, MsoTriState.msoFalse);
}
slider = pre.SlideShowSettings;
//開始播放
slider.Run();
try
{
//取得每篇頁數
for (int index = 0; index < pre.Slides.Count; index++)
{
//等待一秒輪撥一次
Thread.Sleep(1000);
NextSlide();
//取得頁數
foreach (POWER_POINT.Shape shape in pre.Slides[index + 1].Shapes)
{
//判斷有沒有文字方塊
if (shape.HasTextFrame == MsoTriState.msoTrue)
{
//判斷文字方塊內是否有文字
if (shape.TextFrame.HasText == MsoTriState.msoTrue)
{
//http://msdn.microsoft.com/en-us/library/ff760948(v=office.14).aspx
//http://msdn.microsoft.com/en-us/library/microsoft.office.interop.powerpoint.textrange_members(v=office.14).aspx
POWER_POINT.TextRange range = shape.TextFrame.TextRange;
//取得文字
MessageBox.Show(range.Text);
}
}
}
//關閉程式
this.Close();
}
}
catch (ArgumentOutOfRangeException ex)
{
MessageBox.Show(ex.Message);
}
}
}
private void Window_Unloaded(object sender, RoutedEventArgs e)
{
if (app != null)
{
app.Quit();
}
}
#region 下一頁
private void NextSlide()
{
if (app != null && pre != null)
{
pre.SlideShowWindow.View.Next();
}
}
#endregion 下一頁
#region 上一頁
private void PreviousSlide()
{
if (app != null && pre != null)
{
pre.SlideShowWindow.View.Previous();
}
}
#endregion 上一頁
}
}
這次Demo的ppt用的是義守數學系的離散數學PPT
參考資料: http://www.cnblogs.com/arongbest/archive/2011/03/02/1969169.html http://mantascode.com/c-get-text-content-from-microsoft-powerpoint-file/ http://msdn.microsoft.com/en-us/library/microsoft.office.interop.powerpoint.textrange_members(v=office.14).aspx






