2012-11-02 33 views
1

我的目標:要顯示在幻燈片HTML我動態注入主呈現。顯示HTML在PowerPoint

我到目前爲止已經取得了什麼:轉換的HTML到OpenXML的(或WordML中更具體),然後嵌入Word對象到PowerPoint,然後通過分析OpenXML的SDK生產力工具的結構,它創造了的嵌入包含我選擇的文檔的文件夾,我打開演示文稿時看到的視圖基本上是位於/ppt/media/image.emf中的圖像。

現在我已經換成動態嵌入的docx的內容,但我怎麼能產生自己的形象,這樣我可以更新視圖呢?

還是有無痛的解決方案?

+0

我不是正是你想要做什麼明確的(或者你已經採取了各種措施的點)。你想展示HTML代碼的例子還是你想在PPT中嵌入一個HTML頁面?如果後者爲什麼不添加瀏覽器控件並使用它來顯示頁面。我的朋友Shyam Pillai甚至有一個免費的LiveWeb加載項,或多或少地爲你自動化。你可以在http://skp.mvps.org找到它 –

+0

@SteveRindsberg我想要將呈現的HTML動態注入到幻燈片中,並將文件傳輸給用戶。無法使用加載項,因爲它會創建依賴項,我的用戶必須安裝它。 – Ali

+0

該加載項僅簡化了添加瀏覽器實例的操作;它在分發文件時不會對其自身產生依賴關係。根據用戶的安全設置,瀏覽器對象本身可能被禁止。 –

回答

0

我希望你能設法找到一些關於您的問題。

有點晚了,但對於誰可能來這裏未來的人。

這是HTML - > PPT一部分。

