diff --git a/ClosedXML/Excel/XLWorkbook_Load.cs b/ClosedXML/Excel/XLWorkbook_Load.cs
index 0362743..e087af4 100644
--- a/ClosedXML/Excel/XLWorkbook_Load.cs
+++ b/ClosedXML/Excel/XLWorkbook_Load.cs
@@ -1068,18 +1068,11 @@
{
if (!XLHelper.IsNullOrWhiteSpace(cell.CellValue.Text))
xlCell._cellValue = Double.Parse(cell.CellValue.Text, XLHelper.NumberStyle, XLHelper.ParseCulture).ToInvariantString();
+
if (s == null)
- {
xlCell._dataType = XLCellValues.Number;
- }
else
- {
- var numberFormatId = ((CellFormat)(s.CellFormats).ElementAt(styleIndex)).NumberFormatId;
- if (numberFormatId == 46U)
- xlCell.DataType = XLCellValues.TimeSpan;
- else
- xlCell._dataType = XLCellValues.Number;
- }
+ xlCell.DataType = GetDataTypeFromCell(xlCell.Style.NumberFormat);
}
}
else if (cell.CellValue != null)
@@ -1093,6 +1086,7 @@
var numberFormatId = ((CellFormat)(s.CellFormats).ElementAt(styleIndex)).NumberFormatId;
if (!XLHelper.IsNullOrWhiteSpace(cell.CellValue.Text))
xlCell._cellValue = Double.Parse(cell.CellValue.Text, CultureInfo.InvariantCulture).ToInvariantString();
+
if (s.NumberingFormats != null &&
s.NumberingFormats.Any(nf => ((NumberingFormat)nf).NumberFormatId.Value == numberFormatId))
{
@@ -1105,15 +1099,7 @@
else
xlCell.Style.NumberFormat.NumberFormatId = Int32.Parse(numberFormatId);
- if (!XLHelper.IsNullOrWhiteSpace(xlCell.Style.NumberFormat.Format))
- xlCell._dataType = GetDataTypeFromFormat(xlCell.Style.NumberFormat.Format);
- else if ((numberFormatId >= 14 && numberFormatId <= 22) ||
- (numberFormatId >= 45 && numberFormatId <= 47))
- xlCell._dataType = XLCellValues.DateTime;
- else if (numberFormatId == 49)
- xlCell._dataType = XLCellValues.Text;
- else
- xlCell._dataType = XLCellValues.Number;
+ xlCell.DataType = GetDataTypeFromCell(xlCell.Style.NumberFormat);
}
}
}
@@ -1378,7 +1364,29 @@
}
}
- private static XLCellValues GetDataTypeFromFormat(String format)
+ private static XLCellValues GetDataTypeFromCell(IXLNumberFormat numberFormat)
+ {
+ var numberFormatId = numberFormat.NumberFormatId;
+ if (numberFormatId == 46U)
+ return XLCellValues.TimeSpan;
+ else if ((numberFormatId >= 14 && numberFormatId <= 22) ||
+ (numberFormatId >= 45 && numberFormatId <= 47))
+ return XLCellValues.DateTime;
+ else if (numberFormatId == 49)
+ return XLCellValues.Text;
+ else
+ {
+ if (!XLHelper.IsNullOrWhiteSpace(numberFormat.Format))
+ {
+ var dataType = GetDataTypeFromFormat(numberFormat.Format);
+ return dataType.HasValue ? dataType.Value : XLCellValues.Number;
+ }
+ else
+ return XLCellValues.Number;
+ }
+ }
+
+ private static XLCellValues? GetDataTypeFromFormat(String format)
{
int length = format.Length;
String f = format.ToLower();
@@ -1392,7 +1400,7 @@
else if (c == 'y' || c == 'm' || c == 'd' || c == 'h' || c == 's')
return XLCellValues.DateTime;
}
- return XLCellValues.Text;
+ return null;
}
private static void LoadAutoFilter(AutoFilter af, XLWorksheet ws)
diff --git a/ClosedXML_Tests/ClosedXML_Tests.csproj b/ClosedXML_Tests/ClosedXML_Tests.csproj
index a1151ff..6f5439f 100644
--- a/ClosedXML_Tests/ClosedXML_Tests.csproj
+++ b/ClosedXML_Tests/ClosedXML_Tests.csproj
@@ -258,6 +258,7 @@
+
diff --git a/ClosedXML_Tests/Excel/Loading/LoadingTests.cs b/ClosedXML_Tests/Excel/Loading/LoadingTests.cs
index 4d74759..d2e7069 100644
--- a/ClosedXML_Tests/Excel/Loading/LoadingTests.cs
+++ b/ClosedXML_Tests/Excel/Loading/LoadingTests.cs
@@ -97,5 +97,25 @@
}
}
}
+
+ ///
+ /// As per https://msdn.microsoft.com/en-us/library/documentformat.openxml.spreadsheet.cellvalues(v=office.15).aspx
+ /// the 'Date' DataType is available only in files saved with Microsoft Office
+ /// In other files, the data type will be saved as numeric
+ /// ClosedXML then deduces the data type by inspecting the number format string
+ ///
+ [Test]
+ public void CanLoadLibreOfficeFileWithDates()
+ {
+ using (var stream = TestHelper.GetStreamFromResource(TestHelper.GetResourcePath(@"Misc\LibreOfficeFileWithDates.xlsx")))
+ using (var wb = new XLWorkbook(stream))
+ {
+ var ws = wb.Worksheets.First();
+ foreach (var cell in ws.CellsUsed())
+ {
+ Assert.AreEqual(XLCellValues.DateTime, cell.DataType);
+ }
+ }
+ }
}
}
diff --git a/ClosedXML_Tests/Resource/Misc/LibreOfficeFileWithDates.xlsx b/ClosedXML_Tests/Resource/Misc/LibreOfficeFileWithDates.xlsx
new file mode 100644
index 0000000..9556636
--- /dev/null
+++ b/ClosedXML_Tests/Resource/Misc/LibreOfficeFileWithDates.xlsx
Binary files differ