2010-10-11 137 views
6

我有一个带有xml文件连接的excel 2007文件(OpenXML格式)。该连接生成一个Excel表格和数据透视表。使用OpenXML进行Excel“全部刷新”

我想用OpenXML SDK v2找到一种与Excel中的“全部刷新”按钮相同的方法。这样我就可以在提供新的xml文件后立即自动更新文件。

谢谢。

+0

关于数据透视表,我只是选中每个数据透视表的选项“刷新打开文件的数据”。 – 2010-10-12 02:49:28

回答

2

你不能用Open XML来做到这一点。 Open XML允许您使用存储在文件中的数据并更改数据和公式以及定义等。它实际上并没有做任何计算。

从技术上来说,Excel自动化是可行的,但绝对不推荐用于服务器环境,最好尽量避免在桌面上使用。

2

我认为你可以做到这一点的唯一方法是以下这种类型的方法..

  1. 保存的Open XML工作簿回到XLSX文件。
  2. 使用Excel对象模型加载工作簿。
  3. 呼叫或者

ThisWorkbook.PivotCaches(yourIndex).Refresh();

ThisWorkbook.RefreshAll();

虽然我敢肯定RefreshAll也将工作。

  1. 使用对象模型保存工作簿并关闭它。
  2. 重新打开以使用xml名称空间。
+0

这是一个来自COM excel类的方法。它在OpenXML类中不可用,因为它是用来操纵XML的。 最后,我不认为这是可能的。 – 2010-10-20 02:57:12

+0

刷新全部应刷新数据透视表。我将根据上面的评论编辑我的答案。 – 2010-10-20 21:29:28

+0

感谢您的时间,但我终于找到了我的问题的另一种解决方案:我设置了所有数据透视表中的“刷新打开文件时”选项。然后,我只需将数据导出到主表,以便Excel文件自动更改。 – 2010-10-21 00:56:26

10

那么对此有相当好的解决方法。 使用OpenXML,您可以在数据透视表中打开“在打开文件时刷新数据”选项(右键点击数据透视表 - >数据透视表选项 - >数据选项卡)。 当用户第一次打开电子表格时,会导致自动刷新数据透视表。 代码:

using (var document = SpreadsheetDocument.Open(newFilePath, true)) 
     { 
      var uriPartDictionary = BuildUriPartDictionary(document); 

      PivotTableCacheDefinitionPart pivotTableCacheDefinitionPart1 = (PivotTableCacheDefinitionPart)uriPartDictionary["/xl/pivotCache/pivotCacheDefinition1.xml"]; 
      PivotCacheDefinition pivotCacheDefinition1 = pivotTableCacheDefinitionPart1.PivotCacheDefinition; 
      pivotCacheDefinition1.RefreshOnLoad = true;    
     } 

你需要确定的“路径”,以你的pivotCacheDefinition - 使用的OpenXML SDK 2.0生产力工具,寻找它。

BuildUriPartDictionary是OpenXML的SDK 2.0生产力工具

protected Dictionary<String, OpenXmlPart> BuildUriPartDictionary(SpreadsheetDocument document) 
    { 
     var uriPartDictionary = new Dictionary<String, OpenXmlPart>(); 
     var queue = new Queue<OpenXmlPartContainer>(); 
     queue.Enqueue(document); 
     while (queue.Count > 0) 
     { 
      foreach (var part in queue.Dequeue().Parts.Where(part => !uriPartDictionary.Keys.Contains(part.OpenXmlPart.Uri.ToString()))) 
      { 
       uriPartDictionary.Add(part.OpenXmlPart.Uri.ToString(), part.OpenXmlPart); 
       queue.Enqueue(part.OpenXmlPart); 
      } 
     } 
     return uriPartDictionary; 
    } 

另一种解决方案是你的电子表格macroenabled转换生成一个标准的方法,嵌入有一个VBA脚本,将刷新所有数据透视表。 当用户打开电子表格时,可能会在按钮单击或再次出现时发生。 在这里你可以找到VBA代码刷新数据透视表: http://www.ozgrid.com/VBA/pivot-table-refresh.htm