Skip to content
Open
5 changes: 5 additions & 0 deletions src/EPPlus/CellPictures/CellPicturesManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -358,6 +358,11 @@ private void AddNewWebPicture(int row, int col, Uri imageUri, Uri addressUri, st
}
}

internal void ReadAndAddReference(PictureCacheKey key, uint vmId)
{
_referenceCache.Add(key, vmId);
}

private void AddReferenceToPicture(int row, int col, PictureCacheKey key, uint vmId)
{
var rv = _richDataStore.GetRichValue(vmId);
Expand Down
2 changes: 1 addition & 1 deletion src/EPPlus/Drawing/Chart/ExcelBarChartSerie.cs
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ public ExcelChartSerieDataLabel DataLabel
{
if (_dataLabel == null)
{
if (ExcelChartDataLabelStandard.ForbiddDataLabelPosition(_chart) == false)
if (ExcelChartDataLabelStandard.IsDataLabelPositionForbidden(_chart) == false)
{
_dataLabel = new ExcelChartSerieDataLabel(_chart, NameSpaceManager, TopNode, SchemaNodeOrder);
}
Expand Down
26 changes: 13 additions & 13 deletions src/EPPlus/Drawing/Chart/ExcelChartDataLabel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ public abstract class ExcelChartDataLabel : XmlHelper, IDrawingStyle
{
internal ExcelChart _chart;
internal string _nodeName;
private string _nsPrefix;
internal protected string NsPrefix { private set; get; }
private readonly string _formatPath;
private readonly string _sourceLinkedPath;

Expand All @@ -35,7 +35,7 @@ internal ExcelChartDataLabel(ExcelChart chart, XmlNamespaceManager ns, XmlNode n
{
_nodeName = nodeName;
_chart = chart;
_nsPrefix = nsPrefix;
NsPrefix = nsPrefix;
_formatPath = $"{nsPrefix}:numFmt/@formatCode";
_sourceLinkedPath = $"{nsPrefix}:numFmt/@sourceLinked";
}
Expand Down Expand Up @@ -157,7 +157,7 @@ public ExcelDrawingFill Fill
{
if (_fill == null)
{
_fill = new ExcelDrawingFill(_chart, NameSpaceManager, TopNode, $"{_nsPrefix}:spPr", SchemaNodeOrder);
_fill = new ExcelDrawingFill(_chart, NameSpaceManager, TopNode, $"{NsPrefix}:spPr", SchemaNodeOrder);
}
return _fill;
}
Expand All @@ -172,7 +172,7 @@ public ExcelDrawingBorder Border
{
if (_border == null)
{
_border = new ExcelDrawingBorder(_chart, NameSpaceManager, TopNode, $"{_nsPrefix}:spPr/a:ln", SchemaNodeOrder);
_border = new ExcelDrawingBorder(_chart, NameSpaceManager, TopNode, $"{NsPrefix}:spPr/a:ln", SchemaNodeOrder);
}
return _border;
}
Expand All @@ -187,7 +187,7 @@ public ExcelDrawingEffectStyle Effect
{
if (_effect == null)
{
_effect = new ExcelDrawingEffectStyle(_chart, NameSpaceManager, TopNode, $"{_nsPrefix}:spPr/a:effectLst", SchemaNodeOrder);
_effect = new ExcelDrawingEffectStyle(_chart, NameSpaceManager, TopNode, $"{NsPrefix}:spPr/a:effectLst", SchemaNodeOrder);
}
return _effect;
}
Expand All @@ -202,7 +202,7 @@ public ExcelDrawing3D ThreeD
{
if (_threeD == null)
{
_threeD = new ExcelDrawing3D(NameSpaceManager, TopNode, $"{_nsPrefix}:spPr", SchemaNodeOrder);
_threeD = new ExcelDrawing3D(NameSpaceManager, TopNode, $"{NsPrefix}:spPr", SchemaNodeOrder);
}
return _threeD;
}
Expand All @@ -218,7 +218,7 @@ public ExcelTextFont Font
{
if (_font == null)
{
_font = new ExcelTextFont(_chart, NameSpaceManager, TopNode, $"{_nsPrefix}:txPr/a:p/a:pPr/a:defRPr", SchemaNodeOrder, CreateDefaultText);
_font = new ExcelTextFont(_chart, NameSpaceManager, TopNode, $"{NsPrefix}:txPr/a:p/a:pPr/a:defRPr", SchemaNodeOrder, CreateDefaultText);
}
return _font;
}
Expand All @@ -233,7 +233,7 @@ public ExcelDrawingTextSettings TextSettings
{
if (_textSettings == null)
{
_textSettings = new ExcelDrawingTextSettings(_chart, NameSpaceManager, TopNode, $"{_nsPrefix}:txPr/a:p/a:pPr/a:defRPr", SchemaNodeOrder);
_textSettings = new ExcelDrawingTextSettings(_chart, NameSpaceManager, TopNode, $"{NsPrefix}:txPr/a:p/a:pPr/a:defRPr", SchemaNodeOrder);
}
return _textSettings;
}
Expand All @@ -245,14 +245,14 @@ void IDrawingStyleBase.CreatespPr()

private void CreateDefaultText()
{
if (TopNode.SelectSingleNode($"{_nsPrefix}:txPr", NameSpaceManager) == null)
if (TopNode.SelectSingleNode($"{NsPrefix}:txPr", NameSpaceManager) == null)
{
if (!ExistsNode($"{_nsPrefix}:spPr"))
if (!ExistsNode($"{NsPrefix}:spPr"))
{
var spNode = CreateNode($"{_nsPrefix}:spPr");
var spNode = CreateNode($"{NsPrefix}:spPr");
spNode.InnerXml = "<a:noFill/><a:ln><a:noFill/></a:ln><a:effectLst/>";
}
var node = CreateNode($"{_nsPrefix}:txPr");
var node = CreateNode($"{NsPrefix}:txPr");
node.InnerXml = "<a:bodyPr anchorCtr=\"1\" anchor=\"ctr\" bIns=\"19050\" rIns=\"38100\" tIns=\"19050\" lIns=\"38100\" wrap=\"square\" vert=\"horz\" vertOverflow=\"ellipsis\" spcFirstLastPara=\"1\" rot=\"0\"><a:spAutoFit/></a:bodyPr><a:lstStyle/>";
}

Expand All @@ -268,7 +268,7 @@ public ExcelTextBody TextBody
{
if (_textBody == null)
{
_textBody = new ExcelTextBody(NameSpaceManager, TopNode, $"{_nsPrefix}:txPr/a:bodyPr", SchemaNodeOrder, Font.CreateTopNode);
_textBody = new ExcelTextBody(NameSpaceManager, TopNode, $"{NsPrefix}:txPr/a:bodyPr", SchemaNodeOrder, Font.CreateTopNode);
}
return _textBody;
}
Expand Down
18 changes: 15 additions & 3 deletions src/EPPlus/Drawing/Chart/ExcelChartDataLabelCollection.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,8 @@ Date Author Change
using System;
using System.Collections;
using System.Collections.Generic;
using System.Reflection.Emit;
using System.ComponentModel;
using System.Data;
using System.Xml;

namespace OfficeOpenXml.Drawing.Chart
Expand All @@ -31,14 +32,25 @@ internal ExcelChartDataLabelCollection(ExcelChart chart, XmlNamespaceManager ns,
{
SchemaNodeOrder = schemaNodeOrder;
_list = new List<ExcelChartDataLabelItem>();
foreach (XmlNode dataLabelNode in TopNode.SelectNodes("c:dLbl", ns))
var existingDataLabelNodes = TopNode.SelectNodes("c:dLbl", ns);
foreach (XmlNode dataLabelNode in existingDataLabelNodes)
{
_list.Add(new ExcelChartDataLabelItem(chart, ns, dataLabelNode, "", schemaNodeOrder));
}

parentDatalabel = parent;
_chart = chart;

}

internal void InitializeDataLabelsXml()
{
if(_list.Count == 0)
{
var seriesNode = TopNode.ParentNode;
}
}

/// <summary>
/// Adds a new chart label to the collection
/// </summary>
Expand Down Expand Up @@ -72,7 +84,7 @@ private ExcelChartDataLabelItem CreateDataLabel(int idx)
dl.ShowLegendKey = parentDatalabel.ShowLegendKey;
dl.ShowLeaderLines = true;
dl.ShowValue = true;
dl.Position = eLabelPosition.Center;
dl.Position = parentDatalabel.Position;

if (idx < _list.Count)
{
Expand Down
39 changes: 39 additions & 0 deletions src/EPPlus/Drawing/Chart/ExcelChartDataLabelItem.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,10 @@ Date Author Change
*************************************************************************************************
01/27/2020 EPPlus Software AB Initial release EPPlus 5
*************************************************************************************************/
using OfficeOpenXml.FormulaParsing.Excel.Functions.Information;
using OfficeOpenXml.FormulaParsing.Excel.Functions.MathFunctions;
using OfficeOpenXml.Style;
using System.Collections.Generic;
using System.Globalization;
using System.Xml;

Expand All @@ -20,17 +24,50 @@ namespace OfficeOpenXml.Drawing.Chart
/// </summary>
public class ExcelChartDataLabelItem : ExcelChartDataLabelStandard
{
string _fontPropertiesPath = "";
internal ExcelChartDataLabelItem(ExcelChart chart, XmlNamespaceManager ns, XmlNode node, string nodeName, string[] schemaNodeOrder)
: base(chart, ns, node, nodeName, schemaNodeOrder)
{
Layout = new ExcelLayout(NameSpaceManager, TopNode, $"c:layout","c:extLst/c:ext[1]/c15:layout", SchemaNodeOrder);
_fontPropertiesPath = $"{NsPrefix}:tx/{NsPrefix}:rich";
}

/// <summary>
/// Define position for manual elements
/// </summary>
public ExcelLayout Layout { get; private set; }

ExcelParagraphCollection _paragraphs = null;

/// <summary>
/// Access to text body properties
/// </summary>
private ExcelParagraphCollection ParagraphCollection
{
get
{
if (_paragraphs == null)
{
_paragraphs = new ExcelParagraphCollection(_chart, NameSpaceManager, TopNode, _fontPropertiesPath + "/a:p", SchemaNodeOrder);
}
return _paragraphs;
}
}

/// <summary>
/// Replace datalabel text
/// </summary>
/// <param name="replacementText"></param>
public void SetText(string replacementText)
{
ParagraphCollection.Clear();
ParagraphCollection.Add(replacementText, true);
}

internal List<List<string>> GetExistingParagraphStrings()
{
return ParagraphCollection.GetParagraphTextLists();
}
/// <summary>
/// The index of an individual datalabel
/// </summary>
Expand All @@ -45,5 +82,7 @@ public int Index
SetXmlNodeString("c:idx/@val", value.ToString(CultureInfo.InvariantCulture));
}
}

internal ExcelAddressBase SingleCellAddressFromSeries;
}
}
43 changes: 37 additions & 6 deletions src/EPPlus/Drawing/Chart/ExcelChartDataLabelStandard.cs
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,10 @@ internal ExcelChartDataLabelStandard(ExcelChart chart, XmlNamespaceManager ns, X
const string positionPath = "c:dLblPos/@val";
/// <summary>
/// Position of the labels
/// Note: Only Center, InEnd and InBase are allowed for dataLabels on stacked columns
/// <br/> BE AWARE! For SERIES labels and all underlying labels: <br/>
/// Setting a position not available for this label in the Excel UI May cause a corrupt file.<br/>
/// Note: Only Center, InEnd and InBase are allowed for dataLabels on stacked columns <br/>
/// (Same applies to most BarCharts but they allow OutEnd)
/// </summary>
public override eLabelPosition Position
{
Expand All @@ -87,14 +90,19 @@ public override eLabelPosition Position
}
set
{
if (ForbiddDataLabelPosition(_chart))
if (IsDataLabelPositionForbidden(_chart))
{
throw new InvalidOperationException("Can't set data label position on a 3D-chart");
}
if(_chart.ChartType == eChartType.ColumnClustered && value == eLabelPosition.Top)
{
throw new InvalidOperationException($"DataLabelPosition: '{value}' is not allowed on chart of type: '{_chart.ChartType}' \n " +
$"because it would cause a corrupt file");
}
SetXmlNodeString(positionPath, GetPosText(value));
}
}
internal static bool ForbiddDataLabelPosition(ExcelChart _chart)
internal static bool IsDataLabelPositionForbidden(ExcelChart _chart)
{
return _chart.IsType3D() && !_chart.IsTypePie() && _chart.ChartType != eChartType.Line3D
|| _chart.IsTypeDoughnut();
Expand Down Expand Up @@ -144,19 +152,19 @@ public override bool ShowSeriesName
SetXmlNodeString(showSerPath, value ? "1" : "0");
}
}
const string showPerentPath = "c:showPercent/@val";
const string showPercentPath = "c:showPercent/@val";
/// <summary>
/// Show percent values
/// </summary>
public override bool ShowPercent
{
get
{
return GetXmlNodeBool(showPerentPath);
return GetXmlNodeBool(showPercentPath);
}
set
{
SetXmlNodeString(showPerentPath, value ? "1" : "0");
SetXmlNodeString(showPercentPath, value ? "1" : "0");
}
}
const string showLeaderLinesPath = "c:showLeaderLines/@val";
Expand Down Expand Up @@ -254,5 +262,28 @@ public override string Separator
}
}
}

internal void AddExtFieldTableEmpty()
{
CreateNode($"{extPath}/c15:dlblFieldTable");
}


internal bool ShowDatalabelsRange
{
get
{
return GetXmlNodeBool($"{extPath}/c15:showDataLabelsRange");
}
set
{
var rangePath = $"{extPath}/c15:showDataLabelsRange";
if(ExistsNode(rangePath) == false)
{
CreateNode(rangePath);
}
SetXmlNodeBool(rangePath+"/@val", value);
}
}
}
}
Loading