如何用xml生成excel报表?

johnpanq 2004-04-19 05:31:31
报表格式是固定的,boss说要用xml来做?
因为第一次接触报表,所以想请教一下思路。
重点是如何用xml来做!

...全文
563 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
ukyoxh 2004-04-20
  • 打赏
  • 举报
回复
关注

我只知道使用rs来读取xml,然后制作成excel!!

ukyoxh 2004-04-20
  • 打赏
  • 举报
回复
SaveValuesIndented 程序

  虽然每个人都化了很大的精力去处理xml文档,使他们看上更容易些,但xml工具一般都忽略了那些使xml文档结构明显的空白和缩进,xml解析器也同样忽略缩进和空白。

  不幸的是我们例子也同样忽略了这些缩进和空白,SaveValues创建了一个象下面那样的xml文件,所有的代码都在同一行中。

<Values><FirstName>Rod</FirstName><LastName>Stephens</LastNa
me><Street>1234 Programmer Place</Street><City>Bugsville</Ci
ty><State>CO</State><Zip>80276</Zip></Values>

  VB.NET中包括了文本写入类,可以XML文档规定格式。但MSXML重没有这种功能,所以如果需要以一种清晰的格式保存XML文件,只能另行添加它的格式。

  List2列出了程序SaveValuesIndented使用的代码,SaveValues子程序与上面例子中讲的几乎完全相同,但他在创建value节点后同时给XML文档创建了一个<value>标记的新行。

  然后SaveValues 调用CreateNode创建一个新的数据节点,但在这里它传递给CreateNode一个新的参数,这个参数表示这个新节点的缩进方式。

CreateNode
' Save the current values.
Private Sub SaveValues()
Dim xml_document As DOMDocument
Dim values_node As IXMLDOMNode

' Create the XML document.
Set xml_document = New DOMDocument

' Create the Values section node.
Set values_node = xml_document.createElement("Values")

' Add a new line.
values_node.appendChild xml_document.createTextNode(vbCrLf)

' Add the Values section node to the document.
xml_document.appendChild values_node

' Create nodes for the values inside the
' Values section node.
CreateNode 4, values_node, "FirstName", txtFirstName.Text
CreateNode 4, values_node, "LastName", txtLastName.Text
CreateNode 4, values_node, "Street", txtStreet.Text
CreateNode 4, values_node, "City", txtCity.Text
CreateNode 4, values_node, "State", txtState.Text
CreateNode 4, values_node, "Zip", txtZip.Text

' Save the XML document.
xml_document.save m_AppPath & "Values.xml"
End Sub

' Add a new node to the indicated parent node.
Private Sub CreateNode(ByVal indent As Integer, _
ByVal parent As IXMLDOMNode, ByVal node_name As String, _
ByVal node_value As String)
Dim new_node As IXMLDOMNode

' Indent.
parent.appendChild _
parent.ownerDocument.createTextNode(Space$(indent))

' Create the new node.
Set new_node = parent.ownerDocument.createElement(node_name)

' Set the node's text value.
new_node.Text = node_value

' Add the node to the parent.
parent.appendChild new_node

' Add a new line.
parent.appendChild parent.ownerDocument.createTextNode(vbCrLf)
End Sub


ukyoxh 2004-04-20
  • 打赏
  • 举报
回复
其它方式:

DOMDocument 类

  文档对象模型(DOM)使用了一系列相应的对象描述了XML文档的等级状态,DOMDocument类是一个描绘XML文档的DOM结构的MSXML类。

  DOMDocument类仅仅提供了很少的几个有用的属性和方法。Load方法载入一个xml文件,loadxml方法将字符串作为xml数据添加到对象中。例如,下面的代码就将一个小的xml文件添加到名为xml_document的文档中。

Dim xml_document As New DOMDocument

