Visio 檔案格式 (.vsdx) 簡介
瞭解 Visio 2013 中的新檔案格式、探索一些以程式設計方式使用 Visio 2013 檔案格式的高階概念,以及建立可檢查 Visio 2013 檔案的簡單控制台應用程式。
值 | |
---|---|
在本文中,簡介什麼是「幕後」的 Visio 2013 檔格式?使用 Visio 2013 檔案格式的開發人員案例:以程式設計方式探索 Visio 2013 檔格式的其他資源 |
簡介
Visio 2013 引進 Visio 的新檔格式 (.vsdx) ,其會取代 Visio 二進位檔格式 (.vsd) 和 Visio XML Drawing 檔格式 (.vdx) 。 因為 Visio 2013 檔格式是以開放式封裝慣例和 XML 為基礎,所以熟悉這些技術的開發人員可以快速瞭解如何以程式設計方式使用 Visio 2013 檔案。 熟悉舊版 Visio 的 Visio XML 繪圖檔格式 (.vdx) 的開發人員,可以在檔格式.vsdx部分中找到許多相同的 XML 結構。 與 Visio 檔案的互操作性會大幅提升,因為第三方軟體可以在檔格式層級操作 Visio 檔案。 Microsoft SharePoint Server 2013 中的 Visio Services 支援 Visio 2013 檔格式,不需要「中繼」檔格式即可發佈至 SharePoint Server。
依擴展名,有數種檔類型組成 Visio 2013 檔案格式。 這些副檔名包括:
- .vsdx (Visio 繪圖)
- .vsdm (Visio 啟用巨集的繪圖)
- .vssx (Visio 樣板)
- .vssm (Visio 啟用巨集的樣板)
- .vstx (Visio 範本)
- .vstm (Visio 啟用巨集的範本)
注意事項
只有啟用巨集的檔案 (.vsdm、.vssm 及 .vstm) 可以儲存 VBA 巨集。 您無法將巨集儲存在副檔名為 .vsdx、.vssx、.vstx 的檔案中。
「幕後」的 Visio 2013 檔案格式為何?
Visio 2013 檔案格式使用 Open Packing Conventions (OPC) ,這會定義結構化方法,以使用某種類型的容器來儲存應用程式數據以及相關資源─例如 ZIP 檔案。 在基本層級,Visio 2013 檔案實際上是包含其他文件類型的 ZIP 容器。 事實上,您可以將 Visio 2013 中的繪圖儲存為.vsdx檔案、在 Windows 檔案總管中將擴展名重新命名為 “*.zip”,然後開啟檔案,就像資料夾一樣查看內部的內容。
注意事項
本文章只包含開放式封裝慣例的簡要概觀。 您可以在其他文章中找到慣例的更詳細涵蓋範圍:如需開放式封裝慣例本身的詳細資訊,請參閱 OPC:封裝數據的新標準。 如需開啟封裝慣例及其在 Microsoft Office 檔案中使用的詳細資訊,請參閱 開放式封裝慣例的基本 概念和 Office (2007) Open XML 檔格式簡介。
封裝和封裝組件
如先前所開始,Visio 2013 檔案是 ZIP 容器或「套件」,可將其他檔案保存 (稱為「套件元件」,) 其中。 封裝組件可以是 XML 檔案、影像,甚至 VBA 解決方案。 套件內的元件可以進一步分成兩大類別:「檔元件」和「關聯性元件」。檔元件包含 Visio 檔案的實際內容和元數據,例如檔名、第一頁及其包含的所有圖形,甚至是圖形的數據連線。 封裝內的影像和文字檔案可視為文件組件。 本文章後續的章節有更詳細的關聯性組件描述。
注意事項
如果您使用 ZIP 公用程式開啟 Visio 2013 檔案,您可能會看到 ZIP 套件內包含數個資料夾。 您甚至可以使用 ZIP 公用程式操作這些類似資料夾的子位址。 不過,這些「資料夾」代表 ZIP 套件內的子位址,而不是實際的資料夾。 您無法使用資料夾的程式設計對等項目在解決方案中使用這些子位址。
文件組件和關聯性組件等封裝組件也都有相關聯的內容類型。 這些內容類型是定義 MIME 媒體類型的字串。 這些內容類型指定及界定檔案可包含的 MIME 類型種類。
關聯性
關聯性元件 (以擴展名 「*.rels」 結尾,並儲存在 「_rels」 資料夾中) 描述封裝內的元件彼此關聯的方式,並提供檔案的結構。 獨立 XML 文件使用具備父子關聯性的元素來決定實體彼此之間的關聯性。 其他檔案可能會使用其他階層或檔案資料夾結構來描述檔案內容的互動。 針對 Visio 2013 檔案格式,如果套件包含正確的元件集,且套件包含元件之間的關聯性,則套件是有效的 Visio 檔案。
關聯性組件是描述封裝內不同文件組件之間之關聯性的 XML 文件。 它們定義兩項目之間的關聯:指定的來源 (根據關聯性檔案的名稱和位置所定義) 和指定的目標文件組件。 例如,關聯性組件可用來描述與檔案相關聯的圖案主圖形、頁面與檔案和頁面之間的相關性,抑或是影像和物件與特定頁面之間的相關性。
Visio VDX 架構的相似性和差異
如前所述,舊版的 Visio 也包含 XML 檔格式、Visio XML 繪圖格式或 .vdx。 (在舊版的 Visio 中,用於 Visio XML 繪圖格式的架構稱為 DatadiagramML.) Visio XML 架構中的某些部分在兩種檔格式之間維持不變。 例如, Windows 元素及其子系保持不變─但 Windows 元素現在是 XML 檔 (window.xml) 的根元素除外。
XML 繪圖格式與 Visio 2013 檔案格式之間的最大差異是封裝。 XML 繪圖格式檔案可以像一般獨立 XML 一樣進行操作;Visio 2013 檔案格式必須以套件的形式操作。 在 Visio 2013 中,XML 已分成多個部分,以方便使用。 另一個明顯的變更是 Visio 2013 檔格式會將所有文檔屬性儲存在 OPC 標準 (app.xml、core.xml custom.xml) 所描述的檔元件中。
不過,所有 Visio 開發人員都必須注意一項重大變更: 單元格、數據 列和 Section 元素的引進。 在 XML 繪圖檔案格式結構描述中,ShapeSheet 中的個別資料列和儲存格均以具名元素來代表。 例如,假設您有一份檔,其中包含 PinX 值為 「2」 的圖形, (表示圖形的旋轉釘選距離繪圖) 左邊緣 2 英吋。 在 XML 繪圖檔案格式中,該項設定的相關標記如以下程式碼所示。
<Shape ID="1" TextStyle="3" FillStyle="3" LineStyle="3" Type="Shape">
<XForm>
<PinX Unit="IN">2</Pinx>
<!--- Other cells in the Shape Transform section -->
</XForm>
<!--- Other rows and cells in the ShapeSheet -->
</Shape>
在程式碼中,PinX 元素是 XForm 元素的子系,再來是 Shape 元素的子系。 這會建立 Visio ShapeSheet UI 的模型,其中 PinX 單元格會包含在圖形的 Shape Transform 區段中。
在 Visio 2013 檔格式中,ShapeSheet─ PinX、LinePattern、Geometry 區段中 MoveTo 列中的 X 單元格等所有儲存格都是以一種 XML 元素 Cell 元素來表示。 不同的 Cell 元素則是以元素之 N 屬性的值來賦予個別的特性。 因此,在以上範例中,ShapeSheet 之 PinX 儲存格所包含的資料會儲存在 VSDX 檔案中,如以下程式碼所示。
<Shape TextStyle="3" FillStyle="3" LineStyle="3" Type="Shape" ID="1">
<Cell N="PinX" U="IN" V="2"/>
<!--- Other cells in the ShapeSheet -->
</Shape>
PinX 的 Cell 元素 (,以及其他稱為“singleton cells” 的個別具名單元格,例如 LinePattern 或 LockSelect) 是 Shape 元素的直接子系。 我們不需要唯一元素來代表包含 PinX 儲存格的資料列,因為每個圖案只能有一個 PinX。
那麼像 Geometry 區段這種包含表格式資料的區段,情況又是如何呢? 針對這些區段中的儲存格,Visio 2013 檔格式架構會使用 Section 和 Row 元素─也會以其 N 屬性或 T 屬性來辨別,如下所示─以包含數據。 例如,先前範例中同一個圖案的 Geometry 1 區段可能含有資料,它在 XML 繪圖結構描述中與下圖所示的程式碼相似。
<Shape TextStyle="3" FillStyle="3" LineStyle="3" Type="Shape" ID="1">
<!--- Other cells in the ShapeSheet -->
<Geom IX="0">
<!--- Other cells and rows in the Geometry 1 section -->
<LineTo IX="1">
<X F="Width*0">0</X>
<Y F="Height*0">0</Y>
</LineTo>
</Geom>
</Shape>
不過,它看起來就像 Visio 2013 檔案中的下列程式代碼。
<Shape TextStyle="3" FillStyle="3" LineStyle="3" Type="Shape" ID="1">
<!--- Other cells in the ShapeSheet -->
<Section N="Geometry" IX="0">
<!--- Other cells and rows in the Geometry 1 section -->
<Row IX="1" T="LineTo">
<Cell V="0" N="X" V="Width*0" />
<Cell V="0" N="Y" V="Height*0" />
</Row>
</Section>
</Shape>
使用 Visio 2013 檔案格式的開發人員案例
如上所述,Visio 2013 檔格式會利用 ZIP 檔案和 XML 等數種十分了解的技術來儲存數據。 若要在檔案層級操作 Visio 2013 繪圖,解決方案只需要使用與 ZIP 檔案或 XML 相關聯的 .NET Framework 命名空間和類別,例如 System.IO.Packaging 或 System.Xml。
Visio 2013 檔案格式開發人員的主要優點是,您可以讀取和寫入 Visio 2013 檔案,而不需要自動化 Visio 用戶端應用程式。 您可能會視為開發人員使用 Visio 2013 檔案格式的一些案例包括:
檢查個別 Visio 2013 檔案中的特定數據。 您不需要解壓縮整個檔案即可選擇性地讀取 ZIP 容器內的項目。
使用特定內容更新 Visio 2013 檔案的連結庫。 您可以利用程式設計的方式變更所有背景頁面中的標誌,藉此反映新的品牌方針。
建立使用 Visio 2013 檔案的應用程式。 例如,您可以建置工具來讀取 Visio 工作流程圖,然後根據該工作流程執行自己的商業規則。
請注意,由於這些解決方案使用標準 .NET Framework 組件,所以能在用戶端電腦上執行的解決方案大多也能在伺服器上執行!
以程式設計方式探索 Visio 2013 檔案格式
對於任何使用 Visio 2013 檔格式的開發人員而言,最基本且最基本的工作是以套件的形式開啟檔案,然後存取套件內的個別元件。 WindowsBase.dll 中的 System.IO.Packaging.Package 含有許多供您開啟及操作封裝和組件的類別。
在以下程式碼範例中,您可以瞭解如何開啟 .vsdx 檔案、讀取封裝內的組件清單,以及取得各個組件的相關資訊。
開啟.vsdx 檔案及檢視文件組件
開啟 Visio 2013 並建立新檔。
建立新文件,並將它儲存在桌面。
開啟 Visual Studio 2012。
在 [ 檔案] 功能表上,選擇 [ 新增],然後選擇 [ 專案]。
在 Visual C# 或 Visual Basic 下方展開 [Windows],然後選取 [主控台應用程式]。
在 [ 名稱] 方 塊中,輸入 'VisioFileExplorer'。 主控台應用程式專案隨即會開啟。
在 [方案總管] 中,以滑鼠右鍵按一下 [VisioFileExplorer],然後按一下 [加入參考]。
在 [加入參考]對話方塊中,於 [組件] 下方展開 [架構],然後選擇 [WindowsBase]。
將以下程式碼貼入解決方案。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.IO.Packaging;
using System.Diagnostics;
namespace VisioFileExplorer
{
class Program
{
static void Main(string[] args)
{
try
{
Console.WriteLine("Opening the VSDX file ...");
// Need to get the folder path for the Desktop
// where the file is saved.
string dirPath = System.Environment.GetFolderPath(
System.Environment.SpecialFolder.Desktop);
DirectoryInfo myDir = new DirectoryInfo(dirPath);
// It is a best practice to get the file name string
// using a FileInfo object, but it isn't necessary.
FileInfo[] fInfos = myDir.GetFiles("*.vsdx");
FileInfo fi = fInfos[0];
string fName = fi.FullName;
// We're not going to do any more than open
// and read the list of parts in the package, although
// we can create a package or read/write what's inside.
using (Package fPackage = Package.Open(
fName, FileMode.Open, FileAccess.Read))
{
// The way to get a reference to a package part is
// by using its URI. Thus, we're reading the URI
// for each part in the package.
PackagePartCollection fParts = fPackage.GetParts();
foreach (PackagePart fPart in fParts)
{
Console.WriteLine("Package part: {0}", fPart.Uri);
}
}
}
catch (Exception err)
{
Console.WriteLine("Error: {0}", err.Message);
}
finally
{
Console.Write("\nPress any key to continue ...");
Console.ReadKey();
}
}
}
}
Imports System
Imports System.Collections.Generic
Imports System.Linq
Imports System.Text
Imports System.IO
Imports System.IO.Packaging
Imports System.Diagnostics
Module Module1
Sub Main()
Try
Console.WriteLine("Opening the VSDX file ...")
' Need to get the folder path for the Desktop
' or where the file is saved.
Dim dirPath As String = System.Environment.GetFolderPath( _
System.Environment.SpecialFolder.Desktop)
Dim myDir As New DirectoryInfo(dirPath)
' It is a best practice to get the file name string
' using a FileInfo object, but it isn't necessary.
Dim fInfos As FileInfo() = myDir.GetFiles("*.vsdx")
Dim fi As FileInfo = fInfos(0)
Dim fName As String = fi.FullName
' We don't need to do any more than open
' and read the list of parts in the package, although
' we can create a package or read/write what's inside.
Using fPackage As Package = Package.Open( _
fName, FileMode.Open, FileAccess.Read)
' The way to get a reference to a document part is
' by using its URI. Thus, we're reading the URI
' for each document part in the package.
Dim fParts As PackagePartCollection = fPackage.GetParts()
For Each fPart As PackagePart In fParts
Console.WriteLine("Package part: {0}", fPart.Uri)
Next
End Using
Catch err As Exception
Console.WriteLine("Error: {0}", err.Message)
Finally
Console.Write(vbLf & "Press any key to continue ...")
Console.ReadKey()
End Try
End Sub
End Module
- 按 F5 偵錯解決方案。 當程式執行完成後,按任意鍵即可結束。
另請參閱
如需 Visio 2013 檔格式、開啟封裝慣例,或如何以程式設計方式使用 Visio 2013or Office OpenXML 檔案的詳細資訊,請參閱下列資源: