为何VBA从Excel取数生成的XML文件内容首尾被添加双引号?
批量生成XML文件加引号问题的解决方法
核心判断
写入文件被自动加首尾双引号的问题,和messageitSelf的变量声明类型无关,不需要调整变量的声明类型,问题根源是最初使用的VBA写入方法的固有设计特性。
具体原因
- 你最初脚本中使用的
Write #1, messageitSelf语句,设计目的是将结构化数据写入文件,方便后续通过Input #语句直接读回变量。它的固有行为就是自动给字符串类型的内容包裹双引号、不同写入的变量自动用逗号做分隔,完全不匹配你需要原样输出XML纯文本的需求。 - 更换ADODB.Stream方案后如果仍然出现文件带额外引号的情况,不属于ADODB.Stream本身的逻辑问题,需要排查两个点:
- 确认Excel中B列单元格本身存储的内容是否已经自带首尾双引号,可以在VBA的立即窗口输入
?messageitSelf,打印变量实际获取到的文本,查看是否存在单元格内容本身就带引号的情况。 - 如果运维要求生成UTF-8无BOM的XML文件,ADODB.Stream默认保存UTF-8文件会附带3字节的BOM头,需要做额外处理避免无关字符写入文件。
- 确认Excel中B列单元格本身存储的内容是否已经自带首尾双引号,可以在VBA的立即窗口输入
修正实现
方案1:最小改动(用原生VBA语句)
只需要将原来的Write #1, messageitSelf替换为Print #1, messageitSelf即可,Print方法会原样输出文本内容,不会自动添加额外的包裹引号。
核心写入片段调整为:
Open filePath For Output As #1 Print #1, messageitSelf ' 替换原有Write语句 Close #1
方案2:ADODB.Stream实现UTF-8无BOM写入
如果需要固定输出无BOM的UTF-8编码文件,可参考如下逻辑:
Const adTypeText = 2 Const adTypeBinary = 1 Const adSaveCreateOverWrite = 2 Set objStream = CreateObject("ADODB.Stream") objStream.Charset = "UTF-8" objStream.Type = adTypeText objStream.Open objStream.WriteText messageitSelf ' 处理无BOM:跳过默认生成的3字节UTF-8 BOM头 objStream.Position = 0 Set objBinaryStream = CreateObject("ADODB.Stream") objBinaryStream.Type = adTypeBinary objBinaryStream.Open objStream.Position = 3 objBinaryStream.Write objStream.Read objBinaryStream.SaveToFile filePath, adSaveCreateOverWrite ' 释放资源 objBinaryStream.Close objStream.Close Set objBinaryStream = Nothing Set objStream = Nothing
运行注意事项
- 记得将原脚本中的循环范围
For currentRow = 2 To 11修改为匹配你实际数据的行号范围,比如120行数据就设置为2 To 120。 - 运行脚本前需要提前在当前工作簿的存储路径下创建好名为
xmls的子文件夹,否则会触发路径不存在的报错。
内容的提问来源于stack exchange,提问作者Laurent Morissette
相关产品推荐
相关产品推荐

