Да, функциональность доступна через "взаимодействие" :-) Это просто немного ... загадочно, особенно для тех, кто не из PowerPoint.
Поскольку SmartArt "обернут"в объекте Shape
сначала необходимо получить Shape
, затем через него объект SmartArt
- Shape
имеет свойства HasSmartArt
(test) и SmartArt
(use).
(Обратите внимание, что мне очень полезно явно объявлять объект тип , а не полагаться на var для «угадывания». Это очень помогает при устранении неполадок.)
Фактическое содержимое («коробки»): Nodes
. По какой-то причине PIA не предоставляют Node-объекты (но они присутствуют в объектной модели COM), поэтому доступ к ним немного обходится в C #. Чтобы получить все узлы, используйте свойство AllNodes
для возврата коллекции.
Затем к объектам Node можно обратиться с индексированием коллекции nds[i]
. Отдельный узел может быть назначен SmartArtNode
или объекту Office Shape
. Для целей этого вопроса - добавления текста - следующим шагом будет то же самое ...
"Ящики" сами по себе являются текстовыми полями Office Drawing (Shapes
) и имеют свойство TextFrame2.TextRange.Text
длядоступ к их контенту. (Обратите внимание, что содержимое по умолчанию на самом деле является заполнителем, поэтому это свойство не будет возвращать ничего для вновь созданного SmartArt.)
Примечание. Код в вопросе пытается использовать AlternativeText
- это похоже на «AltText» в объектах HTML, оно предоставляет доступную информацию и не имеет отношения к тому, что вы пытаетесь сделать.
static void Main(string[] args)
{
excelApp = new Excel.Application();
excelApp.Visible = true;
Excel.Workbook wb = excelApp.Workbooks.Add();
Excel.Worksheet ws = (Excel.Worksheet) wb.Worksheets[1];
var myLayout = excelApp.SmartArtLayouts[88];
var smartArtShape = ws.Shapes.AddSmartArt(myLayout, 50, 50, 200, 200);
if (smartArtShape.HasSmartArt == Office.MsoTriState.msoTrue)
{
Office.SmartArt smartArt = smartArtShape.SmartArt;
Office.SmartArtNodes nds = smartArt.AllNodes;
for (int i = 1; i <= nds.Count; i++)
{
Office.SmartArtNode nd = nds[i]; //both work
var shpNode = nd.Shapes.Item(1);
nd.TextFrame2.TextRange.Text = "Testing Node " + i;
shpNode.TextFrame2.TextRange.Text = "Testing Shape " + i;
}
}
}