Skip to content

Fix DateTime parsing for ISO dates below year 100 and add tests - #69

Merged
GabrielMarquezMatte merged 2 commits into
masterfrom
develop
Aug 10, 2026
Merged

Fix DateTime parsing for ISO dates below year 100 and add tests#69
GabrielMarquezMatte merged 2 commits into
masterfrom
develop

Conversation

@GabrielMarquezMatte

Copy link
Copy Markdown
Owner

This pull request addresses an issue where ISO date strings with years below 100 in t="d" cells caused an OverflowException during Excel file parsing, due to the .NET DateTime.ToOADate limitation. The changes ensure such dates are now treated as plain text instead of causing a crash, and regression tests have been added for this scenario.

Bug fix for ISO date handling:

  • Updated TryParseIsoDate in XlsxReader.Enumerator to return false for parsed dates with a year below 100, preventing OverflowException when converting to OLE Automation dates. Such values are now kept as text.

Testing and documentation:

  • Added regression tests in NamespacePrefixAndIsoDateTests to verify that ISO dates below the OLE Automation range are kept as strings, and that the boundary value (0100-01-01) is still parsed as a date.
  • Updated the fuzzing test corpus documentation to describe the new test case and the fix for this issue.

@codecov-commenter

Copy link
Copy Markdown

⚠️ Please install the 'codecov app svg image' to ensure uploads and comments are reliably processed by Codecov.

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 88.31%. Comparing base (82e950d) to head (6055138).
❗ Your organization needs to install the Codecov GitHub app to enable full functionality.

Additional details and impacted files
@@           Coverage Diff           @@
##           master      #69   +/-   ##
=======================================
  Coverage   88.30%   88.31%           
=======================================
  Files         112      112           
  Lines        7884     7888    +4     
  Branches     1475     1477    +2     
=======================================
+ Hits         6962     6966    +4     
  Misses        648      648           
  Partials      274      274           

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@github-actions

Copy link
Copy Markdown

Benchmark Results

Measured on ubuntu-latest (GitHub Actions). Runner noise may affect absolute numbers; use these for relative comparisons within a PR.

ExcelReader.Benchmarks.ColdStartBenchmark


BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.4 LTS (Noble Numbat)
AMD EPYC 7763 2.45GHz, 1 CPU, 4 logical and 2 physical cores
.NET SDK 10.0.302
  [Host]     : .NET 10.0.10 (10.0.10, 10.0.1026.32716), X64 RyuJIT x86-64-v3
  Job-GOEFXF : .NET 10.0.10 (10.0.10, 10.0.1026.32716), X64 RyuJIT x86-64-v3

InvocationCount=1  IterationCount=1  LaunchCount=16  
RunStrategy=ColdStart  UnrollFactor=1  WarmupCount=0  

Method Rows Mean Error StdDev Allocated
TypedParseFirstUse 200 39.30 ms 1.708 ms 1.678 ms 28.38 KB
RecordWriteFirstUse 200 26.36 ms 0.496 ms 0.487 ms 84.27 KB
FluentParseFirstUse 200 35.84 ms 0.441 ms 0.433 ms 30.75 KB
FluentParseWithAttributeFallbackFirstUse 200 43.00 ms 0.719 ms 0.707 ms 32.45 KB

ExcelReader.Benchmarks.CsvParseBenchmark


BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.4 LTS (Noble Numbat)
Intel Xeon 6973P-C 4.11GHz, 1 CPU, 4 logical and 2 physical cores
.NET SDK 10.0.302
  [Host]     : .NET 10.0.10 (10.0.10, 10.0.1026.32716), X64 RyuJIT x86-64-v4
  Job-MEHJPP : .NET 10.0.10 (10.0.10, 10.0.1026.32716), X64 RyuJIT x86-64-v4

IterationCount=5  WarmupCount=1  

Method Rows Mean Error StdDev Ratio RatioSD Gen0 Gen1 Allocated Alloc Ratio
ExcelParserSync 50000 5.142 ms 0.0300 ms 0.0078 ms 1.00 0.00 46.8750 - 3.86 MB 1.00
ExcelParserAsync 50000 5.140 ms 0.4121 ms 0.1070 ms 1.00 0.02 46.8750 - 3.86 MB 1.00
Sep 50000 8.483 ms 0.7489 ms 0.1945 ms 1.65 0.03 46.8750 - 3.87 MB 1.00
Sylvan 50000 11.127 ms 0.3281 ms 0.0508 ms 2.16 0.01 125.0000 15.6250 10.95 MB 2.84
CsvHelperLib 50000 21.102 ms 0.3349 ms 0.0870 ms 4.10 0.02 156.2500 - 14.41 MB 3.73

