Увидев, что до сих пор нет ответа на это здесь или в другом месте, я мог бы также опубликовать свой код.
Например, если форма заполнитель перемещается на слайде,
Вот что я придумал, чтобы справиться с этим:
- магазин расположение всех форм
- сброс макета слайдов
- совпадающие слайды и основные слайды
- восстановите расположение всех фигур.
Это функция, которая выполняет это и возвращает отображение mastershapename - shapename.
private Dictionary<string, string> GetShapeMasters(Powerpoint.Slide s)
{
Dictionary<string, string> shapeMasters = new Dictionary<string, string>();
List<ShapeLocation> shapeLocations = new List<ShapeLocation>();
//store locations
foreach (Powerpoint.Shape sh in s.Shapes)
{
shapeLocations.Add(new ShapeLocation()
{
Name = sh.Name,
Location = new System.Drawing.RectangleF(sh.Left, sh.Top, sh.Width, sh.Height)
});
}
//have powerpoint reset the slide
//ISSUE: this changes the names of placeholders without content.
s.CustomLayout = s.CustomLayout;
//compare slide and master
foreach (Powerpoint.Shape sh in s.Shapes)
{
foreach (Powerpoint.Shape msh in s.CustomLayout.Shapes)
{
if (IsShapeMaster(sh, msh))
{
shapeMasters[msh.Name] = sh.Name;
}
}
}
//restore locations
//TODO: might be replaced by undo
foreach (var shm in shapeLocations)
{
Powerpoint.Shape sh = null;
try
{
sh = s.Shapes[shm.Name];
}
catch
{
//Fails for renamed placeholder shapes.
//Have yet to find a decent way to check if a shape name exists.
}
//placeholders do not need to be restored anyway.
if (sh != null)
{
sh.Left = shm.Location.Left;
sh.Top = shm.Location.Top;
sh.Width = shm.Location.Width;
sh.Height = shm.Location.Height;
}
}
return shapeMasters;
}
С этим вы можете сделать
Dictionary<string, string> shapeMasters = GetShapeMasters(theSlide);
if(shapeMasters.ContainsKey("KnownPlaceholderName"))
Powerpoint.Shape KnownShape = theSlide[shapeMasters["KnownPlaceholderName"]];
А вот функция сравнения, которая принимает две формы и проверяет, если они «равны». Может быть расширен, чтобы сделать его более точным.
private bool IsShapeMaster(Powerpoint.Shape sh, Powerpoint.Shape msh)
{
return
sh.Left == msh.Left
&& sh.Top == msh.Top
&& sh.Width == msh.Width
&& sh.Height == msh.Height
&& sh.Type == msh.Type
&& sh.PlaceholderFormat.Type == msh.PlaceholderFormat.Type;
}
Маленький класс, который сохраняет исходное местоположение форма
class ShapeLocation
{
public string Name;
public System.Drawing.RectangleF Location;
}
Это код из C# VSTO надстройки, но я полагаю, что это не то, что отличается от VB или других типов автоматизации PPT.
Спасибо, Отаку, но это не так. PlaceholderFormat.Type не является индексом, так как вы его использовали здесь. Кроме того, кажется, что ваше решение подразумевает, что в макете имеется не более одного заполнителя каждого типа. – OfficeAddinDev
Я не уверен, что вы подразумеваете под «PlaceholderFormat.Type не индекс» - это перечисление.Например, 1 является «ppPlaceholderTitle», а 2 - «ppPlaceholderBody». Вот как вы узнаете, что является родителем формы заполнителя - если вы не ищете это и не нуждаетесь в чем-то другом. Кроме того, на слайде может быть много заполнителей - я не предоставил «решение» как таковое, просто пример кода, чтобы вы могли доработать его по мере необходимости, проверить другие заполнители и т. Д. –
Итак, предположим, на слайде есть 4 заполнителя с типом ppPlaceholderChart и заполнены диаграммами. Как я могу ссылаться на заполнитель в макете слайда, который соответствует второму графику на слайде, используя этот метод? mySlide.CustomLayout.Shapes.Placeholders (ppPlaceholderChart) возвращает ShapeRange из 4 заполнителей, но как я могу определить, какая из них соответствует второму графику? – OfficeAddinDev