ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 22947|回复: 10

怎样才能用EXCEL修改XML文件?

[复制链接]

TA的精华主题

TA的得分主题

发表于 2011-12-14 00:07 | 显示全部楼层 |阅读模式
ZCFZB_20110701_20110930_520103578624536_V10.rar (722 Bytes, 下载次数: 153)
附件是一个XML文件,可以用记事本方便的打开和编辑,因为有大量数据要处理,我想用EXCEL打开并编辑里面的数据,因为EXCEL可以从外部EXCEL工作薄引用数据,这样可以大大节省时间。问题是:用EXCEL编辑完以后应该怎样保存数据而不改变原XML文件的格式?我需要制作几千份不同的这种XML文件(仅里面的数据不同),不知道EXCEL能否实现,请高手帮忙看看。如果有其它批量修改XML文件的方法也请赐教!

TA的精华主题

TA的得分主题

发表于 2011-12-14 21:18 | 显示全部楼层
按txt文件处理即可,处理完毕注意用记事本看一下编码是否为ANSI

TA的精华主题

TA的得分主题

 楼主| 发表于 2011-12-21 18:34 | 显示全部楼层
就不能用EXCEL修改吗?
我要根据一个EXCEL工作薄的信息,生成几千个这样的XML文件啊,如果用文本编辑器那几乎是不可能完成的任务。

TA的精华主题

TA的得分主题

 楼主| 发表于 2011-12-21 18:36 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
请老师们帮帮忙,先谢了

TA的精华主题

TA的得分主题

发表于 2011-12-21 18:44 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 Moneky 于 2011-12-21 18:59 编辑

把你的表格形式和处理结果示例发出来看看吧不太懂xml,看了一下xml文件的结构,是否如下分析:
2011-12-21_185453.jpg 2011-12-21_185902.jpg

给楼主一个方案。用VBA导入xml为工作簿,然后处理后写一个VBA到处成原格式的xml文件。(楼主的xml是其他软件生成的吗?)


TA的精华主题

TA的得分主题

 楼主| 发表于 2011-12-21 19:14 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
是其它软件生成的,请问怎么导出才可以保持原XML编码和格式不变?

TA的精华主题

TA的得分主题

发表于 2011-12-21 19:47 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
smileoa 发表于 2011-12-21 19:14
是其它软件生成的,请问怎么导出才可以保持原XML编码和格式不变?

VBA没有问题,肯定可以

TA的精华主题

TA的得分主题

发表于 2011-12-21 20:30 | 显示全部楼层
1.自定义的xml格式,用excel打开编辑保存后,必定会出现格式错乱
2.可以用adodb.stream读文件,然后编辑,再写回去就行了
3.用domdocument直接操作xml文件

TA的精华主题

TA的得分主题

发表于 2011-12-22 15:56 | 显示全部楼层
本帖最后由 Moneky 于 2011-12-22 15:57 编辑