xml_document.loadXML _
"<Person>" & vbCrLf & _
" <FirstName>Rod</FirstName>" & vbCrLf & _
" <LastName>Stephens</LastName>" & vbCrLf & _
"</Person>"


  DOMDocument的xml属性返回文档的xml描述,可以显示这些返回值看看这些文档究竟是什么样子,也可以将它存储为一个文件,但这完全不必要,因为DOMDocument对象的save方法已经自动将他们存储了。

  DOMDocument对象的documentElement属性表示文档数据的根结点,通常情况下操作XML文档都从这里开始。

  DOMDocument提供了几种创建新节点的方法。CreateElement方法为文档创建一个新的元素节点,其他创建节点的方法有createAttribute, createProcessingInstruction, 和 createTextNode,在这里就不一一介绍了。

  IXMLDOMNode类

  IXMLDOMNode类描述了一个节点,该类提供了一系列用于搜索和操纵XML文档的属性和方法。
selectSingleNode 方法用于搜索指定节点的后代,用于搜索指定节点路径的语言称为XPATH,XPATH非常棘手,本文就不详细说明其规范了。下面我们将介绍两个对搜索子节点有特别有用并且简单的方法。

  在给selectsingleNode方法中输入子节点的名字,该方法将在节点的子节点进行精确匹配搜索。如果在输入的字符串前面加上".//",那么将搜索节点的全部后代。

' Search for a child node named "LastName."
Set last_name_node = address_node.selectSingleNode("LastName")

' Search for any descendant named "LastName."
Set last_name_node = address_node.selectSingleNode(".//LastName")

  下面列出了IXMLDOMNode对象的部分非常有用的属性:

   attributes.节点属性集合

   nodeName.节点的标记名

   nodeTypeString.节点的类型

   ownerDocument.返回DOMDocument对象包含的节点

   text.表示节点包含的文本内容。如果该节点包含其他节点,那么text代表了所有节点的文本内容的组合。

   xml.给出了节点的xml内容,例如:"<FirstName>Rod</FirstName>".

  ChildNodes集合包含了节点的子节点。要给节点增加一个子节点,首先必须给使用DOMDocument对象的节点创建方法,然后将这个新建的节点加入到父节点的childNodes集合中。下面的代码展示了创建一个新的子节点的子程序,并使用父节点的appendChild方法将其加入到父节点中:

' Add a new node to the indicated parent node.
Private Sub CreateNode(ByVal indent As Integer, _
ByVal parent As IXMLDOMNode, ByVal node_name As String, _
ByVal node_value As String)
Dim new_node As IXMLDOMNode

' Create the new node.
Set new_node = parent.ownerDocument.createElement(node_name)

' Set the node's text value.
new_node.Text = node_value

' Add the node to the parent.
parent.appendChild new_node
End Sub
SaveValues 程序

  现在我们可以使用XML创建一个简单的程序(如图1),其值存储到XML文件中,在程序开始运行时,程序从VALUE.XML文件中加载数据,在程序运行结束时,将程序中的现行值存入VALUE.XML文件中。



  下面的代码是显示了VALUE.XML文件的结构:

<Values>
 <FirstName>Rod</FirstName>
 <LastName>Stephens</LastName>
 <Street>1234 Programmer Place</Street>
 <City>Bugsville</City>
 <State>CO</State>
 <Zip>80276</Zip>
</Values>

  List1显示了怎样编写SaveValues,当载入表单时,form_load事件触发LoadValues子程序。
LoadValues创建了一个名为xml_document的DOMDocument对象,然后载入xml文件,使用selectSingleNode方法查找名为values的节点,然后使用GetNodeValue方法获得从value节点后代中得到的值。

  GetNodeValue使用value节点的selectSingleNode方法寻找目标节点,如果节点不存在函数将返回一个缺省值,如果找到这个节点GetNodeValue将返回该节点的text值。对于value.xml文件中的数据节点,text仅仅是包含在节点中的文本内容。

  当窗体卸载时触发form_unload事件,unload事件调用SaveValues子程序。程序创建一个新的DOMDocument对象,该对象创建一个新的名为value的节点,然后用文档的appendChild方法将节点添加到文档中。

  在创建所有新的节点后,SaveValues调用DOMDocument's save方法存储新的xml文件。

  注意这个新的文件已经覆盖了旧文件,使用DOMDocument对象无法部分改变XML文件,可以加载XML文件,然后修改其中一部分,然后保存文件,但原文件将被完全覆盖。这是一个小的缺陷,但在这时可以使用其它程序进行修改。

  List1的最后一部分是CreateNode子程序,CreateNode 为父节点创建一个新节点并同时给这个节点赋值。在这个子程序中首先引用一个DOMDocument对象,然后使用该对象的createElement方法创建一个新的节点。

  createNode方法设置节点的text属性,然后将节点作为子节点添加到父节点中。