ExcelReader.Benchmarks.CsvReadBenchmark


BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.4 LTS (Noble Numbat)
AMD EPYC 9V74 2.87GHz, 1 CPU, 4 logical and 2 physical cores
.NET SDK 10.0.302
  [Host]     : .NET 10.0.10 (10.0.10, 10.0.1026.32716), X64 RyuJIT x86-64-v3
  Job-MEHJPP : .NET 10.0.10 (10.0.10, 10.0.1026.32716), X64 RyuJIT x86-64-v3

IterationCount=5  WarmupCount=1  

Method Rows Mean Error StdDev Ratio RatioSD Gen0 Gen1 Allocated Alloc Ratio
ExcelReader 50000 5.584 ms 0.1028 ms 0.0267 ms 1.00 0.01 - - 352 B 1.00
ExcelReaderWide 50000 14.314 ms 0.2077 ms 0.0539 ms 2.56 0.01 - - 288 B 0.82
ExcelReaderAsync 50000 5.202 ms 0.0067 ms 0.0017 ms 0.93 0.00 - - 424 B 1.20
Sep 50000 11.762 ms 0.0853 ms 0.0132 ms 2.11 0.01 - - 4024 B 11.43
Sylvan 50000 6.191 ms 0.0385 ms 0.0100 ms 1.11 0.01 93.7500 7.8125 1688701 B 4,797.45
CsvHelperLib 50000 33.957 ms 2.4302 ms 0.6311 ms 6.08 0.11 866.6667 66.6667 15073424 B 42,822.23

ExcelReader.Benchmarks.CsvWriteBenchmark


BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.4 LTS (Noble Numbat)
AMD EPYC 9V74 3.69GHz, 1 CPU, 4 logical and 2 physical cores
.NET SDK 10.0.302
  [Host]     : .NET 10.0.10 (10.0.10, 10.0.1026.32716), X64 RyuJIT x86-64-v4
  Job-MEHJPP : .NET 10.0.10 (10.0.10, 10.0.1026.32716), X64 RyuJIT x86-64-v4

IterationCount=5  WarmupCount=1  

Method Rows Mean Error StdDev Ratio RatioSD Gen0 Gen1 Gen2 Allocated Alloc Ratio
ExcelReaderWriter 50000 7.161 ms 0.0447 ms 0.0069 ms 1.00 0.00 500.0000 500.0000 500.0000 4 MB 1.00
Sep 50000 7.633 ms 0.3186 ms 0.0827 ms 1.07 0.01 500.0000 500.0000 500.0000 4.01 MB 1.00
SylvanWriter 50000 7.714 ms 0.3698 ms 0.0960 ms 1.08 0.01 500.0000 500.0000 500.0000 4.04 MB 1.01
CsvHelperLib 50000 15.169 ms 0.5983 ms 0.1554 ms 2.12 0.02 1187.5000 656.2500 593.7500 13.79 MB 3.44

ExcelReader.Benchmarks.ParseBenchmark


BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.4 LTS (Noble Numbat)
Intel Xeon 6973P-C 4.11GHz, 1 CPU, 4 logical and 2 physical cores
.NET SDK 10.0.302
  [Host]     : .NET 10.0.10 (10.0.10, 10.0.1026.32716), X64 RyuJIT x86-64-v4
  Job-MEHJPP : .NET 10.0.10 (10.0.10, 10.0.1026.32716), X64 RyuJIT x86-64-v4

IterationCount=5  WarmupCount=1  

