2012-07-13 44 views
1

我很抱歉,如果这是之前问过,但搜索一段时间后,我找不到任何具体的答案。Visio 2010 C#实体自动化

我在Visio 2010中有一个ERD图。它有大约15个表左右。为了让我们的数据库管理员创建数据库,我必须输出每一列到数据类型,主键,描述的Excel工作表。

我的第一次尝试是从形状属性中简单地复制和粘贴列定义表,但这不起作用(感谢Microsoft!)。在尝试了其他一些事情之后,事实证明,我必须为每个表手动复制每个单元格 - 耗时。

我转向C#和Visio Interop寻求帮助。我现在可以导出列定义(它们在形状的Text属性中),但我找不到包含表名称的属性。

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

谢谢

回答

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

    } 
}