我正在使用Epplus,并尝试在表格类型数据透视表中“重复所有项目标签”。
我尝试了很多事情,但是使用EPPlus库看起来没办法。我决定操纵数据透视表xml,我需要在数据透视表字段上添加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类(<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);
}
}