1

如果之前有人问过这个问题,我深表歉意,但是在搜索了一段时间后,我找不到任何具体的答案。

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

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

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

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

谢谢

4

1 回答 1

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

    }
}
于 2012-07-26T18:21:10.843 回答