diff --git a/ClosedXML/Excel/XLWorkbook_Load.cs b/ClosedXML/Excel/XLWorkbook_Load.cs index da58c0b..7641a16 100644 --- a/ClosedXML/Excel/XLWorkbook_Load.cs +++ b/ClosedXML/Excel/XLWorkbook_Load.cs @@ -68,7 +68,7 @@ SetProperties(dSpreadsheet); SharedStringItem[] sharedStrings = null; - if (dSpreadsheet.WorkbookPart.GetPartsOfType().Count() > 0) + if (dSpreadsheet.WorkbookPart.GetPartsOfType().Any()) { var shareStringPart = dSpreadsheet.WorkbookPart.GetPartsOfType().First(); sharedStrings = shareStringPart.SharedStringTable.Elements().ToArray(); diff --git a/ClosedXML/Utils/XmlEncoder.cs b/ClosedXML/Utils/XmlEncoder.cs index 4219901..3177a12 100644 --- a/ClosedXML/Utils/XmlEncoder.cs +++ b/ClosedXML/Utils/XmlEncoder.cs @@ -1,10 +1,13 @@ using System.Text; +using System.Text.RegularExpressions; using System.Xml; namespace ClosedXML.Utils { public static class XmlEncoder { + private static readonly Regex xHHHHRegex = new Regex("_(x[\\dA-F]{4})_", RegexOptions.Compiled); + /// /// Checks if a character is not allowed to the XML Spec http://www.w3.org/TR/REC-xml/#charsets /// @@ -23,20 +26,23 @@ { if (encodeStr == null) return null; - var newString = new StringBuilder(); + encodeStr = xHHHHRegex.Replace(encodeStr, "_x005F_$1_"); + + var sb = new StringBuilder(encodeStr.Length); foreach (var ch in encodeStr) { if (IsXmlChar(ch)) //this method is new in .NET 4 { - newString.Append(ch); + sb.Append(ch); } else { - newString.Append(XmlConvert.EncodeName(ch.ToString())); + sb.Append(XmlConvert.EncodeName(ch.ToString())); } } - return newString.ToString(); + + return sb.ToString(); } public static string DecodeString(string decodeStr) diff --git a/ClosedXML_Tests/Excel/Saving/SavingTests.cs b/ClosedXML_Tests/Excel/Saving/SavingTests.cs index 60a1d7a..70b4b3d 100644 --- a/ClosedXML_Tests/Excel/Saving/SavingTests.cs +++ b/ClosedXML_Tests/Excel/Saving/SavingTests.cs @@ -2,6 +2,7 @@ using NUnit.Framework; using System.Globalization; using System.IO; +using System.Linq; using System.Threading; namespace ClosedXML_Tests.Excel.Saving @@ -34,11 +35,32 @@ } [Test] + public void CanEscape_xHHHH_Correctly() + { + using (var ms = new MemoryStream()) + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Sheet1"); + ws.FirstCell().Value = "Reserve_TT_A_BLOCAGE_CAG_x6904_2"; + wb.SaveAs(ms); + } + + ms.Seek(0, SeekOrigin.Begin); + + using (var wb = new XLWorkbook(ms)) + { + var ws = wb.Worksheets.First(); + Assert.AreEqual("Reserve_TT_A_BLOCAGE_CAG_x6904_2", ws.FirstCell().Value); + } + } + } + + [Test] public void CanSaveFileMultipleTimesAfterDeletingWorksheet() { // https://github.com/ClosedXML/ClosedXML/issues/435 - using (var ms = new MemoryStream()) { using (XLWorkbook book1 = new XLWorkbook()) @@ -61,7 +83,6 @@ } } - [Test] public void CanSaveAndValidateFileInAnotherCulture() {