Skip to content

Commit cdcec2e

Browse files
committed
Merge branch 'feature/svg_chart_and_shape' of https://github.com/EPPlusSoftware/EPPlus into feature/svg_chart_and_shape
2 parents c447e55 + add9357 commit cdcec2e

14 files changed

Lines changed: 548 additions & 141 deletions

File tree

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
using OfficeOpenXml;
2+
using OfficeOpenXml.Drawing.Chart;
3+
4+
namespace EPPlus.Export.ImageRenderer.Tests.Chart
5+
{
6+
[TestClass]
7+
public class BarChartTests : TestBase
8+
{
9+
[TestMethod]
10+
public void GenerateSvgForBarCharts1()
11+
{
12+
ExcelPackage.License.SetNonCommercialOrganization("EPPlus Project");
13+
using (var p = OpenTemplatePackage("BarChartForSvg.xlsx"))
14+
{
15+
var ws = p.Workbook.Worksheets[0];
16+
var renderer = new EPPlusImageRenderer.ImageRenderer();
17+
18+
//var ix = 1;
19+
//var c = ws.Drawings[ix];
20+
//var svg = renderer.RenderDrawingToSvg(c);
21+
//SaveTextFileToWorkbook($"svg\\ChartForSvg_ind{ix++}.svg", svg);
22+
23+
var ix = 0;
24+
foreach (ExcelChart c in ws.Drawings)
25+
{
26+
var svg = renderer.RenderDrawingToSvg(c);
27+
SaveTextFileToWorkbook($"svg\\BarChartForSvg_sheet1_{ix++}.svg", svg);
28+
}
29+
}
30+
}
31+
[TestMethod]
32+
public void GenerateSvgForBarCharts2()
33+
{
34+
ExcelPackage.License.SetNonCommercialOrganization("EPPlus Project");
35+
using (var p = OpenTemplatePackage("BarChartForSvg.xlsx"))
36+
{
37+
var ws = p.Workbook.Worksheets[1];
38+
var renderer = new EPPlusImageRenderer.ImageRenderer();
39+
40+
//var ix = 2;
41+
//var c = ws.Drawings[ix];
42+
//var svg = renderer.RenderDrawingToSvg(c);
43+
//SaveTextFileToWorkbook($"svg\\ChartForSvg_ind{ix++}.svg", svg);
44+
45+
var ix = 0;
46+
foreach (ExcelChart c in ws.Drawings)
47+
{
48+
var svg = renderer.RenderDrawingToSvg(c);
49+
SaveTextFileToWorkbook($"svg\\BarChartForSvg_sheet2_{ix++}.svg", svg);
50+
}
51+
}
52+
}
53+
}
54+
}

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ public void GenerateSvgForColumnCharts1()
2929
foreach (ExcelChart c in ws.Drawings)
3030
{
3131
var svg = renderer.RenderDrawingToSvg(c);
32-
SaveTextFileToWorkbook($"svg\\BarChartForSvg_sheet1_{ix++}.svg", svg);
32+
SaveTextFileToWorkbook($"svg\\ColumnChartForSvg_sheet1_{ix++}.svg", svg);
3333
}
3434
}
3535
}
@@ -42,7 +42,7 @@ public void GenerateSvgForColumnCharts2()
4242
var ws = p.Workbook.Worksheets[1];
4343
var renderer = new EPPlusImageRenderer.ImageRenderer();
4444

45-
//var ix = 1;
45+
//var ix = 2;
4646
//var c = ws.Drawings[ix];
4747
//var svg = renderer.RenderDrawingToSvg(c);
4848
//SaveTextFileToWorkbook($"svg\\ChartForSvg_ind{ix++}.svg", svg);
@@ -51,7 +51,7 @@ public void GenerateSvgForColumnCharts2()
5151
foreach (ExcelChart c in ws.Drawings)
5252
{
5353
var svg = renderer.RenderDrawingToSvg(c);
54-
SaveTextFileToWorkbook($"svg\\BarChartForSvg_sheet2_{ix++}.svg", svg);
54+
SaveTextFileToWorkbook($"svg\\ColumnChartForSvg_sheet2_{ix++}.svg", svg);
5555
}
5656
}
5757
}

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

