XML 結構描述和資料 (Visual Studio Tools for Office)
更新:2007 年 11 月
適用於 |
---|
本主題中的資訊僅適用於指定的 Visual Studio Tools for Office 專案和 Microsoft Office 版本。 專案類型
Microsoft Office 版本
如需詳細資訊,請參閱依應用程式和專案類型提供的功能。 |
Microsoft Office Excel 和 Microsoft Office Word 提供將結構描述對應至文件的能力。這項功能可以簡化將 XML 資料匯入文件,以及從文件匯出 XML 資料。
![]() |
---|
您不能在 Excel 方案中使用多重 XML 結構描述。 |
Visual Studio Tools for Office 會公開 (Expose) 文件層級自訂中對應的結構描述項目,做為程式撰寫模型 (Programming Model) 中的控制項。如果使用的是 Excel,Visual Studio Tools for Office 會在資料庫、Web 服務和物件中加入將控制項繫結至資料的支援。如果是 Word 和 Excel,Visual Studio Tools for Office 會加入執行窗格的支援,其可與結構描述對應文件搭配使用,以為方案建立加強的使用者經驗。如需詳細資訊,請參閱執行窗格概觀。
結構描述附加至 Excel 活頁簿時所建立的物件
當您將結構描述附加至活頁簿時,Visual Studio 會自動建立多個物件並將這些物件加入至專案。不應使用 Visual Studio 工具刪除這些物件,因為它們是由 Excel 進行管理。若要刪除它們,請移除工作表中的對應項目,或使用 Excel 工具中斷與結構描述的連結。
主要物件有兩個:
XML 結構描述 (XSD 檔)。對於活頁簿中的每個結構描述,Visual Studio 都會將結構描述加入專案。它會在 [方案總管] 中顯示為具有 XSD 擴充的專案項目。
具型別的 DataSet 類別。這個類別是根據結構描述建立的。在 [類別檢視] 中可以看見這個資料集類別。
當結構描述項目對應至 Excel 工作表時所建立的物件
當您從 [XML 原始檔] 工作窗格將結構描述項目對應至工作表時,Visual Studio 就會自動建立多個物件並將這些物件加入至專案:
控制項。程式撰寫模型中會針對活頁簿中的每個對應物件各建立一個 XmlMappedRange 控制項 (如果是非重複的結構描述項目) 或 ListObject 控制項 (如果是重複的結構描述項目)。只有刪除活頁簿中的對應和對應物件,才能刪除 ListObject 控制項。如需控制項的詳細資訊,請參閱主項目和主控制項概觀。
BindingSource。當您將非重複的結構描述項目對應至工作表,藉以建立 XmlMappedRange 時,就會一併建立 BindingSource 而且 XmlMappedRange 控制項會繫結至 BindingSource。您必須將 BindingSource 繫結至與對應至文件之結構描述相符的資料來源執行個體,例如建立的具型別 DataSet 類別執行個體。您可以設定 DataSource 和 DataMember 屬性 (公開於 [屬性] 視窗中),藉以建立繫結。
注意事項:
BindingSource 並不會針對 ListObject 物件建立。您必須設定 [屬性] 視窗中的 DataSource 和 DataMember 屬性,以手動方式將 ListObject 繫結至資料來源。
Office 對應結構描述和 Visual Studio 資料來源視窗
Office 的對應結構描述功能和 Visual Studio [資料來源] 視窗,都可以幫助您在 Excel 工作表上顯示資料,以進行報告或編輯。在這兩種情況下,您都可以將資料項目拖曳至 Excel 工作表。這兩種方法都會建立控制項,這些控制項是透過 BindingSource 繫結至資料來源 (例如 DataSet 或 Web 服務) 的資料。
![]() |
---|
當您將重複的結構描述項目對應至工作表時,Visual Studio Tools for Office 就會建立 ListObject。不過,ListObject 並不會透過 BindingSource 自動繫結至資料。您必須設定 [屬性] 視窗中的 DataSource 和 DataMember 屬性,以手動方式將 ListObject 繫結至資料來源。 |
下表顯示這兩種方法之間的一些差異。
XML 結構描述 |
資料來源視窗 |
---|---|
使用 Office 介面。 |
使用 Visual Studio 中的 [資料來源] 視窗。 |
啟用內建 Office 功能,以從 XML 檔匯入和匯出資料。 |
您必須以程式設計的方式提供匯入和匯出功能。 |
您必須撰寫程式碼,才能用資料填滿產生的控制項。 |
從 [資料來源] 視窗加入的控制項會自動產生程式碼,以對其進行填滿,同時還包括您使用資料庫伺服器時的必要連接字串。 |
結構描述附加至 Word 文件的行為
將結構描述附加至文件層級 Visual Studio Tools for Office 專案中使用的 Word 文件時,不會建立資料物件。不過,將結構描述項目對應至文件時,會建立控制項。控制項的型別取決於您所對應的項目型別,重複項目會產生 XMLNodes 控制項,而非重複項目會產生 XMLNode 控制項。如需詳細資訊,請參閱 XMLNodes 控制項和 XMLNode 控制項。
包括 XML 結構描述之方案的部署
您應建立安裝程式,以部署使用對應至文件之 XML 結構描述的方案。該安裝程式應在使用者電腦上的結構描述程式庫中註冊結構描述。如果您不註冊結構描述,則方案仍會運作,因為 Word 會在使用者開啟文件時,根據文件中的項目產生暫存結構描述。不過,使用者將無法對用於建立專案的結構描述進行驗證,也無法儲存該結構描述。如需安裝程式的詳細資訊,請參閱部署應用程式和元件。
您也可將程式碼加入至專案,以檢查結構描述是否位於程式庫,以及和是否已註冊。如果不是,則可以警告使用者。
' Ensure that the schema is in the library and registered with the document.
Private Function CheckSchema() As Boolean
Const namespaceUri As String = "http://schemas.contoso.com/projects"
Dim namespaceFound As Boolean = False
Dim namespaceRegistered As Boolean = False
Dim n As Word.XMLNamespace
For Each n In Application.XMLNamespaces
If (n.URI = namespaceUri) Then
namespaceFound = True
End If
Next
If Not namespaceFound Then
MessageBox.Show("XML Schema is not in library.")
Return False
End If
Dim r As Word.XMLSchemaReference
For Each r In Me.XMLSchemaReferences
If (r.NamespaceURI = namespaceUri) Then
namespaceRegistered = True
End If
Next
If Not namespaceRegistered Then
MessageBox.Show("XML Schema is not registered for this document.")
Return False
End If
Return True
End Function
// Ensure that the schema is in the library and registered with the document.
private bool CheckSchema()
{
const string namespaceUri = "http://schemas.contoso.com/projects";
bool namespaceFound = false;
bool namespaceRegistered = false;
foreach (Word.XMLNamespace n in Application.XMLNamespaces)
{
if (n.URI == namespaceUri)
{
namespaceFound = true;
}
}
if (!namespaceFound)
{
MessageBox.Show("XML Schema is not in library.");
return false;
}
foreach (Word.XMLSchemaReference r in this.XMLSchemaReferences)
{
if (r.NamespaceURI == namespaceUri)
{
namespaceRegistered = true;
}
}
if (!namespaceRegistered)
{
MessageBox.Show("XML Schema is not registered for this document.");
return false;
}
return true;
}