Excel“从XML数据导入”不会添加新的列

Excel 2010在Data->“From Other Sources” – >“From XML Data Import”下有一个非常棒的function,可以从Web服务中提取XML,不需要编码。 很好,但我的服务现在在最后添加了一个新的列。 在Excel中刷新连接不会添加新列。 事实上,在同一电子表格中创build第二个连接到完全相同的URL将不会显示新的列(尽pipe在不同的Excel工作簿上做同样的事情)。 显然,Excel以某种方式caching列。

我发现这个链接描述了一个可能的解决办法,手动黑客的Excel文件; 但那是3年前的事了 当然,现在有更好的办法。

有什么build议? 您可以通过将以下XML保存为文本文件,将其导入Excel,然后编辑该文件并添加新列来复制该文件。

<Table> <Row> <First>1</First> <Second>2</Second> </Row> <Row> <First>3</First> <Second>4</Second> </Row> </Table> 

选项:

  • Excel 2010开发人员选项卡(请参阅问题Excel将字段添加到Xml地图 )( search )
  • Excel 2007(也许是其他的)在论坛post中,似乎使用VBA开发了一个解决scheme: XML问题 – 更新模式/映射 ( 归档 )( 使用XML映射function页面进行编程归档 )。 VBA代码包含在下面。
  • 用于Excel 2003的 Excel 2003 XML工具箱
  • ALL:下面提供的解决方法不会干扰公式。

我还没有尝试从链接的论坛post的VBA代码,包括在下面。 我希望这个对你有用。 但是,下面的解决方法似乎很容易,并且不影响在映射内引用数据的公式。 因此,我会使用它,除非它不适合你,或者如果你的映射是复杂的,或者你期望需要半自动更新多次(尽pipe下面的解决方法只需要很less的时间)。

似乎没有Excel 2007的官方解决scheme。似乎有两个单独的官方解决scheme:一个用于Excel 2003(附件),另一个用于Excel 2010(开发人员选项卡)。

问题Excel添加一个字段到一个Xml地图提供了三种方法可能工作。

  • 首先是Excel 2003的XML工具箱,它可以在Excel 2003中执行此操作。对该解决scheme的评论表明它存在一些问题/问题,可能会或可能不会对您有用。 您可能需要在Excel上使用较旧的版本,甚至是较旧的操作系统。
  • 第二个是“编辑.xls文件”方法。
  • 第三个是使用Excel 2010开发人员选项卡。

其他选项:

  • 下面提供的解决方法(可能是我select简单的一次性更新,这些更新不会重复,映射也很简单)。
  • 将工作表另存为XML电子表格。 编辑文件末尾logging的模式。 鉴于它是XML,它完全是文本。 架构很容易理解。 添加一个列就像复制和粘贴几行XML文本一样简单。 如果使用这种方法,可能最容易使你的工作表复制,删除和重新创build地图和映射,然后剪切和粘贴。 XML示例:

(SO格式要求空白文本)

 <x2:Field x2:ID="Add-E-head"> <x2:Range>RC[4]</x2:Range> <x2:XPath>Add-E-head</x2:XPath> <x2:XSDType>string</x2:XSDType> <ss:Cell> </ss:Cell> <x2:Aggregate>None</x2:Aggregate> </x2:Field> 

解决方法:[添加/插入/删除列(简单映射,例如一个大表)):

  1. 制作工作表的备份副本。
  2. 删除XML映射不是在工作表中的映射 。 只是XML地图。
  3. 重新创build地图。 它现在将有新的XML模式。
  4. 如果您的公式/数据将被其他列覆盖:将足够的列立即插入到包含XML映射数据的工作表上当前区域的右侧。
  5. 如果在较旧的列之间插入了任何列,请在要插入的列中插入一列。 是的,这在XML映射的数据区域是正确的,一个通用的列名将被临时分配。
  6. 删除新XML中不存在的任何列。
  7. 将新映射表中的元素拖放到当前映射的左上angular(或者直接在未删除的映射上重新创build工作表上的映射)。
  8. 手动更改任何更新的标题(如果您的数据标记为有标题)。
  9. 对工作簿中的所有单独的映射重复步骤4到8。 通常我只是有一个大的映射,我参考而不是多个小的映射。
  10. 刷新您的XML数据。

您的公式不应该改变,并且对XML映射数据的单元格引用应该保持正确。 为了validation您是否正确插入了第3步中的任何列,可以在进行任何其他更改之前(即在第1a步)在XML映射上创build一行,并仅复制和粘贴顶部行中的值。 在步骤10中刷新XML数据时,可以validation旧的行标题是否与新的展示位置匹配。

注意:步骤3和4也可以通过更复杂的XML元素映射来完成。 我发现插入列和保持与XM1元素的1-1对应更容易。

这是通过多次试验在我的机器上运行的,并且将引用这个区域的公式作为正确的。 您可以尝试的文件名为SO-XML mapping.xml包含在下面链接的示例文件中( 以及这里 )

logging某些数据表中通用列更改的来源(或交替使用多个数据源):

