2012-07-13 47 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("----------------------------"); 

    } 
}