Lines changed: 11 additions & 11 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 = 1;
23+
//var ix = 2;
2424
//var c = ws.Drawings[ix];
2525
//var svg = renderer.RenderDrawingToSvg(c);
2626
//SaveTextFileToWorkbook($"svg\\ChartForSvg_ind{ix++}.svg", svg);
@@ -123,16 +123,16 @@ public void GenerateSvgForCharts_SecondaryAxis_sheet2()
123123
{
124124
var ws = p.Workbook.Worksheets[1];
125125
var renderer = new EPPlusImageRenderer.ImageRenderer();
126-
//var ix = 3;
127-
//var c = ws.Drawings[ix];
128-
//var svg = renderer.RenderDrawingToSvg(c);
129-
//SaveTextFileToWorkbook($"svg\\ChartForSvg_sheet2_{ix++}.svg", svg);
130-
var ix = 1;
131-
foreach (ExcelChart c in ws.Drawings)
132-
{
133-
var svg = renderer.RenderDrawingToSvg(c);
134-
SaveTextFileToWorkbook($"svg\\ChartForSvg_Sheet2_SecAxis{ix++}.svg", svg);
135-
}
126+
var ix = 2;
127+
var c = ws.Drawings[ix];
128+
var svg = renderer.RenderDrawingToSvg(c);
129+
SaveTextFileToWorkbook($"svg\\ChartForSvg_sheet2_{ix++}.svg", svg);
130+
//var ix = 1;
131+
//foreach (ExcelChart c in ws.Drawings)
132+
//{
133+
// var svg = renderer.RenderDrawingToSvg(c);
134+
// SaveTextFileToWorkbook($"svg\\ChartForSvg_Sheet2_SecAxis{ix++}.svg", svg);
135+
//}
136136
}
137137
}
138138
[TestMethod]

src/EPPlus.Export.ImageRenderer/RenderItems/SvgItem/SvgTextBox.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -213,7 +213,10 @@ internal override void AppendRenderItems(List<RenderItem> renderItems)
213213
{
214214
rect.Bounds.Left = -rect.Bounds.Width;
215215
}
216-
rect.Bounds.Left = 0;
216+
else
217+
{
218+
rect.Bounds.Left = 0;
219+
}
217220
rect.Bounds.Top = 0;
218221
renderItems.Add(titleItem);
219222
renderItems.Add(rect);

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

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -486,5 +486,43 @@ private static bool FitAsVerticalDiagonalText(double min, double max, int interv
486486

487487
}
488488
}
489+
490+
internal static AxisScale CalculateByHeight(double min, double max, ITextMeasurer tm, AxisOptions options)
491+
{
492+
var ax = options.Axis;
493+
var plotAreaHeight = options.ChartSize.Bounds.Height;
494+
var mf = ax.Font.GetMeasureFont();
495+
int interval;
496+
eTimeUnit unit;
497+
var minString = DateTime.FromOADate(min).ToString(options.NumberFormat);
498+
var res = tm.MeasureText(minString, mf);
499+
if (options.LockedInterval.HasValue)
500+
{
501+
interval = (int)options.LockedInterval.Value;
502+
unit = options.LockedIntervalUnit ?? eTimeUnit.Days;
503+
}
504+
else
505+
{
506+
interval = 1;
507+
unit = eTimeUnit.Days;
508+
//Get interval for maximum width with vertical text.
509+
while(FitAsVerticalDiagonalText(min, max, interval, unit, res.Height, res.Height * 0.3, plotAreaHeight) == false)
510+
{
511+
AddIntervall(ref interval, ref unit);
512+
}
513+
}
514+
515+
return new AxisScale()
516+
{
517+
MajorInterval = interval,
518+
MinorInterval = 1,
519+
MinorDateUnit = unit,
520+
MajorDateUnit = unit,
521+
Min = min,
522+
Max = max,
523+
TextOrientation = eTextOrientation.Horizontal
524+
};
525+
526+
}
489527
}
490528
}

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

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,11 @@ private static AxisScale GetNumberScale(ref double dataMin, ref double dataMax,
105105
dataMax = axisOptions.LockedMax.Value;
106106
}
107107

108+
if (axisOptions.LockedMin.HasValue==false && dataMin / dataMax > 0.666666)
109+
{
110+
dataMin = 0;
111+
}
112+
108113
double dataRange = dataMax - dataMin;
109114

110115
double axisMin;
@@ -122,9 +127,16 @@ private static AxisScale GetNumberScale(ref double dataMin, ref double dataMax,
122127
else
123128
{
124129
axisMin = dataMin - (dataRange * 0.05);
125-
if (axisOptions.IsStacked100 && axisMin < -1)
130+
if (axisOptions.IsStacked100)
126131
{
127-
axisMin = -1;
132+
if (axisMin < -1)
133+
{
134+
axisMin = -1;
135+
}
136+
else if(axisMin>0)
137+
{
138+
axisMin = 0;
139+
}
128140
}
129141
//Normalize to zero if all data is positive or negative
130142
if (axisMin < 0 && isAllPositive)
@@ -160,11 +172,19 @@ private static AxisScale GetNumberScale(ref double dataMin, ref double dataMax,
160172
}
161173
else
162174
{
163-
// Calculate interval
164175
roughInterval = (dataMax - dataMin) / desiredTicks;
165176
scaleInterval = GetScaleNumber(roughInterval, true);
177+
if (dataMin / dataMax >= 0.666666666)
178+
{
179+
axisMin = 0;
180+
}
181+
else
182+
{
183+
axisMin = Math.Floor(dataMin / scaleInterval) * scaleInterval;
184+
}
185+
186+
// Calculate interval
166187

167-
axisMin = dataMin;
168188
axisMax = dataMax;
169189
}
170190

0 commit comments

Comments
 (0)