Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
1104 commits
Select commit Hold shift + click to select a range
3d451eb
Fixed failing tests for Archivo Narrow
swmal Jun 24, 2026
c91c853
Merge branch 'feature/DrawingRendererRefactor' of https://github.com/…
swmal Jun 24, 2026
38f37a2
Merge branch 'feature/DrawingRendererRefactor' of https://github.com/…
JanKallman Jun 24, 2026
4e3ab79
Fixed corrupting issues with previous fix
OssianEPPlus Jun 24, 2026
ed6a024
Merge branch 'feature/DrawingRendererRefactor' of https://github.com/…
OssianEPPlus Jun 24, 2026
62971c5
Turned off debug points for dlbl
OssianEPPlus Jun 24, 2026
04447fb
Fixed axis and trendlines issues
JanKallman Jun 24, 2026
476e751
Merge branch 'feature/DrawingRendererRefactor' of https://github.com/…
JanKallman Jun 24, 2026
0543a6f
Differing shape and chart fill
OssianEPPlus Jun 24, 2026
677e371
Merge branch 'feature/DrawingRendererRefactor' of https://github.com/…
OssianEPPlus Jun 24, 2026
6b7b134
Attempt att resolving style hierarchy correctly
OssianEPPlus Jun 25, 2026
2dd0a5b
Feature/pdfheadings (#2391)
AdrianEPPlus Jun 26, 2026
fd35946
Added new option class to the ToSvg method
JanKallman Jun 29, 2026
8a8d188
Adding additional tests
OssianEPPlus Jun 29, 2026
bd1a513
Merge branch 'feature/DrawingRendererRefactor' of https://github.com/…
OssianEPPlus Jun 29, 2026
fa81f57
Merge branch 'develop9' into feature/DrawingRendererRefactor
OssianEPPlus Jun 29, 2026
aa2d8ab
Added base-functional chart export
OssianEPPlus Jun 29, 2026
3b6954a
Fixed absolute positioning for charts
OssianEPPlus Jun 29, 2026
5b383df
Start of relative position + multiple charts/shapes
OssianEPPlus Jun 30, 2026
d87b4ef
Merge branch 'develop8' into feature/DrawingRendererRefactor
JanKallman Jun 30, 2026
d6862da
Documented change to DrawingFillBasic
OssianEPPlus Jun 30, 2026
96fd666
Merge branch 'feature/DrawingRendererRefactor' of https://github.com/…
OssianEPPlus Jun 30, 2026
e53b9bf
Feature/drawing renderer refactor (#2396)
JanKallman Jun 30, 2026
1a795f6
Merge branch 'feature/DrawingRendererRefactor' into develop9
JanKallman Jun 30, 2026
ca78804
Added default colors for fill and borders
JanKallman Jun 30, 2026
e3c0d7f
Fix for failing tests
OssianEPPlus Jun 30, 2026
c83508b
Merge branch 'develop9' into feature/DrawingRendererRefactor
OssianEPPlus Jun 30, 2026
47e0280
Fix wrapping issue
OssianEPPlus Jun 30, 2026
01d1522
Added default color for border
JanKallman Jun 30, 2026
6da94e0
Merge branch 'feature/DrawingRendererRefactor' of https://github.com/…
OssianEPPlus Jun 30, 2026
b466cf8
fixed trendline and other
OssianEPPlus Jun 30, 2026
4c8b6c8
Added defaults for borders
OssianEPPlus Jun 30, 2026
f926328
Fixed default colors
JanKallman Jun 30, 2026
90b23c3
Merge branch 'feature/DrawingRendererRefactor' of https://github.com/…
JanKallman Jun 30, 2026
515cbdd
Added defaults
OssianEPPlus Jun 30, 2026
c3fdeb4
Fixed apply tint
OssianEPPlus Jun 30, 2026
39c2d52
Fixed style fallback for shapes
OssianEPPlus Jun 30, 2026
ac30e3b
Several fixed for empty fills/border
JanKallman Jun 30, 2026
d4e3345
Added z-order to drawings/pictures
OssianEPPlus Jun 30, 2026
df72c8d
Added text back
OssianEPPlus Jun 30, 2026
b0c3968
Merge branch 'feature/DrawingRendererRefactor' of https://github.com/…
JanKallman Jun 30, 2026
09106eb
Fixes for null colors
JanKallman Jun 30, 2026
60232b5
Add per-workbook RenderContext on ExcelWorkbook (#2395)
swmal Jun 30, 2026
a00cdee
got chart and shape to play slightly nicer
OssianEPPlus Jun 30, 2026
9afddec
Merge branch 'feature/DrawingRendererRefactor' of https://github.com/…
OssianEPPlus Jun 30, 2026
c8269dc
WIP
JanKallman Jul 1, 2026
69a6ff7
Merge branch 'feature/DrawingRendererRefactor' of https://github.com/…
JanKallman Jul 1, 2026
e418990
Merge fix
JanKallman Jul 1, 2026
b5c819a
Merge develop9
JanKallman Jul 1, 2026
081688b
Changes to EPPlus.csproj to ensure that other project-binaries are co…
swmal Jul 1, 2026
4493862
Fixed epplus generated pie charts
OssianEPPlus Jul 1, 2026
a98a6a8
:Merge branch 'feature/DrawingRendererRefactor' of https://github.com…
OssianEPPlus Jul 1, 2026
317065d
Fixed default positions causing corrupt files
OssianEPPlus Jul 1, 2026
1f7e7bf
Adjusted test and serieslabels
OssianEPPlus Jul 1, 2026
1239b10
Fixes for barchart axis positioning
JanKallman Jul 1, 2026
b9e629d
Merge branch 'feature/DrawingRendererRefactor' of https://github.com/…
JanKallman Jul 1, 2026
57334eb
Implemented colors for multiple series
OssianEPPlus Jul 1, 2026
7844e14
Fixes for legend for single series bar/column charts
JanKallman Jul 1, 2026
b1cd1d6
Adjusted series name rendering for datalabels
OssianEPPlus Jul 1, 2026
79ede10
Fixed datalabel centering/separator
OssianEPPlus Jul 1, 2026
243fc3b
Merge fix
JanKallman Jul 2, 2026
6b60fac
Merge branch 'feature/DrawingRendererRefactor' of https://github.com/…
JanKallman Jul 2, 2026
b96d35e
Feature/pdfentry (#2420)
AdrianEPPlus Jul 2, 2026
2eaddb1
Removed data point rendering in legend for refactor
JanKallman Jul 2, 2026
1ed4eea
Fixed recursive group prerender / piechart gradient
OssianEPPlus Jul 2, 2026
71e5d00
Merge branch 'feature/DrawingRendererRefactor' of https://github.com/…
OssianEPPlus Jul 2, 2026
1b14c93
Fixed user-space for piechart gradients
OssianEPPlus Jul 2, 2026
f09970e
Fixes datapoint fills and borders for legend icons
JanKallman Jul 2, 2026
3e97e83
Merge branch 'feature/DrawingRendererRefactor' of https://github.com/…
JanKallman Jul 2, 2026
81d31a3
Broke up IRender monolith and moved it into its separate classes
OssianEPPlus Jul 2, 2026
97b300b
Merge branch 'feature/DrawingRendererRefactor' of https://github.com/…
OssianEPPlus Jul 2, 2026
3824c6e
Renamed chartrenderer
OssianEPPlus Jul 2, 2026
e45ea2f
Revert "Renamed chartrenderer"
OssianEPPlus Jul 2, 2026
92c2414
Added percent to datalabels
OssianEPPlus Jul 2, 2026
3ad2b0d
Versioning moved to Directory.Build.props and Build-release.yml adjus…
swmal Jul 2, 2026
8e664c0
Added legend vary color for series in bar/column charts
JanKallman Jul 2, 2026
2761f3c
Added legend vary color for series in bar/column charts
JanKallman Jul 2, 2026
1fbb791
Merge branch 'feature/DrawingRendererRefactor' of https://github.com/…
JanKallman Jul 2, 2026
72b989d
Fixed fills for charts
JanKallman Jul 2, 2026
acf0b12
Simplified bestfit. Slightly inaccurate
OssianEPPlus Jul 2, 2026
3905c7e
Merge branch 'feature/DrawingRendererRefactor' of https://github.com/…
OssianEPPlus Jul 2, 2026
7b6b193
Added support for rounded corners on Charts.Chart.RoundedCorner now r…
JanKallman Jul 2, 2026
5919583
Merge branch 'feature/DrawingRendererRefactor' of https://github.com/…
JanKallman Jul 2, 2026
82fac4d
Fixes for pieslices
OssianEPPlus Jul 2, 2026
8047b7a
Merge branch 'feature/DrawingRendererRefactor' of https://github.com/…
OssianEPPlus Jul 2, 2026
08194ce
Added accurate best-fit for circle-segmentAdded accurate best-fit for
OssianEPPlus Jul 2, 2026
eb48ecb
Correction
OssianEPPlus Jul 2, 2026
4375990
Versioning moved to Directory.Build.props and Build-release.yml adjus…
swmal Jul 3, 2026
d1a99eb
Added data point formatting to line charts
JanKallman Jul 3, 2026
bcffe58
Fixed best-fit for degrees over 180
OssianEPPlus Jul 6, 2026
216ba4f
Merge branch 'feature/DrawingRendererRefactor' of https://github.com/…
OssianEPPlus Jul 6, 2026
57260ba
Ensured top-left of datalabel cannot be outside of chart
OssianEPPlus Jul 6, 2026
e216de8
Adjustment of pie legend
OssianEPPlus Jul 6, 2026
b792947
Adjusted legend positions for pie chart
OssianEPPlus Jul 7, 2026
9c1fb05
Fixed multiple failing tests
OssianEPPlus Jul 7, 2026
db339d5
Reverted color base-case change
OssianEPPlus Jul 7, 2026
b0f7cc8
Fixed trendline default border color
OssianEPPlus Jul 7, 2026
4de47ba
Fixed defaultbordercolor for trendline + error bar
OssianEPPlus Jul 7, 2026
937818a
Simplified solution
OssianEPPlus Jul 7, 2026
da4df95
Added support for epplus generated column chart with blank axis
OssianEPPlus Jul 7, 2026
2e50aa5
fix minor bugs
OssianEPPlus Jul 8, 2026
4c9be0c
Fixed multiple blank series export issues
OssianEPPlus Jul 9, 2026
a259a08
Merge with develop8
JanKallman Aug 3, 2026
bb1c46d
Fixed Error bars
JanKallman Aug 3, 2026
3d53103
Feature/pdfentry (#2448)
AdrianEPPlus Aug 3, 2026
8ba5cc3
Merged develop8 -> develop9 and fixed conflicts
swmal Aug 4, 2026
a6992cc
EPPlus 9: centralize versioning, embed sub-project DLLs, drop net35 (…
swmal Aug 4, 2026
160a3bc
Fix/pdf merged cells ignores hidden (#2450)
AdrianEPPlus Aug 4, 2026
8398ec4
Added drop line support. Fixed gradient issues
JanKallman Aug 6, 2026
c1179f2
Fixed date axis issue
JanKallman Aug 6, 2026
fec69e2
Fixed error for certain patterns
OssianEPPlus Aug 6, 2026
63e2092
Fixes gradient rotations
JanKallman Aug 6, 2026
cfd65c1
Merge branch 'feature/DrawingRendererRefactor' of https://github.com/…
JanKallman Aug 6, 2026
33b783b
Moved tests
JanKallman Aug 6, 2026
1efbd2a
Resolved BestFit piechart error in some cases
OssianEPPlus Aug 6, 2026
6922b0a
:Merge branch 'feature/DrawingRendererRefactor' of https://github.com…
OssianEPPlus Aug 6, 2026
10bb5b5
Moved tests
OssianEPPlus Aug 6, 2026
7b02fbe
Fixed empty legend text items
JanKallman Aug 6, 2026
77c8483
Merge branch 'feature/DrawingRendererRefactor' of https://github.com/…
JanKallman Aug 6, 2026
755cd23
Added StyleFallback Read-Write tests
OssianEPPlus Aug 6, 2026
f088607
Merge branch 'feature/DrawingRendererRefactor' of https://github.com/…
OssianEPPlus Aug 6, 2026
c486918
Fixes several issues with axis and tickmarks
JanKallman Aug 7, 2026
4795839
Fix date category axis
JanKallman Aug 7, 2026
9154986
Added start of new Style Link framework
OssianEPPlus Aug 7, 2026
d42d650
Merge branch 'feature/DrawingRendererRefactor' of https://github.com/…
OssianEPPlus Aug 7, 2026
c0e9e6b
Updated breaking changes md
JanKallman Aug 10, 2026
607f3f1
Merge branch 'feature/DrawingRendererRefactor' of https://github.com/…
JanKallman Aug 10, 2026
21d5bda
Fix/pdf table styling issue (#2458)
AdrianEPPlus Aug 10, 2026
6ff59cd
please work
AdrianEPPlus Aug 10, 2026
fe4bbb1
Partial restructure of applying fills1
OssianEPPlus Aug 10, 2026
9acc57f
Merge branch 'feature/DrawingRendererRefactor' of https://github.com/…
OssianEPPlus Aug 10, 2026
e259df5
Merge branch 'develop8' into develop9
JanKallman Aug 11, 2026
7292631
Merge branch 'feature/DrawingRendererRefactor' into develop9
JanKallman Aug 11, 2026
7ff09ab
Merge pull request #2460 from EPPlusSoftware/feature/DrawingRendererR…
OssianEPPlus Aug 11, 2026
402abdb
fixed styling selection for border in tables
AdrianEPPlus Aug 11, 2026
64b067b
Fixed conditional formatting not setting element order for borders.
AdrianEPPlus Aug 11, 2026
6e50063
Merge branch 'develop9' into fix/moretable
AdrianEPPlus Aug 11, 2026
9a1bc62
Base theme fallback system functional for borders
OssianEPPlus Aug 11, 2026
ed6430c
Merge pull request #2462 from EPPlusSoftware/fix/moretable
OssianEPPlus Aug 12, 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
988066f
WIP
karlkallman Aug 14, 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
2d93289
Changed default shape shade to 15%
OssianEPPlus Aug 17, 2026
6ffa312
#2466 - Fix embedded font subsetting for strict PDF readers (Edge/PDF…
swmal Aug 18, 2026
3fcef11
Feature/pdf compress (#2468)
AdrianEPPlus Aug 18, 2026
9b6531e
Merge branch 'develop9' into bug/i2466
swmal Aug 18, 2026
77409b1
Fixed debug settings, removed debug printing in a few methods
swmal Aug 18, 2026
d4f5b54
Removed test used during error tracking Edge problem
swmal Aug 18, 2026
d9c61db
Merge pull request #2470 from EPPlusSoftware/bug/i2466
AdrianEPPlus Aug 18, 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
f8cdae4
WIP
karlkallman Aug 18, 2026
353c11a
Implemented support for setting diffrent printer settings per workshe…
karlkallman Aug 19, 2026
de58260
Fixed gradient.
JanKallman Aug 19, 2026
3af959d
Clean-up
karlkallman Aug 19, 2026
5c0090c
Fixed Tint/Shade transform calculation
JanKallman Aug 20, 2026
aef22f2
Merge and cleanup
karlkallman Aug 20, 2026
321c58c
Another cleanup
karlkallman Aug 20, 2026
ff25e79
Fixed edge-case fallbacks to use new fix
OssianEPPlus Aug 20, 2026
ceacc71
Merged again
karlkallman 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
d303463
Merge pull request #2478 from EPPlusSoftware/feature/printersettingsp…
AdrianEPPlus Aug 24, 2026
5511c28
Feature/drawing renderer refactor (#2480)
JanKallman Aug 24, 2026
c1e1249
Condenced fallbackTests and made assertive
OssianEPPlus Aug 24, 2026
eec7d57
Resolved bug For ExcelEdited
OssianEPPlus Aug 25, 2026
b5e1d4c
Ensured handling transparency/none
OssianEPPlus Aug 25, 2026
961c2b8
Asserted additional tests. Fixed fillStyle=0
OssianEPPlus Aug 25, 2026
1a16eaf
Started adding object defaults
OssianEPPlus Aug 25, 2026
3a04a3a
added missing file
OssianEPPlus Aug 25, 2026
bee3cb8
Implemented object defaults(initial)
OssianEPPlus Aug 26, 2026
1d92931
Resolved multiple ObjectDefaults reading errors
OssianEPPlus Aug 26, 2026
e8130c6
Fixed horizontal axis. Format number for vertical axis.
JanKallman Aug 26, 2026
073cec5
Fixed default gradient. Set userSpace to object
OssianEPPlus Aug 26, 2026
fca21b0
Merge branch 'feature/DrawingRendererRefactor' of https://github.com/…
OssianEPPlus Aug 26, 2026
03e908e
Merge
JanKallman Aug 27, 2026
b4b2c60
Re-applied user-space-units + fixed vertLines
OssianEPPlus Aug 27, 2026
89ce1db
Merge branch 'feature/DrawingRendererRefactor' of https://github.com/…
OssianEPPlus Aug 27, 2026
2600db1
Edge-case tempfix
OssianEPPlus Aug 28, 2026
aa5bc8f
Added comment removed leftover line
OssianEPPlus Aug 28, 2026
02ea748
Applied defaults except for dataPts and upDownBars
OssianEPPlus Aug 28, 2026
0857431
Added moved file
OssianEPPlus Aug 28, 2026
dce1620
Fixes for html export
JanKallman Aug 28, 2026
5bf4d24
Merge branch 'feature/DrawingRendererRefactor' of https://github.com/…
JanKallman Aug 28, 2026
e64e6fe
Fixed gradientFill for pieslices
OssianEPPlus Aug 28, 2026
8a985fd
Merge branch 'feature/DrawingRendererRefactor' of https://github.com/…
JanKallman Aug 28, 2026
230f864
Fixed html export for drawings-positioning etc
JanKallman Sep 1, 2026
82a9b8c
Fixed default position right
OssianEPPlus Sep 1, 2026
b5ee104
Adjusted default borderwidth/series icon for datalabels
OssianEPPlus Sep 1, 2026
7efb656
Applied Datalabel fallback fill
OssianEPPlus Sep 1, 2026
6da6763
Merge branch 'feature/DrawingRendererRefactor' of https://github.com/…
OssianEPPlus Sep 1, 2026
1accac6
New TextMetrics.zip file with new content, draft implementation of Ge…
swmal Sep 1, 2026
2327b97
Fixed minor tickmarks on date axis
JanKallman Sep 1, 2026
dbec5d2
Bar chart fix using global position (for now)
OssianEPPlus Sep 1, 2026
45f3de9
Fixed border-width failing unit tests
OssianEPPlus Sep 1, 2026
91b6fff
Same fix for bars as for columns
OssianEPPlus Sep 1, 2026
522a860
Merge branch 'feature/DrawingRendererRefactor' of https://github.com/…
OssianEPPlus Sep 1, 2026
d002d8a
Fixed test
JanKallman Sep 2, 2026
a07397e
Merge branch 'feature/DrawingRendererRefactor' of https://github.com/…
JanKallman Sep 2, 2026
36e89dd
Merge branch 'develop8' into feature/DrawingRendererRefactor
JanKallman Sep 2, 2026
64827b8
Fixed failing test
OssianEPPlus Sep 2, 2026
824045b
Merge branch 'feature/DrawingRendererRefactor' of https://github.com/…
OssianEPPlus Sep 2, 2026
c7b8598
Fixed style defaults and verified with test adjustment
OssianEPPlus Sep 2, 2026
9878311
Big PDF fixes merge. (#2494)
AdrianEPPlus Sep 2, 2026
b1e1056
Fixed issues from failing tests
JanKallman Sep 2, 2026
662377a
Merge branch 'feature/DrawingRendererRefactor' of https://github.com/…
JanKallman Sep 2, 2026
fc265be
Merge develop9
JanKallman Sep 2, 2026
67e75a9
Fixed datalabels for point explosions
OssianEPPlus Sep 2, 2026
7101db3
Fixed faulty adjustment of BestFit
OssianEPPlus Sep 2, 2026
bd8cb09
Fixed bestfit issue
OssianEPPlus Sep 2, 2026
a47b649
Merge branch 'feature/DrawingRendererRefactor' of https://github.com/…
OssianEPPlus Sep 2, 2026
bdae92d
Fixed some pdf issues with blazor
JanKallman Sep 3, 2026
597ed56
Merge branch 'feature/DrawingRendererRefactor' of https://github.com/…
JanKallman Sep 3, 2026
7e1d804
Fixed white borders on data points
OssianEPPlus Sep 3, 2026
8ccd2d4
#2492: TextShaper for GenericFontMetrics. Cleanup: removed OpenTypeFo…
swmal Sep 3, 2026
21455ca
Merge branch 'feature/DrawingRendererRefactor' of https://github.com/…
OssianEPPlus Sep 3, 2026
dbdd631
Fixed bar/column charts with date axis and negative values
JanKallman Sep 3, 2026
f6f908d
Merge branch 'feature/DrawingRendererRefactor' of https://github.com/…
JanKallman Sep 3, 2026
6ea3ad6
Fixed transparent blazor bars
OssianEPPlus Sep 3, 2026
01ae051
Adjusted rounding var for BestFit pieCharts
OssianEPPlus Sep 3, 2026
4e3989e
Fixes axis positioning with negative min values
JanKallman Sep 3, 2026
330d785
Add svg wrap tests
OssianEPPlus Sep 3, 2026
053e472
Merge branch 'feature/DrawingRendererRefactor' of https://github.com/…
OssianEPPlus Sep 3, 2026
2c19992
Actually added tests
OssianEPPlus Sep 3, 2026
7481a3c
Merge pull request #2495 from EPPlusSoftware/feature/DrawingRendererR…
OssianEPPlus Sep 3, 2026
f459a89
#2492 - Added MetricsFallbackMode to fontconfig
swmal Sep 3, 2026
6fc0cf3
Merged develop9
swmal Sep 3, 2026
1f8936d
Feature/pdf images (#2497)
AdrianEPPlus Sep 4, 2026
9aa294c
Removed unused _engine field in DefaultFontProvider
Sep 4, 2026
eef2f91
Merge pull request #2496 from EPPlusSoftware/feature/i2492
AdrianEPPlus Sep 4, 2026
e2d9c61
Fixes verification exception in .NET framework (#2499)
JanKallman Sep 7, 2026
4d14607
Fixed pdf being broken and fixed square gradients being broken in fir…
AdrianEPPlus Sep 7, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
219 changes: 175 additions & 44 deletions .github/workflows/Build-Release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -21,19 +21,44 @@ jobs:
with:
dotnet-version: '9.0.x'

# --- Read version and TFMs from csproj ---
- name: Read version and target frameworks from csproj
id: read_csproj
# --- Read version and target frameworks from Directory.Build.props ---
# Both Version and the shared target framework list are centralized in
# src/Directory.Build.props (shared by EPPlus and the four embedded sub-projects:
# DrawingRenderer, Export.Pdf, Fonts.OpenType, Graphics). EPPlus.csproj no longer
# holds a literal TFM list; it consumes $(EPPlusCoreTargetFrameworks), which a raw
# XML parser cannot expand. Therefore both values are read directly from props.
- name: Read version and target frameworks
id: read_version
run: |
$xml = [xml](Get-Content ./src/EPPlus/EPPlus.csproj)
$version = $xml.Project.PropertyGroup.Version | Where-Object { $_ } | Select-Object -First 1
$tfms = $xml.Project.PropertyGroup.TargetFrameworks | Where-Object { $_ } | Select-Object -First 1
$propsXml = [xml](Get-Content ./src/Directory.Build.props)
$version = $propsXml.Project.PropertyGroup.Version | Where-Object { $_ } | Select-Object -First 1
if ([string]::IsNullOrWhiteSpace($version)) {
Write-Error "Failed to read Version from src/Directory.Build.props. Aborting build."
exit 1
}

$tfms = $propsXml.Project.PropertyGroup.EPPlusCoreTargetFrameworks | Where-Object { $_ } | Select-Object -First 1
if ([string]::IsNullOrWhiteSpace($tfms)) {
Write-Error "Failed to read EPPlusCoreTargetFrameworks from src/Directory.Build.props. Aborting build."
exit 1
}

echo "VERSION=$version" >> $env:GITHUB_ENV
echo "TFMS=$tfms" >> $env:GITHUB_ENV
Write-Host "Version: $version"
Write-Host "Target frameworks: $tfms"
shell: pwsh

- name: Restore dependencies
run: dotnet restore ./src/EPPlus.sln

# Build the whole solution. Note: the EPPlus NuGet package is produced here, not by a
# separate 'dotnet pack' step. EPPlus.csproj has GeneratePackageOnBuild=true and a custom
# target (IncludeReferencedProjectsInPackage) that embeds the four sub-project DLLs into
# lib/<tfm>/ inside the package. That target only runs correctly as part of a build, because
# it depends on ReferenceCopyLocalPaths being populated; a standalone 'dotnet pack' produces
# an incomplete package containing only EPPlus.dll. The resulting .nupkg is picked up from
# src/EPPlus/bin/Release/ below.
- name: Build
run: dotnet build ./src/EPPlus.sln --no-restore --configuration Release
- name: Test
Expand All @@ -51,50 +76,162 @@ jobs:
creds: '{"clientId":"${{ secrets.EPPLUS_CODE_SIGNING_APPLICATION_ID }}","clientSecret":"${{ secrets.EPPLUS_CODE_SIGNING_SECRET }}","subscriptionId":"${{ secrets.EPPLUS_CODE_SIGNING_SUBSCRIPTION_ID }}","tenantId":"${{ secrets.EPPLUS_CODE_SIGNING_TENENT_ID }}"}'

# --- Sign DLLs ---
- name: Sign EPPlus.dll with AzureSignTool
# All assemblies that ship inside a NuGet package are signed here, before the package is signed.
# EPPlus + the four embedded sub-projects (DrawingRenderer, Export.Pdf, Fonts.OpenType,
# Graphics) share the same target frameworks (EPPlusCoreTargetFrameworks, read into env.TFMS).
# EPPlus.Interfaces and EPPlus.System.Drawing are separate NuGet packages (unchanged from
# earlier versions) and are also signed here, as before.
# NOTE: this signs the DLLs in each project's bin/Release/<tfm> output. The embedded copies
# inside the EPPlus package are taken from these same signed outputs, so the package verify
# step below confirms the embedded DLLs carry a valid signature.
- name: Sign assemblies with AzureSignTool
run: |
$projectsToSign = @(
"EPPlus",
"EPPlus.Interfaces",
"EPPlus.System.Drawing",
"EPPlus.DrawingRenderer",
"EPPlus.Export.Pdf",
"EPPlus.Fonts.OpenType",
"EPPlus.Graphics"
)

$tfms = "${{ env.TFMS }}" -split ";"
foreach ($tfm in $tfms) {
$tfm = $tfm.Trim()
if ([string]::IsNullOrEmpty($tfm)) { continue }
$dll = ".\src\EPPlus\bin\Release\$tfm\EPPlus.dll"
Write-Host "Signing $dll"
azuresigntool.exe sign -kvu ${{ secrets.EPPLUS_CODE_SIGNING_KEY_VAULT_URL }} -kvi ${{ secrets.EPPLUS_CODE_SIGNING_APPLICATION_ID }} -kvt ${{ secrets.EPPLUS_CODE_SIGNING_TENENT_ID }} -kvs ${{ secrets.EPPLUS_CODE_SIGNING_SECRET }} -kvc ${{ secrets.EPPLUS_CODE_SIGNING_CERTIFICATE_NAME }} -tr http://timestamp.globalsign.com/tsa/advanced -td sha256 "$dll"

foreach ($project in $projectsToSign) {
foreach ($tfm in $tfms) {
$tfm = $tfm.Trim()
if ([string]::IsNullOrEmpty($tfm)) { continue }

$dll = ".\src\$project\bin\Release\$tfm\$project.dll"
if (-not (Test-Path $dll)) {
Write-Host "Skipping $dll (not built for this target framework)"
continue
}

Write-Host "Signing $dll"
azuresigntool.exe sign `
-kvu ${{ secrets.EPPLUS_CODE_SIGNING_KEY_VAULT_URL }} `
-kvi ${{ secrets.EPPLUS_CODE_SIGNING_APPLICATION_ID }} `
-kvt ${{ secrets.EPPLUS_CODE_SIGNING_TENENT_ID }} `
-kvs ${{ secrets.EPPLUS_CODE_SIGNING_SECRET }} `
-kvc ${{ secrets.EPPLUS_CODE_SIGNING_CERTIFICATE_NAME }} `
-tr http://timestamp.globalsign.com/tsa/advanced `
-td sha256 `
"$dll"
}
}
shell: pwsh
- name: Sign EPPlus.Interfaces.dll with AzureSignTool
# --- Sign DLLs ---

# --- Collect the built packages ---
# The packages are produced by the build (GeneratePackageOnBuild), not by 'dotnet pack'.
# We copy the three packages we actually ship (EPPlus, EPPlus.Interfaces, EPPlus.System.Drawing)
# into ./output for signing and upload. The four sub-projects and the benchmark project have
# IsPackable=false and therefore produce no package of their own; the sub-project DLLs ship
# embedded inside the EPPlus package.
- name: Collect NuGet packages
run: |
$tfms = "${{ env.TFMS }}" -split ";"
foreach ($tfm in $tfms) {
$tfm = $tfm.Trim()
if ([string]::IsNullOrEmpty($tfm)) { continue }
$dll = ".\src\EPPlus.Interfaces\bin\Release\$tfm\EPPlus.Interfaces.dll"
Write-Host "Signing $dll"
azuresigntool.exe sign -kvu ${{ secrets.EPPLUS_CODE_SIGNING_KEY_VAULT_URL }} -kvi ${{ secrets.EPPLUS_CODE_SIGNING_APPLICATION_ID }} -kvt ${{ secrets.EPPLUS_CODE_SIGNING_TENENT_ID }} -kvs ${{ secrets.EPPLUS_CODE_SIGNING_SECRET }} -kvc ${{ secrets.EPPLUS_CODE_SIGNING_CERTIFICATE_NAME }} -tr http://timestamp.globalsign.com/tsa/advanced -td sha256 "$dll"
New-Item -ItemType Directory -Force -Path ./output | Out-Null

$packageProjects = @(
"EPPlus",
"EPPlus.Interfaces",
"EPPlus.System.Drawing"
)

$found = $false
foreach ($project in $packageProjects) {
$pkgDir = ".\src\$project\bin\Release"
$pkgs = Get-ChildItem -Path $pkgDir -Filter "*.nupkg" -ErrorAction SilentlyContinue |
Where-Object { $_.Name -notmatch "\.symbols\.nupkg$" }

if ($null -eq $pkgs -or $pkgs.Count -eq 0) {
Write-Error "No .nupkg found for $project in $pkgDir. Expected GeneratePackageOnBuild to produce one."
exit 1
}

foreach ($pkg in $pkgs) {
Write-Host "Collecting $($pkg.Name) from $pkgDir"
Copy-Item $pkg.FullName -Destination ./output -Force
$found = $true
}
}
shell: pwsh
- name: Sign EPPlus.System.Drawing.dll with AzureSignTool
run: |
$tfms = "${{ env.TFMS }}" -split ";"
foreach ($tfm in $tfms) {
$tfm = $tfm.Trim()
if ([string]::IsNullOrEmpty($tfm)) { continue }
$dll = ".\src\EPPlus.System.Drawing\bin\Release\$tfm\EPPlus.System.Drawing.dll"
Write-Host "Signing $dll"
azuresigntool.exe sign -kvu ${{ secrets.EPPLUS_CODE_SIGNING_KEY_VAULT_URL }} -kvi ${{ secrets.EPPLUS_CODE_SIGNING_APPLICATION_ID }} -kvt ${{ secrets.EPPLUS_CODE_SIGNING_TENENT_ID }} -kvs ${{ secrets.EPPLUS_CODE_SIGNING_SECRET }} -kvc ${{ secrets.EPPLUS_CODE_SIGNING_CERTIFICATE_NAME }} -tr http://timestamp.globalsign.com/tsa/advanced -td sha256 "$dll"

if (-not $found) {
Write-Error "No packages were collected. Aborting."
exit 1
}
shell: pwsh
# --- Sign DLLs ---
# --- Collect the built packages ---

- name: Pack NuGet package
run: dotnet pack ./src/EPPlus.sln --configuration Release --output ./output
- name: Sign NuGet package
- name: Sign NuGet packages
run: |
NuGetKeyVaultSignTool.exe sign -kvu ${{ secrets.EPPLUS_CODE_SIGNING_KEY_VAULT_URL }} -kvc ${{ secrets.EPPLUS_CODE_SIGNING_CERTIFICATE_NAME }} -kvi ${{ secrets.EPPLUS_CODE_SIGNING_APPLICATION_ID }} -kvs ${{ secrets.EPPLUS_CODE_SIGNING_SECRET }} -kvt ${{ secrets.EPPLUS_CODE_SIGNING_TENENT_ID }} -tr http://timestamp.globalsign.com/tsa/advanced -fd sha256 -td sha256 -own EPPlusSoftware ".\output\*.nupkg"
- name: Upload NuGet package as artifact

# --- Verify the EPPlus package contains the embedded assemblies, correctly signed ---
# Automates the manual check that the four sub-projects are present in the final EPPlus
# package and signed with the same certificate as EPPlus.dll. This is the primary safety net:
# because packaging depends on build behaviour, this step must fail the build if the package
# is ever produced without all five embedded assemblies.
- name: Verify EPPlus package contents and signatures
run: |
$nupkg = Get-ChildItem ./output/*.nupkg |
Where-Object { $_.Name -notmatch "EPPlus\.Interfaces" -and $_.Name -notmatch "EPPlus\.System\.Drawing" } |
Where-Object { $_.Name -notmatch "\.symbols\.nupkg$" } |
Select-Object -First 1

if ($null -eq $nupkg) {
Write-Error "Could not locate the main EPPlus .nupkg in ./output."
exit 1
}
Write-Host "Verifying package: $($nupkg.Name)"

$extractPath = "./nupkg-verify"
if (Test-Path $extractPath) { Remove-Item $extractPath -Recurse -Force }
Expand-Archive -Path $nupkg.FullName -DestinationPath $extractPath -Force

# The five assemblies that must ship inside the EPPlus package.
$expectedDlls = @(
"EPPlus.dll",
"EPPlus.DrawingRenderer.dll",
"EPPlus.Export.Pdf.dll",
"EPPlus.Fonts.OpenType.dll",
"EPPlus.Graphics.dll"
)

$hasError = $false
foreach ($dllName in $expectedDlls) {
$found = Get-ChildItem -Path $extractPath -Recurse -Filter $dllName
if ($found.Count -eq 0) {
Write-Host "ERROR: $dllName not found anywhere in the package."
$hasError = $true
continue
}

foreach ($file in $found) {
$signature = Get-AuthenticodeSignature $file.FullName
if ($signature.Status -ne "Valid") {
Write-Host "ERROR: $($file.FullName) is not validly signed (status: $($signature.Status))."
$hasError = $true
} else {
Write-Host "OK: $($file.FullName) present and validly signed."
}
}
}

if ($hasError) {
Write-Error "Package verification failed. See errors above."
exit 1
}
Write-Host "All embedded assemblies are present and validly signed."
shell: pwsh
# --- Verify package contents ---

- name: Upload NuGet packages as artifact
uses: actions/upload-artifact@v4
with:
name: signed-nuget-package
name: signed-nuget-packages
path: ./output/*.nupkg

# --- SBOM (after build to avoid CycloneDX overwriting project.assets.json) ---
Expand Down Expand Up @@ -132,10 +269,4 @@ jobs:
--auth-mode login `
--overwrite
}
shell: pwsh
- name: Upload all SBOMs as artifact
uses: actions/upload-artifact@v4
with:
name: sbom
path: ./sbom/
# --- SBOM ---
shell: pwsh
13 changes: 13 additions & 0 deletions docs/articles/breakingchanges.md
Original file line number Diff line number Diff line change
Expand Up @@ -216,10 +216,23 @@ Renaming worksheet's will now change the formula correctly to include single quo

### 8.0.2
* Removed base class from ExcelVmlDrawingPosition and with that the Load, UpdateXml methods and the RowOff and ColOff properties as they were duplicates.
### 8.5.0
* Setting dataLabelPosition.Top on BarCharts corrupted the excel file when saved. Trying to set this now throws an error instead.
* NumberFormatToTextArgs.NumberFormat now returns the interface IExcelNumberFormat rather than the ExcelNumberFormatXml class. All public variables remain the same and it can be safely cast to ´ExcelNumberFormatXml´ as long as ´Package.Workbook.NumberFormatToTextHandler´ is null.


### 8.5.5
* `ws.Cells["A1"].RichText` no longer sets cells with `null` to `string.empty`
* .RichText no longer sets the cell or contents to be RichText automatically.
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.
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
2 changes: 2 additions & 0 deletions docs/articles/fixedissues.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
# 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).
Expand Down
1 change: 1 addition & 0 deletions src/.runsettings
Original file line number Diff line number Diff line change
Expand Up @@ -16,5 +16,6 @@
<DeleteDeploymentDirectoryAfterTestRunIsComplete>False</DeleteDeploymentDirectoryAfterTestRunIsComplete>
<DeploymentEnabled>False</DeploymentEnabled>
<ConsiderFixturesAsSpecialTests>False</ConsiderFixturesAsSpecialTests>
<OrderTestsByNameInClass>true</OrderTestsByNameInClass>
</MSTest>
</RunSettings>
83 changes: 48 additions & 35 deletions src/Directory.Build.props
Original file line number Diff line number Diff line change
@@ -1,39 +1,52 @@
<Project>

<PropertyGroup Condition=" '$(TargetFramework)' == 'netstandard2.0'">
<DefineConstants>Core;Standard20</DefineConstants>
</PropertyGroup>

<PropertyGroup Condition=" '$(TargetFramework)' == 'netstandard2.1'">
<DefineConstants>Core;Standard21</DefineConstants>
</PropertyGroup>

<PropertyGroup Condition=" '$(TargetFramework)' == 'net7.0'">
<DefineConstants>Core;NET70</DefineConstants>
</PropertyGroup>

<PropertyGroup Condition=" '$(TargetFramework)' == 'net8.0'">
<DefineConstants>Core;NET80</DefineConstants>
</PropertyGroup>

<PropertyGroup Condition=" '$(TargetFramework)' == 'net9.0'">
<DefineConstants>Core;NET90</DefineConstants>
</PropertyGroup>

<PropertyGroup Condition=" '$(TargetFramework)' == 'net10.0'">
<DefineConstants>Core;NET100</DefineConstants>
</PropertyGroup>

<PropertyGroup Condition=" '$(TargetFramework)' == 'net481'">
<DefineConstants>NET481;NETFULL</DefineConstants>
</PropertyGroup>

<PropertyGroup Condition=" '$(TargetFramework)' == 'net462'">
<DefineConstants>NET462;NETFULL</DefineConstants>
</PropertyGroup>

<PropertyGroup Condition=" '$(TargetFramework)' == 'net35'">
<DefineConstants>NET35;NETFULL</DefineConstants>
</PropertyGroup>
<PropertyGroup>
<!-- Shared version for EPPlus and its embedded sub-projects -->
<AssemblyVersion>9.0.1.0</AssemblyVersion>
<FileVersion>9.0.1.0</FileVersion>
<Version>9.0.1</Version>

<!-- Shared target frameworks for EPPlus and the four embedded sub-projects.
Consumed explicitly per project via <TargetFrameworks>$(EPPlusCoreTargetFrameworks)</TargetFrameworks>.
NOT applied automatically, so separate packages (Interfaces, System.Drawing)
and Test/Benchmark projects are unaffected. -->
<EPPlusCoreTargetFrameworks>net8.0;net9.0;net10.0;netstandard2.1;netstandard2.0;net462</EPPlusCoreTargetFrameworks>
</PropertyGroup>

<PropertyGroup Condition=" '$(TargetFramework)' == 'netstandard2.0'">
<DefineConstants>Core;Standard20</DefineConstants>
</PropertyGroup>

<PropertyGroup Condition=" '$(TargetFramework)' == 'netstandard2.1'">
<DefineConstants>Core;Standard21</DefineConstants>
</PropertyGroup>

<PropertyGroup Condition=" '$(TargetFramework)' == 'net7.0'">
<DefineConstants>Core;NET70</DefineConstants>
</PropertyGroup>

<PropertyGroup Condition=" '$(TargetFramework)' == 'net8.0'">
<DefineConstants>Core;NET80</DefineConstants>
</PropertyGroup>

<PropertyGroup Condition=" '$(TargetFramework)' == 'net9.0'">
<DefineConstants>Core;NET90</DefineConstants>
</PropertyGroup>

<PropertyGroup Condition=" '$(TargetFramework)' == 'net10.0'">
<DefineConstants>Core;NET100</DefineConstants>
</PropertyGroup>

<PropertyGroup Condition=" '$(TargetFramework)' == 'net481'">
<DefineConstants>NET481;NETFULL</DefineConstants>
</PropertyGroup>

<PropertyGroup Condition=" '$(TargetFramework)' == 'net462'">
<DefineConstants>NET462;NETFULL</DefineConstants>
</PropertyGroup>

<PropertyGroup Condition=" '$(TargetFramework)' == 'net35'">
<DefineConstants>NET35;NETFULL</DefineConstants>
</PropertyGroup>

</Project>
Loading
Loading