我正在使用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);
}
}
需要设置fillDownLabels
为true
。这是根据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
正常工作:
- 设置
fillDownLabels
为true
-默认为false
- 确保此pField的
outline
属性的compact
属性为设置或false(可能是默认的-检查规范)。如果是true
, fillDownLabels属性被忽略。 - 确保Pfield在行轴或列轴上,否则
fillDownLabels
被忽略。
对于使用OpenXMLSDK的人来说,最后一个注意事项-要设置布尔值属性,您可以使用约定:
fillDownLabels = BooleanValue.FromBoolean(true)