Method Rows Mean Error StdDev Ratio RatioSD Gen0 Allocated Alloc Ratio
ExcelParserSync 50000 16.075 ms 0.0832 ms 0.0129 ms 1.00 0.00 31.2500 3966.75 KB 1.000
ExcelParserSyncSharedStrings 50000 12.451 ms 0.0615 ms 0.0095 ms 0.77 0.00 15.6250 2357.23 KB 0.594
ExcelParserStructSync 50000 14.398 ms 3.4048 ms 0.8842 ms 0.90 0.05 15.6250 1623.02 KB 0.409
RefParserParseNamedSync 50000 12.154 ms 0.1013 ms 0.0263 ms 0.76 0.00 - 11.63 KB 0.003
ExcelParserAsync 50000 15.549 ms 2.7458 ms 0.7131 ms 0.97 0.04 46.8750 3968.9 KB 1.001
ExcelParserXlsbSync 50000 7.484 ms 0.0820 ms 0.0127 ms 0.47 0.00 46.8750 3968.84 KB 1.001
ExcelParserXlsbAsync 50000 7.501 ms 0.1498 ms 0.0232 ms 0.47 0.00 46.8750 3971.41 KB 1.001
MiniExcel 50000 145.048 ms 40.3159 ms 10.4699 ms 9.02 0.60 2000.0000 202523.12 KB 51.055
Sylvan 50000 52.714 ms 0.0996 ms 0.0154 ms 3.28 0.00 100.0000 10726.41 KB 2.704
SylvanAsync 50000 53.153 ms 0.2631 ms 0.0683 ms 3.31 0.00 100.0000 10727.38 KB 2.704

ExcelReader.Benchmarks.ReadBenchmark


BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.4 LTS (Noble Numbat)
AMD EPYC 9V74 2.87GHz, 1 CPU, 4 logical and 2 physical cores
.NET SDK 10.0.302
  [Host]     : .NET 10.0.10 (10.0.10, 10.0.1026.32716), X64 RyuJIT x86-64-v3
  Job-MEHJPP : .NET 10.0.10 (10.0.10, 10.0.1026.32716), X64 RyuJIT x86-64-v3

IterationCount=5  WarmupCount=1  

Method Rows Mean Error StdDev Ratio RatioSD Gen0 Allocated Alloc Ratio
ExcelReader 50000 17.511 ms 0.3063 ms 0.0795 ms 1.00 0.01 - 11.13 KB 1.00
ExcelReaderAsync 50000 16.570 ms 0.0521 ms 0.0135 ms 0.95 0.00 - 13.26 KB 1.19
ExcelReaderXlsb 50000 6.877 ms 0.0447 ms 0.0116 ms 0.39 0.00 - 13.22 KB 1.19
ExcelReaderXlsbAsync 50000 6.995 ms 0.0264 ms 0.0041 ms 0.40 0.00 - 15.77 KB 1.42
ExcelReaderMaterialized 50000 18.121 ms 0.3655 ms 0.0566 ms 1.03 0.01 93.7500 1622.45 KB 145.84
MiniExcel 50000 207.434 ms 9.5295 ms 2.4748 ms 11.85 0.14 13000.0000 214022.13 KB 19,237.94
Sylvan 50000 52.952 ms 2.4456 ms 0.3785 ms 3.02 0.02 100.0000 1939.18 KB 174.31

ExcelReader.Benchmarks.RealDataReadBenchmark


BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.4 LTS (Noble Numbat)
INTEL XEON PLATINUM 8573C 2.30GHz, 1 CPU, 4 logical and 2 physical cores
.NET SDK 10.0.302
  [Host]     : .NET 10.0.10 (10.0.10, 10.0.1026.32716), X64 RyuJIT x86-64-v4
  Job-MEHJPP : .NET 10.0.10 (10.0.10, 10.0.1026.32716), X64 RyuJIT x86-64-v4

IterationCount=5  WarmupCount=1  

