Skip to content

Commit 3b1eff8

Browse files
committed
Fixes issue #440-Pivot cache fields that contains both ints and floats corrupts the pivot cache
1 parent 10a56cb commit 3b1eff8

File tree

2 files changed

+30
-6
lines changed

2 files changed

+30
-6
lines changed

src/EPPlus/Table/PivotTable/ExcelPivotTableCacheField.cs

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,8 @@ private enum DataTypeFlags
4040
Number = 0x8,
4141
DateTime = 0x10,
4242
Boolean = 0x20,
43-
Error = 0x30
43+
Error = 0x30,
44+
Float = 0x40,
4445
}
4546
internal PivotTableCacheInternal _cache;
4647
internal ExcelPivotTableCacheField(XmlNamespaceManager nsm, XmlNode topNode, PivotTableCacheInternal cache, int index) : base(nsm, topNode)
@@ -131,7 +132,10 @@ internal void WriteSharedItems(XmlElement fieldNode, XmlNamespaceManager nsm)
131132
var noTypes = GetNoOfTypes(flags);
132133
if (noTypes > 1 &&
133134
flags != (DataTypeFlags.Int | DataTypeFlags.Number) &&
134-
flags != (DataTypeFlags.Int | DataTypeFlags.Number | DataTypeFlags.Empty) &&
135+
flags != (DataTypeFlags.Float | DataTypeFlags.Number) &&
136+
flags != (DataTypeFlags.Int | DataTypeFlags.Number | DataTypeFlags.Float) &&
137+
flags != (DataTypeFlags.Int | DataTypeFlags.Number | DataTypeFlags.Empty) &&
138+
flags != (DataTypeFlags.Int | DataTypeFlags.Number | DataTypeFlags.Float | DataTypeFlags.Empty) &&
135139
SharedItems.Count > 1)
136140
{
137141
if ((flags & DataTypeFlags.String) == DataTypeFlags.String ||
@@ -255,7 +259,8 @@ private void SetFlags(XmlElement shNode, DataTypeFlags flags)
255259
{
256260
shNode.SetAttribute("containsNumber", "1");
257261
}
258-
if ((flags & DataTypeFlags.Int) == DataTypeFlags.Int)
262+
if ((flags & DataTypeFlags.Int) == DataTypeFlags.Int &&
263+
(flags & DataTypeFlags.Float) != DataTypeFlags.Float)
259264
{
260265
shNode.SetAttribute("containsInteger", "1");
261266
}
@@ -403,11 +408,15 @@ private DataTypeFlags GetFlags()
403408
case TypeCode.Double:
404409
case TypeCode.Single:
405410
flags |= (DataTypeFlags.Number);
406-
if((flags&DataTypeFlags.Int)!= DataTypeFlags.Int && (Convert.ToDouble(si)%1==0))
411+
if ((flags & DataTypeFlags.Int) != DataTypeFlags.Int && (Convert.ToDouble(si) % 1 == 0))
407412
{
408413
flags |= DataTypeFlags.Int;
409414
}
410-
break;
415+
else if ((flags & DataTypeFlags.Float) != DataTypeFlags.Float && (Convert.ToDouble(si) % 1 != 0))
416+
{
417+
flags |= DataTypeFlags.Float;
418+
}
419+
break;
411420
case TypeCode.DateTime:
412421
flags |= DataTypeFlags.DateTime;
413422
break;

src/EPPlusTest/Issues.cs

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2336,6 +2336,21 @@ public void VbaIssueLoad()
23362336
var vba = p.Workbook.VbaProject;
23372337
SaveAndCleanup(p);
23382338
}
2339-
}
2339+
}
2340+
[TestMethod]
2341+
public void Issue440()
2342+
{
2343+
using (var p = OpenTemplatePackage("issue440.xlsx"))
2344+
{
2345+
var wb = p.Workbook;
2346+
var worksheet = wb.Worksheets.Add("Pivot Tables");
2347+
var table = wb.Worksheets[0].Tables["Table1"];
2348+
ExcelPivotTable pt = worksheet.PivotTables.Add(worksheet.Cells["A1"], table, "PT1");
2349+
pt.RowFields.Add(pt.Fields["ColC"]);
2350+
pt.DataFields.Add(pt.Fields["ColB"]);
2351+
SaveAndCleanup(p);
2352+
}
2353+
}
2354+
23402355
}
23412356
}

0 commit comments

Comments
 (0)