写了个例子,如果楼主的所有xml都是1楼附件中的格式的话,应该可以顺利导入导出,目前还不能支持在表格中添加列的操作,不过要支持也是很容易的事情了。从来些没有用过xml,现学现卖,参看了http://www.yesky.com/20021016/1635180_2.shtml 的教程。代码没有什么优化,其中一个过程直接搬的教程中现成的代码,谢谢!
  1. Sub testLoad()
  2.     Dim a As New DOMDocument
  3.     Dim sht As Worksheet
  4.     Dim sName As String, k As Long
  5.     a.Load Sheets("xml").[a2].Text
  6.     Dim b As IXMLDOMNode
  7.     Set b = a.SelectSingleNode(".//BODY")
  8.     k = 2
  9.    
  10.     sName = b.ChildNodes.Item(0).BaseName '取表名
  11.     Set sht = ThisWorkbook.Worksheets.Add '添加表
  12.     sht.Name = sName '改表名
  13.     Sheets("xml").[a3] = sName '保存表名,后面再保存xml时需要用到
  14.    
  15.     '写表头
  16.     sht.Cells(1, 1) = b.ChildNodes.Item(0).ChildNodes.Item(0).ChildNodes.Item(0).BaseName
  17.     sht.Cells(1, 2) = b.ChildNodes.Item(0).ChildNodes.Item(0).ChildNodes.Item(1).BaseName
  18.     sht.Cells(1, 3) = b.ChildNodes.Item(0).ChildNodes.Item(0).ChildNodes.Item(2).BaseName
  19.     '加载数据
  20.     For i = 0 To b.FirstChild.ChildNodes.Length - 1
  21.         sht.Cells(k + i, 1) = b.ChildNodes.Item(0).ChildNodes.Item(i).ChildNodes.Item(0).nodeTypedValue
  22.         sht.Cells(k + i, 2) = b.ChildNodes.Item(0).ChildNodes.Item(i).ChildNodes.Item(1).nodeTypedValue
  23.         sht.Cells(k + i, 3) = b.ChildNodes.Item(0).ChildNodes.Item(i).ChildNodes.Item(2).nodeTypedValue
  24.     Next
  25.    
  26.     '重复上面的事情
  27.     sName = b.ChildNodes(2).BaseName
  28.     Set sht = ThisWorkbook.Worksheets.Add
  29.     sht.Name = sName
  30.     Sheets("xml").[a4] = sName
  31.    
  32.     sht.Cells(1, 1) = b.ChildNodes.Item(2).ChildNodes.Item(0).ChildNodes.Item(0).BaseName
  33.     sht.Cells(1, 2) = b.ChildNodes.Item(2).ChildNodes.Item(0).ChildNodes.Item(1).BaseName
  34.     sht.Cells(1, 3) = b.ChildNodes.Item(2).ChildNodes.Item(0).ChildNodes.Item(2).BaseName
  35.     For i = 0 To b.ChildNodes(2).ChildNodes.Length - 1
  36.         sht.Cells(k + i, 1) = b.ChildNodes.Item(2).ChildNodes.Item(i).ChildNodes.Item(0).nodeTypedValue
  37.         sht.Cells(k + i, 2) = b.ChildNodes.Item(2).ChildNodes.Item(i).ChildNodes.Item(1).nodeTypedValue
  38.         sht.Cells(k + i, 3) = b.ChildNodes.Item(2).ChildNodes.Item(i).ChildNodes.Item(2).nodeTypedValue
  39.     Next
  40. End Sub
  41. Sub CreateNode(ByVal indent As Integer, ByVal parent As IXMLDOMNode, ByVal node_name As String, ByVal node_value As String)
  42. Dim new_node As IXMLDOMNode
  43. ' Indent.
  44. parent.appendChild parent.OwnerDocument.createTextNode(String(indent, Chr(9)))
  45. ' Create the new node.
  46. Set new_node = parent.OwnerDocument.createElement(node_name)
  47. ' Set the node's text value.
  48. new_node.Text = node_value
  49. ' Add the node to the parent.
  50. parent.appendChild new_node
  51. ' Add a new line.
  52. parent.appendChild parent.OwnerDocument.createTextNode(vbCrLf)
  53. End Sub
  54. Sub testSave()
  55.     Dim a As New DOMDocument
  56.     Dim b As IXMLDOMNode
  57.     Dim c As IXMLDOMNode
  58.     Dim sht As Worksheet
  59.    
  60.     a.Load Sheets("xml").[a2].Text '载入xml数据
  61.     Set b = a.SelectSingleNode(".//BODY") '获取BODY节点数据
  62.    
  63.     For Each c In b.ChildNodes(0).ChildNodes '移除原有的所有Node
  64.         b.ChildNodes(0).RemoveChild c
  65.     Next
  66.     For Each c In b.ChildNodes(2).ChildNodes
  67.         b.ChildNodes(2).RemoveChild c
  68.     Next
  69.    
  70.     Set sht = Sheets(Sheets("xml").[a3].Text)
  71.     For i = 2 To sht.[a65536].End(xlUp).Row
  72.         Set c = a.createElement("ITEM")
  73.         c.appendChild a.createTextNode(vbCrLf) '添加回车换行符
  74.         b.ChildNodes(0).appendChild c
  75.         CreateNode 4, c, sht.[a1].Text, sht.Cells(i, 1)  '添加数据,缩进4个tab
  76.         CreateNode 4, c, sht.[b1].Text, sht.Cells(i, 2)
  77.         CreateNode 4, c, sht.[c1].Text, sht.Cells(i, 3)
  78.         b.ChildNodes(0).LastChild.appendChild a.createTextNode(String(3, Chr(9))) '添加3个tab,缩进
  79.         b.ChildNodes(0).appendChild a.createTextNode(vbCrLf & String(3, Chr(9))) '换行与缩进3个tab,为下一次添加作准备
  80.     Next
  81.     Set c = a.SelectSingleNode(".//" & Sheets("xml").[a3].Text) '修改表格的COUNT属性
  82.     c.Attributes(0).Text = CStr(i - 2)
  83.    
  84.     Set sht = Sheets(Sheets("xml").[a4].Text)
  85.     For i = 2 To sht.[a65536].End(xlUp).Row
  86.         Set c = a.createElement("ITEM")
  87.         c.appendChild a.createTextNode(vbCrLf)
  88.         b.ChildNodes(2).appendChild c
  89.         CreateNode 4, c, sht.[a1].Text, sht.Cells(i, 1)
  90.         CreateNode 4, c, sht.[b1].Text, sht.Cells(i, 2)
  91.         CreateNode 4, c, sht.[c1].Text, sht.Cells(i, 3)
  92.         b.ChildNodes(2).LastChild.appendChild a.createTextNode(String(3, Chr(9)))
  93.         b.ChildNodes(2).appendChild a.createTextNode(vbCrLf & String(3, Chr(9)))
  94.     Next
  95.     Set c = a.SelectSingleNode(".//" & Sheets("xml").[a4].Text) '修改表格的COUNT属性
  96.     c.Attributes(0).Text = CStr(i - 2)

  97.     Set c = a.SelectSingleNode(".//TBRQ") '修改文件修改日期
  98.     c.Text = Format(Date, "yyyy-mm-dd")
  99.    
  100.     a.Save Sheets("xml").[a5].Text '保存xml文件
  101. End Sub
复制代码
代码需要引用  Microsfot XML,3.0

xml.rar

18.15 KB, 下载次数: 396

xml读写

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2014-6-14 13:57 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-5-27 01:30 , Processed in 0.040874 second(s), 13 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表