Skip to content

Commit f1cdb05

Browse files
Bug/s1037 (#2338)
* Began handling unique case: Group shape in exChart * Stopped the crashing. Positions appear inaccurate * Fixes issue #2337 --------- Co-authored-by: Ossian Edström <ossian.edstrom@epplussoftware.com>
1 parent 4c2071f commit f1cdb05

4 files changed

Lines changed: 76 additions & 35 deletions

File tree

src/EPPlus/Drawing/Chart/ExcelChart.cs

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -762,7 +762,16 @@ internal static ExcelChart GetChart(ExcelDrawings drawings, XmlNode node, ExcelG
762762

763763
internal static ExcelChartEx GetChartEx(ExcelDrawings drawings, XmlNode node, ExcelGroupShape parent = null)
764764
{
765-
XmlNode chartDrawingNode = node.SelectSingleNode("mc:AlternateContent/mc:Choice/xdr:graphicFrame/a:graphic/a:graphicData/cx:chart", drawings.NameSpaceManager);
765+
XmlNode chartDrawingNode;
766+
if (node.Name == "mc:AlternateContent")
767+
{
768+
chartDrawingNode = node.SelectSingleNode("mc:Choice/xdr:graphicFrame/a:graphic/a:graphicData/cx:chart", drawings.NameSpaceManager);
769+
}
770+
else
771+
{
772+
chartDrawingNode = node.SelectSingleNode("mc:AlternateContent/mc:Choice/xdr:graphicFrame/a:graphic/a:graphicData/cx:chart", drawings.NameSpaceManager);
773+
}
774+
766775
if (chartDrawingNode != null)
767776
{
768777
var drawingRelation = drawings.Part.GetRelationship(chartDrawingNode.Attributes["r:id"].Value);
@@ -776,25 +785,25 @@ internal static ExcelChartEx GetChartEx(ExcelDrawings drawings, XmlNode node, Ex
776785
var layoutId = chartNode.SelectSingleNode("cx:plotArea/cx:plotAreaRegion/cx:series[1]/@layoutId", drawings.NameSpaceManager);
777786
if (layoutId == null)
778787
{
779-
return new ExcelTreemapChart(drawings, node, uriChart, part, chartXml, chartNode);
788+
return new ExcelTreemapChart(drawings, node, uriChart, part, chartXml, chartNode, parent);
780789
}
781790
switch (layoutId.Value)
782791
{
783792
case "treemap":
784-
return new ExcelTreemapChart(drawings, node, uriChart, part, chartXml, chartNode);
793+
return new ExcelTreemapChart(drawings, node, uriChart, part, chartXml, chartNode, parent);
785794
case "sunburst":
786-
return new ExcelSunburstChart(drawings, node, uriChart, part, chartXml, chartNode);
795+
return new ExcelSunburstChart(drawings, node, uriChart, part, chartXml, chartNode, parent);
787796
case "boxWhisker":
788-
return new ExcelBoxWhiskerChart(drawings, node, uriChart, part, chartXml, chartNode);
797+
return new ExcelBoxWhiskerChart(drawings, node, uriChart, part, chartXml, chartNode, parent);
789798
case "clusteredColumn":
790799
case "pareto":
791-
return new ExcelHistogramChart(drawings, node, uriChart, part, chartXml, chartNode);
800+
return new ExcelHistogramChart(drawings, node, uriChart, part, chartXml, chartNode, parent);
792801
case "funnel":
793-
return new ExcelFunnelChart(drawings, node, uriChart, part, chartXml, chartNode);
802+
return new ExcelFunnelChart(drawings, node, uriChart, part, chartXml, chartNode, parent);
794803
case "waterfall":
795-
return new ExcelWaterfallChart(drawings, node, uriChart, part, chartXml, chartNode);
804+
return new ExcelWaterfallChart(drawings, node, uriChart, part, chartXml, chartNode, parent);
796805
case "regionMap":
797-
return new ExcelRegionMapChart(drawings, node, uriChart, part, chartXml, chartNode);
806+
return new ExcelRegionMapChart(drawings, node, uriChart, part, chartXml, chartNode, parent);
798807
default:
799808
throw new NotSupportedException($"Unsupported chart layout {layoutId.Value}");
800809
}

src/EPPlus/Drawing/ExcelDrawing.cs

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -644,7 +644,7 @@ internal static ExcelDrawing GetDrawingFromNode(ExcelDrawings drawings, XmlNode
644644
}
645645
break;
646646
}
647-
return new ExcelDrawing(drawings, node, "", "");
647+
return new ExcelDrawing(drawings, node, "", "",parent, DrawingsType);
648648
}
649649

650650
private static ExcelDrawing GetShapeOrControl(ExcelDrawings drawings, XmlNode node, XmlElement drawNode, ExcelGroupShape parent, DrawingsCollectionType collectionType = DrawingsCollectionType.Worksheet)
@@ -813,19 +813,22 @@ internal int GetPixelTop()
813813
}
814814
else
815815
{
816-
var cache = _drawings.Worksheet.RowHeightCache;
817-
for (int row = 0; row < From.Row; row++)
816+
if (From != null)
818817
{
819-
lock (cache)
818+
var cache = _drawings.Worksheet.RowHeightCache;
819+
for (int row = 0; row < From.Row; row++)
820820
{
821-
if (!cache.ContainsKey(row))
821+
lock (cache)
822822
{
823-
cache.Add(row, _drawings.Worksheet.GetRowHeight(row + 1));
823+
if (!cache.ContainsKey(row))
824+
{
825+
cache.Add(row, _drawings.Worksheet.GetRowHeight(row + 1));
826+
}
824827
}
828+
pix += (int)(cache[row] / 0.75);
825829
}
826-
pix += (int)(cache[row] / 0.75);
830+
pix += From.RowOff / EMU_PER_PIXEL;
827831
}
828-
pix += From.RowOff / EMU_PER_PIXEL;
829832
}
830833
return pix;
831834
}

src/EPPlus/Drawing/ExcelGroupShape.cs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,10 +51,13 @@ private void AddDrawings()
5151
if (node.LocalName != "nvGrpSpPr" && node.LocalName != "grpSpPr")
5252
{
5353
var grpDraw = ExcelDrawing.GetDrawingFromNode(_parent._drawings, node, (XmlElement)node, _parent, _drawingsCollectionType);
54-
_groupDrawings.Add(grpDraw);
55-
if (_drawingNames.ContainsKey(grpDraw.Name) == false)
54+
if(grpDraw != null)
5655
{
57-
_drawingNames.Add(grpDraw.Name, _groupDrawings.Count - 1);
56+
_groupDrawings.Add(grpDraw);
57+
if (_drawingNames.ContainsKey(grpDraw.Name) == false)
58+
{
59+
_drawingNames.Add(grpDraw.Name, _groupDrawings.Count - 1);
60+
}
5861
}
5962
}
6063
}