List1:

Option Explicit

Private m_AppPath As String

Private Sub Form_Load()
' Get the application's startup path.
m_AppPath = App.Path
If Right$(m_AppPath, 1) <> "\" Then m_AppPath = m_AppPath & "\"

' Load the values.
LoadValues
End Sub

Private Sub Form_Unload(Cancel As Integer)
' Save the current values.
SaveValues
End Sub

' Load saved values from XML.
Private Sub LoadValues()
Dim xml_document As DOMDocument
Dim values_node As IXMLDOMNode

' Load the document.
Set xml_document = New DOMDocument
xml_document.Load m_AppPath & "Values.xml"

' If the file doesn't exist, then
' xml_document.documentElement is Nothing.
If xml_document.documentElement Is Nothing Then
' The file doesn't exist. Do nothing.
Exit Sub
End If

' Find the Values section.
Set values_node = xml_document.selectSingleNode("Values")

' Read the saved values.
txtFirstName.Text = GetNodeValue(values_node, "FirstName", "???")
txtLastName.Text = GetNodeValue(values_node, "LastName", "???")
txtStreet.Text = GetNodeValue(values_node, "Street", "???")
txtCity.Text = GetNodeValue(values_node, "City", "???")
txtState.Text = GetNodeValue(values_node, "State", "???")
txtZip.Text = GetNodeValue(values_node, "Zip", "???")
End Sub

' Return the node's value.
Private Function GetNodeValue(ByVal start_at_node As IXMLDOMNode, _
ByVal node_name As String, _
Optional ByVal default_value As String = "") As String
Dim value_node As IXMLDOMNode

Set value_node = start_at_node.selectSingleNode(".//" & node_name)
If value_node Is Nothing Then
GetNodeValue = default_value
Else
GetNodeValue = value_node.Text
End If
End Function

' Save the current values.
Private Sub SaveValues()
Dim xml_document As DOMDocument
Dim values_node As IXMLDOMNode

' Create the XML document.
Set xml_document = New DOMDocument

' Create the Values section node.
Set values_node = xml_document.createElement("Values")

' Add the Values section node to the document.
xml_document.appendChild values_node

' Create nodes for the values inside the
' Values section node.
CreateNode values_node, "FirstName", txtFirstName.Text
CreateNode values_node, "LastName", txtLastName.Text
CreateNode values_node, "Street", txtStreet.Text
CreateNode values_node, "City", txtCity.Text
CreateNode values_node, "State", txtState.Text
CreateNode values_node, "Zip", txtZip.Text

' Save the XML document.
xml_document.save m_AppPath & "Values.xml"
End Sub

' Add a new node to the indicated parent node.
Private Sub CreateNode(ByVal parent As IXMLDOMNode, _
ByVal node_name As String, ByVal node_value As String)
Dim new_node As IXMLDOMNode

' Create the new node.
Set new_node = parent.ownerDocument.createElement(node_name)

' Set the node's text value.
new_node.Text = node_value

' Add the node to the parent.
parent.appendChild new_node
End Sub
ukyoxh 2004-04-20
  • 打赏
  • 举报
回复
rs可以直接保存成xml文件,然后进行读取后操作
Save 方法 (ADO Recordset)


将 Recordset 保存(持久)在文件中。

语法

recordset.Save FileName, PersistFormat

参数

FileName 可选。文件的完整路径名,用于保存 Recordset。

PersistFormat 可选。PersistFormatEnum 值,指定保存 Recordset 所使用的格式。可以是如下的某个常量:

常量 说明
adPersistADTG (默认)使用专用的“Advanced Data Tablegram”格式保存。
adPersistXML 使用 XML 格式保存。


说明

只能对打开的 Recordset 调用 Save 方法。随后使用 Open 方法可由 FileName 恢复 Recordset。

