diff --git a/Directory.Build.props b/Directory.Build.props index d48657eb3..dd5d8c50a 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -99,8 +99,6 @@ $(NoWarn);CA1862 $(NoWarn);CA1864 $(NoWarn);CA1853 - $(NoWarn);CA1865 - $(NoWarn);CA1866 $(NoWarn);CA1872 $(NoWarn);CA2019 $(NoWarn);CA2022 @@ -109,8 +107,6 @@ $(NoWarn);CA2211 $(NoWarn);CA2219 $(NoWarn);CA2241 - $(NoWarn);CA2249 - $(NoWarn);CA2251 $(NoWarn);CA2263 $(NoWarn);CA3075 $(NoWarn);CA5351 diff --git a/OpenXmlFormats/NPOI.OpenXmlFormats.Core.csproj b/OpenXmlFormats/NPOI.OpenXmlFormats.Core.csproj index 799db04c2..e546fdf76 100644 --- a/OpenXmlFormats/NPOI.OpenXmlFormats.Core.csproj +++ b/OpenXmlFormats/NPOI.OpenXmlFormats.Core.csproj @@ -13,4 +13,9 @@ + + + + + \ No newline at end of file diff --git a/OpenXmlFormats/Spreadsheet/SharedString/CT_Rst.cs b/OpenXmlFormats/Spreadsheet/SharedString/CT_Rst.cs index 84d39fbfb..d81806487 100644 --- a/OpenXmlFormats/Spreadsheet/SharedString/CT_Rst.cs +++ b/OpenXmlFormats/Spreadsheet/SharedString/CT_Rst.cs @@ -167,7 +167,7 @@ public string XmlText if (r.t != null) { sw.Write("=0) + if(r.t.Contains(' ')) sw.Write(" xml:space=\"preserve\""); sw.Write(">"); sw.Write(XmlHelper.EncodeXml(r.t)); @@ -180,7 +180,7 @@ public string XmlText if (this.t != null) { sw.Write("= 0) + if (t.Contains(' ')) sw.Write(" xml:space=\"preserve\""); sw.Write(">"); sw.Write(XmlHelper.EncodeXml(this.t)); diff --git a/main/HSSF/Extractor/EventBasedExcelExtractor.cs b/main/HSSF/Extractor/EventBasedExcelExtractor.cs index c9c1ded91..64c1c528a 100644 --- a/main/HSSF/Extractor/EventBasedExcelExtractor.cs +++ b/main/HSSF/Extractor/EventBasedExcelExtractor.cs @@ -126,7 +126,7 @@ public override String Text TextListener tl = TriggerExtraction(); text = tl.text.ToString(); - if (!text.EndsWith("\n", StringComparison.Ordinal)) + if (!text.EndsWith('\n')) { text = text + "\n"; } diff --git a/main/HSSF/UserModel/DVConstraint.cs b/main/HSSF/UserModel/DVConstraint.cs index ed8f4b48c..1f475de2e 100644 --- a/main/HSSF/UserModel/DVConstraint.cs +++ b/main/HSSF/UserModel/DVConstraint.cs @@ -527,11 +527,11 @@ internal static DVConstraint CreateDVConstraint(DVRecord dvRecord, IFormulaRende if (dvRecord.ListExplicitFormula) { String values = toFormulaString(dvRecord.Formula1, book).AsString(); - if (values.StartsWith("\"")) + if (values.StartsWith('"')) { values = values.Substring(1); } - if (values.EndsWith("\"")) + if (values.EndsWith('"')) { values = values.Substring(0, values.Length - 1); } diff --git a/main/HSSF/UserModel/HSSFName.cs b/main/HSSF/UserModel/HSSFName.cs index 666c4bab9..f79ecdbe1 100644 --- a/main/HSSF/UserModel/HSSFName.cs +++ b/main/HSSF/UserModel/HSSFName.cs @@ -175,7 +175,7 @@ thus we are stuck with Character.isLetter (for now). // is first character valid? char c = name[0]; String allowedSymbols = "_\\"; - bool characterIsValid = (char.IsLetter(c) || allowedSymbols.IndexOf(c) != -1); + bool characterIsValid = (char.IsLetter(c) || allowedSymbols.Contains(c)); if (!characterIsValid) { throw new ArgumentException("Invalid name: '" + name + "': first character must be underscore or a letter"); @@ -185,7 +185,7 @@ thus we are stuck with Character.isLetter (for now). allowedSymbols = "_.\\"; //backslashes needed for unicode escape foreach (char ch in name.ToCharArray()) { - characterIsValid = (char.IsLetterOrDigit(ch) || allowedSymbols.IndexOf(ch) != -1); + characterIsValid = (char.IsLetterOrDigit(ch) || allowedSymbols.Contains(ch)); if (!characterIsValid) { throw new ArgumentException("Invalid name: '" + name + "': name must be letter, digit, period, or underscore"); diff --git a/main/HSSF/UserModel/HSSFWorkbook.cs b/main/HSSF/UserModel/HSSFWorkbook.cs index eb7e048e5..a49f8d143 100644 --- a/main/HSSF/UserModel/HSSFWorkbook.cs +++ b/main/HSSF/UserModel/HSSFWorkbook.cs @@ -896,7 +896,7 @@ private String GetUniqueSheetName(String srcName) int uniqueIndex = 2; String baseName = srcName; int bracketPos = srcName.LastIndexOf('('); - if (bracketPos > 0 && srcName.EndsWith(")", StringComparison.Ordinal)) + if (bracketPos > 0 && srcName.EndsWith(')')) { String suffix = srcName.Substring(bracketPos + 1, srcName.Length - bracketPos - 2); try diff --git a/main/HSSF/UserModel/HeaderFooter.cs b/main/HSSF/UserModel/HeaderFooter.cs index 24054081d..7086ac65b 100644 --- a/main/HSSF/UserModel/HeaderFooter.cs +++ b/main/HSSF/UserModel/HeaderFooter.cs @@ -56,11 +56,11 @@ private String[] SplitParts() switch (text[1]) { case 'L': - if (text.IndexOf("&C", StringComparison.Ordinal) >= 0) + if (text.Contains("&C")) { pos = Math.Min(pos, text.IndexOf("&C", StringComparison.Ordinal)); } - if (text.IndexOf("&R", StringComparison.Ordinal) >= 0) + if (text.Contains("&R")) { pos = Math.Min(pos, text.IndexOf("&R", StringComparison.Ordinal)); } @@ -68,11 +68,11 @@ private String[] SplitParts() text = text.Substring(pos); break; case 'C': - if (text.IndexOf("&L", StringComparison.Ordinal) >= 0) + if (text.Contains("&L")) { pos = Math.Min(pos, text.IndexOf("&L", StringComparison.Ordinal)); } - if (text.IndexOf("&R", StringComparison.Ordinal) >= 0) + if (text.Contains("&R")) { pos = Math.Min(pos, text.IndexOf("&R", StringComparison.Ordinal)); } @@ -80,11 +80,11 @@ private String[] SplitParts() text = text.Substring(pos); break; case 'R': - if (text.IndexOf("&C", StringComparison.Ordinal) >= 0) + if (text.Contains("&C")) { pos = Math.Min(pos, text.IndexOf("&C", StringComparison.Ordinal)); } - if (text.IndexOf("&L", StringComparison.Ordinal) >= 0) + if (text.Contains("&L")) { pos = Math.Min(pos, text.IndexOf("&L", StringComparison.Ordinal)); } diff --git a/main/NPOI.Core.csproj b/main/NPOI.Core.csproj index 2b17fd244..8f998ddac 100644 --- a/main/NPOI.Core.csproj +++ b/main/NPOI.Core.csproj @@ -1,7 +1,6 @@  - net6.0;netstandard2.0;netstandard2.1;net472;net8.0 net472;netstandard2.0;netstandard2.1;net8.0 NPOI true diff --git a/main/Polyfills.cs b/main/Polyfills.cs new file mode 100644 index 000000000..0a71032ff --- /dev/null +++ b/main/Polyfills.cs @@ -0,0 +1,23 @@ +using System; + +namespace NPOI +{ + internal static class Polyfills + { +#if NETFRAMEWORK || NETSTANDARD2_0 + [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] + internal static bool Contains(this string source, char c) => source.IndexOf(c) != -1; + + [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] + internal static bool StartsWith(this string source, char c) => source.Length > 0 && source[0] == c; + + [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] + internal static bool EndsWith(this string source, char c) => source.Length > 0 && source[source.Length - 1] == c; +#endif + +#if NETFRAMEWORK + [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] + internal static bool Contains(this ReadOnlySpan source, string c) => source.IndexOf(c) != -1; +#endif + } +} diff --git a/main/SS/Format/CellFormat.cs b/main/SS/Format/CellFormat.cs index e2ef2919e..0af861a2c 100644 --- a/main/SS/Format/CellFormat.cs +++ b/main/SS/Format/CellFormat.cs @@ -163,7 +163,7 @@ private CellFormat(String format) String valueDesc = m.Groups[0].Value; // Strip out the semicolon if it's there - if (valueDesc.EndsWith(";")) + if (valueDesc.EndsWith(';')) valueDesc = valueDesc.Substring(0, valueDesc.Length - 1); parts.Add(new CellFormatPart(valueDesc)); diff --git a/main/SS/Format/CellFormatPart.cs b/main/SS/Format/CellFormatPart.cs index 1360f65e4..effbe6db4 100644 --- a/main/SS/Format/CellFormatPart.cs +++ b/main/SS/Format/CellFormatPart.cs @@ -610,7 +610,7 @@ public static StringBuilder ParseFormat(String fdesc, CellFormatType type, } public static String QuoteReplacement(String s) { - if ((s.IndexOf('\\') == -1) && (s.IndexOf('$') == -1)) + if (!s.Contains('\\') && !s.Contains('$')) return s; StringBuilder sb = new StringBuilder(); for (int i = 0; i < s.Length; i++) diff --git a/main/SS/Format/CellGeneralFormatter.cs b/main/SS/Format/CellGeneralFormatter.cs index bf4a62e4a..930148c62 100644 --- a/main/SS/Format/CellGeneralFormatter.cs +++ b/main/SS/Format/CellGeneralFormatter.cs @@ -75,8 +75,8 @@ public override void FormatValue(StringBuilder toAppendTo, Object value) { // strip off trailing zeros int RemoveFrom; - if (fmt.StartsWith("E")) - RemoveFrom = toAppendTo.ToString().LastIndexOf("E") - 1; + if (fmt.StartsWith('E')) + RemoveFrom = toAppendTo.ToString().LastIndexOf('E') - 1; else RemoveFrom = toAppendTo.Length - 1; while (toAppendTo[RemoveFrom] == '0') @@ -89,7 +89,7 @@ public override void FormatValue(StringBuilder toAppendTo, Object value) } // remove zeros after E by antony.liu string text = toAppendTo.ToString(); - RemoveFrom = toAppendTo.ToString().LastIndexOf("E"); + RemoveFrom = toAppendTo.ToString().LastIndexOf('E'); if (RemoveFrom > 0) { RemoveFrom++; diff --git a/main/SS/Format/CellNumberFormatter.cs b/main/SS/Format/CellNumberFormatter.cs index cf4245811..7619e23ea 100644 --- a/main/SS/Format/CellNumberFormatter.cs +++ b/main/SS/Format/CellNumberFormatter.cs @@ -782,7 +782,7 @@ private void WriteScientific(double value, StringBuilder output, SortedList 0) { - digit = result.ToString().IndexOf(".") + 1; + string resultString = result.ToString(); + digit = resultString.IndexOf('.') + 1; if (exponent != null) - strip = result.ToString().IndexOf("E") - 1; + strip = resultString.IndexOf('E') - 1; else strip = result.Length - 1; while (strip > digit && result[strip] == '0') diff --git a/main/SS/Format/CellTextFormatter.cs b/main/SS/Format/CellTextFormatter.cs index 804b61ea6..72473cee3 100644 --- a/main/SS/Format/CellTextFormatter.cs +++ b/main/SS/Format/CellTextFormatter.cs @@ -68,7 +68,7 @@ public CellTextFormatter(String format) int pos = desc.Length - 1; for (int i = 0; i < textPos.Length; i++) { - textPos[i] = desc.LastIndexOf("\u0000", pos); + textPos[i] = desc.LastIndexOf('\u0000', pos); pos = textPos[i] - 1; } } diff --git a/main/SS/Formula/EvaluationConditionalFormatRule.cs b/main/SS/Formula/EvaluationConditionalFormatRule.cs index e96494e0f..613e21740 100644 --- a/main/SS/Formula/EvaluationConditionalFormatRule.cs +++ b/main/SS/Formula/EvaluationConditionalFormatRule.cs @@ -56,7 +56,7 @@ public static bool IsValid(OperatorEnum @operator, object cellValue, object v1, } else if (cellValue is String equalString) { - return string.Compare(equalString, (String)v1, true) == 0; + return string.Equals(equalString, (String)v1, StringComparison.Ordinal); } else if (cellValue is Boolean b) { @@ -70,7 +70,7 @@ public static bool IsValid(OperatorEnum @operator, object cellValue, object v1, if (cellValue is String s) { String n1 = (String)v1; - return string.Compare(s, n1, true) != 0; + return !string.Equals(s, n1, StringComparison.Ordinal); } else if (cellValue is Boolean b) { diff --git a/main/SS/Formula/Functions/Bin2Dec.cs b/main/SS/Formula/Functions/Bin2Dec.cs index e449abe8c..39c7535b6 100644 --- a/main/SS/Formula/Functions/Bin2Dec.cs +++ b/main/SS/Formula/Functions/Bin2Dec.cs @@ -75,7 +75,7 @@ public override ValueEval Evaluate(int srcRowIndex, int srcColumnIndex, ValueEva else { unsigned = number.Substring(1); - isPositive = number.StartsWith("0"); + isPositive = number.StartsWith('0'); } String value; diff --git a/main/SS/Formula/Functions/DStarRunner.cs b/main/SS/Formula/Functions/DStarRunner.cs index 95ca6b99a..a133fa289 100644 --- a/main/SS/Formula/Functions/DStarRunner.cs +++ b/main/SS/Formula/Functions/DStarRunner.cs @@ -329,15 +329,15 @@ private static bool testNormalCondition(ValueEval value, ValueEval condition) if (condition is StringEval eval) { String conditionString = eval.StringValue; - if (conditionString.StartsWith("<")) + if (conditionString.StartsWith('<')) { // It's a ")) + else if(number.StartsWith('>')) { number = number.Substring(1); bool itsANumber = IsNumber(number); @@ -355,10 +355,10 @@ private static bool testNormalCondition(ValueEval value, ValueEval condition) return testNumericCondition(value, Operator.smallerThan, number); } } - else if (conditionString.StartsWith(">")) + else if (conditionString.StartsWith('>')) { // It's a >/>= condition. String number = conditionString.Substring(1); - if (number.StartsWith("=")) + if (number.StartsWith('=')) { number = number.Substring(1); return testNumericCondition(value, Operator.largerEqualThan, number); @@ -368,7 +368,7 @@ private static bool testNormalCondition(ValueEval value, ValueEval condition) return testNumericCondition(value, Operator.largerThan, number); } } - else if (conditionString.StartsWith("=")) + else if (conditionString.StartsWith('=')) { // It's a = condition. String stringOrNumber = conditionString.Substring(1); diff --git a/main/SS/Formula/Functions/DateValue.cs b/main/SS/Formula/Functions/DateValue.cs index 7a97dd7bd..1bd943ba1 100644 --- a/main/SS/Formula/Functions/DateValue.cs +++ b/main/SS/Formula/Functions/DateValue.cs @@ -22,13 +22,14 @@ private sealed class Format public Format(string patternString, String groupOrder) { this.pattern = new Regex(patternString, RegexOptions.Compiled); - this.hasYear = groupOrder.Contains("y"); + var idx = groupOrder.IndexOf('y'); + this.hasYear = idx != -1; if (hasYear) { - yearIndex = groupOrder.IndexOf("y"); + yearIndex = idx; } - monthIndex = groupOrder.IndexOf("m"); - dayIndex = groupOrder.IndexOf("d"); + monthIndex = groupOrder.IndexOf('m'); + dayIndex = groupOrder.IndexOf('d'); } private static List formats = new List(); static Format() diff --git a/main/SS/Formula/Functions/NumberValueFunction.cs b/main/SS/Formula/Functions/NumberValueFunction.cs index a07cb087d..d414d6aed 100644 --- a/main/SS/Formula/Functions/NumberValueFunction.cs +++ b/main/SS/Formula/Functions/NumberValueFunction.cs @@ -73,7 +73,7 @@ public ValueEval Evaluate(ValueEval[] args, OperationEvaluationContext ec) //Multiple percent signs are additive if they are used in the Text argument just as they are if they are used in a formula. //For example, =NUMBERVALUE("9%%") returns the same result (0.0009) as the formula =9%%. int countPercent = 0; - while (text.EndsWith("%")) + while (text.EndsWith('%')) { countPercent++; text = text.Substring(0, text.Length - 1); diff --git a/main/SS/UserModel/DataFormatter.cs b/main/SS/UserModel/DataFormatter.cs index ef3fee3c3..19878c7ce 100644 --- a/main/SS/UserModel/DataFormatter.cs +++ b/main/SS/UserModel/DataFormatter.cs @@ -326,8 +326,7 @@ private FormatBase GetFormat(double cellValue, int formatIndex, string formatStr // handle these ourselves in a special way. // For now, if we detect 3+ parts, we call out to CellFormat to handle it // TODO Going forward, we should really merge the logic between the two classes - if (formatStr.IndexOf(';') != -1 && - formatStr.IndexOf(';') != formatStr.LastIndexOf(';')) + if (formatStr.Contains(';') && formatStr.IndexOf(';') != formatStr.LastIndexOf(';')) { try { @@ -466,7 +465,7 @@ private FormatBase CreateFormat(double cellValue, int formatIndex, string sForma } // Excel supports fractions in format strings, which Java doesn't - if (formatStr.IndexOf("#/") >= 0 || formatStr.IndexOf("?/") >= 0) + if (formatStr.Contains("#/") || formatStr.Contains("?/")) { String[] chunks = formatStr.Split(";".ToCharArray()); for (int i = 0; i < chunks.Length; i++) @@ -908,7 +907,7 @@ private string GetFormattedNumberString(ICell cell) } //return numberFormat.Format(d, currentCulture); string formatted = numberFormat.Format(d); - if (formatted.StartsWith(".")) + if (formatted.StartsWith('.')) formatted = "0" + formatted; if (formatted.StartsWith("-.")) formatted = "-0" + formatted.Substring(1); diff --git a/main/SS/UserModel/ExcelStyleDateFormatter.cs b/main/SS/UserModel/ExcelStyleDateFormatter.cs index 89b9869ba..ac2f35463 100644 --- a/main/SS/UserModel/ExcelStyleDateFormatter.cs +++ b/main/SS/UserModel/ExcelStyleDateFormatter.cs @@ -136,13 +136,15 @@ public StringBuilder Format(DateTime date, StringBuilder paramStringBuilder, Cul s = date.ToString(Pattern, culture); } else + { s = Pattern; - if (s.IndexOf(QUOTE_SYMBOL) != -1) + } + if (s.Contains(QUOTE_SYMBOL)) { s = s.Replace(QUOTE_SYMBOL, '"'); } // Now handle our special cases - if (s.IndexOf(MMMMM_START_SYMBOL) != -1) + if (s.Contains(MMMMM_START_SYMBOL)) { Regex reg = new Regex(MMMMM_START_SYMBOL + "(\\p{L}|\\p{P}|\\p{N})[\\p{L}|\\p{P}|\\p{N}]+" + MMMMM_TRUNCATE_SYMBOL, RegexOptions.IgnoreCase); Match m = reg.Match(s); @@ -152,8 +154,7 @@ public StringBuilder Format(DateTime date, StringBuilder paramStringBuilder, Cul } } - if (s.IndexOf(H_BRACKET_SYMBOL) != -1 || - s.IndexOf(HH_BRACKET_SYMBOL) != -1) + if (s.Contains(H_BRACKET_SYMBOL) || s.Contains(HH_BRACKET_SYMBOL)) { double hours = dateToBeFormatted * 24 + 0.01; //get the hour part of the time @@ -168,8 +169,7 @@ public StringBuilder Format(DateTime date, StringBuilder paramStringBuilder, Cul ); } - if (s.IndexOf(M_BRACKET_SYMBOL) != -1 || - s.IndexOf(MM_BRACKET_SYMBOL) != -1) + if (s.Contains(M_BRACKET_SYMBOL) || s.Contains(MM_BRACKET_SYMBOL)) { double minutes = dateToBeFormatted * 24 * 60 + 0.01; minutes = Math.Floor(minutes); @@ -182,8 +182,7 @@ public StringBuilder Format(DateTime date, StringBuilder paramStringBuilder, Cul format2digits.Format(minutes, culture) ); } - if (s.IndexOf(S_BRACKET_SYMBOL) != -1 || - s.IndexOf(SS_BRACKET_SYMBOL) != -1) + if (s.Contains(S_BRACKET_SYMBOL) || s.Contains(SS_BRACKET_SYMBOL)) { double seconds = (dateToBeFormatted * 24.0 * 60.0 * 60.0) + 0.01; s = s.Replace( @@ -196,8 +195,7 @@ public StringBuilder Format(DateTime date, StringBuilder paramStringBuilder, Cul ); } - if (s.IndexOf(L_BRACKET_SYMBOL) != -1 || - s.IndexOf(LL_BRACKET_SYMBOL) != -1) + if (s.Contains(L_BRACKET_SYMBOL) || s.Contains(LL_BRACKET_SYMBOL)) { float millisTemp = (float)((dateToBeFormatted - Math.Floor(dateToBeFormatted)) * 24.0 * 60.0 * 60.0); float millis = (millisTemp - (int)millisTemp); diff --git a/main/SS/Util/AreaReference.cs b/main/SS/Util/AreaReference.cs index fa8f27b1f..15b7471bb 100644 --- a/main/SS/Util/AreaReference.cs +++ b/main/SS/Util/AreaReference.cs @@ -268,7 +268,7 @@ public static bool IsContiguous(String reference) } // Check for the , as a sign of non-coniguous - if (reference.IndexOf(',') == -1) + if (!reference.Contains(',')) { return true; } @@ -494,7 +494,7 @@ private static String[] SeparateAreaRefs(String reference) String partA = reference.Substring(0, delimiterPos); String partB = reference.Substring(delimiterPos + 1); - if (partB.IndexOf(SHEET_NAME_DELIMITER) >= 0) + if (partB.Contains(SHEET_NAME_DELIMITER)) { // TODO - are references like "Sheet1!A1:Sheet1:B2" ever valid? // FormulaParser has code to handle that. diff --git a/main/SS/Util/CellRangeAddress.cs b/main/SS/Util/CellRangeAddress.cs index c03cfc6ad..ed11876f3 100644 --- a/main/SS/Util/CellRangeAddress.cs +++ b/main/SS/Util/CellRangeAddress.cs @@ -102,7 +102,7 @@ public static int GetEncodedSize(int numberOfItems) /// a CellRangeAddress object public static CellRangeAddress ValueOf(String reference) { - int sep = reference.IndexOf(":", StringComparison.Ordinal); + int sep = reference.IndexOf(':'); CellReference a; CellReference b; if (sep == -1) diff --git a/main/SS/Util/DateFormatConverter.cs b/main/SS/Util/DateFormatConverter.cs index f0f52261e..58c078c66 100644 --- a/main/SS/Util/DateFormatConverter.cs +++ b/main/SS/Util/DateFormatConverter.cs @@ -342,8 +342,10 @@ public static string GetPrefixForLocale(CultureInfo locale) string result = null; if (!localePrefixes.TryGetValue(localeString, out string prefix)) { - string name = localeString.IndexOf("-") > 0 ? localeString.Substring(0, localeString.IndexOf("-")) : - localeString; + string name = localeString.IndexOf('-') > 0 + ? localeString.Substring(0, localeString.IndexOf('-')) + : localeString; + if (!localePrefixes.TryGetValue(name, out string localePrefix)) { CultureInfo parentLocale = CultureInfo.GetCultureInfo(name); @@ -379,7 +381,7 @@ public static string Convert(CultureInfo locale, string format) string token; while ((token = tokenizer.GetNextToken()) != null) { - if (token.StartsWith("'")) + if (token.StartsWith('\'')) { result.Append(token.Replace("'", "\"")); } diff --git a/main/SS/Util/Format.cs b/main/SS/Util/Format.cs index c4609441e..08209b298 100644 --- a/main/SS/Util/Format.cs +++ b/main/SS/Util/Format.cs @@ -191,7 +191,7 @@ public DecimalFormat() public DecimalFormat(string pattern) { - if (pattern.IndexOf("'", StringComparison.Ordinal) != -1) + if (pattern.Contains("'")) throw new ArgumentException("invalid pattern"); this._pattern = pattern; } @@ -220,7 +220,7 @@ public override string Format(object obj, CultureInfo culture) culture.NumberFormat = _formatInfo; } - if (_pattern.IndexOf("'", StringComparison.Ordinal) != -1) + if (_pattern.Contains("'")) { return Convert.ToDouble(obj, CultureInfo.InvariantCulture).ToString(culture); } diff --git a/main/SS/Util/SheetUtil.cs b/main/SS/Util/SheetUtil.cs index a13609a98..7462c2a37 100644 --- a/main/SS/Util/SheetUtil.cs +++ b/main/SS/Util/SheetUtil.cs @@ -832,7 +832,7 @@ public static String GetUniqueSheetName(IWorkbook wb, String srcName) int uniqueIndex = 2; String baseName = srcName; int bracketPos = srcName.LastIndexOf('('); - if (bracketPos > 0 && srcName.EndsWith(")")) + if (bracketPos > 0 && srcName.EndsWith(')')) { String suffix = srcName.Substring(bracketPos + 1, srcName.Length - bracketPos - 2); try diff --git a/main/Util/Collections/Properties.cs b/main/Util/Collections/Properties.cs index 35d05963e..750f8cb8a 100644 --- a/main/Util/Collections/Properties.cs +++ b/main/Util/Collections/Properties.cs @@ -153,7 +153,7 @@ public void Load(Stream inStream) { int len = line.Length; int keyStart; for (keyStart=0; keyStart= 0) + while (pos < len && delim.Contains(str[pos])) pos++; } return pos < len; @@ -88,14 +88,20 @@ public String NextToken(String delim) { } public String NextToken() { - if (pos < len && delim.IndexOf(str[pos]) >= 0) { - if (retDelims) + if (pos < len && delim.Contains(str[pos])) { + if(retDelims) + { return str.Substring(pos++, 1); - while (++pos < len && delim.IndexOf(str[pos]) >= 0); + } + while(++pos < len && delim.Contains(str[pos])) + { + } } if (pos < len) { int start = pos; - while (++pos < len && delim.IndexOf(str[pos]) < 0); + while(++pos < len && delim.IndexOf(str[pos]) < 0) + { + } return str.Substring(start, pos - start); } @@ -109,7 +115,7 @@ public int CountTokens() { int tmpPos = pos; while (tmpPos < len) { - if (delim.IndexOf(str[tmpPos++]) >= 0) { + if (delim.Contains(str[tmpPos++])) { if (tokenFound) { count++; tokenFound = false; diff --git a/main/Util/StringUtil.cs b/main/Util/StringUtil.cs index a914d66a7..475882c23 100644 --- a/main/Util/StringUtil.cs +++ b/main/Util/StringUtil.cs @@ -481,7 +481,7 @@ private static bool NeedToEncode(char chr) if (chr > 127) return true; - if (char.IsLetterOrDigit(chr) || reservedChars.IndexOf(chr) >= 0) + if (char.IsLetterOrDigit(chr) || reservedChars.Contains(chr)) return false; return true; diff --git a/ooxml/NPOI.OOXML.Core.csproj b/ooxml/NPOI.OOXML.Core.csproj index aad416d76..3b662e020 100644 --- a/ooxml/NPOI.OOXML.Core.csproj +++ b/ooxml/NPOI.OOXML.Core.csproj @@ -36,4 +36,8 @@ + + + + diff --git a/ooxml/POIXMLDocumentPart.cs b/ooxml/POIXMLDocumentPart.cs index 0357f62ae..1b7826fa3 100644 --- a/ooxml/POIXMLDocumentPart.cs +++ b/ooxml/POIXMLDocumentPart.cs @@ -769,7 +769,7 @@ protected void Read(POIXMLFactory factory, Dictionary= 0) + if (uri.OriginalString.Contains('#')) { string path = string.Empty; try diff --git a/ooxml/POIXMLRelation.cs b/ooxml/POIXMLRelation.cs index e606a1e2e..5d94b1b92 100644 --- a/ooxml/POIXMLRelation.cs +++ b/ooxml/POIXMLRelation.cs @@ -125,7 +125,7 @@ public String DefaultFileName */ public String GetFileName(int index) { - if (_defaultName.IndexOf("#") == -1) + if (!_defaultName.Contains('#')) { // Generic filename in all cases return DefaultFileName; diff --git a/ooxml/SS/Converter/ExcelToHtmlConverter.cs b/ooxml/SS/Converter/ExcelToHtmlConverter.cs index d71c0a42a..ff60899bb 100644 --- a/ooxml/SS/Converter/ExcelToHtmlConverter.cs +++ b/ooxml/SS/Converter/ExcelToHtmlConverter.cs @@ -575,7 +575,7 @@ protected bool ProcessCell(ICell cell, XmlElement tableCellElement, } } - if (OutputLeadingSpacesAsNonBreaking && value.StartsWith(" ")) + if (OutputLeadingSpacesAsNonBreaking && value.StartsWith(' ')) { StringBuilder builder = new StringBuilder(); for (int c = 0; c < value.Length; c++) diff --git a/ooxml/XSSF/Extractor/XSSFExportToXml.cs b/ooxml/XSSF/Extractor/XSSFExportToXml.cs index 2fd0a1e35..1a59f0f56 100644 --- a/ooxml/XSSF/Extractor/XSSFExportToXml.cs +++ b/ooxml/XSSF/Extractor/XSSFExportToXml.cs @@ -353,7 +353,7 @@ private XmlNode GetNodeByXPath(String xpath, XmlNode rootNode, XmlDocument doc, String axisName = RemoveNamespace(xpathTokens[i]); - if (!axisName.StartsWith("@")) + if (!axisName.StartsWith('@')) { XmlNodeList list = currentNode.ChildNodes; diff --git a/ooxml/XSSF/UserModel/BaseXSSFEvaluationWorkbook.cs b/ooxml/XSSF/UserModel/BaseXSSFEvaluationWorkbook.cs index 8bb0a323a..87c31882d 100644 --- a/ooxml/XSSF/UserModel/BaseXSSFEvaluationWorkbook.cs +++ b/ooxml/XSSF/UserModel/BaseXSSFEvaluationWorkbook.cs @@ -80,7 +80,7 @@ public int GetExternalSheetIndex(String sheetName) private int ResolveBookIndex(String bookName) { // Strip the [] wrapper, if still present - if (bookName.StartsWith("[") && bookName.EndsWith("]")) + if (bookName.StartsWith('[') && bookName.EndsWith(']')) { bookName = bookName.Substring(1, bookName.Length - 2); } @@ -98,7 +98,7 @@ private int ResolveBookIndex(String bookName) if (index != -1) return index; // Is it an absolute file reference? - if (bookName.StartsWith("'file:///") && bookName.EndsWith("'")) + if (bookName.StartsWith("'file:///") && bookName.EndsWith('\'')) { String relBookName = bookName.Substring(bookName.LastIndexOf('/') + 1); relBookName = relBookName.Substring(0, relBookName.Length - 1); // Trailing ' diff --git a/ooxml/XSSF/UserModel/XSSFComment.cs b/ooxml/XSSF/UserModel/XSSFComment.cs index a513e615e..1d05a72e5 100644 --- a/ooxml/XSSF/UserModel/XSSFComment.cs +++ b/ooxml/XSSF/UserModel/XSSFComment.cs @@ -160,7 +160,7 @@ public bool Visible { String style = _vmlShape.style; if (style != null) - visible = style.IndexOf("visibility:visible") != -1; + visible = style.Contains("visibility:visible"); else { if (_vmlShape.GetClientDataArray(0) == null) diff --git a/ooxml/XSSF/UserModel/XSSFName.cs b/ooxml/XSSF/UserModel/XSSFName.cs index 6af4eb9a5..23c006b44 100644 --- a/ooxml/XSSF/UserModel/XSSFName.cs +++ b/ooxml/XSSF/UserModel/XSSFName.cs @@ -399,7 +399,7 @@ thus we are stuck with Character.isLetter (for now). // is first character valid? char c = name[0]; string allowedSymbols = "_\\"; - bool characterIsValid = (char.IsLetter(c) || allowedSymbols.IndexOf(c) != -1); + bool characterIsValid = (char.IsLetter(c) || allowedSymbols.Contains(c)); if (!characterIsValid) { throw new ArgumentException("Invalid name: '" + name + "': first character must be underscore or a letter"); @@ -409,7 +409,7 @@ thus we are stuck with Character.isLetter (for now). allowedSymbols = "_.\\"; //backslashes needed for unicode escape foreach (char ch in name.ToCharArray()) { - characterIsValid = (char.IsLetterOrDigit(ch) || allowedSymbols.IndexOf(ch) != -1); + characterIsValid = (char.IsLetterOrDigit(ch) || allowedSymbols.Contains(ch)); if (!characterIsValid) { throw new ArgumentException("Invalid name: '" + name + "': name must be letter, digit, period, or underscore"); diff --git a/ooxml/XSSF/UserModel/XSSFRichTextString.cs b/ooxml/XSSF/UserModel/XSSFRichTextString.cs index e18bb2faa..ab086592d 100644 --- a/ooxml/XSSF/UserModel/XSSFRichTextString.cs +++ b/ooxml/XSSF/UserModel/XSSFRichTextString.cs @@ -95,7 +95,7 @@ public void SetStylesTableReference(StylesTable stylestable) if(pr != null && pr.SizeOfRFontArray() > 0) { String fontName = pr.GetRFontArray(0).val; - if(fontName.StartsWith("#")) + if(fontName.StartsWith('#')) { int idx = int.Parse(fontName.Substring(1)); XSSFFont font = styles.GetFontAt(idx); diff --git a/ooxml/XSSF/UserModel/XSSFTable.cs b/ooxml/XSSF/UserModel/XSSFTable.cs index d623c2cfe..04db877cb 100644 --- a/ooxml/XSSF/UserModel/XSSFTable.cs +++ b/ooxml/XSSF/UserModel/XSSFTable.cs @@ -353,7 +353,7 @@ protected void SetCellRef(AreaReference refs) // Strip the sheet name, // CTWorksheet.getTableParts defines in which sheet the table is String reference = refs.FormatAsString(); - if (reference.IndexOf('!') != -1) + if (reference.Contains('!')) { reference = reference.Substring(reference.IndexOf('!') + 1); } diff --git a/ooxml/XSSF/UserModel/XSSFWorkbook.cs b/ooxml/XSSF/UserModel/XSSFWorkbook.cs index 2b172c013..000e61cc8 100644 --- a/ooxml/XSSF/UserModel/XSSFWorkbook.cs +++ b/ooxml/XSSF/UserModel/XSSFWorkbook.cs @@ -728,7 +728,7 @@ private String GetUniqueSheetName(String srcName) int uniqueIndex = 2; String baseName = srcName; int bracketPos = srcName.LastIndexOf('('); - if (bracketPos > 0 && srcName.EndsWith(")")) + if (bracketPos > 0 && srcName.EndsWith(')')) { String suffix = srcName.Substring(bracketPos + 1, srcName.Length - ")".Length - bracketPos - 1); try diff --git a/ooxml/XWPF/Usermodel/XWPFRun.cs b/ooxml/XWPF/Usermodel/XWPFRun.cs index d6d6320f7..445f7ffa0 100644 --- a/ooxml/XWPF/Usermodel/XWPFRun.cs +++ b/ooxml/XWPF/Usermodel/XWPFRun.cs @@ -1274,7 +1274,7 @@ public string GetStyle() static void preserveSpaces(CT_Text xs) { String text = xs.Value; - if (text != null && text.Length>=1 && (text.StartsWith(" ") || text.EndsWith(" ")||text.StartsWith("\t")||text.EndsWith("\t"))) + if (text != null && text.Length>=1 && (text.StartsWith(' ') || text.EndsWith(' ')||text.StartsWith('\t')||text.EndsWith('\t'))) { // XmlCursor c = xs.NewCursor(); // c.ToNextToken(); diff --git a/ooxml/XWPF/Usermodel/XWPFSharedRun.cs b/ooxml/XWPF/Usermodel/XWPFSharedRun.cs index 4373034a4..b0123d1b9 100644 --- a/ooxml/XWPF/Usermodel/XWPFSharedRun.cs +++ b/ooxml/XWPF/Usermodel/XWPFSharedRun.cs @@ -222,7 +222,7 @@ private XWPFSharedRun SetText(String value, int pos) static void preserveSpaces(CT_Text1 xs) { String text = xs.Value; - if (text != null && (text.StartsWith(" ") || text.EndsWith(" "))) + if (text != null && (text.StartsWith(' ') || text.EndsWith(' '))) { // XmlCursor c = xs.NewCursor(); // c.ToNextToken(); diff --git a/openxml4Net/NPOI.OpenXml4Net.Core.csproj b/openxml4Net/NPOI.OpenXml4Net.Core.csproj index 5414306bd..c6d7714c8 100644 --- a/openxml4Net/NPOI.OpenXml4Net.Core.csproj +++ b/openxml4Net/NPOI.OpenXml4Net.Core.csproj @@ -13,4 +13,8 @@ + + + + \ No newline at end of file diff --git a/openxml4Net/OPC/ContentTypes.cs b/openxml4Net/OPC/ContentTypes.cs index 2a7fe11d7..7f9650c1d 100644 --- a/openxml4Net/OPC/ContentTypes.cs +++ b/openxml4Net/OPC/ContentTypes.cs @@ -98,7 +98,7 @@ public class ContentTypes public static String GetContentTypeFromFileExtension(String filename) { - String extension = filename.Substring(filename.LastIndexOf(".") + 1) + String extension = filename.Substring(filename.LastIndexOf('.') + 1) .ToLower(); if (extension.Equals(EXTENSION_JPG_1) || extension.Equals(EXTENSION_JPG_2)) diff --git a/openxml4Net/OPC/Internal/PackagePropertiesPart.cs b/openxml4Net/OPC/Internal/PackagePropertiesPart.cs index 522e43742..9dec70899 100644 --- a/openxml4Net/OPC/Internal/PackagePropertiesPart.cs +++ b/openxml4Net/OPC/Internal/PackagePropertiesPart.cs @@ -580,7 +580,7 @@ private String SetStringValue(String s) { } } } - dateTzStr = dateStr.EndsWith("Z") ? dateStr : (dateStr + "Z"); + dateTzStr = dateStr.EndsWith('Z') ? dateStr : (dateStr + "Z"); foreach (String fStr in DATE_FORMATS) { SimpleDateFormat df = new SimpleDateFormat(fStr); diff --git a/openxml4Net/OPC/OPCPackage.cs b/openxml4Net/OPC/OPCPackage.cs index f02834b86..d1afa4938 100644 --- a/openxml4Net/OPC/OPCPackage.cs +++ b/openxml4Net/OPC/OPCPackage.cs @@ -540,7 +540,7 @@ public void AddThumbnail(String filename, Stream data) catch (InvalidFormatException) { String partName = "/docProps/thumbnail" + - filename.Substring(filename.LastIndexOf(".") + 1); + filename.Substring(filename.LastIndexOf('.') + 1); try { thumbnailPartName = PackagingUriHelper.CreatePartName(partName); diff --git a/openxml4Net/OPC/PackagePart.cs b/openxml4Net/OPC/PackagePart.cs index 20d2ded8f..17d1a07f8 100644 --- a/openxml4Net/OPC/PackagePart.cs +++ b/openxml4Net/OPC/PackagePart.cs @@ -497,7 +497,7 @@ public PackagePart GetRelatedPart(PackageRelationship rel) // Get the target URI, excluding any relative fragments Uri target = rel.TargetUri; - if (target.OriginalString.IndexOf('#') >=0) + if (target.OriginalString.Contains('#')) { String t = target.ToString(); try diff --git a/openxml4Net/OPC/PackagePartName.cs b/openxml4Net/OPC/PackagePartName.cs index c4d532953..b9be4dfdf 100644 --- a/openxml4Net/OPC/PackagePartName.cs +++ b/openxml4Net/OPC/PackagePartName.cs @@ -254,7 +254,7 @@ private static void ThrowExceptionIfPartNameHaveInvalidSegments(Uri partUri) + partUri.OriginalString); } - if (seg.EndsWith(".")) + if (seg.EndsWith('.')) { throw new InvalidFormatException( "A segment shall not end with a dot ('.') character [M1.9]: " @@ -475,7 +475,7 @@ public String Extension String fragment = this.partNameURI.OriginalString; if (fragment.Length > 0) { - int i = fragment.LastIndexOf(".", StringComparison.Ordinal); + int i = fragment.LastIndexOf('.'); if (i > -1) return fragment.Substring(i + 1); } diff --git a/openxml4Net/OPC/PackageRelationship.cs b/openxml4Net/OPC/PackageRelationship.cs index e1fcb98ff..898ade946 100644 --- a/openxml4Net/OPC/PackageRelationship.cs +++ b/openxml4Net/OPC/PackageRelationship.cs @@ -215,7 +215,7 @@ public Uri TargetUri // Internal target // If it isn't absolute, resolve it relative // to ourselves - if (!targetUri.ToString().StartsWith("/")) + if (!targetUri.ToString().StartsWith('/')) { // So it's a relative part name, try to resolve it return PackagingUriHelper.ResolvePartUri(SourceUri, targetUri); diff --git a/openxml4Net/OPC/PackagingUriHelper.cs b/openxml4Net/OPC/PackagingUriHelper.cs index 09ceb55ee..8accec06b 100644 --- a/openxml4Net/OPC/PackagingUriHelper.cs +++ b/openxml4Net/OPC/PackagingUriHelper.cs @@ -148,7 +148,7 @@ public static Uri ParseUri(string s, UriKind kind) { if (kind == UriKind.Absolute) throw new UriFormatException(); - if (kind == UriKind.RelativeOrAbsolute && s.StartsWith("/")) + if (kind == UriKind.RelativeOrAbsolute && s.StartsWith('/')) kind = UriKind.Relative; } return new Uri(s, kind); @@ -198,7 +198,7 @@ public static String GetFilename(Uri uri) public static String GetFilenameWithoutExtension(Uri uri) { String filename = GetFilename(uri); - int dotIndex = filename.LastIndexOf(".", StringComparison.Ordinal); + int dotIndex = filename.LastIndexOf('.'); if (dotIndex == -1) return filename; return filename.Substring(0, dotIndex); @@ -474,7 +474,7 @@ public static Uri ResolvePartUri(Uri sourcePartUri, Uri targetUri) path = Path.GetDirectoryName(sourcePartUri.OriginalString).Replace("\\", "/"); string targetPath = targetUri.OriginalString; - if (targetPath.StartsWith("#")) + if (targetPath.StartsWith('#')) { path += "/" + Path.GetFileName(sourcePartUri.OriginalString) + targetPath; } @@ -749,10 +749,7 @@ public static String DecodeURI(Uri uri) public static Uri ToUri(String value) { //5. Convert all back slashes to forward slashes - if (value.IndexOf("\\") != -1) - { - value = value.Replace('\\', '/'); - } + value = value.Replace('\\', '/'); // URI fragemnts (those starting with '#') are not encoded // and may contain white spaces and raw unicode characters