From a4b166049608d0069f6c2c027db3316d9e80d98f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ossian=20Edstr=C3=B6m?= Date: Thu, 16 Apr 2026 11:22:42 +0200 Subject: [PATCH 1/2] Initial fix --- .../HtmlExport/Enums/ePictureInclude.cs | 2 +- .../Internal/HtmlExporterBaseInternal.cs | 33 ++++++++++++++++++- .../Settings/HtmlPictureSettings.cs | 3 ++ .../Export/HtmlExport/RangeExporterTests.cs | 24 ++++++++++++++ 4 files changed, 60 insertions(+), 2 deletions(-) diff --git a/src/EPPlus/Export/HtmlExport/Enums/ePictureInclude.cs b/src/EPPlus/Export/HtmlExport/Enums/ePictureInclude.cs index 7084131138..4a31d3bd2c 100644 --- a/src/EPPlus/Export/HtmlExport/Enums/ePictureInclude.cs +++ b/src/EPPlus/Export/HtmlExport/Enums/ePictureInclude.cs @@ -29,6 +29,6 @@ public enum ePictureInclude /// /// Include the images in the html export. /// - Include + Include, } } diff --git a/src/EPPlus/Export/HtmlExport/Exporters/Internal/HtmlExporterBaseInternal.cs b/src/EPPlus/Export/HtmlExport/Exporters/Internal/HtmlExporterBaseInternal.cs index fe400f6cf5..361e38b53e 100644 --- a/src/EPPlus/Export/HtmlExport/Exporters/Internal/HtmlExporterBaseInternal.cs +++ b/src/EPPlus/Export/HtmlExport/Exporters/Internal/HtmlExporterBaseInternal.cs @@ -11,10 +11,12 @@ Date Author Change 6/4/2022 EPPlus Software AB ExcelTable Html Export *************************************************************************************************/ using OfficeOpenXml.Core; +using OfficeOpenXml.Drawing; using OfficeOpenXml.Drawing.Interfaces; using OfficeOpenXml.Export.HtmlExport.Accessibility; using OfficeOpenXml.Export.HtmlExport.HtmlCollections; using OfficeOpenXml.Export.HtmlExport.Parsers; +using OfficeOpenXml.Export.HtmlExport.Translators; using OfficeOpenXml.Table; using OfficeOpenXml.Utils; using OfficeOpenXml.Utils.String; @@ -381,6 +383,24 @@ protected void AddContent(ExcelRangeBase cell, HTMLElement contentElement) } } + + private object GetContentType(ePictureType type) + { + switch (type) + { + case ePictureType.Ico: + return "image/vnd.microsoft.icon"; + case ePictureType.Jpg: + return "image/jpeg"; + case ePictureType.Svg: + return "image/svg+xml"; + case ePictureType.Tif: + return "image/tiff"; + default: + return $"image/{type}"; + } + } + protected void AddImage(HTMLElement parent, HtmlExportSettings settings, HtmlImage image, object value) { if (image != null) @@ -393,7 +413,18 @@ protected void AddImage(HTMLElement parent, HtmlExportSettings settings, HtmlIma { child.AddAttribute("id", imageName); } - child.AddAttribute("class", $"{settings.StyleClassPrefix}image-{name} {settings.StyleClassPrefix}image-prop-{imageName}"); + + if(settings.Pictures.EmbedImagesInHtml) + { + ePictureType? type; + var _encodedImage = ImageEncoder.EncodeImage(image, out type); + + child.AddAttribute("src", $"data:{GetContentType(type.Value)};base64,{_encodedImage}"); + } + else + { + child.AddAttribute("class", $"{settings.StyleClassPrefix}image-{name} {settings.StyleClassPrefix}image-prop-{imageName}"); + } parent._childElements.Add(child); } } diff --git a/src/EPPlus/Export/HtmlExport/Settings/HtmlPictureSettings.cs b/src/EPPlus/Export/HtmlExport/Settings/HtmlPictureSettings.cs index 85e655b042..71abb182ff 100644 --- a/src/EPPlus/Export/HtmlExport/Settings/HtmlPictureSettings.cs +++ b/src/EPPlus/Export/HtmlExport/Settings/HtmlPictureSettings.cs @@ -22,6 +22,9 @@ internal HtmlPictureSettings() { } + + public bool EmbedImagesInHtml = false; + /// /// If picture drawings should be included in the html. Default is /// diff --git a/src/EPPlusTest/Export/HtmlExport/RangeExporterTests.cs b/src/EPPlusTest/Export/HtmlExport/RangeExporterTests.cs index b36d85ad3c..ee32815386 100644 --- a/src/EPPlusTest/Export/HtmlExport/RangeExporterTests.cs +++ b/src/EPPlusTest/Export/HtmlExport/RangeExporterTests.cs @@ -195,6 +195,30 @@ public async Task WriteImagesAsync() Assert.AreEqual(html, htmlAsync); } } + + [TestMethod] + public async Task WriteImagesAsyncBoolEmbed() + { + using (var p = OpenTemplatePackage("20-CreateAFileSystemReport.xlsx")) + { + var sheet = p.Workbook.Worksheets[0]; + var exporter = sheet.Cells["A1:E30"].CreateHtmlExporter(); + + exporter.Settings.SetColumnWidth = true; + exporter.Settings.SetRowHeight = true; + exporter.Settings.Pictures.Include = ePictureInclude.Include; + exporter.Settings.Minify = false; + exporter.Settings.Encoding = Encoding.UTF8; + exporter.Settings.Pictures.EmbedImagesInHtml = true; + + var html = exporter.GetSinglePage(); + var htmlAsync = await exporter.GetSinglePageAsync(); + File.WriteAllText("c:\\temp\\" + sheet.Name + ".html", html); + File.WriteAllText("c:\\temp\\" + sheet.Name + "-async.html", htmlAsync); + Assert.AreEqual(html, htmlAsync); + } + } + [TestMethod] public void ExportMultipleRanges() { From d2f9f1008b1cbb1bb6aacad684d003de5a0848a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ossian=20Edstr=C3=B6m?= Date: Thu, 16 Apr 2026 11:30:49 +0200 Subject: [PATCH 2/2] Better solution using existing data-structures --- src/EPPlus/Export/HtmlExport/Enums/ePictureInclude.cs | 4 ++++ .../Exporters/Internal/HtmlExporterBaseInternal.cs | 6 +++--- .../Export/HtmlExport/Settings/HtmlPictureSettings.cs | 2 -- .../Export/HtmlExport/RangeExporterTests.cs | 11 ++++------- 4 files changed, 11 insertions(+), 12 deletions(-) diff --git a/src/EPPlus/Export/HtmlExport/Enums/ePictureInclude.cs b/src/EPPlus/Export/HtmlExport/Enums/ePictureInclude.cs index 4a31d3bd2c..b5e8f7bb97 100644 --- a/src/EPPlus/Export/HtmlExport/Enums/ePictureInclude.cs +++ b/src/EPPlus/Export/HtmlExport/Enums/ePictureInclude.cs @@ -30,5 +30,9 @@ public enum ePictureInclude /// Include the images in the html export. /// Include, + /// + /// Include the images only in the HTML. + /// + IncludeInHtmlOnly } } diff --git a/src/EPPlus/Export/HtmlExport/Exporters/Internal/HtmlExporterBaseInternal.cs b/src/EPPlus/Export/HtmlExport/Exporters/Internal/HtmlExporterBaseInternal.cs index 361e38b53e..e970079292 100644 --- a/src/EPPlus/Export/HtmlExport/Exporters/Internal/HtmlExporterBaseInternal.cs +++ b/src/EPPlus/Export/HtmlExport/Exporters/Internal/HtmlExporterBaseInternal.cs @@ -148,7 +148,7 @@ protected HTMLElement GetThead(ExcelRangeBase range, List headers = null AddTableData(table, contentElement, col); - if (Settings.Pictures.Include == ePictureInclude.Include) + if (Settings.Pictures.Include == (ePictureInclude.Include | ePictureInclude.IncludeInHtmlOnly)) { image = GetImage(cell.Worksheet.PositionId, cell._fromRow, cell._fromCol); } @@ -269,7 +269,7 @@ protected HTMLElement GetTableBody(ExcelRangeBase range, int row, int endRow) SetColRowSpan(range, tblData, cell); - if (Settings.Pictures.Include == ePictureInclude.Include) + if (Settings.Pictures.Include == (ePictureInclude.Include | ePictureInclude.IncludeInHtmlOnly)) { image = GetImage(cell.Worksheet.PositionId, cell._fromRow, cell._fromCol); } @@ -414,7 +414,7 @@ protected void AddImage(HTMLElement parent, HtmlExportSettings settings, HtmlIma child.AddAttribute("id", imageName); } - if(settings.Pictures.EmbedImagesInHtml) + if(settings.Pictures.Include == ePictureInclude.IncludeInHtmlOnly) { ePictureType? type; var _encodedImage = ImageEncoder.EncodeImage(image, out type); diff --git a/src/EPPlus/Export/HtmlExport/Settings/HtmlPictureSettings.cs b/src/EPPlus/Export/HtmlExport/Settings/HtmlPictureSettings.cs index 71abb182ff..fabec04d8e 100644 --- a/src/EPPlus/Export/HtmlExport/Settings/HtmlPictureSettings.cs +++ b/src/EPPlus/Export/HtmlExport/Settings/HtmlPictureSettings.cs @@ -23,8 +23,6 @@ internal HtmlPictureSettings() } - public bool EmbedImagesInHtml = false; - /// /// If picture drawings should be included in the html. Default is /// diff --git a/src/EPPlusTest/Export/HtmlExport/RangeExporterTests.cs b/src/EPPlusTest/Export/HtmlExport/RangeExporterTests.cs index ee32815386..4c8f323d17 100644 --- a/src/EPPlusTest/Export/HtmlExport/RangeExporterTests.cs +++ b/src/EPPlusTest/Export/HtmlExport/RangeExporterTests.cs @@ -197,7 +197,7 @@ public async Task WriteImagesAsync() } [TestMethod] - public async Task WriteImagesAsyncBoolEmbed() + public async Task WriteImagesAsyncHTMLOnlyEmbed() { using (var p = OpenTemplatePackage("20-CreateAFileSystemReport.xlsx")) { @@ -206,16 +206,13 @@ public async Task WriteImagesAsyncBoolEmbed() exporter.Settings.SetColumnWidth = true; exporter.Settings.SetRowHeight = true; - exporter.Settings.Pictures.Include = ePictureInclude.Include; + exporter.Settings.Pictures.Include = ePictureInclude.IncludeInHtmlOnly; exporter.Settings.Minify = false; exporter.Settings.Encoding = Encoding.UTF8; - exporter.Settings.Pictures.EmbedImagesInHtml = true; - var html = exporter.GetSinglePage(); + var html = exporter.GetHtmlString(); var htmlAsync = await exporter.GetSinglePageAsync(); - File.WriteAllText("c:\\temp\\" + sheet.Name + ".html", html); - File.WriteAllText("c:\\temp\\" + sheet.Name + "-async.html", htmlAsync); - Assert.AreEqual(html, htmlAsync); + File.WriteAllText("c:\\temp\\" + sheet.Name + "_htmlOnly.html", html); } }