如果 Filter 属性影响 Recordset,将只保存经过筛选的行。如果 Recordset 是分级结构的,那么将保存当前子 Recordset 和它的子 Recordset,但不保存上一级 Recordset。

在第一次保存 Recordset 时指定 FileName。如果随后调用 Save 时,应忽略 FileName,否则将产生运行时错误。如果随后使用新的 FileName 调用 Save,那么 Recordset 将保存到新的文件中,但新文件和原始文件都是打开的。

Save 不关闭 Recordset 或 FileName,从而可以继续使用 Recordset 并保存最新的更改。在 Recordset 关闭之前 FileName 将保持打开,在这段时间其它应用程序可以读取但不能写入 FileName。

出于安全的原因,对由 Microsoft Internet Explorer 执行的脚本,Save 方法仅允许使用低的和自定义的安全设置。有关安全问题的详细解释,请参阅 在 http://www.microsoft.com/data/techmat.htm 上的白皮书标题“Security Issues in the Microsoft Internet Explorer”。

如果正在进行异步 Recordset 获取、执行或更新操作时调用 Save 方法,则 Save 将进入等待状态,直到异步操作完成。

在 Save 方法完成后,当前行位置将成为 Recordset 的首行。

要得到最佳结果,应使用 Save 将 CursorLocation 属性设置为 adUseClient。如果您的提供者不支持用于保存 Recordset 对象的所需功能,则客户端游标将提供该功能。




Recordset 持久性


使用记录集持久性,可以将 Recordset 数据和元数据保存为文件。随后,使用持久文件来重新建立 Recordset 对象。持久文件可以保存在本地驱动器、网络服务器上或者作为 URL 保存在 Web 站点上。

另外,GetString 方法将 Recordset 对象转换成表单,在表单中列和行使用指定的字符分界。

详细资料

Microsoft OLE DB Persistence Provider 支持使用 Recordset 对象 Save 方法将 Recordset 对象保存在文件中。随后,使用 Recordset 对象的 Open、或 Connection 对象的 Execute 方法可恢复持久文件。

Recordset 对象被转换为能被保存在文件中的表单。Recordset 对象可以按所拥有的高级数据图表 (ADTG) 格式保存,或者按打开的可扩展标记语言 (XML) 格式保存。

挂起更改保存在持久文件中。因此,可以发布查询返回 Recordset 对象、编辑记录集、保存该记录集和挂起变化、以后恢复该记录集、然后使用保存的挂起变化更新数据源。

用法

保存记录集:

Dim rs as New ADODB.Recordset
rs.Save "c:\yourFile.adtg", adPersistADTG

使用 Recordset.Open 打开持久文件:

dim rs as New ADODB.Recordset
rs.Open "c:\yourFile.adtg", "Provider=MSPersist",,,adCmdFile

可选地,如果 Recordset 没有活动的连接,则都可以接受所有的默认值和简单的代码:

dim rs as New ADODB.Recordset
rs.Open "c:\yourFile.adtg"

使用 Connection.Execute 打开持久文件:

dim conn as New ADODB.Connection
dim rs as New ADODB.Recordset
conn.Open "Provider=MSPersist"
set rs = conn.execute("c:\yourFile.adtg")

使用 RDS.DataControl 打开持久文件:

在这种情况下,没有设置 Server 属性。

Dim dc as New RDS.DataControl
dc.Connection = "Provider=MSPersist"
dc.SQL = "c:\yourFile.adtg"
dc.Refresh



johnpanq 2004-04-20
  • 打赏
  • 举报
回复
好像只有excel2002以上才能直接读取xml
johnpanq 2004-04-20
  • 打赏
  • 举报
回复
楼上的朋友能详细说一下用rs来读取xml,然后制作成excel吗?

EisenHammer 2004-04-19
  • 打赏
  • 举报
回复
用Ole控件插入已经设定格式的xml文件(这样搞的报表数据量很大的时候会很慢!),或者嵌入Excel窗口!

查看MSDN中Office部分。

1,216

社区成员

发帖
与我相关
我的任务
社区描述
VB 数据库(包含打印,安装,报表)
社区管理员
  • 数据库(包含打印,安装,报表)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