From c289b82cd90d10ea0d3811b6db06176ecef5ebbe Mon Sep 17 00:00:00 2001 From: Jay Hemnani <193022578+jayhemnani9910@users.noreply.github.com> Date: Sat, 14 Nov 2026 01:47:56 +0530 Subject: [PATCH] Round imported TimeSpan values to milliseconds like dates TimeSpan.FromDays truncates to whole ticks, so a duration cell of 11 seconds was read as 00:00:10.9999999. DateTime cells already round to milliseconds through FromOADate. --- src/MiniExcel.OpenXml/Styles/OpenXmlStyles.cs | 2 +- .../Main/MiniExcelOpenXmlImporterTests.cs | 10 ++++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/MiniExcel.OpenXml/Styles/OpenXmlStyles.cs b/src/MiniExcel.OpenXml/Styles/OpenXmlStyles.cs index 342bb200..28d7c81a 100644 --- a/src/MiniExcel.OpenXml/Styles/OpenXmlStyles.cs +++ b/src/MiniExcel.OpenXml/Styles/OpenXmlStyles.cs @@ -192,7 +192,7 @@ internal static async Task CreateAsync(OpenXmlZip zip, Cancellati return DateTimeHelper.IsValidOADateTime(number) ? DateTime.FromOADate(number) : value; if (sf.Type == typeof(TimeSpan?)) - return TimeSpan.FromDays(number); + return TimeSpan.FromMilliseconds(Math.Round(number * 86400000d)); return value; } diff --git a/tests/MiniExcel.OpenXml.Tests/Main/MiniExcelOpenXmlImporterTests.cs b/tests/MiniExcel.OpenXml.Tests/Main/MiniExcelOpenXmlImporterTests.cs index 302a2363..3be2fccf 100644 --- a/tests/MiniExcel.OpenXml.Tests/Main/MiniExcelOpenXmlImporterTests.cs +++ b/tests/MiniExcel.OpenXml.Tests/Main/MiniExcelOpenXmlImporterTests.cs @@ -369,6 +369,16 @@ public void TrimColumnNamesTest() Assert.Equal(8209.76m, rows[4].Points); } + [Fact] + public void TimeSpanKeepsWholeSeconds() + { + using var path = AutoDeletingPath.Create(); + MiniExcelV2.Exporters.GetOpenXmlExporter().Export(path.ToString(), new[] { new { Duration = TimeSpan.FromSeconds(11) } }); + + var row = _excelImporter.Query(path.ToString(), true).First(); + Assert.Equal(TimeSpan.FromSeconds(11), (TimeSpan)row.Duration); + } + [Fact] public void TestDatetimeSpanFormat_ClosedXml() {