diff --git a/ClosedXML/Excel/XLWorkbook_Load.cs b/ClosedXML/Excel/XLWorkbook_Load.cs index 91a818c..dbd5e51 100644 --- a/ClosedXML/Excel/XLWorkbook_Load.cs +++ b/ClosedXML/Excel/XLWorkbook_Load.cs @@ -720,7 +720,7 @@ .Distinct().ToList(); pivotValue.BaseField = col.FirstCell().GetValue(); - + if (df.BaseItem?.Value != null) { var bi = (int)df.BaseItem.Value; @@ -737,11 +737,11 @@ { foreach (var pageField in pivotTableDefinition.PageFields.Cast()) { - var pf = pivotTableDefinition.PivotFields.ElementAt((int)pageField.Field.Value) as PivotField; + var pf = pivotTableDefinition.PivotFields.ElementAt(pageField.Field.Value) as PivotField; if (pf == null) continue; - var cacheField = pivotTableCacheDefinitionPart.PivotCacheDefinition.CacheFields.ElementAt((int)pageField.Field.Value) as CacheField; + var cacheField = pivotTableCacheDefinitionPart.PivotCacheDefinition.CacheFields.ElementAt(pageField.Field.Value) as CacheField; var filterName = pf.Name?.Value ?? cacheField.Name?.Value; @@ -751,45 +751,51 @@ else rf = pt.ReportFilters.Add(filterName); + var openXmlItems = new List(); if ((pageField.Item?.HasValue ?? false) && pf.Items.Any() && cacheField.SharedItems.Any()) { - var item = pf.Items.ElementAt(Convert.ToInt32(pageField.Item.Value)) as Item; - if (item == null) + if (!(pf.Items.ElementAt(Convert.ToInt32(pageField.Item.Value)) is Item item)) continue; - var sharedItem = cacheField.SharedItems.ElementAt(Convert.ToInt32((uint)item.Index)); - var numberItem = sharedItem as NumberItem; - var stringItem = sharedItem as StringItem; - var dateTimeItem = sharedItem as DateTimeItem; - - if (numberItem != null) - rf.AddSelectedValue(Convert.ToDouble(numberItem.Val.Value)); - else if (dateTimeItem != null) - rf.AddSelectedValue(Convert.ToDateTime(dateTimeItem.Val.Value)); - else if (stringItem != null) - rf.AddSelectedValue(stringItem.Val.Value); - else - throw new NotImplementedException(); + openXmlItems.Add(item); } else if (OpenXmlHelper.GetBooleanValueAsBool(pf.MultipleItemSelectionAllowed, false)) { - foreach (var item in pf.Items.Cast()) - { - if (item.Hidden == null || !BooleanValue.ToBoolean(item.Hidden)) - { - var sharedItem = cacheField.SharedItems.ElementAt(Convert.ToInt32((uint)item.Index)); - var numberItem = sharedItem as NumberItem; - var stringItem = sharedItem as StringItem; - var dateTimeItem = sharedItem as DateTimeItem; + openXmlItems.AddRange(pf.Items.Cast()); + } - if (numberItem != null) + foreach (var item in openXmlItems) + { + if (!OpenXmlHelper.GetBooleanValueAsBool(item.Hidden, false) + && (item.Index?.HasValue ?? false)) + { + var sharedItem = cacheField.SharedItems.ElementAt(Convert.ToInt32((uint)item.Index)); + // https://msdn.microsoft.com/en-us/library/documentformat.openxml.spreadsheet.shareditems.aspx + switch (sharedItem) + { + case NumberItem numberItem: rf.AddSelectedValue(Convert.ToDouble(numberItem.Val.Value)); - else if (dateTimeItem != null) + break; + + case DateTimeItem dateTimeItem: rf.AddSelectedValue(Convert.ToDateTime(dateTimeItem.Val.Value)); - else if (stringItem != null) + break; + + case BooleanItem booleanItem: + rf.AddSelectedValue(Convert.ToBoolean(booleanItem.Val.Value)); + break; + + case StringItem stringItem: rf.AddSelectedValue(stringItem.Val.Value); - else + break; + + case MissingItem missingItem: + case ErrorItem errorItem: + // Ignore missing and error items + break; + + default: throw new NotImplementedException(); } } diff --git a/ClosedXML_Tests/Excel/Loading/LoadingTests.cs b/ClosedXML_Tests/Excel/Loading/LoadingTests.cs index b7694d6..89f1714 100644 --- a/ClosedXML_Tests/Excel/Loading/LoadingTests.cs +++ b/ClosedXML_Tests/Excel/Loading/LoadingTests.cs @@ -36,7 +36,8 @@ @"Misc\InvalidPrintArea.xlsx", @"Misc\Date1904System.xlsx", @"Misc\LoadImageWithoutTransform2D.xlsx", - @"Misc\PivotTableWithTableSource.xlsx" + @"Misc\PivotTableWithTableSource.xlsx", + @"Misc\TemplateWithTableSourcePivotTables.xlsx" }; foreach (var file in files) diff --git a/ClosedXML_Tests/Resource/Misc/TemplateWithTableSourcePivotTables.xlsx b/ClosedXML_Tests/Resource/Misc/TemplateWithTableSourcePivotTables.xlsx new file mode 100644 index 0000000..d2d5a95 --- /dev/null +++ b/ClosedXML_Tests/Resource/Misc/TemplateWithTableSourcePivotTables.xlsx Binary files differ