From 9a2e28eccb67ef7180c57ef0af0875f71fc1658f Mon Sep 17 00:00:00 2001 From: Michele Bastione Date: Wed, 12 Nov 2025 22:49:49 +0100 Subject: [PATCH 1/3] Refactoring for the release of .NET 10 and VS18 - Updating target frameworks, packages, tests and workflows. - Migrating the solution file to new .slnx format. --- .github/workflows/benchmark.yml | 12 ++-- .github/workflows/codeql-analysis.yml | 21 +++--- .github/workflows/dotnet.yml | 6 +- MiniExcel.sln | 70 ------------------ MiniExcel.slnx | 29 ++++++++ .../MiniExcel.Benchmarks.csproj | 4 +- src/MiniExcel/MiniExcelLibs.csproj | 6 +- .../MiniExcelIssueAsyncTests.cs | 4 +- tests/MiniExcelTests/MiniExcelIssueTests.cs | 12 ++-- tests/MiniExcelTests/MiniExcelOpenXmlTests.cs | 72 +++++++++---------- tests/MiniExcelTests/MiniExcelTests.csproj | 10 +-- 11 files changed, 104 insertions(+), 142 deletions(-) delete mode 100644 MiniExcel.sln create mode 100644 MiniExcel.slnx diff --git a/.github/workflows/benchmark.yml b/.github/workflows/benchmark.yml index d5b6c119..641d8cb6 100644 --- a/.github/workflows/benchmark.yml +++ b/.github/workflows/benchmark.yml @@ -17,7 +17,7 @@ jobs: - name: Setup .NET uses: actions/setup-dotnet@v4 with: - dotnet-version: 9.0.x + dotnet-version: 10.0.x - name: Restore dependencies run: dotnet restore working-directory: ./benchmarks/MiniExcel.Benchmarks @@ -25,7 +25,7 @@ jobs: run: dotnet build --no-restore working-directory: ./benchmarks/MiniExcel.Benchmarks - name: Benchmark - run: dotnet run -c Release -f net9.0 + run: dotnet run -c Release -f net10.0 working-directory: ./benchmarks/MiniExcel.Benchmarks env: BenchmarkMode: Automatic @@ -47,7 +47,7 @@ jobs: - name: Setup .NET uses: actions/setup-dotnet@v4 with: - dotnet-version: 9.0.x + dotnet-version: 10.0.x - name: Restore dependencies run: dotnet restore working-directory: ./benchmarks/MiniExcel.Benchmarks @@ -55,7 +55,7 @@ jobs: run: dotnet build --no-restore working-directory: ./benchmarks/MiniExcel.Benchmarks - name: Benchmark - run: dotnet run -c Release -f net9.0 + run: dotnet run -c Release -f net10.0 working-directory: ./benchmarks/MiniExcel.Benchmarks env: BenchmarkMode: Automatic @@ -77,7 +77,7 @@ jobs: - name: Setup .NET uses: actions/setup-dotnet@v4 with: - dotnet-version: 9.0.x + dotnet-version: 10.0.x - name: Restore dependencies run: dotnet restore working-directory: ./benchmarks/MiniExcel.Benchmarks @@ -85,7 +85,7 @@ jobs: run: dotnet build --no-restore working-directory: ./benchmarks/MiniExcel.Benchmarks - name: Benchmark - run: dotnet run -c Release -f net9.0 + run: dotnet run -c Release -f net10.0 working-directory: ./benchmarks/MiniExcel.Benchmarks env: BenchmarkMode: Automatic diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 86ec56e9..9f1b0405 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -13,10 +13,10 @@ name: "CodeQL" on: push: - branches: [ master ] + branches: [ v1.x-maintenance ] pull_request: # The branches below must be a subset of the branches above - branches: [ master ] + branches: [ v1.x-maintenance ] schedule: - cron: '18 0 * * 0' @@ -40,10 +40,10 @@ jobs: - name: Checkout repository uses: actions/checkout@v4 - - name: Setup .NET 9 - uses: actions/setup-dotnet@v1 + - name: Setup .NET 10 + uses: actions/setup-dotnet@v4 with: - dotnet-version: 9.0.x + dotnet-version: 10.0.x # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL @@ -57,8 +57,8 @@ jobs: # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). # If this step fails, then you should remove it and run the build manually (see below) - - name: Autobuild - uses: github/codeql-action/autobuild@v3 +# - name: Autobuild +# uses: github/codeql-action/autobuild@v3 # ℹ️ Command-line programs to run using the OS shell. # 📚 https://git.io/JvXDl @@ -67,9 +67,8 @@ jobs: # and modify them (or add more) to build your code if your project # uses a compiled language - #- run: | - # make bootstrap - # make release - + - name: Manual build + run: dotnet build MiniExcel.slnx --no-restore --configuration Release + - name: Perform CodeQL Analysis uses: github/codeql-action/analyze@v3 diff --git a/.github/workflows/dotnet.yml b/.github/workflows/dotnet.yml index 5cf65e17..1c404fb6 100644 --- a/.github/workflows/dotnet.yml +++ b/.github/workflows/dotnet.yml @@ -4,7 +4,7 @@ on: pull_request: push: branches: - - master + - v1.x-maintenance jobs: build: @@ -21,6 +21,10 @@ jobs: uses: actions/setup-dotnet@v4 with: dotnet-version: 9.0.x + - name: Setup .NET 10 + uses: actions/setup-dotnet@v4 + with: + dotnet-version: 10.0.x - name: Restore dependencies run: dotnet restore env: diff --git a/MiniExcel.sln b/MiniExcel.sln deleted file mode 100644 index 8d3d52f2..00000000 --- a/MiniExcel.sln +++ /dev/null @@ -1,70 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 17 -VisualStudioVersion = 17.0.31903.59 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MiniExcelLibs", "src\MiniExcel\MiniExcelLibs.csproj", "{097903C9-1F81-4427-B4C8-530CB59687B8}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Docs and setting", "Docs and setting", "{2AFABF2E-D6C3-4983-B43A-76ADA2BB2876}" - ProjectSection(SolutionItems) = preProject - .gitattributes = .gitattributes - .gitignore = .gitignore - appveyor.yml = appveyor.yml - .github\workflows\dotnet.yml = .github\workflows\dotnet.yml - LICENSE = LICENSE - README-NuGet.md = README-NuGet.md - README.md = README.md - README.zh-CN.md = README.zh-CN.md - README.zh-Hant.md = README.zh-Hant.md - .github\workflows\benchmark.yml = .github\workflows\benchmark.yml - .github\workflows\codeql-analysis.yml = .github\workflows\codeql-analysis.yml - EndProjectSection -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{CC1E0601-AEC9-42D7-8F6A-3FB3939EED16}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{359A7094-3353-48F2-B3E1-FE9E59698318}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Releases", "Releases", "{3E370222-8E9E-45E8-8DCD-E5F41EE52A39}" - ProjectSection(SolutionItems) = preProject - docs\README.md = docs\README.md - docs\README.zh-CN.md = docs\README.zh-CN.md - docs\README.zh-Hant.md = docs\README.zh-Hant.md - EndProjectSection -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MiniExcelTests", "tests\MiniExcelTests\MiniExcelTests.csproj", "{77F2C86B-0F17-4370-AB38-A089F9DF4ED5}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "benchmarks", "benchmarks", "{77A8A169-168B-457F-AB5F-48F30D6BB33C}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MiniExcel.Benchmarks", "benchmarks\MiniExcel.Benchmarks\MiniExcel.Benchmarks.csproj", "{F1BDF4D7-F3C4-4114-82F6-EF81567DFBD8}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {097903C9-1F81-4427-B4C8-530CB59687B8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {097903C9-1F81-4427-B4C8-530CB59687B8}.Debug|Any CPU.Build.0 = Debug|Any CPU - {097903C9-1F81-4427-B4C8-530CB59687B8}.Release|Any CPU.ActiveCfg = Release|Any CPU - {097903C9-1F81-4427-B4C8-530CB59687B8}.Release|Any CPU.Build.0 = Release|Any CPU - {77F2C86B-0F17-4370-AB38-A089F9DF4ED5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {77F2C86B-0F17-4370-AB38-A089F9DF4ED5}.Debug|Any CPU.Build.0 = Debug|Any CPU - {77F2C86B-0F17-4370-AB38-A089F9DF4ED5}.Release|Any CPU.ActiveCfg = Release|Any CPU - {77F2C86B-0F17-4370-AB38-A089F9DF4ED5}.Release|Any CPU.Build.0 = Release|Any CPU - {F1BDF4D7-F3C4-4114-82F6-EF81567DFBD8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F1BDF4D7-F3C4-4114-82F6-EF81567DFBD8}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F1BDF4D7-F3C4-4114-82F6-EF81567DFBD8}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F1BDF4D7-F3C4-4114-82F6-EF81567DFBD8}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(NestedProjects) = preSolution - {097903C9-1F81-4427-B4C8-530CB59687B8} = {CC1E0601-AEC9-42D7-8F6A-3FB3939EED16} - {77F2C86B-0F17-4370-AB38-A089F9DF4ED5} = {359A7094-3353-48F2-B3E1-FE9E59698318} - {F1BDF4D7-F3C4-4114-82F6-EF81567DFBD8} = {77A8A169-168B-457F-AB5F-48F30D6BB33C} - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {51DF25DA-2DCB-4883-90FE-399DA950D4F2} - EndGlobalSection -EndGlobal diff --git a/MiniExcel.slnx b/MiniExcel.slnx new file mode 100644 index 00000000..bd86cdee --- /dev/null +++ b/MiniExcel.slnx @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/benchmarks/MiniExcel.Benchmarks/MiniExcel.Benchmarks.csproj b/benchmarks/MiniExcel.Benchmarks/MiniExcel.Benchmarks.csproj index e986cd38..f0d218a1 100644 --- a/benchmarks/MiniExcel.Benchmarks/MiniExcel.Benchmarks.csproj +++ b/benchmarks/MiniExcel.Benchmarks/MiniExcel.Benchmarks.csproj @@ -2,7 +2,7 @@ Exe - net8.0;net9.0 + net8.0;net9.0;net10.0 enable enable latest @@ -16,7 +16,7 @@ - + diff --git a/src/MiniExcel/MiniExcelLibs.csproj b/src/MiniExcel/MiniExcelLibs.csproj index 24bfcf5e..a333fb8f 100644 --- a/src/MiniExcel/MiniExcelLibs.csproj +++ b/src/MiniExcel/MiniExcelLibs.csproj @@ -1,6 +1,6 @@  - net45;netstandard2.0;net8.0;net9.0 + net45;netstandard2.0;net8.0;net9.0;net10.0 1.41.4 @@ -50,9 +50,9 @@ Todo : https://github.com/mini-software/MiniExcel/projects/1?fullscreen=true - + - + diff --git a/tests/MiniExcelTests/MiniExcelIssueAsyncTests.cs b/tests/MiniExcelTests/MiniExcelIssueAsyncTests.cs index 62b41a9e..67c25566 100644 --- a/tests/MiniExcelTests/MiniExcelIssueAsyncTests.cs +++ b/tests/MiniExcelTests/MiniExcelIssueAsyncTests.cs @@ -1324,7 +1324,7 @@ public async Task Issue142() Assert.Equal("MyProperty5", rows[0].C); Assert.Equal("MyProperty2", rows[0].D); Assert.Equal("MyProperty6", rows[0].E); - Assert.Equal(null, rows[0].F); + Assert.Null(rows[0].F); Assert.Equal("MyProperty3", rows[0].G); Assert.Equal("MyProperty4", rows[0].A); @@ -1332,7 +1332,7 @@ public async Task Issue142() Assert.Equal("MyProperty5", rows[0].C); Assert.Equal("MyProperty2", rows[0].D); Assert.Equal("MyProperty6", rows[0].E); - Assert.Equal(null, rows[0].F); + Assert.Null(rows[0].F); Assert.Equal("MyProperty3", rows[0].G); } diff --git a/tests/MiniExcelTests/MiniExcelIssueTests.cs b/tests/MiniExcelTests/MiniExcelIssueTests.cs index 6dc8ded0..0cf4a112 100644 --- a/tests/MiniExcelTests/MiniExcelIssueTests.cs +++ b/tests/MiniExcelTests/MiniExcelIssueTests.cs @@ -3067,7 +3067,7 @@ public void Issue142() Assert.Equal("MyProperty5", rows[0].C); Assert.Equal("MyProperty2", rows[0].D); Assert.Equal("MyProperty6", rows[0].E); - Assert.Equal(null, rows[0].F); + Assert.Null(rows[0].F); Assert.Equal("MyProperty3", rows[0].G); Assert.Equal("MyProperty4", rows[0].A); @@ -3075,7 +3075,7 @@ public void Issue142() Assert.Equal("MyProperty5", rows[0].C); Assert.Equal("MyProperty2", rows[0].D); Assert.Equal("MyProperty6", rows[0].E); - Assert.Equal(null, rows[0].F); + Assert.Null(rows[0].F); Assert.Equal("MyProperty3", rows[0].G); } @@ -4235,7 +4235,7 @@ public void TestIssue763() var path = PathHelper.GetFile("xlsx/TestIssue763.xlsx"); var rows = MiniExcel.QueryRange(path, startCell: "A3", endCell: "J3").ToArray(); Assert.Equal("A3", rows[0].A); - Assert.Equal(null, rows[0].J); + Assert.Null(rows[0].J); } /// @@ -4330,8 +4330,8 @@ public void TestIssue771() var rows = MiniExcel.Query(path.FilePath).ToList(); Assert.Equal("2025-1", rows[2].B); - Assert.Equal(null, rows[3].B); - Assert.Equal(null, rows[4].B); + Assert.Null(rows[3].B); + Assert.Null(rows[4].B); Assert.Equal("2025-2", rows[5].B); return; @@ -4658,7 +4658,7 @@ public void TestIssue809() var rows = MiniExcel.Query(path).ToList(); Assert.Equal(3, rows.Count); - Assert.Equal(null, rows[0].A); + Assert.Null(rows[0].A); Assert.Equal(2, rows[2].B); } diff --git a/tests/MiniExcelTests/MiniExcelOpenXmlTests.cs b/tests/MiniExcelTests/MiniExcelOpenXmlTests.cs index 005e035d..47001a2a 100644 --- a/tests/MiniExcelTests/MiniExcelOpenXmlTests.cs +++ b/tests/MiniExcelTests/MiniExcelOpenXmlTests.cs @@ -204,28 +204,28 @@ public void CenterEmptyRowsQueryTest() Assert.Equal("d", rows[0].D); Assert.Equal(1, rows[1].A); - Assert.Equal(null, rows[1].B); + Assert.Null(rows[1].B); Assert.Equal(3, rows[1].C); - Assert.Equal(null, rows[1].D); + Assert.Null(rows[1].D); - Assert.Equal(null, rows[2].A); + Assert.Null(rows[2].A); Assert.Equal(2, rows[2].B); - Assert.Equal(null, rows[2].C); + Assert.Null(rows[2].C); Assert.Equal(4, rows[2].D); - Assert.Equal(null, rows[3].A); - Assert.Equal(null, rows[3].B); - Assert.Equal(null, rows[3].C); - Assert.Equal(null, rows[3].D); + Assert.Null(rows[3].A); + Assert.Null(rows[3].B); + Assert.Null(rows[3].C); + Assert.Null(rows[3].D); Assert.Equal(1, rows[4].A); - Assert.Equal(null, rows[4].B); + Assert.Null(rows[4].B); Assert.Equal(3, rows[4].C); - Assert.Equal(null, rows[4].D); + Assert.Null(rows[4].D); - Assert.Equal(null, rows[5].A); + Assert.Null(rows[5].A); Assert.Equal(2, rows[5].B); - Assert.Equal(null, rows[5].C); + Assert.Null(rows[5].C); Assert.Equal(4, rows[5].D); } @@ -234,28 +234,28 @@ public void CenterEmptyRowsQueryTest() var rows = stream.Query(useHeaderRow: true).ToList(); Assert.Equal(1, rows[0].a); - Assert.Equal(null, rows[0].b); + Assert.Null(rows[0].b); Assert.Equal(3, rows[0].c); - Assert.Equal(null, rows[0].d); + Assert.Null(rows[0].d); - Assert.Equal(null, rows[1].a); + Assert.Null(rows[1].a); Assert.Equal(2, rows[1].b); - Assert.Equal(null, rows[1].c); + Assert.Null(rows[1].c); Assert.Equal(4, rows[1].d); - Assert.Equal(null, rows[2].a); - Assert.Equal(null, rows[2].b); - Assert.Equal(null, rows[2].c); - Assert.Equal(null, rows[2].d); + Assert.Null(rows[2].a); + Assert.Null(rows[2].b); + Assert.Null(rows[2].c); + Assert.Null(rows[2].d); Assert.Equal(1, rows[3].a); - Assert.Equal(null, rows[3].b); + Assert.Null(rows[3].b); Assert.Equal(3, rows[3].c); - Assert.Equal(null, rows[3].d); + Assert.Null(rows[3].d); - Assert.Equal(null, rows[4].a); + Assert.Null(rows[4].a); Assert.Equal(2, rows[4].b); - Assert.Equal(null, rows[4].c); + Assert.Null(rows[4].c); Assert.Equal(4, rows[4].d); } } @@ -267,15 +267,15 @@ public void TestEmptyRowsQuerySelfClosingTag() using var stream = File.OpenRead(path); var rows = stream.Query().ToList(); - Assert.Equal(null, rows[0].A); + Assert.Null(rows[0].A); Assert.Equal(1, rows[1].A); - Assert.Equal(null, rows[2].A); + Assert.Null(rows[2].A); Assert.Equal(2, rows[3].A); - Assert.Equal(null, rows[4].A); - Assert.Equal(null, rows[5].A); - Assert.Equal(null, rows[6].A); - Assert.Equal(null, rows[7].A); - Assert.Equal(null, rows[8].A); + Assert.Null(rows[4].A); + Assert.Null(rows[5].A); + Assert.Null(rows[6].A); + Assert.Null(rows[7].A); + Assert.Null(rows[8].A); Assert.Equal(1, rows[9].A); } @@ -500,9 +500,9 @@ public void QuerySheetWithoutRAttribute() Assert.Equal(5, keys.Count); Assert.Equal(1, rows[0].A); - Assert.Equal(null, rows[0].C); - Assert.Equal(null, rows[0].D); - Assert.Equal(null, rows[0].E); + Assert.Null(rows[0].C); + Assert.Null(rows[0].D); + Assert.Null(rows[0].E); Assert.Equal(1, rows[1].A); Assert.Equal("\"<>+}{\\nHello World", rows[1].B); @@ -669,8 +669,8 @@ public void SaveAsFileWithDimension() Assert.Equal(2, rows.Count); Assert.Equal(@"""<>+-*//}{\\n", rows[0].a); Assert.Equal(1234567890, rows[0].b); - Assert.Equal(null, rows[0].c); - Assert.Equal(null, rows[0].d); + Assert.Null(rows[0].c); + Assert.Null(rows[0].d); } using (var stream = File.OpenRead(path)) diff --git a/tests/MiniExcelTests/MiniExcelTests.csproj b/tests/MiniExcelTests/MiniExcelTests.csproj index e4fc08c7..7b7102d5 100644 --- a/tests/MiniExcelTests/MiniExcelTests.csproj +++ b/tests/MiniExcelTests/MiniExcelTests.csproj @@ -1,7 +1,7 @@  - net8.0 + net10.0 enable enable @@ -20,12 +20,12 @@ - + - - - + + + runtime; build; native; contentfiles; analyzers; buildtransitive all From c3495a92bdac73628cfcddad94026c082dbe02ab Mon Sep 17 00:00:00 2001 From: Michele Bastione Date: Fri, 14 Nov 2025 20:00:15 +0100 Subject: [PATCH 2/3] Updated build command for CodeQL analysis Signed-off-by: Michele Bastione --- .github/workflows/codeql-analysis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 9f1b0405..e7eb5f3b 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -68,7 +68,7 @@ jobs: # uses a compiled language - name: Manual build - run: dotnet build MiniExcel.slnx --no-restore --configuration Release + run: dotnet build MiniExcel.slnx --no-restore -c Release -f net10.0 - name: Perform CodeQL Analysis uses: github/codeql-action/analyze@v3 From 610fca2b902316c5a42e24bc6ddf45fbf3261a16 Mon Sep 17 00:00:00 2001 From: Michele Bastione Date: Fri, 14 Nov 2025 20:04:34 +0100 Subject: [PATCH 3/3] Remove no-restore flag from dotnet build command Signed-off-by: Michele Bastione --- .github/workflows/codeql-analysis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index e7eb5f3b..62fdbe71 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -68,7 +68,7 @@ jobs: # uses a compiled language - name: Manual build - run: dotnet build MiniExcel.slnx --no-restore -c Release -f net10.0 + run: dotnet build MiniExcel.slnx -c Release -f net10.0 - name: Perform CodeQL Analysis uses: github/codeql-action/analyze@v3