2

私の目標:マスター プレゼンテーションに動的に挿入する HTML をスライドに表示したい。

これまでに達成したこと: Html を OpenXML (より具体的には WordML) に変換し、word オブジェクトを PowerPoint に埋め込み、OpenXML SDK Productivity Tool を介して構造を分析し、ドキュメントを含む埋め込みフォルダーを作成しました。プレゼンテーションを開いたときに表示されるビューは、基本的に /ppt/media/image.emf にある画像です。

埋め込まれた docx のコンテンツを動的に置き換えましたが、ビューも更新できるようにその画像を生成するにはどうすればよいですか?

または、痛みのない解決策はありますか?

4

2 に答える 2

1

注: WINFORMS C#

OK については、クエリで書いた痛みの説明を確認していません。機能させるために多くの汗を流したと思います。ここでは、痛みのない解決策を共有しています (少なくとも私にとってはうまくいきました)。 ) そして私はそれがあなたにとってもうまくいくはずだと信じています.

以下のようにクラスを作成してください:

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–&gt;";


        string post = @"<!–EndFragment–&gt;</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();
于 2016-11-17T10:52:41.817 に答える
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");
    }
}

Web ページを ASP.NET から画像に変換する

Word/Excel/PowerPoint でオブジェクト操作を行いたい場合は、

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

元のファイルにオブジェクトの AlternativeText を保存すると、すばやくアクセスでき、PATH を単純な変数に変更することもできるためです。

たとえば、HTML テーブルをエクスポートする場合は、そこから画像を作成し、AlternativeText を変更して、後で簡単にアクセスできるようにします。同時に、3 番目のソフトウェア ツールでアクセスできる適切な名前を付けます。 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>);
    }
 }

すべてのファイルをループして、何かがパターンに適合するかどうかを確認します。

幸運を。

于 2013-03-25T12:22:25.477 に答える