Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
23a7474
#2455 - Addedgit status hook for naming copied pivot tables during wo…
swmal Aug 10, 2026
9a1bc62
Base theme fallback system functional for borders
OssianEPPlus Aug 11, 2026
6d69be0
Progress on reasoning on true fallback color
OssianEPPlus Aug 12, 2026
1b81d79
Merge branch 'feature/DrawingRendererRefactor' of https://github.com/…
OssianEPPlus Aug 12, 2026
5c0dc63
Added check for applying tint. we do inverse
OssianEPPlus Aug 13, 2026
999ee21
A version that passes all test cases.Problem:Magic numbers
OssianEPPlus Aug 14, 2026
621dc5b
Started adding a system with less magic numbers
OssianEPPlus Aug 14, 2026
393fe18
Ensured directory is created for tests
OssianEPPlus Aug 17, 2026
0e83587
Fixes issue 2459 (#2461)
JanKallman Aug 17, 2026
9721baf
Fixed #2464 (#2467)
OssianEPPlus Aug 17, 2026
2d93289
Changed default shape shade to 15%
OssianEPPlus Aug 17, 2026
feaae2d
Fixed positioning of primary and secondary axis and axis titles when …
JanKallman Aug 18, 2026
dccbe65
Fixes more axis issues
JanKallman Aug 18, 2026
2396306
Fixes axis titles when deleted primary axis
JanKallman Aug 18, 2026
de58260
Fixed gradient.
JanKallman Aug 19, 2026
5c0090c
Fixed Tint/Shade transform calculation
JanKallman Aug 20, 2026
46a3a0e
#2456-Removed Finalizers from the cell store and the ExcelVmlDrawingC…
JanKallman Aug 20, 2026
e89ff1d
fixed issue (#2475)
AdrianEPPlus Aug 20, 2026
3fc7fe1
#2456-Removed finalizers on cell store classes. (#2477)
JanKallman Aug 20, 2026
f8c1a9f
EPPlus version 8.7.0
JanKallman Aug 20, 2026
ff25e79
Fixed edge-case fallbacks to use new fix
OssianEPPlus Aug 20, 2026
4a7bf9d
Fixed glow filter
JanKallman Aug 20, 2026
5a1aa7e
Implemented new fill fallbacks lotta stuff crashes
OssianEPPlus Aug 21, 2026
07a1415
Fixed null issue
OssianEPPlus Aug 21, 2026
a13d2ea
Fixes date axis label positioning
JanKallman Aug 21, 2026
9797369
Re-fixed smiley
OssianEPPlus Aug 21, 2026
c53cf73
Started on each chart element providing style info
OssianEPPlus Aug 21, 2026
05f2895
Merge branch 'feature/DrawingRendererRefactor' of https://github.com/…
OssianEPPlus Aug 21, 2026
2512f32
Merge branch 'develop8' into feature/DrawingRendererRefactor
JanKallman Aug 24, 2026
3a0df67
Merge branch 'develop9' into feature/DrawingRendererRefactor
JanKallman Aug 24, 2026
3c396de
Added new default chartDrawingObject
OssianEPPlus Aug 24, 2026
cafc59e
Fixed multiple bugs in new system removed some of old
OssianEPPlus Aug 24, 2026
f280686
Merge branch 'feature/DrawingRendererRefactor' of https://github.com/…
OssianEPPlus Aug 24, 2026
168b936
Fixed failing tests
JanKallman Aug 24, 2026
a45b79f
Merge branch 'feature/DrawingRendererRefactor' of https://github.com/…
OssianEPPlus Aug 24, 2026
55725e6
Fixed edge-case node-exists but is empty
OssianEPPlus Aug 24, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 5 additions & 5 deletions appveyor8.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
version: 8.6.3.{build}
version: 8.7.0.{build}
branches:
only:
- develop8
Expand All @@ -10,15 +10,15 @@ install:
& $env:temp\dotnet-install.ps1 -Architecture x64 -Version '10.0.100' -InstallDir "$env:ProgramFiles\dotnet"
init:
- ps: >-
Update-AppveyorBuild -Version "8.6.3.$env:appveyor_build_number-$(Get-Date -format yyyyMMdd)-$env:appveyor_repo_branch"
Update-AppveyorBuild -Version "8.7.0.$env:appveyor_build_number-$(Get-Date -format yyyyMMdd)-$env:appveyor_repo_branch"

Write-Host "8.6.3.$env:appveyor_build_number-$(Get-Date -format yyyyMMdd)-$env:appveyor_repo_branch"
Write-Host "8.7.0.$env:appveyor_build_number-$(Get-Date -format yyyyMMdd)-$env:appveyor_repo_branch"
dotnet_csproj:
patch: true
file: '**\*.csproj'
version: '{version}'
assembly_version: 8.6.3.{build}
file_version: 8.6.3.{build}
assembly_version: 8.7.0.{build}
file_version: 8.7.0.{build}
nuget:
project_feed: true
before_build:
Expand Down
5 changes: 4 additions & 1 deletion docs/articles/breakingchanges.md
Original file line number Diff line number Diff line change
Expand Up @@ -227,9 +227,12 @@ Renaming worksheet's will now change the formula correctly to include single quo
This is instead done when properties such as; `.Text`, `.Add` or `.Insert` are set on the .RichText property.
The misspelled enum eCompundLineStyle has been renamed eCompoundLineStyle.

### 8.7.0
* The default value of the ´OutLineSummaryRight´ and ´OutLineSummaryBelow´ properties on ExcelWorksheet is now true.

### 9.0.0
The misspelled enum eCompundLineStyle has been renamed eCompoundLineStyle.
The misspelled property on drawingFill `Transparancy` has been renamed to `Transparency`
The `Richtext.Baseline` property now always return that value in whole percent.
ExcelChartSerie.Header now returns null instead of empty string, if the underlaying "tx/v" node does not exist.
ExcelChartSerie.Header now returns null instead of empty string, if the underlaying "tx/v" node does not exist.
The default border.fill.color for Shapes has been changed to apply 15% shade instead of the previous default 50% shade in accordance with modern Excel
14 changes: 14 additions & 0 deletions docs/articles/fixedissues.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,20 @@
# Features / Fixed issues - EPPlus 8
## Version 9.0.0
* Added 'Layout' property to 'ExcelChartTrendlineLabel' class.
## Version 8.7.0
### Minor Features
* The ´ExcelPackage´ Save functions now support saving as a template (.xltx, .xltm), see https://github.com/EPPlusSoftware/EPPlus/wiki/Save-as-template(.xltx,-.xltm).
* Added support for ´HideItemsWithNoData´ on pivot table slicer caches (Slicer.Cache.HideItemsWithNoData)
* When copying a worksheet, you can now assign custom names to copied tables and pivot tables through callbacks on ExcelWorksheetCopyOptions (TableCopyHandler / PivotTableCopyHandler), instead of relying on generated names like Table1. Formula references in copied tables are updated automatically. See https://github.com/EPPlusSoftware/EPPlus/wiki/Copy-Ranges-or-Entire-Worksheets#naming-tables-and-pivot-tables-when-copying-a-worksheet
* The new ´DisableImageFunctionDownloads´ property on ´ExcelCalculationOption´ (default false) lets you turn off the outbound network request that ´IMAGE´ makes during calculation. When true, ´IMAGE´ returns ´#NAME?´ instead of downloading. Useful when calculating untrusted workbooks. Existing images are unaffected. Thanks to Derin (Paranoidgrinch) for reporting this.
### Fixed issues
* When calculating the formulas accessed ranges, EPPlus could sometimes update the wrong worksheet's dictionary after updating dirty ranges for dynamic array formulas.
* SUMIFS/AVERAGEIFS/COUNTIFS did not create the dependency chain correctly when having multiple criteria ranges, which could cause incorrect circular references.
* The default value of the ´OutLineSummaryRight´ and ´OutLineSummaryBelow´ properties on ExcelWorksheet is now true.
* Removed unnecessary finalizers from the cell store- and the ´ExcelVmlDrawingCollection´- classes.
* Fix for header/footer picture loss when copying worksheets.
* Fixed a regression (introduced in 8.5.0) where ´XLOOKUP´, ´VLOOKUP´, ´HLOOKUP´ and ´MATCH´ returned ´#N/A´ when the lookup range started before the first populated cell of the worksheet, for example a full-column lookup like A:A on a sheet whose data begins further down.
* Fixed column style lost on remaining columns when a sub-range column style was modified. Thanks to Lieven De Foor.
## Version 8.6.3
### Security
* Updated System.Security.Cryptography.Xml to address five security vulnerabilities in the .NET XML signing dependency: four denial of service vulnerabilities (CVE-2026-47302, CVE-2026-50525, CVE-2026-50527, CVE-2026-50648) and one security feature bypass (CVE-2026-47304). The package is updated to 8.0.4 (.NET Framework, .NET 8 and .NET Standard), 9.0.18 (.NET 9) and 10.0.10 (.NET 10).
Expand Down
4 changes: 3 additions & 1 deletion src/EPPlus.Compression/AssemblyInfo.cs
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
using System.Runtime.CompilerServices;
using System.Security;

[assembly: InternalsVisibleTo("EPPlus, PublicKey=00240000048000009400000006020000002400005253413100040000010001002981343969ed86fe604c56a84c61e33109424ef07bb458ff12e9533c11ea23ac8ef7e014b2a2de4ceb5f7528f963c755fe9b32f09cc35d21de94319d2a952a6e663cd46d6d98465998c77b52093d4f17cdc20ec054751244696f08afa6f4417d85267b147b73b6a3f5e9015b9dfd3dcc3328ce63df53a7c08a5544c1526ea5a5")]
[assembly: InternalsVisibleTo("EPPlus, PublicKey=00240000048000009400000006020000002400005253413100040000010001002981343969ed86fe604c56a84c61e33109424ef07bb458ff12e9533c11ea23ac8ef7e014b2a2de4ceb5f7528f963c755fe9b32f09cc35d21de94319d2a952a6e663cd46d6d98465998c77b52093d4f17cdc20ec054751244696f08afa6f4417d85267b147b73b6a3f5e9015b9dfd3dcc3328ce63df53a7c08a5544c1526ea5a5")]
[assembly: AllowPartiallyTrustedCallers]
2 changes: 1 addition & 1 deletion src/EPPlus.DrawingRenderer.Tests/Chart/BarChartTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ public void GenerateSvgForBarCharts1()
{
var ws = p.Workbook.Worksheets[0];

//var ix = 1;
//var ix = 2;
//var c = ws.Drawings[ix];
//var svg = c.ToSvg();
//SaveTextFileToWorkbook($"svg\\ChartForSvg_ind{ix++}.svg", svg);
Expand Down
186 changes: 164 additions & 22 deletions src/EPPlus.DrawingRenderer.Tests/Chart/ChartStyleFallbackTest.cs
Original file line number Diff line number Diff line change
@@ -1,21 +1,48 @@
using OfficeOpenXml;
using OfficeOpenXml.Drawing;
using OfficeOpenXml.Drawing.Chart;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
using tc = OfficeOpenXml.Utils.TypeConversion;

namespace EPPlus.DrawingRenderer.Tests.Chart
{
[TestClass]
public class ChartStyleFallbackTest : TestBase
{
[TestMethod]
public void ReadExcelFile()
{
ExcelPackage.License.SetNonCommercialOrganization("EPPlus Project");

CreatePathIfNotExists("StyleExamples\\");

using (var p = OpenTemplatePackage("StyleExamples\\ExcelUnchangedEmptyChart.xlsx"))
{
var ws = p.Workbook.Worksheets[0];

foreach (ExcelChart c in ws.Drawings)
{
var borderRef = c.StyleManager.Style.ChartArea.BorderReference;
var borderSetting = c.Border;
var borderDirectColor = borderSetting.Fill.Color;

var svg = c.ToSvg();
SaveTextFileToWorkbook($"svg\\ExcelDefault{ws.Name}_{c.Name}.svg", svg);
}
var fi = GetOutputFile("StyleExamples", "ExcelUnchangedEmptyChart_out.xlsx");
p.SaveAs(fi);
}
}


[TestMethod]
public void EpplusGeneratedChart()
{
ExcelPackage.License.SetNonCommercialOrganization("EPPlus Project");

CreatePathIfNotExists("StyleExamples\\");

using (var p = OpenPackage("StyleExamples\\epplusDefaultTest.xlsx",true))
{
Expand Down Expand Up @@ -62,6 +89,7 @@ public void ReadEmptyDefaultChartStyle()
{
ExcelPackage.License.SetNonCommercialOrganization("EPPlus Project");

CreatePathIfNotExists("StyleExamples\\");

using (var p = OpenTemplatePackage("StyleExamples\\emptyDefault.xlsx"))
{
Expand All @@ -76,18 +104,61 @@ public void ReadEmptyDefaultChartStyle()
var svg = c.ToSvg();
SaveTextFileToWorkbook($"svg\\emptyDefaultStyle{ws.Name}_{c.Name}.svg", svg);
}
GetOutputFile("StyleExamples", "");
var fi = GetOutputFile("StyleExamples", "emptyDefault_out.xlsx");
p.SaveAs(fi);
}
}
[TestMethod]
public void GenerateSimpleChart()
{
ExcelPackage.License.SetNonCommercialOrganization("EPPlus Project");

string fileName = "EpplusSimpleChart";

using (var p = OpenPackage($"{fileName}.xlsx",true))
{
var ws = p.Workbook.Worksheets.Add("s1");
ws.Drawings.AddBarChart("simpleChart", eBarChartType.ColumnClustered);

SaveAndCleanup(p);
}
}

[TestMethod]
public void RemovedStyles()
public void ReadChartBorderThemeTint()
{
ExcelPackage.License.SetNonCommercialOrganization("EPPlus Project");

var fileName = "ChartBorderThemeTint";
CreatePathIfNotExists("StyleExamples\\");

using (var p = OpenTemplatePackage($"StyleExamples\\{fileName}.xlsx"))
{
var ws = p.Workbook.Worksheets[0];
var lChart = ws.Drawings[0].As.Chart.LineChart;

lChart.StyleManager.Style.ChartArea.Border.Fill.SolidFill.Color.SetSchemeColor(OfficeOpenXml.Drawing.eSchemeColor.Accent1);

//100 - input is what excel seems to apply
//lChart.StyleManager.Style.ChartArea.BorderReference.Color.Transforms.AddTint(13);

//Adding Less Tint makes the object Lighter. Which is the inverse of how excel does it.
lChart.StyleManager.Style.ChartArea.Border.Fill.SolidFill.Color.Transforms.AddTint(60);
lChart.StyleManager.Style.ChartArea.Border.Width = 10d;
lChart.StyleManager.ApplyStyles();

var fi = GetOutputFile("StyleExamples", $"{fileName}_Out.xlsx");
p.SaveAs(fi);
}
}

[TestMethod]
public void RemovedStyles()
{
ExcelPackage.License.SetNonCommercialOrganization("EPPlus Project");

string fileName = "emptyManuallyRemovedLnStyles";
CreatePathIfNotExists("StyleExamples\\");

using (var p = OpenTemplatePackage($"StyleExamples\\{fileName}.xlsx"))
{
Expand All @@ -97,19 +168,18 @@ public void RemovedStyles()
{
if (d is ExcelChart c)
{
var borderSetting = c.Border;
var borderDirectColor = borderSetting.Fill.Color;
var theme = p.Workbook.ThemeManager.GetOrCreateTheme();
//var borderSetting = c.Border;
//var borderDirectColor = borderSetting.Fill.Color;
//var theme = p.Workbook.ThemeManager.GetOrCreateTheme();

var defaultColorFromTheme = theme.ColorScheme.Dark1;
//var defaultColorFromTheme = theme.ColorScheme.Dark1;

var svg = c.ToSvg();
SaveTextFileToWorkbook($"svg\\{fileName}_{ws.Name}_{c.Name}.svg", svg);
}
}
GetOutputFile("StyleExamples", "");
SaveAndCleanup(p);

var fi = GetOutputFile("StyleExamples", $"{fileName}_Out.xlsx");
p.SaveAs(fi);
}
}

Expand All @@ -118,6 +188,7 @@ public void EditedTheme()
{
ExcelPackage.License.SetNonCommercialOrganization("EPPlus Project");

CreatePathIfNotExists("StyleExamples\\");

string fileName = "ExcelThemeEdited";

Expand All @@ -137,11 +208,18 @@ public void EditedTheme()

var svg = c.ToSvg();
SaveTextFileToWorkbook($"svg\\{fileName}_{ws.Name}_{c.Name}.svg", svg);

var theme = p.Workbook.ThemeManager.GetOrCreateTheme();
var themeColor = tc.ColorConverter.GetThemeColor(theme, eThemeSchemeColor.Text1);
var themedLine = theme.FormatScheme.BorderStyle[0];
//themeColor = tc.ColorConverter.ApplyTransforms(themeColor, themedLine.Fill.SolidFill.Color.Transforms);
themeColor = tc.ColorConverter.ApplyTintDrawing(themeColor, 0.55d);
var ExpectedColor = Color.FromArgb(255, 255, 199, 199);
Assert.AreEqual(ExpectedColor.ToArgb(), themeColor.ToArgb());
}
}
GetOutputFile("StyleExamples", "");
SaveAndCleanup(p);

var fi = GetOutputFile("StyleExamples", $"{fileName}_Out.xlsx");
p.SaveAs(fi);
}
}

Expand All @@ -153,6 +231,8 @@ public void ManualSystemText()

string fileName = "ExcelThemeManualSystemText";

CreatePathIfNotExists("StyleExamples\\");

using (var p = OpenTemplatePackage($"StyleExamples\\{fileName}.xlsx"))
{
var ws = p.Workbook.Worksheets[0];
Expand All @@ -161,18 +241,18 @@ public void ManualSystemText()
{
if (d is ExcelChart c)
{
var borderSetting = c.Border;
var borderDirectColor = borderSetting.Fill.Color;
var theme = p.Workbook.ThemeManager.GetOrCreateTheme();
//var borderSetting = c.Border;
//var borderDirectColor = borderSetting.Fill.Color;
//var theme = p.Workbook.ThemeManager.GetOrCreateTheme();

var defaultColorFromTheme = theme.ColorScheme.Dark1;
//var defaultColorFromTheme = theme.ColorScheme.Dark1;

var svg = c.ToSvg();
SaveTextFileToWorkbook($"svg\\{fileName}_{ws.Name}_{c.Name}.svg", svg);
}
}
GetOutputFile("StyleExamples", "");
SaveAndCleanup(p);
var fi = GetOutputFile("StyleExamples", $"{fileName}_Out.xlsx");
p.SaveAs(fi);
}
}

Expand All @@ -182,8 +262,43 @@ public void ExcelThemeLnDeleted()
{
ExcelPackage.License.SetNonCommercialOrganization("EPPlus Project");

CreatePathIfNotExists("StyleExamples\\");

string fileName = "ExcelThemeLnDeleted";

using (var p = OpenTemplatePackage($"StyleExamples\\{fileName}.xlsx"))
{
var ws = p.Workbook.Worksheets[0];

foreach (var d in ws.Drawings)
{
if (d is ExcelChart c)
{
//var borderSetting = c.Border;
//var borderDirectColor = borderSetting.Fill.Color;
//var theme = p.Workbook.ThemeManager.GetOrCreateTheme();

//var defaultColorFromTheme = theme.ColorScheme.Dark1;

var svg = c.ToSvg();
SaveTextFileToWorkbook($"svg\\{fileName}_{ws.Name}_{c.Name}.svg", svg);
}
}
var fi = GetOutputFile("StyleExamples", $"{fileName}_Out.xlsx");
p.SaveAs(fi);
}
}


[TestMethod]
public void PureExcelTheme()
{
ExcelPackage.License.SetNonCommercialOrganization("EPPlus Project");

string fileName = "PureExcelTheme";

CreatePathIfNotExists("StyleExamples\\");

using (var p = OpenTemplatePackage($"StyleExamples\\{fileName}.xlsx"))
{
var ws = p.Workbook.Worksheets[0];
Expand All @@ -202,8 +317,35 @@ public void ExcelThemeLnDeleted()
SaveTextFileToWorkbook($"svg\\{fileName}_{ws.Name}_{c.Name}.svg", svg);
}
}
GetOutputFile("StyleExamples", "");
SaveAndCleanup(p);
var fi = GetOutputFile("StyleExamples", $"{fileName}_Out.xlsx");
p.SaveAs(fi);
}
}


[TestMethod]
public void ChartWithChartStyle()
{
ExcelPackage.License.SetNonCommercialOrganization("EPPlus Project");

string fileName = "ChartWithChartStyleMEdit";

CreatePathIfNotExists("StyleExamples\\");

using (var p = OpenTemplatePackage($"StyleExamples\\{fileName}.xlsx"))
{
var ws = p.Workbook.Worksheets[0];

foreach (var d in ws.Drawings)
{
if (d is ExcelChart c)
{
var svg = c.ToSvg();
SaveTextFileToWorkbook($"svg\\{fileName}_{ws.Name}_{c.Name}.svg", svg);
}
}
var fi = GetOutputFile("StyleExamples", $"{fileName}_Out.xlsx");
p.SaveAs(fi);
}
}
}
Expand Down
Loading
Loading