Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 5 additions & 3 deletions Directory.Build.props
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
<Project>
<PropertyGroup>
<LangVersion>latest</LangVersion>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<Deterministic>true</Deterministic>
<AnalysisLevel>latest</AnalysisLevel>
<AnalysisMode>All</AnalysisMode>
<!-- <TreatWarningsAsErrors>true</TreatWarningsAsErrors> -->
Expand All @@ -19,8 +23,6 @@
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)'=='Release'">
<Optimize>true</Optimize>
<DebugType>none</DebugType>
<DebugSymbols>false</DebugSymbols>
<DefineConstants>$(DefineConstants.Replace("DEBUG;", ""))</DefineConstants>
<DefineConstants>$(DefineConstants.Replace("TRACE;", ""))</DefineConstants>
</PropertyGroup>
Expand Down Expand Up @@ -82,4 +84,4 @@
<PrivateAssets>all</PrivateAssets>
</PackageReference>
</ItemGroup>
</Project>
</Project>
39 changes: 39 additions & 0 deletions src/ExcelReader.Core/ExcelEpoch.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
namespace ExcelReader.Core
{
// Excel reserves serial 60 for the fictitious 1900-02-29; OADate does not. Keep this conversion
// shared so the binary writers and the public Cell date reader cannot drift at the boundary.
internal static class ExcelEpoch
{
internal static double SerialToOADate(double serial, bool date1904)
{
if (date1904)
{
return serial + 1462.0;
}
return serial switch
{
< 60.0 => serial + 1.0,
60.0 => 60.0,
_ => serial,
};
}

internal static double OADateToSerial(double oadate, bool date1904)
{
double serial = oadate;
if (date1904)
{
serial -= 1462.0;
}
else if (oadate < 61.0)
{
serial--;
}
if (serial < 0)
{
throw new ArgumentOutOfRangeException(nameof(oadate), "Dates before the workbook epoch cannot be written to Excel.");
}
return serial;
}
}
}
5 changes: 1 addition & 4 deletions src/ExcelReader.Core/ExcelReader.Core.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,7 @@

<PropertyGroup>
<TargetFrameworks>net10.0;net8.0</TargetFrameworks>
<LangVersion>latest</LangVersion>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>

<!-- Ship XML docs (members without a doc comment do not warn). -->
<GenerateDocumentationFile>true</GenerateDocumentationFile>
Expand Down Expand Up @@ -34,7 +32,6 @@
<DebugType>portable</DebugType>
<PublishRepositoryUrl>true</PublishRepositoryUrl>
<EmbedUntrackedSources>true</EmbedUntrackedSources>
<Deterministic>true</Deterministic>
<ContinuousIntegrationBuild Condition="'$(GITHUB_ACTIONS)' == 'true'">true</ContinuousIntegrationBuild>
</PropertyGroup>

Expand Down
8 changes: 4 additions & 4 deletions src/ExcelReader.Core/Parser/ExcelParser.cs
Original file line number Diff line number Diff line change
Expand Up @@ -33,10 +33,10 @@ public ExcelEnumerable<T> Parse(XlsxReader reader)

[SuppressMessage("Usage", "VSTHRD200:Use \"Async\" suffix for async methods",
Justification = "Synchronous entry point; the enumerable also implements IAsyncEnumerable, but ParseAsync is the async counterpart.")]
public XlsExcelEnumerable<T> Parse(XlsReader reader)
public ExcelEnumerable<T, XlsReader, XlsReader.Enumerator> Parse(XlsReader reader)
{
ArgumentNullException.ThrowIfNull(reader);
return new XlsExcelEnumerable<T>(reader, _config);
return new ExcelEnumerable<T, XlsReader, XlsReader.Enumerator>(reader, _config);
}

[SuppressMessage("Usage", "VSTHRD200:Use \"Async\" suffix for async methods",
Expand Down Expand Up @@ -75,10 +75,10 @@ public ExcelEnumerable<T> ParseAsync(XlsxReader reader, CancellationToken ct = d
return new ExcelEnumerable<T>(reader, _config, ct);
}

public XlsExcelEnumerable<T> ParseAsync(XlsReader reader, CancellationToken ct = default)
public ExcelEnumerable<T, XlsReader, XlsReader.Enumerator> ParseAsync(XlsReader reader, CancellationToken ct = default)
{
ArgumentNullException.ThrowIfNull(reader);
return new XlsExcelEnumerable<T>(reader, _config, ct);
return new ExcelEnumerable<T, XlsReader, XlsReader.Enumerator>(reader, _config, ct);
}

public ExcelEnumerable<T, XlsbReader, XlsbReader.Enumerator> ParseAsync(XlsbReader reader, CancellationToken ct = default)
Expand Down
Loading
Loading