在Microsoft Office System中使用ADO.NET數據集(五)
2024-07-10 13:03:17
供稿:網友
將dataset作為xml導入到excel工作表
microsoft office excel 2003為xml提供了非常強大的支持,它允許你將工作簿保存為xml或者將xml數據源導入到工作簿。由于dataset天生就序列化為xml,所以你可以非常容易的將它的數據導入到excel中。導入步驟需要xml架構,這樣excel才能夠將數據映射到工作簿的適當單元格,而dataset自動提供了這個功能。事實上,這就是本文前面描述的getdataset方法的結尾處所添加的代碼的功能,這些代碼將dataset對象的數據和架構寫到磁盤上。
if bsaveschema then
'places the file in this app's bin directory
ds.writexmlschema("customers.xsd")
ds.writexml("customers.xml")
end if
這段代碼在應用程序的bin文件夾創建xml和架構文件。圖5顯示xml文件的結果。
圖5:使用dataset的writexml方法生成的customers.xml文件
圖6顯示xml架構,也是在internet explorer顯示。
圖6:使用dataset的writexmlschema方法生成的customers. xsd文件
這項技術也可以用在excel中的一個新特性上,這個對象叫做listobject,它是一個列表結構的新類型,本質上它提供數據的完整視圖。結果列表顯示在圖7中。你可以單擊標題行的下拉列表對整個列表數據進行篩選和排序。圖中的xml源面板顯示了該數據的架構,你可以通過修改該架構來決定列表中可以包含那些數據。
圖7 使用xml架構映射以編程方式導入xml
buildxmlmap子過程執行與buildworksheet相似的功能,但是它使用xml導入和映射來將數據從dataset移動到excel中。該過程接收一個dataset作為其唯一參數,然后實例化excel、添加一個工作簿,同事執行其他ui(用戶界面)任務。例子中的工作簿名為northwind customers。當然,你可以將它替換為你自己的工作簿的名字。
private sub buildxmlmap(byval ds as dataset)
'create an instance of excel 2003, add a workbook,
'and let the user know what's happening
dim xl as new excel.application
xl.workbooks.add()
xl.activesheet.name = "northwind customers"
xl.visible = true
xl.range("a1").value = "loading the dataset...."
該過程直接從dataset對象加載xml數據,但是沒有任何方法可以直接從內存中讀取其架構。因此這段代碼使用.net framework path 對象的getfullpath方法為.xsd架構文件獲取了一個完整路徑和文件名。
try
dim smap as string = system.io.path.getfullpath("customers.xsd")
然后,代碼添加xml映射架構到當前活動工作簿的xmlmaps集合。add方法的第一個參數是將要被映射的文件的位置,第二個參數是存儲于集合中的這個映射的名字。代碼設置了該映射的名字,以便在后面引用這個映射。
'add the map to the active workbook
'you can only add a map from a disk file.
xl.activeworkbook.xmlmaps.add(smap, _
"northwindcustomerorders").name _
= "northwindcustomerorders_map"
代碼得到這個新建的xml映射的引用,將它保存為映射變量,然后添加一個listobject到當前活動工作表。你所選擇的列表面板列,本示例中是列a到j,包括標題行下面的許多行都是用來容納數據的。
'specify the cells where the mapped data should go upon import
dim map as excel.xmlmap = _
xl.activeworkbook.xmlmaps("northwindcustomerorders_map")
xl.range("a1", "j1").select()
dim list as excel.listobject = _
ctype(xl.activesheet, excel.worksheet).listobjects.add
下一步是映射xml數據的特定元素到列表的每個列。setvalue方法持有所使用的映射的引用,并使用一個xpath表達式來指示哪些元素保存在哪一列。下面的代碼設置列a容納customerid元素,然后設置該列標題為“customer id”。你可以設置以相同方式設置其他列的內容和標題。
list.listcolumns(1).xpath.setvalue(map, _
"/northwindcustomerorders/customers/customerid")
xl.range("a1").value = "customer id"
現在要設置listobject的結構,因為下一步將導入xml數據。import方法讀取磁盤文件,并且這里使用importxml方法直接從dataset 的getxml方法中讀取xml,并未將xml數據保存到磁盤上。該過程在最后打開“xml源”任務面板,方便你查看。
'import the xml data
xl.activeworkbook.xmlmaps("northwindcustomerorders_map"). _
importxml(ds.getxml)
'open the xml source task pane
xl.displayxmlsourcepane(map)
catch ex as exception
end try
end sub