src/EPPlusTest/Issues/ChartIssues.cs

Lines changed: 41 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -399,9 +399,9 @@ public void s968()
399399
SaveAndCleanup(package);
400400
}
401401

402-
[TestMethod]
403-
public void CreateStringLiterals()
404-
{
402+
[TestMethod]
403+
public void CreateStringLiterals()
404+
{
405405
using (var package = OpenPackage("LiteralsSetting.xlsx", true))
406406
{
407407
var wb = package.Workbook;
@@ -411,23 +411,49 @@ public void CreateStringLiterals()
411411

412412
var serie = numLitChart.Series.Add("{10,20,50}");
413413
serie.XSeries = "{'col1','col2','col3'}";
414-
SaveAndCleanup(package);
415-
}
416-
}
417-
[TestMethod]
418-
public void s981()
419-
{
420-
using (var package = OpenTemplatePackage("s981.xlsx"))
421-
{
422-
var wb = package.Workbook;
423-
var ws = wb.Worksheets["Summary"];
414+
SaveAndCleanup(package);
415+
}
416+
}
417+
[TestMethod]
418+
public void s981()
419+
{
420+
using (var package = OpenTemplatePackage("s981.xlsx"))
421+
{
422+
var wb = package.Workbook;
423+
var ws = wb.Worksheets["Summary"];
424424

425425
var chart = ws.Drawings[0].As.Chart.ScatterChart;
426426

427-
chart.StyleManager.SetChartStyle(ePresetChartStyleMultiSeries.ScatterChartStyle3);
427+
chart.StyleManager.SetChartStyle(ePresetChartStyleMultiSeries.ScatterChartStyle3);
428+
429+
SaveAndCleanup(package);
430+
}
431+
}
432+
433+
[TestMethod]
434+
public void s1037()
435+
{
436+
using (var package = OpenTemplatePackage("s1037.xlsx"))
437+
{
438+
//Crashes on save (also accesssing)
439+
SaveAndCleanup(package);
440+
}
441+
}
442+
443+
[TestMethod]
444+
public void s1038()
445+
{
446+
using (var package = OpenTemplatePackage("s1038.xlsx"))
447+
{
448+
var worksheet = package.Workbook.Worksheets["Tabelle1"];
449+
var groupShape = worksheet.Drawings[0] as ExcelGroupShape;
450+
451+
//Crashes when accessesing
452+
var drawingsWithinGroupShape = groupShape.Drawings;
428453

429-
SaveAndCleanup(package);
454+
SaveAndCleanup(package);
430455
}
431456
}
457+
432458
}
433459
}

0 commit comments

Comments
 (0)