Skip to content

Commit 1d26201

Browse files
committed
WIP:Fixed Legend and rendering issues.
1 parent 67d806d commit 1d26201

6 files changed

Lines changed: 66 additions & 29 deletions

File tree

src/EPPlus.Export.ImageRenderer.Test/Chart/ColumnChartTests.cs

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -42,17 +42,17 @@ public void GenerateSvgForColumnCharts2()
4242
var ws = p.Workbook.Worksheets[1];
4343
var renderer = new EPPlusImageRenderer.ImageRenderer();
4444

45-
var ix = 2;
46-
var c = ws.Drawings[ix];
47-
var svg = renderer.RenderDrawingToSvg(c);
48-
SaveTextFileToWorkbook($"svg\\ChartForSvg_ind{ix++}.svg", svg);
45+
//var ix = 2;
46+
//var c = ws.Drawings[ix];
47+
//var svg = renderer.RenderDrawingToSvg(c);
48+
//SaveTextFileToWorkbook($"svg\\ChartForSvg_ind{ix++}.svg", svg);
4949

50-
//var ix = 0;
51-
//foreach (ExcelChart c in ws.Drawings)
52-
//{
53-
// var svg = renderer.RenderDrawingToSvg(c);
54-
// SaveTextFileToWorkbook($"svg\\ColumnChartForSvg_sheet2_{ix++}.svg", svg);
55-
//}
50+
var ix = 0;
51+
foreach (ExcelChart c in ws.Drawings)
52+
{
53+
var svg = renderer.RenderDrawingToSvg(c);
54+
SaveTextFileToWorkbook($"svg\\ColumnChartForSvg_sheet2_{ix++}.svg", svg);
55+
}
5656
}
5757
}
5858
}