有些时候,你所拥有的数据不是由像XML地图那样dynamic提供的,或者当你不想为记住插入列而烦恼的时候。 完成此工作的蛮力解决方法是创build自己的数据列映射到您的工作表中控制列位置的表(工作表)。 您可以通过创build一个间接引用已导入/复制到另一个表单中的数据的表来完成此操作。 使用这样的间接映射也可以用来轻松地在两个或更多不同的数据集之间进行切换,以作为您设置的任何公式的input。

间接映射使用INDIRECT()来引用包含源数据的工作表。 所有的公式然后指向这个间接表而不是源数据。 间接表中列的内容在固定位置组织,数据从源数据中与指定的列标题匹配的列中拉入。 然后,如果对源数据中列的组织进行更改,则可以使用交替格式的数据创build新工作表,或将其放在原始数据所在的工作表中,然后更改列标题用于参考。 如果在多个数据集之间切换,则可以通过更改一个单元格来更改完全使用的源数据。

这个间接的映射表允许公式中的列(间接表外)被修复,而不必担心源数据可能的重组。 或者,它允许您有两个或更多个数据集,当您在它们之间切换时,它们会自动转换为同一列组织。 即使数据集具有用于相同实际数据的不同标题(只有在select了备用数据集时才使用标题行),也可以实现此目的。

这可能比在这样的post中解释更容易。 因此,这里是一个从五个不同的工作表中select数据的例子 。

在这个例子中,所有的公式都会引用间接页面。 该示例假定所有文件都放置在C:\目录中。 不幸的是,使用XML映射需要一个完整的文件path,并且C:\是运行Excel的大多数机器上存在的最高概率位置。

2009年11月16日来自KMKfan的 VBA代码:

在XML问题中发布- 更新架构/映射 ( 归档 )( 使用XML映射function页面进行编程归档,后者是引用的 )。

这篇文章的评论是:

这里是这个代码的更新。 只要xsd和xml映射具有相同的名称(即:源映射“MyMap”基于MyMap.xsd),此代码允许在同一工作簿中更新多个XML映射。如果您使用的是XML协助报告并决定添加一段数据来捕获,您可以自动更新现有的映射,只需要手动更新新的数据元素。

 Dim r, c As Integer Dim wb1, wb2 As Workbook Dim StrMap, StrWS, StrRng, StrXPath As String Dim nStrWS, nStrRng, nStrXPath As String Dim nStrMap As XmlMap Sub Update_XML() Call Get_XPath Call Add_NewMap Call Assign_Elements End Sub Sub Get_XPath() 'Gets Available XML Mappings (XPath) for current workbook and sends the text information to a temp file. Set wb1 = ThisWorkbook Set wb2 = Workbooks.Add wb1.Activate For Each Sheet In wb1.Sheets Sheet.Select Range("A1").Select Selection.UnMerge For c = 1 To ActiveSheet.UsedRange.Columns.Count For r = 1 To ActiveSheet.UsedRange.Rows.Count If ActiveCell.Offset(r - 1, c - 1).XPath <> "" Then Call Send_XPath wb1.Activate Next r Next c Selection.Merge Next Sheet End Sub Sub Send_XPath() 'Sends text information to a temporary workbook for use later. StrWS = ActiveSheet.Name StrRng = ActiveCell.Offset(r - 1, c - 1).Address StrXPath = ActiveCell.Offset(r - 1, c - 1).XPath StrMap = ActiveCell.Offset(r - 1, c - 1).XPath.Map.Name With wb2 .Activate ActiveCell = StrMap ActiveCell.Offset(0, 1) = StrWS ActiveCell.Offset(0, 2) = StrRng ActiveCell.Offset(0, 3) = StrXPath ActiveCell.Offset(1, 0).Select End With End Sub Sub Add_NewMap() 'Delete the current XML map and add a new XML Map that has the same schema structure. 'XML Map and XSD schema must be named identically. Only the .xsd extension should be different. Dim MyPath, MyMap As String MyPath = 'Path of .xsd file goes here For Each XmlMap In wb1.XmlMaps MyMap = XmlMap.Name wb1.XmlMaps(XmlMap.Name).Delete wb1.XmlMaps.Add(MyPath & "\" & MyMap & ".xsd").Name = MyMap Next XmlMap End Sub Sub Assign_Elements() 'Assign XPath of new XML Map to ranges based on the information in the temp workbook. Close 2nd workbook w/o saving. With wb2 .Activate Application.Goto Range("$A$1") End With Do Until ActiveCell = "" Set nStrMap = wb1.XmlMaps(ActiveCell.Text) nStrWS = ActiveCell.Offset(0, 1) nStrRng = ActiveCell.Offset(0, 2) nStrXPath = ActiveCell.Offset(0, 3) With wb1 .Activate Sheets(nStrWS).Select Range(nStrRng).XPath.SetValue nStrMap, nStrXPath End With wb2.Activate ActiveCell.Offset(1, 0).Select Loop wb2.Close False End Sub 

尝试这个:

突出显示您导入的数据,并删除它们填充的行。 然后,select要插入数据的单元格,然后转到数据 – >从XML数据导入来重新创build连接。 当它重新创build连接时,它应该添加额外的列。 (如果您尝试刷新当前数据表的顶部,则不会附加您的列。)