Excel使用OpenXML"全部刷新"

Jul*_*rra 6 office-2007 excel-2007 openxml openxml-sdk

我有一个excel 2007文件(OpenXML格式)与xml文件的连接.此连接生成excel表和数据透视表.

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

谢谢.

Bar*_*ski 11

那么有很好的解决方法.使用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;               
        }
Run Code Online (Sandbox Code Playgroud)

您需要为您的pivotCacheDefinition确定"路径" - 使用OpenXML SDK 2.0 Productivity Tool查找它.

BuildUriPartDictionary是OpenXML SDK 2.0 Productivity Tool生成的标准方法

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;
    }
Run Code Online (Sandbox Code Playgroud)

另一个解决方案是将您的电子表格转换为macroenabled,并在其中嵌入一个VBA脚本,该脚本将刷新所有数据透视表.这可以在按钮单击时发生,或在用户打开电子表格时再次发生.在这里,您可以找到用于刷新数据透视表的VBA代码:http: //www.ozgrid.com/VBA/pivot-table-refresh.htm


Sam*_*eff 2

使用 Open XML 无法做到这一点。Open XML 允许您处理文件中存储的数据并更改数据、公式和定义等。它实际上并不进行任何计算。

从技术上讲,Excel 自动化是可行的,但绝对不建议在服务器环境中使用它,并且如果可能的话最好避免在桌面上使用。