src/EPPlus.Export.ImageRenderer.Test/Chart/LineChartToSvgTests.cs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,26 @@ public void GenerateSvgForLineCharts_sheet3()
7575
}
7676
}
7777
[TestMethod]
78+
public void GenerateSvgForComboCharts_sheet4()
79+
{
80+
ExcelPackage.License.SetNonCommercialOrganization("EPPlus Project");
81+
using (var p = OpenTemplatePackage("ChartForSvg.xlsx"))
82+
{
83+
var ws = p.Workbook.Worksheets[3];
84+
var renderer = new EPPlusImageRenderer.ImageRenderer();
85+
//var ix = 1;
86+
//var c = ws.Drawings[ix];
87+
//var svg = renderer.RenderDrawingToSvg(c);
88+
//SaveTextFileToWorkbook($"svg\\ChartForSvg_sheet2_{ix++}.svg", svg);
89+
var ix = 1;
90+
foreach (ExcelChart c in ws.Drawings)
91+
{
92+
var svg = renderer.RenderDrawingToSvg(c);
93+
SaveTextFileToWorkbook($"svg\\ChartForSvg_Combo_Sheet4{ix++}.svg", svg);
94+
}
95+
}
96+
}
97+
[TestMethod]
7898
public void GenerateSvgForLineCharts()
7999
{
80100
ExcelPackage.License.SetNonCommercialOrganization("EPPlus Project");

src/EPPlus.Export.ImageRenderer/Svg/Chart/Axis/ValueAxisScaleCalculator.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,10 @@ private static AxisScale GetNumberScale(ref double dataMin, ref double dataMax,
161161
{
162162
axisMax = 0;
163163
}
164+
if (axisOptions.LockedMin.HasValue==false && axisMin > 0 && dataMin / dataMax >= 0.2)
165+
{
166+
axisMin = 0;
167+
}
164168
}
165169

166170
// Calculate interval
@@ -174,7 +178,7 @@ private static AxisScale GetNumberScale(ref double dataMin, ref double dataMax,
174178
{
175179
roughInterval = (dataMax - dataMin) / desiredTicks;
176180
scaleInterval = GetScaleNumber(roughInterval, true);
177-
if (dataMin / dataMax >= 0.666666666)
181+
if (dataMin / dataMax >= 0.2)
178182
{
179183
axisMin = 0;
180184
}

src/EPPlus.Export.ImageRenderer/Svg/Chart/ChartTypeDrawers/BarColumnChartTypeDrawer.cs

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -28,16 +28,8 @@ internal BarColumnChartTypeDrawer(SvgChart svgChart, ExcelBarChart chartType) :
2828
foreach (ExcelBarChartSerie serie in chartType.Series)
2929
{
3030
List<object> valValue,catValue;
31-
//if (chartType.IsTypeColumn())
32-
//{
33-
valValue = LoadSeriesValues(serie.Series, serie.NumberLiteralsY, serie.StringLiteralsY);
34-
catValue = LoadSeriesValues(serie.XSeries, serie.NumberLiteralsX, serie.StringLiteralsX);
35-
//}
36-
//else
37-
//{
38-
// catValue = LoadSeriesValues(serie.Series, serie.NumberLiteralsY, serie.StringLiteralsY);
39-
// valValue = LoadSeriesValues(serie.XSeries, serie.NumberLiteralsX, serie.StringLiteralsX);
40-
//}
31+
valValue = LoadSeriesValues(serie.Series, serie.NumberLiteralsY, serie.StringLiteralsY);
32+
catValue = LoadSeriesValues(serie.XSeries, serie.NumberLiteralsX, serie.StringLiteralsX);
4133

4234
catValues.Add(catValue);
4335
valValues.Add(valValue);
@@ -79,6 +71,7 @@ internal BarColumnChartTypeDrawer(SvgChart svgChart, ExcelBarChart chartType) :
7971
// }
8072
//}
8173
}
74+
8275
RenderItems.Add(new SvgEndGroupItem(ChartRenderer, null));
8376

8477
foreach (var dataLabel in serieDataLabels)

src/EPPlus.Export.ImageRenderer/Svg/Chart/SvgChartAxis.cs

Lines changed: 26 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -471,7 +471,7 @@ private List<SvgTextBox> GetAxisValueTextBoxes()
471471
}
472472
}
473473
}
474-
else if(LabelOrientation==eTextOrientation.Horizontal && Axis.AxisType==eAxisType.Cat) //Only apples when labels are horizontally aligned
474+
else if(LabelOrientation==eTextOrientation.Horizontal && IsCatAx()) //Only apples when labels are horizontally aligned
475475
{
476476
//Align the axis labels according to the label alignment setting. This is only relevant for horizontal axis, vertical axis are always right aligned.
477477
var lblAlignment = (Axis as ExcelChartAxisStandard)?.LabelAlignment??OfficeOpenXml.eAxisLabelAlignment.Center;
@@ -495,6 +495,11 @@ private List<SvgTextBox> GetAxisValueTextBoxes()
495495
return ret;
496496
}
497497

