Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix semicolon issue for formulas #26

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions Demo/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ static void Main(string[] args)
Demo11();
Demo12();
Demo13();
Demo14();

/* ### PERFORMANCE TESTS ### */
// # Use tests in this section to test the performance of NanoXLSX
Expand Down Expand Up @@ -576,6 +577,13 @@ private static void Demo13()
wb2.Save(); // Save the workbook
}

private static void Demo14()
Copy link
Owner

@rabanti-github rabanti-github Jun 18, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please remove the demo. The feature is a little bit too obscure to designate it as a single demo.
Testing of the feature will be taken into account as a one or some testcase(s) in the new major version which is currently in the dev branch under development.

Alternatively:
Add the line 583 in another demo, where the usage of formulas is shown. Add an appropriate comment to the line in this case (describe what happens with the formula text)

{
Workbook wb = new Workbook("demo14fix.xlsx", "semicolon test"); // Create a new workbook
wb.CurrentWorksheet.AddCellFormula("IF(1=1;42;0)", "A1");
wb.Save();
}

#region Utils
/// <summary>
/// Prints information about the passed cell
Expand Down
13 changes: 11 additions & 2 deletions NanoXLSX/LowLevel/XlsxWriter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -940,7 +940,7 @@ private string CreateRowString(DynamicRow dynamicRow, Worksheet worksheet)
sb.Append("<c r=\"").Append(item.CellAddress).Append("\"").Append(typeDef).Append(styleDef).Append(">");
if (item.DataType == Cell.CellType.FORMULA)
{
sb.Append("<f>").Append(EscapeXmlChars(item.Value.ToString())).Append("</f>");
sb.Append("<f>").Append(EscapeXmlChars(item.Value.ToString(), sanitizeSemicolon: true)).Append("</f>");
}
else
{
Expand Down Expand Up @@ -1469,7 +1469,7 @@ private List<DynamicRow> GetSortedSheetData(Worksheet sheet)
/// <param name="input">Input string to process</param>
/// <returns>Escaped string</returns>
/// <remarks>Note: The XML specs allow characters up to the character value of 0x10FFFF. However, the C# char range is only up to 0xFFFF. NanoXLSX will neglect all values above this level in the sanitizing check. Illegal characters like 0x1 will be replaced with a white space (0x20)</remarks>
public static string EscapeXmlChars(string input)
public static string EscapeXmlChars(string input, bool sanitizeSemicolon = false)
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please add the parameter as documentation entry (between line 1469 and 1470)

{
if (input == null) { return ""; }
int len = input.Length;
Expand Down Expand Up @@ -1499,6 +1499,11 @@ public static string EscapeXmlChars(string input)
illegalCharacters.Add(i);
characterTypes.Add(3);
}
else if (input[i] == 0x3B && sanitizeSemicolon)
{
illegalCharacters.Add(i);
characterTypes.Add(4);
}
}
if (illegalCharacters.Count == 0)
{
Expand Down Expand Up @@ -1527,6 +1532,10 @@ public static string EscapeXmlChars(string input)
{
sb.Append("&amp;");
}
else if (characterTypes[i] == 4 && sanitizeSemicolon) // replace ;
{
sb.Append(",");
}
lastIndex = illegalCharacters[i] + 1;
}
sb.Append(input.Substring(lastIndex));
Expand Down