PowerPoint.Presentation presentation; 
presentation = ppApp.Presentations.Open(configuration.PPTTExportedFile, MsoTriState.msoFalse, MsoTriState.msoTrue, MsoTriState.msoTrue);  
foreach (PowerPoint.Slide slide in presentation.Slides) 
{ 
    foreach (PowerPoint.Shape shape in slide.Shapes) 
    { 
     File.WriteAllText(temporaryFilePath, html); 
     WebsiteToImage websiteToImage = new WebsiteToImage(temporaryFilePath, @"New picture path"); 
     websiteToImage.Generate(); 
     slide.Shapes.AddPicture(@"picture path", MsoTriState.msoTrue, MsoTriState.msoTrue, oldshapeleft, oldshapetop, oldshapewidth, oldshapeheight); 
     fileToDelete.Add(temporaryFilePath); 
     fileToDelete.Add(@""dont forget to remove tmp files"); 
    } 
} 

Convert webpage to image from ASP.NET

如果你想要做的Word/Excel中/ PowerPoint中的任何物體的操作,我建議用

Console.Write("AlternativeText: "); 
Console.WriteLine(shape.AlternativeText); 

工作,因爲如果您在原始文件中的一個AlternativeText保存您的對象,您可以快速訪問它,甚至可以將PATH更改爲一個簡單的變量。

如果您想要例如導出HTML表格,請從其中執行一個映像並更改AlternativeText以便稍後訪問它,同時爲其指定一個適當的名稱,以便您可以使用第三個軟件工具進行訪問,因爲PowerPoint不支持HTML標籤

接下來要做的:

File.Copy(WordTemplateFile, WordExportedFile, true); 

爲什麼要改變原有的?只需製作一份副本,並將其保存爲可隨時更改的模板,同時創建新的更改版本(適用於報告)

如果您打算使用AlternativeText,則非常有用。

爲了您的替換,您可能需要使用NetOffice/Microsoft Office庫。

foreach (NetOffice.WordApi.InlineShape s in docWord.InlineShapes) 
{ 
    if (s.Type==NetOffice.WordApi.Enums.WdInlineShapeType.wdInlineShapePicture && s.AlternativeText.Contains("any pattern you are looking for")) 
    { 
     <Do your manipulation with image change it> 
     s.Range.InsertFile(<insert your new picture for example>); 
    } 
} 

您循環遍歷所有文件,並檢查是否有適合您的模式的東西。

祝你好運。

0

注:對於的WinForms C#

OK,我沒經過你在查詢寫的痛苦的描述,我相信你已經流下了辛勤的汗水,使其工作,我在這裏分享的痛苦免費的解決方案(至少它對我有用),我相信它也適用於你。

創建一個類,如下:(從其他一些我採取這種溶液中的部分SO,對不起,不記得源)

using System; 
using System.Text.RegularExpressions; 
using System.Windows.Forms; 


    public class HtmlFragment 
    { 
     #region Read and decode from clipboard 

    static public HtmlFragment FromClipboard() 

    { 

     string rawClipboardText = Clipboard.GetText(TextDataFormat.Html); 

     HtmlFragment h = new HtmlFragment(rawClipboardText); 

     return h; 

    } 


    /// <summary> 

    /// Create an HTML fragment decoder around raw HTML text from the clipboard. 

    /// This text should have the header. 

    /// </summary> 

    /// <param name="rawClipboardText">raw html text, with header.</param> 

    public HtmlFragment(string rawClipboardText) 

    { 

     // This decodes CF_HTML, which is an entirely text format using UTF-8. 

     // Format of this header is described at: 

     // http://msdn.microsoft.com/library/default.asp?url=/workshop/networking/clipboard/htmlclipboard.asp 



     // Note the counters are byte counts in the original string, which may be Ansi. So byte counts 

     // may be the same as character counts (since sizeof(char) == 1). 

     // But System.String is unicode, and so byte couns are no longer the same as character counts, 

     // (since sizeof(wchar) == 2). 

     int startHMTL = 0; 

     int endHTML = 0; 


     int startFragment = 0; 

     int endFragment = 0; 


     Regex r; 

     Match m; 


     r = new Regex("([a-zA-Z]+):(.+?)[\r\n]", 

      RegexOptions.IgnoreCase | RegexOptions.Compiled); 


     for (m = r.Match(rawClipboardText); m.Success; m = m.NextMatch()) 

     { 

      string key = m.Groups[1].Value.ToLower(); 

      string val = m.Groups[2].Value; 


      switch(key) 

      { 

       // Version number of the clipboard. Starting version is 0.9. 

       case "version": 

        m_version = val; 

        break; 


       // Byte count from the beginning of the clipboard to the start of the context, or -1 if no context 

       case "starthtml": 

        if (startHMTL != 0) throw new FormatException("StartHtml is already declared"); 

        startHMTL = int.Parse(val); 

        break; 


       // Byte count from the beginning of the clipboard to the end of the context, or -1 if no context. 

       case "endhtml": 

        if (startHMTL == 0) throw new FormatException("StartHTML must be declared before endHTML"); 

        endHTML = int.Parse(val); 


        m_fullText = rawClipboardText.Substring(startHMTL, endHTML - startHMTL); 

        break; 


       // Byte count from the beginning of the clipboard to the start of the fragment. 

       case "startfragment": 

        if (startFragment != 0) throw new FormatException("StartFragment is already declared"); 

        startFragment = int.Parse(val); 

        break; 


       // Byte count from the beginning of the clipboard to the end of the fragment. 

       case "endfragment": 

        if (startFragment == 0) throw new FormatException("StartFragment must be declared before EndFragment"); 

        endFragment = int.Parse(val); 

        m_fragment = rawClipboardText.Substring(startFragment, endFragment - startFragment); 

        break; 


       // Optional Source URL, used for resolving relative links. 

       case "sourceurl": 

        m_source = new System.Uri(val); 

        break; 

      } 

     } // end for 


     if (m_fullText == null && m_fragment == null) 

     { 

      throw new FormatException("No data specified"); 

     } 

    } 


    // Data. See properties for descriptions. 

    string m_version; 

    string m_fullText; 

    string m_fragment; 

    System.Uri m_source; 


    /// <summary> 

    /// Get the Version of the html. Usually something like "1.0". 

    /// </summary> 

    public string Version 

    { 

     get { return m_version; } 

    } 


    /// <summary> 

    /// Get the full text (context) of the HTML fragment. This includes tags that the HTML is enclosed in. 

    /// May be null if context is not specified. 

    /// </summary> 

    public string Context 

    { 

     get { return m_fullText; } 

    } 


    /// <summary> 

    /// Get just the fragment of HTML text. 

    /// </summary> 

    public string Fragment 

    { 

     get { return m_fragment; } 

    } 


    /// <summary> 

    /// Get the Source URL of the HTML. May be null if no SourceUrl is specified. This is useful for resolving relative urls. 

    /// </summary> 

    public System.Uri SourceUrl 

    { 

     get { return m_source; } 

    } 


    #endregion // Read and decode from clipboard 


    #region Write to Clipboard 

    // Helper to convert an integer into an 8 digit string. 

    // String must be 8 characters, because it will be used to replace an 8 character string within a larger string. 

    static string To8DigitString(int x) 

    { 

     return String.Format("{0,8}", x); 

    } 


    /// <summary> 

    /// Clears clipboard and copy a HTML fragment to the clipboard. This generates the header. 

    /// </summary> 

    /// <param name="htmlFragment">A html fragment.</param> 

    /// <example> 

    /// HtmlFragment.CopyToClipboard("<b>Hello!</b>"); 

    /// </example> 

    public static void CopyToClipboard(string htmlFragment) 

    { 

     CopyToClipboard(htmlFragment, null, null); 

    } 


    /// <summary> 

    /// Clears clipboard and copy a HTML fragment to the clipboard, providing additional meta-information. 

    /// </summary> 

    /// <param name="htmlFragment">a html fragment</param> 

    /// <param name="title">optional title of the HTML document (can be null)</param> 

    /// <param name="sourceUrl">optional Source URL of the HTML document, for resolving relative links (can be null)</param> 

    public static void CopyToClipboard(string htmlFragment, string title, Uri sourceUrl) 

    { 

     if (title == null) title = "From Clipboard"; 


     System.Text.StringBuilder sb = new System.Text.StringBuilder(); 


     // Builds the CF_HTML header. See format specification here: 

     // http://msdn.microsoft.com/library/default.asp?url=/workshop/networking/clipboard/htmlclipboard.asp 


     // The string contains index references to other spots in the string, so we need placeholders so we can compute the offsets. 

     // The <<<<<<<_ strings are just placeholders. We’ll backpatch them actual values afterwards. 

     // The string layout (<<<) also ensures that it can’t appear in the body of the html because the < 

     // character must be escaped. 

     string header = 

@"Format:HTML Format 

Version:1.0 

StartHTML:<<<<<<<1 

EndHTML:<<<<<<<2 

StartFragment:<<<<<<<3 

EndFragment:<<<<<<<4 

StartSelection:<<<<<<<3 

EndSelection:<<<<<<<3 

"; 


     string pre = 

@"<!DOCTYPE HTML PUBLIC ""-//W3C//DTD HTML 4.0 Transitional//EN""> 

<HTML><HEAD><TITLE>" + title + @"</TITLE></HEAD><BODY><!–StartFragment–>"; 


     string post = @"<!–EndFragment–></BODY></HTML>"; 


     sb.Append(header); 

     if (sourceUrl != null) 

     { 

      sb.AppendFormat("SourceURL:{0}", sourceUrl); 

     } 

     int startHTML = sb.Length; 


     sb.Append(pre); 

     int fragmentStart = sb.Length; 


     sb.Append(htmlFragment); 

     int fragmentEnd = sb.Length; 


     sb.Append(post); 

     int endHTML = sb.Length; 


     // Backpatch offsets 

     sb.Replace("<<<<<<<1", To8DigitString(startHTML)); 

     sb.Replace("<<<<<<<2", To8DigitString(endHTML)); 

     sb.Replace("<<<<<<<3", To8DigitString(fragmentStart)); 

     sb.Replace("<<<<<<<4", To8DigitString(fragmentEnd)); 


     // Finally copy to clipboard. 

     string data = sb.ToString(); 

     Clipboard.Clear(); 

     Clipboard.SetText(data, TextDataFormat.Html); 

    } 


    #endregion // Write to Clipboard 
    } 

用法說明如下:

使用PowerPoint = Microsoft.Office.Interop.PowerPoint;

var oPowerPoint = new PowerPoint.Application(); 
oPowerPoint.Visible = Microsoft.Office.Core.MsoTriState.msoTrue; 

我有一個要求,在活動幻燈片,所以我用下面的代碼粘貼內容,你的邏輯可能會不同,這取決於你的需要,你可以忽略下面的代碼行

var activeSlide = (PowerPoint.Slide)oPowerPoint.ActiveWindow.View.Slide; 

餵你的HTML內容下面方法

HtmlFragment.CopyToClipboard(HTML CONTENT WILL COME HERE); 

下面的代碼將HTML粘貼到活動幻燈片

oPowerPoint.ActiveWindow.View.PasteSpecial();