重复数据透视表中的标签

本文关键字:标签 透视 数据 | 更新日期: 2023-09-27 18:16:17

我正在使用Epplus并尝试在表格类型的数据透视表中"重复所有项目标签"。我尝试了很多东西,但它看起来没有办法与EPPlus库。我决定操纵数据透视表xml,我需要在pivotTableFields上添加fillDownLabels属性,但我不确定如何做到这一点。

private void ManuplateXml(OfficeOpenXml.Table.PivotTable.ExcelPivotTable pivotTable)
{
    var xdPivotTable = pivotTable.PivotTableXml;
    var xdPivotFields = xdPivotTable.FirstChild["pivotFields"];
    if (xdPivotFields == null)
        return;
    foreach (XmlElement pField in xdPivotFields)
    {
        pField.SetAttribute("fillDownLabels", "1");
    }
}

我写这个方法,它添加了属性,但我的数据透视表仍然不重复项目标签。xml格式应该如何?我如何使用fillDownLabels属性?

重复数据透视表中的标签

施工pField.SetAttribute("fillDownLabels", "true");不工作。属性fillDownLabels应用于属于ExtensionList类(<extLst>)的扩展(<ext>)。

    private void ManipulateXml(OfficeOpenXml.Table.PivotTable.ExcelPivotTable pivotTable)
    {
        var pivotTableXml = pivotTable.PivotTableXml;
        var nsManager = new XmlNamespaceManager(pivotTableXml.NameTable);
        nsManager.AddNamespace("d", "http://schemas.openxmlformats.org/spreadsheetml/2006/main");
        nsManager.AddNamespace("x14", "http://schemas.microsoft.com/office/spreadsheetml/2009/9/main");
        var topNode = pivotTableXml.DocumentElement;
        var nodes = topNode.SelectNodes("d:pivotFields/d:pivotField[@axis='"axisRow'"]", nsManager);
        if (nodes == null) return;
        topNode.SetAttribute("updatedVersion", "6");//this line is important!
        foreach (XmlElement node in nodes)
        {
            var element = pivotTableXml.CreateElement("extLst", nsManager.LookupNamespace("d"));
            var ext = pivotTableXml.CreateElement("ext", nsManager.LookupNamespace("d"));
            ext.SetAttribute("uri", "{2946ED86-A175-432a-8AC1-64E0C546D7DE}");
            ext.SetAttribute("xmlns:x14", "http://schemas.microsoft.com/office/spreadsheetml/2009/9/main");
            var fdLabels = pivotTableXml.CreateElement("x14:pivotField", nsManager.LookupNamespace("x14"));
            fdLabels.SetAttribute("fillDownLabels", "1");
            ext.AppendChild(fdLabels);
            element.AppendChild(ext);
            node.AppendChild(element);
        }
    }

需要设置fillDownLabelstrue。这是根据OpenXML规范的透视字段元素,fillDownLabels是它的一个属性。

设置为true,使用以下约定:

pField.SetAttribute("fillDownLabels", "true");

还需要注意的是,在某些情况下,这个属性可以被忽略:

当数据透视表([ISO/IEC-29500-1] section 18.10)字段(1)的compact属性和outline属性为"true"时,此属性被忽略。如果数据透视表([ISO/IEC-29500-1] section 18.10)字段(1)不在数据透视表([ISO/IEC-29500-1] section 18.10)行(2)轴或数据透视表([ISO/IEC-29500-1] section 18.10)列(2)轴上,则忽略此属性。

总结-让你的fillDownLabels正常工作:

  1. 设置fillDownLabelstrue -默认为false
  2. 确保此pField的outline属性的compact属性为设置或false(可能是默认的-检查规范)。如果是true, fillDownLabels属性被忽略
  3. 确保Pfield在行轴或列轴上,否则fillDownLabels 被忽略

对于使用OpenXMLSDK的人来说,最后一个注意事项-要设置布尔值属性,您可以使用约定:

fillDownLabels = BooleanValue.FromBoolean(true)