OpenOfficeXml在数据透视表中重复标签

时间:2016-11-03 07:37:56

标签: c# openxml epplus epplus-4

我正在使用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属性?

2 个答案:

答案 0 :(得分:2)

构建pField.SetAttribute("fillDownLabels", "true");不起作用。 属性fillDownLabels应该用于属于ExtensionList类(<ext>)的扩展名(<extLst>)。在我的解决方案下面:

    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);
        }
    }

答案 1 :(得分:0)

您需要将fillDownLabels设置为true。这是OpenXML specification for the PivotField element which the fillDownLabels is an attribute of

要将其设置为true,请使用以下约定:

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

另请注意,在某些情况下可以忽略此属性:

  

当数据透视表([ISO / IEC-29500-1]第18.10节)字段(1)的compact属性和outline属性为“true”时,将忽略此属性。如果数据透视表([ISO / IEC-29500-1]第18.10节)字段(1)不在数据透视表([ISO / IEC-29500-1]第18.10节)第(2)行或数据透视表上,则忽略此属性([ISO / IEC-29500-1]第18.10节)第(2)栏。

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

  1. fillDownLabels设置为true - 默认设置为false
  2. 确保此pField的compact属性的outline属性设置为false(可能是默认值 - 检查规范)。如果是true,则fillDownLabels属性为忽略
  3. 确保Pfield位于行轴或列轴上,否则fillDownLabels 忽略
  4. 使用OpenXMLSDK的人的最后一个注释 - 设置一个BooleanValue属性,您可以使用约定:

    fillDownLabels = BooleanValue.FromBoolean(true)