498+
private bool IsCatAx()
499+
{
500+
return Axis.AxisType == eAxisType.Cat || (Axis.AxisType == eAxisType.Date && IsDateScale==false);
501+
}
502+
498503
private double GetAxisItemLeft(int i, OfficeOpenXml.Interfaces.Drawing.Text.TextMeasurement m)
499504
{
500505
if (Axis.IsVertical)
@@ -503,11 +508,11 @@ private double GetAxisItemLeft(int i, OfficeOpenXml.Interfaces.Drawing.Text.Text
503508
}
504509
else
505510
{
506-
if (Axis.AxisType == eAxisType.Cat || (Axis.AxisType == eAxisType.Date && IsDateScale == false))
511+
if (IsCatAx())
507512
{
508513
var majorWidth = Rectangle.Width / AxisValues.Count;
509514
var majorTickStartingPosition = Rectangle.Left + majorWidth * i;
510-
return majorTickStartingPosition + majorWidth / 2 - m.Width / 2;
515+
return majorTickStartingPosition;
511516
}
512517
else
513518
{
@@ -573,13 +578,14 @@ private double GetAxisItemTop(int i, OfficeOpenXml.Interfaces.Drawing.Text.TextM
573578
}
574579
else
575580
{
576-
var majorHeight = Rectangle.Height / (AxisValues.Count - 1);
577581
if (Axis.AxisType == eAxisType.Cat || Axis.AxisType == eAxisType.Date)
578582
{
579-
return Rectangle.Top + majorHeight * (AxisValues.Count - i - 1) + (majorHeight / 2) - m.Height / 2;
583+
var majorHeight = Rectangle.Height / (AxisValues.Count);
584+
return Rectangle.Top + majorHeight * (AxisValues.Count - i) - ((majorHeight / 2) + m.Height / 2);
580585
}
581586
else
582-
{
587+
{
588+
var majorHeight = Rectangle.Height / (AxisValues.Count-1);
583589
return Rectangle.Top + majorHeight * (AxisValues.Count - i - 1);
584590
//return Rectangle.Top + majorHeight * (AxisValues.Count - i - 1);
585591
}
@@ -846,6 +852,12 @@ internal double GetPositionInPlotarea(double val, bool startValue=false)
846852
return majorHeight * val + (majorHeight / 2);
847853
}
848854
}
855+
else if (Axis.AxisType == eAxisType.Date && IsDateScale == false)
856+
{
857+
if (val < Min || val > Max) return double.NaN;
858+
var diff = Max - Min + 1;
859+
return (((val - Min) / diff * SvgChart.Plotarea.Rectangle.Height));
860+
}
849861
else
850862
{
851863
if (val < Min || val > Max) return double.NaN;
@@ -867,6 +879,12 @@ internal double GetPositionInPlotarea(double val, bool startValue=false)
867879
return majorWidth * val + (majorWidth / 2);
868880
}
869881
}
882+
else if(Axis.AxisType == eAxisType.Date && IsDateScale==false)
883+
{
884+
if (val < Min || val > Max) return double.NaN;
885+
var diff = Max - Min + 1;
886+
return (((val - Min) / diff * SvgChart.Plotarea.Rectangle.Width));
887+
}
870888
else
871889
{
872890
if (val < Min || val > Max) return double.NaN;
@@ -967,12 +985,14 @@ protected List<object> GetAxisValue(ExcelChartAxisStandard ax, RenderItem rect,
967985
res = DateAxisScaleCalculator.CalculateByWidthAllowDiagonal(min ?? 0D, max ?? 0D, SvgChart.TextMeasurer, options);
968986
}
969987
}
988+
970989
orientation = res.TextOrientation;
971990
dateUnit = res.MajorDateUnit;
972991
majorUnit = res.MajorInterval;
973992
var dt = DateTime.FromOADate(res.Min);
974993
var maxDt = DateTime.FromOADate(res.Max);
975994
IsDateScale = (dateUnit != eTimeUnit.Days || majorUnit > 1) && values.Count > 31;
995+
976996
while (dt <= maxDt)
977997
{
978998
l.Add(dt);

src/EPPlus.Export.ImageRenderer/Svg/Chart/SvgChartLegend.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -407,7 +407,7 @@ private SvgRenderRectItem GetBarSeriesIcon(SvgChart sc, ExcelChartStandardSerie
407407
var item = new SvgRenderRectItem(sc, Rectangle.Bounds);
408408
item.SetDrawingPropertiesFill(cStandardSerie.Fill, sc.Chart.StyleManager.Style.SeriesLine.FillReference.Color);
409409
item.SetDrawingPropertiesBorder(cStandardSerie.Border, sc.Chart.StyleManager.Style.SeriesLine.BorderReference.Color, cStandardSerie.Border.Fill.Style != eFillStyle.NoFill, 0.75);
410-
var iconHeight = GetIconLenght(sc, tm.Height);
410+
var iconHeight = GetIconLenght(sc, entryHeight);
411411
var icon = pSls?.SeriesIcon as SvgRenderRectItem;
412412

413413
GetItemPosition(sc, pTm, tm, pSls, entryWidth, entryHeight, icon?.Left ?? 0D, icon?.Top ?? 0D, out double x, out double y);
@@ -458,7 +458,7 @@ private double GetItemPosition(SvgChart sc, TextMeasurement pTm, TextMeasurement
458458
{
459459
if (pSls == null)
460460
{
461-
y = TopMargin + tm.Height / 2;
461+
y = TopMargin;
462462
}
463463
else
464464
{

0 commit comments

Comments
 (0)