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 <= condition.
String number = conditionString.Substring(1);
- if(number.StartsWith("="))
+ if(number.StartsWith('='))
{
number = number.Substring(1);
return testNumericCondition(value, Operator.smallerEqualThan, number);
}
- else if(number.StartsWith(">"))
+ 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