From 1a5ecff5053b87f00631b58dbeb7bea83ba74350 Mon Sep 17 00:00:00 2001 From: Antony Liu Date: Sat, 28 Jun 2025 20:52:28 +0800 Subject: [PATCH 1/6] bug 61296: deduplicate ooxml schema constants --- ooxml/Util/PackageHelper.cs | 2 +- ooxml/XWPF/Usermodel/XWPFRelation.cs | 25 ++++++++++--------- .../OPC/Internal/PackagePropertiesPart.cs | 10 +++----- openxml4Net/OPC/OPCPackage.cs | 2 +- openxml4Net/OPC/PackageProperties.cs | 15 ++++++++++- .../openxml4net/TestPackageCoreProperties.cs | 8 +++--- testcases/openxml4net/TestRelationships.cs | 3 +-- 7 files changed, 38 insertions(+), 27 deletions(-) diff --git a/ooxml/Util/PackageHelper.cs b/ooxml/Util/PackageHelper.cs index df29d079a..e0c339721 100644 --- a/ooxml/Util/PackageHelper.cs +++ b/ooxml/Util/PackageHelper.cs @@ -134,7 +134,7 @@ private static void Copy(OPCPackage pkg, PackagePart part, OPCPackage tgt, Packa * @param src source properties * @param tgt target properties */ - private static void CopyProperties(PackageProperties src, PackageProperties tgt) + private static void CopyProperties(IPackageProperties src, IPackageProperties tgt) { tgt.SetCategoryProperty(src.GetCategoryProperty()); tgt.SetContentStatusProperty(src.GetContentStatusProperty()); diff --git a/ooxml/XWPF/Usermodel/XWPFRelation.cs b/ooxml/XWPF/Usermodel/XWPFRelation.cs index da00ab65e..e621ffb6f 100644 --- a/ooxml/XWPF/Usermodel/XWPFRelation.cs +++ b/ooxml/XWPF/Usermodel/XWPFRelation.cs @@ -17,6 +17,7 @@ limitations under the License. namespace NPOI.XWPF.UserModel { + using NPOI.OpenXml4Net.OPC; using System; using System.Collections.Generic; /** @@ -32,26 +33,26 @@ public class XWPFRelation : POIXMLRelation public static XWPFRelation DOCUMENT = new XWPFRelation( - "application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml", - "http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument", + "application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml", + PackageRelationshipTypes.CORE_DOCUMENT, "/word/document.xml", - null + null ); public static XWPFRelation TEMPLATE = new XWPFRelation( - "application/vnd.openxmlformats-officedocument.wordprocessingml.template.main+xml", - "http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument", - "/word/document.xml", - null + "application/vnd.openxmlformats-officedocument.wordprocessingml.template.main+xml", + PackageRelationshipTypes.CORE_DOCUMENT, + "/word/document.xml", + null ); public static XWPFRelation MACRO_DOCUMENT = new XWPFRelation( - "application/vnd.ms-word.document.macroEnabled.main+xml", - "http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument", + "application/vnd.ms-word.document.macroEnabled.main+xml", + PackageRelationshipTypes.CORE_DOCUMENT, "/word/document.xml", - null + null ); public static XWPFRelation MACRO_TEMPLATE_DOCUMENT = new XWPFRelation( - "application/vnd.ms-word.template.macroEnabledTemplate.main+xml", - "http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument", + "application/vnd.ms-word.template.macroEnabledTemplate.main+xml", + PackageRelationshipTypes.CORE_DOCUMENT, "/word/document.xml", null ); diff --git a/openxml4Net/OPC/Internal/PackagePropertiesPart.cs b/openxml4Net/OPC/Internal/PackagePropertiesPart.cs index 405004b5f..5aeff6098 100644 --- a/openxml4Net/OPC/Internal/PackagePropertiesPart.cs +++ b/openxml4Net/OPC/Internal/PackagePropertiesPart.cs @@ -17,15 +17,13 @@ namespace NPOI.OpenXml4Net.OPC.Internal * @author Julien Chable * @version 1.0 */ - public class PackagePropertiesPart : PackagePart, PackageProperties + public class PackagePropertiesPart : PackagePart, IPackageProperties { - public static String NAMESPACE_DC = "http://purl.org/dc/elements/1.1/"; + public static String NAMESPACE_DC_URI = PackageProperties.NAMESPACE_DC; - public static String NAMESPACE_DC_URI = "http://purl.org/dc/elements/1.1/"; + public static String NAMESPACE_CP_URI = PackageNamespaces.CORE_PROPERTIES; - public static String NAMESPACE_CP_URI = "http://schemas.openxmlformats.org/package/2006/metadata/core-properties"; - - public static String NAMESPACE_DCTERMS_URI = "http://purl.org/dc/terms/"; + public static String NAMESPACE_DCTERMS_URI = PackageProperties.NAMESPACE_DCTERMS; public static String NAMESPACE_XSI_URI = "http://www.w3.org/2001/XMLSchema-instance"; private static String DEFAULT_DATEFORMAT = "yyyy-MM-dd'T'HH:mm:ss'Z'"; diff --git a/openxml4Net/OPC/OPCPackage.cs b/openxml4Net/OPC/OPCPackage.cs index d1afa4938..d53b3ea0d 100644 --- a/openxml4Net/OPC/OPCPackage.cs +++ b/openxml4Net/OPC/OPCPackage.cs @@ -604,7 +604,7 @@ internal void ThrowExceptionIfWriteOnly() * * @return The PackageProperties part of this package. */ - public PackageProperties GetPackageProperties() + public IPackageProperties GetPackageProperties() { this.ThrowExceptionIfWriteOnly(); // If no properties part has been found then we Create one diff --git a/openxml4Net/OPC/PackageProperties.cs b/openxml4Net/OPC/PackageProperties.cs index 31ad2ed39..3d6d5c3a5 100644 --- a/openxml4Net/OPC/PackageProperties.cs +++ b/openxml4Net/OPC/PackageProperties.cs @@ -11,7 +11,7 @@ namespace NPOI.OpenXml4Net.OPC * @version 1.0 * @see org.apache.poi.OpenXml4Net.opc.OPCPackage */ - public interface PackageProperties + public interface IPackageProperties { /* Getters and Setters */ @@ -198,4 +198,17 @@ public interface PackageProperties */ void SetVersionProperty(String version); } + + public class PackageProperties + { + /** + * Dublin Core Terms URI. + */ + public static String NAMESPACE_DCTERMS = "http://purl.org/dc/terms/"; + + /** + * Dublin Core namespace URI. + */ + public static String NAMESPACE_DC = "http://purl.org/dc/elements/1.1/"; + } } diff --git a/testcases/openxml4net/TestPackageCoreProperties.cs b/testcases/openxml4net/TestPackageCoreProperties.cs index bb929a3c7..b0c25a1b3 100644 --- a/testcases/openxml4net/TestPackageCoreProperties.cs +++ b/testcases/openxml4net/TestPackageCoreProperties.cs @@ -66,7 +66,7 @@ public void TestSetProperties() SimpleDateFormat msdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.fff'Z'"); msdf.TimeZone = TimeZoneInfo.Utc; - PackageProperties props = p.GetPackageProperties(); + IPackageProperties props = p.GetPackageProperties(); //test various date formats props.SetCreatedProperty("2007-05-12T08:00:00Z"); @@ -133,7 +133,7 @@ private void CompareProperties(OPCPackage p) DateTime expectedDate = df.Parse("2007-05-12T08:00:00Z"); // Gets the core properties - PackageProperties props = p.GetPackageProperties(); + IPackageProperties props = p.GetPackageProperties(); ClassicAssert.AreEqual("MyCategory", props.GetCategoryProperty()); ClassicAssert.AreEqual("MyContentStatus", props.GetContentStatusProperty() ); @@ -215,7 +215,7 @@ public void TestGetPropertiesLO() { // Open the namespace OPCPackage pkg1 = OPCPackage.Open(OpenXml4NetTestDataSamples.OpenSampleStream("51444.xlsx")); - PackageProperties props1 = pkg1.GetPackageProperties(); + IPackageProperties props1 = pkg1.GetPackageProperties(); ClassicAssert.AreEqual(null, props1.GetTitleProperty()); props1.SetTitleProperty("Bug 51444 fixed"); MemoryStream out1 = new MemoryStream(); @@ -224,7 +224,7 @@ public void TestGetPropertiesLO() pkg1.Close(); OPCPackage pkg2 = OPCPackage.Open(new MemoryStream(out1.ToArray())); - PackageProperties props2 = pkg2.GetPackageProperties(); + IPackageProperties props2 = pkg2.GetPackageProperties(); props2.SetTitleProperty("Bug 51444 fixed"); pkg2.Close(); } diff --git a/testcases/openxml4net/TestRelationships.cs b/testcases/openxml4net/TestRelationships.cs index b9896d5b8..eef7f2228 100644 --- a/testcases/openxml4net/TestRelationships.cs +++ b/testcases/openxml4net/TestRelationships.cs @@ -258,8 +258,7 @@ public void TestCreateRelationsFromScratch() { partB.GetRelationship("rId1").TargetUri.ToString()); // Check core too ClassicAssert.AreEqual("/docProps/core.xml", - pkg.GetRelationshipsByType( - "http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties").GetRelationship(0).TargetUri.ToString()); + pkg.GetRelationshipsByType(PackageRelationshipTypes.CORE_PROPERTIES).GetRelationship(0).TargetUri.ToString()); // Add some more partB.AddExternalRelationship("http://poi.apache.org/new", "http://example/poi/new"); From 12bbbfb3a77b4232a8eb1b8b6736a92b5f219439 Mon Sep 17 00:00:00 2001 From: Antony Liu Date: Sat, 28 Jun 2025 21:00:58 +0800 Subject: [PATCH 2/6] bug 61286/bug 61287 -- allow WriteProtectRecord to have 2 bytes, and allow for HeaderFooter to be empty. --- main/HSSF/Record/HeaderFooterBase.cs | 21 +++++++++++++++------ main/HSSF/Record/WriteProtectRecord.cs | 5 ++++- testcases/main/HSSF/UserModel/TestBugs.cs | 10 ++++++++++ testcases/test-data/spreadsheet/61287.xls | Bin 0 -> 11776 bytes 4 files changed, 29 insertions(+), 7 deletions(-) create mode 100644 testcases/test-data/spreadsheet/61287.xls diff --git a/main/HSSF/Record/HeaderFooterBase.cs b/main/HSSF/Record/HeaderFooterBase.cs index 1e53ec4af..f133e50f8 100644 --- a/main/HSSF/Record/HeaderFooterBase.cs +++ b/main/HSSF/Record/HeaderFooterBase.cs @@ -18,13 +18,13 @@ limitations under the License. namespace NPOI.HSSF.Record { using System; -using NPOI.Util; + using NPOI.Util; -/** - * Common header/footer base class - * - * @author Josh Micich - */ + /** + * Common header/footer base class + * + * @author Josh Micich + */ public abstract class HeaderFooterBase : StandardRecord { private bool field_2_hasMultibyte; @@ -40,6 +40,15 @@ protected HeaderFooterBase(RecordInputStream in1) if (in1.Remaining > 0) { int field_1_footer_len = in1.ReadShort(); + //61287 -- if the footer_len == 0, there may not be a multibyte flag + if (field_1_footer_len == 0) + { + field_3_text = ""; + if (in1.Remaining == 0) + { + return; + } + } field_2_hasMultibyte = in1.ReadByte() != 0x00; if (field_2_hasMultibyte) diff --git a/main/HSSF/Record/WriteProtectRecord.cs b/main/HSSF/Record/WriteProtectRecord.cs index 4bcde052f..5841a572b 100644 --- a/main/HSSF/Record/WriteProtectRecord.cs +++ b/main/HSSF/Record/WriteProtectRecord.cs @@ -46,7 +46,10 @@ public WriteProtectRecord() public WriteProtectRecord(RecordInputStream in1) { - + if (in1.Remaining == 2) + { + in1.ReadShort(); + } } public override String ToString() diff --git a/testcases/main/HSSF/UserModel/TestBugs.cs b/testcases/main/HSSF/UserModel/TestBugs.cs index af2fa4eec..16c112715 100644 --- a/testcases/main/HSSF/UserModel/TestBugs.cs +++ b/testcases/main/HSSF/UserModel/TestBugs.cs @@ -3500,6 +3500,16 @@ public void Test45353b() wb.Close(); } + [Test] + public void Test61287() + { + IWorkbook wb = HSSFTestDataSamples.OpenSampleWorkbook("61287.xls"); + ExcelExtractor ex = new ExcelExtractor((HSSFWorkbook)wb); + String text = ex.Text; + POITestCase.AssertContains(text, "\u8D44\u4EA7\u8D1F\u503A\u8868"); + wb.Close(); + } + // follow https://svn.apache.org/viewvc?view=revision&revision=1896552 to write a unit test for this fix. [Test] public void Test52447() diff --git a/testcases/test-data/spreadsheet/61287.xls b/testcases/test-data/spreadsheet/61287.xls new file mode 100644 index 0000000000000000000000000000000000000000..4d35295e35087c0dce61e406443b219426693d92 GIT binary patch literal 11776 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 v1)^Erwd1nXi_T#IVLlgb-k5qM&2KjvuK_ Date: Sat, 28 Jun 2025 21:09:46 +0800 Subject: [PATCH 3/6] bug 61300 -- prevent really long (infinite?) loop on corrupt file --- main/POIFS/FileSystem/NDocumentInputStream.cs | 8 ++++++++ main/POIFS/FileSystem/ODocumentInputStream.cs | 5 +++++ main/Util/IOUtils.cs | 4 ++++ testcases/main/HSSF/UserModel/TestBugs.cs | 18 ++++++++++++++++-- testcases/test-data/spreadsheet/61300.xls | Bin 0 -> 61952 bytes 5 files changed, 33 insertions(+), 2 deletions(-) create mode 100644 testcases/test-data/spreadsheet/61300.xls diff --git a/main/POIFS/FileSystem/NDocumentInputStream.cs b/main/POIFS/FileSystem/NDocumentInputStream.cs index 3880eaf7a..a7326e3b4 100644 --- a/main/POIFS/FileSystem/NDocumentInputStream.cs +++ b/main/POIFS/FileSystem/NDocumentInputStream.cs @@ -69,6 +69,10 @@ public NDocumentInputStream(DocumentEntry document) _marked_offset_count = 0; _document_size = document.Size; _closed = false; + if (_document_size < 0) + { + // throw new RecordFormatException("document_size cannot be < 0"); + } DocumentProperty property = (DocumentProperty)doc.Property; _document = new NPOIFSDocument( @@ -277,6 +281,10 @@ private void CheckAvaliable(int requestedSize) public override void ReadFully(byte[] buf, int off, int len) { + if (len < 0) + { + throw new RuntimeException("Can't read negative number of bytes"); + } CheckAvaliable(len); int read = 0; diff --git a/main/POIFS/FileSystem/ODocumentInputStream.cs b/main/POIFS/FileSystem/ODocumentInputStream.cs index b86ede834..0bd64d9df 100644 --- a/main/POIFS/FileSystem/ODocumentInputStream.cs +++ b/main/POIFS/FileSystem/ODocumentInputStream.cs @@ -19,6 +19,7 @@ limitations under the License. using System; using NPOI.POIFS.Storage; using System.IO; +using NPOI.Util; namespace NPOI.POIFS.FileSystem { @@ -71,6 +72,10 @@ public ODocumentInputStream(DocumentEntry document) _current_offset = 0; _marked_offset = 0; _document_size = document.Size; + if (_document_size < 0) + { + throw new RecordFormatException("document_size cannot be < 0"); + } _closed = false; _document = documentNode.Document; _currentBlock = GetDataInputBlock(0); diff --git a/main/Util/IOUtils.cs b/main/Util/IOUtils.cs index 542767196..76eace27a 100644 --- a/main/Util/IOUtils.cs +++ b/main/Util/IOUtils.cs @@ -373,6 +373,10 @@ public static void Copy(Stream inp, Stream out1) int count; while ((count = inp.Read(buff, 0, buff.Length)) >0) { + if (count < -1) + { + throw new RecordFormatException("Can't have read < -1 bytes"); + } out1.Write(buff, 0, count); } } diff --git a/testcases/main/HSSF/UserModel/TestBugs.cs b/testcases/main/HSSF/UserModel/TestBugs.cs index 16c112715..8d3386719 100644 --- a/testcases/main/HSSF/UserModel/TestBugs.cs +++ b/testcases/main/HSSF/UserModel/TestBugs.cs @@ -46,6 +46,7 @@ namespace TestCases.HSSF.UserModel using NPOI.HSSF; using System.Net; using SixLabors.ImageSharp; + using NPOI.HPSF; /** * Testcases for bugs entered in bugzilla @@ -2369,8 +2370,8 @@ public void Test47847() ClassicAssert.AreEqual(3, wb.NumberOfSheets); // Find the SST record - UnicodeString withExt = wb.Workbook.GetSSTString(0); - UnicodeString withoutExt = wb.Workbook.GetSSTString(31); + NPOI.HSSF.Record.UnicodeString withExt = wb.Workbook.GetSSTString(0); + NPOI.HSSF.Record.UnicodeString withoutExt = wb.Workbook.GetSSTString(31); ClassicAssert.AreEqual("O:Alloc:Qty", withExt.String); ClassicAssert.IsTrue((withExt.OptionFlags & 0x0004) == 0x0004); @@ -3510,6 +3511,19 @@ public void Test61287() wb.Close(); } + [Test] + public void Test61300() + { + ClassicAssert.Throws(()=>{ + NPOIFSFileSystem npoifs = new NPOIFSFileSystem(HSSFTestDataSamples.OpenSampleFileStream("61300.xls")); + + DocumentEntry entry = + (DocumentEntry) npoifs.Root.GetEntry(SummaryInformation.DEFAULT_STREAM_NAME); + PropertySet properties = + new PropertySet(new DocumentInputStream(entry)); + }); + } + // follow https://svn.apache.org/viewvc?view=revision&revision=1896552 to write a unit test for this fix. [Test] public void Test52447() diff --git a/testcases/test-data/spreadsheet/61300.xls b/testcases/test-data/spreadsheet/61300.xls new file mode 100644 index 0000000000000000000000000000000000000000..0b54c8cff251b46e3cac5bfae231b6b8b397ec44 GIT binary patch literal 61952 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

J{MH=zp?Z7 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 bpn)~`mx}*bXP-87{>LW&pH}<-GyVSuVOI9C literal 0 HcmV?d00001 From 1ed0eed1e314574d2316c0157b166af6bf5995e3 Mon Sep 17 00:00:00 2001 From: Antony Liu Date: Sat, 28 Jun 2025 21:33:54 +0800 Subject: [PATCH 4/6] remove comment code --- .../Util/EvilUnclosedBRFixingInputStream.cs | 271 ------------------ 1 file changed, 271 deletions(-) diff --git a/ooxml/XSSF/Util/EvilUnclosedBRFixingInputStream.cs b/ooxml/XSSF/Util/EvilUnclosedBRFixingInputStream.cs index 80dbb41ab..4f58ce4e1 100644 --- a/ooxml/XSSF/Util/EvilUnclosedBRFixingInputStream.cs +++ b/ooxml/XSSF/Util/EvilUnclosedBRFixingInputStream.cs @@ -20,11 +20,6 @@ limitations under the License. using NPOI.Util; namespace NPOI.XSSF.Util { - - - - - /** * This is a seriously sick fix for the fact that some .xlsx * files contain raw bits of HTML, without being escaped @@ -46,272 +41,6 @@ public EvilUnclosedBRFixingInputStream(InputStream source) } } - //public class EvilUnclosedBRFixingInputStream : Stream - //{ - // private Stream source; - // private byte[] spare; - - // private static byte[] detect = new byte[] { - // (byte)'<', (byte)'b', (byte)'r', (byte)'>' - // }; - - // public EvilUnclosedBRFixingInputStream(Stream source) - // { - // this.source = source; - // } - - // /** - // * Warning - doesn't fix! - // */ - - // public int Read() - // { - // return source.ReadByte(); - // } - - - // public override int Read(byte[] b, int off, int len) - // { - // // Grab any data left from last time - // int readA = ReadFromSpare(b, off, len); - - // // Now read from the stream - // int readB = source.Read(b, off + readA, len - readA); - - // // Figure out how much we've done - // int read; - // if (readB == -1 || readB == 0) - // { - // if (readA == 0) - // { - // return readB; - // } - // read = readA; - // } - // else - // { - // read = readA + readB; - // } - - // // Fix up our data - // if (read > 0) - // { - // read = fixUp(b, off, read); - // } - - // // All done - // return read; - // } - - - // public int Read(byte[] b) - // { - // return this.Read(b, 0, b.Length); - // } - - // /** - // * Reads into the buffer from the spare bytes - // */ - // private int ReadFromSpare(byte[] b, int offset, int len) - // { - // if (spare == null) return 0; - // if (len == 0) throw new ArgumentException("Asked to read 0 bytes"); - - // if (spare.Length <= len) - // { - // // All fits, good - // Array.Copy(spare, 0, b, offset, spare.Length); - // int read = spare.Length; - // spare = null; - // return read; - // } - // else - // { - // // We have more spare than they can copy with... - // byte[] newspare = new byte[spare.Length - len]; - // Array.Copy(spare, 0, b, offset, len); - // Array.Copy(spare, len, newspare, 0, newspare.Length); - // spare = newspare; - // return len; - // } - // } - // private void AddToSpare(byte[] b, int offset, int len, bool atTheEnd) - // { - // if (spare == null) - // { - // spare = new byte[len]; - // Array.Copy(b, offset, spare, 0, len); - // } - // else - // { - // byte[] newspare = new byte[spare.Length + len]; - // if (atTheEnd) - // { - // Array.Copy(spare, 0, newspare, 0, spare.Length); - // Array.Copy(b, offset, newspare, spare.Length, len); - // } - // else - // { - // Array.Copy(b, offset, newspare, 0, len); - // Array.Copy(spare, 0, newspare, len, spare.Length); - // } - // spare = newspare; - // } - // } - - // private int fixUp(byte[] b, int offset, int read) - // { - // // Do we have any potential overhanging ones? - // for (int i = 0; i < detect.Length - 1; i++) - // { - // int base1 = offset + read - 1 - i; - // if (base1 < 0) continue; - - // bool going = true; - // for (int j = 0; j <= i && going; j++) - // { - // if (b[base1 + j] == detect[j]) - // { - // // Matches - // } - // else - // { - // going = false; - // } - // } - // if (going) - // { - // // There could be a
handing over the end, eg fixAt = new List(); - // for (int i = offset; i <= offset + read - detect.Length; i++) - // { - // bool going = true; - // for (int j = 0; j < detect.Length && going; j++) - // { - // if (b[i + j] != detect[j]) - // { - // going = false; - // } - // } - // if (going) - // { - // fixAt.Add(i); - // } - // } - - // if (fixAt.Count == 0) - // { - // return read; - // } - - // // If there isn't space in the buffer to contain - // // all the fixes, then save the overshoot for next time - // int needed = offset + read + fixAt.Count; - // int overshoot = needed - b.Length; - // if (overshoot > 0) - // { - // // Make sure we don't loose part of a
! - // int fixes = 0; - // foreach (int at in fixAt) - // { - // if (at > offset + read - detect.Length - overshoot - fixes) - // { - // overshoot = needed - at - 1 - fixes; - // break; - // } - // fixes++; - // } - - // AddToSpare(b, offset + read - overshoot, overshoot, false); - // read -= overshoot; - // } - - // // Fix them, in reverse order so the - // // positions are valid - // for (int j = fixAt.Count - 1; j >= 0; j--) - // { - // int i = fixAt[j]; - // if (i >= read + offset) - // { - // // This one has Moved into the overshoot - // continue; - // } - // if (i > read - 3) - // { - // // This one has Moved into the overshoot - // continue; - // } - - // byte[] tmp = new byte[read - i - 3]; - // Array.Copy(b, i + 3, tmp, 0, tmp.Length); - // b[i + 3] = (byte)'/'; - // Array.Copy(tmp, 0, b, i + 4, tmp.Length); - // // It got one longer - // read++; - // } - // return read; - // } - - // public override bool CanRead - // { - // get { return true; } - // } - - // public override bool CanSeek - // { - // get { return true; } - // } - - // public override bool CanWrite - // { - // get { return false; } - // } - - // public override void Flush() - // { - - // } - - // public override long Length - // { - // get { return source.Length; } - // } - - // public override long Position - // { - // get - // { - // return source.Position; - // } - // set - // { - // source.Position = value; - // } - // } - - // public override long Seek(long offset, SeekOrigin origin) - // { - // return source.Seek(offset, origin); - // } - - // public override void SetLength(long value) - // { - // throw new InvalidOperationException(); - // } - - // public override void Write(byte[] buffer, int offset, int count) - // { - // throw new InvalidOperationException(); - // } - //} } From dc55db05ec890b4f45f704b10c3e5c1d13152622 Mon Sep 17 00:00:00 2001 From: Antony Liu Date: Sat, 28 Jun 2025 21:47:21 +0800 Subject: [PATCH 5/6] Refactor test somewhat to make it easier to see what it actually verifies --- .../HSSF/UserModel/TestPOIFSProperties.cs | 97 +++++++++++++------ 1 file changed, 65 insertions(+), 32 deletions(-) diff --git a/testcases/main/HSSF/UserModel/TestPOIFSProperties.cs b/testcases/main/HSSF/UserModel/TestPOIFSProperties.cs index 68724bbd7..d81df04ef 100644 --- a/testcases/main/HSSF/UserModel/TestPOIFSProperties.cs +++ b/testcases/main/HSSF/UserModel/TestPOIFSProperties.cs @@ -20,11 +20,13 @@ namespace TestCases.HSSF.UserModel using System; using System.IO; using NPOI.HSSF.UserModel; - using NUnit.Framework;using NUnit.Framework.Legacy; + using NUnit.Framework; + using NUnit.Framework.Legacy; using TestCases.HSSF; using NPOI.HPSF; using NPOI.POIFS.FileSystem; + using NPOI.Util; /** * Old-style setting of POIFS properties doesn't work with POI 3.0.2 @@ -37,57 +39,88 @@ public class TestPOIFSProperties private static String title = "Testing POIFS properties"; - public void TestFail() + [Test] + public void TestFail() { - Stream is1 = HSSFTestDataSamples.OpenSampleFileStream("Simple.xls"); - POIFSFileSystem fs = new POIFSFileSystem(is1); - - HSSFWorkbook wb = new HSSFWorkbook(fs); + MemoryStream out1 = new MemoryStream(); + { + // read the workbook, adjust the SummaryInformation and write the data to a byte array + POIFSFileSystem fs = OpenFileSystem(); - //set POIFS properties after constructing HSSFWorkbook - //(a piece of code that used to work up to POI 3.0.2) - SummaryInformation summary1 = (SummaryInformation)PropertySetFactory.Create(fs.CreateDocumentInputStream(SummaryInformation.DEFAULT_STREAM_NAME)); - summary1.Title=(title); - //Write the modified property back to POIFS - fs.Root.GetEntry(SummaryInformation.DEFAULT_STREAM_NAME).Delete(); - fs.CreateDocument(summary1.ToInputStream(), SummaryInformation.DEFAULT_STREAM_NAME); + HSSFWorkbook wb = new HSSFWorkbook(fs); - //save the workbook and read the property - MemoryStream out1 = new MemoryStream(); - wb.Write(out1); - out1.Close(); + //set POIFS properties After constructing HSSFWorkbook + //(a piece of code that used to work up to POI 3.0.2) + SetTitle(fs); - POIFSFileSystem fs2 = new POIFSFileSystem(new MemoryStream(out1.ToArray())); - SummaryInformation summary2 = (SummaryInformation)PropertySetFactory.Create(fs2.CreateDocumentInputStream(SummaryInformation.DEFAULT_STREAM_NAME)); + //save the workbook and read the property + wb.Write(out1); + out1.Close(); + wb.Close(); + } - //Assert.Failing assertion - ClassicAssert.AreEqual(title, summary2.Title); + // process the byte array + CheckFromByteArray(out1.ToArray()); } [Test] public void TestOK() + { + MemoryStream out1 = new MemoryStream(); + { + // read the workbook, adjust the SummaryInformation and write the data to a byte array + POIFSFileSystem fs = OpenFileSystem(); + + //set POIFS properties before constructing HSSFWorkbook + SetTitle(fs); + + HSSFWorkbook wb = new HSSFWorkbook(fs); + + wb.Write(out1); + out1.Close(); + wb.Close(); + } + + // process the byte array + CheckFromByteArray(out1.ToArray()); + } + + private POIFSFileSystem OpenFileSystem() { Stream is1 = HSSFTestDataSamples.OpenSampleFileStream("Simple.xls"); POIFSFileSystem fs = new POIFSFileSystem(is1); + is1.Close(); + return fs; + } - //set POIFS properties before constructing HSSFWorkbook - SummaryInformation summary1 = (SummaryInformation)PropertySetFactory.Create(fs.CreateDocumentInputStream(SummaryInformation.DEFAULT_STREAM_NAME)); - summary1.Title = (title); + private void SetTitle(POIFSFileSystem fs) + { + SummaryInformation summary1 = (SummaryInformation) PropertySetFactory.Create(fs.CreateDocumentInputStream(SummaryInformation.DEFAULT_STREAM_NAME)); + ClassicAssert.IsNotNull(summary1); + summary1.Title = title; + //write the modified property back to POIFS fs.Root.GetEntry(SummaryInformation.DEFAULT_STREAM_NAME).Delete(); fs.CreateDocument(summary1.ToInputStream(), SummaryInformation.DEFAULT_STREAM_NAME); - HSSFWorkbook wb = new HSSFWorkbook(fs); + // check that the information was added successfully to the filesystem object + SummaryInformation summaryCheck = (SummaryInformation) PropertySetFactory.Create(fs.CreateDocumentInputStream(SummaryInformation.DEFAULT_STREAM_NAME)); + ClassicAssert.IsNotNull(summaryCheck); + } - MemoryStream out1 = new MemoryStream(); - wb.Write(out1); - out1.Close(); + private void CheckFromByteArray(byte[] bytes) + { + // on some environments in CI we see strange Assert.Failures, let's verify that the size is exactly right + // this can be removed again After the problem is identified + // 5120 + ClassicAssert.AreEqual(9216, bytes.Length, "Had: " + HexDump.ToHex(bytes)); - //read the property - POIFSFileSystem fs2 = new POIFSFileSystem(new MemoryStream(out1.ToArray())); - SummaryInformation summary2 = (SummaryInformation)PropertySetFactory.Create(fs2.CreateDocumentInputStream(SummaryInformation.DEFAULT_STREAM_NAME)); - ClassicAssert.AreEqual(title, summary2.Title); + POIFSFileSystem fs2 = new POIFSFileSystem(new MemoryStream(bytes)); + SummaryInformation summary2 = (SummaryInformation) PropertySetFactory.Create(fs2.CreateDocumentInputStream(SummaryInformation.DEFAULT_STREAM_NAME)); + ClassicAssert.IsNotNull(summary2); + ClassicAssert.AreEqual(title, summary2.Title); + fs2.Close(); } } } \ No newline at end of file From bba404ec543809dc6eb6192256154df6bdfd2775 Mon Sep 17 00:00:00 2001 From: Antony Liu Date: Mon, 30 Jun 2025 20:24:28 +0800 Subject: [PATCH 6/6] Fix data validation value list evaluation --- main/SS/Formula/DataValidationEvaluator.cs | 756 +++++++++++++++++- main/SS/Formula/WorkbookEvaluator.cs | 39 +- main/Util/DocumentFormatException.cs | 69 ++ main/Util/RecordFormatException.cs | 16 + .../XSSF/UserModel/TestXSSFDataValidation.cs | 14 +- .../spreadsheet/dataValidationTableRange.xlsx | Bin 0 -> 116554 bytes 6 files changed, 877 insertions(+), 17 deletions(-) create mode 100644 main/Util/DocumentFormatException.cs create mode 100644 testcases/test-data/spreadsheet/dataValidationTableRange.xlsx diff --git a/main/SS/Formula/DataValidationEvaluator.cs b/main/SS/Formula/DataValidationEvaluator.cs index 8ca3e96b5..91903f979 100644 --- a/main/SS/Formula/DataValidationEvaluator.cs +++ b/main/SS/Formula/DataValidationEvaluator.cs @@ -1,19 +1,287 @@ -using NPOI.SS.UserModel; +/* ==================================================================== + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +==================================================================== */ + + using System; +using System.Collections; using System.Collections.Generic; +using System.IO; using System.Text; namespace NPOI.SS.Formula { + using MathNet.Numerics; + using NPOI.SS.Formula.Eval; + using NPOI.SS.UserModel; + using NPOI.SS.Util; + using System.Net; + + ///

+ /// + /// Evaluates Data Validation constraints. + /// + /// + /// For performance reasons, this class keeps a cache of all previously retrieved instances. + /// Be sure to call if any workbook validation definitions are + /// added, modified, or deleted. + /// + /// + /// Changing cell values should be fine, as long as the corresponding + /// is called as well. + /// + /// public class DataValidationEvaluator { - /** - * Note that this assumes the cell cached value is up to date and in sync with data edits - * - * @param cell The {@link Cell} to check. - * @param type The {@link CellType} to check for. - * @return true if the cell or cached cell formula result type match the given type - */ + + /// + /// + /// Expensive to compute, so cache them as they are retrieved. + /// + /// + /// Sheets don't implement equals, and since its an interface, + /// there's no guarantee instances won't be recreated on the fly by some implementation. + /// So we use sheet name. + /// + /// + private Dictionary> validations = new Dictionary>(); + + private IWorkbook workbook; + private WorkbookEvaluator workbookEvaluator; + + /// + /// Use the same formula evaluation context used for other operations, so cell value + /// changes are automatically noticed + /// + /// the workbook this operates on + /// provider for formula evaluation + public DataValidationEvaluator(IWorkbook wb, IWorkbookEvaluatorProvider provider) + { + this.workbook = wb; + this.workbookEvaluator = provider.GetWorkbookEvaluator(); + } + + /// + /// + /// evaluator + protected WorkbookEvaluator GetWorkbookEvaluator() + { + return workbookEvaluator; + } + + /// + /// Call this whenever validation structures change, + /// so future results stay in sync with the Workbook state. + /// + public void clearAllCachedValues() + { + validations.Clear(); + } + + /// + /// Lazy load validations by sheet, since reading the CT* types is expensive + /// + /// + /// The s for the sheet + private List GetValidations(ISheet sheet) + { + validations.TryGetValue(sheet.SheetName, out List dvs); + if(dvs == null && !validations.ContainsKey(sheet.SheetName)) + { + dvs = sheet.GetDataValidations(); + validations.Add(sheet.SheetName, dvs); + } + return dvs; + } + + /// + /// Finds and returns the for the cell, if there is + /// one. Lookup is based on the first match from + /// for the cell's sheet. DataValidation + /// regions must be in the same sheet as the DataValidation. Allowed values + /// expressions may reference other sheets, however. + /// + /// reference to check - use this in case the cell does not actually exist yet + /// the DataValidation applicable to the given cell, or null if no + /// validation applies + /// + public IDataValidation GetValidationForCell(CellReference cell) + { + DataValidationContext vc = GetValidationContextForCell(cell); + return vc == null ? null : vc.Validation; + } + + /// + /// Finds and returns the for the cell, if there is + /// one. Lookup is based on the first match from + /// for the cell's sheet. DataValidation + /// regions must be in the same sheet as the DataValidation. Allowed values + /// expressions may reference other sheets, however. + /// + /// reference to check + /// the DataValidationContext applicable to the given cell, or null if no + /// validation applies + /// + public DataValidationContext GetValidationContextForCell(CellReference cell) + { + ISheet sheet = workbook.GetSheet(cell.SheetName); + if(sheet == null) + return null; + List dataValidations = GetValidations(sheet); + if(dataValidations == null) + return null; + foreach(IDataValidation dv in dataValidations) + { + CellRangeAddressList regions = dv.Regions; + if(regions == null) + return null; + // current implementation can't return null + foreach(CellRangeAddressBase range in regions.CellRangeAddresses) + { + if(range.IsInRange(cell)) + { + return new DataValidationContext(dv, this, range, cell); + } + } + } + return null; + } + + /// + /// + /// If returns an instance, and the + /// is , return the valid + /// values, whether they are from a static list or cell range. + /// + /// + /// For all other validation types, or no validation at all, this method + /// returns null. + /// + /// + /// This method could throw an exception if the validation type is not LIST, + /// but since this method is mostly useful in UI contexts, null seems the + /// easier path. + /// + /// + /// reference to check - use this in case the cell does not actually exist yet + /// returns an unmodifiable of s if applicable, or + /// null + /// + public List GetValidationValuesForCell(CellReference cell) + { + DataValidationContext context = GetValidationContextForCell(cell); + + if(context == null) + return null; + + return GetValidationValuesForConstraint(context); + } + + /// + /// static so enums can reference it without creating a whole instance + /// + /// returns an unmodifiable of s, which may be empty + protected static List GetValidationValuesForConstraint(DataValidationContext context) + { + IDataValidationConstraint val = context.Validation.ValidationConstraint; + if(val.GetValidationType() != ValidationType.LIST) + return null; + + string formula = val.Formula1; + + List values = new List(); + + if(val.ExplicitListValues != null && val.ExplicitListValues.Length > 0) + { + // assumes parsing interprets the overloaded property right for XSSF + foreach(string s in val.ExplicitListValues) + { + if(s != null) + values.Add(new StringEval(s)); // constructor throws exception on null + } + } + else if(formula != null) + { + // evaluate formula for cell refs then Get their values + // note this should return the raw formula result, not the "unwrapped" version that returns a single value. + ValueEval eval = context.Evaluator.GetWorkbookEvaluator().EvaluateList(formula, context.Target, context.Region); + // formula is a StringEval if the validation is by a fixed list. Use the explicit list later. + // there is no way from the model to tell if the list is fixed values or formula based. + if(eval is TwoDEval) + { + TwoDEval twod = (TwoDEval) eval; + for(int i = 0; i < twod.Height; i++) + { + ValueEval cellValue = twod.GetValue(i, 0); + values.Add(cellValue); + } + } + } + return values; + } + + /// + /// + /// Use the validation returned by if you + /// want the error display details. This is the validation checked by this + /// method, which attempts to replicate Excel's data validation rules. + /// + /// + /// Note that to properly apply some validations, care must be taken to + /// offset the base validation formula by the relative position of the + /// current cell, or the wrong value is checked. + /// + /// + /// The reference of the cell to evaluate + /// true if the cell has no validation or the cell value passes the + /// defined validation, false if it Assert.Fails + /// + public bool IsValidCell(CellReference cellRef) + { + DataValidationContext context = GetValidationContextForCell(cellRef); + + if(context == null) + return true; + + ICell cell = SheetUtil.GetCell(workbook.GetSheet(cellRef.SheetName), cellRef.Row, cellRef.Col); + + // now we can validate the cell + + // if empty, return not allowed flag + if(cell == null + || IsType(cell, CellType.Blank) + || (IsType(cell, CellType.String) + && (cell.StringCellValue == null || string.IsNullOrEmpty(cell.StringCellValue)) + ) + ) + { + return context.Validation.EmptyCellAllowed; + } + + // cell has a value + + return ValidationEnum.IsValid(cell, context); + } + + /// + /// Note that this assumes the cell cached value is up to date and in sync with data edits + /// + /// + /// + /// true if the cell or cached cell formula result type match the given type public static bool IsType(ICell cell, CellType type) { CellType cellType = cell.CellType; @@ -23,5 +291,477 @@ public static bool IsType(ICell cell, CellType type) ); } + public class ValidationEnum + { + private static readonly ValidationEnum ANY = new ValidationEnum_ANY(); + private static readonly ValidationEnum INTEGER = new ValidationEnum_INTEGER(); + private static readonly ValidationEnum DECIMAL = new ValidationEnum_DECIMAL(); + private static readonly ValidationEnum LIST = new ValidationEnum_LIST(); + private static readonly ValidationEnum DATE = new ValidationEnum_DATE(); + private static readonly ValidationEnum TIME = new ValidationEnum_TIME(); + private static readonly ValidationEnum TEXT_LENGTH = new ValidationEnum_TEXT_LENGTH(); + private static readonly ValidationEnum FORMULA = new ValidationEnum_FORMULA(); + public static Dictionary Values = new Dictionary() + { + { ValidationType.ANY, ANY }, + { ValidationType.INTEGER, INTEGER }, + { ValidationType.DECIMAL, DECIMAL }, + { ValidationType.LIST, LIST }, + { ValidationType.DATE, DATE }, + { ValidationType.TIME, TIME }, + { ValidationType.TEXT_LENGTH, TEXT_LENGTH }, + { ValidationType.FORMULA, FORMULA }, + }; + private class ValidationEnum_ANY : ValidationEnum + { + public override bool IsValidValue(ICell cell, DataValidationContext context) + { + return true; + } + } + + private class ValidationEnum_INTEGER : ValidationEnum + { + public override bool IsValidValue(ICell cell, DataValidationContext context) + { + if(base.IsValidValue(cell, context)) + { + // we know it is a number in the proper range, now check if it is an int + double value = cell.NumericCellValue; // can't Get here without a valid numeric value + return value.CompareTo((int)value) == 0; + } + return false; + } + } + private class ValidationEnum_DECIMAL : ValidationEnum { } + private class ValidationEnum_LIST : ValidationEnum + { + public override bool IsValidValue(ICell cell, DataValidationContext context) + { + List valueList = GetValidationValuesForConstraint(context); + if(valueList == null) + return true; // special case + + // compare cell value to each item + foreach(ValueEval listVal in valueList) + { + ValueEval comp = listVal is RefEval ? ((RefEval) listVal).GetInnerValueEval(context.SheetIndex) : listVal; + + // any value is valid if the list contains a blank value per Excel help + if(comp is BlankEval) + return true; + if(comp is ErrorEval) + continue; // nothing to check + if(comp is BoolEval) + { + if(IsType(cell, CellType.Boolean) && ((BoolEval) comp).BooleanValue == cell.BooleanCellValue) + { + return true; + } + else + { + continue; // check the rest + } + } + if(comp is NumberEval) + { + // could this have trouble with double precision/rounding errors and date/time values? + // do we need to allow a "close enough" double fractional range? + // I see 17 digits After the decimal separator in XSSF files, and for time values, + // there are sometimes discrepancies in the final decimal place. + // I don't have a validation test case yet though. - GW + if(IsType(cell, CellType.Numeric) && ((NumberEval) comp).NumberValue == cell.NumericCellValue) + { + return true; + } + else + { + continue; // check the rest + } + } + if(comp is StringEval) + { + // interestingly, in testing, a validation value of the string "TRUE" or "true" + // did not match a bool cell value of TRUE - so apparently cell type matters + // also, Excel validation is case insensitive - "true" is valid for the list value "TRUE" + if(IsType(cell, CellType.String) && ((StringEval) comp).StringValue.Equals(cell.StringCellValue, StringComparison.OrdinalIgnoreCase)) + { + return true; + } + else + { + continue; // check the rest; + } + } + } + return false; // no matches + } + } + private class ValidationEnum_DATE : ValidationEnum { } + private class ValidationEnum_TIME : ValidationEnum { } + private class ValidationEnum_TEXT_LENGTH : ValidationEnum + { + public override bool IsValidValue(ICell cell, DataValidationContext context) + { + if(!IsType(cell, CellType.String)) + return false; + string v = cell.StringCellValue; + return IsValidNumericValue(v.Length, context); + } + } + private class ValidationEnum_FORMULA : ValidationEnum + { + /** + * Note the formula result must either be a bool result, or anything not in error. + * If bool, value must be true to pass, anything else valid is also passing, errors Assert.Fail. + * @see NPOI.SS.Formula.DataValidationEvaluator.ValidationEnum#isValidValue(NPOI.SS.UserModel.Cell, NPOI.SS.UserModel.DataValidationConstraint, NPOI.SS.Formula.WorkbookEvaluator) + */ + public override bool IsValidValue(ICell cell, DataValidationContext context) + { + // unwrapped single value + ValueEval comp = context.Evaluator.GetWorkbookEvaluator().Evaluate(context.Formula1, context.Target, context.Region); + if(comp is RefEval) + { + comp = ((RefEval) comp).GetInnerValueEval(((RefEval) comp).FirstSheetIndex); + } + + if(comp is BlankEval) + return true; + if(comp is ErrorEval) + return false; + if(comp is BoolEval) + { + return ((BoolEval) comp).BooleanValue; + } + // empirically tested in Excel - 0=false, any other number = true/valid + // see test file DataValidationEvaluations.xlsx + if(comp is NumberEval) + { + return ((NumberEval) comp).NumberValue != 0; + } + return false; // anything else is false, such as text + } + } + + public virtual bool IsValidValue(ICell cell, DataValidationContext context) + { + return IsValidNumericCell(cell, context); + } + + /** + * Uses the cell value, which may be the cached formula result value. + * We won't re-evaluate cells here. This validation would be After the cell value was updated externally. + * Excel allows invalid values through methods like copy/paste, and only validates them when the user + * interactively edits the cell. + * @return if the cell is a valid numeric cell for the validation or not + */ + protected bool IsValidNumericCell(ICell cell, DataValidationContext context) + { + if(!IsType(cell, CellType.Numeric)) + return false; + + Double value = cell.NumericCellValue; + return IsValidNumericValue(value, context); + } + + /** + * Is the number a valid option for the validation? + */ + protected bool IsValidNumericValue(Double value, DataValidationContext context) + { + try + { + Double? t1 = EvalOrConstant(context.Formula1, context); + // per Excel, a blank value for a numeric validation constraint formula validates true + if(t1 == null) + return true; + Double? t2 = null; + if(context.Operator == OperatorType.BETWEEN || context.Operator == OperatorType.NOT_BETWEEN) + { + t2 = EvalOrConstant(context.Formula2, context); + // per Excel, a blank value for a numeric validation constraint formula validates true + if(t2 == null) + return true; + } + return OperatorEnum.Values[context.Operator].IsValid(value, t1.Value, t2.Value); + } + catch(FormatException e) + { + // one or both formulas are in error, not evaluating to a number, so the validation is false per Excel's behavior. + return false; + } + } + + /** + * Evaluate a numeric formula value as either a constant or numeric expression. + * Note that Excel treats validations with constraint formulas that evaluate to null as valid, + * but evaluations in error or non-numeric are marked invalid. + * @param formula + * @param context + * @return numeric value or null if not defined or the formula evaluates to an empty/missing cell. + * @throws NumberFormatException if the formula is non-numeric when it should be + */ + private static Double? EvalOrConstant(string formula, DataValidationContext context) + { + if(formula == null || string.IsNullOrEmpty(formula.Trim())) + return null; // shouldn't happen, but just in case + try + { + return Double.Parse(formula); + } + catch(FormatException e) + { + // must be an expression, then. Overloading by Excel in the file formats. + } + // note the call to the "unwrapped" version, which returns a single value + ValueEval eval = context.Evaluator.GetWorkbookEvaluator().Evaluate(formula, context.Target, context.Region); + if(eval is RefEval) + { + eval = ((RefEval) eval).GetInnerValueEval(((RefEval) eval).FirstSheetIndex); + } + if(eval is BlankEval) + return null; + if(eval is NumberEval) + return ((NumberEval) eval).NumberValue; + if(eval is StringEval) + { + string value = ((StringEval) eval).StringValue; + if(value == null || string.IsNullOrEmpty(value.Trim())) + return null; + // try to parse the cell value as a double and return it + return Double.Parse(value); + } + throw new FormatException("Formula '" + formula + "' evaluates to something other than a number"); + } + /// + /// Validates against the type defined in context, as an index of the enum values array. + /// + /// Cell to check validity of + /// The Data Validation to check against + /// true if validation passes + /// if the constraint type is an invalid index + public static bool IsValid(ICell cell, DataValidationContext context) + { + return Values[context.Validation.ValidationConstraint.GetValidationType()].IsValidValue(cell, context); + } + } + + public class OperatorEnum + { + public static readonly OperatorEnum BETWEEN = new Operator_BETWEEN(); + public static readonly OperatorEnum NOT_BETWEEN = new Operator_NOT_BETWEEN(); + public static readonly OperatorEnum EQUAL = new Operator_EQUAL(); + public static readonly OperatorEnum NOT_EQUAL = new Operator_NOT_EQUAL(); + public static readonly OperatorEnum GREATER_THAN = new Operator_GREATER_THAN(); + public static readonly OperatorEnum LESS_THAN = new Operator_LESS_THAN(); + public static readonly OperatorEnum GREATER_OR_EQUAL = new Operator_GREATER_OR_EQUAL(); + public static readonly OperatorEnum LESS_OR_EQUAL = new Operator_LESS_OR_EQUAL(); + + public static readonly OperatorEnum IGNORED = BETWEEN; + + public static readonly Dictionary Values = new Dictionary() + { + { OperatorType.BETWEEN, BETWEEN }, + { OperatorType.NOT_BETWEEN, NOT_BETWEEN }, + { OperatorType.EQUAL, EQUAL }, + { OperatorType.NOT_EQUAL, NOT_EQUAL }, + { OperatorType.GREATER_THAN, GREATER_THAN }, + { OperatorType.LESS_THAN, LESS_THAN }, + { OperatorType.GREATER_OR_EQUAL, GREATER_OR_EQUAL }, + { OperatorType.LESS_OR_EQUAL, LESS_OR_EQUAL }, + }; + /** + * Evaluates comparison using operator instance rules + * @param cellValue won't be null, assumption is previous checks handled that + * @param v1 if null, value assumed invalid, anything passes, per Excel behavior + * @param v2 null if not needed. If null when needed, assume anything passes, per Excel behavior + * @return true if the comparison is valid + */ + public virtual bool IsValid(Double cellValue, Double v1, Double v2) + { + throw new NotImplementedException(); + } + + private class Operator_BETWEEN : OperatorEnum + { + public override bool IsValid(Double cellValue, Double v1, Double v2) + { + return cellValue.CompareTo(v1) >= 0 && cellValue.CompareTo(v2) <= 0; + } + } + + private class Operator_NOT_BETWEEN : OperatorEnum + { + public override bool IsValid(Double cellValue, Double v1, Double v2) + { + return cellValue.CompareTo(v1) < 0 || cellValue.CompareTo(v2) > 0; + } + } + + private class Operator_EQUAL : OperatorEnum + { + public override bool IsValid(Double cellValue, Double v1, Double v2) + { + return cellValue.CompareTo(v1) == 0; + } + } + + private class Operator_NOT_EQUAL : OperatorEnum + { + public override bool IsValid(Double cellValue, Double v1, Double v2) + { + return cellValue.CompareTo(v1) != 0; + } + } + private class Operator_GREATER_THAN : OperatorEnum + { + public override bool IsValid(Double cellValue, Double v1, Double v2) + { + return cellValue.CompareTo(v1) > 0; + } + } + private class Operator_LESS_THAN : OperatorEnum + { + public override bool IsValid(Double cellValue, Double v1, Double v2) + { + return cellValue.CompareTo(v1) < 0; + } + } + private class Operator_GREATER_OR_EQUAL : OperatorEnum + { + public override bool IsValid(Double cellValue, Double v1, Double v2) + { + return cellValue.CompareTo(v1) >= 0; + } + } + private class Operator_LESS_OR_EQUAL : OperatorEnum + { + public override bool IsValid(Double cellValue, Double v1, Double v2) + { + return cellValue.CompareTo(v1) <= 0; + } + } + } + + + /** + * This class organizes and encapsulates all the pieces of information related to a single + * data validation configuration for a single cell. It cleanly separates the validation region, + * the cells it applies to, the specific cell this instance references, and the validation + * configuration and current values if applicable. + */ + public class DataValidationContext + { + private IDataValidation dv; + private DataValidationEvaluator dve; + private CellRangeAddressBase region; + private CellReference target; + + /** + * + * @param dv + * @param dve + * @param region + * @param target + */ + public DataValidationContext(IDataValidation dv, DataValidationEvaluator dve, CellRangeAddressBase region, CellReference target) + { + this.dv = dv; + this.dve = dve; + this.region = region; + this.target = target; + } + /** + * @return the dv + */ + public IDataValidation Validation + { + get + { + return dv; + } + } + /** + * @return the dve + */ + public DataValidationEvaluator Evaluator + { + get + { + return dve; + } + } + /** + * @return the region + */ + public CellRangeAddressBase Region + { + get + { + return region; + } + } + /** + * @return the target + */ + public CellReference Target + { + get + { + return target; + } + } + + public int OffsetColumns + { + get + { + return target.Col - region.FirstColumn; + } + } + + public int OffsetRows + { + get + { + return target.Row - region.FirstRow; + } + } + + public int SheetIndex + { + get + { + return dve.GetWorkbookEvaluator().GetSheetIndex(target.SheetName); + } + } + + public string Formula1 + { + get + { + return dv.ValidationConstraint.Formula1; + } + } + + public string Formula2 + { + get + { + return dv.ValidationConstraint.Formula2; + } + } + + public int Operator + { + get + { + return dv.ValidationConstraint.Operator; + } + + } + + } } + } diff --git a/main/SS/Formula/WorkbookEvaluator.cs b/main/SS/Formula/WorkbookEvaluator.cs index 08a37f069..0985fffae 100644 --- a/main/SS/Formula/WorkbookEvaluator.cs +++ b/main/SS/Formula/WorkbookEvaluator.cs @@ -293,6 +293,26 @@ public ValueEval Evaluate(String formula, CellReference target, CellRangeAddress { return Evaluate(formula, target, region, FormulaType.Cell); } + + + /** + * Some expressions need to be evaluated in terms of an offset from the top left corner of a region, + * such as some data validation and conditional format expressions, when those constraints apply + * to contiguous cells. When a relative formula is used, it must be evaluated by shifting by the target + * offset position relative to the top left of the range. + *

+ * Returns a ValueEval that may be one or more values, such as the allowed values for a data validation constraint. + * + * @param formula + * @param target cell context for the operation + * @param region containing the cell + * @return ValueEval for one or more values + * @throws IllegalArgumentException if target does not define a sheet name to evaluate the formula on. + */ + public ValueEval EvaluateList(String formula, CellReference target, CellRangeAddressBase region) { + return Evaluate(formula, target, region, FormulaType.DataValidationList); + } + private ValueEval Evaluate(String formula, CellReference target, CellRangeAddressBase region, FormulaType formulaType) { String sheetName = target == null ? null : target.SheetName; @@ -461,6 +481,8 @@ private ValueEval EvaluateAny(IEvaluationCell srcCell, int sheetIndex, //return cce.GetValue(); return result; } + + /** * Adds the current cell reference to the exception for easier debugging. * Would be nice to get the formula text as well, but that seems to require @@ -709,6 +731,7 @@ public ValueEval EvaluateFormula(OperationEvaluationContext ec, Ptg[] ptgs) { throw new InvalidOperationException("evaluation stack not empty"); } + // "unwrap" result to just the value relevant for the source cell if needed ValueEval result; if (ec.IsSingleValue) { @@ -784,14 +807,14 @@ public static ValueEval DereferenceResult(ValueEval evaluationResult, int srcRow return value; } /** - * Dereferences a single value from any AreaEval or RefEval evaluation - * result. If the supplied evaluationResult is just a plain value, it is - * returned as-is. - * - * @return a {@link NumberEval}, {@link StringEval}, {@link BoolEval}, or - * {@link ErrorEval}. Never null. {@link BlankEval} is - * converted to {@link NumberEval#ZERO} - */ + * Dereferences a single value from any AreaEval or RefEval evaluation + * result. If the supplied evaluationResult is just a plain value, it is + * returned as-is. + * + * @return a {@link NumberEval}, {@link StringEval}, {@link BoolEval}, or + * {@link ErrorEval}. Never null. {@link BlankEval} is + * converted to {@link NumberEval#ZERO} + */ public static ValueEval DereferenceResult(ValueEval evaluationResult, OperationEvaluationContext ec) { ValueEval value; diff --git a/main/Util/DocumentFormatException.cs b/main/Util/DocumentFormatException.cs new file mode 100644 index 000000000..442abc15d --- /dev/null +++ b/main/Util/DocumentFormatException.cs @@ -0,0 +1,69 @@ + +/* ==================================================================== + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +==================================================================== */ + +using System; +using System.Collections; +using System.Collections.Generic; +using System.IO; +using System.Text; + +namespace NPOI.Util +{ + ///

+ /// This is similar to , except this is thrown + /// when there's a higher order problem with parsing a document beyond individual records. + /// + public class DocumentFormatException : RuntimeException + { + + public DocumentFormatException(string exception) + : base(exception) + { + + } + + public DocumentFormatException(string exception, Exception ex) + : base(exception, ex) + { + + } + + public DocumentFormatException(Exception thr) + : base(thr) + { + + } + + /// + /// Syntactic sugar to check whether a DocumentFormatException should + /// be thrown. If assertTrue is false, this will throw this + /// exception with the message. + /// + /// + /// + public static void Check(bool assertTrue, string message) + { + if(!assertTrue) + { + throw new DocumentFormatException(message); + } + } + } +} + + diff --git a/main/Util/RecordFormatException.cs b/main/Util/RecordFormatException.cs index b0e21c643..bb1bb8cd2 100644 --- a/main/Util/RecordFormatException.cs +++ b/main/Util/RecordFormatException.cs @@ -45,6 +45,22 @@ public RecordFormatException(Exception ex): base(ex) { } + + /** + * Syntactic sugar to check whether a RecordFormatException should + * be thrown. If assertTrue is false, this will throw this + * exception with the message. + * + * @param assertTrue + * @param message + */ + public static void Check(bool assertTrue, String message) + { + if (! assertTrue) + { + throw new RecordFormatException(message); + } + } } } \ No newline at end of file diff --git a/testcases/ooxml/XSSF/UserModel/TestXSSFDataValidation.cs b/testcases/ooxml/XSSF/UserModel/TestXSSFDataValidation.cs index cc73636b9..bec97c596 100644 --- a/testcases/ooxml/XSSF/UserModel/TestXSSFDataValidation.cs +++ b/testcases/ooxml/XSSF/UserModel/TestXSSFDataValidation.cs @@ -17,12 +17,15 @@ limitations under the License. using TestCases.SS.UserModel; using NPOI.SS.UserModel; using System.Collections.Generic; -using NUnit.Framework;using NUnit.Framework.Legacy; +using NUnit.Framework; +using NUnit.Framework.Legacy; using NPOI.SS.Util; using System; using System.Text; using NPOI.XSSF; using NPOI.XSSF.UserModel; +using NPOI.SS.Formula; +using NPOI.SS.Formula.Eval; namespace TestCases.XSSF.UserModel { @@ -411,5 +414,14 @@ private XSSFDataValidation CreateValidation(XSSFSheet sheet) return validation; } + [Test] + public void TestTableBasedValidationList() + { + XSSFWorkbook wb = XSSFTestDataSamples.OpenSampleWorkbook("dataValidationTableRange.xlsx"); + XSSFFormulaEvaluator fEval = wb.GetCreationHelper().CreateFormulaEvaluator() as XSSFFormulaEvaluator; + DataValidationEvaluator dve = new DataValidationEvaluator(wb, fEval); + List values = dve.GetValidationValuesForCell(new CellReference("County Ranking", 8, 6, false, false)); + ClassicAssert.AreEqual(32, values.Count, "wrong # of valid values"); + } } } diff --git a/testcases/test-data/spreadsheet/dataValidationTableRange.xlsx b/testcases/test-data/spreadsheet/dataValidationTableRange.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..76e24344e215528967c879bc5e53165e72462897 GIT binary patch literal 116554 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 z%0D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
8vCZ8tw-V-NKE`S1kLks1Qi2RfCi`lH?`H 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 literal 0 HcmV?d00001