Visio 2010中C#实体自动化(Visio 2010 C# Entity Automation

2019-10-16 23:54发布

我道歉,如果这是之前问过,但搜索了一段时间后,我无法找到任何这具体的答案。

我有一个ERD图中Visio 2010中它总共有15桌左右。 为了有我们的DBA创建数据库,我要输出的每一列与所述数据类型,主键,描述以Excel工作表。

我第一次尝试是简单地从形状属性复制并粘贴列定义的表,但是这不工作(感谢微软!)。 尝试一些其他的东西后,它变成了我会的每一个细胞手动复制为每个表 - 耗时。

我转过身来,C#和Visio互操作的帮助。 我现在能够导出列定义(它们在形状的Text属性),但我无法找到其持有表的名称的属性。

有谁知道哪个对象拥有此属性,或者如果它甚至可以访问?

谢谢

Answer 1:

最后我解决它。 我无法解析出标准的Visio绘图(.vsd),所以我选择了的Visio XML绘图(.vdx)。 最终,这个工作对我来说:

其中path是文件路径的VxD图。 我原来每个形状定义页面XML图中有2个形状自身。 第一个形状保持实体名称,第二个拥有该实体的列。

XDocument xdoc = XDocument.Load(path);
var elements = xdoc.Elements().Elements();
XName pageXName = XName.Get("Page","http://schemas.microsoft.com/visio/2003/core");
var pages = elements.Elements(pageXName);

foreach (XElement page in pages)
{                
    XName shapeXName = XName.Get("Shape","http://schemas.microsoft.com/visio/2003/core");
    var shapes = from shape in page.Elements().Elements(shapeXName)
                 where shape.Attribute("Type").Value == "Group"
                 select shape;

    foreach (XElement shape in shapes)
    {
        var shapeShapes = shape.Elements();
        List<XElement> textShapes = shapeShapes.Elements(shapeXName).ToList();

        XName textXName = XName.Get("Text","http://schemas.microsoft.com/visio/2003/core");
        XName cpXName = XName.Get("Text", "http://schemas.microsoft.com/visio/2003/core");

        string tableName = textShapes[0].Elements(textXName).SingleOrDefault().Value;
        string columns = textShapes[1].Elements(textXName).SingleOrDefault().Value;

        Debug.WriteLine("-------------" + tableName.TrimEnd('\n') + "---------------");
        Debug.Write(columns);
        Debug.WriteLine("----------------------------");

    }
}


文章来源: Visio 2010 C# Entity Automation