簡體   English   中英

PowerPoint幻燈片上的OpenXML自動刷新連接器

[英]OpenXML refresh connectors on a PowerPoint Slide automatically

我有一個簡單的場景,其中我使用OpenXML SDK 2.5和c#以編程方式創建一個帶有幻燈片的演示文稿。 幻燈片上有2種形狀,還有一個連接這2種形狀的連接器。

當我在PowerPoint中打開演示文稿時,會同時顯示兩個形狀和連接器,但是連接器在兩個形狀之間的位置不正確。 當我在幻燈片上拖動一個形狀時,PowerPoint立即刷新連接器並將其放置在正確的位置。

我的問題:是否可以創建一個openxml PowerPoint幻燈片,該幻燈片在打開文件時自動刷新連接器位置?

謝謝

我針對此問題想出的解決方案似乎有些破綻,但據我所知,沒有更好的方法。 問題是PowerPoint內部控制了連接器的放置,並且沒有公開任何刷新它們的方法。 在測試中,我驚訝地發現PowerPoint會在刷新期間根據需要動態更改連接器類型。

為了使刷新發生,我不得不在.pptm文件中編寫一個VBA宏,然后從我的C#代碼中調用它。 我添加了一個模塊,並將函數放在那里,這樣它就不會與特定的幻燈片相關聯。

該代碼在幻燈片上移動每種形狀,以觸發連接器刷新。 它也在組內尋找形狀。 它正在過濾三角形和菱形形狀。

我避免在代碼中使用ActivePresentation,因為我想在宏運行時隱藏PowerPoint。

Public Sub FixConnectors()
    Dim mySlide As Slide
    Dim shps As Shapes
    Dim shp As Shape
    Dim subshp As Shape

    Set mySlide = Application.Presentations(1).Slides(1)
    Set shps = mySlide.Shapes

    For Each shp In shps
        If shp.AutoShapeType = msoShapeIsoscelesTriangle Or shp.AutoshapeType = msoShapeDiamond Then
            shp.Left = shp.Left + 0.01 - 0.01
        End If
        If shp.Type = mso.Group Then
            For Each subshp In shp.GroupItems
                If subshp.AutoShapeType = msoShapeIsoscelesTriangle Or subshp.AutoshapeType = msoShapeDiamond Then
                    subshp.Left = subshp.Left + 0.01 - 0.01
                End If
             Next subshp
        End If
    Next shp

    Application.Presentations(1).Save
End Sub

接下來是C#代碼,以使用PowerPoint Interop運行宏。 作為Windows進程關閉並重新打開文件,垃圾回收器可以清理Interop擁有的所有句柄。 在測試中,終結器可能需要花費幾秒鍾來運行,因此GC調用在重新打開文件后發生,因此應用程序似乎沒有掛起。

using System;
using System.Diagnostics;
using OC = Microsoft.Office.Core;
using PP = Microsoft.Office.Interop.PowerPoint;

string filePath = "C:/Temp/";
string fileName = "Template.pptm";

// Open PowerPoint in hidden mode, run the macro, and shut PowerPoint down
var pptApp = new PP.Application();
PP.Presentation presentation = pptApp.Presentations.Open(filePath + fileName, OC.MsoTriState.msoFalse, OC.MsoTriState.msoFalse, OC.MsoTriState.msoFalse);
pptApp.Run(filename + "!.FixConnectors");
presentation.Close();
presentation = null;
pptApp.Quit();
pptApp = null;

// Reopen the file through Windows
Process.Start(filePath + fileName);

// Clear all references to PowerPoint
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
GC.WaitForPendingFinalizers();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM