Skip to content

Commit 7d18b6b

Browse files
committed
Merge branch 'feature/svg_chart_and_shape' of https://github.com/EPPlusSoftware/EPPlus into feature/svg_chart_and_shape
2 parents 8ff57cd + 1d26201 commit 7d18b6b

8 files changed

Lines changed: 332 additions & 259 deletions

File tree

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

Lines changed: 26 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ public void GenerateSvgForLineCharts_sheet1()
2020
var ws = p.Workbook.Worksheets[0];
2121
var renderer = new EPPlusImageRenderer.ImageRenderer();
2222

23-
//var ix = 2;
23+
//var ix = 4;
2424
//var c = ws.Drawings[ix];
2525
//var svg = renderer.RenderDrawingToSvg(c);
2626
//SaveTextFileToWorkbook($"svg\\ChartForSvg_ind{ix++}.svg", svg);
@@ -75,25 +75,45 @@ public void GenerateSvgForLineCharts_sheet3()
7575
}
7676
}
7777
[TestMethod]
78-
public void GenerateSvgForLineCharts()
78+
public void GenerateSvgForComboCharts_sheet4()
7979
{
8080
ExcelPackage.License.SetNonCommercialOrganization("EPPlus Project");
81-
using (var p = OpenTemplatePackage("LineChartRenderTest.xlsx"))
81+
using (var p = OpenTemplatePackage("ChartForSvg.xlsx"))
8282
{
83-
var ws = p.Workbook.Worksheets[0];
83+
var ws = p.Workbook.Worksheets[3];
8484
var renderer = new EPPlusImageRenderer.ImageRenderer();
8585
//var ix = 1;
8686
//var c = ws.Drawings[ix];
8787
//var svg = renderer.RenderDrawingToSvg(c);
88-
//SaveTextFileToWorkbook($"svg\\LineChartForSvg_Single{ix++}.svg", svg);
88+
//SaveTextFileToWorkbook($"svg\\ChartForSvg_sheet2_{ix++}.svg", svg);
8989
var ix = 1;
9090
foreach (ExcelChart c in ws.Drawings)
9191
{
9292
var svg = renderer.RenderDrawingToSvg(c);
93-
SaveTextFileToWorkbook($"svg\\LineChartForSvg{ix++}.svg", svg);
93+
SaveTextFileToWorkbook($"svg\\ChartForSvg_Combo_Sheet4{ix++}.svg", svg);
9494
}
9595
}
9696
}
97+
[TestMethod]
98+
public void GenerateSvgForLineCharts()
99+
{
100+
ExcelPackage.License.SetNonCommercialOrganization("EPPlus Project");
101+
using (var p = OpenTemplatePackage("LineChartRenderTest.xlsx"))
102+
{
103+
var ws = p.Workbook.Worksheets[0];
104+
var renderer = new EPPlusImageRenderer.ImageRenderer();
105+
var ix = 1;
106+
var c = ws.Drawings[ix];
107+
var svg = renderer.RenderDrawingToSvg(c);
108+
SaveTextFileToWorkbook($"svg\\LineChartForSvg_Single{ix++}.svg", svg);
109+
//var ix = 1;
110+
//foreach (ExcelChart c in ws.Drawings)
111+
//{
112+
// var svg = renderer.RenderDrawingToSvg(c);
113+
// SaveTextFileToWorkbook($"svg\\LineChartForSvg{ix++}.svg", svg);
114+
//}
115+
}
116+
}
97117

98118
[TestMethod]
99119
public void GenerateSvgForCharts_SecondaryAxis()

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

Lines changed: 40 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -298,7 +298,7 @@ private static DateTime CeilingToUnit(double value, eTimeUnit unit, int interval
298298
};
299299
}
300300

301-
internal static AxisScale CalculateByWidth(double min, double max, ITextMeasurer tm, AxisOptions options)
301+
internal static AxisScale CalculateByWidthAllowDiagonal(double min, double max, ITextMeasurer tm, AxisOptions options)
302302
{
303303
var ax = options.Axis;
304304
var plotAreaWidth = options.ChartSize.Bounds.Width;
@@ -337,7 +337,7 @@ internal static AxisScale CalculateByWidth(double min, double max, ITextMeasurer
337337
MajorDateUnit = unit,
338338
Min = min,
339339
Max = max,
340-
TextOrientation = eTextOrientation.Horizontal
340+
TextOrientation = eTextOrientation.Horizontal,
341341
};
342342
}
343343
else
@@ -350,7 +350,7 @@ internal static AxisScale CalculateByWidth(double min, double max, ITextMeasurer
350350
MajorDateUnit = unit,
351351
Min = min,
352352
Max = max,
353-
TextOrientation = eTextOrientation.Diagonal
353+
TextOrientation = eTextOrientation.Diagonal,
354354
};
355355
}
356356
}
@@ -365,7 +365,7 @@ internal static AxisScale CalculateByWidth(double min, double max, ITextMeasurer
365365
MajorDateUnit = unit,
366366
Min = min,
367367
Max = max,
368-
TextOrientation = ax.TextBody.VerticalText==OfficeOpenXml.Drawing.eTextVerticalType.Horizontal ? eTextOrientation.Horizontal : eTextOrientation.Vertical
368+
TextOrientation = ax.TextBody.VerticalText==OfficeOpenXml.Drawing.eTextVerticalType.Horizontal ? eTextOrientation.Horizontal : eTextOrientation.Vertical,
369369
};
370370
}
371371

@@ -487,10 +487,9 @@ private static bool FitAsVerticalDiagonalText(double min, double max, int interv
487487
}
488488
}
489489

490-
internal static AxisScale CalculateByHeight(double min, double max, ITextMeasurer tm, AxisOptions options)
490+
internal static AxisScale CalculateByWidthHeight(double widthOrHeight, double min, double max, ITextMeasurer tm, AxisOptions options)
491491
{
492492
var ax = options.Axis;
493-
var plotAreaHeight = options.ChartSize.Bounds.Height;
494493
var mf = ax.Font.GetMeasureFont();
495494
int interval;
496495
eTimeUnit unit;
@@ -505,11 +504,45 @@ internal static AxisScale CalculateByHeight(double min, double max, ITextMeasure
505504
{
506505
interval = 1;
507506
unit = eTimeUnit.Days;
507+
var range = max - min;
508+
509+
double axis_min, axis_max;
510+
if (options.AddPadding)
511+
{
512+
axis_min = options.LockedMin ?? Math.Floor((min - 0.5 * range) / interval) * interval;
513+
axis_max = options.LockedMax ?? Math.Ceiling((max + 0.2 * range) / interval) * interval;
514+
}
515+
else
516+
{
517+
axis_min = min;
518+
axis_max = max;
519+
}
508520
//Get interval for maximum width with vertical text.
509-
while(FitAsVerticalDiagonalText(min, max, interval, unit, res.Height, res.Height * 0.3, plotAreaHeight) == false)
521+
while (FitAsVerticalDiagonalText(axis_min, axis_max, interval, unit, res.Height, res.Height * 0.3, widthOrHeight) == false)
510522
{
511523
AddIntervall(ref interval, ref unit);
524+
double days;
525+
switch (unit)
526+
{
527+
case eTimeUnit.Months:
528+
days = 30 * interval;
529+
break;
530+
case eTimeUnit.Years:
531+
days = 365 * interval;
532+
break;
533+
default:
534+
days = interval;
535+
break;
536+
}
537+
538+
if (options.AddPadding)
539+
{
540+
axis_min = options.LockedMin ?? Math.Floor((min - 0.5 * range) / days) * days;
541+
axis_max = options.LockedMax ?? Math.Ceiling((max + 0.2 * range) / days) * days;
542+
}
512543
}
544+
min = axis_min;
545+
max = axis_max;
513546
}
514547

515548
return new AxisScale()

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: 9 additions & 14 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)
@@ -122,7 +115,7 @@ private void AddBar(ExcelBarChart chartType, ExcelBarChartSerie serie, List<List
122115
double yAxisStart;
123116
if (yAxis.Axis.Crosses == eCrosses.AutoZero)
124117
{
125-
yAxisStart = valAx.GetPositionInPlotarea(valAx.Min <= 0 ? 0D : yAxis.Min, true);
118+
yAxisStart = valAx.GetPositionInPlotarea(valAx.Min <= 0 ? 0D : valAx.Min, true);
126119
}
127120
else if (yAxis.Axis.Crosses == eCrosses.Min)
128121
{
@@ -149,18 +142,20 @@ private void AddBar(ExcelBarChart chartType, ExcelBarChartSerie serie, List<List
149142

150143
var y = ConvertUtil.GetValueDouble(valValues[i], false, true);
151144

152-
var xPos = catAx.GetPositionInPlotarea(x, true) + halfGap + position * barWidth * step;
145+
var rect = new SvgRenderRectItem(ChartRenderer, _svgChart.Plotarea.Rectangle.Bounds);
153146
var yPos = valAx.GetPositionInPlotarea(y);
154147

155-
var rect = new SvgRenderRectItem(ChartRenderer, _svgChart.Plotarea.Rectangle.Bounds);
156148
if (isColumn)
157149
{
150+
var xPos = catAx.GetPositionInPlotarea(x, true) + halfGap + position * barWidth * step;
158151
rect.Left = xPos;
159152
rect.Width = barWidth;
160153
}
161154
else
162155
{
163-
rect.Top = yWidth - xPos - barWidth;
156+
//var xPos = catAx.GetPositionInPlotarea(x, true) - halfGap - (position + 1) * barWidth * step;
157+
var xPos = catAx.GetPositionInPlotarea(x, true) + halfGap + position * barWidth * step;
158+
rect.Top = xPos;
164159
rect.Height = barWidth;
165160
}
166161

0 commit comments

Comments
 (0)