当前位置: 首页 > 知识库问答 >
问题:

通过VBA将excel行导出到单个XML文件

朱高丽
2023-03-14

我遵循这个答案(将电子表格的行转换为单独的XML文件),但是我收到一个错误,告诉我没有定义对象。我很抱歉,因为我是VBA新手。

我的表格遵循代码中显示的顺序,例如。

  • 第1列{例如A}=文件名字符串
  • 第677列{e.g.ZA}=XML文件第一行的字符串
  • 第683列{e.g.ZG}=视频文件的标题{此列和以下所有列已经有了相应的标记(例如。

产生错误的代码是:

    Sub testXLStoXML()

sTemplateXML = _
        "<xml_version>" + vbNewLine + _
        "<xml_movie>" + vbNewLine + _
        "<plot>" + vbNewLine + _
        "<xml_outline>" + vbNewLine + _
        "<xml_lockdata>" + vbNewLine + _
        "<dateadded>" + vbNewLine + _
        "<title>" + vbNewLine + _
        "<rating>" + vbNewLine + _
        "<year>" + vbNewLine + _
        "<sorttile>" + vbNewLine + _
        "<mpaa>" + vbNewLine + _
        "<premiered>" + vbNewLine + _
        "<releasedate>" + vbNewLine + _
        "<runtime>" + vbNewLine + _
        "<studio>" + vbNewLine + _
        "<1>" + vbNewLine + _
        "<2>" + vbNewLine + _
        "<3>" + vbNewLine + _
        "<folder>" + vbNewLine + _
        "</data>" + vbNewLine

 Set doc = CreateObject("MSXML2.DOMDocument")
 doc.async = False
 doc.validateOnParse = False
 doc.resolveExternals = False

 With ActiveWorkbook.Worksheets(1)
  lLastRow = .UsedRange.Rows.Count

  For lRow = 2 To lLastRow
   sFile = .Cells(lRow, 2).Value
   sXml_version = .Cells(lRow, 677).Value
   sXml_movie = .Cells(lRow, 678).Value
   sPlot = .Cells(lRow, 679).Value
   sXml_outline = .Cells(lRow, 680).Value
   sXml_lockdata = .Cells(lRow, 681).Value
   sDateadded = .Cells(lRow, 682).Value
   sTitle = .Cells(lRow, 683).Value
   sRating = .Cells(lRow, 684).Value
   sYear = .Cells(lRow, 685).Value
   sSorttile = .Cells(lRow, 686).Value
   sMpaa = .Cells(lRow, 687).Value
   sPremiered = .Cells(lRow, 688).Value
   sReleasedate = .Cells(lRow, 689).Value
   sRuntime = .Cells(lRow, 690).Value
   sStudio = .Cells(lRow, 691).Value
   s1 = .Cells(lRow, 692).Value
   s2 = .Cells(lRow, 693).Value
   s3 = .Cells(lRow, 694).Value
   sFolder = .Cells(lRow, 800).Value
   doc.LoadXML sTemplateXML
   doc.getElementsByTagName("xml_version")(0).appendChild doc.createTextNode(sXml_version)
   doc.getElementsByTagName("xml_movie")(0).appendChild doc.createTextNode(sXml_movie)
   doc.getElementsByTagName("plot")(0).appendChild doc.createTextNode(sPlot)
   doc.getElementsByTagName("xml_outline")(0).appendChild doc.createTextNode(sXml_outline)
   doc.getElementsByTagName("xml_lockdata")(0).appendChild doc.createTextNode(sXml_lockdata)
   doc.getElementsByTagName("dateadded")(0).appendChild doc.createTextNode(sDateadded)
   doc.getElementsByTagName("title")(0).appendChild doc.createTextNode(sTitle)
   doc.getElementsByTagName("rating")(0).appendChild doc.createTextNode(sRating)
   doc.getElementsByTagName("year")(0).appendChild doc.createTextNode(sYear)
   doc.getElementsByTagName("sorttile")(0).appendChild doc.createTextNode(sSorttile)
   doc.getElementsByTagName("mpaa")(0).appendChild doc.createTextNode(sMpaa)
   doc.getElementsByTagName("premiered")(0).appendChild doc.createTextNode(sPremiered)
   doc.getElementsByTagName("releasedate")(0).appendChild doc.createTextNode(sReleasedate)
   doc.getElementsByTagName("runtime")(0).appendChild doc.createTextNode(sRuntime)
   doc.getElementsByTagName("studio")(0).appendChild doc.createTextNode(sStudio)
   doc.getElementsByTagName("1")(0).appendChild doc.createTextNode(s1)
   doc.getElementsByTagName("2")(0).appendChild doc.createTextNode(s2)
   doc.getElementsByTagName("3")(0).appendChild doc.createTextNode(s3)
   doc.getElementsByTagName("folder")(0).appendChild doc.createTextNode(sFolder)
   doc.Save sFile
  Next

 End With

End Sub

突出显示的错误是“doc.getElementsByTagName(“xml\u版本”)(0)。appendChild doc.createTextNode(sXml\u版本)”

虽然这可能只是第一个顺序。

我想做的是-这是针对每一个不为null的行

  • 创建XML/文本文件

最后3个是斜体的,因为我还没有想到要这样做,因为它不在示例中。我甚至不知道在代码中把文件夹值放在哪里,例如,它是否可以像我所做的那样与其他列一起列出。我也不知道我是否需要模板中的“/数据”。

澄清一下,这是为了自动生成NFO文件,以便媒体系统读取为元数据。我有很多面向家庭的视频文件,所以没有元数据网站来获取数据。

编辑:

更新的代码-此代码有效!

Sub Export()

sTemplateXML = _
        "<data>" + vbNewLine + _
        "   <_version/>" + vbNewLine + _
        "   <_movie/>" + vbNewLine + _
        "   <plot/>" + vbNewLine + _
        "   <_outline/>" + vbNewLine + _
        "   <_lockdata/>" + vbNewLine + _
        "   <dateadded/>" + vbNewLine + _
        "   <title/>" + vbNewLine + _
        "   <rating/>" + vbNewLine + _
        "   <year/>" + vbNewLine + _
        "   <sorttile/>" + vbNewLine + _
        "   <mpaa/>" + vbNewLine + _
        "   <premiered/>" + vbNewLine + _
        "   <releasedate/>" + vbNewLine + _
        "   <runtime/>" + vbNewLine + _
        "   <studio/>" + vbNewLine + _
        "   <_1/>" + vbNewLine + _
        "   <_2/>" + vbNewLine + _
        "   <_3/>" + vbNewLine + _
        "</data>" + vbNewLine


 Set doc = CreateObject("MSXML2.DOMDocument")
 doc.async = False
 doc.validateOnParse = False
 doc.resolveExternals = False

With Sheets("Sheet3")
  lLastRow = .UsedRange.Rows.Count

 For lRow = 3 To lLastRow
   sFile = .Cells(lRow, 2).Value
   s_version = .Cells(lRow, 677).Value
   s_movie = .Cells(lRow, 678).Value
   sPlot = .Cells(lRow, 679).Value
   s_outline = .Cells(lRow, 680).Value
   s_lockdata = .Cells(lRow, 681).Value
   sDateadded = .Cells(lRow, 682).Value
   sTitle = .Cells(lRow, 683).Value
   sRating = .Cells(lRow, 684).Value
   sYear = .Cells(lRow, 685).Value
   sSorttile = .Cells(lRow, 686).Value
   sMpaa = .Cells(lRow, 687).Value
   sPremiered = .Cells(lRow, 688).Value
   sReleasedate = .Cells(lRow, 689).Value
   sRuntime = .Cells(lRow, 690).Value
   sStudio = .Cells(lRow, 691).Value
   sFolder = .Cells(lRow, 3).Value
   s_1 = .Cells(lRow, 692).Value
   s_2 = .Cells(lRow, 693).Value
   s_3 = .Cells(lRow, 694).Value
   
   doc.LoadXML sTemplateXML
   doc.getElementsByTagName("_version")(0).appendChild doc.createTextNode(s_version)
   doc.getElementsByTagName("_movie")(0).appendChild doc.createTextNode(s_movie)
   doc.getElementsByTagName("plot")(0).appendChild doc.createTextNode(sPlot)
   doc.getElementsByTagName("_outline")(0).appendChild doc.createTextNode(s_outline)
   doc.getElementsByTagName("_lockdata")(0).appendChild doc.createTextNode(s_lockdata)
   doc.getElementsByTagName("dateadded")(0).appendChild doc.createTextNode(sDateadded)
   doc.getElementsByTagName("title")(0).appendChild doc.createTextNode(sTitle)
   doc.getElementsByTagName("rating")(0).appendChild doc.createTextNode(sRating)
   doc.getElementsByTagName("year")(0).appendChild doc.createTextNode(sYear)
   doc.getElementsByTagName("sorttile")(0).appendChild doc.createTextNode(sSorttile)
   doc.getElementsByTagName("mpaa")(0).appendChild doc.createTextNode(sMpaa)
   doc.getElementsByTagName("premiered")(0).appendChild doc.createTextNode(sPremiered)
   doc.getElementsByTagName("releasedate")(0).appendChild doc.createTextNode(sReleasedate)
   doc.getElementsByTagName("runtime")(0).appendChild doc.createTextNode(sRuntime)
   doc.getElementsByTagName("studio")(0).appendChild doc.createTextNode(sStudio)
   doc.getElementsByTagName("_1")(0).appendChild doc.createTextNode(s_1)
   doc.getElementsByTagName("_2")(0).appendChild doc.createTextNode(s_2)
   doc.getElementsByTagName("_3")(0).appendChild doc.createTextNode(s_3)
   doc.Save sFolder & sFile & ".NFO"
   Next
   
   End With
 
End Sub

我不确定最后一行,但我收到和错误只有doc.save,我已经尝试了每一个组合(例如"doc.savesFile","doc.savesFile

共有1个答案

阎晗日
2023-03-14

从技术上讲,您应该在加载XML时收到一个错误(除非它返回一个空的文档),因为您的模板XML字符串由于各种原因格式不正确:

>

  • 没有正确的root。您关闭

    并非所有节点都关闭。尝试添加自动关闭标记,以便以后可以在其中附加文本节点。

    根据XML规范规则,节点名称不能以数字开头,也不能以XML关键字开头。

    [定义:名称是具有一组受限初始字符的NmToker。]不允许的名称初始字符包括数字、变音符号、句号和连字符。

    以字符串“xml”开头的名称,或以任何匹配的字符串(('X’|'X’)('M’|'M’)('L’|'L’)开头的名称,保留用于本规范或本规范未来版本中的标准化。

    考虑以下调整,对禁止的节点名称使用下划线开头:

    sTemplateXML = _
            "<data>" + vbNewLine + _
            "   <_xml_version/>" + vbNewLine + _
            "   <_xml_movie/>" + vbNewLine + _
            "   <plot/>" + vbNewLine + _
            "   <xml_outline/>" + vbNewLine + _
            "   <xml_lockdata/>" + vbNewLine + _
            "   <dateadded/>" + vbNewLine + _
            "   <title/>" + vbNewLine + _
            "   <rating/>" + vbNewLine + _
            "   <year/>" + vbNewLine + _
            "   <sorttile/>" + vbNewLine + _
            "   <mpaa/>" + vbNewLine + _
            "   <premiered/>" + vbNewLine + _
            "   <releasedate/>" + vbNewLine + _
            "   <runtime/>" + vbNewLine + _
            "   <studio/>" + vbNewLine + _
            "   <_1/>" + vbNewLine + _
            "   <_2/>" + vbNewLine + _
            "   <_3/>" + vbNewLine + _
            "   <folder/>" + vbNewLine + _
            "</data>" + vbNewLine
    

    对于文件名处理,只需在doc中连接所需的部分。保存调用将在没有警告的情况下替换文件。

    doc.Save SFolder & "\" & sFile & ".NFO"
    

  •  类似资料:
    • 我几乎完成了一个大型宏的构建,但我遇到了最后的绊脚石。我制作了一个带有期望值的工作表,现在需要将其导出为XML格式。我只需要导出这个名为“Output”的特定工作表。当我导出为文本时存在问题,因此必须创建一个Sub exportToXML以删除导出时产生的一些引号。这工作正常。但是当我导出时,我必须手动输入我想要的目录和文件名在输出文件上,这不好。目录可能会不时更改,文件名也会更改。 错误转到En

    • 问题内容: 我想通过php将MYSQL数据导出到Excel / CSV。这样我以后可以使用我的数据库,或者有人可以使用和理解它。 问题答案: 我想这就是你要找的 您可以通过检查以下地址来创建自己的文件:http : //www.programmingfacts.com/export-mysql-data-into- excelcsv-via-php/ 我不能在这里添加工作代码,这是错误的= / 但

    • 我正在尝试将JTable导出到Microsoft Excel可用的文件中。 最初,我将数据写入一个文本文件,并将扩展名设置为“.xls” 我们非常感谢任何帮助和洞察力。可能还值得一提的是,tables模型是一个自定义模型。

    • 问题内容: 我想通过单击表单中的按钮将查询结果导出到excel文件。 为此,我使用了这段代码,并且效果很好: 但是我的查询使用了两个参数 sdate 和 edate ,我不想访问询问我这些值,但是我希望用户在带有适当文本框的表单中输入它们。 所以我在DoCMD.OutputTo之前的代码中添加了此位 但不幸的是,它不起作用。在导出之前如何将参数放入查询中? 问题答案: 如果您想保持原始参数查询的完

    • 我想将股票图表ohlc导出到Excel 我正在使用EPPlus,现在我知道EPPlus不支持绘制股票图表,因此我正在寻找另一个第三方dll,我找到了aspose,但它是一种付费功能。 有人能推荐其他方法导出股票图表用C#代码在Excel中创建股票图表吗? 或者它是可能的创建股票图表ohlc在Excel由C#由EPPlus? 当使用aspal时,我需要在bw代码中使用它,在我保存aspal工作簿的时

    • 本文向大家介绍POI通过模板导出EXCEL文件的实例,包括了POI通过模板导出EXCEL文件的实例的使用技巧和注意事项,需要的朋友参考一下 一般的EXCEL导出使用POI先创建一个HSSFWorkbook,然后通过不断创建HSSFRow,HSSFCell后设置单元格内容便可以完成导出。 这次在项目中需要用到模板,导出的内容包括(1.模板中的内容、样式。2.自己需要新增的内容、样式。),还需要设置单