C# Visio 2010 C实体自动化

C# Visio 2010 C实体自动化,c#,database,interop,entity,visio,C#,Database,Interop,Entity,Visio,如果之前有人问我这个问题,我很抱歉,但是在搜索了一段时间后,我找不到任何关于这个问题的具体答案 我在Visio2010中有一个ERD图。大约有15张桌子。为了让我们的DBA创建数据库,我必须将每一列的数据类型、主键和描述输出到excel工作表 我的第一次尝试只是简单地从形状属性复制并粘贴列定义表,但由于Microsoft!的原因,这无法工作!。在尝试了其他一些事情之后,我发现我必须为每个表手动复制每个单元格,这非常耗时 我求助于C和VisioInterop。现在,我可以将列定义导出到形状的文本属

如果之前有人问我这个问题,我很抱歉,但是在搜索了一段时间后,我找不到任何关于这个问题的具体答案

我在Visio2010中有一个ERD图。大约有15张桌子。为了让我们的DBA创建数据库,我必须将每一列的数据类型、主键和描述输出到excel工作表

我的第一次尝试只是简单地从形状属性复制并粘贴列定义表,但由于Microsoft!的原因,这无法工作!。在尝试了其他一些事情之后,我发现我必须为每个表手动复制每个单元格,这非常耗时

我求助于C和VisioInterop。现在,我可以将列定义导出到形状的文本属性中,但找不到保存表名的属性

有人知道哪个对象拥有这个属性,或者它是否可以访问吗


谢谢

最后我解决了它。我无法解析出标准的Visio drawing.vsd,因此选择了Visio XML drawing.vdx。最后,这对我起了作用:

其中path是vxd图形的文件路径。我发现XML绘图页面中的每个形状定义都有自己的两个形状。第一个形状保存实体名称,第二个形状保存实体列

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 drawing.vsd,因此选择了Visio XML drawing.vdx。最后,这对我起了作用:

其中path是vxd图形的文件路径。我发现XML绘图页面中的每个形状定义都有自己的两个形状。第一个形状保存实体名称,第二个形状保存实体列

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("----------------------------");

    }
}