data = {'发票号码': root.findtext('.//InvoiceNumber'),'金额': root.findtext('.//TotalAmWithoutTax')}
' 需要定义一个辅助函数安全提取invNumber = GetNodeText(xmlDoc, "//InvoiceNumber")outputWs.Cells(row, 2).Value = invNumber

| 零门槛,Excel 内置 | ||
| 极快,处理上万张发票有优势 | 中等,几百张发票无压力 | |
只要会复制粘贴代码即可 | ||
| 适合开发自动化工具 | 适合直接在现有报表内操作 | |

Option ExplicitSub 批量提取发票XML信息()' 定义对象Dim fso As Object, folder As Object, file As Object, xmlDoc As ObjectDim outputWs As WorksheetDim row As Long, folderPath As StringDim xmlCount As Long, successCount As Long' ==========================================' 1. 设置路径 (请根据实际情况修改此处的路径)' ==========================================folderPath = "C:\...\发票文件夹"If Right(folderPath, 1) <> "\" Then folderPath = folderPath & "\"' 2. 准备输出工作表On Error Resume NextSet outputWs = ThisWorkbook.Sheets("发票提取结果")On Error GoTo 0If outputWs Is Nothing ThenSet outputWs = ThisWorkbook.Sheets.Add(After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count))outputWs.Name = "发票提取结果"ElseoutputWs.Cells.ClearEnd If' 写入表头并美化格式Dim headers: headers = Array("档案", "发票号码", "开票日期", "购买方", "购买方税号", "销售方", "销售方税号", "项目", "金额", "税额", "价税合计")With outputWs.Range("A1").Resize(1, UBound(headers) + 1).Value = headers ' 填充标题.Font.Bold = True ' 加粗.Interior.Color = RGB(220, 220, 220) ' 设置背景底色(淡灰色).HorizontalAlignment = xlCenter ' 顺便设置个居中对齐,更美观End With' 3. 遍历文件并解析Set fso = CreateObject("Scripting.FileSystemObject")If Not fso.FolderExists(folderPath) ThenMsgBox "未找到文件夹,请检查路径设置!", vbExclamationExit SubEnd IfSet folder = fso.GetFolder(folderPath)row = 2Application.ScreenUpdating = False ' 关闭屏幕刷新,提高速度For Each file In folder.FilesIf LCase(fso.GetExtensionName(file.Name)) = "xml" ThenxmlCount = xmlCount + 1Set xmlDoc = CreateObject("MSXML2.DOMDocument.6.0")xmlDoc.async = FalseIf xmlDoc.Load(file.Path) ThenDim invNum As StringinvNum = GetNodeText(xmlDoc, "//InvoiceNumber")' 如果发票号码不为空,则开始记录If invNum <> "" ThensuccessCount = successCount + 1With outputWs.Cells(row, 1).Value = file.Name' 强制文本格式防止科学计数法.Cells(row, 2).NumberFormatLocal = "@".Cells(row, 2).Value = "'" & invNum.Cells(row, 3).Value = GetNodeText(xmlDoc, "//IssueTime").Cells(row, 4).Value = GetNodeText(xmlDoc, "//BuyerName").Cells(row, 5).NumberFormatLocal = "@".Cells(row, 5).Value = "'" & GetNodeText(xmlDoc, "//BuyerIdNum").Cells(row, 6).Value = GetNodeText(xmlDoc, "//SellerName").Cells(row, 7).NumberFormatLocal = "@".Cells(row, 7).Value = "'" & GetNodeText(xmlDoc, "//SellerIdNum").Cells(row, 8).Value = GetNodeText(xmlDoc, "//ItemName")' 金额转为数值.Cells(row, 9).Value = Val(GetNodeText(xmlDoc, "//TotalAmWithoutTax")).Cells(row, 10).Value = Val(GetNodeText(xmlDoc, "//TotalTaxAm")).Cells(row, 11).Value = Val(GetNodeText(xmlDoc, "//TotalTax-includedAmount"))End Withrow = row + 1End IfEnd IfEnd IfNext file' 4. 格式美化With outputWs.Columns("A:K").AutoFit.Range("I:K").NumberFormatLocal = "#,##0.00"End WithApplication.ScreenUpdating = TrueMsgBox "处理完成!" & vbCrLf & "成功提取: " & successCount & " 张" & vbCrLf & "扫描文件: " & xmlCount & " 个", vbInformationEnd Sub' 辅助函数:安全提取XML节点内容Private Function GetNodeText(xmlDoc As Object, ByVal xpath As String) As StringDim node As ObjectSet node = xmlDoc.SelectSingleNode(xpath)If Not node Is Nothing ThenGetNodeText = Trim(node.Text)ElseGetNodeText = ""End IfEnd Function