From 157a46a3cb83f78fa714cdd4b468ea4a241ceb29 Mon Sep 17 00:00:00 2001 From: swmal <897655+swmal@users.noreply.github.com> Date: Wed, 8 Apr 2026 13:30:14 +0200 Subject: [PATCH] #2325 - Throws NotSupportedException if opening workbook saved in Strict OpenXML format --- src/EPPlus/ExcelWorkbook.cs | 19 +++++++++++++++++++ src/EPPlusTest/EPPlus.Test.csproj | 3 +++ src/EPPlusTest/Issues/WorksheetIssues.cs | 11 +++++++++++ src/EPPlusTest/Workbooks/StrictOpenXml.xlsx | Bin 0 -> 8597 bytes 4 files changed, 33 insertions(+) create mode 100644 src/EPPlusTest/Workbooks/StrictOpenXml.xlsx diff --git a/src/EPPlus/ExcelWorkbook.cs b/src/EPPlus/ExcelWorkbook.cs index b285effb19..96d54380b3 100644 --- a/src/EPPlus/ExcelWorkbook.cs +++ b/src/EPPlus/ExcelWorkbook.cs @@ -1127,6 +1127,22 @@ public bool Date1904 } } + private const string StrictSpreadsheetMainNamespace = "http://purl.oclc.org/ooxml/spreadsheetml/main"; + + // Call this when loading the workbook XML + private void ValidateWorkbookNamespace() + { + string defaultNamespace = _workbookXml.DocumentElement.NamespaceURI; + if (defaultNamespace == StrictSpreadsheetMainNamespace) + { + throw new NotSupportedException( + "The workbook is saved in the \"Strict Open XML Spreadsheet\" format, " + + "which is not supported by EPPlus. " + + "Please re-save the workbook as a regular \"Excel Workbook (.xlsx)\" " + + "in the Save As dialog and try again."); + } + } + /// /// Create or read the XML for the workbook. @@ -1134,7 +1150,10 @@ public bool Date1904 private void CreateWorkbookXml(XmlNamespaceManager namespaceManager) { if (_package.ZipPackage.PartExists(WorkbookUri)) + { _workbookXml = _package.GetXmlFromUri(WorkbookUri); + ValidateWorkbookNamespace(); + } else { // create a new workbook part and add to the package diff --git a/src/EPPlusTest/EPPlus.Test.csproj b/src/EPPlusTest/EPPlus.Test.csproj index 2106571c84..a1cdb5ed95 100644 --- a/src/EPPlusTest/EPPlus.Test.csproj +++ b/src/EPPlusTest/EPPlus.Test.csproj @@ -250,6 +250,9 @@ PreserveNewest + + PreserveNewest + PreserveNewest diff --git a/src/EPPlusTest/Issues/WorksheetIssues.cs b/src/EPPlusTest/Issues/WorksheetIssues.cs index 13aaf05306..c6258b6390 100644 --- a/src/EPPlusTest/Issues/WorksheetIssues.cs +++ b/src/EPPlusTest/Issues/WorksheetIssues.cs @@ -1130,5 +1130,16 @@ public void InsertAndShift_ShouldNotThrow_WhenArrayIsFull() sheet.InsertColumn(5, 1); } + [TestMethod] + public void Issue2325() + { + var ex = Assert.ThrowsExactly(() => + { + var package = OpenTemplatePackage("StrictOpenXml.xlsx"); + var ws = package.Workbook.Worksheets.First(); + }); + Assert.IsTrue(ex.Message.Contains("Strict Open XML")); + } + } } diff --git a/src/EPPlusTest/Workbooks/StrictOpenXml.xlsx b/src/EPPlusTest/Workbooks/StrictOpenXml.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..a225a21dd4ad69aa63cbd52ff6dcd2b835de94d2 GIT binary patch literal 8597 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 a@c)D`C3$%0-9Ves(2o!_%!!iz{PurBmm5R? literal 0 HcmV?d00001