Method Mean Error StdDev Ratio RatioSD Gen0 Gen1 Allocated Alloc Ratio
Xlsx_ExcelReader 79.997 ms 3.6618 ms 0.9510 ms 1.00 0.02 - - 18216 B 1.00
Xlsx_Sylvan 234.903 ms 12.8248 ms 3.3306 ms 2.94 0.05 - - 659448 B 36.20
Xlsx_ExcelReader_Materialized 83.005 ms 8.3122 ms 2.1586 ms 1.04 0.03 - - 27912 B 1.53
Xlsx_ExcelReader_Prefetch 52.809 ms 7.3140 ms 1.8994 ms 0.66 0.02 - - 38345 B 2.11
Xlsx_ExcelReader_Memory 81.060 ms 7.5596 ms 1.9632 ms 1.01 0.02 - - 7104 B 0.39
Xlsx_ExcelReader_Memory_Prefetch 49.943 ms 5.0698 ms 0.7846 ms 0.62 0.01 - - 27219 B 1.49
Xlsm_ExcelReader 79.651 ms 2.2061 ms 0.5729 ms 1.00 0.01 - - 18216 B 1.00
Xlsm_Sylvan 239.748 ms 8.2285 ms 2.1369 ms 3.00 0.04 - - 659528 B 36.21
Xlsm_ExcelReader_Materialized 81.088 ms 2.5997 ms 0.6751 ms 1.01 0.01 - - 27912 B 1.53
Xlsm_ExcelReader_Prefetch 51.589 ms 6.9520 ms 1.0758 ms 0.64 0.01 - - 38371 B 2.11
Xlsm_ExcelReader_Memory 79.246 ms 1.3832 ms 0.2141 ms 0.99 0.01 - - 7104 B 0.39
Xlsm_ExcelReader_Memory_Prefetch 51.000 ms 13.3920 ms 2.0724 ms 0.64 0.02 - - 27295 B 1.50
Xlsb_ExcelReader 31.156 ms 1.3063 ms 0.3393 ms 0.39 0.01 - - 19192 B 1.05
Xlsb_Sylvan 36.887 ms 1.7403 ms 0.2693 ms 0.46 0.01 - - 346671 B 19.03
Xlsb_ExcelReader_Materialized 31.180 ms 1.0486 ms 0.1623 ms 0.39 0.00 - - 28888 B 1.59
Xlsb_ExcelReader_Prefetch 22.774 ms 1.5846 ms 0.2452 ms 0.28 0.00 - - 66967 B 3.68
Xlsb_ExcelReader_Memory 30.553 ms 2.2040 ms 0.3411 ms 0.38 0.01 - - 16776 B 0.92
Xlsb_ExcelReader_Memory_Prefetch 22.737 ms 1.1472 ms 0.2979 ms 0.28 0.00 - - 64191 B 3.52
Xls_ExcelReader 15.437 ms 0.2171 ms 0.0564 ms 0.19 0.00 - - 12048 B 0.66
Xls_Sylvan 20.693 ms 0.2347 ms 0.0363 ms 0.26 0.00 - - 190366 B 10.45
Xls_ExcelReader_Materialized 16.485 ms 0.3193 ms 0.0494 ms 0.21 0.00 - - 21744 B 1.19
Xls_ExcelReader_Memory 10.866 ms 0.4276 ms 0.1110 ms 0.14 0.00 - - 12048 B 0.66
Csv_ExcelReader 5.788 ms 0.2499 ms 0.0387 ms 0.07 0.00 - - 288 B 0.02
Csv_Sylvan 15.401 ms 1.1481 ms 0.2982 ms 0.19 0.00 437.5000 46.8750 37483926 B 2,057.75
Csv_ExcelReader_Materialized 25.821 ms 0.6667 ms 0.1731 ms 0.32 0.00 437.5000 - 37442896 B 2,055.49
Csv_ExcelReader_Memory 5.610 ms 0.0672 ms 0.0175 ms 0.07 0.00 - - 224 B 0.01

ExcelReader.Benchmarks.RecordWriteBenchmark


BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.4 LTS (Noble Numbat)
AMD EPYC 9V74 3.69GHz, 1 CPU, 4 logical and 2 physical cores
.NET SDK 10.0.302
  [Host]     : .NET 10.0.10 (10.0.10, 10.0.1026.32716), X64 RyuJIT x86-64-v4
  Job-MEHJPP : .NET 10.0.10 (10.0.10, 10.0.1026.32716), X64 RyuJIT x86-64-v4

IterationCount=5  WarmupCount=1  

Method Rows Mean Error StdDev Ratio Gen0 Gen1 Gen2 Allocated Alloc Ratio
Xlsx 50000 19.618 ms 0.1001 ms 0.0260 ms 1.00 500.0000 500.0000 500.0000 4.02 MB 1.00
Xlsb 50000 7.512 ms 0.0502 ms 0.0130 ms 0.38 500.0000 500.0000 500.0000 4.02 MB 1.00
Xls 50000 5.034 ms 0.0252 ms 0.0065 ms 0.26 273.4375 273.4375 273.4375 4.03 MB 1.00
Csv 50000 7.598 ms 0.0386 ms 0.0100 ms 0.39 500.0000 500.0000 500.0000 4 MB 1.00

ExcelReader.Benchmarks.WriteBenchmark


BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.4 LTS (Noble Numbat)
AMD EPYC 9V74 3.69GHz, 1 CPU, 4 logical and 2 physical cores
.NET SDK 10.0.302
  [Host]     : .NET 10.0.10 (10.0.10, 10.0.1026.32716), X64 RyuJIT x86-64-v4
  Job-MEHJPP : .NET 10.0.10 (10.0.10, 10.0.1026.32716), X64 RyuJIT x86-64-v4

IterationCount=5  WarmupCount=1  

Method Rows Mean Error StdDev Ratio RatioSD Gen0 Gen1 Gen2 Allocated Alloc Ratio
ExcelReaderWriter 50000 17.028 ms 0.4493 ms 0.1167 ms 1.00 0.01 500.0000 500.0000 500.0000 4.02 MB 1.00
ExcelReaderWriterSharedStrings 50000 16.870 ms 0.0666 ms 0.0103 ms 0.99 0.01 500.0000 500.0000 500.0000 4.06 MB 1.01
ExcelReaderWriterPrefetch 50000 15.849 ms 2.4624 ms 0.6395 ms 0.93 0.03 468.7500 468.7500 468.7500 4.03 MB 1.00
ExcelReaderXlsbWriter 50000 7.420 ms 0.0347 ms 0.0090 ms 0.44 0.00 500.0000 500.0000 500.0000 4.02 MB 1.00
ExcelReaderXlsbWriterSharedStrings 50000 6.933 ms 0.0414 ms 0.0107 ms 0.41 0.00 500.0000 500.0000 500.0000 4.06 MB 1.01
ExcelReaderXlsbWriterPrefetch 50000 5.863 ms 0.5550 ms 0.0859 ms 0.34 0.00 492.1875 492.1875 492.1875 4.03 MB 1.00
MiniExcel 50000 76.028 ms 0.5613 ms 0.0869 ms 4.47 0.03 4714.2857 714.2857 714.2857 84.89 MB 21.11
SpreadCheetah 50000 15.694 ms 0.3528 ms 0.0546 ms 0.92 0.01 1437.5000 718.7500 718.7500 15.84 MB 3.94

ExcelReader.Benchmarks.XlsReadBenchmark


BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.4 LTS (Noble Numbat)
AMD EPYC 9V74 2.87GHz, 1 CPU, 4 logical and 2 physical cores
.NET SDK 10.0.302
  [Host]     : .NET 10.0.10 (10.0.10, 10.0.1026.32716), X64 RyuJIT x86-64-v3
  Job-MEHJPP : .NET 10.0.10 (10.0.10, 10.0.1026.32716), X64 RyuJIT x86-64-v3

IterationCount=5  WarmupCount=1  

Method Rows Mean Error StdDev Ratio Gen0 Gen1 Allocated Alloc Ratio
ExcelReader 50000 5.718 ms 0.1836 ms 0.0284 ms 1.00 - - 2.91 KB 1.00
ExcelReaderAsync 50000 5.833 ms 0.1575 ms 0.0244 ms 1.02 - - 2.98 KB 1.02
Sylvan 50000 8.159 ms 0.3834 ms 0.0593 ms 1.43 93.7500 15.6250 1717.73 KB 589.46

ExcelReader.Benchmarks.XlsWriteBenchmark


BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.4 LTS (Noble Numbat)
AMD EPYC 9V74 3.69GHz, 1 CPU, 4 logical and 2 physical cores
.NET SDK 10.0.302
  [Host]     : .NET 10.0.10 (10.0.10, 10.0.1026.32716), X64 RyuJIT x86-64-v4
  Job-MEHJPP : .NET 10.0.10 (10.0.10, 10.0.1026.32716), X64 RyuJIT x86-64-v4

IterationCount=5  WarmupCount=1  

Method Rows Mean Error StdDev Ratio RatioSD Gen0 Gen1 Gen2 Allocated Alloc Ratio
XlsWriter 50000 4.468 ms 0.0502 ms 0.0078 ms 1.00 0.00 492.1875 492.1875 492.1875 16.03 MB 1.00
XlsxWriter 50000 17.120 ms 0.2787 ms 0.0724 ms 3.83 0.02 500.0000 500.0000 500.0000 4.02 MB 0.25

@GabrielMarquezMatte
GabrielMarquezMatte merged commit 9e92e35 into master Aug 10, 2026
19 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants