diff --git a/ClosedXML/Excel/Cells/XLCell.cs b/ClosedXML/Excel/Cells/XLCell.cs index 4b1b6a3..73bceb3 100644 --- a/ClosedXML/Excel/Cells/XLCell.cs +++ b/ClosedXML/Excel/Cells/XLCell.cs @@ -333,7 +333,8 @@ if (_dataType == XLCellValues.DateTime || IsDateFormat()) { double dTest; - if (Double.TryParse(cValue, XLHelper.NumberStyle, XLHelper.ParseCulture, out dTest)) + if (Double.TryParse(cValue, XLHelper.NumberStyle, XLHelper.ParseCulture, out dTest) + && dTest.IsValidOADateNumber()) { var format = GetFormat(); return DateTime.FromOADate(dTest).ToString(format); @@ -405,15 +406,25 @@ return cellValue != "0"; if (_dataType == XLCellValues.DateTime) - return DateTime.FromOADate(Double.Parse(cellValue, XLHelper.NumberStyle, XLHelper.ParseCulture)); + { + Double d; + if (Double.TryParse(cellValue, XLHelper.NumberStyle, XLHelper.ParseCulture, out d) + && d.IsValidOADateNumber()) + return DateTime.FromOADate(d); + } if (_dataType == XLCellValues.Number) - return Double.Parse(cellValue, XLHelper.NumberStyle, XLHelper.ParseCulture); + { + Double d; + if (double.TryParse(cellValue, XLHelper.NumberStyle, XLHelper.ParseCulture, out d)) + return d; + } if (_dataType == XLCellValues.TimeSpan) { - // return (DateTime.FromOADate(Double.Parse(cellValue)) - baseDate); - return TimeSpan.Parse(cellValue); + TimeSpan t; + if (TimeSpan.TryParse(cellValue, out t)) + return t; } return cellValue; diff --git a/ClosedXML/XLHelper.cs b/ClosedXML/XLHelper.cs index 8729fef..83d2434 100644 --- a/ClosedXML/XLHelper.cs +++ b/ClosedXML/XLHelper.cs @@ -291,7 +291,7 @@ } // handle doubles - if (v is double) + if (v is double && ((double)v).IsValidOADateNumber()) { return DateTime.FromOADate((double)v); } @@ -299,5 +299,10 @@ // handle everything else return (DateTime)Convert.ChangeType(v, typeof(DateTime)); } + + internal static bool IsValidOADateNumber(this double d) + { + return -657435 <= d && d < 2958466; + } } } diff --git a/ClosedXML_Tests/Excel/Cells/XLCellTests.cs b/ClosedXML_Tests/Excel/Cells/XLCellTests.cs index 750af3a..d6824df 100644 --- a/ClosedXML_Tests/Excel/Cells/XLCellTests.cs +++ b/ClosedXML_Tests/Excel/Cells/XLCellTests.cs @@ -210,6 +210,28 @@ } [Test] + public void TryGetValue_DateTime_BadString() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + DateTime outValue; + var date = "ABC"; + bool success = ws.Cell("A1").SetValue(date).TryGetValue(out outValue); + Assert.IsFalse(success); + } + + + [Test] + public void TryGetValue_DateTime_BadString2() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + DateTime outValue; + var date = 5545454; + ws.FirstCell().SetValue(date).DataType = XLCellValues.DateTime; + bool success = ws.FirstCell().TryGetValue(out outValue); + Assert.IsFalse(success); + } + + [Test] public void TryGetValue_RichText_Bad() { IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1");