在 .NET 中管理演示文稿的 SmartArt 形状节点
添加 SmartArt 节点
Aspose.Slides for .NET 提供了最简单的 API,以最简便的方式管理 SmartArt 形状。以下示例代码演示如何在 SmartArt 形状中添加节点和子节点。
- 创建一个 Presentation 类的实例,并加载包含 SmartArt 形状的演示文稿。
- 使用索引获取第一张幻灯片的引用。
- 遍历第一张幻灯片中的所有形状。
- 检查形状是否为 SmartArt 类型,如果是,则将选定的形状强制转换为 SmartArt。
- 在 SmartArt 形状的 NodeCollection 中添加新的节点,并在 TextFrame 中设置文本。
- 然后,在新添加的 SmartArt 节点中添加子节点,并在 TextFrame 中设置文本。
- 保存演示文稿。
// 加载所需的演示文稿
Presentation pres = new Presentation("AddNodes.pptx");
// 遍历第一张幻灯片中的所有形状
foreach (IShape shape in pres.Slides[0].Shapes)
{
// 检查形状是否为 SmartArt 类型
if (shape is Aspose.Slides.SmartArt.SmartArt)
{
// 将形状强制转换为 SmartArt
Aspose.Slides.SmartArt.SmartArt smart = (Aspose.Slides.SmartArt.SmartArt)shape;
// 添加一个新的 SmartArt 节点
Aspose.Slides.SmartArt.SmartArtNode TemNode = (Aspose.Slides.SmartArt.SmartArtNode)smart.AllNodes.AddNode();
// 添加文本
TemNode.TextFrame.Text = "Test";
// 在父节点中添加新的子节点。它将被添加到集合的末尾
Aspose.Slides.SmartArt.SmartArtNode newNode = (Aspose.Slides.SmartArt.SmartArtNode)TemNode.ChildNodes.AddNode();
// 添加文本
newNode.TextFrame.Text = "New Node Added";
}
}
// 保存演示文稿
pres.Save("AddSmartArtNode_out.pptx", Aspose.Slides.Export.SaveFormat.Pptx);
在特定位置添加 SmartArt 节点
以下示例代码说明了如何在特定位置向 SmartArt 形状的相应节点添加子节点。
- 创建
Presentation类的实例。 - 使用索引获取第一张幻灯片的引用。
- 在访问的幻灯片中添加一种 StackedList 类型的 SmartArt 形状。
- 访问已添加 SmartArt 形状的第一个节点。
- 然后,在位置 2 为选定的节点添加子节点并设置其文本。
- 保存演示文稿。
// 创建演示文稿实例
Presentation pres = new Presentation();
// 访问演示文稿的幻灯片
ISlide slide = pres.Slides[0];
// 添加 SmartArt IShape
ISmartArt smart = slide.Shapes.AddSmartArt(0, 0, 400, 400, SmartArtLayoutType.StackedList);
// 访问索引 0 处的 SmartArt 节点
ISmartArtNode node = smart.AllNodes[0];
// 在父节点的位置 2 添加新的子节点
SmartArtNode chNode = (SmartArtNode)((SmartArtNodeCollection)node.ChildNodes).AddNodeByPosition(2);
// 添加文本
chNode.TextFrame.Text = "Sample Text Added";
// 保存演示文稿
pres.Save("AddSmartArtNodeByPosition_out.pptx", Aspose.Slides.Export.SaveFormat.Pptx);
访问 SmartArt 节点
以下示例代码帮助访问 SmartArt 形状中的节点。请注意,SmartArt 的 LayoutType 是只读的,且仅在添加 SmartArt 形状时设置,无法更改。
- 创建
Presentation类的实例并加载包含 SmartArt 形状的演示文稿。 - 使用索引获取第一张幻灯片的引用。
- 遍历第一张幻灯片中的所有形状。
- 检查形状是否为 SmartArt 类型,如果是,则将选定的形状强制转换为 SmartArt。
- 遍历 SmartArt 形状中的所有节点。
- 访问并显示信息,如 SmartArt 节点的位置、层级和文本。
// 加载所需的演示文稿
Presentation pres = new Presentation("AccessSmartArt.pptx");
// 遍历第一张幻灯片中的所有形状
foreach (IShape shape in pres.Slides[0].Shapes)
{
// 检查形状是否为 SmartArt 类型
if (shape is Aspose.Slides.SmartArt.SmartArt)
{
// 将形状强制转换为 SmartArt
Aspose.Slides.SmartArt.SmartArt smart = (Aspose.Slides.SmartArt.SmartArt)shape;
// 遍历 SmartArt 中的所有节点
for (int i = 0; i < smart.AllNodes.Count; i++)
{
// 访问索引 i 处的 SmartArt 节点
Aspose.Slides.SmartArt.SmartArtNode node = (Aspose.Slides.SmartArt.SmartArtNode)smart.AllNodes[i];
// 打印 SmartArt 节点参数
string outString = string.Format("i = {0}, Text = {1}, Level = {2}, Position = {3}", i, node.TextFrame.Text, node.Level, node.Position);
Console.WriteLine(outString);
}
}
}
访问 SmartArt 子节点
以下示例代码帮助访问 SmartArt 形状中各节点对应的子节点。
- 创建 PresentationEx 类的实例并加载包含 SmartArt 形状的演示文稿。
- 使用索引获取第一张幻灯片的引用。
- 遍历第一张幻灯片中的所有形状。
- 检查形状是否为 SmartArt 类型,如果是,则将选定的形状强制转换为 SmartArtEx。
- 遍历 SmartArt 形状中的所有节点。
- 对于每个选定的 SmartArt 形状节点,遍历该节点内部的所有子节点。
- 访问并显示信息,如子节点的位置、层级和文本。
// 加载所需的演示文稿
Presentation pres = new Presentation("AccessChildNodes.pptx");
// 遍历第一张幻灯片中的所有形状
foreach (IShape shape in pres.Slides[0].Shapes)
{
// 检查形状是否为 SmartArt 类型
if (shape is Aspose.Slides.SmartArt.SmartArt)
{
// 将形状强制转换为 SmartArt
Aspose.Slides.SmartArt.SmartArt smart = (Aspose.Slides.SmartArt.SmartArt)shape;
// 遍历 SmartArt 中的所有节点
for (int i = 0; i < smart.AllNodes.Count; i++)
{
// 访问索引 i 处的 SmartArt 节点
Aspose.Slides.SmartArt.SmartArtNode node0 = (Aspose.Slides.SmartArt.SmartArtNode)smart.AllNodes[i];
// 遍历索引 i 处 SmartArt 节点的子节点
for (int j = 0; j < node0.ChildNodes.Count; j++)
{
// 访问 SmartArt 节点中的子节点
Aspose.Slides.SmartArt.SmartArtNode node = (Aspose.Slides.SmartArt.SmartArtNode)node0.ChildNodes[j];
// 打印 SmartArt 子节点参数
string outString = string.Format("j = {0}, Text = {1}, Level = {2}, Position = {3}", j, node.TextFrame.Text, node.Level, node.Position);
Console.WriteLine(outString);
}
}
}
}
在特定位置访问 SmartArt 子节点
本示例演示如何在特定位置访问 SmartArt 形状中相应节点的子节点。
- 创建
Presentation类的实例。 - 使用索引获取第一张幻灯片的引用。
- 添加一种 StackedList 类型的 SmartArt 形状。
- 访问已添加的 SmartArt 形状。
- 访问已访问 SmartArt 形状中索引为 0 的节点。
- 然后,使用 GetNodeByPosition() 方法访问该 SmartArt 节点位置 1 的子节点。
- 访问并显示信息,如子节点的位置、层级和文本。
// 实例化演示文稿
Presentation pres = new Presentation();
// 访问第一张幻灯片
ISlide slide = pres.Slides[0];
// 在第一张幻灯片中添加 SmartArt 形状
ISmartArt smart = slide.Shapes.AddSmartArt(0, 0, 400, 400, SmartArtLayoutType.StackedList);
// 访问索引 0 处的 SmartArt 节点
ISmartArtNode node = smart.AllNodes[0];
// 访问父节点中位置 1 的子节点
int position = 1;
SmartArtNode chNode = (SmartArtNode)node.ChildNodes[position];
// 打印 SmartArt 子节点参数
string outString = string.Format("j = {0}, Text = {1}, Level = {2}, Position = {3}", position, chNode.TextFrame.Text, chNode.Level, chNode.Position);
Console.WriteLine(outString);
删除 SmartArt 节点
本示例演示如何删除 SmartArt 形状中的节点。
- 创建
Presentation类的实例并加载包含 SmartArt 形状的演示文稿。 - 使用索引获取第一张幻灯片的引用。
- 遍历第一张幻灯片中的所有形状。
- 检查形状是否为 SmartArt 类型,如果是,则将选定的形状强制转换为 SmartArt。
- 检查该 SmartArt 是否拥有超过 0 个节点。
- 选择要删除的 SmartArt 节点。
- 然后,使用 RemoveNode() 方法删除选定的节点并保存演示文稿。
// 加载所需的演示文稿
using (Presentation pres = new Presentation("RemoveNode.pptx"))
{
// 遍历第一张幻灯片中的所有形状
foreach (IShape shape in pres.Slides[0].Shapes)
{
// 检查形状是否为 SmartArt 类型
if (shape is ISmartArt)
{
// 将形状强制转换为 SmartArtEx
ISmartArt smart = (ISmartArt)shape;
if (smart.AllNodes.Count > 0)
{
// 访问索引 0 处的 SmartArt 节点
ISmartArtNode node = smart.AllNodes[0];
// 删除选中的节点
smart.AllNodes.RemoveNode(node);
}
}
}
// 保存演示文稿
pres.Save("RemoveSmartArtNode_out.pptx", Aspose.Slides.Export.SaveFormat.Pptx);
}
在特定位置删除 SmartArt 节点
本示例演示如何在特定位置删除 SmartArt 形状中的节点。
- 创建
Presentation类的实例并加载包含 SmartArt 形状的演示文稿。 - 使用索引获取第一张幻灯片的引用。
- 遍历第一张幻灯片中的所有形状。
- 检查形状是否为 SmartArt 类型,如果是,则将选定的形状强制转换为 SmartArt。
- 选择索引为 0 的 SmartArt 形状节点。
- 然后,检查选定的 SmartArt 节点是否拥有超过 2 个子节点。
- 然后,使用 RemoveNodeByPosition() 方法删除位置 1 的节点。
- 保存演示文稿。
// 加载所需的演示文稿
Presentation pres = new Presentation("RemoveNodeSpecificPosition.pptx");
// 遍历第一张幻灯片中的所有形状
foreach (IShape shape in pres.Slides[0].Shapes)
{
// 检查形状是否为 SmartArt 类型
if (shape is Aspose.Slides.SmartArt.SmartArt)
{
// 将形状强制转换为 SmartArt
Aspose.Slides.SmartArt.SmartArt smart = (Aspose.Slides.SmartArt.SmartArt)shape;
if (smart.AllNodes.Count > 0)
{
// 访问索引 0 处的 SmartArt 节点
Aspose.Slides.SmartArt.ISmartArtNode node = smart.AllNodes[0];
if (node.ChildNodes.Count >= 2)
{
// 删除位置 1 的子节点
((Aspose.Slides.SmartArt.SmartArtNodeCollection)node.ChildNodes).RemoveNode(1);
}
}
}
}
// 保存演示文稿
pres.Save("RemoveSmartArtNodeByPosition_out.pptx", Aspose.Slides.Export.SaveFormat.Pptx);
为 SmartArt 对象中的子节点设置自定义位置
现在 Aspose.Slides for .NET 支持设置 SmartArtShape 的 X 和 Y 属性。下面的代码片段演示如何设置自定义的 SmartArtShape 位置、大小和旋转,请注意,添加新节点会重新计算所有节点的位置和大小。
// 加载所需的演示文稿
Presentation pres = new Presentation("AccessChildNodes.pptx");
{
ISmartArt smart = pres.Slides[0].Shapes.AddSmartArt(20, 20, 600, 500, SmartArtLayoutType.OrganizationChart);
// 将 SmartArt 形状移动到新位置
ISmartArtNode node = smart.AllNodes[1];
ISmartArtShape shape = node.Shapes[1];
shape.X += (shape.Width * 2);
shape.Y -= (shape.Height / 2);
// 更改 SmartArt 形状的宽度
node = smart.AllNodes[2];
shape = node.Shapes[1];
shape.Width += (shape.Width / 2);
// 更改 SmartArt 形状的高度
node = smart.AllNodes[3];
shape = node.Shapes[1];
shape.Height += (shape.Height / 2);
// 更改 SmartArt 形状的旋转
node = smart.AllNodes[4];
shape = node.Shapes[1];
shape.Rotation = 90;
pres.Save("SmartArt.pptx", SaveFormat.Pptx);
}
检查助理节点
以下示例代码将探讨如何识别 SmartArt 节点集合中的助理节点并对其进行更改。
- 创建 PresentationEx 类的实例并加载包含 SmartArt 形状的演示文稿。
- 使用索引获取第二张幻灯片的引用。
- 遍历第一张幻灯片中的所有形状。
- 检查形状是否为 SmartArt 类型,如果是,则将选定的形状强制转换为 SmartArtEx。
- 遍历 SmartArt 形状中的所有节点,并检查它们是否为助理节点。
- 将助理节点的状态更改为普通节点。
- 保存演示文稿。
// 创建演示文稿实例
using (Presentation pres = new Presentation("AssistantNode.pptx"))
{
// 遍历第一张幻灯片中的所有形状
foreach (IShape shape in pres.Slides[0].Shapes)
{
// 检查形状是否为 SmartArt 类型
if (shape is Aspose.Slides.SmartArt.ISmartArt)
{
// 将形状强制转换为 SmartArtEx
Aspose.Slides.SmartArt.ISmartArt smart = (Aspose.Slides.SmartArt.SmartArt)shape;
// 遍历 SmartArt 形状的所有节点
foreach (Aspose.Slides.SmartArt.ISmartArtNode node in smart.AllNodes)
{
String tc = node.TextFrame.Text;
// 检查节点是否为助理节点
if (node.IsAssistant)
{
// 将助理节点设置为 false 并将其改为普通节点
node.IsAssistant = false;
}
}
}
}
// 保存演示文稿
pres.Save("ChangeAssitantNode_out.pptx", Aspose.Slides.Export.SaveFormat.Pptx);
}
设置节点的填充格式
Aspose.Slides for .NET 可以添加自定义 SmartArt 形状并设置其填充格式。本文说明如何使用 Aspose.Slides for .NET 创建和访问 SmartArt 形状以及设置其填充格式。
- 创建
Presentation类的实例。 - 使用索引获取幻灯片的引用。
- 通过设置 LayoutType 添加 SmartArt 形状。
- 为 SmartArt 形状节点设置 FillFormat。
- 将修改后的演示文稿写入为 PPTX 文件。
using (Presentation presentation = new Presentation())
{
// 访问幻灯片
ISlide slide = presentation.Slides[0];
// 添加 SmartArt 形状和节点
var chevron = slide.Shapes.AddSmartArt(10, 10, 800, 60, SmartArtLayoutType.ClosedChevronProcess);
var node = chevron.AllNodes.AddNode();
node.TextFrame.Text = "Some text";
// 设置节点填充颜色
foreach (var item in node.Shapes)
{
item.FillFormat.FillType = FillType.Solid;
item.FillFormat.SolidFillColor.Color = Color.Red;
}
// 保存演示文稿
presentation.Save("FillFormat_SmartArt_ShapeNode_out.pptx", SaveFormat.Pptx);
}
生成 SmartArt 子节点的缩略图
开发者可以按照以下步骤生成 SmartArt 子节点的缩略图:
- 实例化表示 PPTX 文件的
Presentation类。 - 添加 SmartArt。
- 使用索引获取节点的引用。
- 获取缩略图图像。
- 以任意所需的图像格式保存缩略图。
下面的示例生成 SmartArt 子节点的缩略图
using (Presentation presentation = new Presentation())
{
ISlide slide = presentation.Slides[0];
ISmartArt smartArt = slide.Shapes.AddSmartArt(10, 10, 400, 300, SmartArtLayoutType.BasicCycle);
ISmartArtNode node = smartArt.Nodes[1];
using (IImage image = node.Shapes[0].GetImage())
{
image.Save("SmartArt_ChildNote_Thumbnail_out.jpeg", ImageFormat.Jpeg);
}
}
FAQ
是否支持 SmartArt 动画? 是的。SmartArt 被视为普通形状,您可以应用标准动画(进入、退出、强调、运动路径)并调整时间。必要时也可以为 SmartArt 节点内部的形状添加动画。
如果不知道内部 ID,如何可靠地定位幻灯片上的特定 SmartArt? 通过替代文本进行分配和搜索。为 SmartArt 设置独特的 AltText,可在不依赖内部标识符的情况下通过编程方式找到它。
将演示文稿转换为 PDF 时,SmartArt 的外观是否会保留? 是的。Aspose.Slides 在PDF 导出过程中以高视觉保真度渲染 SmartArt,保留布局、颜色和效果。
我可以提取整个 SmartArt 的图像(用于预览或报告)吗? 是的。您可以将 SmartArt 形状渲染为光栅格式或SVG,以获得可缩放的矢量输出,适用于缩略图、报告或网页使用。