Skip to content

Commit 868a40b

Browse files
authored
Fix for issue 2136 (#2137)
* Fixes issue #2136 * Small fixes
1 parent cb188fa commit 868a40b

File tree

4 files changed

+45
-3
lines changed

4 files changed

+45
-3
lines changed

src/EPPlus/Table/PivotTable/PivotTableCacheInternal.cs

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -265,7 +265,7 @@ internal void RefreshFields(bool checkSourceValid)
265265
else
266266
{
267267
var ws = r.Worksheet;
268-
var name = ws.GetValue(r._fromRow, col)?.ToString().Trim();
268+
var name = ws.GetValue(r._fromRow, col)?.ToString();
269269
ExcelPivotTableCacheField field;
270270
if (_fields==null || ix >= _fields?.Count || _fields[ix].Name != name)
271271
{
@@ -469,23 +469,41 @@ private void UpdateFieldReferences(List<ExcelPivotTableCacheField> fields, List<
469469
pt.DeleteNode("d:dataFields");
470470
}
471471

472+
var rmFields=new List<ExcelPivotTableField>();
472473
//Update column field index
473474
foreach (var cf in pt.ColumnFields)
474475
{
475476
UpdateRowColPathFieldXml(oldIndex, pt, cf, "d:colFields/d:field[@x={0}]", "x");
477+
if (!pt.Fields.Any(x => x.Name.Equals(cf.Name, StringComparison.CurrentCultureIgnoreCase)))
478+
{
479+
rmFields.Add(cf);
480+
}
476481
}
482+
rmFields.ForEach(f=>pt.ColumnFields.Remove(f));
483+
rmFields.Clear();
477484

478485
//Update row field index
479486
foreach (var rf in pt.RowFields)
480487
{
481488
UpdateRowColPathFieldXml(oldIndex, pt, rf, "d:rowFields/d:field[@x={0}]", "x");
489+
if (!pt.Fields.Any(x=>x.Name.Equals(rf.Name, StringComparison.CurrentCultureIgnoreCase)))
490+
{
491+
rmFields.Add(rf);
492+
}
482493
}
494+
rmFields.ForEach(f => pt.RowFields.Remove(f));
495+
rmFields.Clear();
483496

484497
//Update page field index
485498
foreach (var pf in pt.PageFields)
486499
{
487500
UpdateRowColPathFieldXml(oldIndex, pt, pf, "d:pageFields/d:pageField[@fld={0}]", "fld");
501+
if (!pt.Fields.Any(x => x.Name.Equals(pf.Name, StringComparison.CurrentCultureIgnoreCase)))
502+
{
503+
rmFields.Add(pf);
504+
}
488505
}
506+
rmFields.ForEach(f => pt.PageFields.Remove(f));
489507

490508
//Update styles
491509
var newIndex = movedFields.Where(x => x >= 0).ToDictionary(x => x, x => movedFields.IndexOf(x));

src/EPPlus/Table/PivotTable/PivotTableCacheRecords.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,7 @@ internal void CreateRecords()
153153
f._fieldRecordIndex[ix].Add(ciIx);
154154
}
155155
else
156-
{
156+
{
157157
f._fieldRecordIndex.Add(ix, new List<int> { ciIx });
158158
}
159159
}

src/EPPlusTest/Issues/LegacyTests/Issues.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4284,7 +4284,7 @@ public void s803()
42844284
SaveAndCleanup(p);
42854285
}
42864286
}
4287-
[TestMethod]
4287+
[TestMethod, Ignore]
42884288
public void s431()
42894289
{
42904290
using (var package = OpenTemplatePackage("template-not-working.xlsx"))

src/EPPlusTest/Issues/PivotTableIssues.cs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -620,5 +620,29 @@ public void s993()
620620
Assert.AreEqual("60000", cell1);
621621
}
622622
}
623+
[TestMethod]
624+
public void TestPivot()
625+
{
626+
var package = OpenTemplatePackage("TestTemplate3.xlsx");
627+
var pivotTableCollections = package.Workbook.Worksheets.Select(x => x.PivotTables).ToList();
628+
// Iterate through each collection of pivot tables and refresh them
629+
foreach (var pivotTables in pivotTableCollections)
630+
{
631+
foreach (var pivotTable in pivotTables)
632+
{
633+
var pivotData = pivotTable.CalculatedData;
634+
635+
if (pivotTable.CacheDefinition != null)
636+
{
637+
pivotTable.CacheDefinition.Refresh();
638+
pivotTable.CacheDefinition.SaveData = true;
639+
}
640+
641+
pivotTable.Calculate(false);
642+
}
643+
}
644+
SaveAndCleanup(package);
645+
}
646+
623647
}
624648
}

0 commit comments

Comments
 (0)