Skip to content

Commit 67d806d

Browse files
committed
Merge branch 'feature/svg_chart_and_shape' of https://github.com/EPPlusSoftware/EPPlus into feature/svg_chart_and_shape
2 parents 58ea132 + 3b2818e commit 67d806d

4 files changed

Lines changed: 129 additions & 2 deletions

File tree

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
using OfficeOpenXml;
2+
using OfficeOpenXml.Drawing.Chart;
3+
using System;
4+
using System.Collections.Generic;
5+
using System.Linq;
6+
using System.Text;
7+
8+
namespace EPPlus.Export.ImageRenderer.Tests.Chart
9+
{
10+
internal class PieChartTests : TestBase
11+
{
12+
[TestMethod]
13+
public void GenerateSvgForColumnCharts1()
14+
{
15+
ExcelPackage.License.SetNonCommercialOrganization("EPPlus Project");
16+
using (var p = OpenTemplatePackage("BasicPieChart.xlsx"))
17+
{
18+
var ws = p.Workbook.Worksheets[0];
19+
var renderer = new EPPlusImageRenderer.ImageRenderer();
20+
21+
var ix = 0;
22+
foreach (ExcelChart c in ws.Drawings)
23+
{
24+
var svg = renderer.RenderDrawingToSvg(c);
25+
SaveTextFileToWorkbook($"svg\\ChartForSvg{ix++}.svg", svg);
26+
}
27+
}
28+
}
29+
}
30+
}

src/EPPlus.Export.ImageRenderer/RenderItems/PathCommandType.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ internal enum PathCommandType : byte
2020
VerticalLine = 3,
2121
CubicBézier = 4,
2222
QuadraticBézier = 5,
23-
Arc=6,
23+
Arc = 6,
2424
End = 0xFF
2525
}
2626

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
using EPPlus.Graphics;
2+
using EPPlusImageRenderer;
3+
using EPPlusImageRenderer.RenderItems;
4+
using EPPlusImageRenderer.Svg;
5+
using OfficeOpenXml.Drawing;
6+
using OfficeOpenXml.Drawing.Chart;
7+
using OfficeOpenXml.FormulaParsing.Excel.Functions.Text;
8+
using OfficeOpenXml.Utils.TypeConversion;
9+
using System;
10+
using System.Collections.Generic;
11+
using System.Linq;
12+
using System.Text;
13+
14+
namespace EPPlus.Export.ImageRenderer.Svg.Chart.ChartTypeDrawers
15+
{
16+
internal class PieChartTypeDrawer : ChartTypeDrawer
17+
{
18+
List<object> catValues = new List<object>();
19+
List<object> valValues = new List<object>();
20+
List<double> valPercent = new List<double>();
21+
List<double> circleSectorAngle = new List<double>();
22+
23+
List<Coordinate> endCoordOffsetFromCenterOfCircle = new List<Coordinate>();
24+
25+
public PieChartTypeDrawer(SvgChart chart, ExcelPieChart chartType) : base(chart, chartType)
26+
{
27+
var groupItem = new SvgGroupItem(ChartRenderer, _svgChart.Plotarea.Rectangle.Bounds);
28+
RenderItems.Add(groupItem);
29+
var xValues = new List<List<object>>();
30+
var yValues = new List<List<object>>();
31+
int serCounter = 0;
32+
33+
foreach (ExcelPieChartSerie serie in chartType.Series)
34+
{
35+
List<object> valValue, catValue;
36+
37+
valValue = LoadSeriesValues(serie.Series, serie.NumberLiteralsY, serie.StringLiteralsY);
38+
catValue = LoadSeriesValues(serie.XSeries, serie.NumberLiteralsX, serie.StringLiteralsX);
39+
40+
catValues.Add(catValue);
41+
valValues.Add(valValue);
42+
43+
serCounter++;
44+
}
45+
46+
double valTotal = 0;
47+
List<double> valValuesDoubles = new List<double>();
48+
49+
for(int i = 0; i< valValues.Count; i++)
50+
{
51+
valValuesDoubles.Add(ConvertUtil.GetValueDouble(valValues[i], false, true));
52+
valTotal += valValuesDoubles[i];
53+
}
54+
55+
var cx = _svgChart.Plotarea.Rectangle.Bounds.Width / 2;
56+
var cy = _svgChart.Plotarea.Rectangle.Bounds.Height / 2;
57+
58+
var radius = Math.Min(_svgChart.Plotarea.Rectangle.Bounds.Height, _svgChart.Plotarea.Rectangle.Bounds.Width);
59+
60+
61+
for (int i = 0; i < valValues.Count; i++)
62+
{
63+
valPercent.Add(valValuesDoubles[i] / valTotal);
64+
circleSectorAngle.Add(valPercent[i] / 360d);
65+
var xPoint = cx + (radius * Math.Cos(circleSectorAngle[i]));
66+
var yPoint = cy + (radius * Math.Sin(circleSectorAngle[i]));
67+
endCoordOffsetFromCenterOfCircle.Add(new Coordinate(xPoint, yPoint));
68+
}
69+
70+
var count = Math.Min(catValues.Count, valValues.Count);
71+
for (var i = 0; i < catValues.Count; i++)
72+
{
73+
var serie = (ExcelPieChartSerie)chartType.Series[i];
74+
75+
var total = ConvertUtil.GetValueDouble(catValues[i], false, true);
76+
77+
var dataPoints = new List<BoundingBox>();
78+
79+
//Add the slice.
80+
AddSlice(chartType, serie, catValues, valValues, dataPoints, count, i, radius);
81+
82+
83+
}
84+
RenderItems.Add(new SvgEndGroupItem(ChartRenderer, null));
85+
}
86+
87+
private void AddSlice(ExcelPieChart chartType, ExcelPieChartSerie serie, List<object> catSeries, List<object> valSeries, List<BoundingBox> dataPoints, int seriesCount, int position, double radius)
88+
{
89+
var slice = new SvgRenderEllipseItem(ChartRenderer, _svgChart.Plotarea.Rectangle.Bounds);
90+
91+
92+
slice.SetDrawingPropertiesFill(serie.Fill, chartType.StyleManager.Style.SeriesAxis.FillReference.Color);
93+
slice.SetDrawingPropertiesBorder(serie.Border, chartType.StyleManager.Style.SeriesAxis.BorderReference.Color, true);
94+
slice.SetDrawingPropertiesEffects(serie.Effect);
95+
RenderItems.Add(slice);
96+
}
97+
}
98+
}

src/EPPlus.Export.ImageRenderer/Svg/SvgShape.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -228,7 +228,6 @@ public string ViewBox
228228
public void Render(StringBuilder sb)
229229
{
230230
sb.Append($"<svg width=\"{Bounds.Width.PointToPixel()}\" height=\"{Bounds.Height.PointToPixel()}\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" xml:space=\"default\" Overflow=\"Hidden\" viewbox=\"{ViewBox}\">");
231-
sb.Append($"<svg width=\"{Bounds.Width.PointToPixel()}\" height=\"{Bounds.Height.PointToPixel()}\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" xml:space=\"default\" Overflow=\"Hidden\" viewbox=\"{ViewBox}\">");
232231

233232
//Write defs used for gradient colors
234233
var writer = new SvgDrawingWriter(this);

0 commit comments

Comments
 (0)