如何在Visio中读取Shape的属性

我有以下任务。 我正在Studio 2010中的C#上编写Visio 2010的加载项。假设我打开了一个图表。 我在这个图表中有任何形状(让我们尝试管理一个开头的形状)。 问题是如何阅读这种形状的任何属性? 我应该使用哪种API?

基本算法:

  1. 扫描打开的文档以获取形状
  2. 如果文档中有任何形状,则返回所有形状的数组(或列表)(如果当前文档中没有形状,则返回null)
  3. 运行形状数组并读取每个元素的任何属性(这将有机会写/修改属性)

(代码示例将不胜感激)

我假设您通过属性引用Shape Data,它曾经在UI中称为Custom Properties,并且仍然在API中以该名称知道。

如果您不熟悉ShapeSheet,则应首先在ShapeSheet中查看具有自定义属性的形状,以查看属性的定义方式。 请参阅“ ShapeSheet发生了什么? ”以了解如何在Visio 2010中打开Shapesheet。

以下示例程序应该可以帮助您入门。 此示例假定您已在PC上安装了Visio Primary Interop程序集,并且已在项目中包含Microsoft.Office.Interop.Visio的裁判。

namespace VisioEventsExample { using System; using Microsoft.Office.Interop.Visio; class Program { public static void Main(string[] args) { // Open up one of Visio's sample drawings. Application app = new Application(); Document doc = app.Documents.Open( @"C:\Program Files\Microsoft Office\Office14\visio content\1033\ASTMGT_U.VST"); // Get the first page in the sample drawing. Page page = doc.Pages[1]; // Start with the collection of shapes on the page and // print the properties we find, printProperties(page.Shapes); } /* This function will travel recursively through a collection of * shapes and print the custom properties in each shape. * * The reason I don't simply look at the shapes in Page.Shapes is * that when you use the Group command the shapes you group become * child shapes of the group shape and are no longer one of the * items in Page.Shapes. * * This function will not recursive into shapes which have a Master. * This means that shapes which were created by dropping from stencils * will have their properties printed but properties of child shapes * inside them will be ignored. I do this because such properties are * not typically shown to the user and are often used to implement * features of the shapes such as data graphics. * * An alternative halting condition for the recursion which may be * sensible for many drawing types would be to stop when you * find a shape with custom properties. */ public static void printProperties(Shapes shapes) { // Look at each shape in the collection. foreach (Shape shape in shapes) { // Use this index to look at each row in the properties // section. short iRow = (short) VisRowIndices.visRowFirst; // While there are stil rows to look at. while (shape.get_CellsSRCExists( (short) VisSectionIndices.visSectionProp, iRow, (short) VisCellIndices.visCustPropsValue, (short) 0) != 0) { // Get the label and value of the current property. string label = shape.get_CellsSRC( (short) VisSectionIndices.visSectionProp, iRow, (short) VisCellIndices.visCustPropsLabel ).get_ResultStr(VisUnitCodes.visNoCast); string value = shape.get_CellsSRC( (short) VisSectionIndices.visSectionProp, iRow, (short) VisCellIndices.visCustPropsValue ).get_ResultStr(VisUnitCodes.visNoCast); // Print the results. Console.WriteLine(string.Format( "Shape={0} Label={1} Value={2}", shape.Name, label, value)); // Move to the next row in the properties section. iRow++; } // Now look at child shapes in the collection. if (shape.Master == null && shape.Shapes.Count > 0) printProperties(shape.Shapes); } } } } 

我写了一个库,使这更容易

要检索多个形状的属性:

 var shapes = new[] {s1, s2}; var props = VA.CustomProperties.CustomPropertyHelper.GetCustomProperties(page, shapes); 

存储在props中的返回值将是一个字典列表。 每个字典对应于指定形状的属性。 属性的名称是字典中的键。

获得第一个形状的“Foo”属性……

 props[0]["Foo"] 

它检索包含属性的这些方面的公式和结果的对象:

  • 日历
  • 格式
  • 无形
  • 标签
  • LANGID
  • 提示
  • SORTKEY
  • 类型
  • 校验

对于所有那些需要代码帮助的人,可以在以后的问题上帮助:

 ... using Visio = Microsoft.Office.Interop.Visio; namespace RibbonCustomization { [ComVisible(true)] public class Ribbon1 : Office.IRibbonExtensibility { public void ReadShapes(Microsoft.Office.Core.IRibbonControl control) { ExportElement exportElement; ArrayList exportElements = new ArrayList(); Visio.Document currentDocument = Globals.ThisAddIn.Application.ActiveDocument; Visio.Pages Pages = currentDocument.Pages; Visio.Shapes Shapes; foreach(Visio.Page Page in Pages) { Shapes = Page.Shapes; foreach (Visio.Shape Shape in Shapes) { exportElement = new ExportElement(); exportElement.Name = Shape.Master.NameU; exportElement.ID = Shape.ID; exportElement.Text = Shape.Text; ... // and any other properties you'd like exportElements.Add(exportElement); } } ....