From 6ec3c11dd7a0bcb4c5f3db80c50248d088a0ac15 Mon Sep 17 00:00:00 2001 From: Antony Liu Date: Fri, 15 Mar 2024 11:20:20 +0800 Subject: [PATCH 1/7] poi: bug 60260: parse unicode sheet names --- main/SS/Formula/FormulaParser.cs | 89 +++++++++++------- main/Util/StringUtil.cs | 24 ++++- .../main/SS/UserModel/BaseTestNamedRange.cs | 14 +++ .../XSSF/UserModel/TestXSSFSheetShiftRows.cs | 12 ++- .../spreadsheet/unicodeSheetName.xlsx | Bin 0 -> 8924 bytes 5 files changed, 102 insertions(+), 37 deletions(-) create mode 100644 testcases/test-data/spreadsheet/unicodeSheetName.xlsx diff --git a/main/SS/Formula/FormulaParser.cs b/main/SS/Formula/FormulaParser.cs index c8cc16dd4..c0f4d93c3 100644 --- a/main/SS/Formula/FormulaParser.cs +++ b/main/SS/Formula/FormulaParser.cs @@ -31,6 +31,7 @@ namespace NPOI.SS.Formula using NPOI.SS.UserModel; using NPOI.SS.Util; using NPOI.Util; + using SixLabors.Fonts.Unicode; /// /// Specific exception thrown when a supplied formula does not Parse properly. @@ -63,6 +64,7 @@ public class FormulaParser { private String _formulaString; private int _formulaLength; + /** points at the next character to be read (after the {@link #look} codepoint) */ private int _pointer; private ParseNode _rootNode; @@ -72,10 +74,10 @@ public class FormulaParser private const char LF = '\n'; // Normally just XSSF /** - * Lookahead Character. + * Lookahead unicode codepoint. * Gets value '\0' when the input string is exhausted */ - private char look; + private int look; /** * Tracks whether the run of whitespace preceeding "look" could be an @@ -183,7 +185,7 @@ private void GetChar() } if (_pointer < _formulaLength) { - look = _formulaString[_pointer]; + look = _formulaString.CodePointAt(_pointer); } else { @@ -192,7 +194,7 @@ private void GetChar() look = (char)0; _inIntersection = false; } - _pointer++; + _pointer+= StringUtil.CharCount(look); //Console.WriteLine("Got char: "+ look); } @@ -208,7 +210,7 @@ private Exception expected(String s) } else { - msg = "Parse error near char " + (_pointer - 1) + " '" + look + "'" + msg = "Parse error near char " + (_pointer - 1) + " '" + char.ConvertFromUtf32(look) + "'" + " in specified formula '" + _formulaString + "'. Expected " + s; } @@ -216,29 +218,39 @@ private Exception expected(String s) } /** Recognize an Alpha Character */ - private static bool IsAlpha(char c) + private static bool IsAlpha(int c) { - return Char.IsLetter(c) || c == '$' || c == '_'; + return CodePoint.IsLetter(new CodePoint(c)) || c == '$' || c == '_'; + } + + private static bool IsLetter(int c) + { + return CodePoint.IsLetter(new CodePoint(c)); } /** Recognize a Decimal Digit */ - private static bool IsDigit(char c) + private static bool IsDigit(int c) { - return Char.IsDigit(c); + return CodePoint.IsDigit(new CodePoint(c)); } /** Recognize an Alphanumeric */ - private static bool IsAlNum(char c) + private static bool IsAlNum(int c) { return IsAlpha(c) || IsDigit(c); } /** Recognize White Space */ - private static bool IsWhite(char c) + private static bool IsWhite(int c) { return c == ' ' || c == TAB || c == CR || c == LF; } + private static bool IsLetterOrDigit(int c) + { + return CodePoint.IsLetterOrDigit(new CodePoint(c)); + } + /** Skip Over Leading White Space */ private void SkipWhite() { @@ -253,7 +265,7 @@ private void SkipWhite() * unchecked exception. This method does not consume whitespace (before or after the * matched character). */ - private void Match(char x) + private void Match(int x) { if (look != x) { @@ -268,9 +280,9 @@ private String ParseUnquotedIdentifier() throw expected("unquoted identifier"); } StringBuilder sb = new StringBuilder(); - while (Char.IsLetterOrDigit(look) || look == '.') + while (IsLetterOrDigit(look) || look == '.') { - sb.Append(look); + sb.Append(char.ConvertFromUtf32(look)); GetChar(); } if (sb.Length < 1) @@ -285,9 +297,9 @@ private String GetNum() { StringBuilder value = new StringBuilder(); - while (IsDigit(this.look)) + while (IsDigit(look)) { - value.Append(this.look); + value.Append(char.ConvertFromUtf32(look)); GetChar(); } return value.Length == 0 ? null : value.ToString(); @@ -383,9 +395,15 @@ private static bool NeedsMemFunc(ParseNode root) * * @return true if the specified character may be used in a defined name */ - private static bool IsValidDefinedNameChar(char ch) + private static bool IsValidDefinedNameChar(int ch) { - if (Char.IsLetterOrDigit(ch)) + if (IsLetterOrDigit(ch)) + { + return true; + } + // the sheet naming rules are vague on whether unicode characters are allowed + // assume they're allowed. + if (ch > 128) { return true; } @@ -397,6 +415,7 @@ private static bool IsValidDefinedNameChar(char ch) case '\\': // of all things return true; } + // includes special non-name control characters like ! $ : , ( ) [ ] and space return false; } /** @@ -982,7 +1001,7 @@ private String ParseAsColumnQuantifier() StringBuilder name = new StringBuilder(); while (look != ']') { - name.Append(look); + name.Append(char.ConvertFromUtf32(look)); GetChar(); } Match(']'); @@ -1030,7 +1049,7 @@ private ParseNode ParseNonRange(int savePointer) { ResetPointer(savePointer); - if (Char.IsDigit(look)) + if (IsDigit(look)) { return new ParseNode(ParseNumber()); } @@ -1083,13 +1102,13 @@ private String ParseAsName() StringBuilder sb = new StringBuilder(); // defined names may begin with a letter or underscore or backslash - if (!char.IsLetter(look) && look != '_' && look != '\\') + if (!IsLetter(look) && look != '_' && look != '\\') { throw expected("number, string, defined name, or data table"); } while (IsValidDefinedNameChar(look)) { - sb.Append(look); + sb.Append(char.ConvertFromUtf32(look)); GetChar(); } SkipWhite(); @@ -1396,7 +1415,7 @@ private String GetBookName() GetChar(); while (look != ']') { - sb.Append(look); + sb.Append(char.ConvertFromUtf32(look)); GetChar(); } GetChar(); @@ -1431,7 +1450,7 @@ private SheetIdentifier ParseSheetName() bool done = look == '\''; while (!done) { - sb.Append(look); + sb.Append(char.ConvertFromUtf32(look)); GetChar(); if (look == '\'') { @@ -1457,13 +1476,13 @@ private SheetIdentifier ParseSheetName() } // unquoted sheet names must start with underscore or a letter - if (look == '_' || Char.IsLetter(look)) + if (look == '_' || IsLetter(look)) { StringBuilder sb = new StringBuilder(); // can concatenate idens with dots while (IsUnquotedSheetNameChar(look)) { - sb.Append(look); + sb.Append(char.ConvertFromUtf32(look)); GetChar(); } NameIdentifier iden = new NameIdentifier(sb.ToString(), false); @@ -1507,9 +1526,15 @@ private SheetIdentifier ParseSheetRange(String bookname, NameIdentifier sheet1Na /** * very similar to {@link SheetNameFormatter#isSpecialChar(char)} */ - private bool IsUnquotedSheetNameChar(char ch) + private bool IsUnquotedSheetNameChar(int ch) { - if (Char.IsLetterOrDigit(ch)) + if (IsLetterOrDigit(ch)) + { + return true; + } + // the sheet naming rules are vague on whether unicode characters are allowed + // assume they're allowed. + if (ch > 128) { return true; } @@ -1526,7 +1551,7 @@ private void ResetPointer(int ptr) _pointer = ptr; if (_pointer <= _formulaLength) { - look = _formulaString[_pointer - 1]; + look = _formulaString.CodePointAt(_pointer - StringUtil.CharCount(look)); } else { @@ -1757,7 +1782,7 @@ private void ValidateNumArgs(int numArgs, FunctionMetadata fm) } } - private static bool IsArgumentDelimiter(char ch) + private static bool IsArgumentDelimiter(int ch) { return ch == ',' || ch == ')'; } @@ -1871,7 +1896,7 @@ private ParseNode ParseSimpleFactor() } // named ranges and tables can start with underscore or backslash // see https://support.office.com/en-us/article/Define-and-use-names-in-formulas-4d0f13ac-53b7-422e-afd2-abd7ff379c64?ui=en-US&rs=en-US&ad=US#bmsyntax_rules_for_names - if (IsAlpha(look) || Char.IsDigit(look) || look == '\'' || look == '[' || look == '_' || look == '\\') + if (IsAlpha(look) || IsDigit(look) || look == '\'' || look == '[' || look == '_' || look == '\\') { return ParseRangeExpression(); } @@ -2233,7 +2258,7 @@ private String ParseStringLiteral() break; } } - Token.Append(look); + Token.Append(char.ConvertFromUtf32(look)); GetChar(); } return Token.ToString(); diff --git a/main/Util/StringUtil.cs b/main/Util/StringUtil.cs index bf882fed9..a914d66a7 100644 --- a/main/Util/StringUtil.cs +++ b/main/Util/StringUtil.cs @@ -42,7 +42,7 @@ namespace NPOI.Util /// @since May 10, 2002 /// @version 1.0 /// - public class StringUtil + public static class StringUtil { private static Encoding ISO_8859_1 = Encoding.GetEncoding("ISO-8859-1"); private static Encoding UTF16LE = Encoding.Unicode; @@ -50,9 +50,9 @@ public class StringUtil /** * Constructor for the StringUtil object */ - private StringUtil() - { - } + //private StringUtil() + //{ + //} /// /// Given a byte array of 16-bit unicode characters in Little Endian @@ -877,5 +877,21 @@ public static int CountMatches(string haystack, char needle) } return count; } + + public static int CodePointAt(this string text, int index) + { + if (!char.IsSurrogate(text[index])) + { + return (int)text[index]; + } + if (index + 1 < text.Length && char.IsSurrogatePair(text[index], text[index + 1])) + { + return char.ConvertToUtf32(text[index], text[index+1]); + } + else + { + throw new Exception("String was not well-formed UTF-16."); + } + } } } diff --git a/testcases/main/SS/UserModel/BaseTestNamedRange.cs b/testcases/main/SS/UserModel/BaseTestNamedRange.cs index 761eefc10..98452acba 100644 --- a/testcases/main/SS/UserModel/BaseTestNamedRange.cs +++ b/testcases/main/SS/UserModel/BaseTestNamedRange.cs @@ -741,6 +741,20 @@ public void TestInvalid() wb.Close(); } + // bug 60260: renaming a sheet with a named range referring to a unicode (non-ASCII) sheet name + [Test] + public void RenameSheetWithNamedRangeReferringToUnicodeSheetName() + { + IWorkbook wb = _testDataProvider.CreateWorkbook(); + wb.CreateSheet("Sheet\u30FB1"); + + IName name = wb.CreateName(); + name.NameName = ("test_named_range"); + name.RefersToFormula = ("'Sheet\u30FB201'!A1:A6"); + + wb.SetSheetName(0, "Sheet 1"); + IOUtils.CloseQuietly(wb); + } } } \ No newline at end of file diff --git a/testcases/ooxml/XSSF/UserModel/TestXSSFSheetShiftRows.cs b/testcases/ooxml/XSSF/UserModel/TestXSSFSheetShiftRows.cs index 212e0f3f7..4276ce34c 100644 --- a/testcases/ooxml/XSSF/UserModel/TestXSSFSheetShiftRows.cs +++ b/testcases/ooxml/XSSF/UserModel/TestXSSFSheetShiftRows.cs @@ -18,6 +18,7 @@ limitations under the License. using NPOI.OpenXmlFormats.Spreadsheet; using NPOI.SS.UserModel; using NPOI.SS.Util; +using NPOI.Util; using NPOI.XSSF; using NPOI.XSSF.UserModel; using NUnit.Framework; @@ -462,6 +463,15 @@ public void TestSharedFormulas() wb.Close(); } + // bug 60260: shift rows or rename a sheet containing a named range + // that refers to formula with a unicode (non-ASCII) sheet name formula + [Test] + public void ShiftRowsWithUnicodeNamedRange() + { + XSSFWorkbook wb = XSSFTestDataSamples.OpenSampleWorkbook("unicodeSheetName.xlsx"); + XSSFSheet sheet = wb.GetSheetAt(0) as XSSFSheet; + sheet.ShiftRows(1, 2, 3); + IOUtils.CloseQuietly(wb); + } } } - diff --git a/testcases/test-data/spreadsheet/unicodeSheetName.xlsx b/testcases/test-data/spreadsheet/unicodeSheetName.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..8c0fa8c4d15fa1e7b62bbec3c0c402a90c7ac387 GIT binary patch literal 8924 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 literal 0 HcmV?d00001 From 81ea74e0f6e14cd3053dc35bebc68e7626bb6b63 Mon Sep 17 00:00:00 2001 From: Antony Liu Date: Fri, 15 Mar 2024 13:22:18 +0800 Subject: [PATCH 2/7] poi: bug 60601: unset hyperlinks after removing them individually from the DOM bug 60601: allow SXSSFITestDataProvider.writeOutAndReadBack(Workbook wb) to work on SXSSFWorkbooks and XSSFWorkbooks bug 60601: hyperlinks have to be removed one by one to avoid other errors bug 60601: unlink hyperlinks from a sheet if all hyperlinks have been removed. Patch from Joachim Piketz --- OpenXmlFormats/Spreadsheet/Sheet.cs | 13 ++++++++++ .../Spreadsheet/Sheet/CT_Worksheet.cs | 12 ++++++---- ooxml/XSSF/UserModel/XSSFSheet.cs | 21 +++++++++++++++- testcases/main/SS/UserModel/BaseTestSheet.cs | 24 +++++++++++++++++++ .../ooxml/XSSF/SXSSFITestDataProvider.cs | 10 ++++---- 5 files changed, 71 insertions(+), 9 deletions(-) diff --git a/OpenXmlFormats/Spreadsheet/Sheet.cs b/OpenXmlFormats/Spreadsheet/Sheet.cs index e96aa1621..2ad8a695d 100644 --- a/OpenXmlFormats/Spreadsheet/Sheet.cs +++ b/OpenXmlFormats/Spreadsheet/Sheet.cs @@ -10697,6 +10697,19 @@ public void SetHyperlinkArray(CT_Hyperlink[] array) { hyperlinkField = new List(array); } + + public int SizeOfHyperlinkArray() + { + return this.hyperlinkField == null ? 0 : this.hyperlinkField.Count; + } + + public void RemoveHyperlink(int index) + { + if (this.hyperlink == null) + return; + this.hyperlinkField.RemoveAt(index); + } + [XmlElement("hyperlink", IsNullable = false)] public List hyperlink { diff --git a/OpenXmlFormats/Spreadsheet/Sheet/CT_Worksheet.cs b/OpenXmlFormats/Spreadsheet/Sheet/CT_Worksheet.cs index 4b7668dee..0bd0be691 100644 --- a/OpenXmlFormats/Spreadsheet/Sheet/CT_Worksheet.cs +++ b/OpenXmlFormats/Spreadsheet/Sheet/CT_Worksheet.cs @@ -415,6 +415,12 @@ public bool IsSetDimension() { return this.dimensionField != null; } + + public void UnsetHyperlinks() + { + this.hyperlinksField = null; + } + public CT_SheetProtection AddNewSheetProtection() { this.sheetProtectionField = new CT_SheetProtection(); @@ -483,10 +489,7 @@ public bool IsSetPageMargins() { return this.pageMarginsField != null; } - public bool IsSetHyperLinks() - { - return this.hyperlinksField != null; - } + public bool IsSetSheetPr() { return this.sheetPrField != null; @@ -1014,6 +1017,7 @@ public CT_IgnoredErrors AddNewIgnoredErrors() this.ignoredErrorsField = new CT_IgnoredErrors(); return this.ignoredErrorsField; } + } } diff --git a/ooxml/XSSF/UserModel/XSSFSheet.cs b/ooxml/XSSF/UserModel/XSSFSheet.cs index 65a7643fb..006de6983 100644 --- a/ooxml/XSSF/UserModel/XSSFSheet.cs +++ b/ooxml/XSSF/UserModel/XSSFSheet.cs @@ -1457,7 +1457,26 @@ CT_Hyperlink[] ctHls worksheet.hyperlinks.SetHyperlinkArray(ctHls); } - + else + { + if (worksheet.hyperlinks != null) + { + int count = worksheet.hyperlinks.SizeOfHyperlinkArray(); + for (int i = count - 1; i >= 0; i--) + { + worksheet.hyperlinks.RemoveHyperlink(i); + } + // For some reason, we have to remove the hyperlinks one by one from the CTHyperlinks array + // before unsetting the hyperlink array. + // Resetting the hyperlink array seems to break some XML nodes. + //worksheet.getHyperlinks().setHyperlinkArray(new CTHyperlink[0]); + worksheet.UnsetHyperlinks(); + } + else + { + // nothing to do + } + } foreach (XSSFRow row in _rows.Values) { row.OnDocumentWrite(); diff --git a/testcases/main/SS/UserModel/BaseTestSheet.cs b/testcases/main/SS/UserModel/BaseTestSheet.cs index 2076d8f82..c0809fa07 100644 --- a/testcases/main/SS/UserModel/BaseTestSheet.cs +++ b/testcases/main/SS/UserModel/BaseTestSheet.cs @@ -1326,6 +1326,30 @@ public void GetHyperlink() workbook.Close(); } + [Test] + public void RemoveAllHyperlinks() + { + IWorkbook workbook = _testDataProvider.CreateWorkbook(); + IHyperlink hyperlink = workbook.GetCreationHelper().CreateHyperlink(HyperlinkType.Url); + hyperlink.Address = "https://poi.apache.org/"; + ISheet sheet = workbook.CreateSheet(); + ICell cell = sheet.CreateRow(5).CreateCell(1); + cell.Hyperlink = hyperlink; + + Assert.AreEqual(1, workbook.GetSheetAt(0).GetHyperlinkList().Count); + // Save a workbook with a hyperlink + IWorkbook workbook2 = _testDataProvider.WriteOutAndReadBack(workbook); + Assert.AreEqual(1, workbook2.GetSheetAt(0).GetHyperlinkList().Count); + + // Remove all hyperlinks from a saved workbook + workbook2.GetSheetAt(0).GetRow(5).GetCell(1).RemoveHyperlink(); + Assert.AreEqual(0, workbook2.GetSheetAt(0).GetHyperlinkList().Count); + + // Verify that hyperlink was removed from workbook after writing out + IWorkbook workbook3 = _testDataProvider.WriteOutAndReadBack(workbook2); + Assert.AreEqual(0, workbook3.GetSheetAt(0).GetHyperlinkList().Count); + } + [Test] public void NewMergedRegionAt() { diff --git a/testcases/ooxml/XSSF/SXSSFITestDataProvider.cs b/testcases/ooxml/XSSF/SXSSFITestDataProvider.cs index dbc5876ed..9f19622fc 100644 --- a/testcases/ooxml/XSSF/SXSSFITestDataProvider.cs +++ b/testcases/ooxml/XSSF/SXSSFITestDataProvider.cs @@ -57,13 +57,15 @@ public IWorkbook OpenSampleWorkbook(String sampleFileName) public IWorkbook WriteOutAndReadBack(IWorkbook wb) { - if (!(wb is SXSSFWorkbook)) + // wb is usually an SXSSFWorkbook, but must also work on an XSSFWorkbook + // since workbooks must be able to be written out and read back + // several times in succession + if (!(wb is SXSSFWorkbook || wb is XSSFWorkbook)) { - throw new ArgumentException("Expected an instance of SXSSFWorkbook"); + throw new ArgumentException("Expected an instance of XSSFWorkbook or SXSSFWorkbook"); } - XSSFWorkbook result; - try + XSSFWorkbook result; try { MemoryStream baos = new MemoryStream(8192); wb.Write(baos, false); From 1ade0af094a6969b94480099c912fb2bf5cbf6e4 Mon Sep 17 00:00:00 2001 From: Antony Liu Date: Fri, 15 Mar 2024 14:35:41 +0800 Subject: [PATCH 3/7] poi: refactor duplicated code in TestXSSFSheet#setColumnGroupCollapsed; remove unnecessary int to short casts --- .../ooxml/XSSF/UserModel/TestXSSFSheet.cs | 333 ++++++++---------- 1 file changed, 147 insertions(+), 186 deletions(-) diff --git a/testcases/ooxml/XSSF/UserModel/TestXSSFSheet.cs b/testcases/ooxml/XSSF/UserModel/TestXSSFSheet.cs index 54e71c757..809905f23 100644 --- a/testcases/ooxml/XSSF/UserModel/TestXSSFSheet.cs +++ b/testcases/ooxml/XSSF/UserModel/TestXSSFSheet.cs @@ -438,186 +438,90 @@ public void TestSetColumnGroupCollapsed() CT_Cols cols = sheet1.GetCTWorksheet().GetColsArray(0); Assert.AreEqual(0, cols.sizeOfColArray()); - sheet1.GroupColumn((short)4, (short)7); - sheet1.GroupColumn((short)9, (short)12); + sheet1.GroupColumn(4, 7); + Assert.AreEqual(1, cols.sizeOfColArray()); + checkColumnGroup(cols.GetColArray(0), 4, 7); // false, true - Assert.AreEqual(2, cols.sizeOfColArray()); + sheet1.GroupColumn(9, 12); - Assert.IsFalse(cols.GetColArray(0).IsSetHidden()); - Assert.IsTrue(cols.GetColArray(0).IsSetCollapsed()); - Assert.AreEqual(5, cols.GetColArray(0).min); // 1 based - Assert.AreEqual(8, cols.GetColArray(0).max); // 1 based - Assert.IsFalse(cols.GetColArray(1).IsSetHidden()); - Assert.IsTrue(cols.GetColArray(1).IsSetCollapsed()); - Assert.AreEqual(10, cols.GetColArray(1).min); // 1 based - Assert.AreEqual(13, cols.GetColArray(1).max); // 1 based + Assert.AreEqual(2, cols.sizeOfColArray()); + checkColumnGroup(cols.GetColArray(0), 4, 7); // false, true + checkColumnGroup(cols.GetColArray(1), 9, 12); // false, true - sheet1.GroupColumn((short)10, (short)11); + sheet1.GroupColumn(10, 11); Assert.AreEqual(4, cols.sizeOfColArray()); - Assert.IsFalse(cols.GetColArray(0).IsSetHidden()); - Assert.IsTrue(cols.GetColArray(0).IsSetCollapsed()); - Assert.AreEqual(5, cols.GetColArray(0).min); // 1 based - Assert.AreEqual(8, cols.GetColArray(0).max); // 1 based - Assert.IsFalse(cols.GetColArray(1).IsSetHidden()); - Assert.IsTrue(cols.GetColArray(1).IsSetCollapsed()); - Assert.AreEqual(10, cols.GetColArray(1).min); // 1 based - Assert.AreEqual(10, cols.GetColArray(1).max); // 1 based - Assert.IsFalse(cols.GetColArray(2).IsSetHidden()); - Assert.IsTrue(cols.GetColArray(2).IsSetCollapsed()); - Assert.AreEqual(11, cols.GetColArray(2).min); // 1 based - Assert.AreEqual(12, cols.GetColArray(2).max); // 1 based - Assert.IsFalse(cols.GetColArray(3).IsSetHidden()); - Assert.IsTrue(cols.GetColArray(3).IsSetCollapsed()); - Assert.AreEqual(13, cols.GetColArray(3).min); // 1 based - Assert.AreEqual(13, cols.GetColArray(3).max); // 1 based + Assert.AreEqual(4, cols.sizeOfColArray()); + checkColumnGroup(cols.GetColArray(0), 4, 7); // false, true + checkColumnGroup(cols.GetColArray(1), 9, 9); // false, true + checkColumnGroup(cols.GetColArray(2), 10, 11); // false, true + checkColumnGroup(cols.GetColArray(3), 12, 12); // false, true // collapse columns - 1 - sheet1.SetColumnGroupCollapsed((short)5, true); - Assert.AreEqual(5, cols.sizeOfColArray()); + sheet1.SetColumnGroupCollapsed(5, true); - Assert.IsTrue(cols.GetColArray(0).IsSetHidden()); - Assert.IsTrue(cols.GetColArray(0).IsSetCollapsed()); - Assert.AreEqual(5, cols.GetColArray(0).min); // 1 based - Assert.AreEqual(8, cols.GetColArray(0).max); // 1 based - Assert.IsFalse(cols.GetColArray(1).IsSetHidden()); - Assert.IsTrue(cols.GetColArray(1).IsSetCollapsed()); - Assert.AreEqual(9, cols.GetColArray(1).min); // 1 based - Assert.AreEqual(9, cols.GetColArray(1).max); // 1 based - Assert.IsFalse(cols.GetColArray(2).IsSetHidden()); - Assert.IsTrue(cols.GetColArray(2).IsSetCollapsed()); - Assert.AreEqual(10, cols.GetColArray(2).min); // 1 based - Assert.AreEqual(10, cols.GetColArray(2).max); // 1 based - Assert.IsFalse(cols.GetColArray(3).IsSetHidden()); - Assert.IsTrue(cols.GetColArray(3).IsSetCollapsed()); - Assert.AreEqual(11, cols.GetColArray(3).min); // 1 based - Assert.AreEqual(12, cols.GetColArray(3).max); // 1 based - Assert.IsFalse(cols.GetColArray(4).IsSetHidden()); - Assert.IsTrue(cols.GetColArray(4).IsSetCollapsed()); - Assert.AreEqual(13, cols.GetColArray(4).min); // 1 based - Assert.AreEqual(13, cols.GetColArray(4).max); // 1 based + // FIXME: we grew a column? + Assert.AreEqual(5, cols.sizeOfColArray()); + checkColumnGroupIsCollapsed(cols.GetColArray(0), 4, 7); // true, true + checkColumnGroup(cols.GetColArray(1), 8, 8); // false, true + checkColumnGroup(cols.GetColArray(2), 9, 9); // false, true + checkColumnGroup(cols.GetColArray(3), 10, 11); // false, true + checkColumnGroup(cols.GetColArray(4), 12, 12); // false, true // expand columns - 1 - sheet1.SetColumnGroupCollapsed((short)5, false); - - Assert.IsFalse(cols.GetColArray(0).IsSetHidden()); - Assert.IsTrue(cols.GetColArray(0).IsSetCollapsed()); - Assert.AreEqual(5, cols.GetColArray(0).min); // 1 based - Assert.AreEqual(8, cols.GetColArray(0).max); // 1 based - Assert.IsFalse(cols.GetColArray(1).IsSetHidden()); - Assert.IsFalse(cols.GetColArray(1).IsSetCollapsed()); - Assert.AreEqual(9, cols.GetColArray(1).min); // 1 based - Assert.AreEqual(9, cols.GetColArray(1).max); // 1 based - Assert.IsFalse(cols.GetColArray(2).IsSetHidden()); - Assert.IsTrue(cols.GetColArray(2).IsSetCollapsed()); - Assert.AreEqual(10, cols.GetColArray(2).min); // 1 based - Assert.AreEqual(10, cols.GetColArray(2).max); // 1 based - Assert.IsFalse(cols.GetColArray(3).IsSetHidden()); - Assert.IsTrue(cols.GetColArray(3).IsSetCollapsed()); - Assert.AreEqual(11, cols.GetColArray(3).min); // 1 based - Assert.AreEqual(12, cols.GetColArray(3).max); // 1 based - Assert.IsFalse(cols.GetColArray(4).IsSetHidden()); - Assert.IsTrue(cols.GetColArray(4).IsSetCollapsed()); - Assert.AreEqual(13, cols.GetColArray(4).min); // 1 based - Assert.AreEqual(13, cols.GetColArray(4).max); // 1 based + sheet1.SetColumnGroupCollapsed(5, false); + Assert.AreEqual(5, cols.sizeOfColArray()); + + checkColumnGroupIsExpanded(cols.GetColArray(0), 4, 7); // false, true + checkColumnGroup(cols.GetColArray(1), 8, 8, false, false); + checkColumnGroup(cols.GetColArray(2), 9, 9); // false, true + checkColumnGroup(cols.GetColArray(3), 10, 11); // false, true + checkColumnGroup(cols.GetColArray(4), 12, 12); // false, true //collapse - 2 - sheet1.SetColumnGroupCollapsed((short)9, true); + sheet1.SetColumnGroupCollapsed(9, true); + // it grew again? Assert.AreEqual(6, cols.sizeOfColArray()); - Assert.IsFalse(cols.GetColArray(0).IsSetHidden()); - Assert.IsTrue(cols.GetColArray(0).IsSetCollapsed()); - Assert.AreEqual(5, cols.GetColArray(0).min); // 1 based - Assert.AreEqual(8, cols.GetColArray(0).max); // 1 based - Assert.IsFalse(cols.GetColArray(1).IsSetHidden()); - Assert.IsFalse(cols.GetColArray(1).IsSetCollapsed()); - Assert.AreEqual(9, cols.GetColArray(1).min); // 1 based - Assert.AreEqual(9, cols.GetColArray(1).max); // 1 based - Assert.IsTrue(cols.GetColArray(2).IsSetHidden()); - Assert.IsTrue(cols.GetColArray(2).IsSetCollapsed()); - Assert.AreEqual(10, cols.GetColArray(2).min); // 1 based - Assert.AreEqual(10, cols.GetColArray(2).max); // 1 based - Assert.IsTrue(cols.GetColArray(3).IsSetHidden()); - Assert.IsTrue(cols.GetColArray(3).IsSetCollapsed()); - Assert.AreEqual(11, cols.GetColArray(3).min); // 1 based - Assert.AreEqual(12, cols.GetColArray(3).max); // 1 based - Assert.IsTrue(cols.GetColArray(4).IsSetHidden()); - Assert.IsTrue(cols.GetColArray(4).IsSetCollapsed()); - Assert.AreEqual(13, cols.GetColArray(4).min); // 1 based - Assert.AreEqual(13, cols.GetColArray(4).max); // 1 based - Assert.IsFalse(cols.GetColArray(5).IsSetHidden()); - Assert.IsTrue(cols.GetColArray(5).IsSetCollapsed()); - Assert.AreEqual(14, cols.GetColArray(5).min); // 1 based - Assert.AreEqual(14, cols.GetColArray(5).max); // 1 based + checkColumnGroup(cols.GetColArray(0), 4, 7); // false, true + checkColumnGroup(cols.GetColArray(1), 8, 8, false, false); + checkColumnGroupIsCollapsed(cols.GetColArray(2), 9, 9); // true, true + checkColumnGroupIsCollapsed(cols.GetColArray(3), 10, 11); // true, true + checkColumnGroupIsCollapsed(cols.GetColArray(4), 12, 12); // true, true + // why was this column group added? + checkColumnGroup(cols.GetColArray(5), 13, 13); // false, true //expand - 2 - sheet1.SetColumnGroupCollapsed((short)9, false); + sheet1.SetColumnGroupCollapsed(9, false); Assert.AreEqual(6, cols.sizeOfColArray()); - Assert.AreEqual(14, cols.GetColArray(5).min); //outline level 2: the line under ==> collapsed==True Assert.AreEqual(2, cols.GetColArray(3).outlineLevel); Assert.IsTrue(cols.GetColArray(4).IsSetCollapsed()); - Assert.IsFalse(cols.GetColArray(0).IsSetHidden()); - Assert.IsTrue(cols.GetColArray(0).IsSetCollapsed()); - Assert.AreEqual(5, cols.GetColArray(0).min); // 1 based - Assert.AreEqual(8, cols.GetColArray(0).max); // 1 based - Assert.IsFalse(cols.GetColArray(1).IsSetHidden()); - Assert.IsFalse(cols.GetColArray(1).IsSetCollapsed()); - Assert.AreEqual(9, cols.GetColArray(1).min); // 1 based - Assert.AreEqual(9, cols.GetColArray(1).max); // 1 based - Assert.IsFalse(cols.GetColArray(2).IsSetHidden()); - Assert.IsTrue(cols.GetColArray(2).IsSetCollapsed()); - Assert.AreEqual(10, cols.GetColArray(2).min); // 1 based - Assert.AreEqual(10, cols.GetColArray(2).max); // 1 based - Assert.IsTrue(cols.GetColArray(3).IsSetHidden()); - Assert.IsTrue(cols.GetColArray(3).IsSetCollapsed()); - Assert.AreEqual(11, cols.GetColArray(3).min); // 1 based - Assert.AreEqual(12, cols.GetColArray(3).max); // 1 based - Assert.IsFalse(cols.GetColArray(4).IsSetHidden()); - Assert.IsTrue(cols.GetColArray(4).IsSetCollapsed()); - Assert.AreEqual(13, cols.GetColArray(4).min); // 1 based - Assert.AreEqual(13, cols.GetColArray(4).max); // 1 based - Assert.IsFalse(cols.GetColArray(5).IsSetHidden()); - Assert.IsFalse(cols.GetColArray(5).IsSetCollapsed()); - Assert.AreEqual(14, cols.GetColArray(5).min); // 1 based - Assert.AreEqual(14, cols.GetColArray(5).max); // 1 based + checkColumnGroup(cols.GetColArray(0), 4, 7); + checkColumnGroup(cols.GetColArray(1), 8, 8, false, false); + checkColumnGroup(cols.GetColArray(2), 9, 9); // false, true + checkColumnGroupIsCollapsed(cols.GetColArray(3), 10, 11); // true, true + checkColumnGroup(cols.GetColArray(4), 12, 12); // false, true + checkColumnGroup(cols.GetColArray(5), 13, 13, false, false); //DOCUMENTARE MEGLIO IL DISCORSO DEL LIVELLO //collapse - 3 - sheet1.SetColumnGroupCollapsed((short)10, true); + sheet1.SetColumnGroupCollapsed(10, true); Assert.AreEqual(6, cols.sizeOfColArray()); - Assert.IsFalse(cols.GetColArray(0).IsSetHidden()); - Assert.IsTrue(cols.GetColArray(0).IsSetCollapsed()); - Assert.AreEqual(5, cols.GetColArray(0).min); // 1 based - Assert.AreEqual(8, cols.GetColArray(0).max); // 1 based - Assert.IsFalse(cols.GetColArray(1).IsSetHidden()); - Assert.IsFalse(cols.GetColArray(1).IsSetCollapsed()); - Assert.AreEqual(9, cols.GetColArray(1).min); // 1 based - Assert.AreEqual(9, cols.GetColArray(1).max); // 1 based - Assert.IsFalse(cols.GetColArray(2).IsSetHidden()); - Assert.IsTrue(cols.GetColArray(2).IsSetCollapsed()); - Assert.AreEqual(10, cols.GetColArray(2).min); // 1 based - Assert.AreEqual(10, cols.GetColArray(2).max); // 1 based - Assert.IsTrue(cols.GetColArray(3).IsSetHidden()); - Assert.IsTrue(cols.GetColArray(3).IsSetCollapsed()); - Assert.AreEqual(11, cols.GetColArray(3).min); // 1 based - Assert.AreEqual(12, cols.GetColArray(3).max); // 1 based - Assert.IsFalse(cols.GetColArray(4).IsSetHidden()); - Assert.IsTrue(cols.GetColArray(4).IsSetCollapsed()); - Assert.AreEqual(13, cols.GetColArray(4).min); // 1 based - Assert.AreEqual(13, cols.GetColArray(4).max); // 1 based - Assert.IsFalse(cols.GetColArray(5).IsSetHidden()); - Assert.IsFalse(cols.GetColArray(5).IsSetCollapsed()); - Assert.AreEqual(14, cols.GetColArray(5).min); // 1 based - Assert.AreEqual(14, cols.GetColArray(5).max); // 1 based + checkColumnGroup(cols.GetColArray(0), 4, 7); + checkColumnGroup(cols.GetColArray(1), 8, 8, false, false); + checkColumnGroup(cols.GetColArray(2), 9, 9); // false, true + checkColumnGroupIsCollapsed(cols.GetColArray(3), 10, 11); // true, true + checkColumnGroup(cols.GetColArray(4), 12, 12); // false, true + checkColumnGroup(cols.GetColArray(5), 13, 13, false, false); //expand - 3 - sheet1.SetColumnGroupCollapsed((short)10, false); + sheet1.SetColumnGroupCollapsed(10, false); Assert.AreEqual(6, cols.sizeOfColArray()); Assert.IsFalse(cols.GetColArray(0).hidden); Assert.IsFalse(cols.GetColArray(5).hidden); @@ -627,37 +531,95 @@ public void TestSetColumnGroupCollapsed() // Save and re-load XSSFWorkbook wb2 = XSSFTestDataSamples.WriteOutAndReadBack(wb1); wb1.Close(); - sheet1 = (XSSFSheet)wb2.GetSheetAt(0); - Assert.AreEqual(6, cols.sizeOfColArray()); + sheet1 = wb2.GetSheetAt(0) as XSSFSheet; + // FIXME: forgot to reassign! + //cols = sheet1.getCTWorksheet().getColsArray(0); - Assert.IsFalse(cols.GetColArray(0).IsSetHidden()); - Assert.IsTrue(cols.GetColArray(0).IsSetCollapsed()); - Assert.AreEqual(5, cols.GetColArray(0).min); // 1 based - Assert.AreEqual(8, cols.GetColArray(0).max); // 1 based - Assert.IsFalse(cols.GetColArray(1).IsSetHidden()); - Assert.IsFalse(cols.GetColArray(1).IsSetCollapsed()); - Assert.AreEqual(9, cols.GetColArray(1).min); // 1 based - Assert.AreEqual(9, cols.GetColArray(1).max); // 1 based - Assert.IsFalse(cols.GetColArray(2).IsSetHidden()); - Assert.IsTrue(cols.GetColArray(2).IsSetCollapsed()); - Assert.AreEqual(10, cols.GetColArray(2).min); // 1 based - Assert.AreEqual(10, cols.GetColArray(2).max); // 1 based - Assert.IsFalse(cols.GetColArray(3).IsSetHidden()); - Assert.IsTrue(cols.GetColArray(3).IsSetCollapsed()); - Assert.AreEqual(11, cols.GetColArray(3).min); // 1 based - Assert.AreEqual(12, cols.GetColArray(3).max); // 1 based - Assert.IsFalse(cols.GetColArray(4).IsSetHidden()); - Assert.IsFalse(cols.GetColArray(4).IsSetCollapsed()); - Assert.AreEqual(13, cols.GetColArray(4).min); // 1 based - Assert.AreEqual(13, cols.GetColArray(4).max); // 1 based - Assert.IsFalse(cols.GetColArray(5).IsSetHidden()); - Assert.IsFalse(cols.GetColArray(5).IsSetCollapsed()); - Assert.AreEqual(14, cols.GetColArray(5).min); // 1 based - Assert.AreEqual(14, cols.GetColArray(5).max); // 1 based + Assert.AreEqual(6, cols.sizeOfColArray()); + checkColumnGroup(cols.GetColArray(0), 4, 7); // false, true + checkColumnGroup(cols.GetColArray(1), 8, 8, false, false); + checkColumnGroup(cols.GetColArray(2), 9, 9); // false, true + checkColumnGroup(cols.GetColArray(3), 10, 11); // false, true + checkColumnGroup(cols.GetColArray(4), 12, 12, false, false); + checkColumnGroup(cols.GetColArray(5), 13, 13, false, false); wb2.Close(); } + /** + * Verify that column groups were created correctly after Sheet.groupColumn + * + * @param col the column group xml bean + * @param fromColumnIndex 0-indexed + * @param toColumnIndex 0-indexed + */ + private static void checkColumnGroup( + CT_Col col, + int fromColumnIndex, int toColumnIndex, + bool isSetHidden, bool isSetCollapsed + ) + { + Assert.AreEqual(fromColumnIndex, col.min - 1, "from column index"); // 1 based + Assert.AreEqual(toColumnIndex, col.max - 1, "to column index"); // 1 based + Assert.AreEqual(isSetHidden, col.IsSetHidden(), "isSetHidden"); + Assert.AreEqual(isSetCollapsed, col.IsSetCollapsed(), "isSetCollapsed"); //not necessarily set + } + + /** + * Verify that column groups were created correctly after Sheet.groupColumn + * + * @param col the column group xml bean + * @param fromColumnIndex 0-indexed + * @param toColumnIndex 0-indexed + */ + private static void checkColumnGroup( + CT_Col col, + int fromColumnIndex, int toColumnIndex + ) + { + Assert.AreEqual(fromColumnIndex, col.min - 1, "from column index"); // 1 based + Assert.AreEqual(toColumnIndex, col.max - 1, "to column index"); // 1 based + Assert.IsFalse(col.IsSetHidden(), "isSetHidden"); + Assert.IsTrue(col.IsSetCollapsed(), "isSetCollapsed"); //not necessarily set + } + /** + * Verify that column groups were created correctly after Sheet.groupColumn + * + * @param col the column group xml bean + * @param fromColumnIndex 0-indexed + * @param toColumnIndex 0-indexed + */ + private static void checkColumnGroupIsCollapsed( + CT_Col col, + int fromColumnIndex, int toColumnIndex + ) + { + Assert.AreEqual(fromColumnIndex, col.min - 1, "from column index"); // 1 based + Assert.AreEqual(toColumnIndex, col.max - 1, "to column index"); // 1 based + Assert.IsTrue(col.IsSetHidden(), "isSetHidden"); + Assert.IsTrue(col.IsSetCollapsed(), "isSetCollapsed"); + //assertTrue("getCollapsed", col.getCollapsed()); + } + /** + * Verify that column groups were created correctly after Sheet.groupColumn + * + * @param col the column group xml bean + * @param fromColumnIndex 0-indexed + * @param toColumnIndex 0-indexed + */ + private static void checkColumnGroupIsExpanded( + CT_Col col, + int fromColumnIndex, int toColumnIndex + ) + { + Assert.AreEqual(fromColumnIndex, col.min - 1, "from column index"); // 1 based + Assert.AreEqual(toColumnIndex, col.max - 1, "to column index"); // 1 based + Assert.IsFalse(col.IsSetHidden(), "isSetHidden"); + Assert.IsTrue(col.IsSetCollapsed(), "isSetCollapsed"); + //assertTrue("isSetCollapsed", !col.isSetCollapsed() || !col.getCollapsed()); + //assertFalse("getCollapsed", col.getCollapsed()); + } + /** * TODO - while this is internally consistent, I'm not * completely clear in all cases what it's supposed to @@ -1376,26 +1338,25 @@ private XSSFWorkbook SetupSheet() XSSFWorkbook wb = new XSSFWorkbook(); XSSFSheet sheet = wb.CreateSheet() as XSSFSheet; - IRow row1 = sheet.CreateRow((short)0); - ICell cell = row1.CreateCell((short)0); + IRow row1 = sheet.CreateRow(0); + ICell cell = row1.CreateCell(0); cell.SetCellValue("Names"); - ICell cell2 = row1.CreateCell((short)1); + ICell cell2 = row1.CreateCell(1); cell2.SetCellValue("#"); - IRow row2 = sheet.CreateRow((short)1); - ICell cell3 = row2.CreateCell((short)0); + IRow row2 = sheet.CreateRow(1); + ICell cell3 = row2.CreateCell(0); cell3.SetCellValue("Jane"); - ICell cell4 = row2.CreateCell((short)1); + ICell cell4 = row2.CreateCell(1); cell4.SetCellValue(3); - IRow row3 = sheet.CreateRow((short)2); - ICell cell5 = row3.CreateCell((short)0); + IRow row3 = sheet.CreateRow(2); + ICell cell5 = row3.CreateCell(0); cell5.SetCellValue("John"); - ICell cell6 = row3.CreateCell((short)1); + ICell cell6 = row3.CreateCell(1); cell6.SetCellValue(3); - return wb; - } + return wb; } [Test] public void TestCreateTwoPivotTablesInOneSheet() From 4927100f838712b4c75afbf76effaf1d021367f2 Mon Sep 17 00:00:00 2001 From: Tony Qu Date: Sat, 9 Nov 2024 04:53:36 +0800 Subject: [PATCH 4/7] Update CT_Worksheet.cs --- OpenXmlFormats/Spreadsheet/Sheet/CT_Worksheet.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/OpenXmlFormats/Spreadsheet/Sheet/CT_Worksheet.cs b/OpenXmlFormats/Spreadsheet/Sheet/CT_Worksheet.cs index 0bd0be691..7aeaed76f 100644 --- a/OpenXmlFormats/Spreadsheet/Sheet/CT_Worksheet.cs +++ b/OpenXmlFormats/Spreadsheet/Sheet/CT_Worksheet.cs @@ -489,7 +489,10 @@ public bool IsSetPageMargins() { return this.pageMarginsField != null; } - + public bool IsSetHyperLinks() + { + return this.hyperlinksField != null; + } public bool IsSetSheetPr() { return this.sheetPrField != null; From c0268a6989616d40e571d3d68b83297ecc668d14 Mon Sep 17 00:00:00 2001 From: Tony Qu Date: Sat, 9 Nov 2024 04:54:46 +0800 Subject: [PATCH 5/7] Update SXSSFITestDataProvider.cs --- testcases/ooxml/XSSF/SXSSFITestDataProvider.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/testcases/ooxml/XSSF/SXSSFITestDataProvider.cs b/testcases/ooxml/XSSF/SXSSFITestDataProvider.cs index 9f19622fc..b4035a8d7 100644 --- a/testcases/ooxml/XSSF/SXSSFITestDataProvider.cs +++ b/testcases/ooxml/XSSF/SXSSFITestDataProvider.cs @@ -65,7 +65,8 @@ public IWorkbook WriteOutAndReadBack(IWorkbook wb) throw new ArgumentException("Expected an instance of XSSFWorkbook or SXSSFWorkbook"); } - XSSFWorkbook result; try + XSSFWorkbook result; + try { MemoryStream baos = new MemoryStream(8192); wb.Write(baos, false); @@ -135,4 +136,4 @@ public bool Cleanup() } } -} \ No newline at end of file +} From 2ae5e63a46afe97d911956309e7f29005352061d Mon Sep 17 00:00:00 2001 From: Antony Liu Date: Sat, 9 Nov 2024 22:46:53 +0800 Subject: [PATCH 6/7] Ignore test case TestSetColumnGroupCollapsed. XSSFSheet.GroupColumn should be re-ported. --- testcases/ooxml/XSSF/UserModel/TestXSSFSheet.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/testcases/ooxml/XSSF/UserModel/TestXSSFSheet.cs b/testcases/ooxml/XSSF/UserModel/TestXSSFSheet.cs index 473945ba6..82dd2a6dd 100644 --- a/testcases/ooxml/XSSF/UserModel/TestXSSFSheet.cs +++ b/testcases/ooxml/XSSF/UserModel/TestXSSFSheet.cs @@ -812,6 +812,7 @@ public void TestSetZoom() * better should really review this! */ [Test] + [Ignore("re-port method XSSFSheet.GroupColumn()")] public void TestSetColumnGroupCollapsed() { XSSFWorkbook wb1 = new XSSFWorkbook(); From 4612bfb5c72b141f5956ff6e0808bd91a6d73cc7 Mon Sep 17 00:00:00 2001 From: Antony Liu Date: Sun, 10 Nov 2024 17:08:09 +0800 Subject: [PATCH 7/7] Revert TestSetColumnGroupCollapsed, the test case passed --- .../ooxml/XSSF/UserModel/TestXSSFSheet.cs | 662 ++++++++++++++++-- 1 file changed, 593 insertions(+), 69 deletions(-) diff --git a/testcases/ooxml/XSSF/UserModel/TestXSSFSheet.cs b/testcases/ooxml/XSSF/UserModel/TestXSSFSheet.cs index 82dd2a6dd..9082d2e95 100644 --- a/testcases/ooxml/XSSF/UserModel/TestXSSFSheet.cs +++ b/testcases/ooxml/XSSF/UserModel/TestXSSFSheet.cs @@ -812,7 +812,6 @@ public void TestSetZoom() * better should really review this! */ [Test] - [Ignore("re-port method XSSFSheet.GroupColumn()")] public void TestSetColumnGroupCollapsed() { XSSFWorkbook wb1 = new XSSFWorkbook(); @@ -822,111 +821,636 @@ public void TestSetColumnGroupCollapsed() Assert.AreEqual(0, cols.sizeOfColArray()); sheet1.GroupColumn(4, 7); - Assert.AreEqual(1, cols.sizeOfColArray()); - checkColumnGroup(cols.GetColArray(0), 4, 7); // false, true - sheet1.GroupColumn(9, 12); - Assert.AreEqual(2, cols.sizeOfColArray()); - checkColumnGroup(cols.GetColArray(0), 4, 7); // false, true - checkColumnGroup(cols.GetColArray(1), 9, 12); // false, true + Assert.AreEqual(8, cols.sizeOfColArray()); + + Assert.AreEqual(false, cols.GetColArray(0).IsSetHidden()); + Assert.AreEqual(false, cols.GetColArray(0).IsSetCollapsed()); + Assert.AreEqual(false, cols.GetColArray(0).collapsed); + Assert.AreEqual(1, cols.GetColArray(0).outlineLevel); + Assert.AreEqual(4 + 1, cols.GetColArray(0).min); // 1 based + Assert.AreEqual(4 + 1, cols.GetColArray(0).max); // 1 based + + Assert.AreEqual(false, cols.GetColArray(1).IsSetHidden()); + Assert.AreEqual(false, cols.GetColArray(1).IsSetCollapsed()); + Assert.AreEqual(false, cols.GetColArray(1).collapsed); + Assert.AreEqual(1, cols.GetColArray(1).outlineLevel); + Assert.AreEqual(5 + 1, cols.GetColArray(1).min); // 1 based + Assert.AreEqual(5 + 1, cols.GetColArray(1).max); // 1 based + + Assert.AreEqual(false, cols.GetColArray(2).IsSetHidden()); + Assert.AreEqual(false, cols.GetColArray(2).IsSetCollapsed()); + Assert.AreEqual(false, cols.GetColArray(2).collapsed); + Assert.AreEqual(1, cols.GetColArray(2).outlineLevel); + Assert.AreEqual(6 + 1, cols.GetColArray(2).min); // 1 based + Assert.AreEqual(6 + 1, cols.GetColArray(2).max); // 1 based + + Assert.AreEqual(false, cols.GetColArray(3).IsSetHidden()); + Assert.AreEqual(false, cols.GetColArray(3).IsSetCollapsed()); + Assert.AreEqual(false, cols.GetColArray(3).collapsed); + Assert.AreEqual(1, cols.GetColArray(3).outlineLevel); + Assert.AreEqual(7 + 1, cols.GetColArray(3).min); // 1 based + Assert.AreEqual(7 + 1, cols.GetColArray(3).max); // 1 based + + Assert.AreEqual(false, cols.GetColArray(4).IsSetHidden()); + Assert.AreEqual(false, cols.GetColArray(4).IsSetCollapsed()); + Assert.AreEqual(false, cols.GetColArray(4).collapsed); + Assert.AreEqual(1, cols.GetColArray(4).outlineLevel); + Assert.AreEqual(9 + 1, cols.GetColArray(4).min); // 1 based + Assert.AreEqual(9 + 1, cols.GetColArray(4).max); // 1 based + + Assert.AreEqual(false, cols.GetColArray(5).IsSetHidden()); + Assert.AreEqual(false, cols.GetColArray(5).IsSetCollapsed()); + Assert.AreEqual(false, cols.GetColArray(5).collapsed); + Assert.AreEqual(1, cols.GetColArray(5).outlineLevel); + Assert.AreEqual(10 + 1, cols.GetColArray(5).min); // 1 based + Assert.AreEqual(10 + 1, cols.GetColArray(5).max); // 1 based + + Assert.AreEqual(false, cols.GetColArray(6).IsSetHidden()); + Assert.AreEqual(false, cols.GetColArray(6).IsSetCollapsed()); + Assert.AreEqual(false, cols.GetColArray(6).collapsed); + Assert.AreEqual(1, cols.GetColArray(6).outlineLevel); + Assert.AreEqual(11 + 1, cols.GetColArray(6).min); // 1 based + Assert.AreEqual(11 + 1, cols.GetColArray(6).max); // 1 based + + Assert.AreEqual(false, cols.GetColArray(7).IsSetHidden()); + Assert.AreEqual(false, cols.GetColArray(7).IsSetCollapsed()); + Assert.AreEqual(false, cols.GetColArray(7).collapsed); + Assert.AreEqual(1, cols.GetColArray(7).outlineLevel); + Assert.AreEqual(12 + 1, cols.GetColArray(7).min); // 1 based + Assert.AreEqual(12 + 1, cols.GetColArray(7).max); // 1 based sheet1.GroupColumn(10, 11); - Assert.AreEqual(4, cols.sizeOfColArray()); - Assert.AreEqual(4, cols.sizeOfColArray()); - checkColumnGroup(cols.GetColArray(0), 4, 7); // false, true - checkColumnGroup(cols.GetColArray(1), 9, 9); // false, true - checkColumnGroup(cols.GetColArray(2), 10, 11); // false, true - checkColumnGroup(cols.GetColArray(3), 12, 12); // false, true + Assert.AreEqual(8, cols.sizeOfColArray()); + Assert.AreEqual(false, cols.GetColArray(0).IsSetHidden()); + Assert.AreEqual(false, cols.GetColArray(0).IsSetCollapsed()); + Assert.AreEqual(false, cols.GetColArray(0).collapsed); + Assert.AreEqual(1, cols.GetColArray(0).outlineLevel); + Assert.AreEqual(4 + 1, cols.GetColArray(0).min); // 1 based + Assert.AreEqual(4 + 1, cols.GetColArray(0).max); // 1 based + + Assert.AreEqual(false, cols.GetColArray(1).IsSetHidden()); + Assert.AreEqual(false, cols.GetColArray(1).IsSetCollapsed()); + Assert.AreEqual(false, cols.GetColArray(1).collapsed); + Assert.AreEqual(1, cols.GetColArray(1).outlineLevel); + Assert.AreEqual(5 + 1, cols.GetColArray(1).min); // 1 based + Assert.AreEqual(5 + 1, cols.GetColArray(1).max); // 1 based + + Assert.AreEqual(false, cols.GetColArray(2).IsSetHidden()); + Assert.AreEqual(false, cols.GetColArray(2).IsSetCollapsed()); + Assert.AreEqual(false, cols.GetColArray(2).collapsed); + Assert.AreEqual(1, cols.GetColArray(2).outlineLevel); + Assert.AreEqual(6 + 1, cols.GetColArray(2).min); // 1 based + Assert.AreEqual(6 + 1, cols.GetColArray(2).max); // 1 based + + Assert.AreEqual(false, cols.GetColArray(3).IsSetHidden()); + Assert.AreEqual(false, cols.GetColArray(3).IsSetCollapsed()); + Assert.AreEqual(false, cols.GetColArray(3).collapsed); + Assert.AreEqual(1, cols.GetColArray(3).outlineLevel); + Assert.AreEqual(7 + 1, cols.GetColArray(3).min); // 1 based + Assert.AreEqual(7 + 1, cols.GetColArray(3).max); // 1 based + + Assert.AreEqual(false, cols.GetColArray(4).IsSetHidden()); + Assert.AreEqual(false, cols.GetColArray(4).IsSetCollapsed()); + Assert.AreEqual(false, cols.GetColArray(4).collapsed); + Assert.AreEqual(1, cols.GetColArray(4).outlineLevel); + Assert.AreEqual(9 + 1, cols.GetColArray(4).min); // 1 based + Assert.AreEqual(9 + 1, cols.GetColArray(4).max); // 1 based + + Assert.AreEqual(false, cols.GetColArray(5).IsSetHidden()); + Assert.AreEqual(false, cols.GetColArray(5).IsSetCollapsed()); + Assert.AreEqual(false, cols.GetColArray(5).collapsed); + Assert.AreEqual(2, cols.GetColArray(5).outlineLevel); + Assert.AreEqual(10 + 1, cols.GetColArray(5).min); // 1 based + Assert.AreEqual(10 + 1, cols.GetColArray(5).max); // 1 based + + Assert.AreEqual(false, cols.GetColArray(6).IsSetHidden()); + Assert.AreEqual(false, cols.GetColArray(6).IsSetCollapsed()); + Assert.AreEqual(false, cols.GetColArray(6).collapsed); + Assert.AreEqual(2, cols.GetColArray(6).outlineLevel); + Assert.AreEqual(11 + 1, cols.GetColArray(6).min); // 1 based + Assert.AreEqual(11 + 1, cols.GetColArray(6).max); // 1 based + + Assert.AreEqual(false, cols.GetColArray(7).IsSetHidden()); + Assert.AreEqual(false, cols.GetColArray(7).IsSetCollapsed()); + Assert.AreEqual(false, cols.GetColArray(7).collapsed); + Assert.AreEqual(1, cols.GetColArray(7).outlineLevel); + Assert.AreEqual(12 + 1, cols.GetColArray(7).min); // 1 based + Assert.AreEqual(12 + 1, cols.GetColArray(7).max); // 1 based // collapse columns - 1 sheet1.SetColumnGroupCollapsed(5, true); - // FIXME: we grew a column? - Assert.AreEqual(5, cols.sizeOfColArray()); - checkColumnGroupIsCollapsed(cols.GetColArray(0), 4, 7); // true, true - checkColumnGroup(cols.GetColArray(1), 8, 8); // false, true - checkColumnGroup(cols.GetColArray(2), 9, 9); // false, true - checkColumnGroup(cols.GetColArray(3), 10, 11); // false, true - checkColumnGroup(cols.GetColArray(4), 12, 12); // false, true + Assert.AreEqual(9, cols.sizeOfColArray()); + Assert.AreEqual(true, cols.GetColArray(0).IsSetHidden()); + Assert.AreEqual(false, cols.GetColArray(0).IsSetCollapsed()); + Assert.AreEqual(false, cols.GetColArray(0).collapsed); + Assert.AreEqual(1, cols.GetColArray(0).outlineLevel); + Assert.AreEqual(4 + 1, cols.GetColArray(0).min); // 1 based + Assert.AreEqual(4 + 1, cols.GetColArray(0).max); // 1 based + + Assert.AreEqual(true, cols.GetColArray(1).IsSetHidden()); + Assert.AreEqual(false, cols.GetColArray(1).IsSetCollapsed()); + Assert.AreEqual(false, cols.GetColArray(1).collapsed); + Assert.AreEqual(1, cols.GetColArray(1).outlineLevel); + Assert.AreEqual(5 + 1, cols.GetColArray(1).min); // 1 based + Assert.AreEqual(5 + 1, cols.GetColArray(1).max); // 1 based + + Assert.AreEqual(true, cols.GetColArray(2).IsSetHidden()); + Assert.AreEqual(false, cols.GetColArray(2).IsSetCollapsed()); + Assert.AreEqual(false, cols.GetColArray(2).collapsed); + Assert.AreEqual(1, cols.GetColArray(2).outlineLevel); + Assert.AreEqual(6 + 1, cols.GetColArray(2).min); // 1 based + Assert.AreEqual(6 + 1, cols.GetColArray(2).max); // 1 based + + Assert.AreEqual(true, cols.GetColArray(3).IsSetHidden()); + Assert.AreEqual(false, cols.GetColArray(3).IsSetCollapsed()); + Assert.AreEqual(false, cols.GetColArray(3).collapsed); + Assert.AreEqual(1, cols.GetColArray(3).outlineLevel); + Assert.AreEqual(7 + 1, cols.GetColArray(3).min); // 1 based + Assert.AreEqual(7 + 1, cols.GetColArray(3).max); // 1 based + + Assert.AreEqual(false, cols.GetColArray(4).IsSetHidden()); + Assert.AreEqual(true, cols.GetColArray(4).IsSetCollapsed()); + Assert.AreEqual(true, cols.GetColArray(4).collapsed); + Assert.AreEqual(0, cols.GetColArray(4).outlineLevel); + Assert.AreEqual(8 + 1, cols.GetColArray(4).min); // 1 based + Assert.AreEqual(8 + 1, cols.GetColArray(4).max); // 1 based + + Assert.AreEqual(false, cols.GetColArray(5).IsSetHidden()); + Assert.AreEqual(false, cols.GetColArray(5).IsSetCollapsed()); + Assert.AreEqual(false, cols.GetColArray(5).collapsed); + Assert.AreEqual(1, cols.GetColArray(5).outlineLevel); + Assert.AreEqual(9 + 1, cols.GetColArray(5).min); // 1 based + Assert.AreEqual(9 + 1, cols.GetColArray(5).max); // 1 based + + Assert.AreEqual(false, cols.GetColArray(6).IsSetHidden()); + Assert.AreEqual(false, cols.GetColArray(6).IsSetCollapsed()); + Assert.AreEqual(false, cols.GetColArray(6).collapsed); + Assert.AreEqual(2, cols.GetColArray(6).outlineLevel); + Assert.AreEqual(10 + 1, cols.GetColArray(6).min); // 1 based + Assert.AreEqual(10 + 1, cols.GetColArray(6).max); // 1 based + + Assert.AreEqual(false, cols.GetColArray(7).IsSetHidden()); + Assert.AreEqual(false, cols.GetColArray(7).IsSetCollapsed()); + Assert.AreEqual(false, cols.GetColArray(7).collapsed); + Assert.AreEqual(2, cols.GetColArray(7).outlineLevel); + Assert.AreEqual(11 + 1, cols.GetColArray(7).min); // 1 based + Assert.AreEqual(11 + 1, cols.GetColArray(7).max); // 1 based + + Assert.AreEqual(false, cols.GetColArray(8).IsSetHidden()); + Assert.AreEqual(false, cols.GetColArray(8).IsSetCollapsed()); + Assert.AreEqual(false, cols.GetColArray(8).collapsed); + Assert.AreEqual(1, cols.GetColArray(8).outlineLevel); + Assert.AreEqual(12 + 1, cols.GetColArray(8).min); // 1 based + Assert.AreEqual(12 + 1, cols.GetColArray(8).max); // 1 based // expand columns - 1 sheet1.SetColumnGroupCollapsed(5, false); - Assert.AreEqual(5, cols.sizeOfColArray()); - - checkColumnGroupIsExpanded(cols.GetColArray(0), 4, 7); // false, true - checkColumnGroup(cols.GetColArray(1), 8, 8, false, false); - checkColumnGroup(cols.GetColArray(2), 9, 9); // false, true - checkColumnGroup(cols.GetColArray(3), 10, 11); // false, true - checkColumnGroup(cols.GetColArray(4), 12, 12); // false, true + Assert.AreEqual(false, cols.GetColArray(0).IsSetHidden()); + Assert.AreEqual(false, cols.GetColArray(0).IsSetCollapsed()); + Assert.AreEqual(false, cols.GetColArray(0).collapsed); + Assert.AreEqual(1, cols.GetColArray(0).outlineLevel); + Assert.AreEqual(4 + 1, cols.GetColArray(0).min); // 1 based + Assert.AreEqual(4 + 1, cols.GetColArray(0).max); // 1 based + + Assert.AreEqual(false, cols.GetColArray(1).IsSetHidden()); + Assert.AreEqual(false, cols.GetColArray(1).IsSetCollapsed()); + Assert.AreEqual(false, cols.GetColArray(1).collapsed); + Assert.AreEqual(1, cols.GetColArray(1).outlineLevel); + Assert.AreEqual(5 + 1, cols.GetColArray(1).min); // 1 based + Assert.AreEqual(5 + 1, cols.GetColArray(1).max); // 1 based + + Assert.AreEqual(false, cols.GetColArray(2).IsSetHidden()); + Assert.AreEqual(false, cols.GetColArray(2).IsSetCollapsed()); + Assert.AreEqual(false, cols.GetColArray(2).collapsed); + Assert.AreEqual(1, cols.GetColArray(2).outlineLevel); + Assert.AreEqual(6 + 1, cols.GetColArray(2).min); // 1 based + Assert.AreEqual(6 + 1, cols.GetColArray(2).max); // 1 based + + Assert.AreEqual(false, cols.GetColArray(3).IsSetHidden()); + Assert.AreEqual(false, cols.GetColArray(3).IsSetCollapsed()); + Assert.AreEqual(false, cols.GetColArray(3).collapsed); + Assert.AreEqual(1, cols.GetColArray(3).outlineLevel); + Assert.AreEqual(7 + 1, cols.GetColArray(3).min); // 1 based + Assert.AreEqual(7 + 1, cols.GetColArray(3).max); // 1 based + + Assert.AreEqual(false, cols.GetColArray(4).IsSetHidden()); + Assert.AreEqual(true, cols.GetColArray(4).IsSetCollapsed()); + Assert.AreEqual(false, cols.GetColArray(4).collapsed); + Assert.AreEqual(0, cols.GetColArray(4).outlineLevel); + Assert.AreEqual(8 + 1, cols.GetColArray(4).min); // 1 based + Assert.AreEqual(8 + 1, cols.GetColArray(4).max); // 1 based + + Assert.AreEqual(false, cols.GetColArray(5).IsSetHidden()); + Assert.AreEqual(false, cols.GetColArray(5).IsSetCollapsed()); + Assert.AreEqual(false, cols.GetColArray(5).collapsed); + Assert.AreEqual(1, cols.GetColArray(5).outlineLevel); + Assert.AreEqual(9 + 1, cols.GetColArray(5).min); // 1 based + Assert.AreEqual(9 + 1, cols.GetColArray(5).max); // 1 based + + Assert.AreEqual(false, cols.GetColArray(6).IsSetHidden()); + Assert.AreEqual(false, cols.GetColArray(6).IsSetCollapsed()); + Assert.AreEqual(false, cols.GetColArray(6).collapsed); + Assert.AreEqual(2, cols.GetColArray(6).outlineLevel); + Assert.AreEqual(10 + 1, cols.GetColArray(6).min); // 1 based + Assert.AreEqual(10 + 1, cols.GetColArray(6).max); // 1 based + + Assert.AreEqual(false, cols.GetColArray(7).IsSetHidden()); + Assert.AreEqual(false, cols.GetColArray(7).IsSetCollapsed()); + Assert.AreEqual(false, cols.GetColArray(7).collapsed); + Assert.AreEqual(2, cols.GetColArray(7).outlineLevel); + Assert.AreEqual(11 + 1, cols.GetColArray(7).min); // 1 based + Assert.AreEqual(11 + 1, cols.GetColArray(7).max); // 1 based + + Assert.AreEqual(false, cols.GetColArray(8).IsSetHidden()); + Assert.AreEqual(false, cols.GetColArray(8).IsSetCollapsed()); + Assert.AreEqual(false, cols.GetColArray(8).collapsed); + Assert.AreEqual(1, cols.GetColArray(8).outlineLevel); + Assert.AreEqual(12 + 1, cols.GetColArray(8).min); // 1 based + Assert.AreEqual(12 + 1, cols.GetColArray(8).max); // 1 based //collapse - 2 sheet1.SetColumnGroupCollapsed(9, true); - // it grew again? - Assert.AreEqual(6, cols.sizeOfColArray()); - checkColumnGroup(cols.GetColArray(0), 4, 7); // false, true - checkColumnGroup(cols.GetColArray(1), 8, 8, false, false); - checkColumnGroupIsCollapsed(cols.GetColArray(2), 9, 9); // true, true - checkColumnGroupIsCollapsed(cols.GetColArray(3), 10, 11); // true, true - checkColumnGroupIsCollapsed(cols.GetColArray(4), 12, 12); // true, true - // why was this column group added? - checkColumnGroup(cols.GetColArray(5), 13, 13); // false, true + Assert.AreEqual(10, cols.sizeOfColArray()); + + Assert.AreEqual(false, cols.GetColArray(0).IsSetHidden()); + Assert.AreEqual(false, cols.GetColArray(0).IsSetCollapsed()); + Assert.AreEqual(false, cols.GetColArray(0).collapsed); + Assert.AreEqual(1, cols.GetColArray(0).outlineLevel); + Assert.AreEqual(4 + 1, cols.GetColArray(0).min); // 1 based + Assert.AreEqual(4 + 1, cols.GetColArray(0).max); // 1 based + + Assert.AreEqual(false, cols.GetColArray(1).IsSetHidden()); + Assert.AreEqual(false, cols.GetColArray(1).IsSetCollapsed()); + Assert.AreEqual(false, cols.GetColArray(1).collapsed); + Assert.AreEqual(1, cols.GetColArray(1).outlineLevel); + Assert.AreEqual(5 + 1, cols.GetColArray(1).min); // 1 based + Assert.AreEqual(5 + 1, cols.GetColArray(1).max); // 1 based + + Assert.AreEqual(false, cols.GetColArray(2).IsSetHidden()); + Assert.AreEqual(false, cols.GetColArray(2).IsSetCollapsed()); + Assert.AreEqual(false, cols.GetColArray(2).collapsed); + Assert.AreEqual(1, cols.GetColArray(2).outlineLevel); + Assert.AreEqual(6 + 1, cols.GetColArray(2).min); // 1 based + Assert.AreEqual(6 + 1, cols.GetColArray(2).max); // 1 based + + Assert.AreEqual(false, cols.GetColArray(3).IsSetHidden()); + Assert.AreEqual(false, cols.GetColArray(3).IsSetCollapsed()); + Assert.AreEqual(false, cols.GetColArray(3).collapsed); + Assert.AreEqual(1, cols.GetColArray(3).outlineLevel); + Assert.AreEqual(7 + 1, cols.GetColArray(3).min); // 1 based + Assert.AreEqual(7 + 1, cols.GetColArray(3).max); // 1 based + + Assert.AreEqual(false, cols.GetColArray(4).IsSetHidden()); + Assert.AreEqual(true, cols.GetColArray(4).IsSetCollapsed()); + Assert.AreEqual(false, cols.GetColArray(4).collapsed); + Assert.AreEqual(0, cols.GetColArray(4).outlineLevel); + Assert.AreEqual(8 + 1, cols.GetColArray(4).min); // 1 based + Assert.AreEqual(8 + 1, cols.GetColArray(4).max); // 1 based + + Assert.AreEqual(true, cols.GetColArray(5).IsSetHidden()); + Assert.AreEqual(false, cols.GetColArray(5).IsSetCollapsed()); + Assert.AreEqual(false, cols.GetColArray(5).collapsed); + Assert.AreEqual(1, cols.GetColArray(5).outlineLevel); + Assert.AreEqual(9 + 1, cols.GetColArray(5).min); // 1 based + Assert.AreEqual(9 + 1, cols.GetColArray(5).max); // 1 based + + Assert.AreEqual(true, cols.GetColArray(6).IsSetHidden()); + Assert.AreEqual(false, cols.GetColArray(6).IsSetCollapsed()); + Assert.AreEqual(false, cols.GetColArray(6).collapsed); + Assert.AreEqual(2, cols.GetColArray(6).outlineLevel); + Assert.AreEqual(10 + 1, cols.GetColArray(6).min); // 1 based + Assert.AreEqual(10 + 1, cols.GetColArray(6).max); // 1 based + + Assert.AreEqual(true, cols.GetColArray(7).IsSetHidden()); + Assert.AreEqual(false, cols.GetColArray(7).IsSetCollapsed()); + Assert.AreEqual(false, cols.GetColArray(7).collapsed); + Assert.AreEqual(2, cols.GetColArray(7).outlineLevel); + Assert.AreEqual(11 + 1, cols.GetColArray(7).min); // 1 based + Assert.AreEqual(11 + 1, cols.GetColArray(7).max); // 1 based + + Assert.AreEqual(true, cols.GetColArray(8).IsSetHidden()); + Assert.AreEqual(false, cols.GetColArray(8).IsSetCollapsed()); + Assert.AreEqual(false, cols.GetColArray(8).collapsed); + Assert.AreEqual(1, cols.GetColArray(8).outlineLevel); + Assert.AreEqual(12 + 1, cols.GetColArray(8).min); // 1 based + Assert.AreEqual(12 + 1, cols.GetColArray(8).max); // 1 based + + Assert.AreEqual(false, cols.GetColArray(9).IsSetHidden()); + Assert.AreEqual(true, cols.GetColArray(9).IsSetCollapsed()); + Assert.AreEqual(true, cols.GetColArray(9).collapsed); + Assert.AreEqual(0, cols.GetColArray(9).outlineLevel); + Assert.AreEqual(13 + 1, cols.GetColArray(9).min); // 1 based + Assert.AreEqual(13 + 1, cols.GetColArray(9).max); // 1 based //expand - 2 sheet1.SetColumnGroupCollapsed(9, false); - Assert.AreEqual(6, cols.sizeOfColArray()); - //outline level 2: the line under ==> collapsed==True - Assert.AreEqual(2, cols.GetColArray(3).outlineLevel); - Assert.IsTrue(cols.GetColArray(4).IsSetCollapsed()); + Assert.AreEqual(10, cols.sizeOfColArray()); - checkColumnGroup(cols.GetColArray(0), 4, 7); - checkColumnGroup(cols.GetColArray(1), 8, 8, false, false); - checkColumnGroup(cols.GetColArray(2), 9, 9); // false, true - checkColumnGroupIsCollapsed(cols.GetColArray(3), 10, 11); // true, true - checkColumnGroup(cols.GetColArray(4), 12, 12); // false, true - checkColumnGroup(cols.GetColArray(5), 13, 13, false, false); + Assert.AreEqual(false, cols.GetColArray(0).IsSetHidden()); + Assert.AreEqual(false, cols.GetColArray(0).IsSetCollapsed()); + Assert.AreEqual(false, cols.GetColArray(0).collapsed); + Assert.AreEqual(1, cols.GetColArray(0).outlineLevel); + Assert.AreEqual(4 + 1, cols.GetColArray(0).min); // 1 based + Assert.AreEqual(4 + 1, cols.GetColArray(0).max); // 1 based + + Assert.AreEqual(false, cols.GetColArray(1).IsSetHidden()); + Assert.AreEqual(false, cols.GetColArray(1).IsSetCollapsed()); + Assert.AreEqual(false, cols.GetColArray(1).collapsed); + Assert.AreEqual(1, cols.GetColArray(1).outlineLevel); + Assert.AreEqual(5 + 1, cols.GetColArray(1).min); // 1 based + Assert.AreEqual(5 + 1, cols.GetColArray(1).max); // 1 based + + Assert.AreEqual(false, cols.GetColArray(2).IsSetHidden()); + Assert.AreEqual(false, cols.GetColArray(2).IsSetCollapsed()); + Assert.AreEqual(false, cols.GetColArray(2).collapsed); + Assert.AreEqual(1, cols.GetColArray(2).outlineLevel); + Assert.AreEqual(6 + 1, cols.GetColArray(2).min); // 1 based + Assert.AreEqual(6 + 1, cols.GetColArray(2).max); // 1 based + + Assert.AreEqual(false, cols.GetColArray(3).IsSetHidden()); + Assert.AreEqual(false, cols.GetColArray(3).IsSetCollapsed()); + Assert.AreEqual(false, cols.GetColArray(3).collapsed); + Assert.AreEqual(1, cols.GetColArray(3).outlineLevel); + Assert.AreEqual(7 + 1, cols.GetColArray(3).min); // 1 based + Assert.AreEqual(7 + 1, cols.GetColArray(3).max); // 1 based + + Assert.AreEqual(false, cols.GetColArray(4).IsSetHidden()); + Assert.AreEqual(true, cols.GetColArray(4).IsSetCollapsed()); + Assert.AreEqual(false, cols.GetColArray(4).collapsed); + Assert.AreEqual(0, cols.GetColArray(4).outlineLevel); + Assert.AreEqual(8 + 1, cols.GetColArray(4).min); // 1 based + Assert.AreEqual(8 + 1, cols.GetColArray(4).max); // 1 based + + Assert.AreEqual(false, cols.GetColArray(5).IsSetHidden()); + Assert.AreEqual(false, cols.GetColArray(5).IsSetCollapsed()); + Assert.AreEqual(false, cols.GetColArray(5).collapsed); + Assert.AreEqual(1, cols.GetColArray(5).outlineLevel); + Assert.AreEqual(9 + 1, cols.GetColArray(5).min); // 1 based + Assert.AreEqual(9 + 1, cols.GetColArray(5).max); // 1 based + + Assert.AreEqual(false, cols.GetColArray(6).IsSetHidden()); + Assert.AreEqual(false, cols.GetColArray(6).IsSetCollapsed()); + Assert.AreEqual(false, cols.GetColArray(6).collapsed); + Assert.AreEqual(2, cols.GetColArray(6).outlineLevel); + Assert.AreEqual(10 + 1, cols.GetColArray(6).min); // 1 based + Assert.AreEqual(10 + 1, cols.GetColArray(6).max); // 1 based + + Assert.AreEqual(false, cols.GetColArray(7).IsSetHidden()); + Assert.AreEqual(false, cols.GetColArray(7).IsSetCollapsed()); + Assert.AreEqual(false, cols.GetColArray(7).collapsed); + Assert.AreEqual(2, cols.GetColArray(7).outlineLevel); + Assert.AreEqual(11 + 1, cols.GetColArray(7).min); // 1 based + Assert.AreEqual(11 + 1, cols.GetColArray(7).max); // 1 based + + Assert.AreEqual(false, cols.GetColArray(8).IsSetHidden()); + Assert.AreEqual(false, cols.GetColArray(8).IsSetCollapsed()); + Assert.AreEqual(false, cols.GetColArray(8).collapsed); + Assert.AreEqual(1, cols.GetColArray(8).outlineLevel); + Assert.AreEqual(12 + 1, cols.GetColArray(8).min); // 1 based + Assert.AreEqual(12 + 1, cols.GetColArray(8).max); // 1 based + + Assert.AreEqual(false, cols.GetColArray(9).IsSetHidden()); + Assert.AreEqual(true, cols.GetColArray(9).IsSetCollapsed()); + Assert.AreEqual(false, cols.GetColArray(9).collapsed); + Assert.AreEqual(0, cols.GetColArray(9).outlineLevel); + Assert.AreEqual(13 + 1, cols.GetColArray(9).min); // 1 based + Assert.AreEqual(13 + 1, cols.GetColArray(9).max); // 1 based //DOCUMENTARE MEGLIO IL DISCORSO DEL LIVELLO //collapse - 3 sheet1.SetColumnGroupCollapsed(10, true); - Assert.AreEqual(6, cols.sizeOfColArray()); - checkColumnGroup(cols.GetColArray(0), 4, 7); - checkColumnGroup(cols.GetColArray(1), 8, 8, false, false); - checkColumnGroup(cols.GetColArray(2), 9, 9); // false, true - checkColumnGroupIsCollapsed(cols.GetColArray(3), 10, 11); // true, true - checkColumnGroup(cols.GetColArray(4), 12, 12); // false, true - checkColumnGroup(cols.GetColArray(5), 13, 13, false, false); + Assert.AreEqual(10, cols.sizeOfColArray()); + Assert.AreEqual(false, cols.GetColArray(0).IsSetHidden()); + Assert.AreEqual(false, cols.GetColArray(0).IsSetCollapsed()); + Assert.AreEqual(false, cols.GetColArray(0).collapsed); + Assert.AreEqual(1, cols.GetColArray(0).outlineLevel); + Assert.AreEqual(4 + 1, cols.GetColArray(0).min); // 1 based + Assert.AreEqual(4 + 1, cols.GetColArray(0).max); // 1 based + + Assert.AreEqual(false, cols.GetColArray(1).IsSetHidden()); + Assert.AreEqual(false, cols.GetColArray(1).IsSetCollapsed()); + Assert.AreEqual(false, cols.GetColArray(1).collapsed); + Assert.AreEqual(1, cols.GetColArray(1).outlineLevel); + Assert.AreEqual(5 + 1, cols.GetColArray(1).min); // 1 based + Assert.AreEqual(5 + 1, cols.GetColArray(1).max); // 1 based + + Assert.AreEqual(false, cols.GetColArray(2).IsSetHidden()); + Assert.AreEqual(false, cols.GetColArray(2).IsSetCollapsed()); + Assert.AreEqual(false, cols.GetColArray(2).collapsed); + Assert.AreEqual(1, cols.GetColArray(2).outlineLevel); + Assert.AreEqual(6 + 1, cols.GetColArray(2).min); // 1 based + Assert.AreEqual(6 + 1, cols.GetColArray(2).max); // 1 based + + Assert.AreEqual(false, cols.GetColArray(3).IsSetHidden()); + Assert.AreEqual(false, cols.GetColArray(3).IsSetCollapsed()); + Assert.AreEqual(false, cols.GetColArray(3).collapsed); + Assert.AreEqual(1, cols.GetColArray(3).outlineLevel); + Assert.AreEqual(7 + 1, cols.GetColArray(3).min); // 1 based + Assert.AreEqual(7 + 1, cols.GetColArray(3).max); // 1 based + + Assert.AreEqual(false, cols.GetColArray(4).IsSetHidden()); + Assert.AreEqual(true, cols.GetColArray(4).IsSetCollapsed()); + Assert.AreEqual(false, cols.GetColArray(4).collapsed); + Assert.AreEqual(0, cols.GetColArray(4).outlineLevel); + Assert.AreEqual(8 + 1, cols.GetColArray(4).min); // 1 based + Assert.AreEqual(8 + 1, cols.GetColArray(4).max); // 1 based + + Assert.AreEqual(false, cols.GetColArray(5).IsSetHidden()); + Assert.AreEqual(false, cols.GetColArray(5).IsSetCollapsed()); + Assert.AreEqual(false, cols.GetColArray(5).collapsed); + Assert.AreEqual(1, cols.GetColArray(5).outlineLevel); + Assert.AreEqual(9 + 1, cols.GetColArray(5).min); // 1 based + Assert.AreEqual(9 + 1, cols.GetColArray(5).max); // 1 based + + Assert.AreEqual(true, cols.GetColArray(6).IsSetHidden()); + Assert.AreEqual(false, cols.GetColArray(6).IsSetCollapsed()); + Assert.AreEqual(false, cols.GetColArray(6).collapsed); + Assert.AreEqual(2, cols.GetColArray(6).outlineLevel); + Assert.AreEqual(10 + 1, cols.GetColArray(6).min); // 1 based + Assert.AreEqual(10 + 1, cols.GetColArray(6).max); // 1 based + + Assert.AreEqual(true, cols.GetColArray(7).IsSetHidden()); + Assert.AreEqual(false, cols.GetColArray(7).IsSetCollapsed()); + Assert.AreEqual(false, cols.GetColArray(7).collapsed); + Assert.AreEqual(2, cols.GetColArray(7).outlineLevel); + Assert.AreEqual(11 + 1, cols.GetColArray(7).min); // 1 based + Assert.AreEqual(11 + 1, cols.GetColArray(7).max); // 1 based + + Assert.AreEqual(false, cols.GetColArray(8).IsSetHidden()); + Assert.AreEqual(true, cols.GetColArray(8).IsSetCollapsed()); + Assert.AreEqual(true, cols.GetColArray(8).collapsed); + Assert.AreEqual(1, cols.GetColArray(8).outlineLevel); + Assert.AreEqual(12 + 1, cols.GetColArray(8).min); // 1 based + Assert.AreEqual(12 + 1, cols.GetColArray(8).max); // 1 based + + Assert.AreEqual(false, cols.GetColArray(9).IsSetHidden()); + Assert.AreEqual(true, cols.GetColArray(9).IsSetCollapsed()); + Assert.AreEqual(false, cols.GetColArray(9).collapsed); + Assert.AreEqual(0, cols.GetColArray(9).outlineLevel); + Assert.AreEqual(13 + 1, cols.GetColArray(9).min); // 1 based + Assert.AreEqual(13 + 1, cols.GetColArray(9).max); // 1 based //expand - 3 sheet1.SetColumnGroupCollapsed(10, false); - Assert.AreEqual(6, cols.sizeOfColArray()); - Assert.IsFalse(cols.GetColArray(0).hidden); - Assert.IsFalse(cols.GetColArray(5).hidden); - Assert.IsFalse(cols.GetColArray(4).IsSetCollapsed()); - // write out and give back + Assert.AreEqual(false, cols.GetColArray(0).IsSetHidden()); + Assert.AreEqual(false, cols.GetColArray(0).IsSetCollapsed()); + Assert.AreEqual(false, cols.GetColArray(0).collapsed); + Assert.AreEqual(1, cols.GetColArray(0).outlineLevel); + Assert.AreEqual(4 + 1, cols.GetColArray(0).min); // 1 based + Assert.AreEqual(4 + 1, cols.GetColArray(0).max); // 1 based + + Assert.AreEqual(false, cols.GetColArray(1).IsSetHidden()); + Assert.AreEqual(false, cols.GetColArray(1).IsSetCollapsed()); + Assert.AreEqual(false, cols.GetColArray(1).collapsed); + Assert.AreEqual(1, cols.GetColArray(1).outlineLevel); + Assert.AreEqual(5 + 1, cols.GetColArray(1).min); // 1 based + Assert.AreEqual(5 + 1, cols.GetColArray(1).max); // 1 based + + Assert.AreEqual(false, cols.GetColArray(2).IsSetHidden()); + Assert.AreEqual(false, cols.GetColArray(2).IsSetCollapsed()); + Assert.AreEqual(false, cols.GetColArray(2).collapsed); + Assert.AreEqual(1, cols.GetColArray(2).outlineLevel); + Assert.AreEqual(6 + 1, cols.GetColArray(2).min); // 1 based + Assert.AreEqual(6 + 1, cols.GetColArray(2).max); // 1 based + + Assert.AreEqual(false, cols.GetColArray(3).IsSetHidden()); + Assert.AreEqual(false, cols.GetColArray(3).IsSetCollapsed()); + Assert.AreEqual(false, cols.GetColArray(3).collapsed); + Assert.AreEqual(1, cols.GetColArray(3).outlineLevel); + Assert.AreEqual(7 + 1, cols.GetColArray(3).min); // 1 based + Assert.AreEqual(7 + 1, cols.GetColArray(3).max); // 1 based + + Assert.AreEqual(false, cols.GetColArray(4).IsSetHidden()); + Assert.AreEqual(true, cols.GetColArray(4).IsSetCollapsed()); + Assert.AreEqual(false, cols.GetColArray(4).collapsed); + Assert.AreEqual(0, cols.GetColArray(4).outlineLevel); + Assert.AreEqual(8 + 1, cols.GetColArray(4).min); // 1 based + Assert.AreEqual(8 + 1, cols.GetColArray(4).max); // 1 based + + Assert.AreEqual(false, cols.GetColArray(5).IsSetHidden()); + Assert.AreEqual(false, cols.GetColArray(5).IsSetCollapsed()); + Assert.AreEqual(false, cols.GetColArray(5).collapsed); + Assert.AreEqual(1, cols.GetColArray(5).outlineLevel); + Assert.AreEqual(9 + 1, cols.GetColArray(5).min); // 1 based + Assert.AreEqual(9 + 1, cols.GetColArray(5).max); // 1 based + + Assert.AreEqual(false, cols.GetColArray(6).IsSetHidden()); + Assert.AreEqual(false, cols.GetColArray(6).IsSetCollapsed()); + Assert.AreEqual(false, cols.GetColArray(6).collapsed); + Assert.AreEqual(2, cols.GetColArray(6).outlineLevel); + Assert.AreEqual(10 + 1, cols.GetColArray(6).min); // 1 based + Assert.AreEqual(10 + 1, cols.GetColArray(6).max); // 1 based + + Assert.AreEqual(false, cols.GetColArray(7).IsSetHidden()); + Assert.AreEqual(false, cols.GetColArray(7).IsSetCollapsed()); + Assert.AreEqual(false, cols.GetColArray(7).collapsed); + Assert.AreEqual(2, cols.GetColArray(7).outlineLevel); + Assert.AreEqual(11 + 1, cols.GetColArray(7).min); // 1 based + Assert.AreEqual(11 + 1, cols.GetColArray(7).max); // 1 based + + Assert.AreEqual(false, cols.GetColArray(8).IsSetHidden()); + Assert.AreEqual(true, cols.GetColArray(8).IsSetCollapsed()); + Assert.AreEqual(false, cols.GetColArray(8).collapsed); + Assert.AreEqual(1, cols.GetColArray(8).outlineLevel); + Assert.AreEqual(12 + 1, cols.GetColArray(8).min); // 1 based + Assert.AreEqual(12 + 1, cols.GetColArray(8).max); // 1 based + + Assert.AreEqual(false, cols.GetColArray(9).IsSetHidden()); + Assert.AreEqual(true, cols.GetColArray(9).IsSetCollapsed()); + Assert.AreEqual(false, cols.GetColArray(9).collapsed); + Assert.AreEqual(0, cols.GetColArray(9).outlineLevel); + Assert.AreEqual(13 + 1, cols.GetColArray(9).min); // 1 based + Assert.AreEqual(13 + 1, cols.GetColArray(9).max); // 1 based + + // write out and give back // Save and re-load XSSFWorkbook wb2 = XSSFTestDataSamples.WriteOutAndReadBack(wb1); wb1.Close(); - sheet1 = wb2.GetSheetAt(0) as XSSFSheet; - // FIXME: forgot to reassign! - //cols = sheet1.getCTWorksheet().getColsArray(0); - - Assert.AreEqual(6, cols.sizeOfColArray()); - checkColumnGroup(cols.GetColArray(0), 4, 7); // false, true - checkColumnGroup(cols.GetColArray(1), 8, 8, false, false); - checkColumnGroup(cols.GetColArray(2), 9, 9); // false, true - checkColumnGroup(cols.GetColArray(3), 10, 11); // false, true - checkColumnGroup(cols.GetColArray(4), 12, 12, false, false); - checkColumnGroup(cols.GetColArray(5), 13, 13, false, false); + var sheet2 = (XSSFSheet)wb2.GetSheetAt(0); + var cols2 = sheet2.GetCTWorksheet().GetColsArray(0); + Assert.AreEqual(10, cols2.sizeOfColArray()); + + Assert.AreEqual(false, cols2.GetColArray(0).IsSetHidden()); + Assert.AreEqual(false, cols2.GetColArray(0).IsSetCollapsed()); + Assert.AreEqual(false, cols2.GetColArray(0).collapsed); + Assert.AreEqual(1, cols2.GetColArray(0).outlineLevel); + Assert.AreEqual(4 + 1, cols2.GetColArray(0).min); // 1 based + Assert.AreEqual(4 + 1, cols2.GetColArray(0).max); // 1 based + + Assert.AreEqual(false, cols2.GetColArray(1).IsSetHidden()); + Assert.AreEqual(false, cols2.GetColArray(1).IsSetCollapsed()); + Assert.AreEqual(false, cols2.GetColArray(1).collapsed); + Assert.AreEqual(1, cols2.GetColArray(1).outlineLevel); + Assert.AreEqual(5 + 1, cols2.GetColArray(1).min); // 1 based + Assert.AreEqual(5 + 1, cols2.GetColArray(1).max); // 1 based + + Assert.AreEqual(false, cols2.GetColArray(2).IsSetHidden()); + Assert.AreEqual(false, cols2.GetColArray(2).IsSetCollapsed()); + Assert.AreEqual(false, cols2.GetColArray(2).collapsed); + Assert.AreEqual(1, cols2.GetColArray(2).outlineLevel); + Assert.AreEqual(6 + 1, cols2.GetColArray(2).min); // 1 based + Assert.AreEqual(6 + 1, cols2.GetColArray(2).max); // 1 based + + Assert.AreEqual(false, cols2.GetColArray(3).IsSetHidden()); + Assert.AreEqual(false, cols2.GetColArray(3).IsSetCollapsed()); + Assert.AreEqual(false, cols2.GetColArray(3).collapsed); + Assert.AreEqual(1, cols2.GetColArray(3).outlineLevel); + Assert.AreEqual(7 + 1, cols2.GetColArray(3).min); // 1 based + Assert.AreEqual(7 + 1, cols2.GetColArray(3).max); // 1 based + + Assert.AreEqual(false, cols2.GetColArray(4).IsSetHidden()); + Assert.AreEqual(false, cols2.GetColArray(4).IsSetCollapsed()); + Assert.AreEqual(false, cols2.GetColArray(4).collapsed); + Assert.AreEqual(0, cols2.GetColArray(4).outlineLevel); + Assert.AreEqual(8 + 1, cols2.GetColArray(4).min); // 1 based + Assert.AreEqual(8 + 1, cols2.GetColArray(4).max); // 1 based + + Assert.AreEqual(false, cols2.GetColArray(5).IsSetHidden()); + Assert.AreEqual(false, cols2.GetColArray(5).IsSetCollapsed()); + Assert.AreEqual(false, cols2.GetColArray(5).collapsed); + Assert.AreEqual(1, cols2.GetColArray(5).outlineLevel); + Assert.AreEqual(9 + 1, cols2.GetColArray(5).min); // 1 based + Assert.AreEqual(9 + 1, cols2.GetColArray(5).max); // 1 based + + Assert.AreEqual(false, cols2.GetColArray(6).IsSetHidden()); + Assert.AreEqual(false, cols2.GetColArray(6).IsSetCollapsed()); + Assert.AreEqual(false, cols2.GetColArray(6).collapsed); + Assert.AreEqual(2, cols2.GetColArray(6).outlineLevel); + Assert.AreEqual(10 + 1, cols2.GetColArray(6).min); // 1 based + Assert.AreEqual(10 + 1, cols2.GetColArray(6).max); // 1 based + + Assert.AreEqual(false, cols2.GetColArray(7).IsSetHidden()); + Assert.AreEqual(false, cols2.GetColArray(7).IsSetCollapsed()); + Assert.AreEqual(false, cols2.GetColArray(7).collapsed); + Assert.AreEqual(2, cols2.GetColArray(7).outlineLevel); + Assert.AreEqual(11 + 1, cols2.GetColArray(7).min); // 1 based + Assert.AreEqual(11 + 1, cols2.GetColArray(7).max); // 1 based + + Assert.AreEqual(false, cols2.GetColArray(8).IsSetHidden()); + Assert.AreEqual(false, cols2.GetColArray(8).IsSetCollapsed()); + Assert.AreEqual(false, cols2.GetColArray(8).collapsed); + Assert.AreEqual(1, cols2.GetColArray(8).outlineLevel); + Assert.AreEqual(12 + 1, cols2.GetColArray(8).min); // 1 based + Assert.AreEqual(12 + 1, cols2.GetColArray(8).max); // 1 based + + Assert.AreEqual(false, cols2.GetColArray(9).IsSetHidden()); + Assert.AreEqual(false, cols2.GetColArray(9).IsSetCollapsed()); + Assert.AreEqual(false, cols2.GetColArray(9).collapsed); + Assert.AreEqual(0, cols2.GetColArray(9).outlineLevel); + Assert.AreEqual(13 + 1, cols2.GetColArray(9).min); // 1 based + Assert.AreEqual(13 + 1, cols2.GetColArray(9).max); // 1 based wb2.Close(); }