Skip to content

Commit 544f800

Browse files
authored
Merge pull request #1535 from EPPlusSoftware/bug/issue1534
Fixes issue 1534
2 parents 71a663d + e42ad1d commit 544f800

File tree

5 files changed

+36
-13
lines changed

5 files changed

+36
-13
lines changed

src/EPPlus/Drawing/Slicer/ExcelPivotTableSlicerCacheTabularData.cs

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ internal void UpdateItemsXml()
135135
{
136136
if (item.Type == eItemType.Data)
137137
{
138-
if (item.Hidden)
138+
if (IsHidden(item))
139139
sb.Append($"<i x=\"{x++}\" />");
140140
else
141141
sb.Append($"<i x=\"{x++}\" s=\"1\"/>");
@@ -150,5 +150,25 @@ internal void UpdateItemsXml()
150150
dataNode.SetAttribute("count", x.ToString());
151151
dataNode.InnerXml = sb.ToString();
152152
}
153+
154+
private bool IsHidden(ExcelPivotTableFieldItem item)
155+
{
156+
if (item.Hidden)
157+
{
158+
return true;
159+
}
160+
else
161+
{
162+
var field = _cache._field;
163+
if (field.IsPageField && field.MultipleItemSelectionAllowed == false)
164+
{
165+
return field.PageFieldSettings.SelectedItem != item.X;
166+
}
167+
else
168+
{
169+
return false;
170+
}
171+
}
172+
}
153173
}
154174
}

src/EPPlus/Drawing/Slicer/ExcelPivotTableSlicerItemCollection.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
using System.ComponentModel;
77
using System.Linq;
88
using System.Text;
9+
using System.Xml;
910

1011
namespace OfficeOpenXml.Drawing.Slicer
1112
{
@@ -21,7 +22,7 @@ internal ExcelPivotTableSlicerItemCollection(ExcelPivotTableSlicerCache cache)
2122
{
2223
_cache = cache;
2324
_items = new List<ExcelPivotTableSlicerItem>();
24-
RefreshMe();
25+
RefreshMe();
2526
}
2627

2728
/// <summary>

src/EPPlus/Table/PivotTable/ExcelPivotTable.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1758,6 +1758,7 @@ internal void MatchFieldValuesToIndex()
17581758
if (f.Items.Count > 0)
17591759
{
17601760
f.Items.MatchValueToIndex();
1761+
17611762
}
17621763
}
17631764
}

src/EPPlus/Table/PivotTable/ExcelPivotTableFieldCollectionBase.cs

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,12 @@ namespace OfficeOpenXml.Table.PivotTable
2323
public class ExcelPivotTableFieldItemsCollection : ExcelPivotTableFieldCollectionBase<ExcelPivotTableFieldItem>
2424
{
2525
ExcelPivotTableField _field;
26-
internal Dictionary<int, int> _cacheDictionary = null;
26+
internal Lookup<int, int> _cacheLookup = null;
2727

2828
List<int> _hiddenItemIndex=null;
2929
internal ExcelPivotTableFieldItemsCollection(ExcelPivotTableField field) : base()
3030
{
31-
_field = field;
31+
_field = field;
3232
}
3333
internal void InitNewCalculation()
3434
{
@@ -78,9 +78,9 @@ public ExcelPivotTableFieldItem GetByValue(object value)
7878
var cl = _field.Cache.GetCacheLookup();
7979
if (cl.TryGetValue(value, out int ix))
8080
{
81-
if (_cacheDictionary.TryGetValue(ix, out int i))
81+
if (_cacheLookup.Contains(ix))
8282
{
83-
return _list[i];
83+
return _list[_cacheLookup[ix].First()];
8484
}
8585
}
8686
return null;
@@ -96,9 +96,9 @@ public int GetIndexByValue(object value)
9696
var cl = _field.Cache.GetCacheLookup();
9797
if (cl.TryGetValue(value, out int ix))
9898
{
99-
if(_cacheDictionary.TryGetValue(ix, out int i))
99+
if (_cacheLookup.Contains(ix))
100100
{
101-
return i;
101+
return _cacheLookup[ix].First();
102102
}
103103
}
104104
return -1;
@@ -120,7 +120,7 @@ internal void MatchValueToIndex()
120120
item.X = -1;
121121
}
122122
}
123-
_cacheDictionary = _list.Where(x=>x.X>=0).ToDictionary(x => x.X, y => _list.IndexOf(y));
123+
_cacheLookup = (Lookup<int,int>)_list.Where(x=> x.X >= 0).ToLookup(x => x.X, y => _list.IndexOf(y));
124124
}
125125
/// <summary>
126126
/// Set Hidden to false for all items in the collection
@@ -186,15 +186,16 @@ internal void Sort(eSortType sort)
186186
{
187187
var comparer = new PivotItemComparer(sort, _field);
188188
_list.Sort(comparer);
189-
_cacheDictionary = _list.Where(x=>x.X > -1).ToDictionary(x => x.X, y=>_list.IndexOf(y));
189+
_cacheLookup = (Lookup<int,int>)_list.Where(x=>x.X > -1).ToLookup(x => x.X, y=>_list.IndexOf(y));
190190
}
191191

192192
internal ExcelPivotTableFieldItem GetByCacheIndex(int index)
193193
{
194-
if(_cacheDictionary.TryGetValue(index, out int i))
194+
if (_cacheLookup.Contains(index))
195195
{
196-
return _list[i];
196+
return _list[_cacheLookup[index].First()];
197197
}
198+
198199
return null;
199200
}
200201

src/EPPlusTest/Issues/PivotTableIssues.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ public void s688()
1010
{
1111
using (ExcelPackage package = OpenTemplatePackage("s688.xlsx"))
1212
{
13-
package.Workbook.Worksheets[0].PivotTables[0].Calculate(true);
13+
package.Workbook.Worksheets[0].PivotTables[0].Calculate(false);
1414
SaveAndCleanup(package);
1515
}
1616
}

0 commit comments

Comments
 (0)