From 5db498688a4e8ba144f3b7237b7ebf7ae40c2757 Mon Sep 17 00:00:00 2001 From: Michele Bastione Date: Sun, 29 Jun 2025 22:17:56 +0200 Subject: [PATCH 01/26] Separating into 3 assemblies, changing namespaces, renaming main APIs, adding Directory.Build.props, and general refactoring --- .github/workflows/benchmark.yml | 1 + LICENSE | 13 +- MiniExcel.sln | 16 +- .../MiniExcel.Benchmarks/BenchmarkBase.cs | 2 +- .../{Config.cs => BenchmarkConfig.cs} | 8 +- .../BenchmarkSections/CreateXlsxBenchmark.cs | 7 +- .../BenchmarkSections/QueryXlsxBenchmark.cs | 7 +- .../TemplateXlsxBenchmark.cs | 7 +- .../BenchmarkSections/XlsxAsyncBenchmark.cs | 10 +- .../MiniExcel.Benchmarks.csproj | 5 +- benchmarks/MiniExcel.Benchmarks/Program.cs | 8 +- .../Utils/AutoDeletingPath.cs | 2 +- .../MiniExcel.Benchmarks/Utils/Extensions.cs | 2 +- src/Directory.Build.props | 25 + .../Attributes/ExcelIgnoreAttribute.cs | 9 - src/MiniExcel/ExcelFactory.cs | 57 - src/MiniExcel/ExcelType.cs | 12 - .../Exporter/MiniExcelExporter.Csv.cs | 93 ++ .../Exporter/MiniExcelExporter.OpenXml.cs | 78 ++ .../Importer/MiniExcelImporter.Csv.cs | 180 ++++ .../Importer/MiniExcelImporter.OpenXml.cs | 305 ++++++ src/MiniExcel/MiniExcel.cs | 426 +------- src/MiniExcel/MiniExcel.csproj | 41 + src/MiniExcel/MiniExcelLibs.csproj | 63 -- src/MiniExcel/OpenXml/ExcelOpenXmlUtils.cs | 112 -- src/MiniExcel/OpenXml/TableStyles.cs | 7 - src/MiniExcel/Properties/AssemblyInfo.cs | 7 - .../SaveByTemplate/IInputValueExtractor.cs | 8 - .../Templater/MiniExcelTemplater.OpenXml.cs | 70 ++ src/MiniExcel/Utils/ExcelTypeHelper.cs | 44 - src/MiniExcel/Utils/StringHelper.cs | 80 -- src/MiniExcel/Utils/TypeHelper.cs | 227 ---- .../IAsyncMiniExcelWriteAdapter.cs | 13 - .../WriteAdapter/IMiniExcelWriteAdapter.cs | 19 - .../Abstractions/IInputValueExtractor.cs | 6 + .../Abstractions}/IMiniExcelDataReader.cs | 9 +- .../Abstractions/IMiniExcelReader.cs} | 15 +- .../Abstractions/IMiniExcelTemplate.cs} | 8 +- .../Abstractions/IMiniExcelWriteAdapter.cs | 17 + .../IMiniExcelWriteAdapterAsync.cs | 9 + .../Abstractions/IMiniExcelWriter.cs} | 8 +- .../Attributes/MiniExcelColumnAttribute.cs} | 9 +- .../MiniExcelColumnIndexAttribute.cs} | 11 +- .../MiniExcelColumnNameAttribute.cs} | 6 +- .../MiniExcelColumnWidthAttribute.cs} | 6 +- .../Attributes/MiniExcelFormatAttribute.cs} | 6 +- .../Attributes/MiniExcelIgnoreAttribute.cs | 7 + .../DataReader}/MiniExcelDataReader.cs | 22 +- .../DataReader}/MiniExcelDataReaderBase.cs | 22 +- .../MiniExcelColumnNotFoundException.cs} | 6 +- .../MiniExcelInvalidCastException.cs} | 6 +- .../Helpers}/AttributeExtension.cs | 6 +- .../Helpers}/ColumnHelper.cs | 9 +- .../Helpers}/FileHelper.cs | 6 +- .../Helpers}/ImageHelper.cs | 2 +- .../Helpers}/ListHelper.cs | 10 +- .../Helpers/SafeStreamWriter.cs} | 27 +- src/MiniExcelLib.Core/Helpers/StringHelper.cs | 7 + .../Helpers}/TaskHelper.cs | 6 +- src/MiniExcelLib.Core/Helpers/ThrowHelper.cs | 19 + src/MiniExcelLib.Core/Helpers/TypeHelper.cs | 46 + .../Helpers/XmlHelper.cs} | 22 +- .../MiniExcelConfiguration.cs | 8 +- .../MiniExcelLib.Core.csproj | 12 + .../Attributes/ExcelSheetAttribute.cs | 5 +- .../OpenXml/Constants/ExcelContentTypes.cs | 2 +- .../OpenXml/Constants/ExcelFileNames.cs | 2 +- .../OpenXml/Constants/ExcelXml.cs | 18 +- .../OpenXml/Constants/Schemas.cs | 2 +- .../OpenXml/Constants/WorksheetXml.cs | 4 +- .../OpenXml/Models/DrawingDto.cs | 4 +- .../OpenXml/Models/ExcelRange.cs | 4 +- .../OpenXml/Models}/ExcelWidthCollection.cs | 11 +- .../OpenXml/Models/ExcellSheetInfo.cs | 15 + .../OpenXml/Models/FileDto.cs | 4 +- .../OpenXml/Models}/MergeCells.cs | 4 +- .../OpenXml/Models/SheetDto.cs | 4 +- .../OpenXml/Models}/SheetInfo.cs | 2 +- .../OpenXml/Models}/SheetRecord.cs | 4 +- .../OpenXml/OpenXmlConfiguration.cs | 12 +- .../OpenXml/OpenXmlReader.cs} | 140 +-- .../OpenXml/OpenXmlStyleOptions.cs | 2 +- .../OpenXml/OpenXmlStyles.cs} | 14 +- .../OpenXml/OpenXmlWriter.DefaultOpenXml.cs} | 54 +- .../OpenXml/OpenXmlWriter.cs} | 83 +- .../OpenXml/Picture/OpenXmlPicture.cs} | 12 +- .../Picture/OpenXmlPictureImplement.cs} | 54 +- .../Styles/DefaultSheetStyleBuilder.cs | 4 +- .../OpenXml/Styles/ISheetStyleBuilder.cs | 5 +- .../Styles/MinimalSheetStyleBuilder.cs | 4 +- .../OpenXml/Styles/SheetStyleBuildContext.cs | 40 +- .../OpenXml/Styles/SheetStyleBuildResult.cs | 4 +- .../OpenXml/Styles/SheetStyleBuilderBase.cs | 7 +- .../OpenXml/Styles/SheetStyleBuilderHelper.cs | 12 +- .../OpenXml/Styles/SheetStyleElementInfos.cs | 13 +- .../Templates/OpenXmlTemplate.Impl.cs} | 93 +- .../Templates/OpenXmlTemplate.MergeCells.cs} | 27 +- .../OpenXml/Templates/OpenXmlTemplate.cs} | 36 +- .../Templates/OpenXmlValueExtractor.cs} | 79 +- .../OpenXml}/Utils/CalcChainHelper.cs | 12 +- .../OpenXml}/Utils/DateTimeHelper.cs | 4 +- .../OpenXml/Utils/GeneralHelper.cs | 59 ++ .../OpenXml/Utils/MiniExcelPropertyHelper.cs | 40 + .../Utils/OpenXmlNumberFormatHelper.cs} | 27 +- .../OpenXml}/Utils/ReferenceHelper.cs | 27 +- .../OpenXml/Utils}/SharedStringsDiskCache.cs | 7 +- .../OpenXml}/Utils/XmlReaderHelper.cs | 77 +- .../OpenXml}/Zip/MiniExcelZipArchive.cs | 6 +- .../OpenXml/Zip/OpenXmlZip.cs} | 11 +- .../OpenXml}/Zip/ZipPackageInfo.cs | 4 +- .../Properties/AssemblyInfo.cs | 5 + .../Reflection}/CustomPropertyHelper.cs | 136 +-- .../Reflection/MemberGetter.cs | 3 +- .../Reflection/MemberSetter.cs | 3 +- .../Reflection/MiniExcelColumnInfo.cs | 21 + .../Reflection/MiniExcelMapper.cs | 254 +++++ .../Reflection/MiniExcelProperty.cs} | 7 +- .../AsyncEnumerableWriteAdapter.cs | 20 +- .../WriteAdapters}/DataReaderWriteAdapter.cs | 23 +- .../WriteAdapters}/DataTableWriteAdapter.cs | 21 +- .../WriteAdapters}/EnumerableWriteAdapter.cs | 33 +- .../MiniExcelDataReaderWriteAdapter.cs | 24 +- .../MiniExcelWriteAdapterFactory.cs | 16 +- src/{MiniExcel => MiniExcelLib.Core}/icon.png | Bin .../miniexcel.publickey | Bin .../CsvConfiguration.cs | 13 +- .../CsvHelper.cs} | 12 +- .../Csv => MiniExcelLib.Csv}/CsvReader.cs | 68 +- .../Csv => MiniExcelLib.Csv}/CsvWriter.cs | 81 +- src/MiniExcelLib.Csv/MiniExcelLib.Csv.csproj | 15 + src/{MiniExcel => }/miniexcel.snk | Bin .../MiniExcelAutoAdjustWidthTests.cs | 30 +- tests/MiniExcelTests/MiniExcelCsvAsycTests.cs | 83 +- tests/MiniExcelTests/MiniExcelCsvTests.cs | 164 ++- .../MiniExcelIssueAsyncTests.cs | 327 +++--- tests/MiniExcelTests/MiniExcelIssueTests.cs | 992 +++++++++--------- .../MiniExcelOpenXmlAsyncTests.cs | 308 +++--- .../MiniExcelOpenXmlConfigurationTest.cs | 39 +- ...MiniExcelOpenXmlMultipleSheetAsyncTests.cs | 35 +- .../MiniExcelOpenXmlMultipleSheetTests.cs | 70 +- tests/MiniExcelTests/MiniExcelOpenXmlTests.cs | 263 ++--- tests/MiniExcelTests/MiniExcelTests.csproj | 16 +- .../InputValueExtractorTests.cs | 12 +- .../MiniExcelTemplateAsyncTests.cs | 92 +- .../SaveByTemplate/MiniExcelTemplateTests.cs | 103 +- .../MiniExcelTests/Utils/AutoDeletingPath.cs | 8 +- tests/MiniExcelTests/Utils/Db.cs | 2 +- tests/MiniExcelTests/Utils/EpplusLicense.cs | 2 +- tests/MiniExcelTests/Utils/FileHelper.cs | 2 +- tests/MiniExcelTests/Utils/Helpers.cs | 2 +- tests/MiniExcelTests/Utils/PathHelper.cs | 2 +- 151 files changed, 3392 insertions(+), 3286 deletions(-) rename benchmarks/MiniExcel.Benchmarks/{Config.cs => BenchmarkConfig.cs} (85%) create mode 100644 src/Directory.Build.props delete mode 100644 src/MiniExcel/Attributes/ExcelIgnoreAttribute.cs delete mode 100644 src/MiniExcel/ExcelFactory.cs delete mode 100644 src/MiniExcel/ExcelType.cs create mode 100644 src/MiniExcel/Exporter/MiniExcelExporter.Csv.cs create mode 100644 src/MiniExcel/Exporter/MiniExcelExporter.OpenXml.cs create mode 100644 src/MiniExcel/Importer/MiniExcelImporter.Csv.cs create mode 100644 src/MiniExcel/Importer/MiniExcelImporter.OpenXml.cs create mode 100644 src/MiniExcel/MiniExcel.csproj delete mode 100644 src/MiniExcel/MiniExcelLibs.csproj delete mode 100644 src/MiniExcel/OpenXml/ExcelOpenXmlUtils.cs delete mode 100644 src/MiniExcel/OpenXml/TableStyles.cs delete mode 100644 src/MiniExcel/Properties/AssemblyInfo.cs delete mode 100644 src/MiniExcel/SaveByTemplate/IInputValueExtractor.cs create mode 100644 src/MiniExcel/Templater/MiniExcelTemplater.OpenXml.cs delete mode 100644 src/MiniExcel/Utils/ExcelTypeHelper.cs delete mode 100644 src/MiniExcel/Utils/StringHelper.cs delete mode 100644 src/MiniExcel/Utils/TypeHelper.cs delete mode 100644 src/MiniExcel/WriteAdapter/IAsyncMiniExcelWriteAdapter.cs delete mode 100644 src/MiniExcel/WriteAdapter/IMiniExcelWriteAdapter.cs create mode 100644 src/MiniExcelLib.Core/Abstractions/IInputValueExtractor.cs rename src/{MiniExcel => MiniExcelLib.Core/Abstractions}/IMiniExcelDataReader.cs (62%) rename src/{MiniExcel/IExcelReader.cs => MiniExcelLib.Core/Abstractions/IMiniExcelReader.cs} (65%) rename src/{MiniExcel/IExcelTemplate.cs => MiniExcelLib.Core/Abstractions/IMiniExcelTemplate.cs} (75%) create mode 100644 src/MiniExcelLib.Core/Abstractions/IMiniExcelWriteAdapter.cs create mode 100644 src/MiniExcelLib.Core/Abstractions/IMiniExcelWriteAdapterAsync.cs rename src/{MiniExcel/IExcelWriter.cs => MiniExcelLib.Core/Abstractions/IMiniExcelWriter.cs} (58%) rename src/{MiniExcel/Attributes/ExcelColumnAttribute.cs => MiniExcelLib.Core/Attributes/MiniExcelColumnAttribute.cs} (83%) rename src/{MiniExcel/Attributes/ExcelColumnIndexAttribute.cs => MiniExcelLib.Core/Attributes/MiniExcelColumnIndexAttribute.cs} (61%) rename src/{MiniExcel/Attributes/ExcelColumnNameAttribute.cs => MiniExcelLib.Core/Attributes/MiniExcelColumnNameAttribute.cs} (55%) rename src/{MiniExcel/Attributes/ExcelColumnWidthAttribute.cs => MiniExcelLib.Core/Attributes/MiniExcelColumnWidthAttribute.cs} (50%) rename src/{MiniExcel/Attributes/ExcelFormatAttribute.cs => MiniExcelLib.Core/Attributes/MiniExcelFormatAttribute.cs} (50%) create mode 100644 src/MiniExcelLib.Core/Attributes/MiniExcelIgnoreAttribute.cs rename src/{MiniExcel => MiniExcelLib.Core/DataReader}/MiniExcelDataReader.cs (65%) rename src/{MiniExcel => MiniExcelLib.Core/DataReader}/MiniExcelDataReaderBase.cs (90%) rename src/{MiniExcel/Exceptions/ExcelColumnNotFoundException.cs => MiniExcelLib.Core/Exceptions/MiniExcelColumnNotFoundException.cs} (80%) rename src/{MiniExcel/Exceptions/ExcelInvalidCastException.cs => MiniExcelLib.Core/Exceptions/MiniExcelInvalidCastException.cs} (57%) rename src/{MiniExcel/Utils => MiniExcelLib.Core/Helpers}/AttributeExtension.cs (90%) rename src/{MiniExcel/Utils => MiniExcelLib.Core/Helpers}/ColumnHelper.cs (89%) rename src/{MiniExcel/Utils => MiniExcelLib.Core/Helpers}/FileHelper.cs (59%) rename src/{MiniExcel/Utils => MiniExcelLib.Core/Helpers}/ImageHelper.cs (93%) rename src/{MiniExcel/Utils => MiniExcelLib.Core/Helpers}/ListHelper.cs (72%) rename src/{MiniExcel/OpenXml/MiniExcelStreamWriter.cs => MiniExcelLib.Core/Helpers/SafeStreamWriter.cs} (70%) create mode 100644 src/MiniExcelLib.Core/Helpers/StringHelper.cs rename src/{MiniExcel/Utils => MiniExcelLib.Core/Helpers}/TaskHelper.cs (77%) create mode 100644 src/MiniExcelLib.Core/Helpers/ThrowHelper.cs create mode 100644 src/MiniExcelLib.Core/Helpers/TypeHelper.cs rename src/{MiniExcel/Utils/XmlEncoder.cs => MiniExcelLib.Core/Helpers/XmlHelper.cs} (67%) rename src/{MiniExcel => MiniExcelLib.Core}/MiniExcelConfiguration.cs (63%) create mode 100644 src/MiniExcelLib.Core/MiniExcelLib.Core.csproj rename src/{MiniExcel => MiniExcelLib.Core/OpenXml}/Attributes/ExcelSheetAttribute.cs (75%) rename src/{MiniExcel => MiniExcelLib.Core}/OpenXml/Constants/ExcelContentTypes.cs (92%) rename src/{MiniExcel => MiniExcelLib.Core}/OpenXml/Constants/ExcelFileNames.cs (91%) rename src/{MiniExcel => MiniExcelLib.Core}/OpenXml/Constants/ExcelXml.cs (88%) rename src/{MiniExcel => MiniExcelLib.Core}/OpenXml/Constants/Schemas.cs (91%) rename src/{MiniExcel => MiniExcelLib.Core}/OpenXml/Constants/WorksheetXml.cs (96%) rename src/{MiniExcel => MiniExcelLib.Core}/OpenXml/Models/DrawingDto.cs (58%) rename src/{MiniExcel => MiniExcelLib.Core}/OpenXml/Models/ExcelRange.cs (89%) rename src/{MiniExcel/OpenXml => MiniExcelLib.Core/OpenXml/Models}/ExcelWidthCollection.cs (87%) create mode 100644 src/MiniExcelLib.Core/OpenXml/Models/ExcellSheetInfo.cs rename src/{MiniExcel => MiniExcelLib.Core}/OpenXml/Models/FileDto.cs (86%) rename src/{MiniExcel/OpenXml => MiniExcelLib.Core/OpenXml/Models}/MergeCells.cs (68%) rename src/{MiniExcel => MiniExcelLib.Core}/OpenXml/Models/SheetDto.cs (79%) rename src/{MiniExcel/OpenXml => MiniExcelLib.Core/OpenXml/Models}/SheetInfo.cs (91%) rename src/{MiniExcel/OpenXml => MiniExcelLib.Core/OpenXml/Models}/SheetRecord.cs (91%) rename src/{MiniExcel => MiniExcelLib.Core}/OpenXml/OpenXmlConfiguration.cs (84%) rename src/{MiniExcel/OpenXml/ExcelOpenXmlSheetReader.cs => MiniExcelLib.Core/OpenXml/OpenXmlReader.cs} (86%) rename src/{MiniExcel => MiniExcelLib.Core}/OpenXml/OpenXmlStyleOptions.cs (66%) rename src/{MiniExcel/OpenXml/ExcelOpenXmlStyles.cs => MiniExcelLib.Core/OpenXml/OpenXmlStyles.cs} (94%) rename src/{MiniExcel/OpenXml/ExcelOpenXmlSheetWriter.DefaultOpenXml.cs => MiniExcelLib.Core/OpenXml/OpenXmlWriter.DefaultOpenXml.cs} (86%) rename src/{MiniExcel/OpenXml/ExcelOpenXmlSheetWriter.cs => MiniExcelLib.Core/OpenXml/OpenXmlWriter.cs} (86%) rename src/{MiniExcel/Picture/MiniExcelPicture.cs => MiniExcelLib.Core/OpenXml/Picture/OpenXmlPicture.cs} (60%) rename src/{MiniExcel/Picture/MiniExcelPictureImplement.cs => MiniExcelLib.Core/OpenXml/Picture/OpenXmlPictureImplement.cs} (94%) rename src/{MiniExcel => MiniExcelLib.Core}/OpenXml/Styles/DefaultSheetStyleBuilder.cs (98%) rename src/{MiniExcel => MiniExcelLib.Core}/OpenXml/Styles/ISheetStyleBuilder.cs (63%) rename src/{MiniExcel => MiniExcelLib.Core}/OpenXml/Styles/MinimalSheetStyleBuilder.cs (96%) rename src/{MiniExcel => MiniExcelLib.Core}/OpenXml/Styles/SheetStyleBuildContext.cs (90%) rename src/{MiniExcel => MiniExcelLib.Core}/OpenXml/Styles/SheetStyleBuildResult.cs (71%) rename src/{MiniExcel => MiniExcelLib.Core}/OpenXml/Styles/SheetStyleBuilderBase.cs (97%) rename src/{MiniExcel => MiniExcelLib.Core}/OpenXml/Styles/SheetStyleBuilderHelper.cs (57%) rename src/{MiniExcel => MiniExcelLib.Core}/OpenXml/Styles/SheetStyleElementInfos.cs (87%) rename src/{MiniExcel/SaveByTemplate/ExcelOpenXmlTemplate.Impl.cs => MiniExcelLib.Core/OpenXml/Templates/OpenXmlTemplate.Impl.cs} (94%) rename src/{MiniExcel/SaveByTemplate/ExcelOpenXmlTemplate.MergeCells.cs => MiniExcelLib.Core/OpenXml/Templates/OpenXmlTemplate.MergeCells.cs} (74%) rename src/{MiniExcel/SaveByTemplate/ExcelOpenXmlTemplate.cs => MiniExcelLib.Core/OpenXml/Templates/OpenXmlTemplate.cs} (85%) rename src/{MiniExcel/SaveByTemplate/InputValueExtractor.cs => MiniExcelLib.Core/OpenXml/Templates/OpenXmlValueExtractor.cs} (70%) rename src/{MiniExcel => MiniExcelLib.Core/OpenXml}/Utils/CalcChainHelper.cs (86%) rename src/{MiniExcel => MiniExcelLib.Core/OpenXml}/Utils/DateTimeHelper.cs (82%) create mode 100644 src/MiniExcelLib.Core/OpenXml/Utils/GeneralHelper.cs create mode 100644 src/MiniExcelLib.Core/OpenXml/Utils/MiniExcelPropertyHelper.cs rename src/{MiniExcel/Utils/ExcelNumberFormat.cs => MiniExcelLib.Core/OpenXml/Utils/OpenXmlNumberFormatHelper.cs} (95%) rename src/{MiniExcel => MiniExcelLib.Core/OpenXml}/Utils/ReferenceHelper.cs (81%) rename src/{MiniExcel/OpenXml => MiniExcelLib.Core/OpenXml/Utils}/SharedStringsDiskCache.cs (93%) rename src/{MiniExcel => MiniExcelLib.Core/OpenXml}/Utils/XmlReaderHelper.cs (59%) rename src/{MiniExcel => MiniExcelLib.Core/OpenXml}/Zip/MiniExcelZipArchive.cs (73%) rename src/{MiniExcel/Zip/ExcelOpenXmlZip.cs => MiniExcelLib.Core/OpenXml/Zip/OpenXmlZip.cs} (83%) rename src/{MiniExcel => MiniExcelLib.Core/OpenXml}/Zip/ZipPackageInfo.cs (74%) create mode 100644 src/MiniExcelLib.Core/Properties/AssemblyInfo.cs rename src/{MiniExcel/Utils => MiniExcelLib.Core/Reflection}/CustomPropertyHelper.cs (66%) rename src/{MiniExcel => MiniExcelLib.Core}/Reflection/MemberGetter.cs (92%) rename src/{MiniExcel => MiniExcelLib.Core}/Reflection/MemberSetter.cs (93%) create mode 100644 src/MiniExcelLib.Core/Reflection/MiniExcelColumnInfo.cs create mode 100644 src/MiniExcelLib.Core/Reflection/MiniExcelMapper.cs rename src/{MiniExcel/Reflection/Property.cs => MiniExcelLib.Core/Reflection/MiniExcelProperty.cs} (85%) rename src/{MiniExcel/WriteAdapter => MiniExcelLib.Core/WriteAdapters}/AsyncEnumerableWriteAdapter.cs (77%) rename src/{MiniExcel/WriteAdapter => MiniExcelLib.Core/WriteAdapters}/DataReaderWriteAdapter.cs (70%) rename src/{MiniExcel/WriteAdapter => MiniExcelLib.Core/WriteAdapters}/DataTableWriteAdapter.cs (68%) rename src/{MiniExcel/WriteAdapter => MiniExcelLib.Core/WriteAdapters}/EnumerableWriteAdapter.cs (72%) rename src/{MiniExcel/WriteAdapter => MiniExcelLib.Core/WriteAdapters}/MiniExcelDataReaderWriteAdapter.cs (72%) rename src/{MiniExcel/WriteAdapter => MiniExcelLib.Core/WriteAdapters}/MiniExcelWriteAdapterFactory.cs (71%) rename src/{MiniExcel => MiniExcelLib.Core}/icon.png (100%) rename src/{MiniExcel => MiniExcelLib.Core}/miniexcel.publickey (100%) rename src/{MiniExcel/Csv => MiniExcelLib.Csv}/CsvConfiguration.cs (70%) rename src/{MiniExcel/Csv/CsvHelpers.cs => MiniExcelLib.Csv/CsvHelper.cs} (72%) rename src/{MiniExcel/Csv => MiniExcelLib.Csv}/CsvReader.cs (66%) rename src/{MiniExcel/Csv => MiniExcelLib.Csv}/CsvWriter.cs (76%) create mode 100644 src/MiniExcelLib.Csv/MiniExcelLib.Csv.csproj rename src/{MiniExcel => }/miniexcel.snk (100%) diff --git a/.github/workflows/benchmark.yml b/.github/workflows/benchmark.yml index d5b6c119..c61ab47a 100644 --- a/.github/workflows/benchmark.yml +++ b/.github/workflows/benchmark.yml @@ -3,6 +3,7 @@ name: MiniExcel Benchmarks on: workflow_dispatch: release: + branches: [master] types: [published] permissions: diff --git a/LICENSE b/LICENSE index 261eeb9e..d84996be 100644 --- a/LICENSE +++ b/LICENSE @@ -175,18 +175,7 @@ END OF TERMS AND CONDITIONS - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] + Copyright 2021 Wei Lin Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/MiniExcel.sln b/MiniExcel.sln index bebab6af..7541336a 100644 --- a/MiniExcel.sln +++ b/MiniExcel.sln @@ -3,7 +3,9 @@ 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}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MiniExcelLib.Core", "src\MiniExcelLib.Core\MiniExcelLib.Core.csproj", "{097903C9-1F81-4427-B4C8-530CB59687B8}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MiniExcelLib.Csv", "src\MiniExcelLib.Csv\MiniExcelLib.Csv.csproj", "{0B0C3A11-BA5A-457F-BCBE-3001CEAF9FB6}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Docs and setting", "Docs and setting", "{2AFABF2E-D6C3-4983-B43A-76ADA2BB2876}" ProjectSection(SolutionItems) = preProject @@ -38,6 +40,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "benchmarks", "benchmarks", EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MiniExcel.Benchmarks", "benchmarks\MiniExcel.Benchmarks\MiniExcel.Benchmarks.csproj", "{F1BDF4D7-F3C4-4114-82F6-EF81567DFBD8}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MiniExcel", "src\MiniExcel\MiniExcel.csproj", "{BF42A3A5-6C2D-4C20-9494-450B9605CA6F}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -56,6 +60,14 @@ Global {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 + {0B0C3A11-BA5A-457F-BCBE-3001CEAF9FB6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0B0C3A11-BA5A-457F-BCBE-3001CEAF9FB6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0B0C3A11-BA5A-457F-BCBE-3001CEAF9FB6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0B0C3A11-BA5A-457F-BCBE-3001CEAF9FB6}.Release|Any CPU.Build.0 = Release|Any CPU + {BF42A3A5-6C2D-4C20-9494-450B9605CA6F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BF42A3A5-6C2D-4C20-9494-450B9605CA6F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BF42A3A5-6C2D-4C20-9494-450B9605CA6F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BF42A3A5-6C2D-4C20-9494-450B9605CA6F}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -64,6 +76,8 @@ Global {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} + {0B0C3A11-BA5A-457F-BCBE-3001CEAF9FB6} = {CC1E0601-AEC9-42D7-8F6A-3FB3939EED16} + {BF42A3A5-6C2D-4C20-9494-450B9605CA6F} = {CC1E0601-AEC9-42D7-8F6A-3FB3939EED16} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {51DF25DA-2DCB-4883-90FE-399DA950D4F2} diff --git a/benchmarks/MiniExcel.Benchmarks/BenchmarkBase.cs b/benchmarks/MiniExcel.Benchmarks/BenchmarkBase.cs index 44809c0f..bbd60a07 100644 --- a/benchmarks/MiniExcel.Benchmarks/BenchmarkBase.cs +++ b/benchmarks/MiniExcel.Benchmarks/BenchmarkBase.cs @@ -1,4 +1,4 @@ -namespace MiniExcelLibs.Benchmarks; +namespace MiniExcelLib.Benchmarks; public abstract class BenchmarkBase { diff --git a/benchmarks/MiniExcel.Benchmarks/Config.cs b/benchmarks/MiniExcel.Benchmarks/BenchmarkConfig.cs similarity index 85% rename from benchmarks/MiniExcel.Benchmarks/Config.cs rename to benchmarks/MiniExcel.Benchmarks/BenchmarkConfig.cs index 69334767..4128ccfd 100644 --- a/benchmarks/MiniExcel.Benchmarks/Config.cs +++ b/benchmarks/MiniExcel.Benchmarks/BenchmarkConfig.cs @@ -7,16 +7,18 @@ using BenchmarkDotNet.Loggers; using BenchmarkDotNet.Order; -namespace MiniExcelLibs.Benchmarks; +namespace MiniExcelLib.Benchmarks; -public class Config : ManualConfig +internal class BenchmarkConfig : ManualConfig { private const int Launches = 1; private const int Warmups = 3; private const int Unrolls = 3; private const int Iterations = 3; - public Config() + public static BenchmarkConfig Default => new(); + + private BenchmarkConfig() { AddLogger(ConsoleLogger.Default); diff --git a/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/CreateXlsxBenchmark.cs b/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/CreateXlsxBenchmark.cs index 590da920..54232b19 100644 --- a/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/CreateXlsxBenchmark.cs +++ b/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/CreateXlsxBenchmark.cs @@ -4,11 +4,12 @@ using DocumentFormat.OpenXml; using DocumentFormat.OpenXml.Packaging; using DocumentFormat.OpenXml.Spreadsheet; -using MiniExcelLibs.Benchmarks.Utils; +using MiniExcelLib.Benchmarks.Utils; using NPOI.XSSF.UserModel; using OfficeOpenXml; +using Exporter = MiniExcelLib.MiniExcel.Exporter; -namespace MiniExcelLibs.Benchmarks.BenchmarkSections; +namespace MiniExcelLib.Benchmarks.BenchmarkSections; public class CreateXlsxBenchmark : BenchmarkBase { @@ -23,7 +24,7 @@ public void SetUp() public void MiniExcelCreateTest() { using var path = AutoDeletingPath.Create(); - MiniExcel.SaveAs(path.FilePath, GetValue()); + Exporter.ExportXlsx(path.FilePath, GetValue()); } [Benchmark(Description = "ClosedXml Create Xlsx")] diff --git a/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/QueryXlsxBenchmark.cs b/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/QueryXlsxBenchmark.cs index f2f9a1a5..413d92a6 100644 --- a/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/QueryXlsxBenchmark.cs +++ b/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/QueryXlsxBenchmark.cs @@ -6,8 +6,9 @@ using ExcelDataReader; using NPOI.XSSF.UserModel; using OfficeOpenXml; +using Importer = MiniExcelLib.MiniExcel.Importer; -namespace MiniExcelLibs.Benchmarks.BenchmarkSections; +namespace MiniExcelLib.Benchmarks.BenchmarkSections; public class QueryXlsxBenchmark : BenchmarkBase { @@ -21,13 +22,13 @@ public void SetUp() [Benchmark(Description = "MiniExcel QueryFirst")] public void MiniExcel_QueryFirst_Test() { - _ = MiniExcel.Query(FilePath).First(); + _ = Importer.QueryXlsx(FilePath).First(); } [Benchmark(Description = "MiniExcel Query")] public void MiniExcel_Query() { - foreach (var _ in MiniExcel.Query(FilePath)) { } + foreach (var _ in Importer.QueryXlsx(FilePath)) { } } [Benchmark(Description = "ExcelDataReader QueryFirst")] diff --git a/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/TemplateXlsxBenchmark.cs b/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/TemplateXlsxBenchmark.cs index 65eb5a53..c60e4cd6 100644 --- a/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/TemplateXlsxBenchmark.cs +++ b/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/TemplateXlsxBenchmark.cs @@ -1,8 +1,9 @@ using BenchmarkDotNet.Attributes; using ClosedXML.Report; -using MiniExcelLibs.Benchmarks.Utils; +using MiniExcelLib.Benchmarks.Utils; +using _templater = MiniExcelLib.MiniExcel.Templater; -namespace MiniExcelLibs.Benchmarks.BenchmarkSections; +namespace MiniExcelLib.Benchmarks.BenchmarkSections; public class TemplateXlsxBenchmark : BenchmarkBase { @@ -22,7 +23,7 @@ public void MiniExcel_Template_Generate_Test() }) }; - MiniExcel.SaveAsByTemplate(path.FilePath, templatePath, value); + _templater.ApplyXlsxTemplate(path.FilePath, templatePath, value); } [Benchmark(Description = "ClosedXml.Report Template Generate")] diff --git a/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/XlsxAsyncBenchmark.cs b/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/XlsxAsyncBenchmark.cs index 5c2044a9..33d75d33 100644 --- a/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/XlsxAsyncBenchmark.cs +++ b/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/XlsxAsyncBenchmark.cs @@ -1,7 +1,9 @@ using BenchmarkDotNet.Attributes; -using MiniExcelLibs.Benchmarks.Utils; +using MiniExcelLib.Benchmarks.Utils; +using Exporter = MiniExcelLib.MiniExcel.Exporter; +using Templater = MiniExcelLib.MiniExcel.Templater; -namespace MiniExcelLibs.Benchmarks.BenchmarkSections; +namespace MiniExcelLib.Benchmarks.BenchmarkSections; public class XlsxAsyncBenchmark : BenchmarkBase { @@ -11,7 +13,7 @@ public async Task MiniExcelCreateAsyncTest() using var path = AutoDeletingPath.Create(); using var stream = File.Create(path.FilePath); - await stream.SaveAsAsync(GetValue()); + await Exporter.ExportXlsxAsync(stream, GetValue()); } [Benchmark(Description = "MiniExcel Generate Template Async")] @@ -30,6 +32,6 @@ public async Task MiniExcel_Template_Generate_Async_Test() }) }; - await MiniExcel.SaveAsByTemplateAsync(path.FilePath, templatePath, value); + await Templater.ApplyXlsxTemplateAsync(path.FilePath, templatePath, value); } } diff --git a/benchmarks/MiniExcel.Benchmarks/MiniExcel.Benchmarks.csproj b/benchmarks/MiniExcel.Benchmarks/MiniExcel.Benchmarks.csproj index 0d2a9f57..3c5b0adc 100644 --- a/benchmarks/MiniExcel.Benchmarks/MiniExcel.Benchmarks.csproj +++ b/benchmarks/MiniExcel.Benchmarks/MiniExcel.Benchmarks.csproj @@ -6,7 +6,7 @@ enable enable latest - MiniExcelLibs.Benchmarks + MiniExcelLib.Benchmarks $(NoWarn);CA2000;CA2007 @@ -35,7 +35,8 @@ - + + diff --git a/benchmarks/MiniExcel.Benchmarks/Program.cs b/benchmarks/MiniExcel.Benchmarks/Program.cs index 792bcab9..256d928b 100644 --- a/benchmarks/MiniExcel.Benchmarks/Program.cs +++ b/benchmarks/MiniExcel.Benchmarks/Program.cs @@ -1,6 +1,6 @@ using BenchmarkDotNet.Running; -using MiniExcelLibs.Benchmarks; -using MiniExcelLibs.Benchmarks.BenchmarkSections; +using MiniExcelLib.Benchmarks; +using MiniExcelLib.Benchmarks.BenchmarkSections; if (Environment.GetEnvironmentVariable("BenchmarkMode") == "Automatic") { @@ -13,7 +13,7 @@ _ => throw new ArgumentException($"Benchmark section {section} does not exist") }; - BenchmarkRunner.Run(benchmark, new Config(), args); + BenchmarkRunner.Run(benchmark, BenchmarkConfig.Default, args); } else { @@ -24,5 +24,5 @@ typeof(CreateXlsxBenchmark), typeof(TemplateXlsxBenchmark) ]) - .Run(args, new Config()); + .Run(args, BenchmarkConfig.Default); } \ No newline at end of file diff --git a/benchmarks/MiniExcel.Benchmarks/Utils/AutoDeletingPath.cs b/benchmarks/MiniExcel.Benchmarks/Utils/AutoDeletingPath.cs index 0ef13df7..44004c2d 100644 --- a/benchmarks/MiniExcel.Benchmarks/Utils/AutoDeletingPath.cs +++ b/benchmarks/MiniExcel.Benchmarks/Utils/AutoDeletingPath.cs @@ -1,4 +1,4 @@ -namespace MiniExcelLibs.Benchmarks.Utils; +namespace MiniExcelLib.Benchmarks.Utils; internal class AutoDeletingPath : IDisposable { diff --git a/benchmarks/MiniExcel.Benchmarks/Utils/Extensions.cs b/benchmarks/MiniExcel.Benchmarks/Utils/Extensions.cs index fdaf3c32..5ff7dd46 100644 --- a/benchmarks/MiniExcel.Benchmarks/Utils/Extensions.cs +++ b/benchmarks/MiniExcel.Benchmarks/Utils/Extensions.cs @@ -1,6 +1,6 @@ using DocumentFormat.OpenXml.Spreadsheet; -namespace MiniExcelLibs.Benchmarks.Utils; +namespace MiniExcelLib.Benchmarks.Utils; internal static class Extensions { diff --git a/src/Directory.Build.props b/src/Directory.Build.props new file mode 100644 index 00000000..248593f1 --- /dev/null +++ b/src/Directory.Build.props @@ -0,0 +1,25 @@ + + + + netstandard2.0;net8.0;net9.0 + 2.0.0-beta.1 + enable + enable + 13 + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/MiniExcel/Attributes/ExcelIgnoreAttribute.cs b/src/MiniExcel/Attributes/ExcelIgnoreAttribute.cs deleted file mode 100644 index 0f06f105..00000000 --- a/src/MiniExcel/Attributes/ExcelIgnoreAttribute.cs +++ /dev/null @@ -1,9 +0,0 @@ -using System; - -namespace MiniExcelLibs.Attributes; - -[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field)] -public class ExcelIgnoreAttribute(bool excelIgnore = true) : Attribute -{ - public bool ExcelIgnore { get; set; } = excelIgnore; -} \ No newline at end of file diff --git a/src/MiniExcel/ExcelFactory.cs b/src/MiniExcel/ExcelFactory.cs deleted file mode 100644 index 714d7474..00000000 --- a/src/MiniExcel/ExcelFactory.cs +++ /dev/null @@ -1,57 +0,0 @@ -using System; -using System.IO; -using System.Threading; -using System.Threading.Tasks; -using MiniExcelLibs.Csv; -using MiniExcelLibs.OpenXml; -using MiniExcelLibs.SaveByTemplate; -using Zomp.SyncMethodGenerator; -using ExcelOpenXmlTemplate = MiniExcelLibs.SaveByTemplate.ExcelOpenXmlTemplate; - -namespace MiniExcelLibs; - -internal static partial class ExcelReaderFactory -{ - [CreateSyncVersion] - internal static async Task GetProviderAsync(Stream stream, ExcelType excelType, IMiniExcelConfiguration? configuration, CancellationToken cancellationToken = default) - { - return excelType switch - { - ExcelType.CSV => new CsvReader(stream, configuration), - ExcelType.XLSX => await ExcelOpenXmlSheetReader.CreateAsync(stream, configuration, cancellationToken: cancellationToken).ConfigureAwait(false), - _ => throw new NotSupportedException("Something went wrong. Please report this issue you are experiencing with MiniExcel.") - }; - } -} - -internal static class ExcelWriterFactory -{ - internal static IExcelWriter GetProvider(Stream stream, object value, string? sheetName, ExcelType excelType, IMiniExcelConfiguration? configuration, bool printHeader) - { - if (string.IsNullOrEmpty(sheetName)) - throw new ArgumentException("Sheet names cannot be empty or null", nameof(sheetName)); - if (sheetName?.Length > 31 && excelType == ExcelType.XLSX) - throw new ArgumentException("Sheet names must be less than 31 characters", nameof(sheetName)); - if (excelType == ExcelType.UNKNOWN) - throw new ArgumentException("Excel type cannot be ExcelType.UNKNOWN", nameof(excelType)); - - return excelType switch - { - ExcelType.CSV => new CsvWriter(stream, value, configuration, printHeader), - ExcelType.XLSX => new ExcelOpenXmlSheetWriter(stream, value, sheetName, configuration, printHeader), - _ => throw new NotSupportedException($"The {excelType} Excel format is not supported") - }; - } -} - -internal static class ExcelTemplateFactory -{ - internal static IExcelTemplate GetProvider(Stream stream, IMiniExcelConfiguration? configuration, ExcelType excelType = ExcelType.XLSX) - { - if (excelType != ExcelType.XLSX) - throw new NotSupportedException("Something went wrong. Please report this issue you are experiencing with MiniExcel."); - - var valueExtractor = new InputValueExtractor(); - return new ExcelOpenXmlTemplate(stream, configuration, valueExtractor); - } -} \ No newline at end of file diff --git a/src/MiniExcel/ExcelType.cs b/src/MiniExcel/ExcelType.cs deleted file mode 100644 index 4a610571..00000000 --- a/src/MiniExcel/ExcelType.cs +++ /dev/null @@ -1,12 +0,0 @@ -namespace MiniExcelLibs; - -public enum ExcelType -{ - XLSX, - //XLS, - CSV, - /// - /// Will auto check excel type by stream or file path - /// - UNKNOWN -} \ No newline at end of file diff --git a/src/MiniExcel/Exporter/MiniExcelExporter.Csv.cs b/src/MiniExcel/Exporter/MiniExcelExporter.Csv.cs new file mode 100644 index 00000000..1cb82c55 --- /dev/null +++ b/src/MiniExcel/Exporter/MiniExcelExporter.Csv.cs @@ -0,0 +1,93 @@ +using System.Collections; +using System.Data; +using MiniExcelLib.Core.Helpers; +using MiniExcelLib.Csv; +using Zomp.SyncMethodGenerator; + +namespace MiniExcelLib; + +public static partial class MiniExcel +{ + public static partial class Exporter + { + #region Append / Export + [CreateSyncVersion] + public static async Task AppendToCsvAsync(string path, object value, bool printHeader = true, + CsvConfiguration? configuration = null, CancellationToken cancellationToken = default) + { + if (!File.Exists(path)) + { + var rowsWritten = await ExportCsvAsync(path, value, printHeader, false, configuration, cancellationToken: cancellationToken).ConfigureAwait(false); + return rowsWritten.FirstOrDefault(); + } + + using var stream = new FileStream(path, FileMode.Append, FileAccess.Write, FileShare.Read, 4096, FileOptions.SequentialScan); + return await AppendToCsvAsync(stream, value, configuration, cancellationToken).ConfigureAwait(false); + } + + [CreateSyncVersion] + public static async Task AppendToCsvAsync(Stream stream, object value, CsvConfiguration? configuration = null, CancellationToken cancellationToken = default) + { + stream.Seek(0, SeekOrigin.End); + + var newValue = value is IEnumerable or IDataReader ? value : new[] { value }; + + using var writer = new CsvWriter(stream, newValue, false, configuration); + return await writer.InsertAsync(false, cancellationToken).ConfigureAwait(false); + } + + [CreateSyncVersion] + public static async Task ExportCsvAsync(string path, object value, bool printHeader = true, bool overwriteFile = false, + CsvConfiguration? configuration = null, CancellationToken cancellationToken = default) + { + using var stream = overwriteFile ? File.Create(path) : new FileStream(path, FileMode.CreateNew); + return await ExportCsvAsync(stream, value, printHeader, configuration, cancellationToken).ConfigureAwait(false); + } + + [CreateSyncVersion] + public static async Task ExportCsvAsync(Stream stream, object value, bool printHeader = true, + CsvConfiguration? configuration = null, CancellationToken cancellationToken = default) + { + using var writer = new CsvWriter(stream, value, printHeader, configuration); + return await writer.SaveAsAsync(cancellationToken).ConfigureAwait(false); + } + + #endregion + + #region Convert + + [CreateSyncVersion] + public static async Task ConvertCsvToXlsxAsync(Stream csv, Stream xlsx, bool csvHasHeader = false, CancellationToken cancellationToken = default) + { + var value = Importer.QueryCsvAsync(csv, useHeaderRow: csvHasHeader, cancellationToken: cancellationToken); + await ExportXlsxAsync(xlsx, value, printHeader: csvHasHeader, cancellationToken: cancellationToken).ConfigureAwait(false); + } + + [CreateSyncVersion] + public static async Task ConvertCsvToXlsxAsync(string csvPath, string xlsx, bool csvHasHeader = false, CancellationToken cancellationToken = default) + { + using var csvStream = FileHelper.OpenSharedRead(csvPath); + using var xlsxStream = new FileStream(xlsx, FileMode.CreateNew); + + await ConvertCsvToXlsxAsync(csvStream, xlsxStream, csvHasHeader, cancellationToken).ConfigureAwait(false); + } + + [CreateSyncVersion] + public static async Task ConvertXlsxToCsvAsync(string xlsx, string csvPath, bool xlsxHasHeader = true, CancellationToken cancellationToken = default) + { + using var xlsxStream = FileHelper.OpenSharedRead(xlsx); + using var csvStream = new FileStream(csvPath, FileMode.CreateNew); + + await ConvertXlsxToCsvAsync(xlsxStream, csvStream, xlsxHasHeader, cancellationToken).ConfigureAwait(false); + } + + [CreateSyncVersion] + public static async Task ConvertXlsxToCsvAsync(Stream xlsx, Stream csv, bool xlsxHasHeader = true, CancellationToken cancellationToken = default) + { + var value = Importer.QueryXlsxAsync(xlsx, useHeaderRow: xlsxHasHeader, cancellationToken: cancellationToken).ConfigureAwait(false); + await ExportCsvAsync(csv, value, printHeader: xlsxHasHeader, cancellationToken: cancellationToken).ConfigureAwait(false); + } + + #endregion + } +} \ No newline at end of file diff --git a/src/MiniExcel/Exporter/MiniExcelExporter.OpenXml.cs b/src/MiniExcel/Exporter/MiniExcelExporter.OpenXml.cs new file mode 100644 index 00000000..52ca691e --- /dev/null +++ b/src/MiniExcel/Exporter/MiniExcelExporter.OpenXml.cs @@ -0,0 +1,78 @@ +using MiniExcelLib.Core.OpenXml; +using MiniExcelLib.Core.OpenXml.Picture; +using Zomp.SyncMethodGenerator; + +namespace MiniExcelLib; + +public static partial class MiniExcel +{ + public static partial class Exporter + { + [CreateSyncVersion] + public static async Task AddPictureXlsxAsync(string path, CancellationToken cancellationToken = default, params MiniExcelPicture[] images) + { + using var stream = File.Open(path, FileMode.OpenOrCreate); + await MiniExcelPictureImplement.AddPictureAsync(stream, cancellationToken, images).ConfigureAwait(false); + } + + [CreateSyncVersion] + public static async Task AddPictureXlsxAsync(Stream excelStream, CancellationToken cancellationToken = default, params MiniExcelPicture[] images) + { + await MiniExcelPictureImplement.AddPictureAsync(excelStream, cancellationToken, images).ConfigureAwait(false); + } + + [CreateSyncVersion] + public static async Task InsertXlsxSheetAsync(string path, object value, string? sheetName = "Sheet1", bool printHeader = true, bool overwriteSheet = false, OpenXmlConfiguration? configuration = null, CancellationToken cancellationToken = default) + { + if (Path.GetExtension(path).Equals(".xlsm", StringComparison.InvariantCultureIgnoreCase)) + throw new NotSupportedException("MiniExcel's Insert does not support the .xlsm format"); + + if (!File.Exists(path)) + { + var rowsWritten = await ExportXlsxAsync(path, value, printHeader, sheetName, configuration: configuration, cancellationToken: cancellationToken).ConfigureAwait(false); + return rowsWritten.FirstOrDefault(); + } + + using var stream = new FileStream(path, FileMode.Open, FileAccess.ReadWrite, FileShare.Read, 4096, FileOptions.SequentialScan); + return await InsertXlsxSheetAsync(stream, value, sheetName, printHeader, overwriteSheet, configuration, cancellationToken).ConfigureAwait(false); + } + + [CreateSyncVersion] + public static async Task InsertXlsxSheetAsync(Stream stream, object value, string? sheetName = "Sheet1", + bool printHeader = true, bool overwriteSheet = false, OpenXmlConfiguration? configuration = null, + CancellationToken cancellationToken = default) + { + stream.Seek(0, SeekOrigin.End); + configuration ??= new OpenXmlConfiguration { FastMode = true }; + + var writer = await OpenXmlWriter + .CreateAsync(stream, value, sheetName, printHeader, configuration, cancellationToken) + .ConfigureAwait(false); + + return await writer.InsertAsync(overwriteSheet, cancellationToken).ConfigureAwait(false); + } + + [CreateSyncVersion] + public static async Task ExportXlsxAsync(string path, object value, bool printHeader = true, + string? sheetName = "Sheet1", bool overwriteFile = false, OpenXmlConfiguration? configuration = null, + CancellationToken cancellationToken = default) + { + if (Path.GetExtension(path).Equals(".xlsm", StringComparison.InvariantCultureIgnoreCase)) + throw new NotSupportedException("MiniExcel's SaveAs does not support the .xlsm format"); + + using var stream = overwriteFile ? File.Create(path) : new FileStream(path, FileMode.CreateNew); + return await ExportXlsxAsync(stream, value, printHeader, sheetName, configuration, cancellationToken).ConfigureAwait(false); + } + + [CreateSyncVersion] + public static async Task ExportXlsxAsync(Stream stream, object value, bool printHeader = true, string? sheetName = "Sheet1", + OpenXmlConfiguration? configuration = null, CancellationToken cancellationToken = default) + { + var writer = await OpenXmlWriter + .CreateAsync(stream, value, sheetName, printHeader, configuration, cancellationToken) + .ConfigureAwait(false); + + return await writer.SaveAsAsync(cancellationToken).ConfigureAwait(false); + } + } +} \ No newline at end of file diff --git a/src/MiniExcel/Importer/MiniExcelImporter.Csv.cs b/src/MiniExcel/Importer/MiniExcelImporter.Csv.cs new file mode 100644 index 00000000..6fd487cb --- /dev/null +++ b/src/MiniExcel/Importer/MiniExcelImporter.Csv.cs @@ -0,0 +1,180 @@ +using System.Data; +using System.Runtime.CompilerServices; +using MiniExcelLib.Core.DataReader; +using MiniExcelLib.Core.Helpers; +using MiniExcelLib.Csv; +using Zomp.SyncMethodGenerator; + +namespace MiniExcelLib; + +public static partial class MiniExcel +{ + public static partial class Importer + { + #region Query + + [CreateSyncVersion] + public static async IAsyncEnumerable QueryCsvAsync(string path, CsvConfiguration? configuration = null, + bool treatHeaderAsData = false, [EnumeratorCancellation] CancellationToken cancellationToken = default) + where T : class, new() + { + using var stream = FileHelper.OpenSharedRead(path); + + var query = QueryCsvAsync(stream, treatHeaderAsData, configuration, cancellationToken); + + //Foreach yield return twice reason : https://stackoverflow.com/questions/66791982/ienumerable-extract-code-lazy-loading-show-stream-was-not-readable + await foreach (var item in query.ConfigureAwait(false)) + yield return item; + } + + [CreateSyncVersion] + public static async IAsyncEnumerable QueryCsvAsync(Stream stream, bool treatHeaderAsData = false, + CsvConfiguration? configuration = null, + [EnumeratorCancellation] CancellationToken cancellationToken = default) + where T : class, new() + { + using var csv = new CsvReader(stream, configuration); + await foreach (var item in csv.QueryAsync(null, "A1", treatHeaderAsData, cancellationToken).ConfigureAwait(false)) + yield return item; + } + + [CreateSyncVersion] + public static async IAsyncEnumerable QueryCsvAsync(string path, bool useHeaderRow = false, + CsvConfiguration? configuration = null, + [EnumeratorCancellation] CancellationToken cancellationToken = default) + { + using var stream = FileHelper.OpenSharedRead(path); + await foreach (var item in QueryCsvAsync(stream, useHeaderRow, configuration, cancellationToken).ConfigureAwait(false)) + yield return item; + } + + [CreateSyncVersion] + public static async IAsyncEnumerable QueryCsvAsync(Stream stream, bool useHeaderRow = false, + CsvConfiguration? configuration = null, + [EnumeratorCancellation] CancellationToken cancellationToken = default) + { +#pragma warning disable CA2007 + using var excelReader = new CsvReader(stream, configuration); + await foreach (var item in excelReader.QueryAsync(useHeaderRow, null, "A1", cancellationToken).ConfigureAwait(false)) + yield return item.Aggregate(seed: GetNewExpandoObject(), func: AddPairToDict); +#pragma warning restore CA2007 + } + + #endregion + + #region Query As DataTable + + /// + /// QueryAsDataTable is not recommended, because it'll load all data into memory. + /// + [CreateSyncVersion] + public static async Task QueryCsvAsDataTableAsync(string path, bool useHeaderRow = true, + CsvConfiguration? configuration = null, CancellationToken cancellationToken = default) + { + using var stream = FileHelper.OpenSharedRead(path); + return await QueryCsvAsDataTableAsync(stream, useHeaderRow, configuration, cancellationToken).ConfigureAwait(false); + } + + /// + /// QueryAsDataTable is not recommended, because it'll load all data into memory. + /// + [CreateSyncVersion] + public static async Task QueryCsvAsDataTableAsync(Stream stream, bool useHeaderRow = true, + CsvConfiguration? configuration = null, CancellationToken cancellationToken = default) + { + var dt = new DataTable(); + var first = true; + using var reader = new CsvReader(stream, configuration); + var rows = reader.QueryAsync(false, null, "A1", cancellationToken); + + var columnDict = new Dictionary(); +#pragma warning disable CA2007 + await foreach (var row in rows.ConfigureAwait(false)) +#pragma warning restore CA2007 + { + if (first) + { + foreach (var entry in row) + { + cancellationToken.ThrowIfCancellationRequested(); + + var columnName = useHeaderRow ? entry.Value?.ToString() : entry.Key; + if (!string.IsNullOrWhiteSpace(columnName)) // avoid #298 : Column '' does not belong to table + { + var column = new DataColumn(columnName, typeof(object)) { Caption = columnName }; + dt.Columns.Add(column); + columnDict.Add(entry.Key, columnName!); //same column name throw exception??? + } + } + + dt.BeginLoadData(); + first = false; + if (useHeaderRow) + { + continue; + } + } + + var newRow = dt.NewRow(); + foreach (var entry in columnDict) + { + newRow[entry.Value] = row[entry.Key]; //TODO: optimize not using string key + } + + dt.Rows.Add(newRow); + } + + dt.EndLoadData(); + return dt; + } + + #endregion + + #region Info + + [CreateSyncVersion] + public static async Task> GetCsvColumnsAsync(string path, bool useHeaderRow = false, + CsvConfiguration? configuration = null, CancellationToken cancellationToken = default) + { + using var stream = FileHelper.OpenSharedRead(path); + return await GetCsvColumnsAsync(stream, useHeaderRow, configuration, cancellationToken).ConfigureAwait(false); + } + + [CreateSyncVersion] + public static async Task> GetCsvColumnsAsync(Stream stream, bool useHeaderRow = false, + CsvConfiguration? configuration = null, CancellationToken cancellationToken = default) + { +#pragma warning disable CA2007 // Consider calling ConfigureAwait on the awaited task + await using var enumerator = QueryCsvAsync(stream, useHeaderRow, configuration, cancellationToken).GetAsyncEnumerator(cancellationToken); +#pragma warning restore CA2007 // Consider calling ConfigureAwait on the awaited task + + _ = enumerator.ConfigureAwait(false); + if (await enumerator.MoveNextAsync().ConfigureAwait(false)) + { + return (enumerator.Current as IDictionary)?.Keys ?? []; + } + + return []; + } + + #endregion + + #region DataReader + + public static MiniExcelDataReader GetCsvDataReader(string path, bool useHeaderRow = false, CsvConfiguration? configuration = null) + { + var stream = FileHelper.OpenSharedRead(path); + var values = QueryCsv(stream, useHeaderRow, configuration).Cast>(); + + return MiniExcelDataReader.Create(stream, values); + } + + public static MiniExcelDataReader GetCsvDataReader(Stream stream, bool useHeaderRow = false, CsvConfiguration? configuration = null) + { + var values = QueryCsv(stream, useHeaderRow, configuration).Cast>(); + return MiniExcelDataReader.Create(stream, values); + } + + #endregion + } +} \ No newline at end of file diff --git a/src/MiniExcel/Importer/MiniExcelImporter.OpenXml.cs b/src/MiniExcel/Importer/MiniExcelImporter.OpenXml.cs new file mode 100644 index 00000000..24c7dc0e --- /dev/null +++ b/src/MiniExcel/Importer/MiniExcelImporter.OpenXml.cs @@ -0,0 +1,305 @@ +using System.Data; +using System.Diagnostics.CodeAnalysis; +using System.Runtime.CompilerServices; +using MiniExcelLib.Core.DataReader; +using MiniExcelLib.Core.Helpers; +using MiniExcelLib.Core.OpenXml; +using MiniExcelLib.Core.OpenXml.Models; +using MiniExcelLib.Core.OpenXml.Zip; +using Zomp.SyncMethodGenerator; + +namespace MiniExcelLib; + +public static partial class MiniExcel +{ + public static partial class Importer + { + #region Query + + [CreateSyncVersion] + public static async IAsyncEnumerable QueryXlsxAsync(string path, string? sheetName = null, + string startCell = "A1", bool treatHeaderAsData = false, OpenXmlConfiguration? configuration = null, + [EnumeratorCancellation] CancellationToken cancellationToken = default) where T : class, new() + { + using var stream = FileHelper.OpenSharedRead(path); + + var query = QueryXlsxAsync(stream, sheetName, startCell, treatHeaderAsData, configuration, cancellationToken); + + //Foreach yield return twice reason : https://stackoverflow.com/questions/66791982/ienumerable-extract-code-lazy-loading-show-stream-was-not-readable + await foreach (var item in query.ConfigureAwait(false)) + yield return item; + } + + [CreateSyncVersion] + [SuppressMessage("Reliability", "CA2007:Do not directly await a Task")] + public static async IAsyncEnumerable QueryXlsxAsync(Stream stream, string? sheetName = null, + string startCell = "A1", bool treatHeaderAsData = false, OpenXmlConfiguration? configuration = null, + [EnumeratorCancellation] CancellationToken cancellationToken = default) where T : class, new() + { + using var reader = await OpenXmlReader.CreateAsync(stream, configuration, cancellationToken).ConfigureAwait(false); + await foreach (var item in reader.QueryAsync(sheetName, startCell, treatHeaderAsData, cancellationToken).ConfigureAwait(false)) + yield return item; + } + + [CreateSyncVersion] + public static async IAsyncEnumerable QueryXlsxAsync(string path, bool useHeaderRow = false, + string? sheetName = null, string startCell = "A1", OpenXmlConfiguration? configuration = null, + [EnumeratorCancellation] CancellationToken cancellationToken = default) + { + using var stream = FileHelper.OpenSharedRead(path); + await foreach (var item in QueryXlsxAsync(stream, useHeaderRow, sheetName, startCell, configuration, cancellationToken).ConfigureAwait(false)) + yield return item; + } + + [CreateSyncVersion] + [SuppressMessage("Reliability", "CA2007:Do not directly await a Task")] + public static async IAsyncEnumerable QueryXlsxAsync(Stream stream, bool useHeaderRow = false, + string? sheetName = null, string startCell = "A1", OpenXmlConfiguration? configuration = null, + [EnumeratorCancellation] CancellationToken cancellationToken = default) + { + using var excelReader = await OpenXmlReader.CreateAsync(stream, configuration, cancellationToken).ConfigureAwait(false); + await foreach (var item in excelReader.QueryAsync(useHeaderRow, sheetName, startCell, cancellationToken).ConfigureAwait(false)) + yield return item.Aggregate(seed: GetNewExpandoObject(), func: AddPairToDict); + } + + #endregion + + #region Query Range + + /// + /// Extract the given range。 Only uppercase letters are effective。 + /// e.g. + /// MiniExcel.QueryRange(path, startCell: "A2", endCell: "C3") + /// A2 represents the second row of column A, C3 represents the third row of column C + /// If you don't want to restrict rows, just don't include numbers + /// + /// + [CreateSyncVersion] + public static async IAsyncEnumerable QueryRangeXlsxAsync(string path, bool useHeaderRow = false, + string? sheetName = null, string startCell = "A1", string endCell = "", OpenXmlConfiguration? configuration = null, + [EnumeratorCancellation] CancellationToken cancellationToken = default) + { + using var stream = FileHelper.OpenSharedRead(path); + await foreach (var item in QueryRangeXlsxAsync(stream, useHeaderRow, sheetName, startCell, endCell, configuration, cancellationToken).ConfigureAwait(false)) + yield return item; + } + + [CreateSyncVersion] + [SuppressMessage("Reliability", "CA2007:Do not directly await a Task")] + public static async IAsyncEnumerable QueryRangeXlsxAsync(Stream stream, bool useHeaderRow = false, + string? sheetName = null, string startCell = "A1", string endCell = "", OpenXmlConfiguration? configuration = null, + [EnumeratorCancellation] CancellationToken cancellationToken = default) + { + using var excelReader = await OpenXmlReader.CreateAsync(stream, configuration, cancellationToken).ConfigureAwait(false); + await foreach (var item in excelReader.QueryRangeAsync(useHeaderRow, sheetName, startCell, endCell, cancellationToken).ConfigureAwait(false)) + yield return item.Aggregate(seed: GetNewExpandoObject(), func: AddPairToDict); + } + + [CreateSyncVersion] + public static async IAsyncEnumerable QueryRangeXlsxAsync(string path, bool useHeaderRow = false, + string? sheetName = null, int startRowIndex = 1, int startColumnIndex = 1, int? endRowIndex = null, + int? endColumnIndex = null, OpenXmlConfiguration? configuration = null, + [EnumeratorCancellation] CancellationToken cancellationToken = default) + { + using var stream = FileHelper.OpenSharedRead(path); + await foreach (var item in QueryRangeXlsxAsync(stream, useHeaderRow, sheetName, startRowIndex, startColumnIndex, endRowIndex, endColumnIndex, configuration, cancellationToken).ConfigureAwait(false)) + yield return item; + } + + [CreateSyncVersion] + [SuppressMessage("Reliability", "CA2007:Do not directly await a Task")] + public static async IAsyncEnumerable QueryRangeXlsxAsync(Stream stream, bool useHeaderRow = false, + string? sheetName = null, int startRowIndex = 1, int startColumnIndex = 1, int? endRowIndex = null, + int? endColumnIndex = null, OpenXmlConfiguration? configuration = null, + [EnumeratorCancellation] CancellationToken cancellationToken = default) + { + using var excelReader = await OpenXmlReader.CreateAsync(stream, configuration, cancellationToken).ConfigureAwait(false); + await foreach (var item in excelReader.QueryRangeAsync(useHeaderRow, sheetName, startRowIndex, startColumnIndex, endRowIndex, endColumnIndex, cancellationToken).ConfigureAwait(false)) + yield return item.Aggregate(seed: GetNewExpandoObject(), func: AddPairToDict); + } + + #endregion + + #region Query As DataTable + + /// + /// QueryAsDataTable is not recommended, because it'll load all data into memory. + /// + [CreateSyncVersion] + public static async Task QueryXlsxAsDataTableAsync(string path, bool useHeaderRow = true, + string? sheetName = null, string startCell = "A1", OpenXmlConfiguration? configuration = null, + CancellationToken cancellationToken = default) + { + using var stream = FileHelper.OpenSharedRead(path); + return await QueryXlsxAsDataTableAsync(stream, useHeaderRow, sheetName, startCell, configuration, cancellationToken).ConfigureAwait(false); + } + + /// + /// QueryAsDataTable is not recommended, because it'll load all data into memory. + /// + [CreateSyncVersion] + public static async Task QueryXlsxAsDataTableAsync(Stream stream, bool useHeaderRow = true, + string? sheetName = null, string startCell = "A1", OpenXmlConfiguration? configuration = null, + CancellationToken cancellationToken = default) + { + /*Issue #279*/ + sheetName ??= (await GetSheetNamesAsync(stream, configuration, cancellationToken).ConfigureAwait(false)).First(); + + var dt = new DataTable(sheetName); + var first = true; + using var reader = await OpenXmlReader.CreateAsync(stream, configuration, cancellationToken).ConfigureAwait(false); + var rows = reader.QueryAsync(false, sheetName, startCell, cancellationToken); + + var columnDict = new Dictionary(); +#pragma warning disable CA2007 + await foreach (var row in rows.ConfigureAwait(false)) +#pragma warning restore CA2007 + { + if (first) + { + foreach (var entry in row) + { + cancellationToken.ThrowIfCancellationRequested(); + + var columnName = useHeaderRow ? entry.Value?.ToString() : entry.Key; + if (!string.IsNullOrWhiteSpace(columnName)) // avoid #298 : Column '' does not belong to table + { + var column = new DataColumn(columnName, typeof(object)) { Caption = columnName }; + dt.Columns.Add(column); + columnDict.Add(entry.Key, columnName!); //same column name throw exception??? + } + } + + dt.BeginLoadData(); + first = false; + if (useHeaderRow) + { + continue; + } + } + + var newRow = dt.NewRow(); + foreach (var entry in columnDict) + { + newRow[entry.Value] = row[entry.Key]; //TODO: optimize not using string key + } + + dt.Rows.Add(newRow); + } + + dt.EndLoadData(); + return dt; + } + + #endregion + + #region Sheet Info + + [CreateSyncVersion] + public static async Task> GetSheetNamesAsync(string path, OpenXmlConfiguration? config = null, + CancellationToken cancellationToken = default) + { + using var stream = FileHelper.OpenSharedRead(path); + return await GetSheetNamesAsync(stream, config, cancellationToken).ConfigureAwait(false); + } + + [CreateSyncVersion] + public static async Task> GetSheetNamesAsync(Stream stream, OpenXmlConfiguration? config = null, + CancellationToken cancellationToken = default) + { + config ??= OpenXmlConfiguration.DefaultConfig; + + // todo: figure out why adding using statement breaks the tests +#pragma warning disable CA2000 // Dispose objects before losing scope + var archive = new OpenXmlZip(stream); +#pragma warning restore CA2000 // Dispose objects before losing scope + + using var reader = await OpenXmlReader.CreateAsync(stream, config, cancellationToken: cancellationToken).ConfigureAwait(false); + var rels = await reader.GetWorkbookRelsAsync(archive.EntryCollection, cancellationToken).ConfigureAwait(false); + + return rels?.Select(s => s.Name).ToList() ?? []; + } + + [CreateSyncVersion] + public static async Task> GetSheetInformationsAsync(string path, OpenXmlConfiguration? config = null, CancellationToken cancellationToken = default) + { + using var stream = FileHelper.OpenSharedRead(path); + return await GetSheetInformationsAsync(stream, config, cancellationToken).ConfigureAwait(false); + } + + [CreateSyncVersion] + public static async Task> GetSheetInformationsAsync(Stream stream, OpenXmlConfiguration? config = null, CancellationToken cancellationToken = default) + { + config ??= OpenXmlConfiguration.DefaultConfig; + + using var archive = new OpenXmlZip(stream); + using var reader = await OpenXmlReader.CreateAsync(stream, config, cancellationToken: cancellationToken).ConfigureAwait(false); + var rels = await reader.GetWorkbookRelsAsync(archive.EntryCollection, cancellationToken).ConfigureAwait(false); + + return rels?.Select((s, i) => s.ToSheetInfo((uint)i)).ToList() ?? []; + } + + [CreateSyncVersion] + public static async Task> GetSheetDimensionsAsync(string path, CancellationToken cancellationToken = default) + { + using var stream = FileHelper.OpenSharedRead(path); + return await GetSheetDimensionsAsync(stream, cancellationToken).ConfigureAwait(false); + } + + [CreateSyncVersion] + public static async Task> GetSheetDimensionsAsync(Stream stream, CancellationToken cancellationToken = default) + { + using var reader = await OpenXmlReader.CreateAsync(stream, null, cancellationToken: cancellationToken).ConfigureAwait(false); + return await reader.GetDimensionsAsync(cancellationToken).ConfigureAwait(false); + } + + [CreateSyncVersion] + public static async Task> GetXlsxColumnsAsync(string path, bool useHeaderRow = false, + string? sheetName = null, string startCell = "A1", OpenXmlConfiguration? configuration = null, + CancellationToken cancellationToken = default) + { + using var stream = FileHelper.OpenSharedRead(path); + return await GetXlsxColumnsAsync(stream, useHeaderRow, sheetName, startCell, configuration, cancellationToken).ConfigureAwait(false); + } + + [CreateSyncVersion] + public static async Task> GetXlsxColumnsAsync(Stream stream, bool useHeaderRow = false, + string? sheetName = null, string startCell = "A1", OpenXmlConfiguration? configuration = null, + CancellationToken cancellationToken = default) + { +#pragma warning disable CA2007 // Consider calling ConfigureAwait on the awaited task + await using var enumerator = QueryXlsxAsync(stream, useHeaderRow, sheetName, startCell, configuration, cancellationToken).GetAsyncEnumerator(cancellationToken); +#pragma warning restore CA2007 // Consider calling ConfigureAwait on the awaited task + + _ = enumerator.ConfigureAwait(false); + if (await enumerator.MoveNextAsync().ConfigureAwait(false)) + { + return (enumerator.Current as IDictionary)?.Keys ?? []; + } + + return []; + } + + #endregion + + #region DataReader + + public static MiniExcelDataReader GetXlsxDataReader(string path, bool useHeaderRow = false, + string? sheetName = null, string startCell = "A1", OpenXmlConfiguration? configuration = null) + { + var stream = FileHelper.OpenSharedRead(path); + var values = QueryXlsx(stream, useHeaderRow, sheetName, startCell, configuration).Cast>(); + + return new MiniExcelDataReader(stream, values); + } + + public static MiniExcelDataReader GetXlsxDataReader(Stream stream, bool useHeaderRow = false, + string? sheetName = null, string startCell = "A1", OpenXmlConfiguration? configuration = null) + { + var values = QueryXlsx(stream, useHeaderRow, sheetName, startCell, configuration).Cast>(); + return new MiniExcelDataReader(stream, values); + } + + #endregion + } +} \ No newline at end of file diff --git a/src/MiniExcel/MiniExcel.cs b/src/MiniExcel/MiniExcel.cs index 461343d4..f47fce55 100644 --- a/src/MiniExcel/MiniExcel.cs +++ b/src/MiniExcel/MiniExcel.cs @@ -1,425 +1,29 @@ -using System; -using System.Collections; -using System.Collections.Generic; -using System.Data; -using System.Diagnostics.CodeAnalysis; -using System.Dynamic; -using System.IO; -using System.Linq; -using System.Runtime.CompilerServices; -using System.Threading; -using System.Threading.Tasks; -using MiniExcelLibs.OpenXml; -using MiniExcelLibs.OpenXml.Models; -using MiniExcelLibs.Picture; -using MiniExcelLibs.Utils; -using MiniExcelLibs.Zip; -using Zomp.SyncMethodGenerator; +using System.Dynamic; +using MiniExcelLib.Core.OpenXml; +using MiniExcelLib.Core.OpenXml.Templates; -namespace MiniExcelLibs; +namespace MiniExcelLib; public static partial class MiniExcel { - [CreateSyncVersion] - public static async Task AddPictureAsync(string path, CancellationToken cancellationToken = default, params MiniExcelPicture[] images) + public static partial class Exporter; + + public static partial class Importer { - using var stream = File.Open(path, FileMode.OpenOrCreate); - await MiniExcelPictureImplement.AddPictureAsync(stream, cancellationToken, images).ConfigureAwait(false); - } - - [CreateSyncVersion] - public static async Task AddPictureAsync(Stream excelStream, CancellationToken cancellationToken = default, params MiniExcelPicture[] images) - { - await MiniExcelPictureImplement.AddPictureAsync(excelStream, cancellationToken, images).ConfigureAwait(false); - } - - public static MiniExcelDataReader GetReader(string path, bool useHeaderRow = false, string? sheetName = null, ExcelType excelType = ExcelType.UNKNOWN, string startCell = "A1", IMiniExcelConfiguration? configuration = null) - { - var stream = FileHelper.OpenSharedRead(path); - return new MiniExcelDataReader(stream, useHeaderRow, sheetName, excelType, startCell, configuration); - } - - public static MiniExcelDataReader GetReader(this Stream stream, bool useHeaderRow = false, string? sheetName = null, ExcelType excelType = ExcelType.UNKNOWN, string startCell = "A1", IMiniExcelConfiguration? configuration = null) - { - return new MiniExcelDataReader(stream, useHeaderRow, sheetName, excelType, startCell, configuration); - } - - [CreateSyncVersion] - public static async Task InsertAsync(string path, object value, string? sheetName = "Sheet1", ExcelType excelType = ExcelType.UNKNOWN, IMiniExcelConfiguration? configuration = null, bool printHeader = true, bool overwriteSheet = false, CancellationToken cancellationToken = default) - { - if (Path.GetExtension(path).Equals(".xlsm", StringComparison.InvariantCultureIgnoreCase)) - throw new NotSupportedException("MiniExcel's Insert does not support the .xlsm format"); - - if (!File.Exists(path)) - { - var rowsWritten = await SaveAsAsync(path, value, printHeader, sheetName, excelType, configuration, cancellationToken: cancellationToken).ConfigureAwait(false); - return rowsWritten.FirstOrDefault(); - } - - if (excelType == ExcelType.CSV) + private static IDictionary GetNewExpandoObject() => new ExpandoObject(); + private static IDictionary AddPairToDict(IDictionary dict, KeyValuePair pair) { - using var stream = new FileStream(path, FileMode.Append, FileAccess.Write, FileShare.Read, 4096, FileOptions.SequentialScan); - return await InsertAsync(stream, value, sheetName, ExcelTypeHelper.GetExcelType(path, excelType), configuration, printHeader, overwriteSheet, cancellationToken).ConfigureAwait(false); + dict.Add(pair); + return dict; } - else - { - using var stream = new FileStream(path, FileMode.Open, FileAccess.ReadWrite, FileShare.Read, 4096, FileOptions.SequentialScan); - return await InsertAsync(stream, value, sheetName, ExcelTypeHelper.GetExcelType(path, excelType), configuration, printHeader, overwriteSheet, cancellationToken).ConfigureAwait(false); - } - } - - [CreateSyncVersion] - [SuppressMessage("Reliability", "CA2000:Dispose objects before losing scope", Justification = "TODO: CsvWriter needs to be disposed")] - public static async Task InsertAsync(this Stream stream, object value, string? sheetName = "Sheet1", ExcelType excelType = ExcelType.XLSX, IMiniExcelConfiguration? configuration = null, bool printHeader = true, bool overwriteSheet = false, CancellationToken cancellationToken = default) - { - stream.Seek(0, SeekOrigin.End); - if (excelType == ExcelType.CSV) - { - var newValue = value is IEnumerable or IDataReader ? value : new[] { value }; - var provider = ExcelWriterFactory.GetProvider(stream, newValue, sheetName, excelType, configuration, false); - return await provider.InsertAsync(overwriteSheet, cancellationToken).ConfigureAwait(false); - } - else - { - configuration ??= new OpenXmlConfiguration { FastMode = true }; - return await ExcelWriterFactory.GetProvider(stream, value, sheetName, excelType, configuration, printHeader).InsertAsync(overwriteSheet, cancellationToken).ConfigureAwait(false); - } - } - - [CreateSyncVersion] - public static async Task SaveAsAsync(string path, object value, bool printHeader = true, string? sheetName = "Sheet1", ExcelType excelType = ExcelType.UNKNOWN, IMiniExcelConfiguration? configuration = null, bool overwriteFile = false, CancellationToken cancellationToken = default) - { - if (Path.GetExtension(path).ToLowerInvariant() == ".xlsm") - throw new NotSupportedException("MiniExcel's SaveAs does not support the .xlsm format"); - - using var stream = overwriteFile ? File.Create(path) : new FileStream(path, FileMode.CreateNew); - return await SaveAsAsync(stream, value, printHeader, sheetName, ExcelTypeHelper.GetExcelType(path, excelType), configuration, cancellationToken).ConfigureAwait(false); - } - - [CreateSyncVersion] - [SuppressMessage("Reliability", "CA2000:Dispose objects before losing scope", Justification = "TODO: CsvWriter needs to be disposed")] - public static async Task SaveAsAsync(this Stream stream, object value, bool printHeader = true, string? sheetName = "Sheet1", ExcelType excelType = ExcelType.XLSX, IMiniExcelConfiguration? configuration = null, CancellationToken cancellationToken = default) - { - return await ExcelWriterFactory.GetProvider(stream, value, sheetName, excelType, configuration, printHeader) - .SaveAsAsync(cancellationToken) - .ConfigureAwait(false); - } - - [CreateSyncVersion] - public static async IAsyncEnumerable QueryAsync(string path, string? sheetName = null, ExcelType excelType = ExcelType.UNKNOWN, string startCell = "A1", IMiniExcelConfiguration? configuration = null, bool hasHeader = true, [EnumeratorCancellation] CancellationToken cancellationToken = default) where T : class, new() - { - using var stream = FileHelper.OpenSharedRead(path); - - var query = QueryAsync(stream, sheetName, ExcelTypeHelper.GetExcelType(path, excelType), startCell, configuration, hasHeader, cancellationToken); - await foreach (var item in query.ConfigureAwait(false)) - yield return item; //Foreach yield return twice reason : https://stackoverflow.com/questions/66791982/ienumerable-extract-code-lazy-loading-show-stream-was-not-readable - } - - [CreateSyncVersion] - public static async IAsyncEnumerable QueryAsync(this Stream stream, string? sheetName = null, ExcelType excelType = ExcelType.UNKNOWN, string startCell = "A1", IMiniExcelConfiguration? configuration = null, bool hasHeader = true, [EnumeratorCancellation] CancellationToken cancellationToken = default) where T : class, new() - { - using var excelReader = await ExcelReaderFactory.GetProviderAsync(stream, ExcelTypeHelper.GetExcelType(stream, excelType), configuration, cancellationToken).ConfigureAwait(false); - await foreach (var item in excelReader.QueryAsync(sheetName, startCell, hasHeader, cancellationToken).ConfigureAwait(false)) - yield return item; - } - - [CreateSyncVersion] - public static async IAsyncEnumerable QueryAsync(string path, bool useHeaderRow = false, string? sheetName = null, ExcelType excelType = ExcelType.UNKNOWN, string startCell = "A1", IMiniExcelConfiguration? configuration = null, [EnumeratorCancellation] CancellationToken cancellationToken = default) - { - using var stream = FileHelper.OpenSharedRead(path); - await foreach (var item in QueryAsync(stream, useHeaderRow, sheetName, ExcelTypeHelper.GetExcelType(path, excelType), startCell, configuration, cancellationToken).ConfigureAwait(false)) - yield return item; - } - - [CreateSyncVersion] - public static async IAsyncEnumerable QueryAsync(this Stream stream, bool useHeaderRow = false, string? sheetName = null, ExcelType excelType = ExcelType.UNKNOWN, string startCell = "A1", IMiniExcelConfiguration? configuration = null, [EnumeratorCancellation] CancellationToken cancellationToken = default) - { - using var excelReader = await ExcelReaderFactory.GetProviderAsync(stream, ExcelTypeHelper.GetExcelType(stream, excelType), configuration, cancellationToken).ConfigureAwait(false); - await foreach (var item in excelReader.QueryAsync(useHeaderRow, sheetName, startCell, cancellationToken).ConfigureAwait(false)) - yield return item.Aggregate( - new ExpandoObject() as IDictionary, - (dict, p) => { dict.Add(p); return dict; }); - } - - #region QueryRange - - /// - /// Extract the given range。 Only uppercase letters are effective。 - /// e.g. - /// MiniExcel.QueryRange(path, startCell: "A2", endCell: "C3") - /// A2 represents the second row of column A, C3 represents the third row of column C - /// If you don't want to restrict rows, just don't include numbers - /// - /// - /// - /// - /// - /// top left corner - /// lower right corner - /// - /// - /// - [CreateSyncVersion] - public static async IAsyncEnumerable QueryRangeAsync(string path, bool useHeaderRow = false, string? sheetName = null, ExcelType excelType = ExcelType.UNKNOWN, string startCell = "A1", string endCell = "", IMiniExcelConfiguration? configuration = null, [EnumeratorCancellation] CancellationToken cancellationToken = default) - { - using var stream = FileHelper.OpenSharedRead(path); - await foreach (var item in QueryRangeAsync(stream, useHeaderRow, sheetName, ExcelTypeHelper.GetExcelType(path, excelType), startCell, endCell, configuration, cancellationToken).ConfigureAwait(false)) - yield return item; - } - - [CreateSyncVersion] - public static async IAsyncEnumerable QueryRangeAsync(this Stream stream, bool useHeaderRow = false, string? sheetName = null, ExcelType excelType = ExcelType.UNKNOWN, string startCell = "A1", string endCell = "", IMiniExcelConfiguration? configuration = null, [EnumeratorCancellation] CancellationToken cancellationToken = default) - { - using var excelReader = await ExcelReaderFactory.GetProviderAsync(stream, ExcelTypeHelper.GetExcelType(stream, excelType), configuration, cancellationToken).ConfigureAwait(false); - await foreach (var item in excelReader.QueryRangeAsync(useHeaderRow, sheetName, startCell, endCell, cancellationToken).ConfigureAwait(false)) - yield return item.Aggregate( - new ExpandoObject() as IDictionary, - (dict, p) => { dict.Add(p); return dict; }); - } - - [CreateSyncVersion] - public static async IAsyncEnumerable QueryRangeAsync(string path, bool useHeaderRow = false, string? sheetName = null, ExcelType excelType = ExcelType.UNKNOWN, int startRowIndex = 1, int startColumnIndex = 1, int? endRowIndex = null, int? endColumnIndex = null, IMiniExcelConfiguration? configuration = null, [EnumeratorCancellation] CancellationToken cancellationToken = default) - { - using var stream = FileHelper.OpenSharedRead(path); - await foreach (var item in QueryRangeAsync(stream, useHeaderRow, sheetName, ExcelTypeHelper.GetExcelType(path, excelType), startRowIndex, startColumnIndex, endRowIndex, endColumnIndex, configuration, cancellationToken).ConfigureAwait(false)) - yield return item; - } - - [CreateSyncVersion] - public static async IAsyncEnumerable QueryRangeAsync(this Stream stream, bool useHeaderRow = false, string? sheetName = null, ExcelType excelType = ExcelType.UNKNOWN, int startRowIndex = 1, int startColumnIndex = 1, int? endRowIndex = null, int? endColumnIndex = null, IMiniExcelConfiguration? configuration = null, [EnumeratorCancellation] CancellationToken cancellationToken = default) - { - using var excelReader = await ExcelReaderFactory.GetProviderAsync(stream, ExcelTypeHelper.GetExcelType(stream, excelType), configuration, cancellationToken).ConfigureAwait(false); - await foreach (var item in excelReader.QueryRangeAsync(useHeaderRow, sheetName, startRowIndex, startColumnIndex, endRowIndex, endColumnIndex, cancellationToken).ConfigureAwait(false)) - yield return item.Aggregate( - new ExpandoObject() as IDictionary, - (dict, p) => { dict.Add(p); return dict; }); - } - - #endregion QueryRange - - [CreateSyncVersion] - public static async Task SaveAsByTemplateAsync(string path, string templatePath, object value, IMiniExcelConfiguration? configuration = null, CancellationToken cancellationToken = default) - { - using var stream = File.Create(path); - await SaveAsByTemplateAsync(stream, templatePath, value, configuration, cancellationToken).ConfigureAwait(false); - } - - [CreateSyncVersion] - public static async Task SaveAsByTemplateAsync(string path, byte[] templateBytes, object value, IMiniExcelConfiguration? configuration = null, CancellationToken cancellationToken = default) - { - using var stream = File.Create(path); - await SaveAsByTemplateAsync(stream, templateBytes, value, configuration, cancellationToken).ConfigureAwait(false); } - [CreateSyncVersion] - public static async Task SaveAsByTemplateAsync(this Stream stream, string templatePath, object value, IMiniExcelConfiguration? configuration = null, CancellationToken cancellationToken = default) + public static partial class Templater { - await ExcelTemplateFactory.GetProvider(stream, configuration) - .SaveAsByTemplateAsync(templatePath, value, cancellationToken) - .ConfigureAwait(false); - } - - [CreateSyncVersion] - public static async Task SaveAsByTemplateAsync(this Stream stream, byte[] templateBytes, object value, IMiniExcelConfiguration? configuration = null, CancellationToken cancellationToken = default) - { - await ExcelTemplateFactory.GetProvider(stream, configuration) - .SaveAsByTemplateAsync(templateBytes, value, cancellationToken) - .ConfigureAwait(false); - } - - #region MergeCells - - [CreateSyncVersion] - public static async Task MergeSameCellsAsync(string mergedFilePath, string path, ExcelType excelType = ExcelType.XLSX, IMiniExcelConfiguration? configuration = null, CancellationToken cancellationToken = default) - { - using var stream = File.Create(mergedFilePath); - await MergeSameCellsAsync(stream, path, excelType, configuration, cancellationToken).ConfigureAwait(false); - } - - [CreateSyncVersion] - public static async Task MergeSameCellsAsync(this Stream stream, string path, ExcelType excelType = ExcelType.XLSX, IMiniExcelConfiguration? configuration = null, CancellationToken cancellationToken = default) - { - await ExcelTemplateFactory.GetProvider(stream, configuration, excelType) - .MergeSameCellsAsync(path, cancellationToken) - .ConfigureAwait(false); - } - - [CreateSyncVersion] - public static async Task MergeSameCellsAsync(this Stream stream, byte[] filePath, ExcelType excelType = ExcelType.XLSX, IMiniExcelConfiguration? configuration = null, CancellationToken cancellationToken = default) - { - await ExcelTemplateFactory.GetProvider(stream, configuration, excelType) - .MergeSameCellsAsync(filePath, cancellationToken) - .ConfigureAwait(false); - } - - #endregion - - /// - /// QueryAsDataTable is not recommended, because it'll load all data into memory. - /// - [Obsolete("QueryAsDataTable is not recommended, because it'll load all data into memory.")] - [CreateSyncVersion] - public static async Task QueryAsDataTableAsync(string path, bool useHeaderRow = true, string? sheetName = null, ExcelType excelType = ExcelType.UNKNOWN, string startCell = "A1", IMiniExcelConfiguration? configuration = null, CancellationToken cancellationToken = default) - { - using var stream = FileHelper.OpenSharedRead(path); - return await QueryAsDataTableAsync(stream, useHeaderRow, sheetName, excelType: ExcelTypeHelper.GetExcelType(path, excelType), startCell, configuration, cancellationToken).ConfigureAwait(false); - } - - [CreateSyncVersion] - public static async Task QueryAsDataTableAsync(this Stream stream, bool useHeaderRow = true, string? sheetName = null, ExcelType excelType = ExcelType.UNKNOWN, string startCell = "A1", IMiniExcelConfiguration? configuration = null, CancellationToken cancellationToken = default) - { - /*Issue #279*/ - if (sheetName is null && excelType != ExcelType.CSV) - sheetName = (await stream.GetSheetNamesAsync(configuration as OpenXmlConfiguration, cancellationToken).ConfigureAwait(false)).First(); - - var dt = new DataTable(sheetName); - var first = true; - using var provider = await ExcelReaderFactory.GetProviderAsync(stream, ExcelTypeHelper.GetExcelType(stream, excelType), configuration, cancellationToken).ConfigureAwait(false); - var rows = provider.QueryAsync(false, sheetName, startCell, cancellationToken); - - var columnDict = new Dictionary(); - await foreach (var row in rows.ConfigureAwait(false)) + private static OpenXmlTemplate GetOpenXmlTemplate(Stream stream, OpenXmlConfiguration? configuration) { - if (first) - { - foreach (var entry in row) - { - cancellationToken.ThrowIfCancellationRequested(); - - var columnName = useHeaderRow ? entry.Value?.ToString() : entry.Key; - if (!string.IsNullOrWhiteSpace(columnName)) // avoid #298 : Column '' does not belong to table - { - var column = new DataColumn(columnName, typeof(object)) { Caption = columnName }; - dt.Columns.Add(column); - columnDict.Add(entry.Key, columnName!);//same column name throw exception??? - } - } - - dt.BeginLoadData(); - first = false; - if (useHeaderRow) - { - continue; - } - } - - var newRow = dt.NewRow(); - foreach (var entry in columnDict) - { - newRow[entry.Value] = row[entry.Key]; //TODO: optimize not using string key - } - - dt.Rows.Add(newRow); + var valueExtractor = new OpenXmlValueExtractor(); + return new OpenXmlTemplate(stream, configuration, valueExtractor); } - - dt.EndLoadData(); - return dt; - } - - [CreateSyncVersion] - public static async Task> GetSheetNamesAsync(string path, OpenXmlConfiguration? config = null, CancellationToken cancellationToken = default) - { - using var stream = FileHelper.OpenSharedRead(path); - return await GetSheetNamesAsync(stream, config, cancellationToken).ConfigureAwait(false); - } - - [CreateSyncVersion] - public static async Task> GetSheetNamesAsync(this Stream stream, OpenXmlConfiguration? config = null, CancellationToken cancellationToken = default) - { - config ??= OpenXmlConfiguration.DefaultConfig; - - // todo: figure out why adding using statement breaks the tests -#pragma warning disable CA2000 // Dispose objects before losing scope - var archive = new ExcelOpenXmlZip(stream); -#pragma warning restore CA2000 // Dispose objects before losing scope - - using var reader = await ExcelOpenXmlSheetReader.CreateAsync(stream, config, cancellationToken: cancellationToken).ConfigureAwait(false); - var rels = await reader.GetWorkbookRelsAsync(archive.EntryCollection, cancellationToken).ConfigureAwait(false); - - return rels?.Select(s => s.Name).ToList() ?? []; - } - - [CreateSyncVersion] - public static async Task> GetSheetInformationsAsync(string path, OpenXmlConfiguration? config = null, CancellationToken cancellationToken = default) - { - using var stream = FileHelper.OpenSharedRead(path); - return await GetSheetInformationsAsync(stream, config, cancellationToken).ConfigureAwait(false); - } - - [CreateSyncVersion] - public static async Task> GetSheetInformationsAsync(this Stream stream, OpenXmlConfiguration? config = null, CancellationToken cancellationToken = default) - { - config ??= OpenXmlConfiguration.DefaultConfig; - - using var archive = new ExcelOpenXmlZip(stream); - using var reader = await ExcelOpenXmlSheetReader.CreateAsync(stream, config, cancellationToken: cancellationToken).ConfigureAwait(false); - var rels = await reader.GetWorkbookRelsAsync(archive.EntryCollection, cancellationToken).ConfigureAwait(false); - - return rels?.Select((s, i) => s.ToSheetInfo((uint)i)).ToList() ?? []; - } - - [CreateSyncVersion] - public static async Task> GetColumnsAsync(string path, bool useHeaderRow = false, string? sheetName = null, ExcelType excelType = ExcelType.UNKNOWN, string startCell = "A1", IMiniExcelConfiguration? configuration = null, CancellationToken cancellationToken = default) - { - using var stream = FileHelper.OpenSharedRead(path); - return await GetColumnsAsync(stream, useHeaderRow, sheetName, excelType, startCell, configuration, cancellationToken).ConfigureAwait(false); - } - - [CreateSyncVersion] - public static async Task> GetColumnsAsync(this Stream stream, bool useHeaderRow = false, string? sheetName = null, ExcelType excelType = ExcelType.UNKNOWN, string startCell = "A1", IMiniExcelConfiguration? configuration = null, CancellationToken cancellationToken = default) - { -#pragma warning disable CA2007 // Consider calling ConfigureAwait on the awaited task - await using var enumerator = QueryAsync(stream, useHeaderRow, sheetName, excelType, startCell, configuration, cancellationToken).GetAsyncEnumerator(cancellationToken); -#pragma warning restore CA2007 // Consider calling ConfigureAwait on the awaited task - - _ = enumerator.ConfigureAwait(false); - if (!await enumerator.MoveNextAsync().ConfigureAwait(false)) - return []; - - return (enumerator.Current as IDictionary)?.Keys ?? []; - } - - [CreateSyncVersion] - public static async Task> GetSheetDimensionsAsync(string path, CancellationToken cancellationToken = default) - { - using var stream = FileHelper.OpenSharedRead(path); - return await GetSheetDimensionsAsync(stream, cancellationToken).ConfigureAwait(false); - } - - [CreateSyncVersion] - public static async Task> GetSheetDimensionsAsync(this Stream stream, CancellationToken cancellationToken = default) - { - using var reader = await ExcelOpenXmlSheetReader.CreateAsync(stream, null, cancellationToken: cancellationToken).ConfigureAwait(false); - return await reader.GetDimensionsAsync(cancellationToken).ConfigureAwait(false); - } - - [CreateSyncVersion] - public static async Task ConvertCsvToXlsxAsync(string csv, string xlsx, CancellationToken cancellationToken = default) - { - using var csvStream = FileHelper.OpenSharedRead(csv); - using var xlsxStream = new FileStream(xlsx, FileMode.CreateNew); - await ConvertCsvToXlsxAsync(csvStream, xlsxStream, cancellationToken: cancellationToken).ConfigureAwait(false); - } - - [CreateSyncVersion] - public static async Task ConvertCsvToXlsxAsync(Stream csv, Stream xlsx, CancellationToken cancellationToken = default) - { - var value = QueryAsync(csv, useHeaderRow: false, excelType: ExcelType.CSV, cancellationToken: cancellationToken).ConfigureAwait(false); - await SaveAsAsync(xlsx, value, printHeader: false, excelType: ExcelType.XLSX, cancellationToken: cancellationToken).ConfigureAwait(false); - } - - [CreateSyncVersion] - public static async Task ConvertXlsxToCsvAsync(string xlsx, string csv, CancellationToken cancellationToken = default) - { - using var xlsxStream = FileHelper.OpenSharedRead(xlsx); - using var csvStream = new FileStream(csv, FileMode.CreateNew); - await ConvertXlsxToCsvAsync(xlsxStream, csvStream, cancellationToken).ConfigureAwait(false); - } - - [CreateSyncVersion] - public static async Task ConvertXlsxToCsvAsync(Stream xlsx, Stream csv, CancellationToken cancellationToken = default) - { - var value = QueryAsync(xlsx, useHeaderRow: false, excelType: ExcelType.XLSX, cancellationToken: cancellationToken).ConfigureAwait(false); - await SaveAsAsync(csv, value, printHeader: false, excelType: ExcelType.CSV, cancellationToken: cancellationToken).ConfigureAwait(false); } } \ No newline at end of file diff --git a/src/MiniExcel/MiniExcel.csproj b/src/MiniExcel/MiniExcel.csproj new file mode 100644 index 00000000..b5ccf6b4 --- /dev/null +++ b/src/MiniExcel/MiniExcel.csproj @@ -0,0 +1,41 @@ + + + + MiniExcelLib + True + ..\miniexcel.snk + + + + MiniExcel + MiniExcel + Mini-Software + excel;xlsx;csv;micro-helper;mini;openxml;helper; + Fast, Low-Memory, Easy Excel .NET processing tool for importing, exporting and templating spreadsheets + Github : https://github.com/mini-software/MiniExcel + Gitee : https://gitee.com/dotnetchina/MiniExcel + Issues : https://github.com/mini-software/MiniExcel/issues + Todo : https://github.com/mini-software/MiniExcel/projects/1?fullscreen=true + Wei Lin, Michele Bastione, PING-HSIU SHIH, Amos(izanhzh), eynarhaji, Mini-Software team + MiniExcel + Wei Lin, 2021 onwards + en + https://raw.githubusercontent.com/mini-software/MiniExcel/master/LICENSE + Apache-2.0 + https://github.com/mini-software/MiniExcel + https://github.com/mini-software/MiniExcel + Github + icon.png + Please Check [Release Notes](https://github.com/mini-software/MiniExcel/tree/master/docs) + true + true + snupkg + README.md + + + + + + + + diff --git a/src/MiniExcel/MiniExcelLibs.csproj b/src/MiniExcel/MiniExcelLibs.csproj deleted file mode 100644 index f7144b3a..00000000 --- a/src/MiniExcel/MiniExcelLibs.csproj +++ /dev/null @@ -1,63 +0,0 @@ - - - netstandard2.0;net8.0;net10.0 - 2.0.0-beta.1 - enable - - - 13 - - - - MiniExcel - Mini-Software - MiniExcel - MiniExcel - excel;xlsx;csv;micro-helper;mini;openxml;helper; - Fast, Low-Memory, Easy Excel .NET helper to import/export/template spreadsheet -Github : https://github.com/mini-software/MiniExcel -Gitee : https://gitee.com/dotnetchina/MiniExcel -Issues : https://github.com/mini-software/MiniExcel/issues -Todo : https://github.com/mini-software/MiniExcel/projects/1?fullscreen=true - Wei Lin, Michele Bastione, PING-HSIU SHIH, Amos(izanhzh), eynarhaji, Mini-Software team - MiniExcel - Wei Lin, 2021 onwards - en - https://raw.githubusercontent.com/mini-software/MiniExcel/master/LICENSE - MiniExcelLibs - Apache-2.0 - https://github.com/mini-software/MiniExcel - https://github.com/mini-software/MiniExcel - icon.png - Please Check [Release Notes](https://github.com/mini-software/MiniExcel/tree/master/docs) - Github - miniexcel.snk - True - {097903C9-1F81-4427-B4C8-530CB59687B8} - true - true - snupkg - README.md - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/MiniExcel/OpenXml/ExcelOpenXmlUtils.cs b/src/MiniExcel/OpenXml/ExcelOpenXmlUtils.cs deleted file mode 100644 index c1c74cfc..00000000 --- a/src/MiniExcel/OpenXml/ExcelOpenXmlUtils.cs +++ /dev/null @@ -1,112 +0,0 @@ -using System; -using System.Runtime.CompilerServices; -using MiniExcelLibs.Utils; - -namespace MiniExcelLibs.OpenXml; - -internal static class ExcelOpenXmlUtils -{ - public static string MinifyXml(string xml) => xml - .Replace("\r", "") - .Replace("\n", "") - .Replace("\t", "") - .Trim(); - - /// - /// Encode to XML (special characteres: ' " > < &) - /// - public static string EncodeXml(string? value) => value is null ? "" - : XmlEncoder.EncodeString(value) - ?.Replace("&", "&") - .Replace("<", "<") - .Replace(">", ">") - .Replace("\"", """) - .Replace("'", "'") - .ToString() ?? ""; - - /// X=CellLetter,Y=CellNumber,ex:A1=(1,1),B2=(2,2) - public static string ConvertXYToCell(int x, int y) - { - int dividend = x; - string columnName = string.Empty; - - while (dividend > 0) - { - var modulo = (dividend - 1) % 26; - columnName = Convert.ToChar(65 + modulo) + columnName; - dividend = (dividend - modulo) / 26; - } - return $"{columnName}{y}"; - } - - /// X=CellLetter,Y=CellNumber,ex:A1=(1,1),B2=(2,2) - public static string ConvertXYToCell(Tuple xy) => ConvertXYToCell(xy.Item1, xy.Item2); - - /// X=CellLetter,Y=CellNumber,ex:A1=(1,1),B2=(2,2) - public static Tuple ConvertCellToXY(string cell) => Tuple.Create(GetCellColumnIndex(cell), GetCellRowNumber(cell)); - - public static int GetColumnNumber(string name) - { - int number = -1; - int pow = 1; - for (int i = name.Length - 1; i >= 0; i--) - { - number += (name[i] - 'A' + 1) * pow; - pow *= 26; - } - - return number; - } - - public static int GetCellColumnIndex(string cell) - { - const string keys = " ABCDEFGHIJKLMNOPQRSTUVWXYZ"; - const int mode = 26; - - var x = 0; - var cellLetter = GetCellColumnLetter(cell); - //AA=27,ZZ=702 - foreach (var t in cellLetter) - x = x * mode + keys.IndexOf(t); - - return x; - } - - public static int GetCellRowNumber(string cell) - { - if (string.IsNullOrEmpty(cell)) - throw new Exception("cell is null or empty"); - var cellNumber = string.Empty; - foreach (var t in cell) - { - if (char.IsDigit(t)) - cellNumber += t; - } - return int.Parse(cellNumber); - } - - public static string GetCellColumnLetter(string cell) - { - string GetCellLetter = string.Empty; - foreach (var t in cell) - { - if (char.IsLetter(t)) - GetCellLetter += t; - } - return GetCellLetter; - } - - public static string ConvertColumnName(int x) - { - int dividend = x; - string columnName = string.Empty; - - while (dividend > 0) - { - var modulo = (dividend - 1) % 26; - columnName = Convert.ToChar(65 + modulo) + columnName; - dividend = (dividend - modulo) / 26; - } - return columnName; - } -} \ No newline at end of file diff --git a/src/MiniExcel/OpenXml/TableStyles.cs b/src/MiniExcel/OpenXml/TableStyles.cs deleted file mode 100644 index 7a451b1b..00000000 --- a/src/MiniExcel/OpenXml/TableStyles.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace MiniExcelLibs.OpenXml; - -public enum TableStyles -{ - None, - Default -} \ No newline at end of file diff --git a/src/MiniExcel/Properties/AssemblyInfo.cs b/src/MiniExcel/Properties/AssemblyInfo.cs deleted file mode 100644 index 118b9d39..00000000 --- a/src/MiniExcel/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,7 +0,0 @@ -using System.Runtime.CompilerServices; - -[assembly: InternalsVisibleTo("MiniExcelTests, PublicKey=002400000480000094000000060200000024000052534131000400000100010091c2c6c10d20b6c884dbc48892f91cc773d33c3a1f43ba3352700031d2d5f6a2b37cccd60469733a4597bdd94b54ee63f514dc487b21be797b1b63063941630b46ad090baabaf0650d05b9c590ea497644f0c296bb223e17dc785f0fbb255ef780905aabf4cf14ee5bca087cbd41d2231169a620529626035215604261b533c9")] - -#if PLAT_SKIP_LOCALS_INIT -[module: System.Runtime.CompilerServices.SkipLocalsInit] -#endif diff --git a/src/MiniExcel/SaveByTemplate/IInputValueExtractor.cs b/src/MiniExcel/SaveByTemplate/IInputValueExtractor.cs deleted file mode 100644 index b404a382..00000000 --- a/src/MiniExcel/SaveByTemplate/IInputValueExtractor.cs +++ /dev/null @@ -1,8 +0,0 @@ -using System.Collections.Generic; - -namespace MiniExcelLibs.SaveByTemplate; - -public interface IInputValueExtractor -{ - IDictionary ToValueDictionary(object valueObject); -} \ No newline at end of file diff --git a/src/MiniExcel/Templater/MiniExcelTemplater.OpenXml.cs b/src/MiniExcel/Templater/MiniExcelTemplater.OpenXml.cs new file mode 100644 index 00000000..7f216f6e --- /dev/null +++ b/src/MiniExcel/Templater/MiniExcelTemplater.OpenXml.cs @@ -0,0 +1,70 @@ +using MiniExcelLib.Core.OpenXml; +using Zomp.SyncMethodGenerator; + +namespace MiniExcelLib; + +public static partial class MiniExcel +{ + public static partial class Templater + { + [CreateSyncVersion] + public static async Task ApplyXlsxTemplateAsync(string path, string templatePath, object value, + OpenXmlConfiguration? configuration = null, CancellationToken cancellationToken = default) + { + using var stream = File.Create(path); + await ApplyXlsxTemplateAsync(stream, templatePath, value, configuration, cancellationToken).ConfigureAwait(false); + } + + [CreateSyncVersion] + public static async Task ApplyXlsxTemplateAsync(string path, byte[] templateBytes, object value, + OpenXmlConfiguration? configuration = null, CancellationToken cancellationToken = default) + { + using var stream = File.Create(path); + await ApplyXlsxTemplateAsync(stream, templateBytes, value, configuration, cancellationToken).ConfigureAwait(false); + } + + [CreateSyncVersion] + public static async Task ApplyXlsxTemplateAsync(Stream stream, string templatePath, object value, + OpenXmlConfiguration? configuration = null, CancellationToken cancellationToken = default) + { + var template = GetOpenXmlTemplate(stream, configuration); + await template.SaveAsByTemplateAsync(templatePath, value, cancellationToken).ConfigureAwait(false); + } + + [CreateSyncVersion] + public static async Task ApplyXlsxTemplateAsync(Stream stream, byte[] templateBytes, object value, + OpenXmlConfiguration? configuration = null, CancellationToken cancellationToken = default) + { + var template = GetOpenXmlTemplate(stream, configuration); + await template.SaveAsByTemplateAsync(templateBytes, value, cancellationToken).ConfigureAwait(false); + } + + #region Merge Cells + + [CreateSyncVersion] + public static async Task MergeSameCellsAsync(string mergedFilePath, string path, + OpenXmlConfiguration? configuration = null, CancellationToken cancellationToken = default) + { + using var stream = File.Create(mergedFilePath); + await MergeSameCellsAsync(stream, path, configuration, cancellationToken).ConfigureAwait(false); + } + + [CreateSyncVersion] + public static async Task MergeSameCellsAsync(Stream stream, string path, + OpenXmlConfiguration? configuration = null, CancellationToken cancellationToken = default) + { + var template = GetOpenXmlTemplate(stream, configuration); + await template.MergeSameCellsAsync(path, cancellationToken).ConfigureAwait(false); + } + + [CreateSyncVersion] + public static async Task MergeSameCellsAsync(Stream stream, byte[] file, + OpenXmlConfiguration? configuration = null, CancellationToken cancellationToken = default) + { + var template = GetOpenXmlTemplate(stream, configuration); + await template.MergeSameCellsAsync(file, cancellationToken).ConfigureAwait(false); + } + + #endregion + } +} \ No newline at end of file diff --git a/src/MiniExcel/Utils/ExcelTypeHelper.cs b/src/MiniExcel/Utils/ExcelTypeHelper.cs deleted file mode 100644 index 60e78ad6..00000000 --- a/src/MiniExcel/Utils/ExcelTypeHelper.cs +++ /dev/null @@ -1,44 +0,0 @@ -using System; -using System.IO; - -namespace MiniExcelLibs.Utils; - -public static class ExcelTypeHelper -{ - internal static ExcelType GetExcelType(string filePath, ExcelType excelType) - { - if (excelType != ExcelType.UNKNOWN) - return excelType; - - var extension = Path.GetExtension(filePath).ToLowerInvariant(); - return extension switch - { - ".csv" => ExcelType.CSV, - //".xls" => ExcelType.XLS, - ".xlsx" or ".xlsm" => ExcelType.XLSX, - _ => throw new NotSupportedException($"Extension {extension} is not suppprted. Try specifying the ExcelType if you know what the underlying format is.") - }; - } - - internal static ExcelType GetExcelType(Stream stream, ExcelType excelType) - { - if (excelType != ExcelType.UNKNOWN) - return excelType; - - var probe = new byte[8]; - stream.Seek(0, SeekOrigin.Begin); - var read = stream.Read(probe, 0, probe.Length); - if (read != probe.Length) - throw new InvalidDataException("The file/stream does not contain enough data to process"); - - stream.Seek(0, SeekOrigin.Begin); - - // New office format (can be any ZIP archive) - if (probe is [0x50, 0x4B, ..]) - { - return ExcelType.XLSX; - } - - throw new InvalidDataException("The file type could not be inferred automatically, please specify ExcelType manually"); - } -} \ No newline at end of file diff --git a/src/MiniExcel/Utils/StringHelper.cs b/src/MiniExcel/Utils/StringHelper.cs deleted file mode 100644 index 37981410..00000000 --- a/src/MiniExcel/Utils/StringHelper.cs +++ /dev/null @@ -1,80 +0,0 @@ -using System.Linq; -using System.Text; -using System.Threading; -using System.Threading.Tasks; -using System.Xml; -using MiniExcelLibs.OpenXml.Constants; -using Zomp.SyncMethodGenerator; - -namespace MiniExcelLibs.Utils; - -internal static partial class StringHelper -{ - private static readonly string[] Ns = [Schemas.SpreadsheetmlXmlns, Schemas.SpreadsheetmlXmlStrictns]; - - public static string GetLetters(string content) => new([..content.Where(char.IsLetter)]); - public static int GetNumber(string content) => int.Parse(new string([..content.Where(char.IsNumber)])); - - /// - /// Copied and modified from ExcelDataReader - @MIT License - /// - [CreateSyncVersion] - public static async Task ReadStringItemAsync(XmlReader reader, CancellationToken cancellationToken = default) - { - var result = new StringBuilder(); - if (!await XmlReaderHelper.ReadFirstContentAsync(reader, cancellationToken).ConfigureAwait(false)) - return string.Empty; - - while (!reader.EOF) - { - if (XmlReaderHelper.IsStartElement(reader, "t", Ns)) - { - // There are multiple in a . Concatenate within an . - result.Append(await reader.ReadElementContentAsStringAsync() -#if NET6_0_OR_GREATER - .WaitAsync(cancellationToken) -#endif - .ConfigureAwait(false)); - } - else if (XmlReaderHelper.IsStartElement(reader, "r", Ns)) - { - result.Append(await ReadRichTextRunAsync(reader, cancellationToken).ConfigureAwait(false)); - } - else if (!await XmlReaderHelper.SkipContentAsync(reader, cancellationToken).ConfigureAwait(false)) - { - break; - } - } - - return result.ToString(); - } - - /// - /// Copied and modified from ExcelDataReader - @MIT License - /// - [CreateSyncVersion] - private static async Task ReadRichTextRunAsync(XmlReader reader, CancellationToken cancellationToken = default) - { - var result = new StringBuilder(); - if (!await XmlReaderHelper.ReadFirstContentAsync(reader, cancellationToken).ConfigureAwait(false)) - return string.Empty; - - while (!reader.EOF) - { - if (XmlReaderHelper.IsStartElement(reader, "t", Ns)) - { - result.Append(await reader.ReadElementContentAsStringAsync() -#if NET6_0_OR_GREATER - .WaitAsync(cancellationToken) -#endif - .ConfigureAwait(false)); - } - else if (!await XmlReaderHelper.SkipContentAsync(reader, cancellationToken).ConfigureAwait(false)) - { - break; - } - } - - return result.ToString(); - } -} \ No newline at end of file diff --git a/src/MiniExcel/Utils/TypeHelper.cs b/src/MiniExcel/Utils/TypeHelper.cs deleted file mode 100644 index 39f9e341..00000000 --- a/src/MiniExcel/Utils/TypeHelper.cs +++ /dev/null @@ -1,227 +0,0 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Data; -using System.Globalization; -using System.Linq; -using System.Reflection; -using MiniExcelLibs.Exceptions; - -namespace MiniExcelLibs.Utils; - -internal static class TypeHelper -{ - public static IEnumerable> ConvertToEnumerableDictionary(IDataReader reader) - { - while (reader.Read()) - { - yield return Enumerable.Range(0, reader.FieldCount) - .ToDictionary( - reader.GetName, - reader.GetValue); - } - } - - /// - /// From : https://stackoverflow.com/questions/906499/getting-type-t-from-ienumerablet - /// - public static IEnumerable GetGenericIEnumerables(object o) - { - return o.GetType() - .GetInterfaces() - .Where(t => t.IsGenericType && t.GetGenericTypeDefinition() == typeof(IEnumerable<>)) - .Select(t => t.GetGenericArguments()[0]); - } - - public static bool IsNumericType(Type type, bool isNullableUnderlyingType = false) - { - if (isNullableUnderlyingType) - type = Nullable.GetUnderlyingType(type) ?? type; - - // True for all numeric types except bool, sbyte and byte - return Type.GetTypeCode(type) is >= TypeCode.Int16 and <= TypeCode.Decimal; - } - - public static object? TypeMapping(T v, ExcelColumnInfo pInfo, object itemValue, int rowIndex, string startCell, MiniExcelConfiguration config) where T : class, new() - { - try - { - return TypeMappingImpl(v, pInfo, itemValue, config); - } - catch (Exception ex) when (ex is InvalidCastException or FormatException) - { - var columnName = pInfo.ExcelColumnName ?? pInfo.Property.Name; - var startRowIndex = ReferenceHelper.ConvertCellToXY(startCell).Item2; - var errorRow = startRowIndex + rowIndex + 1; - - var msg = $"ColumnName: {columnName}, CellRow: {errorRow}, Value: {itemValue}. The value cannot be cast to type {pInfo.Property.Info.PropertyType.Name}."; - throw new ExcelInvalidCastException(columnName, errorRow, itemValue, pInfo.Property.Info.PropertyType, msg); - } - } - - private static object? TypeMappingImpl(T v, ExcelColumnInfo pInfo, object? itemValue, MiniExcelConfiguration config) where T : class, new() - { - object? newValue = null; - if (pInfo.Nullable && string.IsNullOrWhiteSpace(itemValue?.ToString())) - { - } - else if (pInfo.ExcludeNullableType == typeof(Guid)) - { - newValue = Guid.Parse(itemValue?.ToString() ?? Guid.Empty.ToString()); - } - else if (pInfo.ExcludeNullableType == typeof(DateTimeOffset)) - { - var vs = itemValue?.ToString(); - if (pInfo.ExcelFormat is not null) - { - if (DateTimeOffset.TryParseExact(vs, pInfo.ExcelFormat, CultureInfo.InvariantCulture, DateTimeStyles.None, out var value)) - { - newValue = value; - } - } - else if (DateTimeOffset.TryParse(vs, config.Culture, DateTimeStyles.None, out var value)) - { - newValue = value; - } - else - { - throw new InvalidCastException($"{vs} cannot be cast to DateTime"); - } - } - else if (pInfo.ExcludeNullableType == typeof(DateTime)) - { - // fix issue 257 https://github.com/mini-software/MiniExcel/issues/257 - if (itemValue is DateTime) - { - newValue = itemValue; - pInfo.Property.SetValue(v, newValue); - return newValue; - } - - var vs = itemValue?.ToString(); - if (pInfo.ExcelFormat is not null) - { - if (pInfo.Property.Info.PropertyType == typeof(DateTimeOffset) && DateTimeOffset.TryParseExact(vs, pInfo.ExcelFormat, CultureInfo.InvariantCulture, DateTimeStyles.None, out var offsetValue)) - { - newValue = offsetValue; - } - else if (DateTime.TryParseExact(vs, pInfo.ExcelFormat, CultureInfo.InvariantCulture, DateTimeStyles.None, out var value)) - { - newValue = value; - } - } - else if (DateTime.TryParse(vs, config.Culture, DateTimeStyles.None, out var dtValue)) - newValue = dtValue; - else if (DateTime.TryParseExact(vs, "dd/MM/yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out var dtExactValue)) - newValue = dtExactValue; - else if (double.TryParse(vs, NumberStyles.None, CultureInfo.InvariantCulture, out var doubleValue)) - newValue = DateTime.FromOADate(doubleValue); - else - throw new InvalidCastException($"{vs} cannot be cast to DateTime"); - } -#if NET6_0_OR_GREATER - else if (pInfo.ExcludeNullableType == typeof(DateOnly)) - { - if (itemValue is DateOnly) - { - newValue = itemValue; - pInfo.Property.SetValue(v, newValue); - return newValue; - } - - var vs = itemValue?.ToString(); - if (pInfo.ExcelFormat is not null) - { - if (DateOnly.TryParseExact(vs, pInfo.ExcelFormat, CultureInfo.InvariantCulture, DateTimeStyles.None, out var dateOnlyCustom)) - { - newValue = dateOnlyCustom; - } - } - else if (DateOnly.TryParse(vs, config.Culture, DateTimeStyles.None, out var dateOnly)) - newValue = dateOnly; - else if (DateOnly.TryParseExact(vs, "dd/MM/yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out var dateOnlyExact)) - newValue = dateOnlyExact; - else if (double.TryParse(vs, NumberStyles.None, CultureInfo.InvariantCulture, out var dateOnlyDouble)) - newValue = DateOnly.FromDateTime(DateTime.FromOADate(dateOnlyDouble)); - else - throw new InvalidCastException($"{vs} cannot be cast to DateOnly"); - } -#endif - else if (pInfo.ExcludeNullableType == typeof(TimeSpan)) - { - if (itemValue is TimeSpan) - { - newValue = itemValue; - pInfo.Property.SetValue(v, newValue); - return newValue; - } - - var vs = itemValue?.ToString(); - if (pInfo.ExcelFormat is not null) - { - if (TimeSpan.TryParseExact(vs, pInfo.ExcelFormat, CultureInfo.InvariantCulture, out var value)) - { - newValue = value; - } - } - else if (TimeSpan.TryParse(vs, config.Culture, out var tsValue)) - newValue = tsValue; - else if (TimeSpan.TryParseExact(vs, @"hh\:mm\:ss\.fff", CultureInfo.InvariantCulture, out var tsExactValue)) - newValue = tsExactValue; - else if (double.TryParse(vs, NumberStyles.None, CultureInfo.InvariantCulture, out var msValue)) - newValue = TimeSpan.FromMilliseconds(msValue); - else - throw new InvalidCastException($"{vs} cannot be cast to TimeSpan"); - } - else if (pInfo.ExcludeNullableType == typeof(double)) // && (!Regex.IsMatch(itemValue.ToString(), @"^-?\d+(\.\d+)?([eE][-+]?\d+)?$") || itemValue.ToString().Trim().Equals("NaN"))) - { - var invariantString = Convert.ToString(itemValue, CultureInfo.InvariantCulture); - newValue = double.TryParse(invariantString, NumberStyles.Any, CultureInfo.InvariantCulture, out var value) ? value : double.NaN; - } - else if (pInfo.ExcludeNullableType == typeof(bool)) - { - var vs = itemValue?.ToString(); - newValue = vs switch - { - "1" => true, - "0" => false, - _ => bool.TryParse(vs, out var parsed) ? parsed : null - }; - } - else if (pInfo.Property.Info.PropertyType == typeof(string)) - { - newValue = XmlEncoder.DecodeString(itemValue?.ToString()); - } - else if (pInfo.ExcludeNullableType.IsEnum) - { - var fieldInfo = pInfo.ExcludeNullableType.GetFields().FirstOrDefault(e => e.GetCustomAttribute(false)?.Description == itemValue?.ToString()); - var value = fieldInfo?.Name ?? itemValue?.ToString() ?? ""; - newValue = Enum.Parse(pInfo.ExcludeNullableType, value, true); - } - else if (pInfo.ExcludeNullableType == typeof(Uri)) - { - var rawValue = itemValue?.ToString(); - if (!Uri.TryCreate(rawValue, UriKind.RelativeOrAbsolute, out var uri)) - throw new InvalidCastException($"Value \"{rawValue}\" cannot be converted to Uri"); - newValue = uri; - } - else - { - // Use pInfo.ExcludeNullableType to resolve : https://github.com/mini-software/MiniExcel/issues/138 - newValue = Convert.ChangeType(itemValue, pInfo.ExcludeNullableType, config.Culture); - } - - pInfo.Property.SetValue(v, newValue); - return newValue; - } - - public static bool IsAsyncEnumerable(this Type type, out Type? genericArgument) - { - var asyncEnumrableInterfaceType = type - .GetInterfaces() - .FirstOrDefault(i => i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IAsyncEnumerable<>)); - - genericArgument = asyncEnumrableInterfaceType?.GetGenericArguments().FirstOrDefault(); - return genericArgument is not null; - } -} \ No newline at end of file diff --git a/src/MiniExcel/WriteAdapter/IAsyncMiniExcelWriteAdapter.cs b/src/MiniExcel/WriteAdapter/IAsyncMiniExcelWriteAdapter.cs deleted file mode 100644 index de7c1af9..00000000 --- a/src/MiniExcel/WriteAdapter/IAsyncMiniExcelWriteAdapter.cs +++ /dev/null @@ -1,13 +0,0 @@ -using MiniExcelLibs.Utils; -using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; - -namespace MiniExcelLibs.WriteAdapter; - -internal interface IAsyncMiniExcelWriteAdapter -{ - Task?> GetColumnsAsync(); - - IAsyncEnumerable> GetRowsAsync(List props, CancellationToken cancellationToken); -} \ No newline at end of file diff --git a/src/MiniExcel/WriteAdapter/IMiniExcelWriteAdapter.cs b/src/MiniExcel/WriteAdapter/IMiniExcelWriteAdapter.cs deleted file mode 100644 index e2e8afb3..00000000 --- a/src/MiniExcel/WriteAdapter/IMiniExcelWriteAdapter.cs +++ /dev/null @@ -1,19 +0,0 @@ -using System.Collections.Generic; -using System.Threading; -using MiniExcelLibs.Utils; - -namespace MiniExcelLibs.WriteAdapter; - -internal interface IMiniExcelWriteAdapter -{ - bool TryGetKnownCount(out int count); - List? GetColumns(); - IEnumerable> GetRows(List props, CancellationToken cancellationToken = default); -} - -internal readonly struct CellWriteInfo(object value, int cellIndex, ExcelColumnInfo prop) -{ - public object Value { get; } = value; - public int CellIndex { get; } = cellIndex; - public ExcelColumnInfo Prop { get; } = prop; -} \ No newline at end of file diff --git a/src/MiniExcelLib.Core/Abstractions/IInputValueExtractor.cs b/src/MiniExcelLib.Core/Abstractions/IInputValueExtractor.cs new file mode 100644 index 00000000..f0409064 --- /dev/null +++ b/src/MiniExcelLib.Core/Abstractions/IInputValueExtractor.cs @@ -0,0 +1,6 @@ +namespace MiniExcelLib.Core.Abstractions; + +public interface IInputValueExtractor +{ + IDictionary ToValueDictionary(object valueObject); +} \ No newline at end of file diff --git a/src/MiniExcel/IMiniExcelDataReader.cs b/src/MiniExcelLib.Core/Abstractions/IMiniExcelDataReader.cs similarity index 62% rename from src/MiniExcel/IMiniExcelDataReader.cs rename to src/MiniExcelLib.Core/Abstractions/IMiniExcelDataReader.cs index 253374c7..c39980e8 100644 --- a/src/MiniExcel/IMiniExcelDataReader.cs +++ b/src/MiniExcelLib.Core/Abstractions/IMiniExcelDataReader.cs @@ -1,9 +1,6 @@ -using System; -using System.Data; -using System.Threading; -using System.Threading.Tasks; +using System.Data; -namespace MiniExcelLibs; +namespace MiniExcelLib.Core.Abstractions; public interface IMiniExcelDataReader : IDataReader #if NET8_0_OR_GREATER @@ -12,7 +9,7 @@ public interface IMiniExcelDataReader : IDataReader { Task CloseAsync(); Task GetNameAsync(int i, CancellationToken cancellationToken = default); - Task GetValueAsync(int i, CancellationToken cancellationToken = default); + Task GetValueAsync(int i, CancellationToken cancellationToken = default); Task NextResultAsync(CancellationToken cancellationToken = default); Task ReadAsync(CancellationToken cancellationToken = default); } \ No newline at end of file diff --git a/src/MiniExcel/IExcelReader.cs b/src/MiniExcelLib.Core/Abstractions/IMiniExcelReader.cs similarity index 65% rename from src/MiniExcel/IExcelReader.cs rename to src/MiniExcelLib.Core/Abstractions/IMiniExcelReader.cs index 7f106895..5cf07796 100644 --- a/src/MiniExcel/IExcelReader.cs +++ b/src/MiniExcelLib.Core/Abstractions/IMiniExcelReader.cs @@ -1,27 +1,24 @@ -using System; -using System.Collections.Generic; -using System.Threading; -using Zomp.SyncMethodGenerator; +using Zomp.SyncMethodGenerator; -namespace MiniExcelLibs; +namespace MiniExcelLib.Core.Abstractions; -internal partial interface IExcelReader : IDisposable +public partial interface IMiniExcelReader : IDisposable { [CreateSyncVersion] IAsyncEnumerable> QueryAsync(bool useHeaderRow, string? sheetName, string startCell, CancellationToken cancellationToken = default); [CreateSyncVersion] - IAsyncEnumerable QueryAsync(string? sheetName, string startCell, bool hasHeader, CancellationToken cancellationToken = default) where T : class, new(); + IAsyncEnumerable QueryAsync(string? sheetName, string startCell, bool mapHeaderAsData, CancellationToken cancellationToken = default) where T : class, new(); [CreateSyncVersion] IAsyncEnumerable> QueryRangeAsync(bool useHeaderRow, string? sheetName, string startCell, string endCell, CancellationToken cancellationToken = default); [CreateSyncVersion] - IAsyncEnumerable QueryRangeAsync(string? sheetName, string startCell, string endCell, bool hasHeader, CancellationToken cancellationToken = default) where T : class, new(); + IAsyncEnumerable QueryRangeAsync(string? sheetName, string startCell, string endCell, bool treatHeaderAsData, CancellationToken cancellationToken = default) where T : class, new(); [CreateSyncVersion] IAsyncEnumerable> QueryRangeAsync(bool useHeaderRow, string? sheetName, int startRowIndex, int startColumnIndex, int? endRowIndex, int? endColumnIndex, CancellationToken cancellationToken = default); [CreateSyncVersion] - IAsyncEnumerable QueryRangeAsync(string? sheetName, int startRowIndex, int startColumnIndex, int? endRowIndex, int? endColumnIndex, bool hasHeader, CancellationToken cancellationToken = default) where T : class, new(); + IAsyncEnumerable QueryRangeAsync(string? sheetName, int startRowIndex, int startColumnIndex, int? endRowIndex, int? endColumnIndex, bool treatHeaderAsData, CancellationToken cancellationToken = default) where T : class, new(); } \ No newline at end of file diff --git a/src/MiniExcel/IExcelTemplate.cs b/src/MiniExcelLib.Core/Abstractions/IMiniExcelTemplate.cs similarity index 75% rename from src/MiniExcel/IExcelTemplate.cs rename to src/MiniExcelLib.Core/Abstractions/IMiniExcelTemplate.cs index c5ec65a6..bdba22a8 100644 --- a/src/MiniExcel/IExcelTemplate.cs +++ b/src/MiniExcelLib.Core/Abstractions/IMiniExcelTemplate.cs @@ -1,10 +1,8 @@ -using System.Threading; -using System.Threading.Tasks; -using Zomp.SyncMethodGenerator; +using Zomp.SyncMethodGenerator; -namespace MiniExcelLibs; +namespace MiniExcelLib.Core.Abstractions; -internal partial interface IExcelTemplate +public partial interface IMiniExcelTemplate { [CreateSyncVersion] Task SaveAsByTemplateAsync(string templatePath, object value, CancellationToken cancellationToken = default); diff --git a/src/MiniExcelLib.Core/Abstractions/IMiniExcelWriteAdapter.cs b/src/MiniExcelLib.Core/Abstractions/IMiniExcelWriteAdapter.cs new file mode 100644 index 00000000..1fb24a85 --- /dev/null +++ b/src/MiniExcelLib.Core/Abstractions/IMiniExcelWriteAdapter.cs @@ -0,0 +1,17 @@ +using MiniExcelLib.Core.Reflection; + +namespace MiniExcelLib.Core.Abstractions; + +public interface IMiniExcelWriteAdapter +{ + bool TryGetKnownCount(out int count); + List? GetColumns(); + IEnumerable> GetRows(List props, CancellationToken cancellationToken = default); +} + +public readonly struct CellWriteInfo(object? value, int cellIndex, MiniExcelColumnInfo prop) +{ + public object? Value { get; } = value; + public int CellIndex { get; } = cellIndex; + public MiniExcelColumnInfo Prop { get; } = prop; +} \ No newline at end of file diff --git a/src/MiniExcelLib.Core/Abstractions/IMiniExcelWriteAdapterAsync.cs b/src/MiniExcelLib.Core/Abstractions/IMiniExcelWriteAdapterAsync.cs new file mode 100644 index 00000000..03865a63 --- /dev/null +++ b/src/MiniExcelLib.Core/Abstractions/IMiniExcelWriteAdapterAsync.cs @@ -0,0 +1,9 @@ +using MiniExcelLib.Core.Reflection; + +namespace MiniExcelLib.Core.Abstractions; + +public interface IMiniExcelWriteAdapterAsync +{ + Task?> GetColumnsAsync(); + IAsyncEnumerable> GetRowsAsync(List props, CancellationToken cancellationToken); +} \ No newline at end of file diff --git a/src/MiniExcel/IExcelWriter.cs b/src/MiniExcelLib.Core/Abstractions/IMiniExcelWriter.cs similarity index 58% rename from src/MiniExcel/IExcelWriter.cs rename to src/MiniExcelLib.Core/Abstractions/IMiniExcelWriter.cs index 2b7e59c1..b56c063a 100644 --- a/src/MiniExcel/IExcelWriter.cs +++ b/src/MiniExcelLib.Core/Abstractions/IMiniExcelWriter.cs @@ -1,10 +1,8 @@ -using System.Threading; -using System.Threading.Tasks; -using Zomp.SyncMethodGenerator; +using Zomp.SyncMethodGenerator; -namespace MiniExcelLibs; +namespace MiniExcelLib.Core.Abstractions; -internal partial interface IExcelWriter +public partial interface IMiniExcelWriter { [CreateSyncVersion] Task SaveAsAsync(CancellationToken cancellationToken = default); diff --git a/src/MiniExcel/Attributes/ExcelColumnAttribute.cs b/src/MiniExcelLib.Core/Attributes/MiniExcelColumnAttribute.cs similarity index 83% rename from src/MiniExcel/Attributes/ExcelColumnAttribute.cs rename to src/MiniExcelLib.Core/Attributes/MiniExcelColumnAttribute.cs index 3ce2977e..c7a2c287 100644 --- a/src/MiniExcel/Attributes/ExcelColumnAttribute.cs +++ b/src/MiniExcelLib.Core/Attributes/MiniExcelColumnAttribute.cs @@ -1,10 +1,9 @@ -using System; -using MiniExcelLibs.Utils; +using MiniExcelLib.Core.Helpers; -namespace MiniExcelLibs.Attributes; +namespace MiniExcelLib.Core.Attributes; [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field)] -public class ExcelColumnAttribute : Attribute +public class MiniExcelColumnAttribute : Attribute { private int _index = -1; private string? _xName; @@ -42,7 +41,7 @@ private void Init(int index, string? columnName = null) public enum ColumnType { Value, Formula } -public class DynamicExcelColumn : ExcelColumnAttribute +public class DynamicExcelColumn : MiniExcelColumnAttribute { public string Key { get; set; } public Func CustomFormatter { get; set; } diff --git a/src/MiniExcel/Attributes/ExcelColumnIndexAttribute.cs b/src/MiniExcelLib.Core/Attributes/MiniExcelColumnIndexAttribute.cs similarity index 61% rename from src/MiniExcel/Attributes/ExcelColumnIndexAttribute.cs rename to src/MiniExcelLib.Core/Attributes/MiniExcelColumnIndexAttribute.cs index 0bdad2fd..73a44212 100644 --- a/src/MiniExcel/Attributes/ExcelColumnIndexAttribute.cs +++ b/src/MiniExcelLib.Core/Attributes/MiniExcelColumnIndexAttribute.cs @@ -1,15 +1,14 @@ -using System; -using MiniExcelLibs.Utils; +using MiniExcelLib.Core.Helpers; -namespace MiniExcelLibs.Attributes; +namespace MiniExcelLib.Core.Attributes; [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field)] -public class ExcelColumnIndexAttribute : Attribute +public class MiniExcelColumnIndexAttribute : Attribute { public int ExcelColumnIndex { get; set; } internal string? ExcelXName { get; set; } - public ExcelColumnIndexAttribute(string columnName) => Init(ColumnHelper.GetColumnIndex(columnName), columnName); - public ExcelColumnIndexAttribute(int columnIndex) => Init(columnIndex); + public MiniExcelColumnIndexAttribute(string columnName) => Init(ColumnHelper.GetColumnIndex(columnName), columnName); + public MiniExcelColumnIndexAttribute(int columnIndex) => Init(columnIndex); private void Init(int columnIndex, string? columnName = null) { diff --git a/src/MiniExcel/Attributes/ExcelColumnNameAttribute.cs b/src/MiniExcelLib.Core/Attributes/MiniExcelColumnNameAttribute.cs similarity index 55% rename from src/MiniExcel/Attributes/ExcelColumnNameAttribute.cs rename to src/MiniExcelLib.Core/Attributes/MiniExcelColumnNameAttribute.cs index ff271b5b..ce38efeb 100644 --- a/src/MiniExcel/Attributes/ExcelColumnNameAttribute.cs +++ b/src/MiniExcelLib.Core/Attributes/MiniExcelColumnNameAttribute.cs @@ -1,9 +1,7 @@ -using System; - -namespace MiniExcelLibs.Attributes; +namespace MiniExcelLib.Core.Attributes; [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field)] -public class ExcelColumnNameAttribute(string excelColumnName, string[]? aliases = null) : Attribute +public class MiniExcelColumnNameAttribute(string excelColumnName, string[]? aliases = null) : Attribute { public string ExcelColumnName { get; set; } = excelColumnName; public string[] Aliases { get; set; } = aliases ?? []; diff --git a/src/MiniExcel/Attributes/ExcelColumnWidthAttribute.cs b/src/MiniExcelLib.Core/Attributes/MiniExcelColumnWidthAttribute.cs similarity index 50% rename from src/MiniExcel/Attributes/ExcelColumnWidthAttribute.cs rename to src/MiniExcelLib.Core/Attributes/MiniExcelColumnWidthAttribute.cs index 699b6f6f..4f9a7b6e 100644 --- a/src/MiniExcel/Attributes/ExcelColumnWidthAttribute.cs +++ b/src/MiniExcelLib.Core/Attributes/MiniExcelColumnWidthAttribute.cs @@ -1,9 +1,7 @@ -using System; - -namespace MiniExcelLibs.Attributes; +namespace MiniExcelLib.Core.Attributes; [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field)] -public class ExcelColumnWidthAttribute(double excelColumnWidth) : Attribute +public class MiniExcelColumnWidthAttribute(double excelColumnWidth) : Attribute { public double ExcelColumnWidth { get; set; } = excelColumnWidth; } \ No newline at end of file diff --git a/src/MiniExcel/Attributes/ExcelFormatAttribute.cs b/src/MiniExcelLib.Core/Attributes/MiniExcelFormatAttribute.cs similarity index 50% rename from src/MiniExcel/Attributes/ExcelFormatAttribute.cs rename to src/MiniExcelLib.Core/Attributes/MiniExcelFormatAttribute.cs index a2aaea4b..6df4f1ae 100644 --- a/src/MiniExcel/Attributes/ExcelFormatAttribute.cs +++ b/src/MiniExcelLib.Core/Attributes/MiniExcelFormatAttribute.cs @@ -1,9 +1,7 @@ -using System; - -namespace MiniExcelLibs.Attributes; +namespace MiniExcelLib.Core.Attributes; [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field)] -public class ExcelFormatAttribute(string format) : Attribute +public class MiniExcelFormatAttribute(string format) : Attribute { public string Format { get; set; } = format; } \ No newline at end of file diff --git a/src/MiniExcelLib.Core/Attributes/MiniExcelIgnoreAttribute.cs b/src/MiniExcelLib.Core/Attributes/MiniExcelIgnoreAttribute.cs new file mode 100644 index 00000000..8b2c0692 --- /dev/null +++ b/src/MiniExcelLib.Core/Attributes/MiniExcelIgnoreAttribute.cs @@ -0,0 +1,7 @@ +namespace MiniExcelLib.Core.Attributes; + +[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field)] +public class MiniExcelIgnoreAttribute(bool excelIgnore = true) : Attribute +{ + public bool ExcelIgnore { get; set; } = excelIgnore; +} \ No newline at end of file diff --git a/src/MiniExcel/MiniExcelDataReader.cs b/src/MiniExcelLib.Core/DataReader/MiniExcelDataReader.cs similarity index 65% rename from src/MiniExcel/MiniExcelDataReader.cs rename to src/MiniExcelLib.Core/DataReader/MiniExcelDataReader.cs index 8dbb1756..89107d5d 100644 --- a/src/MiniExcel/MiniExcelDataReader.cs +++ b/src/MiniExcelLib.Core/DataReader/MiniExcelDataReader.cs @@ -1,9 +1,4 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; - -namespace MiniExcelLibs; +namespace MiniExcelLib.Core.DataReader; public class MiniExcelDataReader : MiniExcelDataReaderBase { @@ -18,16 +13,11 @@ public class MiniExcelDataReader : MiniExcelDataReaderBase /// /// Initializes a new instance of the class. /// - /// The stream to read from. - /// Whether to use the header row. - /// The name of the sheet. - /// The type of the Excel file. - /// The start cell. - /// The configuration. - internal MiniExcelDataReader(Stream stream, bool useHeaderRow = false, string? sheetName = null, ExcelType excelType = ExcelType.UNKNOWN, string startCell = "A1", IMiniExcelConfiguration? configuration = null) + internal MiniExcelDataReader(Stream? stream, IEnumerable> values) { _stream = stream ?? throw new ArgumentNullException(nameof(stream)); - _source = _stream.Query(useHeaderRow, sheetName, excelType, startCell, configuration).Cast>().GetEnumerator(); + _source = values.GetEnumerator(); + if (_source.MoveNext()) { _keys = _source.Current?.Keys.ToList() ?? []; @@ -35,8 +25,10 @@ internal MiniExcelDataReader(Stream stream, bool useHeaderRow = false, string? s } } + public static MiniExcelDataReader Create(Stream? stream, IEnumerable> values) => new(stream, values); + /// - public override object GetValue(int i) + public override object? GetValue(int i) { if (_source.Current is null) throw new InvalidOperationException("No current row available."); diff --git a/src/MiniExcel/MiniExcelDataReaderBase.cs b/src/MiniExcelLib.Core/DataReader/MiniExcelDataReaderBase.cs similarity index 90% rename from src/MiniExcel/MiniExcelDataReaderBase.cs rename to src/MiniExcelLib.Core/DataReader/MiniExcelDataReaderBase.cs index e39df9fc..477a5630 100644 --- a/src/MiniExcel/MiniExcelDataReaderBase.cs +++ b/src/MiniExcelLib.Core/DataReader/MiniExcelDataReaderBase.cs @@ -1,9 +1,7 @@ -using System; -using System.Data; -using System.Threading; -using System.Threading.Tasks; +using System.Data; +using MiniExcelLib.Core.Abstractions; -namespace MiniExcelLibs; +namespace MiniExcelLib.Core.DataReader; /// /// IMiniExcelDataReader Base Class @@ -42,7 +40,7 @@ public abstract class MiniExcelDataReaderBase : IMiniExcelDataReader /// /// /// - public virtual int FieldCount { get; } + public virtual int FieldCount { get; } = 0; /// /// @@ -67,7 +65,7 @@ public abstract class MiniExcelDataReaderBase : IMiniExcelDataReader /// /// /// - public virtual long GetBytes(int i, long fieldOffset, byte[] buffer, int bufferOffset, int length) => 0; + public virtual long GetBytes(int i, long fieldOffset, byte[]? buffer, int bufferOffset, int length) => 0; /// /// @@ -127,7 +125,7 @@ public abstract class MiniExcelDataReaderBase : IMiniExcelDataReader /// /// /// - public virtual Type? GetFieldType(int i) => null; + public virtual Type GetFieldType(int i) => null!; /// /// @@ -257,7 +255,7 @@ public virtual Task GetNameAsync(int i, CancellationToken cancellationTo /// /// /// - public abstract object GetValue(int i); + public abstract object? GetValue(int i); /// /// @@ -265,10 +263,10 @@ public virtual Task GetNameAsync(int i, CancellationToken cancellationTo /// /// /// - public virtual Task GetValueAsync(int i, CancellationToken cancellationToken = default) + public virtual Task GetValueAsync(int i, CancellationToken cancellationToken = default) { if (cancellationToken.IsCancellationRequested) - return Task.FromCanceled(cancellationToken); + return Task.FromCanceled(cancellationToken); try { @@ -276,7 +274,7 @@ public virtual Task GetValueAsync(int i, CancellationToken cancellationT } catch (Exception e) { - return Task.FromException(e); + return Task.FromException(e); } } diff --git a/src/MiniExcel/Exceptions/ExcelColumnNotFoundException.cs b/src/MiniExcelLib.Core/Exceptions/MiniExcelColumnNotFoundException.cs similarity index 80% rename from src/MiniExcel/Exceptions/ExcelColumnNotFoundException.cs rename to src/MiniExcelLib.Core/Exceptions/MiniExcelColumnNotFoundException.cs index 23d3cb86..621bfafb 100644 --- a/src/MiniExcel/Exceptions/ExcelColumnNotFoundException.cs +++ b/src/MiniExcelLib.Core/Exceptions/MiniExcelColumnNotFoundException.cs @@ -1,8 +1,6 @@ -using System.Collections.Generic; +namespace MiniExcelLib.Core.Exceptions; -namespace MiniExcelLibs.Exceptions; - -public class ExcelColumnNotFoundException( +public class MiniExcelColumnNotFoundException( string? columnIndex, string? columnName, string[] columnAliases, diff --git a/src/MiniExcel/Exceptions/ExcelInvalidCastException.cs b/src/MiniExcelLib.Core/Exceptions/MiniExcelInvalidCastException.cs similarity index 57% rename from src/MiniExcel/Exceptions/ExcelInvalidCastException.cs rename to src/MiniExcelLib.Core/Exceptions/MiniExcelInvalidCastException.cs index 2bc0a27d..2c883e0f 100644 --- a/src/MiniExcel/Exceptions/ExcelInvalidCastException.cs +++ b/src/MiniExcelLib.Core/Exceptions/MiniExcelInvalidCastException.cs @@ -1,8 +1,6 @@ -using System; +namespace MiniExcelLib.Core.Exceptions; -namespace MiniExcelLibs.Exceptions; - -public class ExcelInvalidCastException(string columnName, int row, object value, Type invalidCastType, string message) +public class MiniExcelInvalidCastException(string columnName, int row, object value, Type invalidCastType, string message) : InvalidCastException(message) { public string ColumnName { get; set; } = columnName; diff --git a/src/MiniExcel/Utils/AttributeExtension.cs b/src/MiniExcelLib.Core/Helpers/AttributeExtension.cs similarity index 90% rename from src/MiniExcel/Utils/AttributeExtension.cs rename to src/MiniExcelLib.Core/Helpers/AttributeExtension.cs index 470b1418..1a92907f 100644 --- a/src/MiniExcel/Utils/AttributeExtension.cs +++ b/src/MiniExcelLib.Core/Helpers/AttributeExtension.cs @@ -1,8 +1,6 @@ -using System; -using System.Linq; -using System.Reflection; +using System.Reflection; -namespace MiniExcelLibs.Utils; +namespace MiniExcelLib.Core.Helpers; internal static class AttributeExtension { diff --git a/src/MiniExcel/Utils/ColumnHelper.cs b/src/MiniExcelLib.Core/Helpers/ColumnHelper.cs similarity index 89% rename from src/MiniExcel/Utils/ColumnHelper.cs rename to src/MiniExcelLib.Core/Helpers/ColumnHelper.cs index 9ea5c1da..b5d9ccba 100644 --- a/src/MiniExcel/Utils/ColumnHelper.cs +++ b/src/MiniExcelLib.Core/Helpers/ColumnHelper.cs @@ -1,11 +1,9 @@ using System.Collections.Concurrent; -using System.Collections.Generic; -using System.IO; -namespace MiniExcelLibs.Utils; +namespace MiniExcelLib.Core.Helpers; // For Row/Column Index -internal static class ColumnHelper +public static class ColumnHelper { private const int GeneralColumnIndex = 255; private const int MaxColumnIndex = 16383; @@ -40,6 +38,7 @@ private static void CheckAndSetMaxColumnIndex(int columnIndex) { if (columnIndex < _intMappingAlphabetCount) return; + if (columnIndex > MaxColumnIndex) throw new InvalidDataException($"ColumnIndex {columnIndex} over excel vaild max index."); @@ -51,7 +50,7 @@ private static void CheckAndSetMaxColumnIndex(int columnIndex) _intMappingAlphabetCount = IntMappingAlphabet.Count; } - internal static string IntToLetters(int value) + private static string IntToLetters(int value) { value++; var result = string.Empty; diff --git a/src/MiniExcel/Utils/FileHelper.cs b/src/MiniExcelLib.Core/Helpers/FileHelper.cs similarity index 59% rename from src/MiniExcel/Utils/FileHelper.cs rename to src/MiniExcelLib.Core/Helpers/FileHelper.cs index 3fa7655f..dbd1180c 100644 --- a/src/MiniExcel/Utils/FileHelper.cs +++ b/src/MiniExcelLib.Core/Helpers/FileHelper.cs @@ -1,8 +1,6 @@ -using System.IO; +namespace MiniExcelLib.Core.Helpers; -namespace MiniExcelLibs.Utils; - -internal static class FileHelper +public static class FileHelper { public static FileStream OpenSharedRead(string path) => File.Open(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); } \ No newline at end of file diff --git a/src/MiniExcel/Utils/ImageHelper.cs b/src/MiniExcelLib.Core/Helpers/ImageHelper.cs similarity index 93% rename from src/MiniExcel/Utils/ImageHelper.cs rename to src/MiniExcelLib.Core/Helpers/ImageHelper.cs index 1f376f12..97013e66 100644 --- a/src/MiniExcel/Utils/ImageHelper.cs +++ b/src/MiniExcelLib.Core/Helpers/ImageHelper.cs @@ -1,4 +1,4 @@ -namespace MiniExcelLibs.Utils; +namespace MiniExcelLib.Core.Helpers; internal static class ImageHelper { diff --git a/src/MiniExcel/Utils/ListHelper.cs b/src/MiniExcelLib.Core/Helpers/ListHelper.cs similarity index 72% rename from src/MiniExcel/Utils/ListHelper.cs rename to src/MiniExcelLib.Core/Helpers/ListHelper.cs index af38fcd9..e6cc173b 100644 --- a/src/MiniExcel/Utils/ListHelper.cs +++ b/src/MiniExcelLib.Core/Helpers/ListHelper.cs @@ -1,10 +1,6 @@ -using System; -using System.Collections.Generic; -using System.Linq; +namespace MiniExcelLib.Core.Helpers; -namespace MiniExcelLibs.Utils; - -internal static class IEnumerableHelper +internal static class ListHelper { internal static bool StartsWith(this IList span, IList value) where T : IEquatable { @@ -17,8 +13,10 @@ internal static bool StartsWith(this IList span, IList value) where T : return false; for (int i = 0; i < bCount; i++) + { if (!span[i].Equals(value[i])) return false; + } return true; } diff --git a/src/MiniExcel/OpenXml/MiniExcelStreamWriter.cs b/src/MiniExcelLib.Core/Helpers/SafeStreamWriter.cs similarity index 70% rename from src/MiniExcel/OpenXml/MiniExcelStreamWriter.cs rename to src/MiniExcelLib.Core/Helpers/SafeStreamWriter.cs index 6f8509cb..6fe17cfa 100644 --- a/src/MiniExcel/OpenXml/MiniExcelStreamWriter.cs +++ b/src/MiniExcelLib.Core/Helpers/SafeStreamWriter.cs @@ -1,17 +1,14 @@ -using System; -using System.IO; -using System.Text; -using System.Threading; -using System.Threading.Tasks; +using System.Text; +using Zomp.SyncMethodGenerator; -namespace MiniExcelLibs.OpenXml; +namespace MiniExcelLib.Core.Helpers; -internal partial class MiniExcelStreamWriter(Stream stream, Encoding encoding, int bufferSize) : IDisposable +internal partial class SafeStreamWriter(Stream stream, Encoding encoding, int bufferSize) : IDisposable { private readonly StreamWriter _streamWriter = new(stream, encoding, bufferSize); - private bool _disposedValue; + private bool _disposed; - [Zomp.SyncMethodGenerator.CreateSyncVersion] + [CreateSyncVersion] public async Task WriteAsync(string content, CancellationToken cancellationToken = default) { cancellationToken.ThrowIfCancellationRequested(); @@ -22,7 +19,7 @@ public async Task WriteAsync(string content, CancellationToken cancellationToken } } - [Zomp.SyncMethodGenerator.CreateSyncVersion] + [CreateSyncVersion] public async Task WriteAndFlushAsync(string content, CancellationToken cancellationToken = default) { cancellationToken.ThrowIfCancellationRequested(); @@ -31,13 +28,13 @@ public async Task WriteAndFlushAsync(string content, CancellationToken can return await FlushAsync(cancellationToken).ConfigureAwait(false); } - [Zomp.SyncMethodGenerator.CreateSyncVersion] + [CreateSyncVersion] public async Task WriteWhitespaceAsync(int length) { await _streamWriter.WriteAsync(new string(' ', length)).ConfigureAwait(false); } - [Zomp.SyncMethodGenerator.CreateSyncVersion] + [CreateSyncVersion] public async Task FlushAsync(CancellationToken cancellationToken = default) { await _streamWriter.FlushAsync( @@ -55,10 +52,10 @@ public void SetPosition(long position) protected virtual void Dispose(bool disposing) { - if (!_disposedValue) + if (!_disposed) { - _streamWriter?.Dispose(); - _disposedValue = true; + _streamWriter.Dispose(); + _disposed = true; } } diff --git a/src/MiniExcelLib.Core/Helpers/StringHelper.cs b/src/MiniExcelLib.Core/Helpers/StringHelper.cs new file mode 100644 index 00000000..94ff906b --- /dev/null +++ b/src/MiniExcelLib.Core/Helpers/StringHelper.cs @@ -0,0 +1,7 @@ +namespace MiniExcelLib.Core.Helpers; + +internal static class StringHelper +{ + public static string GetLetters(string content) => new([..content.Where(char.IsLetter)]); + public static int GetNumber(string content) => int.Parse(new string([..content.Where(char.IsNumber)])); +} \ No newline at end of file diff --git a/src/MiniExcel/Utils/TaskHelper.cs b/src/MiniExcelLib.Core/Helpers/TaskHelper.cs similarity index 77% rename from src/MiniExcel/Utils/TaskHelper.cs rename to src/MiniExcelLib.Core/Helpers/TaskHelper.cs index 660a9d8e..909e5691 100644 --- a/src/MiniExcel/Utils/TaskHelper.cs +++ b/src/MiniExcelLib.Core/Helpers/TaskHelper.cs @@ -1,8 +1,4 @@ -using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; - -namespace MiniExcelLibs.Utils; +namespace MiniExcelLib.Core.Helpers; internal static class TaskHelper { diff --git a/src/MiniExcelLib.Core/Helpers/ThrowHelper.cs b/src/MiniExcelLib.Core/Helpers/ThrowHelper.cs new file mode 100644 index 00000000..892e0645 --- /dev/null +++ b/src/MiniExcelLib.Core/Helpers/ThrowHelper.cs @@ -0,0 +1,19 @@ +namespace MiniExcelLib.Core.Helpers; + +internal static class ThrowHelper +{ + internal static void ThrowIfInvalidOpenXml(Stream stream) + { + var probe = new byte[8]; + stream.Seek(0, SeekOrigin.Begin); + var read = stream.Read(probe, 0, probe.Length); + if (read != probe.Length) + throw new InvalidDataException("The file/stream does not contain enough data to be processed."); + + stream.Seek(0, SeekOrigin.Begin); + + // OpenXml format can be any ZIP archive + if (probe is not [0x50, 0x4B, ..]) + throw new InvalidDataException("The file is not a valid OpenXml document."); + } +} diff --git a/src/MiniExcelLib.Core/Helpers/TypeHelper.cs b/src/MiniExcelLib.Core/Helpers/TypeHelper.cs new file mode 100644 index 00000000..1a5d0a7b --- /dev/null +++ b/src/MiniExcelLib.Core/Helpers/TypeHelper.cs @@ -0,0 +1,46 @@ +using System.Data; + +namespace MiniExcelLib.Core.Helpers; + +internal static class TypeHelper +{ + public static IEnumerable> ConvertToEnumerableDictionary(IDataReader reader) + { + while (reader.Read()) + { + yield return Enumerable + .Range(0, reader.FieldCount) + .ToDictionary(reader.GetName, reader.GetValue); + } + } + + /// + /// From : https://stackoverflow.com/questions/906499/getting-type-t-from-ienumerablet + /// + public static IEnumerable GetGenericIEnumerables(object o) + { + return o.GetType() + .GetInterfaces() + .Where(t => t.IsGenericType && t.GetGenericTypeDefinition() == typeof(IEnumerable<>)) + .Select(t => t.GetGenericArguments()[0]); + } + + public static bool IsNumericType(Type type, bool isNullableUnderlyingType = false) + { + if (isNullableUnderlyingType) + type = Nullable.GetUnderlyingType(type) ?? type; + + // True for all numeric types except bool, sbyte and byte + return Type.GetTypeCode(type) is >= TypeCode.Int16 and <= TypeCode.Decimal; + } + + public static bool IsAsyncEnumerable(this Type type, out Type? genericArgument) + { + var asyncEnumrableInterfaceType = type + .GetInterfaces() + .FirstOrDefault(i => i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IAsyncEnumerable<>)); + + genericArgument = asyncEnumrableInterfaceType?.GetGenericArguments().FirstOrDefault(); + return genericArgument is not null; + } +} \ No newline at end of file diff --git a/src/MiniExcel/Utils/XmlEncoder.cs b/src/MiniExcelLib.Core/Helpers/XmlHelper.cs similarity index 67% rename from src/MiniExcel/Utils/XmlEncoder.cs rename to src/MiniExcelLib.Core/Helpers/XmlHelper.cs index 0ef0e5f2..04861224 100644 --- a/src/MiniExcel/Utils/XmlEncoder.cs +++ b/src/MiniExcelLib.Core/Helpers/XmlHelper.cs @@ -2,10 +2,10 @@ using System.Text.RegularExpressions; using System.Xml; -namespace MiniExcelLibs.Utils; +namespace MiniExcelLib.Core.Helpers; /// XmlEncoder MIT Copyright ©2021 from https://github.com/ClosedXML -internal static partial class XmlEncoder +internal static partial class XmlHelper { #if NET7_0_OR_GREATER [GeneratedRegex("_(x[\\dA-Fa-f]{4})_", RegexOptions.Compiled)] private static partial Regex X4LRegexImpl(); @@ -45,4 +45,22 @@ internal static partial class XmlEncoder decodeStr = UppercaseX4LRegex.Replace(decodeStr, "_x005F_$1_"); return XmlConvert.DecodeName(decodeStr); } + + public static string MinifyXml(string xml) => xml + .Replace("\r", "") + .Replace("\n", "") + .Replace("\t", "") + .Trim(); + + /// + /// Encode to XML (special characteres: ' " > < &) + /// + public static string EncodeXml(string? value) => value is null ? "" + : XmlHelper.EncodeString(value) + ?.Replace("&", "&") + .Replace("<", "<") + .Replace(">", ">") + .Replace("\"", """) + .Replace("'", "'") + .ToString() ?? ""; } \ No newline at end of file diff --git a/src/MiniExcel/MiniExcelConfiguration.cs b/src/MiniExcelLib.Core/MiniExcelConfiguration.cs similarity index 63% rename from src/MiniExcel/MiniExcelConfiguration.cs rename to src/MiniExcelLib.Core/MiniExcelConfiguration.cs index 9518aef7..3cb7e7bd 100644 --- a/src/MiniExcel/MiniExcelConfiguration.cs +++ b/src/MiniExcelLib.Core/MiniExcelConfiguration.cs @@ -1,11 +1,11 @@ using System.Globalization; -using MiniExcelLibs.Attributes; +using MiniExcelLib.Core.Attributes; -namespace MiniExcelLibs; +namespace MiniExcelLib.Core; public interface IMiniExcelConfiguration; -public abstract class MiniExcelConfiguration : IMiniExcelConfiguration +public abstract class MiniExcelBaseConfiguration : IMiniExcelConfiguration { public CultureInfo Culture { get; set; } = CultureInfo.InvariantCulture; public DynamicExcelColumn[]? DynamicColumns { get; set; } = []; @@ -13,7 +13,7 @@ public abstract class MiniExcelConfiguration : IMiniExcelConfiguration public bool FastMode { get; set; } /// - /// When exporting using DataReader, the data not in DynamicColumn will be filtered. + /// When exporting using DataReader, the data not in DynamicColumn will be filtered. /// public bool DynamicColumnFirst { get; set; } = false; } \ No newline at end of file diff --git a/src/MiniExcelLib.Core/MiniExcelLib.Core.csproj b/src/MiniExcelLib.Core/MiniExcelLib.Core.csproj new file mode 100644 index 00000000..27661dac --- /dev/null +++ b/src/MiniExcelLib.Core/MiniExcelLib.Core.csproj @@ -0,0 +1,12 @@ + + + + True + ..\miniexcel.snk + + + + + + + diff --git a/src/MiniExcel/Attributes/ExcelSheetAttribute.cs b/src/MiniExcelLib.Core/OpenXml/Attributes/ExcelSheetAttribute.cs similarity index 75% rename from src/MiniExcel/Attributes/ExcelSheetAttribute.cs rename to src/MiniExcelLib.Core/OpenXml/Attributes/ExcelSheetAttribute.cs index 3a4285a2..fc2011f1 100644 --- a/src/MiniExcel/Attributes/ExcelSheetAttribute.cs +++ b/src/MiniExcelLib.Core/OpenXml/Attributes/ExcelSheetAttribute.cs @@ -1,7 +1,6 @@ -using System; -using MiniExcelLibs.OpenXml; +using MiniExcelLib.Core.OpenXml.Models; -namespace MiniExcelLibs.Attributes; +namespace MiniExcelLib.Core.OpenXml.Attributes; [AttributeUsage(AttributeTargets.Class)] public class ExcelSheetAttribute : Attribute diff --git a/src/MiniExcel/OpenXml/Constants/ExcelContentTypes.cs b/src/MiniExcelLib.Core/OpenXml/Constants/ExcelContentTypes.cs similarity index 92% rename from src/MiniExcel/OpenXml/Constants/ExcelContentTypes.cs rename to src/MiniExcelLib.Core/OpenXml/Constants/ExcelContentTypes.cs index bcb5f9fa..6ef0fe98 100644 --- a/src/MiniExcel/OpenXml/Constants/ExcelContentTypes.cs +++ b/src/MiniExcelLib.Core/OpenXml/Constants/ExcelContentTypes.cs @@ -1,4 +1,4 @@ -namespace MiniExcelLibs.OpenXml.Constants; +namespace MiniExcelLib.Core.OpenXml.Constants; internal static class ExcelContentTypes { diff --git a/src/MiniExcel/OpenXml/Constants/ExcelFileNames.cs b/src/MiniExcelLib.Core/OpenXml/Constants/ExcelFileNames.cs similarity index 91% rename from src/MiniExcel/OpenXml/Constants/ExcelFileNames.cs rename to src/MiniExcelLib.Core/OpenXml/Constants/ExcelFileNames.cs index 982c22eb..0f7a6f26 100644 --- a/src/MiniExcel/OpenXml/Constants/ExcelFileNames.cs +++ b/src/MiniExcelLib.Core/OpenXml/Constants/ExcelFileNames.cs @@ -1,4 +1,4 @@ -namespace MiniExcelLibs.OpenXml.Constants; +namespace MiniExcelLib.Core.OpenXml.Constants; internal static class ExcelFileNames { diff --git a/src/MiniExcel/OpenXml/Constants/ExcelXml.cs b/src/MiniExcelLib.Core/OpenXml/Constants/ExcelXml.cs similarity index 88% rename from src/MiniExcel/OpenXml/Constants/ExcelXml.cs rename to src/MiniExcelLib.Core/OpenXml/Constants/ExcelXml.cs index 6b489253..3ea94be3 100644 --- a/src/MiniExcel/OpenXml/Constants/ExcelXml.cs +++ b/src/MiniExcelLib.Core/OpenXml/Constants/ExcelXml.cs @@ -1,16 +1,18 @@ -using MiniExcelLibs.OpenXml.Models; +using MiniExcelLib.Core.Helpers; +using MiniExcelLib.Core.OpenXml.Models; +using MiniExcelLib.Core.OpenXml.Utils; -namespace MiniExcelLibs.OpenXml.Constants; +namespace MiniExcelLib.Core.OpenXml.Constants; internal static class ExcelXml { static ExcelXml() { - DefaultRels = ExcelOpenXmlUtils.MinifyXml(DefaultRels); - DefaultWorkbookXml = ExcelOpenXmlUtils.MinifyXml(DefaultWorkbookXml); - DefaultWorkbookXmlRels = ExcelOpenXmlUtils.MinifyXml(DefaultWorkbookXmlRels); - DefaultSheetRelXml = ExcelOpenXmlUtils.MinifyXml(DefaultSheetRelXml); - DefaultDrawing = ExcelOpenXmlUtils.MinifyXml(DefaultDrawing); + DefaultRels = XmlHelper.MinifyXml(DefaultRels); + DefaultWorkbookXml = XmlHelper.MinifyXml(DefaultWorkbookXml); + DefaultWorkbookXmlRels = XmlHelper.MinifyXml(DefaultWorkbookXmlRels); + DefaultSheetRelXml = XmlHelper.MinifyXml(DefaultSheetRelXml); + DefaultDrawing = XmlHelper.MinifyXml(DefaultDrawing); } internal const string EmptySheetXml = """"""; @@ -123,6 +125,6 @@ internal static string DrawingXml(FileDto file, int fileIndex) """; internal static string Sheet(SheetDto sheetDto, int sheetId) - => $""""""; + => $""""""; } \ No newline at end of file diff --git a/src/MiniExcel/OpenXml/Constants/Schemas.cs b/src/MiniExcelLib.Core/OpenXml/Constants/Schemas.cs similarity index 91% rename from src/MiniExcel/OpenXml/Constants/Schemas.cs rename to src/MiniExcelLib.Core/OpenXml/Constants/Schemas.cs index 15a2cbe3..8af3ea62 100644 --- a/src/MiniExcel/OpenXml/Constants/Schemas.cs +++ b/src/MiniExcelLib.Core/OpenXml/Constants/Schemas.cs @@ -1,4 +1,4 @@ -namespace MiniExcelLibs.OpenXml.Constants; +namespace MiniExcelLib.Core.OpenXml.Constants; internal static class Schemas { diff --git a/src/MiniExcel/OpenXml/Constants/WorksheetXml.cs b/src/MiniExcelLib.Core/OpenXml/Constants/WorksheetXml.cs similarity index 96% rename from src/MiniExcel/OpenXml/Constants/WorksheetXml.cs rename to src/MiniExcelLib.Core/OpenXml/Constants/WorksheetXml.cs index 1ec9e1e8..65f44e8b 100644 --- a/src/MiniExcel/OpenXml/Constants/WorksheetXml.cs +++ b/src/MiniExcelLib.Core/OpenXml/Constants/WorksheetXml.cs @@ -1,7 +1,7 @@ using System.Globalization; -using MiniExcelLibs.Attributes; +using MiniExcelLib.Core.Attributes; -namespace MiniExcelLibs.OpenXml.Constants; +namespace MiniExcelLib.Core.OpenXml.Constants; internal static class WorksheetXml { diff --git a/src/MiniExcel/OpenXml/Models/DrawingDto.cs b/src/MiniExcelLib.Core/OpenXml/Models/DrawingDto.cs similarity index 58% rename from src/MiniExcel/OpenXml/Models/DrawingDto.cs rename to src/MiniExcelLib.Core/OpenXml/Models/DrawingDto.cs index 672ae8b3..3a8ba087 100644 --- a/src/MiniExcel/OpenXml/Models/DrawingDto.cs +++ b/src/MiniExcelLib.Core/OpenXml/Models/DrawingDto.cs @@ -1,6 +1,4 @@ -using System; - -namespace MiniExcelLibs.OpenXml.Models; +namespace MiniExcelLib.Core.OpenXml.Models; internal class DrawingDto { diff --git a/src/MiniExcel/OpenXml/Models/ExcelRange.cs b/src/MiniExcelLib.Core/OpenXml/Models/ExcelRange.cs similarity index 89% rename from src/MiniExcel/OpenXml/Models/ExcelRange.cs rename to src/MiniExcelLib.Core/OpenXml/Models/ExcelRange.cs index 0ecb16cb..b541c7c8 100644 --- a/src/MiniExcel/OpenXml/Models/ExcelRange.cs +++ b/src/MiniExcelLib.Core/OpenXml/Models/ExcelRange.cs @@ -1,6 +1,4 @@ -using System; - -namespace MiniExcelLibs.OpenXml.Models; +namespace MiniExcelLib.Core.OpenXml.Models; public class ExcelRangeElement { diff --git a/src/MiniExcel/OpenXml/ExcelWidthCollection.cs b/src/MiniExcelLib.Core/OpenXml/Models/ExcelWidthCollection.cs similarity index 87% rename from src/MiniExcel/OpenXml/ExcelWidthCollection.cs rename to src/MiniExcelLib.Core/OpenXml/Models/ExcelWidthCollection.cs index a8db103d..b122fc07 100644 --- a/src/MiniExcel/OpenXml/ExcelWidthCollection.cs +++ b/src/MiniExcelLib.Core/OpenXml/Models/ExcelWidthCollection.cs @@ -1,16 +1,13 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using MiniExcelLibs.Utils; +using MiniExcelLib.Core.Reflection; -namespace MiniExcelLibs.OpenXml; +namespace MiniExcelLib.Core.OpenXml.Models; public sealed class ExcelColumnWidth { public int Index { get; set; } public double Width { get; set; } - internal static IEnumerable FromProps(ICollection props, double? minWidth = null) + internal static IEnumerable FromProps(ICollection props, double? minWidth = null) { var i = 1; foreach (var p in props) @@ -37,7 +34,7 @@ public sealed class ExcelWidthCollection public IEnumerable Columns => _columnWidths.Values; - internal ExcelWidthCollection(double minWidth, double maxWidth, ICollection props) + internal ExcelWidthCollection(double minWidth, double maxWidth, ICollection props) { _maxWidth = maxWidth; _columnWidths = ExcelColumnWidth.FromProps(props, minWidth).ToDictionary(x => x.Index); diff --git a/src/MiniExcelLib.Core/OpenXml/Models/ExcellSheetInfo.cs b/src/MiniExcelLib.Core/OpenXml/Models/ExcellSheetInfo.cs new file mode 100644 index 00000000..79cd8869 --- /dev/null +++ b/src/MiniExcelLib.Core/OpenXml/Models/ExcellSheetInfo.cs @@ -0,0 +1,15 @@ +namespace MiniExcelLib.Core.OpenXml.Models; + +internal class ExcellSheetInfo +{ + public object Key { get; set; } + public string? ExcelSheetName { get; set; } + public SheetState ExcelSheetState { get; set; } + + private string ExcelSheetStateAsString => ExcelSheetState.ToString().ToLower(); + + public SheetDto ToDto(int sheetIndex) + { + return new SheetDto { Name = ExcelSheetName, SheetIdx = sheetIndex, State = ExcelSheetStateAsString }; + } +} \ No newline at end of file diff --git a/src/MiniExcel/OpenXml/Models/FileDto.cs b/src/MiniExcelLib.Core/OpenXml/Models/FileDto.cs similarity index 86% rename from src/MiniExcel/OpenXml/Models/FileDto.cs rename to src/MiniExcelLib.Core/OpenXml/Models/FileDto.cs index b9fd5667..6a6ddc4a 100644 --- a/src/MiniExcel/OpenXml/Models/FileDto.cs +++ b/src/MiniExcelLib.Core/OpenXml/Models/FileDto.cs @@ -1,6 +1,4 @@ -using System; - -namespace MiniExcelLibs.OpenXml.Models; +namespace MiniExcelLib.Core.OpenXml.Models; internal class FileDto { diff --git a/src/MiniExcel/OpenXml/MergeCells.cs b/src/MiniExcelLib.Core/OpenXml/Models/MergeCells.cs similarity index 68% rename from src/MiniExcel/OpenXml/MergeCells.cs rename to src/MiniExcelLib.Core/OpenXml/Models/MergeCells.cs index a1a62d78..a8c41919 100644 --- a/src/MiniExcel/OpenXml/MergeCells.cs +++ b/src/MiniExcelLib.Core/OpenXml/Models/MergeCells.cs @@ -1,6 +1,4 @@ -using System.Collections.Generic; - -namespace MiniExcelLibs.OpenXml; +namespace MiniExcelLib.Core.OpenXml.Models; internal class MergeCells { diff --git a/src/MiniExcel/OpenXml/Models/SheetDto.cs b/src/MiniExcelLib.Core/OpenXml/Models/SheetDto.cs similarity index 79% rename from src/MiniExcel/OpenXml/Models/SheetDto.cs rename to src/MiniExcelLib.Core/OpenXml/Models/SheetDto.cs index 2d6da7cc..c18cb0ea 100644 --- a/src/MiniExcel/OpenXml/Models/SheetDto.cs +++ b/src/MiniExcelLib.Core/OpenXml/Models/SheetDto.cs @@ -1,6 +1,4 @@ -using System; - -namespace MiniExcelLibs.OpenXml.Models; +namespace MiniExcelLib.Core.OpenXml.Models; internal class SheetDto { diff --git a/src/MiniExcel/OpenXml/SheetInfo.cs b/src/MiniExcelLib.Core/OpenXml/Models/SheetInfo.cs similarity index 91% rename from src/MiniExcel/OpenXml/SheetInfo.cs rename to src/MiniExcelLib.Core/OpenXml/Models/SheetInfo.cs index a75d05f3..5bea92b2 100644 --- a/src/MiniExcel/OpenXml/SheetInfo.cs +++ b/src/MiniExcelLib.Core/OpenXml/Models/SheetInfo.cs @@ -1,4 +1,4 @@ -namespace MiniExcelLibs.OpenXml; +namespace MiniExcelLib.Core.OpenXml.Models; public class SheetInfo(uint id, uint index, string name, SheetState sheetState, bool active) { diff --git a/src/MiniExcel/OpenXml/SheetRecord.cs b/src/MiniExcelLib.Core/OpenXml/Models/SheetRecord.cs similarity index 91% rename from src/MiniExcel/OpenXml/SheetRecord.cs rename to src/MiniExcelLib.Core/OpenXml/Models/SheetRecord.cs index ae85edc3..2bc57d71 100644 --- a/src/MiniExcel/OpenXml/SheetRecord.cs +++ b/src/MiniExcelLib.Core/OpenXml/Models/SheetRecord.cs @@ -1,6 +1,4 @@ -using System; - -namespace MiniExcelLibs.OpenXml; +namespace MiniExcelLib.Core.OpenXml.Models; internal sealed class SheetRecord(string name, string state, uint id, string rid, bool active) { diff --git a/src/MiniExcel/OpenXml/OpenXmlConfiguration.cs b/src/MiniExcelLib.Core/OpenXml/OpenXmlConfiguration.cs similarity index 84% rename from src/MiniExcel/OpenXml/OpenXmlConfiguration.cs rename to src/MiniExcelLib.Core/OpenXml/OpenXmlConfiguration.cs index 0b956425..32e3f1cb 100644 --- a/src/MiniExcel/OpenXml/OpenXmlConfiguration.cs +++ b/src/MiniExcelLib.Core/OpenXml/OpenXmlConfiguration.cs @@ -1,8 +1,8 @@ -using MiniExcelLibs.Attributes; +using MiniExcelLib.Core.OpenXml.Attributes; -namespace MiniExcelLibs.OpenXml; +namespace MiniExcelLib.Core.OpenXml; -public class OpenXmlConfiguration : MiniExcelConfiguration +public class OpenXmlConfiguration : MiniExcelBaseConfiguration { internal static readonly OpenXmlConfiguration DefaultConfig = new(); @@ -29,4 +29,10 @@ public class OpenXmlConfiguration : MiniExcelConfiguration public bool EnableAutoWidth { get; set; } public double MinWidth { get; set; } = 9.28515625; public double MaxWidth { get; set; } = 200; +} + +public enum TableStyles +{ + None, + Default } \ No newline at end of file diff --git a/src/MiniExcel/OpenXml/ExcelOpenXmlSheetReader.cs b/src/MiniExcelLib.Core/OpenXml/OpenXmlReader.cs similarity index 86% rename from src/MiniExcel/OpenXml/ExcelOpenXmlSheetReader.cs rename to src/MiniExcelLib.Core/OpenXml/OpenXmlReader.cs index 6162554d..4b7775f4 100644 --- a/src/MiniExcel/OpenXml/ExcelOpenXmlSheetReader.cs +++ b/src/MiniExcelLib.Core/OpenXml/OpenXmlReader.cs @@ -1,49 +1,49 @@ -using System; -using System.Collections.Generic; using System.Collections.ObjectModel; using System.Globalization; -using System.IO; using System.IO.Compression; -using System.Linq; using System.Runtime.CompilerServices; -using System.Threading; -using System.Threading.Tasks; using System.Xml; -using MiniExcelLibs.OpenXml.Constants; -using MiniExcelLibs.OpenXml.Models; -using MiniExcelLibs.Utils; -using MiniExcelLibs.Zip; +using MiniExcelLib.Core.Abstractions; +using MiniExcelLib.Core.Helpers; +using MiniExcelLib.Core.OpenXml.Constants; +using MiniExcelLib.Core.OpenXml.Models; +using MiniExcelLib.Core.OpenXml.Utils; +using MiniExcelLib.Core.OpenXml.Zip; +using MiniExcelLib.Core.Reflection; using Zomp.SyncMethodGenerator; +using XmlReaderHelper = MiniExcelLib.Core.OpenXml.Utils.XmlReaderHelper; -namespace MiniExcelLibs.OpenXml; +namespace MiniExcelLib.Core.OpenXml; -internal partial class ExcelOpenXmlSheetReader : IExcelReader +internal partial class OpenXmlReader : IMiniExcelReader { private static readonly string[] Ns = [Schemas.SpreadsheetmlXmlns, Schemas.SpreadsheetmlXmlStrictns]; private static readonly string[] RelationshiopNs = [Schemas.SpreadsheetmlXmlRelationshipns, Schemas.SpreadsheetmlXmlStrictRelationshipns]; private readonly OpenXmlConfiguration _config; private List? _sheetRecords; - private ExcelOpenXmlStyles? _style; + private OpenXmlStyles? _style; private bool _disposed; - internal readonly ExcelOpenXmlZip Archive; + internal readonly OpenXmlZip Archive; internal IDictionary? SharedStrings; - private ExcelOpenXmlSheetReader(Stream stream, IMiniExcelConfiguration? configuration) + private OpenXmlReader(Stream stream, IMiniExcelConfiguration? configuration) { - Archive = new ExcelOpenXmlZip(stream); + Archive = new OpenXmlZip(stream); _config = (OpenXmlConfiguration?)configuration ?? OpenXmlConfiguration.DefaultConfig; } [CreateSyncVersion] - public static async Task CreateAsync(Stream stream, IMiniExcelConfiguration? configuration, CancellationToken cancellationToken = default) + internal static async Task CreateAsync(Stream stream, IMiniExcelConfiguration? configuration, CancellationToken cancellationToken = default) { - var reader = new ExcelOpenXmlSheetReader(stream, configuration); + ThrowHelper.ThrowIfInvalidOpenXml(stream); + + var reader = new OpenXmlReader(stream, configuration); await reader.SetSharedStringsAsync(cancellationToken).ConfigureAwait(false); return reader; } - + [CreateSyncVersion] public IAsyncEnumerable> QueryAsync(bool useHeaderRow, string? sheetName, string startCell, CancellationToken cancellationToken = default) { @@ -51,13 +51,14 @@ public static async Task CreateAsync(Stream stream, IMi } [CreateSyncVersion] - public IAsyncEnumerable QueryAsync(string? sheetName, string startCell, bool hasHeader, CancellationToken cancellationToken = default) where T : class, new() + public IAsyncEnumerable QueryAsync(string? sheetName, string startCell, bool mapHeaderAsData, CancellationToken cancellationToken = default) where T : class, new() { - sheetName ??= CustomPropertyHelper.GetExcellSheetInfo(typeof(T), _config)?.ExcelSheetName; + sheetName ??= ExcelPropertyHelper.GetExcellSheetInfo(typeof(T), _config)?.ExcelSheetName; //Todo: Find a way if possible to remove the 'hasHeader' parameter to check whether or not to include // the first row in the result set in favor of modifying the already present 'useHeaderRow' to do the same job - return QueryImplAsync(QueryAsync(false, sheetName, startCell, cancellationToken), startCell, hasHeader, _config, cancellationToken); } + return MiniExcelMapper.MapQueryAsync(QueryAsync(false, sheetName, startCell, cancellationToken), startCell, mapHeaderAsData, _config.TrimColumnNames, _config, cancellationToken); + } [CreateSyncVersion] public IAsyncEnumerable> QueryRangeAsync(bool useHeaderRow, string? sheetName, string startCell, string endCell, CancellationToken cancellationToken = default) @@ -88,9 +89,9 @@ public static async Task CreateAsync(Stream stream, IMi } [CreateSyncVersion] - public IAsyncEnumerable QueryRangeAsync(string? sheetName, string startCell, string endCell, bool hasHeader, CancellationToken cancellationToken = default) where T : class, new() + public IAsyncEnumerable QueryRangeAsync(string? sheetName, string startCell, string endCell, bool treatHeaderAsData, CancellationToken cancellationToken = default) where T : class, new() { - return QueryImplAsync(QueryRangeAsync(false, sheetName, startCell, endCell, cancellationToken), startCell, hasHeader, _config, cancellationToken); + return MiniExcelMapper.MapQueryAsync(QueryRangeAsync(false, sheetName, startCell, endCell, cancellationToken), startCell, treatHeaderAsData, _config.TrimColumnNames, _config, cancellationToken); } [CreateSyncVersion] @@ -132,9 +133,9 @@ public static async Task CreateAsync(Stream stream, IMi } [CreateSyncVersion] - public IAsyncEnumerable QueryRangeAsync(string? sheetName, int startRowIndex, int startColumnIndex, int? endRowIndex, int? endColumnIndex, bool hasHeader, CancellationToken cancellationToken = default) where T : class, new() + public IAsyncEnumerable QueryRangeAsync(string? sheetName, int startRowIndex, int startColumnIndex, int? endRowIndex, int? endColumnIndex, bool treatHeaderAsData, CancellationToken cancellationToken = default) where T : class, new() { - return QueryImplAsync(QueryRangeAsync(false, sheetName, startRowIndex, startColumnIndex, endRowIndex, endColumnIndex, cancellationToken), ReferenceHelper.ConvertXyToCell(startColumnIndex, startRowIndex), hasHeader, _config, cancellationToken); + return MiniExcelMapper.MapQueryAsync(QueryRangeAsync(false, sheetName, startRowIndex, startColumnIndex, endRowIndex, endColumnIndex, cancellationToken), ReferenceHelper.ConvertCoordinatesToCell(startColumnIndex, startRowIndex), treatHeaderAsData, _config.TrimColumnNames, _config, cancellationToken); } [CreateSyncVersion] @@ -322,7 +323,7 @@ await XmlReaderHelper.SkipToNextSameLevelDomAsync(reader, cancellationToken) xfIndex = styleIndex; // only when have s attribute then load styles xml data - _style ??= new ExcelOpenXmlStyles(Archive); + _style ??= new OpenXmlStyles(Archive); cellValue = _style.ConvertValueByStyleFormat(xfIndex, cellValue); } @@ -335,80 +336,7 @@ await XmlReaderHelper.SkipToNextSameLevelDomAsync(reader, cancellationToken) } yield return cell; } - - [CreateSyncVersion] - public static async IAsyncEnumerable QueryImplAsync(IAsyncEnumerable> values, string startCell, bool hasHeader, MiniExcelConfiguration configuration, [EnumeratorCancellation] CancellationToken cancellationToken = default) where T : class, new() - { - cancellationToken.ThrowIfCancellationRequested(); - - var type = typeof(T); - - //TODO:need to optimize - List props = []; - Dictionary headersDic = []; - string[] keys = []; - var first = true; - var rowIndex = 0; - - await foreach (var item in values.WithCancellation(cancellationToken).ConfigureAwait(false)) - { - if (first) - { - keys = item.Keys.ToArray(); - var trimColumnNames = (configuration as OpenXmlConfiguration)?.TrimColumnNames ?? false; - headersDic = CustomPropertyHelper.GetHeaders(item, trimColumnNames); - - //TODO: alert don't duplicate column name - props = CustomPropertyHelper.GetExcelCustomPropertyInfos(type, keys, configuration); - first = false; - - if (hasHeader) - continue; - } - - var v = new T(); - foreach (var pInfo in props) - { - if (pInfo.ExcelColumnAliases is not null) - { - foreach (var alias in pInfo.ExcelColumnAliases) - { - if (headersDic?.TryGetValue(alias, out var columnId) ?? false) - { - var columnName = keys[columnId]; - item.TryGetValue(columnName, out var aliasItemValue); - - if (aliasItemValue is not null) - { - var newAliasValue = TypeHelper.TypeMapping(v, pInfo, aliasItemValue, rowIndex, startCell, configuration); - } - } - } - } - - //Q: Why need to check every time? A: it needs to check everytime, because it's dictionary - object? itemValue = null; - if (pInfo.ExcelIndexName is not null && (keys?.Contains(pInfo.ExcelIndexName) ?? false)) - { - item.TryGetValue(pInfo.ExcelIndexName, out itemValue); - } - else if (pInfo.ExcelColumnName is not null && (headersDic?.TryGetValue(pInfo.ExcelColumnName, out var columnId) ?? false)) - { - var columnName = keys[columnId]; - item.TryGetValue(columnName, out itemValue); - } - - if (itemValue is not null) - { - var newValue = TypeHelper.TypeMapping(v, pInfo, itemValue, rowIndex, startCell, configuration); - } - } - - rowIndex++; - yield return v; - } - } - + private ZipArchiveEntry GetSheetEntry(string? sheetName) { // if sheets count > 1 need to read xl/_rels/workbook.xml.rels @@ -731,7 +659,7 @@ private async Task ReadCellAndSetColumnIndexAsync(XmlReader reade } else if (XmlReaderHelper.IsStartElement(reader, "is", Ns)) { - var rawValue = await StringHelper.ReadStringItemAsync(reader, cancellationToken).ConfigureAwait(false); + var rawValue = await XmlReaderHelper.ReadStringItemAsync(reader, cancellationToken).ConfigureAwait(false); if (!string.IsNullOrEmpty(rawValue)) ConvertCellValue(rawValue, aT, xfIndex, out value); } @@ -757,7 +685,7 @@ private void ConvertCellValue(string rawValue, string aT, int xfIndex, out objec if (sstIndex >= 0 && sstIndex < SharedStrings?.Count) { //value = Helpers.ConvertEscapeChars(_SharedStrings[sstIndex]); - value = XmlEncoder.DecodeString(SharedStrings[sstIndex]); + value = XmlHelper.DecodeString(SharedStrings[sstIndex]); return; } } @@ -767,7 +695,7 @@ private void ConvertCellValue(string rawValue, string aT, int xfIndex, out objec case "inlineStr": case "str": //TODO: it will unbox,box - var v = XmlEncoder.DecodeString(rawValue); + var v = XmlHelper.DecodeString(rawValue); if (_config.EnableConvertByteArray) { //if str start with "data:image/png;base64," then convert to byte[] https://github.com/mini-software/MiniExcel/issues/318 @@ -1175,7 +1103,7 @@ internal static async Task TryGetMergeCellsAsync(ZipArchiveEntry sheetEntr for (int y = y1; y <= y2; y++) { if (!isFirst) - mergeCells.MergesMap.Add(ReferenceHelper.ConvertXyToCell(x, y), refs[0]); + mergeCells.MergesMap.Add(ReferenceHelper.ConvertCoordinatesToCell(x, y), refs[0]); isFirst = false; } } @@ -1193,7 +1121,7 @@ internal static async Task TryGetMergeCellsAsync(ZipArchiveEntry sheetEntr return true; } - ~ExcelOpenXmlSheetReader() + ~OpenXmlReader() { Dispose(false); } diff --git a/src/MiniExcel/OpenXml/OpenXmlStyleOptions.cs b/src/MiniExcelLib.Core/OpenXml/OpenXmlStyleOptions.cs similarity index 66% rename from src/MiniExcel/OpenXml/OpenXmlStyleOptions.cs rename to src/MiniExcelLib.Core/OpenXml/OpenXmlStyleOptions.cs index 48e3e490..2791cbae 100644 --- a/src/MiniExcel/OpenXml/OpenXmlStyleOptions.cs +++ b/src/MiniExcelLib.Core/OpenXml/OpenXmlStyleOptions.cs @@ -1,4 +1,4 @@ -namespace MiniExcelLibs.OpenXml; +namespace MiniExcelLib.Core.OpenXml; public class OpenXmlStyleOptions { diff --git a/src/MiniExcel/OpenXml/ExcelOpenXmlStyles.cs b/src/MiniExcelLib.Core/OpenXml/OpenXmlStyles.cs similarity index 94% rename from src/MiniExcel/OpenXml/ExcelOpenXmlStyles.cs rename to src/MiniExcelLib.Core/OpenXml/OpenXmlStyles.cs index 24ccb242..fef8f51b 100644 --- a/src/MiniExcel/OpenXml/ExcelOpenXmlStyles.cs +++ b/src/MiniExcelLib.Core/OpenXml/OpenXmlStyles.cs @@ -1,12 +1,10 @@ -using System; -using System.Collections.Generic; -using MiniExcelLibs.OpenXml.Constants; -using MiniExcelLibs.Utils; -using MiniExcelLibs.Zip; +using MiniExcelLib.Core.OpenXml.Constants; +using MiniExcelLib.Core.OpenXml.Utils; +using MiniExcelLib.Core.OpenXml.Zip; -namespace MiniExcelLibs.OpenXml; +namespace MiniExcelLib.Core.OpenXml; -internal class ExcelOpenXmlStyles +internal class OpenXmlStyles { private static readonly string[] Ns = [Schemas.SpreadsheetmlXmlns, Schemas.SpreadsheetmlXmlStrictns]; @@ -14,7 +12,7 @@ internal class ExcelOpenXmlStyles private readonly Dictionary _cellStyleXfs = new(); private readonly Dictionary _customFormats = new(); - public ExcelOpenXmlStyles(ExcelOpenXmlZip zip) + public OpenXmlStyles(OpenXmlZip zip) { using var reader = zip.GetXmlReader("xl/styles.xml"); diff --git a/src/MiniExcel/OpenXml/ExcelOpenXmlSheetWriter.DefaultOpenXml.cs b/src/MiniExcelLib.Core/OpenXml/OpenXmlWriter.DefaultOpenXml.cs similarity index 86% rename from src/MiniExcel/OpenXml/ExcelOpenXmlSheetWriter.DefaultOpenXml.cs rename to src/MiniExcelLib.Core/OpenXml/OpenXmlWriter.DefaultOpenXml.cs index 0d625705..79422af6 100644 --- a/src/MiniExcel/OpenXml/ExcelOpenXmlSheetWriter.DefaultOpenXml.cs +++ b/src/MiniExcelLib.Core/OpenXml/OpenXmlWriter.DefaultOpenXml.cs @@ -1,22 +1,22 @@ -using System; -using System.Collections.Generic; using System.Data; using System.Globalization; -using System.Linq; using System.Text; -using MiniExcelLibs.OpenXml.Constants; -using MiniExcelLibs.OpenXml.Models; -using MiniExcelLibs.Utils; -using MiniExcelLibs.Zip; -using static MiniExcelLibs.Utils.ImageHelper; - -namespace MiniExcelLibs.OpenXml; - -internal partial class ExcelOpenXmlSheetWriter : IExcelWriter +using MiniExcelLib.Core.Abstractions; +using MiniExcelLib.Core.Helpers; +using MiniExcelLib.Core.OpenXml.Constants; +using MiniExcelLib.Core.OpenXml.Models; +using MiniExcelLib.Core.OpenXml.Utils; +using MiniExcelLib.Core.OpenXml.Zip; +using MiniExcelLib.Core.Reflection; +using static MiniExcelLib.Core.Helpers.ImageHelper; + +namespace MiniExcelLib.Core.OpenXml; + +internal partial class OpenXmlWriter : IMiniExcelWriter { private readonly Dictionary _zipDictionary = []; private Dictionary _cellXfIdMap; - + private IEnumerable> GetSheets() { var sheetId = 0; @@ -38,7 +38,7 @@ internal partial class ExcelOpenXmlSheetWriter : IExcelWriter { sheetId++; var sheetInfos = GetSheetInfos(dt.TableName); - yield return Tuple.Create(sheetInfos.ToDto(sheetId), dt); + yield return Tuple.Create(sheetInfos.ToDto(sheetId), (object?)dt); } yield break; @@ -109,7 +109,7 @@ private string GetPanes() WorksheetXml.StartPane( xSplit: _configuration.FreezeColumnCount > 0 ? _configuration.FreezeColumnCount : null, ySplit: _configuration.FreezeRowCount > 0 ? _configuration.FreezeRowCount : null, - topLeftCell: ExcelOpenXmlUtils.ConvertXYToCell( + topLeftCell: ReferenceHelper.ConvertCoordinatesToCell( _configuration.FreezeColumnCount + 1, _configuration.FreezeRowCount + 1 ), @@ -127,13 +127,13 @@ private string GetPanes() */ - var cellTr = ExcelOpenXmlUtils.ConvertXYToCell(_configuration.FreezeColumnCount + 1, 1); + var cellTr = ReferenceHelper.ConvertCoordinatesToCell(_configuration.FreezeColumnCount + 1, 1); sb.Append(WorksheetXml.PaneSelection("topRight", cellTr, cellTr)); - var cellBl = ExcelOpenXmlUtils.ConvertXYToCell(1, _configuration.FreezeRowCount + 1); + var cellBl = ReferenceHelper.ConvertCoordinatesToCell(1, _configuration.FreezeRowCount + 1); sb.Append(WorksheetXml.PaneSelection("bottomLeft", cellBl, cellBl)); - var cellBr = ExcelOpenXmlUtils.ConvertXYToCell(_configuration.FreezeColumnCount + 1, _configuration.FreezeRowCount + 1); + var cellBr = ReferenceHelper.ConvertCoordinatesToCell(_configuration.FreezeColumnCount + 1, _configuration.FreezeRowCount + 1); sb.Append(WorksheetXml.PaneSelection("bottomRight", cellBr, cellBr)); } else if (_configuration.FreezeColumnCount > 0) @@ -142,7 +142,7 @@ private string GetPanes() /* */ - var cellTr = ExcelOpenXmlUtils.ConvertXYToCell(_configuration.FreezeColumnCount, 1); + var cellTr = ReferenceHelper.ConvertCoordinatesToCell(_configuration.FreezeColumnCount, 1); sb.Append(WorksheetXml.PaneSelection("topRight", cellTr, cellTr)); } @@ -159,20 +159,20 @@ private string GetPanes() return sb.ToString(); } - private Tuple GetCellValue(int rowIndex, int cellIndex, object value, ExcelColumnInfo? columnInfo, bool valueIsNull) + private Tuple GetCellValue(int rowIndex, int cellIndex, object value, MiniExcelColumnInfo? columnInfo, bool valueIsNull) { if (valueIsNull) return Tuple.Create("2", "str", string.Empty); if (value is string str) - return Tuple.Create("2", "str", ExcelOpenXmlUtils.EncodeXml(str)); + return Tuple.Create("2", "str", XmlHelper.EncodeXml(str)); var type = GetValueType(value, columnInfo); if (columnInfo is { ExcelFormat: not null, ExcelFormatId: -1 } && value is IFormattable formattableValue) { var formattedStr = formattableValue.ToString(columnInfo.ExcelFormat, _configuration.Culture); - return Tuple.Create("2", "str", ExcelOpenXmlUtils.EncodeXml(formattedStr)); + return Tuple.Create("2", "str", XmlHelper.EncodeXml(formattedStr)); } if (type == typeof(DateTime)) @@ -209,15 +209,15 @@ private Tuple GetCellValue(int rowIndex, int cellIndex, var base64 = GetFileValue(rowIndex, cellIndex, value); if (_configuration.EnableWriteFilePath) { - return Tuple.Create("4", "str", ExcelOpenXmlUtils.EncodeXml(base64)); + return Tuple.Create("4", "str", XmlHelper.EncodeXml(base64)); } return Tuple.Create("4", "str", ""); } - return Tuple.Create("2", "str", ExcelOpenXmlUtils.EncodeXml(value.ToString())); + return Tuple.Create("2", "str", XmlHelper.EncodeXml(value.ToString())); } - private static Type? GetValueType(object value, ExcelColumnInfo? columnInfo) + private static Type? GetValueType(object value, MiniExcelColumnInfo? columnInfo) { Type type; if (columnInfo is not { Key: null }) @@ -284,7 +284,7 @@ private string GetFileValue(int rowIndex, int cellIndex, object value) SheetId = _currentSheetIndex }; - if (format != ImageFormat.Unknown) + if (format != ImageHelper.ImageFormat.Unknown) { file.Extension = format.ToString(); file.IsImage = true; @@ -301,7 +301,7 @@ private string GetFileValue(int rowIndex, int cellIndex, object value) return base64; } - private Tuple GetDateTimeValue(DateTime value, ExcelColumnInfo columnInfo) + private Tuple GetDateTimeValue(DateTime value, MiniExcelColumnInfo columnInfo) { string? cellValue; if (!ReferenceEquals(_configuration.Culture, CultureInfo.InvariantCulture)) diff --git a/src/MiniExcel/OpenXml/ExcelOpenXmlSheetWriter.cs b/src/MiniExcelLib.Core/OpenXml/OpenXmlWriter.cs similarity index 86% rename from src/MiniExcel/OpenXml/ExcelOpenXmlSheetWriter.cs rename to src/MiniExcelLib.Core/OpenXml/OpenXmlWriter.cs index a59daa33..c0e96fde 100644 --- a/src/MiniExcel/OpenXml/ExcelOpenXmlSheetWriter.cs +++ b/src/MiniExcelLib.Core/OpenXml/OpenXmlWriter.cs @@ -1,23 +1,21 @@ -using System; -using System.Collections.Generic; -using System.IO; using System.IO.Compression; -using System.Linq; using System.Text; -using System.Threading; -using System.Threading.Tasks; using System.Xml.Linq; -using MiniExcelLibs.OpenXml.Constants; -using MiniExcelLibs.OpenXml.Models; -using MiniExcelLibs.OpenXml.Styles; -using MiniExcelLibs.Utils; -using MiniExcelLibs.WriteAdapter; -using MiniExcelLibs.Zip; +using MiniExcelLib.Core.Abstractions; +using MiniExcelLib.Core.Helpers; +using MiniExcelLib.Core.OpenXml.Constants; +using MiniExcelLib.Core.OpenXml.Models; +using MiniExcelLib.Core.OpenXml.Styles; +using MiniExcelLib.Core.OpenXml.Utils; +using MiniExcelLib.Core.OpenXml.Zip; +using MiniExcelLib.Core.Reflection; +using MiniExcelLib.Core.WriteAdapters; using Zomp.SyncMethodGenerator; +using MiniExcelLib.Core.Helpers; -namespace MiniExcelLibs.OpenXml; +namespace MiniExcelLib.Core.OpenXml; -internal partial class ExcelOpenXmlSheetWriter : IExcelWriter +internal partial class OpenXmlWriter : IMiniExcelWriter { private static readonly UTF8Encoding Utf8WithBom = new(true); @@ -33,7 +31,7 @@ internal partial class ExcelOpenXmlSheetWriter : IExcelWriter private int _currentSheetIndex = 0; - public ExcelOpenXmlSheetWriter(Stream stream, object? value, string? sheetName, IMiniExcelConfiguration? configuration, bool printHeader) + internal OpenXmlWriter(Stream stream, object? value, string? sheetName, IMiniExcelConfiguration? configuration, bool printHeader) { _stream = stream; @@ -50,7 +48,19 @@ public ExcelOpenXmlSheetWriter(Stream stream, object? value, string? sheetName, _printHeader = printHeader; _defaultSheetName = sheetName; } - + + [CreateSyncVersion] + internal static Task CreateAsync(Stream stream, object? value, string? sheetName, bool printHeader, IMiniExcelConfiguration? configuration, CancellationToken cancellationToken = default) + { + if (string.IsNullOrEmpty(sheetName)) + throw new ArgumentException("Sheet names cannot be empty or null", nameof(sheetName)); + if (sheetName?.Length > 31) + throw new ArgumentException("Sheet names must be less than 31 characters", nameof(sheetName)); + + var writer = new OpenXmlWriter(stream, value, sheetName, configuration, printHeader); + return Task.FromResult(writer); + } + [CreateSyncVersion] public async Task SaveAsAsync(CancellationToken cancellationToken = default) { @@ -98,7 +108,7 @@ public async Task InsertAsync(bool overwriteSheet = false, CancellationToke cancellationToken.ThrowIfCancellationRequested(); - using var reader = await ExcelOpenXmlSheetReader.CreateAsync(_stream, _configuration, cancellationToken: cancellationToken).ConfigureAwait(false); + using var reader = await OpenXmlReader.CreateAsync(_stream, _configuration, cancellationToken: cancellationToken).ConfigureAwait(false); var sheetRecords = (await reader.GetWorkbookRelsAsync(_archive.Entries, cancellationToken).ConfigureAwait(false)).ToArray(); foreach (var sheetRecord in sheetRecords.OrderBy(o => o.Id)) { @@ -189,7 +199,7 @@ private async Task CreateSheetXmlAsync(object? values, string sheetPath, Ca #else using var zipStream = entry.Open(); #endif - using var writer = new MiniExcelStreamWriter(zipStream, Utf8WithBom, _configuration.BufferSize); + using var writer = new SafeStreamWriter(zipStream, Utf8WithBom, _configuration.BufferSize); if (values is null) { @@ -205,13 +215,13 @@ private async Task CreateSheetXmlAsync(object? values, string sheetPath, Ca } [CreateSyncVersion] - private static async Task WriteEmptySheetAsync(MiniExcelStreamWriter writer) + private static async Task WriteEmptySheetAsync(Helpers_SafeStreamWriter writer) { await writer.WriteAsync(ExcelXml.EmptySheetXml).ConfigureAwait(false); } [CreateSyncVersion] - private static async Task WriteDimensionPlaceholderAsync(MiniExcelStreamWriter writer) + private static async Task WriteDimensionPlaceholderAsync(Helpers_SafeStreamWriter writer) { var dimensionPlaceholderPostition = await writer.WriteAndFlushAsync(WorksheetXml.StartDimension).ConfigureAwait(false); await writer.WriteAsync(WorksheetXml.DimensionPlaceholder).ConfigureAwait(false); // end of code will be replaced @@ -220,7 +230,7 @@ private static async Task WriteDimensionPlaceholderAsync(MiniExcelStreamWr } [CreateSyncVersion] - private static async Task WriteDimensionAsync(MiniExcelStreamWriter writer, int maxRowIndex, int maxColumnIndex, long placeholderPosition) + private static async Task WriteDimensionAsync(Helpers_SafeStreamWriter writer, int maxRowIndex, int maxColumnIndex, long placeholderPosition) { // Flush and save position so that we can get back again. var position = await writer.FlushAsync().ConfigureAwait(false); @@ -232,7 +242,7 @@ private static async Task WriteDimensionAsync(MiniExcelStreamWriter writer, int } [CreateSyncVersion] - private async Task WriteValuesAsync(MiniExcelStreamWriter writer, object values, CancellationToken cancellationToken) + private async Task WriteValuesAsync(Helpers_SafeStreamWriter writer, object values, CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); @@ -245,11 +255,13 @@ private async Task WriteValuesAsync(MiniExcelStreamWriter writer, object va var count = 0; var isKnownCount = writeAdapter is not null && writeAdapter.TryGetKnownCount(out count); - List props; + List props; #if SYNC_ONLY props = writeAdapter?.GetColumns(); #else - props = writeAdapter is not null ? writeAdapter?.GetColumns() : await asyncWriteAdapter.GetColumnsAsync().ConfigureAwait(false); + props = writeAdapter is not null + ? writeAdapter?.GetColumns() + : await asyncWriteAdapter.GetColumnsAsync().ConfigureAwait(false); #endif if (props is null) @@ -319,6 +331,8 @@ private async Task WriteValuesAsync(MiniExcelStreamWriter writer, object va else { #if !SYNC_ONLY +#pragma warning disable CA2007 + //todo: why does this throw compiler error even if ConfigureAwait(false) is present? await foreach (var row in asyncWriteAdapter.GetRowsAsync(props, cancellationToken).ConfigureAwait(false)) { cancellationToken.ThrowIfCancellationRequested(); @@ -330,6 +344,7 @@ private async Task WriteValuesAsync(MiniExcelStreamWriter writer, object va } await writer.WriteAsync(WorksheetXml.EndRow, cancellationToken).ConfigureAwait(false); } +#pragma warning restore CA2007 #endif } maxRowIndex = currentRowIndex; @@ -360,7 +375,7 @@ private async Task WriteValuesAsync(MiniExcelStreamWriter writer, object va } [CreateSyncVersion] - private static async Task WriteColumnWidthPlaceholdersAsync(MiniExcelStreamWriter writer, int count, CancellationToken cancellationToken = default) + private static async Task WriteColumnWidthPlaceholdersAsync(Helpers_SafeStreamWriter writer, int count, CancellationToken cancellationToken = default) { cancellationToken.ThrowIfCancellationRequested(); @@ -370,7 +385,7 @@ private static async Task WriteColumnWidthPlaceholdersAsync(MiniExcelStrea } [CreateSyncVersion] - private static async Task OverwriteColumnWidthPlaceholdersAsync(MiniExcelStreamWriter writer, long placeholderPosition, IEnumerable? columnWidths, CancellationToken cancellationToken = default) + private static async Task OverwriteColumnWidthPlaceholdersAsync(Helpers_SafeStreamWriter writer, long placeholderPosition, IEnumerable? columnWidths, CancellationToken cancellationToken = default) { cancellationToken.ThrowIfCancellationRequested(); @@ -384,7 +399,7 @@ private static async Task OverwriteColumnWidthPlaceholdersAsync(MiniExcelStreamW } [CreateSyncVersion] - private static async Task WriteColumnsWidthsAsync(MiniExcelStreamWriter writer, IEnumerable? columnWidths, CancellationToken cancellationToken = default) + private static async Task WriteColumnsWidthsAsync(Helpers_SafeStreamWriter writer, IEnumerable? columnWidths, CancellationToken cancellationToken = default) { var hasWrittenStart = false; @@ -408,7 +423,7 @@ private static async Task WriteColumnsWidthsAsync(MiniExcelStreamWriter writer, } [CreateSyncVersion] - private async Task PrintHeaderAsync(MiniExcelStreamWriter writer, List props, CancellationToken cancellationToken = default) + private async Task PrintHeaderAsync(Helpers_SafeStreamWriter writer, List props, CancellationToken cancellationToken = default) { const int yIndex = 1; await writer.WriteAsync(WorksheetXml.StartRow(yIndex), cancellationToken).ConfigureAwait(false); @@ -422,7 +437,7 @@ private async Task PrintHeaderAsync(MiniExcelStreamWriter writer, List /// Only takes effect when the image is in AbsoluteAnchor floating mode /// public Point Location { get; set; } public XlsxImgType ImgType { get; set; } - internal int ColumnNumber => ReferenceHelper.ConvertCellToXY(CellAddress).Item1 -1; - internal int RowNumber => ReferenceHelper.ConvertCellToXY(CellAddress).Item2 - 1; + + internal int ColumnNumber => ReferenceHelper.ConvertCellToCoordinates(CellAddress).Item1 -1; + internal int RowNumber => ReferenceHelper.ConvertCellToCoordinates(CellAddress).Item2 - 1; public int WidthPx { get; set; } = 80; public int HeightPx { get; set; } = 24; diff --git a/src/MiniExcel/Picture/MiniExcelPictureImplement.cs b/src/MiniExcelLib.Core/OpenXml/Picture/OpenXmlPictureImplement.cs similarity index 94% rename from src/MiniExcel/Picture/MiniExcelPictureImplement.cs rename to src/MiniExcelLib.Core/OpenXml/Picture/OpenXmlPictureImplement.cs index 4274495e..b94fe50f 100644 --- a/src/MiniExcel/Picture/MiniExcelPictureImplement.cs +++ b/src/MiniExcelLib.Core/OpenXml/Picture/OpenXmlPictureImplement.cs @@ -1,17 +1,13 @@ -using MiniExcelLibs.Enums; -using MiniExcelLibs.OpenXml; -using MiniExcelLibs.Zip; +using System.IO.Compression; +using MiniExcelLib.Core.Enums; +using MiniExcelLib.Core.OpenXml; +using MiniExcelLib.Core.OpenXml.Zip; using System; using System.Drawing; using System.IO; -using System.IO.Compression; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; using System.Xml; -using Zomp.SyncMethodGenerator; -namespace MiniExcelLibs.Picture; +namespace MiniExcelLib.Core.OpenXml.Picture; internal static partial class MiniExcelPictureImplement { @@ -39,8 +35,8 @@ private static bool CheckRelationshipExists(XmlDocument doc, string id, string t public static async Task AddPictureAsync(Stream excelStream, CancellationToken cancellationToken = default, params MiniExcelPicture[] images) { // get sheets - using var excelArchive = new ExcelOpenXmlZip(excelStream); - using var reader = await ExcelOpenXmlSheetReader.CreateAsync(excelStream, null, cancellationToken).ConfigureAwait(false); + using var excelArchive = new OpenXmlZip(excelStream); + using var reader = await OpenXmlReader.CreateAsync(excelStream, null, cancellationToken).ConfigureAwait(false); using var archive = new ZipArchive(excelStream, ZipArchiveMode.Update, true); var sheetEntries = (await reader.GetWorkbookRelsAsync(excelArchive.EntryCollection, cancellationToken).ConfigureAwait(false))?.ToList() ?? []; @@ -142,10 +138,9 @@ public static async Task AddPictureAsync(Stream excelStream, CancellationToken c var row = image.RowNumber; var widthPx = image.WidthPx; var heightPx = image.HeightPx; - var imgtype = image.ImgType; - var location = image.Location; - // Step 1: Add image to /xl/media/ - var imageName = $"image{Guid.NewGuid():N}.png"; + + // Step 1: Add image to /xl/media/ + var imageName = $"image{Guid.NewGuid():N}.png"; var imagePath = $"xl/media/{imageName}"; var imageEntry = archive.CreateEntry(imagePath); @@ -179,7 +174,7 @@ public static async Task AddPictureAsync(Stream excelStream, CancellationToken c // Step 3: Add anchor to drawing XML var relId = $"rId{Guid.NewGuid():N}"; - drawingDoc = CreateDrawingXml(drawingDoc, col, row, widthPx, heightPx, relId, imgtype,location); + drawingDoc = CreateDrawingXml(drawingDoc, col, row, widthPx, heightPx, relId, imgtype, location); // Step 4: Add image relationship to drawing rels var relNode = drawingRelsDoc.CreateElement("Relationship", drawingRelsDoc.DocumentElement.NamespaceURI); @@ -197,8 +192,8 @@ public static async Task AddPictureAsync(Stream excelStream, CancellationToken c public static void AddPicture(Stream excelStream, params MiniExcelPicture[] images) { // get sheets - using var excelArchive = new ExcelOpenXmlZip(excelStream); - using var reader = ExcelOpenXmlSheetReader.Create(excelStream, null); + using var excelArchive = new OpenXmlZip(excelStream); + using var reader = OpenXmlReader.Create(excelStream, null); using var archive = new ZipArchive(excelStream, ZipArchiveMode.Update, true); var sheetEntries = reader.GetWorkbookRels(excelArchive.EntryCollection)?.ToList() ?? []; @@ -208,7 +203,7 @@ public static void AddPicture(Stream excelStream, params MiniExcelPicture[] imag { var sheetName = sheetGroup.Key; var sheetEnt = sheetEntries.Find(x => x.Name == sheetName) ?? sheetEntries[0]; - var sheetXmlName = sheetEnt.Path.Split('/').Last().Split('.')[0]; + var sheetXmlName = Enumerable.Last(sheetEnt.Path.Split('/')).Split('.')[0]; var sheetPath = $"xl/worksheets/{sheetXmlName}.xml"; var sheetEntry = archive.GetEntry(sheetPath); @@ -302,6 +297,7 @@ public static void AddPicture(Stream excelStream, params MiniExcelPicture[] imag var heightPx = image.HeightPx; var imgtype = image.ImgType; var location = image.Location; + // Step 1: Add image to /xl/media/ var imageName = $"image{Guid.NewGuid():N}.png"; var imagePath = $"xl/media/{imageName}"; @@ -326,7 +322,7 @@ public static void AddPicture(Stream excelStream, params MiniExcelPicture[] imag // Step 3: Add anchor to drawing XML var relId = $"rId{Guid.NewGuid():N}"; - drawingDoc = CreateDrawingXml(drawingDoc, col, row, widthPx, heightPx, relId, imgtype,location); + drawingDoc = CreateDrawingXml(drawingDoc, col, row, widthPx, heightPx, relId, imgtype, location); // Step 4: Add image relationship to drawing rels var relNode = drawingRelsDoc.CreateElement("Relationship", drawingRelsDoc.DocumentElement.NamespaceURI); @@ -408,13 +404,13 @@ private static string GetColumnName(int colIndex) return columnName; } public static XmlDocument CreateOrUpdateDrawingXml( - XmlDocument? existingDoc, - int col, int row, - int widthPx, int heightPx, - string relId, - XlsxImgType imgType, - Point Location -) + XmlDocument? existingDoc, + int col, int row, + int widthPx, int heightPx, + string relId, + XlsxImgType imgType, + Point Location + ) { var doc = existingDoc ?? new XmlDocument(); var ns = new XmlNamespaceManager(doc.NameTable); @@ -597,8 +593,8 @@ Point Location return doc; } - - public static XmlDocument CreateOrUpdateDrawingXml( + + public static XmlDocument CreateOrUpdateDrawingXml( XmlDocument? existingDoc, int col, int row, int widthPx, int heightPx, diff --git a/src/MiniExcel/OpenXml/Styles/DefaultSheetStyleBuilder.cs b/src/MiniExcelLib.Core/OpenXml/Styles/DefaultSheetStyleBuilder.cs similarity index 98% rename from src/MiniExcel/OpenXml/Styles/DefaultSheetStyleBuilder.cs rename to src/MiniExcelLib.Core/OpenXml/Styles/DefaultSheetStyleBuilder.cs index 399c2624..32add149 100644 --- a/src/MiniExcel/OpenXml/Styles/DefaultSheetStyleBuilder.cs +++ b/src/MiniExcelLib.Core/OpenXml/Styles/DefaultSheetStyleBuilder.cs @@ -1,6 +1,4 @@ -using System.Threading.Tasks; - -namespace MiniExcelLibs.OpenXml.Styles; +namespace MiniExcelLib.Core.OpenXml.Styles; internal partial class DefaultSheetStyleBuilder : SheetStyleBuilderBase { diff --git a/src/MiniExcel/OpenXml/Styles/ISheetStyleBuilder.cs b/src/MiniExcelLib.Core/OpenXml/Styles/ISheetStyleBuilder.cs similarity index 63% rename from src/MiniExcel/OpenXml/Styles/ISheetStyleBuilder.cs rename to src/MiniExcelLib.Core/OpenXml/Styles/ISheetStyleBuilder.cs index f0b826a7..41fd473c 100644 --- a/src/MiniExcel/OpenXml/Styles/ISheetStyleBuilder.cs +++ b/src/MiniExcelLib.Core/OpenXml/Styles/ISheetStyleBuilder.cs @@ -1,7 +1,4 @@ -using System.Threading; -using System.Threading.Tasks; - -namespace MiniExcelLibs.OpenXml.Styles; +namespace MiniExcelLib.Core.OpenXml.Styles; internal partial interface ISheetStyleBuilder { diff --git a/src/MiniExcel/OpenXml/Styles/MinimalSheetStyleBuilder.cs b/src/MiniExcelLib.Core/OpenXml/Styles/MinimalSheetStyleBuilder.cs similarity index 96% rename from src/MiniExcel/OpenXml/Styles/MinimalSheetStyleBuilder.cs rename to src/MiniExcelLib.Core/OpenXml/Styles/MinimalSheetStyleBuilder.cs index b80a2415..90b7214f 100644 --- a/src/MiniExcel/OpenXml/Styles/MinimalSheetStyleBuilder.cs +++ b/src/MiniExcelLib.Core/OpenXml/Styles/MinimalSheetStyleBuilder.cs @@ -1,6 +1,4 @@ -using System.Threading.Tasks; - -namespace MiniExcelLibs.OpenXml.Styles; +namespace MiniExcelLib.Core.OpenXml.Styles; internal partial class MinimalSheetStyleBuilder : SheetStyleBuilderBase { diff --git a/src/MiniExcel/OpenXml/Styles/SheetStyleBuildContext.cs b/src/MiniExcelLib.Core/OpenXml/Styles/SheetStyleBuildContext.cs similarity index 90% rename from src/MiniExcel/OpenXml/Styles/SheetStyleBuildContext.cs rename to src/MiniExcelLib.Core/OpenXml/Styles/SheetStyleBuildContext.cs index 287faba5..45cb269e 100644 --- a/src/MiniExcel/OpenXml/Styles/SheetStyleBuildContext.cs +++ b/src/MiniExcelLib.Core/OpenXml/Styles/SheetStyleBuildContext.cs @@ -1,31 +1,27 @@ -using MiniExcelLibs.Attributes; -using MiniExcelLibs.OpenXml.Constants; -using MiniExcelLibs.Zip; -using System; -using System.Collections.Generic; -using System.IO; -using System.IO.Compression; -using System.Linq; +using System.IO.Compression; using System.Text; -using System.Threading; -using System.Threading.Tasks; using System.Xml; +using MiniExcelLib.Core.Attributes; +using MiniExcelLib.Core.Helpers; +using MiniExcelLib.Core.OpenXml.Constants; +using MiniExcelLib.Core.OpenXml.Utils; +using MiniExcelLib.Core.OpenXml.Zip; -namespace MiniExcelLibs.OpenXml.Styles; +namespace MiniExcelLib.Core.OpenXml.Styles; internal class SheetStyleBuildContext : IDisposable { - private static readonly string _emptyStylesXml = ExcelOpenXmlUtils.MinifyXml - (@" - - - " - ); + private static readonly string EmptyStylesXml = XmlHelper.MinifyXml( + """ + + + + """); private readonly Dictionary _zipDictionary; private readonly MiniExcelZipArchive _archive; private readonly Encoding _encoding; - private readonly ICollection _columns; + private readonly ICollection _columns; private StringReader _emptyStylesXmlStringReader; private ZipArchiveEntry? _oldStyleXmlZipEntry; @@ -37,7 +33,7 @@ internal class SheetStyleBuildContext : IDisposable private bool _finalized; private bool _disposed; - public SheetStyleBuildContext(Dictionary zipDictionary, MiniExcelZipArchive archive, Encoding encoding, ICollection columns) + public SheetStyleBuildContext(Dictionary zipDictionary, MiniExcelZipArchive archive, Encoding encoding, ICollection columns) { _zipDictionary = zipDictionary; _archive = archive; @@ -49,7 +45,7 @@ public SheetStyleBuildContext(Dictionary zipDictionary, public XmlWriter NewXmlWriter { get; private set; } public SheetStyleElementInfos OldElementInfos { get; private set; } public SheetStyleElementInfos GenerateElementInfos { get; private set; } - public IEnumerable ColumnsToApply { get; private set; } + public IEnumerable ColumnsToApply { get; private set; } public int CustomFormatCount { get; private set; } public void Initialize(SheetStyleElementInfos generateElementInfos) @@ -75,7 +71,7 @@ public void Initialize(SheetStyleElementInfos generateElementInfos) { OldElementInfos = new SheetStyleElementInfos(); - _emptyStylesXmlStringReader = new StringReader(_emptyStylesXml); + _emptyStylesXmlStringReader = new StringReader(EmptyStylesXml); OldXmlReader = XmlReader.Create(_emptyStylesXmlStringReader, new XmlReaderSettings { IgnoreWhitespace = true }); _newStyleXmlZipEntry = _archive.CreateEntry(ExcelFileNames.Styles, CompressionLevel.Fastest); @@ -122,7 +118,7 @@ public async Task InitializeAsync(SheetStyleElementInfos generateElementInfos, C else { OldElementInfos = new SheetStyleElementInfos(); - _emptyStylesXmlStringReader = new StringReader(_emptyStylesXml); + _emptyStylesXmlStringReader = new StringReader(EmptyStylesXml); OldXmlReader = XmlReader.Create(_emptyStylesXmlStringReader, new XmlReaderSettings { IgnoreWhitespace = true, Async = true }); _newStyleXmlZipEntry = _archive.CreateEntry(ExcelFileNames.Styles, CompressionLevel.Fastest); diff --git a/src/MiniExcel/OpenXml/Styles/SheetStyleBuildResult.cs b/src/MiniExcelLib.Core/OpenXml/Styles/SheetStyleBuildResult.cs similarity index 71% rename from src/MiniExcel/OpenXml/Styles/SheetStyleBuildResult.cs rename to src/MiniExcelLib.Core/OpenXml/Styles/SheetStyleBuildResult.cs index 9ca9d0aa..027e46bc 100644 --- a/src/MiniExcel/OpenXml/Styles/SheetStyleBuildResult.cs +++ b/src/MiniExcelLib.Core/OpenXml/Styles/SheetStyleBuildResult.cs @@ -1,6 +1,4 @@ -using System.Collections.Generic; - -namespace MiniExcelLibs.OpenXml.Styles; +namespace MiniExcelLib.Core.OpenXml.Styles; internal class SheetStyleBuildResult { diff --git a/src/MiniExcel/OpenXml/Styles/SheetStyleBuilderBase.cs b/src/MiniExcelLib.Core/OpenXml/Styles/SheetStyleBuilderBase.cs similarity index 97% rename from src/MiniExcel/OpenXml/Styles/SheetStyleBuilderBase.cs rename to src/MiniExcelLib.Core/OpenXml/Styles/SheetStyleBuilderBase.cs index 9673c7df..517b7a09 100644 --- a/src/MiniExcel/OpenXml/Styles/SheetStyleBuilderBase.cs +++ b/src/MiniExcelLib.Core/OpenXml/Styles/SheetStyleBuilderBase.cs @@ -1,9 +1,6 @@ -using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; -using System.Xml; +using System.Xml; -namespace MiniExcelLibs.OpenXml.Styles; +namespace MiniExcelLib.Core.OpenXml.Styles; internal abstract partial class SheetStyleBuilderBase : ISheetStyleBuilder { diff --git a/src/MiniExcel/OpenXml/Styles/SheetStyleBuilderHelper.cs b/src/MiniExcelLib.Core/OpenXml/Styles/SheetStyleBuilderHelper.cs similarity index 57% rename from src/MiniExcel/OpenXml/Styles/SheetStyleBuilderHelper.cs rename to src/MiniExcelLib.Core/OpenXml/Styles/SheetStyleBuilderHelper.cs index d18df3cb..e3ec2437 100644 --- a/src/MiniExcel/OpenXml/Styles/SheetStyleBuilderHelper.cs +++ b/src/MiniExcelLib.Core/OpenXml/Styles/SheetStyleBuilderHelper.cs @@ -1,20 +1,18 @@ -using System.Collections.Generic; -using System.Linq; -using MiniExcelLibs.Attributes; -using MiniExcelLibs.Utils; +using MiniExcelLib.Core.Attributes; +using MiniExcelLib.Core.OpenXml.Utils; -namespace MiniExcelLibs.OpenXml.Styles; +namespace MiniExcelLib.Core.OpenXml.Styles; public static class SheetStyleBuilderHelper { - public static IEnumerable GenerateStyleIds(int startUpCellXfs, ICollection? dynamicColumns) + public static IEnumerable GenerateStyleIds(int startUpCellXfs, ICollection? dynamicColumns) { if (dynamicColumns is null) yield break; int index = 0; var cols = dynamicColumns - .Where(x => !string.IsNullOrWhiteSpace(x.Format) && new ExcelNumberFormat(x.Format).IsValid) + .Where(x => !string.IsNullOrWhiteSpace(x.Format) && new OpenXmlNumberFormatHelper(x.Format).IsValid) .GroupBy(x => x.Format); foreach (var g in cols) diff --git a/src/MiniExcel/OpenXml/Styles/SheetStyleElementInfos.cs b/src/MiniExcelLib.Core/OpenXml/Styles/SheetStyleElementInfos.cs similarity index 87% rename from src/MiniExcel/OpenXml/Styles/SheetStyleElementInfos.cs rename to src/MiniExcelLib.Core/OpenXml/Styles/SheetStyleElementInfos.cs index e7f76421..3ab807e8 100644 --- a/src/MiniExcel/OpenXml/Styles/SheetStyleElementInfos.cs +++ b/src/MiniExcelLib.Core/OpenXml/Styles/SheetStyleElementInfos.cs @@ -1,28 +1,17 @@ -namespace MiniExcelLibs.OpenXml.Styles; +namespace MiniExcelLib.Core.OpenXml.Styles; public class SheetStyleElementInfos { public bool ExistsNumFmts { get; set; } - public int NumFmtCount { get; set; } - public bool ExistsFonts { get; set; } - public int FontCount { get; set; } - public bool ExistsFills { get; set; } - public int FillCount { get; set; } - public bool ExistsBorders { get; set; } - public int BorderCount { get; set; } - public bool ExistsCellStyleXfs { get; set; } - public int CellStyleXfCount { get; set; } - public bool ExistsCellXfs { get; set; } - public int CellXfCount { get; set; } } \ No newline at end of file diff --git a/src/MiniExcel/SaveByTemplate/ExcelOpenXmlTemplate.Impl.cs b/src/MiniExcelLib.Core/OpenXml/Templates/OpenXmlTemplate.Impl.cs similarity index 94% rename from src/MiniExcel/SaveByTemplate/ExcelOpenXmlTemplate.Impl.cs rename to src/MiniExcelLib.Core/OpenXml/Templates/OpenXmlTemplate.Impl.cs index 9bc90610..5587a2f7 100644 --- a/src/MiniExcel/SaveByTemplate/ExcelOpenXmlTemplate.Impl.cs +++ b/src/MiniExcelLib.Core/OpenXml/Templates/OpenXmlTemplate.Impl.cs @@ -1,23 +1,18 @@ -using MiniExcelLibs.Attributes; -using MiniExcelLibs.Utils; -using System; using System.Collections; -using System.Collections.Generic; using System.Data; using System.Globalization; -using System.IO; using System.IO.Compression; -using System.Linq; using System.Reflection; using System.Text; using System.Text.RegularExpressions; -using System.Threading; -using System.Threading.Tasks; using System.Xml; -using MiniExcelLibs.OpenXml; -using MiniExcelLibs.OpenXml.Constants; +using MiniExcelLib.Core.Attributes; +using MiniExcelLib.Core.Helpers; +using MiniExcelLib.Core.OpenXml.Constants; +using MiniExcelLib.Core.OpenXml.Utils; +using MiniExcelLib.Core.Reflection; -namespace MiniExcelLibs.SaveByTemplate; +namespace MiniExcelLib.Core.OpenXml.Templates; #region Utils internal class XRowInfo @@ -110,27 +105,37 @@ public string ToXmlString(string prefix) => $"<{prefix}mergeCell ref=\"{ColumnHelper.GetAlphabetColumnName(X1)}{Y1}:{ColumnHelper.GetAlphabetColumnName(X2)}{Y2}\"/>"; } -internal class MergeCellIndex +internal class MergeCellIndex(int rowStart, int rowEnd) { - public int RowStart { get; set; } - public int RowEnd { get; set; } - - public MergeCellIndex(int rowStart, int rowEnd) - { - RowStart = rowStart; - RowEnd = rowEnd; - } + public int RowStart { get; } = rowStart; + public int RowEnd { get; } = rowEnd; } internal class XChildNode { - public string InnerText { get; set; } + public string? InnerText { get; set; } public string ColIndex { get; set; } public int RowIndex { get; set; } } + +internal struct Range +{ + public int StartColumn { get; set; } + public int StartRow { get; set; } + public int EndColumn { get; set; } + public int EndRow { get; set; } + + public bool ContainsRow(int row) => StartRow <= row && row <= EndRow; +} + +internal class ConditionalFormatRange +{ + public XmlNode? Node { get; set; } + public List Ranges { get; set; } = []; +} #endregion -internal partial class ExcelOpenXmlTemplate +internal partial class OpenXmlTemplate { private List _xRowInfos; private readonly List _calcChainCellRefs = []; @@ -161,7 +166,6 @@ private async Task GenerateSheetXmlImplByUpdateModeAsync(ZipArchiveEntry sheetZi sheetStream.Dispose(); #endif - sheetZipEntry.Delete(); // ZipArchiveEntry can't update directly, so need to delete then create logic var worksheet = doc.SelectSingleNode("/x:worksheet", Ns); @@ -175,8 +179,7 @@ private async Task GenerateSheetXmlImplByUpdateModeAsync(ZipArchiveEntry sheetZi await WriteSheetXmlAsync(stream, doc, sheetData, mergeCells, cancellationToken).ConfigureAwait(false); } - - + private void GenerateSheetXmlImplByCreateMode(ZipArchiveEntry templateSheetZipEntry, Stream outputZipSheetEntryStream, Stream outputSheetStream, IDictionary inputMaps, IDictionary sharedStrings, bool mergeCells = false) { var doc = new XmlDocument(); @@ -276,34 +279,6 @@ private static IEnumerable ParseConditionalFormatRanges( } } - private class MergeCellIndex - { - public int RowStart { get; set; } - public int RowEnd { get; set; } - - public MergeCellIndex(int rowStart, int rowEnd) - { - RowStart = rowStart; - RowEnd = rowEnd; - } - } - - private struct Range - { - public int StartColumn { get; set; } - public int StartRow { get; set; } - public int EndColumn { get; set; } - public int EndRow { get; set; } - - public bool ContainsRow(int row) => StartRow <= row && row <= EndRow; - } - - private class ConditionalFormatRange - { - public XmlNode Node { get; set; } - public List Ranges { get; set; } - } - [Zomp.SyncMethodGenerator.CreateSyncVersion] private async Task WriteSheetXmlAsync(Stream outputFileStream, XmlDocument doc, XmlNode sheetData, bool mergeCells = false, CancellationToken cancellationToken = default) { @@ -780,11 +755,11 @@ private async Task GenerateCellValuesAsync(GenerateCe else if (type?.IsEnum ?? false) { var description = CustomPropertyHelper.DescriptionAttr(type, cellValue); - cellValueStr = ExcelOpenXmlUtils.EncodeXml(description); + cellValueStr = XmlHelper.EncodeXml(description); } else { - cellValueStr = ExcelOpenXmlUtils.EncodeXml(cellValue?.ToString()); + cellValueStr = XmlHelper.EncodeXml(cellValue?.ToString()); if (!isDictOrTable && TypeHelper.IsNumericType(type)) { if (decimal.TryParse(cellValueStr, out var decimalValue)) @@ -1054,11 +1029,11 @@ private void ProcessFormulas(StringBuilder rowXml, int rowIndex) continue; var fNode = c.OwnerDocument.CreateElement("f", Schemas.SpreadsheetmlXmlns); - fNode.InnerText = v.InnerText.Substring(2); + fNode.InnerText = v.InnerText[2..]; c.InsertBefore(fNode, v); c.RemoveChild(v); - var celRef = ExcelOpenXmlUtils.ConvertXYToCell(ci + 1, rowIndex); + var celRef = ReferenceHelper.ConvertCoordinatesToCell(ci + 1, rowIndex); _calcChainCellRefs.Add(celRef); } } @@ -1070,8 +1045,8 @@ private void ProcessFormulas(StringBuilder rowXml, int rowIndex) private static string? ConvertToDateTimeString(PropertyInfo? propInfo, object cellValue) { //TODO:c.SetAttribute("t", "d"); and custom format - var format = propInfo?.GetAttributeValue((ExcelFormatAttribute x) => x.Format) - ?? propInfo?.GetAttributeValue((ExcelColumnAttribute x) => x.Format) + var format = propInfo?.GetAttributeValue((MiniExcelFormatAttribute x) => x.Format) + ?? propInfo?.GetAttributeValue((MiniExcelColumnAttribute x) => x.Format) ?? "yyyy-MM-dd HH:mm:ss"; return (cellValue as DateTime?)?.ToString(format); diff --git a/src/MiniExcel/SaveByTemplate/ExcelOpenXmlTemplate.MergeCells.cs b/src/MiniExcelLib.Core/OpenXml/Templates/OpenXmlTemplate.MergeCells.cs similarity index 74% rename from src/MiniExcel/SaveByTemplate/ExcelOpenXmlTemplate.MergeCells.cs rename to src/MiniExcelLib.Core/OpenXml/Templates/OpenXmlTemplate.MergeCells.cs index 82e4cc8e..ee0b68cf 100644 --- a/src/MiniExcel/SaveByTemplate/ExcelOpenXmlTemplate.MergeCells.cs +++ b/src/MiniExcelLib.Core/OpenXml/Templates/OpenXmlTemplate.MergeCells.cs @@ -1,34 +1,27 @@ -using System; -using System.Collections.Generic; -using System.IO; using System.IO.Compression; -using System.Linq; using System.Text; -using System.Threading; -using System.Threading.Tasks; -using MiniExcelLibs.OpenXml; -using MiniExcelLibs.Utils; -using MiniExcelLibs.Zip; +using MiniExcelLib.Core.OpenXml.Zip; +using Zomp.SyncMethodGenerator; -namespace MiniExcelLibs.SaveByTemplate; +namespace MiniExcelLib.Core.OpenXml.Templates; -internal partial class ExcelOpenXmlTemplate +internal partial class OpenXmlTemplate { - [Zomp.SyncMethodGenerator.CreateSyncVersion] + [CreateSyncVersion] public async Task MergeSameCellsAsync(string path, CancellationToken cancellationToken = default) { - using var stream = FileHelper.OpenSharedRead(path); + using var stream = File.Open(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); await MergeSameCellsImplAsync(stream, cancellationToken).ConfigureAwait(false); } - [Zomp.SyncMethodGenerator.CreateSyncVersion] + [CreateSyncVersion] public async Task MergeSameCellsAsync(byte[] fileInBytes, CancellationToken cancellationToken = default) { using Stream stream = new MemoryStream(fileInBytes); await MergeSameCellsImplAsync(stream, cancellationToken).ConfigureAwait(false); } - [Zomp.SyncMethodGenerator.CreateSyncVersion] + [CreateSyncVersion] private async Task MergeSameCellsImplAsync(Stream stream, CancellationToken cancellationToken = default) { await stream.CopyToAsync(_outputFileStream @@ -37,8 +30,8 @@ await stream.CopyToAsync(_outputFileStream #endif ).ConfigureAwait(false); - using var reader = await ExcelOpenXmlSheetReader.CreateAsync(_outputFileStream, null, cancellationToken: cancellationToken).ConfigureAwait(false); - using var archive = new ExcelOpenXmlZip(_outputFileStream, mode: ZipArchiveMode.Update, true, Encoding.UTF8); + using var reader = await OpenXmlReader.CreateAsync(_outputFileStream, null, cancellationToken: cancellationToken).ConfigureAwait(false); + using var archive = new OpenXmlZip(_outputFileStream, mode: ZipArchiveMode.Update, true, Encoding.UTF8); //read sharedString var sharedStrings = reader.SharedStrings; diff --git a/src/MiniExcel/SaveByTemplate/ExcelOpenXmlTemplate.cs b/src/MiniExcelLib.Core/OpenXml/Templates/OpenXmlTemplate.cs similarity index 85% rename from src/MiniExcel/SaveByTemplate/ExcelOpenXmlTemplate.cs rename to src/MiniExcelLib.Core/OpenXml/Templates/OpenXmlTemplate.cs index 5fab5039..9577ef3d 100644 --- a/src/MiniExcel/SaveByTemplate/ExcelOpenXmlTemplate.cs +++ b/src/MiniExcelLib.Core/OpenXml/Templates/OpenXmlTemplate.cs @@ -1,21 +1,16 @@ -using System; -using System.IO; using System.IO.Compression; -using System.Linq; using System.Text; using System.Text.RegularExpressions; -using System.Threading; -using System.Threading.Tasks; using System.Xml; -using MiniExcelLibs.OpenXml; -using MiniExcelLibs.OpenXml.Constants; -using MiniExcelLibs.Utils; -using MiniExcelLibs.Zip; +using MiniExcelLib.Core.Abstractions; +using MiniExcelLib.Core.OpenXml.Constants; +using MiniExcelLib.Core.OpenXml.Zip; using Zomp.SyncMethodGenerator; +using CalcChainHelper = MiniExcelLib.Core.OpenXml.Utils.CalcChainHelper; -namespace MiniExcelLibs.SaveByTemplate; +namespace MiniExcelLib.Core.OpenXml.Templates; -internal partial class ExcelOpenXmlTemplate : IExcelTemplate +internal partial class OpenXmlTemplate : IMiniExcelTemplate { #if NET7_0_OR_GREATER [GeneratedRegex("(?<={{).*?(?=}})")] private static partial Regex ExpressionRegex(); @@ -30,14 +25,14 @@ internal partial class ExcelOpenXmlTemplate : IExcelTemplate private readonly IInputValueExtractor _inputValueExtractor; private readonly StringBuilder _calcChainContent = new(); - static ExcelOpenXmlTemplate() + static OpenXmlTemplate() { Ns = new XmlNamespaceManager(new NameTable()); Ns.AddNamespace("x", Schemas.SpreadsheetmlXmlns); Ns.AddNamespace("x14ac", Schemas.SpreadsheetmlXmlX14Ac); } - public ExcelOpenXmlTemplate(Stream stream, IMiniExcelConfiguration? configuration, InputValueExtractor inputValueExtractor) + internal OpenXmlTemplate(Stream stream, IMiniExcelConfiguration? configuration, OpenXmlValueExtractor inputValueExtractor) { _outputFileStream = stream; _configuration = (OpenXmlConfiguration?)configuration ?? OpenXmlConfiguration.DefaultConfig; @@ -47,7 +42,7 @@ public ExcelOpenXmlTemplate(Stream stream, IMiniExcelConfiguration? configuratio [CreateSyncVersion] public async Task SaveAsByTemplateAsync(string templatePath, object value, CancellationToken cancellationToken = default) { - using var stream = FileHelper.OpenSharedRead(templatePath); + using var stream = File.Open(templatePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); await SaveAsByTemplateImplAsync(stream, value, cancellationToken).ConfigureAwait(false); } @@ -61,19 +56,20 @@ public async Task SaveAsByTemplateAsync(byte[] templateBytes, object value, Canc [CreateSyncVersion] internal async Task SaveAsByTemplateImplAsync(Stream templateStream, object value, CancellationToken cancellationToken = default) { - // foreach all templateStream and create file for _outputFileStream and not create sheet file - templateStream.Position = 0; - using var templateReader = await ExcelOpenXmlSheetReader.CreateAsync(templateStream, null, cancellationToken: cancellationToken).ConfigureAwait(false); - using var outputFileArchive = new ExcelOpenXmlZip(_outputFileStream, mode: ZipArchiveMode.Create, true, Encoding.UTF8, isUpdateMode: false); + templateStream.Seek(0, SeekOrigin.Begin); + using var templateReader = await OpenXmlReader.CreateAsync(templateStream, null, cancellationToken: cancellationToken).ConfigureAwait(false); + using var outputFileArchive = new OpenXmlZip(_outputFileStream, mode: ZipArchiveMode.Create, true, Encoding.UTF8, isUpdateMode: false); + try { outputFileArchive.EntryCollection = templateReader.Archive.ZipFile.Entries; //TODO:need to remove } catch (InvalidDataException e) { - throw new InvalidDataException($"An invalid valid OpenXml zip archive was detected, please check or open an issue for this error: {e.Message}"); + throw new InvalidDataException($"An invalid OpenXml zip archive was detected, please check or open an issue for this error: {e.Message}"); } + // foreach all templateStream and create file for _outputFileStream and not create sheet file foreach (var entry in templateReader.Archive.ZipFile.Entries) { outputFileArchive.Entries.Add(entry.FullName.Replace('\\', '/'), entry); @@ -110,7 +106,7 @@ internal async Task SaveAsByTemplateImplAsync(Stream templateStream, object valu await originalEntryStream.CopyToAsync(newEntryStream #if NETCOREAPP2_1_OR_GREATER - , cancellationToken + , cancellationToken #endif ).ConfigureAwait(false); } diff --git a/src/MiniExcel/SaveByTemplate/InputValueExtractor.cs b/src/MiniExcelLib.Core/OpenXml/Templates/OpenXmlValueExtractor.cs similarity index 70% rename from src/MiniExcel/SaveByTemplate/InputValueExtractor.cs rename to src/MiniExcelLib.Core/OpenXml/Templates/OpenXmlValueExtractor.cs index 28c1856a..5efdf58c 100644 --- a/src/MiniExcel/SaveByTemplate/InputValueExtractor.cs +++ b/src/MiniExcelLib.Core/OpenXml/Templates/OpenXmlValueExtractor.cs @@ -1,41 +1,40 @@ -using System.Collections.Generic; -using System.Data; -using System.Linq; -using System.Reflection; -using MiniExcelLibs.Utils; - -namespace MiniExcelLibs.SaveByTemplate; - -public class InputValueExtractor : IInputValueExtractor -{ - public IDictionary ToValueDictionary(object valueObject) - => valueObject is Dictionary valueDictionary - ? GetValuesFromDictionary(valueDictionary) - : GetValuesFromObject(valueObject); - - private static IDictionary GetValuesFromDictionary(Dictionary valueDictionary) - { - return valueDictionary.ToDictionary( - x => x.Key, - x => x.Value is IDataReader dataReader - ? TypeHelper.ConvertToEnumerableDictionary(dataReader).ToList() - : x.Value); - } - - private static IDictionary GetValuesFromObject(object valueObject) - { - var type = valueObject.GetType(); - - var propertyValues = type - .GetProperties(BindingFlags.Public | BindingFlags.Instance) - .Select(property => new { property.Name, Value = property.GetValue(valueObject) }); - - var fieldValues = type - .GetFields(BindingFlags.Public | BindingFlags.Instance) - .Select(field => new { field.Name, Value = field.GetValue(valueObject) }); - - return propertyValues - .Concat(fieldValues) - .ToDictionary(x => x.Name, x => x.Value); - } +using System.Data; +using System.Reflection; +using MiniExcelLib.Core.Abstractions; +using MiniExcelLib.Core.Helpers; + +namespace MiniExcelLib.Core.OpenXml.Templates; + +public class OpenXmlValueExtractor : IInputValueExtractor +{ + public IDictionary ToValueDictionary(object valueObject) + => valueObject is Dictionary valueDictionary + ? GetValuesFromDictionary(valueDictionary) + : GetValuesFromObject(valueObject); + + private static Dictionary GetValuesFromDictionary(Dictionary valueDictionary) + { + return valueDictionary.ToDictionary( + x => x.Key, + x => x.Value is IDataReader dataReader + ? TypeHelper.ConvertToEnumerableDictionary(dataReader).ToList() + : x.Value)!; + } + + private static Dictionary GetValuesFromObject(object valueObject) + { + var type = valueObject.GetType(); + + var propertyValues = type + .GetProperties(BindingFlags.Public | BindingFlags.Instance) + .Select(property => new { property.Name, Value = property.GetValue(valueObject) }); + + var fieldValues = type + .GetFields(BindingFlags.Public | BindingFlags.Instance) + .Select(field => new { field.Name, Value = field.GetValue(valueObject) }); + + return propertyValues + .Concat(fieldValues) + .ToDictionary(x => x.Name, x => x.Value); + } } \ No newline at end of file diff --git a/src/MiniExcel/Utils/CalcChainHelper.cs b/src/MiniExcelLib.Core/OpenXml/Utils/CalcChainHelper.cs similarity index 86% rename from src/MiniExcel/Utils/CalcChainHelper.cs rename to src/MiniExcelLib.Core/OpenXml/Utils/CalcChainHelper.cs index 6066bb4b..1baa1dc7 100644 --- a/src/MiniExcel/Utils/CalcChainHelper.cs +++ b/src/MiniExcelLib.Core/OpenXml/Utils/CalcChainHelper.cs @@ -1,11 +1,7 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Text; -using System.Threading; -using System.Threading.Tasks; +using System.Text; +using Zomp.SyncMethodGenerator; -namespace MiniExcelLibs.Utils; +namespace MiniExcelLib.Core.OpenXml.Utils; internal static partial class CalcChainHelper { @@ -27,7 +23,7 @@ public static string GetCalcChainContent( List cellRefs, int sheetIndex return calcChainContent.ToString(); } - [Zomp.SyncMethodGenerator.CreateSyncVersion] + [CreateSyncVersion] public static async Task GenerateCalcChainSheetAsync(Stream calcChainStream, string calcChainContent, CancellationToken cancellationToken = default) { using var writer = new StreamWriter(calcChainStream, Encoding.UTF8); diff --git a/src/MiniExcel/Utils/DateTimeHelper.cs b/src/MiniExcelLib.Core/OpenXml/Utils/DateTimeHelper.cs similarity index 82% rename from src/MiniExcel/Utils/DateTimeHelper.cs rename to src/MiniExcelLib.Core/OpenXml/Utils/DateTimeHelper.cs index 7741cefc..dac80e70 100644 --- a/src/MiniExcel/Utils/DateTimeHelper.cs +++ b/src/MiniExcelLib.Core/OpenXml/Utils/DateTimeHelper.cs @@ -1,11 +1,11 @@ -namespace MiniExcelLibs.Utils; +namespace MiniExcelLib.Core.OpenXml.Utils; public static class DateTimeHelper { /// /// NumberFormat from NuGet ExcelNumberFormat MIT@License /// - public static bool IsDateTimeFormat(string formatCode) => new ExcelNumberFormat(formatCode).IsDateTimeFormat; + public static bool IsDateTimeFormat(string formatCode) => new OpenXmlNumberFormatHelper(formatCode).IsDateTimeFormat; /**Below Code from ExcelDataReader @MIT License**/ // All OA dates must be strictly in between OADateMinAsDouble and OADateMaxAsDouble diff --git a/src/MiniExcelLib.Core/OpenXml/Utils/GeneralHelper.cs b/src/MiniExcelLib.Core/OpenXml/Utils/GeneralHelper.cs new file mode 100644 index 00000000..cbbb7daa --- /dev/null +++ b/src/MiniExcelLib.Core/OpenXml/Utils/GeneralHelper.cs @@ -0,0 +1,59 @@ +using MiniExcelLib.Core.Helpers; + +namespace MiniExcelLib.Core.OpenXml.Utils; + +internal static class GeneralHelper +{ + public static int GetCellColumnIndex(string cell) + { + const string keys = " ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + const int mode = 26; + + var x = 0; + var cellLetter = GetCellColumnLetter(cell); + //AA=27,ZZ=702 + foreach (var t in cellLetter) + x = x * mode + keys.IndexOf(t); + + return x; + } + + public static int GetCellRowNumber(string cell) + { + if (string.IsNullOrEmpty(cell)) + throw new Exception("cell is null or empty"); + + var cellNumber = string.Empty; + foreach (var t in cell) + { + if (char.IsDigit(t)) + cellNumber += t; + } + return int.Parse(cellNumber); + } + + public static string GetCellColumnLetter(string cell) + { + string GetCellLetter = string.Empty; + foreach (var t in cell) + { + if (char.IsLetter(t)) + GetCellLetter += t; + } + return GetCellLetter; + } + + public static string ConvertColumnName(int x) + { + int dividend = x; + string columnName = string.Empty; + + while (dividend > 0) + { + var modulo = (dividend - 1) % 26; + columnName = Convert.ToChar(65 + modulo) + columnName; + dividend = (dividend - modulo) / 26; + } + return columnName; + } +} \ No newline at end of file diff --git a/src/MiniExcelLib.Core/OpenXml/Utils/MiniExcelPropertyHelper.cs b/src/MiniExcelLib.Core/OpenXml/Utils/MiniExcelPropertyHelper.cs new file mode 100644 index 00000000..5cef216a --- /dev/null +++ b/src/MiniExcelLib.Core/OpenXml/Utils/MiniExcelPropertyHelper.cs @@ -0,0 +1,40 @@ +using System.Reflection; +using MiniExcelLib.Core.OpenXml.Attributes; +using MiniExcelLib.Core.OpenXml.Models; + +namespace MiniExcelLib.Core.OpenXml.Utils; + +internal static class ExcelPropertyHelper +{ + internal static ExcellSheetInfo GetExcellSheetInfo(Type type, MiniExcelBaseConfiguration configuration) + { + // default options + var sheetInfo = new ExcellSheetInfo + { + Key = type.Name, + ExcelSheetName = null, // will be generated automatically as Sheet + ExcelSheetState = SheetState.Visible + }; + + // options from ExcelSheetAttribute + if (type.GetCustomAttribute(typeof(ExcelSheetAttribute)) is ExcelSheetAttribute excelSheetAttr) + { + sheetInfo.ExcelSheetName = excelSheetAttr.Name ?? type.Name; + sheetInfo.ExcelSheetState = excelSheetAttr.State; + } + + // options from DynamicSheets configuration + var openXmlCOnfiguration = configuration as OpenXmlConfiguration; + if (openXmlCOnfiguration?.DynamicSheets?.Length > 0) + { + var dynamicSheet = openXmlCOnfiguration.DynamicSheets.SingleOrDefault(x => x.Key == type.Name); + if (dynamicSheet is not null) + { + sheetInfo.ExcelSheetName = dynamicSheet.Name; + sheetInfo.ExcelSheetState = dynamicSheet.State; + } + } + + return sheetInfo; + } +} \ No newline at end of file diff --git a/src/MiniExcel/Utils/ExcelNumberFormat.cs b/src/MiniExcelLib.Core/OpenXml/Utils/OpenXmlNumberFormatHelper.cs similarity index 95% rename from src/MiniExcel/Utils/ExcelNumberFormat.cs rename to src/MiniExcelLib.Core/OpenXml/Utils/OpenXmlNumberFormatHelper.cs index fd9fae76..1105d589 100644 --- a/src/MiniExcel/Utils/ExcelNumberFormat.cs +++ b/src/MiniExcelLib.Core/OpenXml/Utils/OpenXmlNumberFormatHelper.cs @@ -1,21 +1,18 @@ -using System; -using System.Collections.Generic; -using System.Globalization; -using System.Linq; +using System.Globalization; using System.Text; -namespace MiniExcelLibs.Utils; +namespace MiniExcelLib.Core.OpenXml.Utils; /// /// This code edit from https://github.com/andersnm/ExcelNumberFormat /// -internal class ExcelNumberFormat +internal class OpenXmlNumberFormatHelper { /// - /// Initializes a new instance of the class. + /// Initializes a new instance of the class. /// /// The number format string. - public ExcelNumberFormat(string formatString) + public OpenXmlNumberFormatHelper(string formatString) { var sections = Parser.ParseSections(formatString, out bool syntaxError); @@ -30,7 +27,7 @@ public ExcelNumberFormat(string formatString) } else { - Sections = new List
(); + Sections = []; } } @@ -100,26 +97,18 @@ internal enum SectionType internal class Section { public int SectionIndex { get; set; } - public SectionType Type { get; set; } - public List? GeneralTextDateDurationParts { get; set; } } internal class FractionSection { public List IntegerPart { get; set; } - public List Numerator { get; set; } - public List DenominatorPrefix { get; set; } - public List Denominator { get; set; } - public int DenominatorConstant { get; set; } - public List DenominatorSuffix { get; set; } - public List FractionSuffix { get; set; } public static bool TryParse(List tokens, out FractionSection? format) @@ -167,7 +156,7 @@ public static bool TryParse(List tokens, out FractionSection? format) return true; } - static void GetNumerator(List tokens, out List? integerPart, out List? numeratorPart) + private static void GetNumerator(List tokens, out List? integerPart, out List? numeratorPart) { var hasPlaceholder = false; var hasSpace = false; @@ -256,7 +245,7 @@ private static bool TryGetDenominator(List? tokens, out List? de var token = tokens[index]; if (hasPlaceholder && Token.IsPlaceholder(token)) { - ; // OK + // OK } else if (hasConstant && (Token.IsDigit09(token))) diff --git a/src/MiniExcel/Utils/ReferenceHelper.cs b/src/MiniExcelLib.Core/OpenXml/Utils/ReferenceHelper.cs similarity index 81% rename from src/MiniExcel/Utils/ReferenceHelper.cs rename to src/MiniExcelLib.Core/OpenXml/Utils/ReferenceHelper.cs index eb467eac..4d89e597 100644 --- a/src/MiniExcel/Utils/ReferenceHelper.cs +++ b/src/MiniExcelLib.Core/OpenXml/Utils/ReferenceHelper.cs @@ -1,8 +1,6 @@ -using System; -using System.Globalization; -using System.Linq; +using System.Globalization; -namespace MiniExcelLibs.Utils; +namespace MiniExcelLib.Core.OpenXml.Utils; internal static class ReferenceHelper { @@ -21,7 +19,7 @@ public static string GetCellLetter(string cell) } /// X=CellLetter,Y=CellNumber,ex:A1=(1,1),B2=(2,2) - public static (int, int) ConvertCellToXY(string? cell) + public static (int, int) ConvertCellToCoordinates(string? cell) { const string keys = " ABCDEFGHIJKLMNOPQRSTUVWXYZ"; const int mode = 26; @@ -35,7 +33,7 @@ public static (int, int) ConvertCellToXY(string? cell) } /// X=CellLetter,Y=CellNumber,ex:A1=(1,1),B2=(2,2) - public static string ConvertXyToCell(int x, int y) + public static string ConvertCoordinatesToCell(int x, int y) { int dividend = x; string columnName = string.Empty; @@ -78,17 +76,18 @@ public static bool ParseReference(string value, out int column, out int row) continue; } - if (!char.IsLetter(c)) + if (char.IsLetter(c)) { - if (char.IsDigit(c)) - break; - return false; + row = 0; + column = 0; + position = 0; + break; } - row = 0; - column = 0; - position = 0; - break; + if (char.IsDigit(c)) + break; + + return false; } if (position == 0) diff --git a/src/MiniExcel/OpenXml/SharedStringsDiskCache.cs b/src/MiniExcelLib.Core/OpenXml/Utils/SharedStringsDiskCache.cs similarity index 93% rename from src/MiniExcel/OpenXml/SharedStringsDiskCache.cs rename to src/MiniExcelLib.Core/OpenXml/Utils/SharedStringsDiskCache.cs index a02cd3f2..b93f31af 100644 --- a/src/MiniExcel/OpenXml/SharedStringsDiskCache.cs +++ b/src/MiniExcelLib.Core/OpenXml/Utils/SharedStringsDiskCache.cs @@ -1,10 +1,7 @@ -using System; -using System.Collections; -using System.Collections.Generic; -using System.IO; +using System.Collections; using System.Text; -namespace MiniExcelLibs.OpenXml; +namespace MiniExcelLib.Core.OpenXml.Utils; internal class SharedStringsDiskCache : IDictionary, IDisposable { diff --git a/src/MiniExcel/Utils/XmlReaderHelper.cs b/src/MiniExcelLib.Core/OpenXml/Utils/XmlReaderHelper.cs similarity index 59% rename from src/MiniExcel/Utils/XmlReaderHelper.cs rename to src/MiniExcelLib.Core/OpenXml/Utils/XmlReaderHelper.cs index 61b0e1e6..7a84b0ca 100644 --- a/src/MiniExcel/Utils/XmlReaderHelper.cs +++ b/src/MiniExcelLib.Core/OpenXml/Utils/XmlReaderHelper.cs @@ -1,16 +1,15 @@ -using System.Collections.Generic; -using System.IO; -using System.Linq; using System.Runtime.CompilerServices; -using System.Threading; -using System.Threading.Tasks; +using System.Text; using System.Xml; +using MiniExcelLib.Core.OpenXml.Constants; using Zomp.SyncMethodGenerator; -namespace MiniExcelLibs.Utils; +namespace MiniExcelLib.Core.OpenXml.Utils; internal static partial class XmlReaderHelper { + private static readonly string[] Ns = [Schemas.SpreadsheetmlXmlns, Schemas.SpreadsheetmlXmlStrictns]; + /// /// Pass <?xml> and <worksheet> /// @@ -125,7 +124,7 @@ public static async IAsyncEnumerable GetSharedStringsAsync(Stream stream { if (IsStartElement(reader, "si", nss)) { - var value = await StringHelper.ReadStringItemAsync(reader, cancellationToken).ConfigureAwait(false); + var value = await ReadStringItemAsync(reader, cancellationToken).ConfigureAwait(false); yield return value; } else if (!await SkipContentAsync(reader, cancellationToken).ConfigureAwait(false)) @@ -135,6 +134,70 @@ public static async IAsyncEnumerable GetSharedStringsAsync(Stream stream } } + + /// + /// Copied and modified from ExcelDataReader - @MIT License + /// + [CreateSyncVersion] + public static async Task ReadStringItemAsync(XmlReader reader, CancellationToken cancellationToken = default) + { + var result = new StringBuilder(); + if (!await ReadFirstContentAsync(reader, cancellationToken).ConfigureAwait(false)) + return string.Empty; + + while (!reader.EOF) + { + if (IsStartElement(reader, "t", Ns)) + { + // There are multiple in a . Concatenate within an . + result.Append(await reader.ReadElementContentAsStringAsync() +#if NET6_0_OR_GREATER + .WaitAsync(cancellationToken) +#endif + .ConfigureAwait(false)); + } + else if (IsStartElement(reader, "r", Ns)) + { + result.Append(await ReadRichTextRunAsync(reader, cancellationToken).ConfigureAwait(false)); + } + else if (!await SkipContentAsync(reader, cancellationToken).ConfigureAwait(false)) + { + break; + } + } + + return result.ToString(); + } + + /// + /// Copied and modified from ExcelDataReader - @MIT License + /// + [CreateSyncVersion] + private static async Task ReadRichTextRunAsync(XmlReader reader, CancellationToken cancellationToken = default) + { + var result = new StringBuilder(); + if (!await ReadFirstContentAsync(reader, cancellationToken).ConfigureAwait(false)) + return string.Empty; + + while (!reader.EOF) + { + if (IsStartElement(reader, "t", Ns)) + { + result.Append(await reader.ReadElementContentAsStringAsync() +#if NET6_0_OR_GREATER + .WaitAsync(cancellationToken) +#endif + .ConfigureAwait(false)); + } + else if (!await SkipContentAsync(reader, cancellationToken).ConfigureAwait(false)) + { + break; + } + } + + return result.ToString(); + } + internal static XmlReaderSettings GetXmlReaderSettings(bool async) => new() { IgnoreComments = true, diff --git a/src/MiniExcel/Zip/MiniExcelZipArchive.cs b/src/MiniExcelLib.Core/OpenXml/Zip/MiniExcelZipArchive.cs similarity index 73% rename from src/MiniExcel/Zip/MiniExcelZipArchive.cs rename to src/MiniExcelLib.Core/OpenXml/Zip/MiniExcelZipArchive.cs index 0d729adc..bc761d90 100644 --- a/src/MiniExcel/Zip/MiniExcelZipArchive.cs +++ b/src/MiniExcelLib.Core/OpenXml/Zip/MiniExcelZipArchive.cs @@ -1,16 +1,14 @@ -using System; -using System.IO; using System.IO.Compression; using System.Text; -namespace MiniExcelLibs.Zip; +namespace MiniExcelLib.Core.OpenXml.Zip; public class MiniExcelZipArchive(Stream stream, ZipArchiveMode mode, bool leaveOpen, Encoding entryNameEncoding) : ZipArchive(stream, mode, leaveOpen, entryNameEncoding) { public new void Dispose() { - Dispose(disposing: true); + base.Dispose(disposing: true); GC.SuppressFinalize(this); } } \ No newline at end of file diff --git a/src/MiniExcel/Zip/ExcelOpenXmlZip.cs b/src/MiniExcelLib.Core/OpenXml/Zip/OpenXmlZip.cs similarity index 83% rename from src/MiniExcel/Zip/ExcelOpenXmlZip.cs rename to src/MiniExcelLib.Core/OpenXml/Zip/OpenXmlZip.cs index 90557dfa..89cc0761 100644 --- a/src/MiniExcel/Zip/ExcelOpenXmlZip.cs +++ b/src/MiniExcelLib.Core/OpenXml/Zip/OpenXmlZip.cs @@ -1,15 +1,12 @@ -using System; -using System.Collections.Generic; using System.Collections.ObjectModel; -using System.IO; using System.IO.Compression; using System.Text; using System.Xml; -namespace MiniExcelLibs.Zip; +namespace MiniExcelLib.Core.OpenXml.Zip; /// Copy & modified by ExcelDataReader ZipWorker @MIT License -internal class ExcelOpenXmlZip : IDisposable +internal class OpenXmlZip : IDisposable { private bool _disposed; @@ -25,7 +22,7 @@ internal class ExcelOpenXmlZip : IDisposable XmlResolver = null, }; - public ExcelOpenXmlZip(Stream fileStream, ZipArchiveMode mode = ZipArchiveMode.Read, bool leaveOpen = false, Encoding? entryNameEncoding = null, bool isUpdateMode = true) + public OpenXmlZip(Stream fileStream, ZipArchiveMode mode = ZipArchiveMode.Read, bool leaveOpen = false, Encoding? entryNameEncoding = null, bool isUpdateMode = true) { entryNameEncoding ??= Encoding.UTF8; ZipFile = new MiniExcelZipArchive(fileStream, mode, leaveOpen, entryNameEncoding); @@ -60,7 +57,7 @@ public ExcelOpenXmlZip(Stream fileStream, ZipArchiveMode mode = ZipArchiveMode.R return entry is not null ? XmlReader.Create(entry.Open(), XmlSettings) : null; } - ~ExcelOpenXmlZip() + ~OpenXmlZip() { Dispose(false); } diff --git a/src/MiniExcel/Zip/ZipPackageInfo.cs b/src/MiniExcelLib.Core/OpenXml/Zip/ZipPackageInfo.cs similarity index 74% rename from src/MiniExcel/Zip/ZipPackageInfo.cs rename to src/MiniExcelLib.Core/OpenXml/Zip/ZipPackageInfo.cs index 912ae5e9..1f45279a 100644 --- a/src/MiniExcel/Zip/ZipPackageInfo.cs +++ b/src/MiniExcelLib.Core/OpenXml/Zip/ZipPackageInfo.cs @@ -1,6 +1,6 @@ -using System.IO.Compression; +using System.IO.Compression; -namespace MiniExcelLibs.Zip; +namespace MiniExcelLib.Core.OpenXml.Zip; internal class ZipPackageInfo(ZipArchiveEntry zipArchiveEntry, string contentType) { diff --git a/src/MiniExcelLib.Core/Properties/AssemblyInfo.cs b/src/MiniExcelLib.Core/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..e083c770 --- /dev/null +++ b/src/MiniExcelLib.Core/Properties/AssemblyInfo.cs @@ -0,0 +1,5 @@ +using System.Runtime.CompilerServices; + +#if PLAT_SKIP_LOCALS_INIT +[module: System.Runtime.CompilerServices.SkipLocalsInit] +#endif diff --git a/src/MiniExcel/Utils/CustomPropertyHelper.cs b/src/MiniExcelLib.Core/Reflection/CustomPropertyHelper.cs similarity index 66% rename from src/MiniExcel/Utils/CustomPropertyHelper.cs rename to src/MiniExcelLib.Core/Reflection/CustomPropertyHelper.cs index 621b5052..8b01aba4 100644 --- a/src/MiniExcel/Utils/CustomPropertyHelper.cs +++ b/src/MiniExcelLib.Core/Reflection/CustomPropertyHelper.cs @@ -1,50 +1,14 @@ -using System; -using System.Collections; -using System.Collections.Generic; +using System.Collections; using System.ComponentModel; -using System.Linq; using System.Reflection; -using MiniExcelLibs.Attributes; -using MiniExcelLibs.OpenXml; -using MiniExcelLibs.OpenXml.Models; +using MiniExcelLib.Core.Attributes; +using MiniExcelLib.Core.Helpers; -namespace MiniExcelLibs.Utils; +namespace MiniExcelLib.Core.Reflection; -internal class ExcelColumnInfo +public static class CustomPropertyHelper { - public object Key { get; set; } - public int? ExcelColumnIndex { get; set; } - public string? ExcelColumnName { get; set; } - public string[]? ExcelColumnAliases { get; set; } = []; - public Property Property { get; set; } - public Type ExcludeNullableType { get; set; } - public bool Nullable { get; internal set; } - public string? ExcelFormat { get; internal set; } - public double? ExcelColumnWidth { get; internal set; } - public string? ExcelIndexName { get; internal set; } - public bool ExcelIgnore { get; internal set; } - public int ExcelFormatId { get; internal set; } - public ColumnType ExcelColumnType { get; internal set; } - public Func? CustomFormatter { get; set; } -} - -internal class ExcellSheetInfo -{ - public object Key { get; set; } - public string? ExcelSheetName { get; set; } - public SheetState ExcelSheetState { get; set; } - - private string ExcelSheetStateAsString => ExcelSheetState.ToString().ToLower(); - - public SheetDto ToDto(int sheetIndex) - { - return new SheetDto { Name = ExcelSheetName, SheetIdx = sheetIndex, State = ExcelSheetStateAsString }; - } -} - -internal static class CustomPropertyHelper -{ - internal static IDictionary GetEmptyExpandoObject(int maxColumnIndex, int startCellIndex) + public static IDictionary GetEmptyExpandoObject(int maxColumnIndex, int startCellIndex) { var cell = new Dictionary(); for (int i = startCellIndex; i <= maxColumnIndex; i++) @@ -60,7 +24,7 @@ internal static class CustomPropertyHelper return cell; } - internal static IDictionary GetEmptyExpandoObject(Dictionary hearrows) + public static IDictionary GetEmptyExpandoObject(Dictionary hearrows) { var cell = new Dictionary(); foreach (var hr in hearrows) @@ -76,7 +40,7 @@ internal static class CustomPropertyHelper return cell; } - internal static List GetSaveAsProperties(this Type type, MiniExcelConfiguration configuration) + private static List GetSaveAsProperties(this Type type, MiniExcelBaseConfiguration configuration) { var props = GetExcelPropertyInfo(type, BindingFlags.Public | BindingFlags.Instance, configuration) .Where(prop => prop.Property.CanRead) @@ -88,7 +52,7 @@ internal static List GetSaveAsProperties(this Type type, MiniEx return SortCustomProps(props); } - internal static List SortCustomProps(List props) + private static List SortCustomProps(List props) { // https://github.com/mini-software/MiniExcel/issues/142 //TODO: need optimize performance @@ -104,7 +68,7 @@ internal static List GetSaveAsProperties(this Type type, MiniEx var withoutCustomIndexProps = props.Where(w => w.ExcelColumnIndex is null or -1).ToList(); var index = 0; - var newProps = new List(); + var newProps = new List(); for (int i = 0; i <= maxColumnIndex; i++) { var p1 = withCustomIndexProps.SingleOrDefault(s => s.ExcelColumnIndex == i); @@ -130,13 +94,13 @@ internal static List GetSaveAsProperties(this Type type, MiniEx return newProps; } - internal static List GetExcelCustomPropertyInfos(Type type, string[] keys, MiniExcelConfiguration configuration) + internal static List GetExcelCustomPropertyInfos(Type type, string[] keys, MiniExcelBaseConfiguration configuration) { const BindingFlags flags = BindingFlags.SetProperty | BindingFlags.Public | BindingFlags.Instance; var props = GetExcelPropertyInfo(type, flags, configuration) .Where(prop => prop?.Property.Info.GetSetMethod() is not null // why not .Property.CanWrite? because it will use private setter - && !prop.Property.Info.GetAttributeValue((ExcelIgnoreAttribute x) => x.ExcelIgnore) - && !prop.Property.Info.GetAttributeValue((ExcelColumnAttribute x) => x.Ignore)) + && !prop.Property.Info.GetAttributeValue((MiniExcelIgnoreAttribute x) => x.ExcelIgnore) + && !prop.Property.Info.GetAttributeValue((MiniExcelColumnAttribute x) => x.Ignore)) .ToList() /*ignore without set*/; if (props.Count == 0) @@ -169,38 +133,38 @@ internal static List GetSaveAsProperties(this Type type, MiniEx ?? name; } - private static IEnumerable ConvertToExcelCustomPropertyInfo(PropertyInfo[] props, MiniExcelConfiguration configuration) + private static IEnumerable ConvertToExcelCustomPropertyInfo(PropertyInfo[] props, MiniExcelBaseConfiguration configuration) { // solve : https://github.com/mini-software/MiniExcel/issues/138 var columnInfos = props.Select(p => { var gt = Nullable.GetUnderlyingType(p.PropertyType); - var excelColumnName = p.GetAttribute(); + var excelColumnName = p.GetAttribute(); var excludeNullableType = gt ?? p.PropertyType; - var excelFormat = p.GetAttribute()?.Format; - var excelColumn = p.GetAttribute(); - var dynamicColumn = configuration?.DynamicColumns?.SingleOrDefault(_ => _.Key == p.Name); + var excelFormat = p.GetAttribute()?.Format; + var excelColumn = p.GetAttribute(); + var dynamicColumn = configuration?.DynamicColumns?.SingleOrDefault(dc => dc.Key == p.Name); if (dynamicColumn is not null) excelColumn = dynamicColumn; - var ignore = p.GetAttributeValue((ExcelIgnoreAttribute x) => x.ExcelIgnore) || - p.GetAttributeValue((ExcelColumnAttribute x) => x.Ignore) || + var ignore = p.GetAttributeValue((MiniExcelIgnoreAttribute x) => x.ExcelIgnore) || + p.GetAttributeValue((MiniExcelColumnAttribute x) => x.Ignore) || (excelColumn?.Ignore ?? false); if (ignore) return null; //TODO:or configulation Dynamic int? excelColumnIndex = excelColumn?.Index > -1 ? excelColumn.Index : null; - return new ExcelColumnInfo + return new MiniExcelColumnInfo { - Property = new Property(p), + Property = new MiniExcelProperty(p), ExcludeNullableType = excludeNullableType, Nullable = gt is not null, ExcelColumnAliases = excelColumnName?.Aliases ?? excelColumn?.Aliases ?? [], ExcelColumnName = excelColumnName?.ExcelColumnName ?? p.GetAttribute()?.DisplayName ?? excelColumn?.Name ?? p.Name, - ExcelColumnIndex = p.GetAttribute()?.ExcelColumnIndex ?? excelColumnIndex, - ExcelIndexName = p.GetAttribute()?.ExcelXName ?? excelColumn?.IndexName, - ExcelColumnWidth = p.GetAttribute()?.ExcelColumnWidth ?? excelColumn?.Width, + ExcelColumnIndex = p.GetAttribute()?.ExcelColumnIndex ?? excelColumnIndex, + ExcelIndexName = p.GetAttribute()?.ExcelXName ?? excelColumn?.IndexName, + ExcelColumnWidth = p.GetAttribute()?.ExcelColumnWidth ?? excelColumn?.Width, ExcelFormat = excelFormat ?? excelColumn?.Format, ExcelFormatId = excelColumn?.FormatId ?? -1, ExcelColumnType = excelColumn?.Type ?? ColumnType.Value, @@ -211,47 +175,15 @@ internal static List GetSaveAsProperties(this Type type, MiniEx return columnInfos.Where(x => x is not null); } - private static IEnumerable GetExcelPropertyInfo(Type type, BindingFlags bindingFlags, MiniExcelConfiguration configuration) + private static IEnumerable GetExcelPropertyInfo(Type type, BindingFlags bindingFlags, MiniExcelBaseConfiguration configuration) { //TODO:assign column index return ConvertToExcelCustomPropertyInfo(type.GetProperties(bindingFlags), configuration); } - internal static ExcellSheetInfo GetExcellSheetInfo(Type type, MiniExcelConfiguration configuration) - { - // default options - var sheetInfo = new ExcellSheetInfo - { - Key = type.Name, - ExcelSheetName = null, // will be generated automatically as Sheet - ExcelSheetState = SheetState.Visible - }; - - // options from ExcelSheetAttribute - if (type.GetCustomAttribute(typeof(ExcelSheetAttribute)) is ExcelSheetAttribute excelSheetAttr) - { - sheetInfo.ExcelSheetName = excelSheetAttr.Name ?? type.Name; - sheetInfo.ExcelSheetState = excelSheetAttr.State; - } - - // options from DynamicSheets configuration - var openXmlCOnfiguration = configuration as OpenXmlConfiguration; - if (openXmlCOnfiguration?.DynamicSheets?.Length > 0) - { - var dynamicSheet = openXmlCOnfiguration.DynamicSheets.SingleOrDefault(x => x.Key == type.Name); - if (dynamicSheet is not null) - { - sheetInfo.ExcelSheetName = dynamicSheet.Name; - sheetInfo.ExcelSheetState = dynamicSheet.State; - } - } - - return sheetInfo; - } - - internal static List GetDictionaryColumnInfo(IDictionary? dicString, IDictionary? dic, MiniExcelConfiguration configuration) + private static List GetDictionaryColumnInfo(IDictionary? dicString, IDictionary? dic, MiniExcelBaseConfiguration configuration) { - var props = new List(); + var props = new List(); var keys = dicString?.Keys.ToList() ?? dic?.Keys @@ -265,9 +197,9 @@ internal static List GetDictionaryColumnInfo(IDictionary props, object key, MiniExcelConfiguration configuration) + private static void SetDictionaryColumnInfo(List props, object key, MiniExcelBaseConfiguration configuration) { - var p = new ExcelColumnInfo + var p = new MiniExcelColumnInfo { Key = key, ExcelColumnName = key?.ToString() @@ -310,7 +242,7 @@ internal static void SetDictionaryColumnInfo(List props, object props.Add(p); } - internal static bool TryGetTypeColumnInfo(Type? type, MiniExcelConfiguration configuration, out List? props) + internal static bool TryGetTypeColumnInfo(Type? type, MiniExcelBaseConfiguration configuration, out List? props) { // Unknown type if (type is null) @@ -331,7 +263,7 @@ internal static bool TryGetTypeColumnInfo(Type? type, MiniExcelConfiguration con props = GetSaveAsProperties(type, configuration); return true; } - internal static List GetColumnInfoFromValue(object value, MiniExcelConfiguration configuration) => value switch + internal static List GetColumnInfoFromValue(object value, MiniExcelBaseConfiguration configuration) => value switch { IDictionary genericDictionary => GetDictionaryColumnInfo(genericDictionary, null, configuration), IDictionary dictionary => GetDictionaryColumnInfo(null, dictionary, configuration), @@ -343,9 +275,9 @@ private static bool ValueIsNeededToDetermineProperties(Type type) => typeof(IDictionary).IsAssignableFrom(type) || typeof(IDictionary).IsAssignableFrom(type); - internal static ExcelColumnInfo GetColumnInfosFromDynamicConfiguration(string columnName, MiniExcelConfiguration configuration) + internal static MiniExcelColumnInfo GetColumnInfosFromDynamicConfiguration(string columnName, MiniExcelBaseConfiguration configuration) { - var prop = new ExcelColumnInfo + var prop = new MiniExcelColumnInfo { ExcelColumnName = columnName, Key = columnName diff --git a/src/MiniExcel/Reflection/MemberGetter.cs b/src/MiniExcelLib.Core/Reflection/MemberGetter.cs similarity index 92% rename from src/MiniExcel/Reflection/MemberGetter.cs rename to src/MiniExcelLib.Core/Reflection/MemberGetter.cs index 5c2929cb..2f399e48 100644 --- a/src/MiniExcel/Reflection/MemberGetter.cs +++ b/src/MiniExcelLib.Core/Reflection/MemberGetter.cs @@ -1,8 +1,7 @@ -using System; using System.Linq.Expressions; using System.Reflection; -namespace MiniExcelLibs; +namespace MiniExcelLib.Core.Reflection; public class MemberGetter(PropertyInfo property) { diff --git a/src/MiniExcel/Reflection/MemberSetter.cs b/src/MiniExcelLib.Core/Reflection/MemberSetter.cs similarity index 93% rename from src/MiniExcel/Reflection/MemberSetter.cs rename to src/MiniExcelLib.Core/Reflection/MemberSetter.cs index 4eeefe41..59b3c2d3 100644 --- a/src/MiniExcel/Reflection/MemberSetter.cs +++ b/src/MiniExcelLib.Core/Reflection/MemberSetter.cs @@ -1,8 +1,7 @@ -using System; using System.Linq.Expressions; using System.Reflection; -namespace MiniExcelLibs; +namespace MiniExcelLib.Core.Reflection; public class MemberSetter { diff --git a/src/MiniExcelLib.Core/Reflection/MiniExcelColumnInfo.cs b/src/MiniExcelLib.Core/Reflection/MiniExcelColumnInfo.cs new file mode 100644 index 00000000..076332a7 --- /dev/null +++ b/src/MiniExcelLib.Core/Reflection/MiniExcelColumnInfo.cs @@ -0,0 +1,21 @@ +using MiniExcelLib.Core.Attributes; + +namespace MiniExcelLib.Core.Reflection; + +public class MiniExcelColumnInfo +{ + public object Key { get; set; } + public int? ExcelColumnIndex { get; set; } + public string? ExcelColumnName { get; set; } + public string[]? ExcelColumnAliases { get; set; } = []; + public MiniExcelProperty Property { get; set; } + public Type ExcludeNullableType { get; set; } + public bool Nullable { get; internal set; } + public string? ExcelFormat { get; internal set; } + public double? ExcelColumnWidth { get; internal set; } + public string? ExcelIndexName { get; internal set; } + public bool ExcelIgnore { get; internal set; } + public int ExcelFormatId { get; internal set; } + public ColumnType ExcelColumnType { get; internal set; } + public Func? CustomFormatter { get; set; } +} \ No newline at end of file diff --git a/src/MiniExcelLib.Core/Reflection/MiniExcelMapper.cs b/src/MiniExcelLib.Core/Reflection/MiniExcelMapper.cs new file mode 100644 index 00000000..c687a45b --- /dev/null +++ b/src/MiniExcelLib.Core/Reflection/MiniExcelMapper.cs @@ -0,0 +1,254 @@ +using System.ComponentModel; +using System.Globalization; +using System.Reflection; +using System.Runtime.CompilerServices; +using MiniExcelLib.Core.Exceptions; +using MiniExcelLib.Core.Helpers; +using MiniExcelLib.Core.OpenXml.Utils; +using Zomp.SyncMethodGenerator; + +namespace MiniExcelLib.Core.Reflection; + +public static partial class MiniExcelMapper +{ + [CreateSyncVersion] + public static async IAsyncEnumerable MapQueryAsync(IAsyncEnumerable> values, string startCell, bool mapHeaderAsData, bool trimColumnNames, MiniExcelBaseConfiguration configuration, [EnumeratorCancellation] CancellationToken cancellationToken = default) where T : class, new() + { + cancellationToken.ThrowIfCancellationRequested(); + + var type = typeof(T); + + //TODO:need to optimize + List props = []; + Dictionary headersDic = []; + string[] keys = []; + var first = true; + var rowIndex = 0; + + await foreach (var item in values.WithCancellation(cancellationToken).ConfigureAwait(false)) + { + if (first) + { + keys = item.Keys.ToArray(); + headersDic = CustomPropertyHelper.GetHeaders(item, trimColumnNames); + + //TODO: alert don't duplicate column name + props = CustomPropertyHelper.GetExcelCustomPropertyInfos(type, keys, configuration); + first = false; + + // if we treat the header as data we move forwards with the mapping otherwise we jump to the next iteration + if (!mapHeaderAsData) + continue; + } + + var v = new T(); + foreach (var pInfo in props) + { + if (pInfo.ExcelColumnAliases is not null) + { + foreach (var alias in pInfo.ExcelColumnAliases) + { + if (headersDic?.TryGetValue(alias, out var columnId) ?? false) + { + var columnName = keys[columnId]; + item.TryGetValue(columnName, out var aliasItemValue); + + if (aliasItemValue is not null) + { + var newAliasValue = MapValue(v, pInfo, aliasItemValue, rowIndex, startCell, configuration); + } + } + } + } + + //Q: Why need to check every time? A: it needs to check everytime, because it's dictionary + object? itemValue = null; + if (pInfo.ExcelIndexName is not null && (keys?.Contains(pInfo.ExcelIndexName) ?? false)) + { + item.TryGetValue(pInfo.ExcelIndexName, out itemValue); + } + else if (pInfo.ExcelColumnName is not null && (headersDic?.TryGetValue(pInfo.ExcelColumnName, out var columnId) ?? false)) + { + var columnName = keys[columnId]; + item.TryGetValue(columnName, out itemValue); + } + + if (itemValue is not null) + { + var newValue = MapValue(v, pInfo, itemValue, rowIndex, startCell, configuration); + } + } + + rowIndex++; + yield return v; + } + } + + internal static object? MapValue(T v, MiniExcelColumnInfo pInfo, object itemValue, int rowIndex, string startCell, MiniExcelBaseConfiguration config) where T : class, new() + { + try + { + object? newValue = null; + if (pInfo.Nullable && string.IsNullOrWhiteSpace(itemValue?.ToString())) + { + } + else if (pInfo.ExcludeNullableType == typeof(Guid)) + { + newValue = Guid.Parse(itemValue?.ToString() ?? Guid.Empty.ToString()); + } + else if (pInfo.ExcludeNullableType == typeof(DateTimeOffset)) + { + var vs = itemValue?.ToString(); + if (pInfo.ExcelFormat is not null) + { + if (DateTimeOffset.TryParseExact(vs, pInfo.ExcelFormat, CultureInfo.InvariantCulture, DateTimeStyles.None, out var value)) + { + newValue = value; + } + } + else if (DateTimeOffset.TryParse(vs, config.Culture, DateTimeStyles.None, out var value)) + { + newValue = value; + } + else + { + throw new InvalidCastException($"{vs} cannot be cast to DateTime"); + } + } + else if (pInfo.ExcludeNullableType == typeof(DateTime)) + { + // fix issue 257 https://github.com/mini-software/MiniExcel/issues/257 + if (itemValue is DateTime) + { + newValue = itemValue; + pInfo.Property.SetValue(v, newValue); + return newValue; + } + + var vs = itemValue?.ToString(); + if (pInfo.ExcelFormat is not null) + { + if (pInfo.Property.Info.PropertyType == typeof(DateTimeOffset) && DateTimeOffset.TryParseExact(vs, pInfo.ExcelFormat, CultureInfo.InvariantCulture, DateTimeStyles.None, out var offsetValue)) + { + newValue = offsetValue; + } + else if (DateTime.TryParseExact(vs, pInfo.ExcelFormat, CultureInfo.InvariantCulture, DateTimeStyles.None, out var value)) + { + newValue = value; + } + } + else if (DateTime.TryParse(vs, config.Culture, DateTimeStyles.None, out var dtValue)) + newValue = dtValue; + else if (DateTime.TryParseExact(vs, "dd/MM/yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out var dtExactValue)) + newValue = dtExactValue; + else if (double.TryParse(vs, NumberStyles.None, CultureInfo.InvariantCulture, out var doubleValue)) + newValue = DateTime.FromOADate(doubleValue); + else + throw new InvalidCastException($"{vs} cannot be cast to DateTime"); + } + #if NET6_0_OR_GREATER + else if (pInfo.ExcludeNullableType == typeof(DateOnly)) + { + if (itemValue is DateOnly) + { + newValue = itemValue; + pInfo.Property.SetValue(v, newValue); + return newValue; + } + + var vs = itemValue?.ToString(); + if (pInfo.ExcelFormat is not null) + { + if (DateOnly.TryParseExact(vs, pInfo.ExcelFormat, CultureInfo.InvariantCulture, DateTimeStyles.None, out var dateOnlyCustom)) + { + newValue = dateOnlyCustom; + } + } + else if (DateOnly.TryParse(vs, config.Culture, DateTimeStyles.None, out var dateOnly)) + newValue = dateOnly; + else if (DateOnly.TryParseExact(vs, "dd/MM/yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out var dateOnlyExact)) + newValue = dateOnlyExact; + else if (double.TryParse(vs, NumberStyles.None, CultureInfo.InvariantCulture, out var dateOnlyDouble)) + newValue = DateOnly.FromDateTime(DateTime.FromOADate(dateOnlyDouble)); + else + throw new InvalidCastException($"{vs} cannot be cast to DateOnly"); + } + #endif + else if (pInfo.ExcludeNullableType == typeof(TimeSpan)) + { + if (itemValue is TimeSpan) + { + newValue = itemValue; + pInfo.Property.SetValue(v, newValue); + return newValue; + } + + var vs = itemValue?.ToString(); + if (pInfo.ExcelFormat is not null) + { + if (TimeSpan.TryParseExact(vs, pInfo.ExcelFormat, CultureInfo.InvariantCulture, out var value)) + { + newValue = value; + } + } + else if (TimeSpan.TryParse(vs, config.Culture, out var tsValue)) + newValue = tsValue; + else if (TimeSpan.TryParseExact(vs, @"hh\:mm\:ss\.fff", CultureInfo.InvariantCulture, out var tsExactValue)) + newValue = tsExactValue; + else if (double.TryParse(vs, NumberStyles.None, CultureInfo.InvariantCulture, out var msValue)) + newValue = TimeSpan.FromMilliseconds(msValue); + else + throw new InvalidCastException($"{vs} cannot be cast to TimeSpan"); + } + else if (pInfo.ExcludeNullableType == typeof(double)) // && (!Regex.IsMatch(itemValue.ToString(), @"^-?\d+(\.\d+)?([eE][-+]?\d+)?$") || itemValue.ToString().Trim().Equals("NaN"))) + { + var invariantString = Convert.ToString(itemValue, CultureInfo.InvariantCulture); + newValue = double.TryParse(invariantString, NumberStyles.Any, CultureInfo.InvariantCulture, out var value) ? value : double.NaN; + } + else if (pInfo.ExcludeNullableType == typeof(bool)) + { + var vs = itemValue?.ToString(); + newValue = vs switch + { + "1" => true, + "0" => false, + _ => bool.TryParse(vs, out var parsed) ? parsed : null + }; + } + else if (pInfo.Property.Info.PropertyType == typeof(string)) + { + newValue = XmlHelper.DecodeString(itemValue?.ToString()); + } + else if (pInfo.ExcludeNullableType.IsEnum) + { + var fieldInfo = pInfo.ExcludeNullableType.GetFields().FirstOrDefault(e => e.GetCustomAttribute(false)?.Description == itemValue?.ToString()); + var value = fieldInfo?.Name ?? itemValue?.ToString() ?? ""; + newValue = Enum.Parse(pInfo.ExcludeNullableType, value, true); + } + else if (pInfo.ExcludeNullableType == typeof(Uri)) + { + var rawValue = itemValue?.ToString(); + if (!Uri.TryCreate(rawValue, UriKind.RelativeOrAbsolute, out var uri)) + throw new InvalidCastException($"Value \"{rawValue}\" cannot be converted to Uri"); + newValue = uri; + } + else + { + // Use pInfo.ExcludeNullableType to resolve : https://github.com/mini-software/MiniExcel/issues/138 + newValue = Convert.ChangeType(itemValue, pInfo.ExcludeNullableType, config.Culture); + } + + pInfo.Property.SetValue(v, newValue); + return newValue; + } + catch (Exception ex) when (ex is InvalidCastException or FormatException) + { + var columnName = pInfo.ExcelColumnName ?? pInfo.Property.Name; + var startRowIndex = ReferenceHelper.ConvertCellToCoordinates(startCell).Item2; + var errorRow = startRowIndex + rowIndex + 1; + + var msg = $"ColumnName: {columnName}, CellRow: {errorRow}, Value: {itemValue}. The value cannot be cast to type {pInfo.Property.Info.PropertyType.Name}."; + throw new MiniExcelInvalidCastException(columnName, errorRow, itemValue, pInfo.Property.Info.PropertyType, msg); + } + } +} \ No newline at end of file diff --git a/src/MiniExcel/Reflection/Property.cs b/src/MiniExcelLib.Core/Reflection/MiniExcelProperty.cs similarity index 85% rename from src/MiniExcel/Reflection/Property.cs rename to src/MiniExcelLib.Core/Reflection/MiniExcelProperty.cs index 5b11d5a7..c1627c82 100644 --- a/src/MiniExcel/Reflection/Property.cs +++ b/src/MiniExcelLib.Core/Reflection/MiniExcelProperty.cs @@ -1,16 +1,15 @@ -using System; using System.Reflection; -namespace MiniExcelLibs; +namespace MiniExcelLib.Core.Reflection; public abstract class Member; -public class Property : Member +public class MiniExcelProperty : Member { private readonly MemberGetter? _getter; private readonly MemberSetter? _setter; - public Property(PropertyInfo property) + public MiniExcelProperty(PropertyInfo property) { Name = property.Name; Info = property; diff --git a/src/MiniExcel/WriteAdapter/AsyncEnumerableWriteAdapter.cs b/src/MiniExcelLib.Core/WriteAdapters/AsyncEnumerableWriteAdapter.cs similarity index 77% rename from src/MiniExcel/WriteAdapter/AsyncEnumerableWriteAdapter.cs rename to src/MiniExcelLib.Core/WriteAdapters/AsyncEnumerableWriteAdapter.cs index c711defb..06baca6c 100644 --- a/src/MiniExcel/WriteAdapter/AsyncEnumerableWriteAdapter.cs +++ b/src/MiniExcelLib.Core/WriteAdapters/AsyncEnumerableWriteAdapter.cs @@ -1,20 +1,18 @@ -using MiniExcelLibs.Utils; -using System.Collections; -using System.Collections.Generic; +using System.Collections; using System.Runtime.CompilerServices; -using System.Threading; -using System.Threading.Tasks; +using MiniExcelLib.Core.Abstractions; +using MiniExcelLib.Core.Reflection; -namespace MiniExcelLibs.WriteAdapter; +namespace MiniExcelLib.Core.WriteAdapters; -internal class AsyncEnumerableWriteAdapter(IAsyncEnumerable values, MiniExcelConfiguration configuration) : IAsyncMiniExcelWriteAdapter +internal class AsyncEnumerableWriteAdapter(IAsyncEnumerable values, MiniExcelBaseConfiguration configuration) : IMiniExcelWriteAdapterAsync { private readonly IAsyncEnumerable _values = values; - private readonly MiniExcelConfiguration _configuration = configuration; + private readonly MiniExcelBaseConfiguration _configuration = configuration; private IAsyncEnumerator? _enumerator; private bool _empty; - public async Task?> GetColumnsAsync() + public async Task?> GetColumnsAsync() { if (CustomPropertyHelper.TryGetTypeColumnInfo(typeof(T), _configuration, out var props)) { @@ -30,7 +28,7 @@ internal class AsyncEnumerableWriteAdapter(IAsyncEnumerable values, MiniEx return CustomPropertyHelper.GetColumnInfoFromValue(_enumerator.Current, _configuration); } - public async IAsyncEnumerable> GetRowsAsync(List props, [EnumeratorCancellation] CancellationToken cancellationToken) + public async IAsyncEnumerable> GetRowsAsync(List props, [EnumeratorCancellation] CancellationToken cancellationToken) { if (_empty) { @@ -55,7 +53,7 @@ public async IAsyncEnumerable> GetRowsAsync(List } #pragma warning disable CS1998 // Async method lacks 'await' operators and will run synchronously - public static async IAsyncEnumerable GetRowValuesAsync(T currentValue, List props) + public static async IAsyncEnumerable GetRowValuesAsync(T currentValue, List props) #pragma warning restore CS1998 // Async method lacks 'await' operators and will run synchronously { var column = 1; diff --git a/src/MiniExcel/WriteAdapter/DataReaderWriteAdapter.cs b/src/MiniExcelLib.Core/WriteAdapters/DataReaderWriteAdapter.cs similarity index 70% rename from src/MiniExcel/WriteAdapter/DataReaderWriteAdapter.cs rename to src/MiniExcelLib.Core/WriteAdapters/DataReaderWriteAdapter.cs index 3aa801c8..b43df4c3 100644 --- a/src/MiniExcel/WriteAdapter/DataReaderWriteAdapter.cs +++ b/src/MiniExcelLib.Core/WriteAdapters/DataReaderWriteAdapter.cs @@ -1,16 +1,13 @@ -using System; -using System.Collections.Generic; -using System.Data; -using System.Linq; -using System.Threading; -using MiniExcelLibs.Utils; +using System.Data; +using MiniExcelLib.Core.Abstractions; +using MiniExcelLib.Core.Reflection; -namespace MiniExcelLibs.WriteAdapter; +namespace MiniExcelLib.Core.WriteAdapters; -internal class DataReaderWriteAdapter(IDataReader reader, MiniExcelConfiguration configuration) : IMiniExcelWriteAdapter +internal class DataReaderWriteAdapter(IDataReader reader, MiniExcelBaseConfiguration configuration) : IMiniExcelWriteAdapter { private readonly IDataReader _reader = reader; - private readonly MiniExcelConfiguration _configuration = configuration; + private readonly MiniExcelBaseConfiguration _configuration = configuration; public bool TryGetKnownCount(out int count) { @@ -18,9 +15,9 @@ public bool TryGetKnownCount(out int count) return false; } - public List GetColumns() + public List GetColumns() { - var props = new List(); + var props = new List(); for (var i = 0; i < _reader.FieldCount; i++) { var columnName = _reader.GetName(i); @@ -34,7 +31,7 @@ public List GetColumns() return props; } - public IEnumerable> GetRows(List props, CancellationToken cancellationToken = default) + public IEnumerable> GetRows(List props, CancellationToken cancellationToken = default) { while (_reader.Read()) { @@ -43,7 +40,7 @@ public IEnumerable> GetRows(List pro } } - private IEnumerable GetRowValues(List props) + private IEnumerable GetRowValues(List props) { var column = 1; for (int i = 0; i < _reader.FieldCount; i++) diff --git a/src/MiniExcel/WriteAdapter/DataTableWriteAdapter.cs b/src/MiniExcelLib.Core/WriteAdapters/DataTableWriteAdapter.cs similarity index 68% rename from src/MiniExcel/WriteAdapter/DataTableWriteAdapter.cs rename to src/MiniExcelLib.Core/WriteAdapters/DataTableWriteAdapter.cs index 7008a010..65d7964c 100644 --- a/src/MiniExcel/WriteAdapter/DataTableWriteAdapter.cs +++ b/src/MiniExcelLib.Core/WriteAdapters/DataTableWriteAdapter.cs @@ -1,14 +1,13 @@ -using System.Collections.Generic; -using System.Data; -using System.Threading; -using MiniExcelLibs.Utils; +using System.Data; +using MiniExcelLib.Core.Abstractions; +using MiniExcelLib.Core.Reflection; -namespace MiniExcelLibs.WriteAdapter; +namespace MiniExcelLib.Core.WriteAdapters; -internal class DataTableWriteAdapter(DataTable dataTable, MiniExcelConfiguration configuration) : IMiniExcelWriteAdapter +internal class DataTableWriteAdapter(DataTable dataTable, MiniExcelBaseConfiguration configuration) : IMiniExcelWriteAdapter { private readonly DataTable _dataTable = dataTable; - private readonly MiniExcelConfiguration _configuration = configuration; + private readonly MiniExcelBaseConfiguration _configuration = configuration; public bool TryGetKnownCount(out int count) { @@ -16,9 +15,9 @@ public bool TryGetKnownCount(out int count) return true; } - public List GetColumns() + public List GetColumns() { - var props = new List(); + var props = new List(); for (var i = 0; i < _dataTable.Columns.Count; i++) { var columnName = _dataTable.Columns[i].Caption ?? _dataTable.Columns[i].ColumnName; @@ -28,7 +27,7 @@ public List GetColumns() return props; } - public IEnumerable> GetRows(List props, CancellationToken cancellationToken = default) + public IEnumerable> GetRows(List props, CancellationToken cancellationToken = default) { for (int row = 0; row < _dataTable.Rows.Count; row++) { @@ -37,7 +36,7 @@ public IEnumerable> GetRows(List pro } } - private IEnumerable GetRowValues(int row, List props) + private IEnumerable GetRowValues(int row, List props) { for (int i = 0, column = 1; i < _dataTable.Columns.Count; i++, column++) { diff --git a/src/MiniExcel/WriteAdapter/EnumerableWriteAdapter.cs b/src/MiniExcelLib.Core/WriteAdapters/EnumerableWriteAdapter.cs similarity index 72% rename from src/MiniExcel/WriteAdapter/EnumerableWriteAdapter.cs rename to src/MiniExcelLib.Core/WriteAdapters/EnumerableWriteAdapter.cs index 4ad98a78..8fa60a7e 100644 --- a/src/MiniExcel/WriteAdapter/EnumerableWriteAdapter.cs +++ b/src/MiniExcelLib.Core/WriteAdapters/EnumerableWriteAdapter.cs @@ -1,28 +1,19 @@ -using System; -using System.Collections; -using System.Collections.Generic; -using System.Linq; -using System.Threading; -using MiniExcelLibs.Utils; +using System.Collections; +using MiniExcelLib.Core.Abstractions; +using MiniExcelLib.Core.Helpers; +using MiniExcelLib.Core.Reflection; -namespace MiniExcelLibs.WriteAdapter; +namespace MiniExcelLib.Core.WriteAdapters; -internal class EnumerableWriteAdapter : IMiniExcelWriteAdapter +internal class EnumerableWriteAdapter(IEnumerable values, MiniExcelBaseConfiguration configuration) : IMiniExcelWriteAdapter { - private readonly MiniExcelConfiguration _configuration; - private readonly IEnumerable _values; - private readonly Type _genericType; + private readonly IEnumerable _values = values; + private readonly MiniExcelBaseConfiguration _configuration = configuration; + private readonly Type? _genericType = TypeHelper.GetGenericIEnumerables(values).FirstOrDefault(); private IEnumerator? _enumerator; private bool _empty; - public EnumerableWriteAdapter(IEnumerable values, MiniExcelConfiguration configuration) - { - _values = values; - _configuration = configuration; - _genericType = TypeHelper.GetGenericIEnumerables(values).FirstOrDefault(); - } - public bool TryGetKnownCount(out int count) { count = 0; @@ -35,7 +26,7 @@ public bool TryGetKnownCount(out int count) return false; } - public List? GetColumns() + public List? GetColumns() { if (CustomPropertyHelper.TryGetTypeColumnInfo(_genericType, _configuration, out var props)) return props; @@ -56,7 +47,7 @@ public bool TryGetKnownCount(out int count) } } - public IEnumerable> GetRows(List props, CancellationToken cancellationToken = default) + public IEnumerable> GetRows(List props, CancellationToken cancellationToken = default) { if (_empty) yield break; @@ -84,7 +75,7 @@ public IEnumerable> GetRows(List pro } } - public static IEnumerable GetRowValues(object currentValue, List props) + public static IEnumerable GetRowValues(object currentValue, List props) { var column = 1; foreach (var prop in props) diff --git a/src/MiniExcel/WriteAdapter/MiniExcelDataReaderWriteAdapter.cs b/src/MiniExcelLib.Core/WriteAdapters/MiniExcelDataReaderWriteAdapter.cs similarity index 72% rename from src/MiniExcel/WriteAdapter/MiniExcelDataReaderWriteAdapter.cs rename to src/MiniExcelLib.Core/WriteAdapters/MiniExcelDataReaderWriteAdapter.cs index d19dbca2..6d99071b 100644 --- a/src/MiniExcel/WriteAdapter/MiniExcelDataReaderWriteAdapter.cs +++ b/src/MiniExcelLib.Core/WriteAdapters/MiniExcelDataReaderWriteAdapter.cs @@ -1,21 +1,17 @@ -using MiniExcelLibs.Utils; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Runtime.CompilerServices; -using System.Threading; -using System.Threading.Tasks; +using System.Runtime.CompilerServices; +using MiniExcelLib.Core.Abstractions; +using MiniExcelLib.Core.Reflection; -namespace MiniExcelLibs.WriteAdapter; +namespace MiniExcelLib.Core.WriteAdapters; -internal class MiniExcelDataReaderWriteAdapter(IMiniExcelDataReader reader, MiniExcelConfiguration configuration) : IAsyncMiniExcelWriteAdapter +internal class MiniExcelDataReaderWriteAdapter(IMiniExcelDataReader reader, MiniExcelBaseConfiguration configuration) : IMiniExcelWriteAdapterAsync { private readonly IMiniExcelDataReader _reader = reader; - private readonly MiniExcelConfiguration _configuration = configuration; + private readonly MiniExcelBaseConfiguration _configuration = configuration; - public async Task?> GetColumnsAsync() + public async Task?> GetColumnsAsync() { - List props = []; + List props = []; for (var i = 0; i < _reader.FieldCount; i++) { var columnName = await _reader.GetNameAsync(i).ConfigureAwait(false); @@ -36,7 +32,7 @@ internal class MiniExcelDataReaderWriteAdapter(IMiniExcelDataReader reader, Mini return props; } - public async IAsyncEnumerable> GetRowsAsync(List props, [EnumeratorCancellation] CancellationToken cancellationToken) + public async IAsyncEnumerable> GetRowsAsync(List props, [EnumeratorCancellation] CancellationToken cancellationToken) { while (await _reader.ReadAsync(cancellationToken).ConfigureAwait(false)) { @@ -45,7 +41,7 @@ public async IAsyncEnumerable> GetRowsAsync(List } } - private async IAsyncEnumerable GetRowValuesAsync(List props) + private async IAsyncEnumerable GetRowValuesAsync(List props) { for (int i = 0, column = 1; i < _reader.FieldCount; i++, column++) { diff --git a/src/MiniExcel/WriteAdapter/MiniExcelWriteAdapterFactory.cs b/src/MiniExcelLib.Core/WriteAdapters/MiniExcelWriteAdapterFactory.cs similarity index 71% rename from src/MiniExcel/WriteAdapter/MiniExcelWriteAdapterFactory.cs rename to src/MiniExcelLib.Core/WriteAdapters/MiniExcelWriteAdapterFactory.cs index c3f8b9ef..58bb9704 100644 --- a/src/MiniExcel/WriteAdapter/MiniExcelWriteAdapterFactory.cs +++ b/src/MiniExcelLib.Core/WriteAdapters/MiniExcelWriteAdapterFactory.cs @@ -1,19 +1,19 @@ -using System; -using System.Collections; +using System.Collections; using System.Data; -using MiniExcelLibs.Utils; +using MiniExcelLib.Core.Abstractions; +using MiniExcelLib.Core.Helpers; -namespace MiniExcelLibs.WriteAdapter; +namespace MiniExcelLib.Core.WriteAdapters; -internal static class MiniExcelWriteAdapterFactory +public static class MiniExcelWriteAdapterFactory { - public static bool TryGetAsyncWriteAdapter(object values, MiniExcelConfiguration configuration, out IAsyncMiniExcelWriteAdapter? writeAdapter) + public static bool TryGetAsyncWriteAdapter(object values, MiniExcelBaseConfiguration configuration, out IMiniExcelWriteAdapterAsync? writeAdapter) { writeAdapter = null; if (values.GetType().IsAsyncEnumerable(out var genericArgument)) { var writeAdapterType = typeof(AsyncEnumerableWriteAdapter<>).MakeGenericType(genericArgument); - writeAdapter = (IAsyncMiniExcelWriteAdapter)Activator.CreateInstance(writeAdapterType, values, configuration); + writeAdapter = (IMiniExcelWriteAdapterAsync)Activator.CreateInstance(writeAdapterType, values, configuration); return true; } @@ -26,7 +26,7 @@ public static bool TryGetAsyncWriteAdapter(object values, MiniExcelConfiguration return false; } - public static IMiniExcelWriteAdapter GetWriteAdapter(object values, MiniExcelConfiguration configuration) + public static IMiniExcelWriteAdapter GetWriteAdapter(object values, MiniExcelBaseConfiguration configuration) { return values switch { diff --git a/src/MiniExcel/icon.png b/src/MiniExcelLib.Core/icon.png similarity index 100% rename from src/MiniExcel/icon.png rename to src/MiniExcelLib.Core/icon.png diff --git a/src/MiniExcel/miniexcel.publickey b/src/MiniExcelLib.Core/miniexcel.publickey similarity index 100% rename from src/MiniExcel/miniexcel.publickey rename to src/MiniExcelLib.Core/miniexcel.publickey diff --git a/src/MiniExcel/Csv/CsvConfiguration.cs b/src/MiniExcelLib.Csv/CsvConfiguration.cs similarity index 70% rename from src/MiniExcel/Csv/CsvConfiguration.cs rename to src/MiniExcelLib.Csv/CsvConfiguration.cs index 729e0059..9f82b4f4 100644 --- a/src/MiniExcel/Csv/CsvConfiguration.cs +++ b/src/MiniExcelLib.Csv/CsvConfiguration.cs @@ -1,10 +1,9 @@ -using System; -using System.IO; using System.Text; +using MiniExcelLib.Core; -namespace MiniExcelLibs.Csv; +namespace MiniExcelLib.Csv; -public class CsvConfiguration : MiniExcelConfiguration +public class CsvConfiguration : MiniExcelBaseConfiguration { private static readonly Encoding DefaultEncoding = new UTF8Encoding(true); @@ -15,8 +14,8 @@ public class CsvConfiguration : MiniExcelConfiguration public bool AlwaysQuote { get; set; } = false; public bool QuoteWhitespaces { get; set; } = true; public Func? SplitFn { get; set; } - public Func StreamReaderFunc { get; set; } = (stream) => new StreamReader(stream, DefaultEncoding); - public Func StreamWriterFunc { get; set; } = (stream) => new StreamWriter(stream, DefaultEncoding); + public Func StreamReaderFunc { get; set; } = stream => new StreamReader(stream, DefaultEncoding); + public Func StreamWriterFunc { get; set; } = stream => new StreamWriter(stream, DefaultEncoding); - internal static readonly CsvConfiguration DefaultConfiguration = new CsvConfiguration(); + internal static readonly CsvConfiguration DefaultConfiguration = new(); } \ No newline at end of file diff --git a/src/MiniExcel/Csv/CsvHelpers.cs b/src/MiniExcelLib.Csv/CsvHelper.cs similarity index 72% rename from src/MiniExcel/Csv/CsvHelpers.cs rename to src/MiniExcelLib.Csv/CsvHelper.cs index 54ca3b46..8ccc9a3a 100644 --- a/src/MiniExcel/Csv/CsvHelpers.cs +++ b/src/MiniExcelLib.Csv/CsvHelper.cs @@ -1,6 +1,6 @@ -namespace MiniExcelLibs.Csv; +namespace MiniExcelLib.Csv; -internal static class CsvHelpers +internal static class CsvHelper { /// If content contains special characters then use "{value}" format public static string ConvertToCsvValue(string? value, CsvConfiguration configuration) @@ -8,17 +8,17 @@ public static string ConvertToCsvValue(string? value, CsvConfiguration configura if (value is null) return string.Empty; - if (value.Contains("\"")) + if (value.Contains('"')) { value = value.Replace("\"", "\"\""); return $"\"{value}\""; } var shouldQuote = configuration.AlwaysQuote || - (configuration.QuoteWhitespaces && value.Contains(" ")) || + (configuration.QuoteWhitespaces && value.Contains(' ')) || value.Contains(configuration.Seperator.ToString()) || - value.Contains("\r") || - value.Contains("\n"); + value.Contains('\r') || + value.Contains('\n'); return shouldQuote ? $"\"{value}\"" : value; } diff --git a/src/MiniExcel/Csv/CsvReader.cs b/src/MiniExcelLib.Csv/CsvReader.cs similarity index 66% rename from src/MiniExcel/Csv/CsvReader.cs rename to src/MiniExcelLib.Csv/CsvReader.cs index 93496c05..6e949080 100644 --- a/src/MiniExcel/Csv/CsvReader.cs +++ b/src/MiniExcelLib.Csv/CsvReader.cs @@ -1,21 +1,24 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; using System.Runtime.CompilerServices; using System.Text.RegularExpressions; -using System.Threading; -using MiniExcelLibs.Exceptions; -using MiniExcelLibs.OpenXml; -using MiniExcelLibs.Utils; +using MiniExcelLib.Core; +using MiniExcelLib.Core.Abstractions; +using MiniExcelLib.Core.Exceptions; +using MiniExcelLib.Core.Helpers; +using MiniExcelLib.Core.Reflection; using Zomp.SyncMethodGenerator; -namespace MiniExcelLibs.Csv; +namespace MiniExcelLib.Csv; -internal partial class CsvReader(Stream stream, IMiniExcelConfiguration? configuration) : IExcelReader +internal partial class CsvReader : IMiniExcelReader { - private readonly Stream _stream = stream; - private readonly CsvConfiguration _config = configuration is null ? CsvConfiguration.DefaultConfiguration : (CsvConfiguration)configuration; + private readonly Stream _stream; + private readonly CsvConfiguration _config; + + internal CsvReader(Stream stream, IMiniExcelConfiguration? configuration) + { + _stream = stream; + _config = configuration as CsvConfiguration ?? CsvConfiguration.DefaultConfiguration; + } [CreateSyncVersion] public async IAsyncEnumerable> QueryAsync(bool useHeaderRow, string? sheetName, string startCell, [EnumeratorCancellation] CancellationToken cancellationToken = default) @@ -32,14 +35,16 @@ internal partial class CsvReader(Stream stream, IMiniExcelConfiguration? configu var firstRow = true; var headRows = new Dictionary(); - string row; - for (var rowIndex = 1; (row = await reader.ReadLineAsync( + var rowIndex = 0; + while (await reader.ReadLineAsync( #if NET7_0_OR_GREATER cancellationToken #endif - ).ConfigureAwait(false)) is not null; rowIndex++) + ).ConfigureAwait(false) is { } row) { + rowIndex++; string finalRow = row; + if (_config.ReadLineBreaksWithinQuotes) { while (finalRow.Count(c => c == '"') % 2 != 0) @@ -49,6 +54,7 @@ internal partial class CsvReader(Stream stream, IMiniExcelConfiguration? configu cancellationToken #endif ).ConfigureAwait(false); + if (nextPart is null) { break; @@ -67,7 +73,7 @@ internal partial class CsvReader(Stream stream, IMiniExcelConfiguration? configu .Select((x, i) => new KeyValuePair(headRows[i], x)) .ToDictionary(x => x.Key, x => x.Value); - throw new ExcelColumnNotFoundException(columnIndex: null, headRows[colIndex], [], rowIndex, headers, rowValues, $"Csv read error: Column {colIndex} not found in Row {rowIndex}"); + throw new MiniExcelColumnNotFoundException(columnIndex: null, headRows[colIndex], [], rowIndex, headers, rowValues, $"Csv read error: Column {colIndex} not found in Row {rowIndex}"); } //header @@ -97,6 +103,7 @@ internal partial class CsvReader(Stream stream, IMiniExcelConfiguration? configu headRows.Add(i, $"c{i + 1}"); } + // todo: can we find a way to remove the redundant cell conversions for CSV? var cell = CustomPropertyHelper.GetEmptyExpandoObject(read.Length - 1, 0); if (_config.ReadEmptyStringAsNull) { @@ -114,10 +121,10 @@ internal partial class CsvReader(Stream stream, IMiniExcelConfiguration? configu } [CreateSyncVersion] - public IAsyncEnumerable QueryAsync(string? sheetName, string startCell, bool hasHeader, CancellationToken cancellationToken = default) where T : class, new() + public IAsyncEnumerable QueryAsync(string? sheetName, string startCell, bool mapHeaderAsData, CancellationToken cancellationToken = default) where T : class, new() { - var dynamicRecords = QueryAsync(false, sheetName, startCell, cancellationToken); - return ExcelOpenXmlSheetReader.QueryImplAsync(dynamicRecords, startCell, hasHeader, _config, cancellationToken); + var records = QueryAsync(false, sheetName, startCell, cancellationToken); + return MiniExcelMapper.MapQueryAsync(records, startCell, mapHeaderAsData, false, _config, cancellationToken); } [CreateSyncVersion] @@ -127,10 +134,10 @@ internal partial class CsvReader(Stream stream, IMiniExcelConfiguration? configu } [CreateSyncVersion] - public IAsyncEnumerable QueryRangeAsync(string? sheetName, string startCell, string endCell, bool hasHeader, CancellationToken cancellationToken = default) where T : class, new() + public IAsyncEnumerable QueryRangeAsync(string? sheetName, string startCell, string endCell, bool treatHeaderAsData, CancellationToken cancellationToken = default) where T : class, new() { var dynamicRecords = QueryRangeAsync(false, sheetName, startCell, endCell, cancellationToken); - return ExcelOpenXmlSheetReader.QueryImplAsync(dynamicRecords, startCell, hasHeader, this._config, cancellationToken); + return MiniExcelMapper.MapQueryAsync(dynamicRecords, startCell, treatHeaderAsData, false, _config, cancellationToken); } [CreateSyncVersion] @@ -140,12 +147,26 @@ internal partial class CsvReader(Stream stream, IMiniExcelConfiguration? configu } [CreateSyncVersion] - public IAsyncEnumerable QueryRangeAsync(string? sheetName, int startRowIndex, int startColumnIndex, int? endRowIndex, int? endColumnIndex, bool hasHeader, CancellationToken cancellationToken = default) where T : class, new() + public IAsyncEnumerable QueryRangeAsync(string? sheetName, int startRowIndex, int startColumnIndex, int? endRowIndex, int? endColumnIndex, bool treatHeaderAsData, CancellationToken cancellationToken = default) where T : class, new() { var dynamicRecords = QueryRangeAsync(false, sheetName, startRowIndex, startColumnIndex, endRowIndex, endColumnIndex, cancellationToken); - return ExcelOpenXmlSheetReader.QueryImplAsync(dynamicRecords, ReferenceHelper.ConvertXyToCell(startRowIndex, startColumnIndex), hasHeader, this._config, cancellationToken); + return MiniExcelMapper.MapQueryAsync(dynamicRecords, ConvertXyToCell(startRowIndex, startColumnIndex), treatHeaderAsData, false, _config, cancellationToken); } + private static string ConvertXyToCell(int x, int y) + { + int dividend = x; + string columnName = string.Empty; + + while (dividend > 0) + { + var modulo = (dividend - 1) % 26; + columnName = Convert.ToChar(65 + modulo) + columnName; + dividend = (dividend - modulo) / 26; + } + return $"{columnName}{y}"; + } + private string[] Split(string row) { if (_config.SplitFn is not null) @@ -159,5 +180,6 @@ private string[] Split(string row) public void Dispose() { + _stream?.Dispose(); } } \ No newline at end of file diff --git a/src/MiniExcel/Csv/CsvWriter.cs b/src/MiniExcelLib.Csv/CsvWriter.cs similarity index 76% rename from src/MiniExcel/Csv/CsvWriter.cs rename to src/MiniExcelLib.Csv/CsvWriter.cs index 8e5e308e..6a6bb968 100644 --- a/src/MiniExcel/Csv/CsvWriter.cs +++ b/src/MiniExcelLib.Csv/CsvWriter.cs @@ -1,53 +1,47 @@ -using MiniExcelLibs.Utils; -using MiniExcelLibs.WriteAdapter; -using System; -using System.Collections.Generic; -using System.Globalization; -using System.IO; -using System.Linq; +using System.Globalization; using System.Text; -using System.Threading; -using System.Threading.Tasks; +using MiniExcelLib.Core; +using MiniExcelLib.Core.Abstractions; +using MiniExcelLib.Core.Reflection; +using MiniExcelLib.Core.WriteAdapters; +using Zomp.SyncMethodGenerator; -namespace MiniExcelLibs.Csv; +namespace MiniExcelLib.Csv; -internal partial class CsvWriter : IExcelWriter, IDisposable +internal partial class CsvWriter : IMiniExcelWriter, IDisposable { private readonly StreamWriter _writer; private readonly CsvConfiguration _configuration; - private readonly bool _printHeader; private readonly object? _value; + private readonly bool _printHeader; - private bool _disposedValue; + private bool _disposed; - public CsvWriter(Stream stream, object? value, IMiniExcelConfiguration? configuration, bool printHeader) + // todo: should we add an explicit parameter to leave the stream open instead of the convoluted way to do it through a Func? + internal CsvWriter(Stream stream, object? value, bool printHeader, IMiniExcelConfiguration? configuration) { - _configuration = configuration is null ? CsvConfiguration.DefaultConfiguration : (CsvConfiguration)configuration; + _configuration = configuration as CsvConfiguration ?? CsvConfiguration.DefaultConfiguration; _writer = _configuration.StreamWriterFunc(stream); _printHeader = printHeader; _value = value; } - + private void AppendColumn(StringBuilder rowBuilder, CellWriteInfo column) { - rowBuilder.Append(CsvHelpers.ConvertToCsvValue(ToCsvString(column.Value, column.Prop), _configuration)); + rowBuilder.Append(CsvHelper.ConvertToCsvValue(ToCsvString(column.Value, column.Prop), _configuration)); rowBuilder.Append(_configuration.Seperator); } private static void RemoveTrailingSeparator(StringBuilder rowBuilder) { - if (rowBuilder.Length == 0) - return; - - rowBuilder.Remove(rowBuilder.Length - 1, 1); + if (rowBuilder.Length is var len and > 0) + { + rowBuilder.Remove(len - 1, 1); + } } - private string GetHeader(List props) => string.Join( - _configuration.Seperator.ToString(), - props.Select(s => CsvHelpers.ConvertToCsvValue(s?.ExcelColumnName, _configuration))); - - [Zomp.SyncMethodGenerator.CreateSyncVersion] - private async Task WriteValuesAsync(StreamWriter writer, object values, string seperator, string newLine, CancellationToken cancellationToken = default) + [CreateSyncVersion] + private async Task WriteValuesAsync(StreamWriter writer, object values, string separator, string newLine, CancellationToken cancellationToken = default) { cancellationToken.ThrowIfCancellationRequested(); @@ -56,11 +50,14 @@ private async Task WriteValuesAsync(StreamWriter writer, object values, str { writeAdapter = MiniExcelWriteAdapterFactory.GetWriteAdapter(values, _configuration); } - List? props; + + List? props; #if SYNC_ONLY props = writeAdapter?.GetColumns(); #else - props = writeAdapter is not null ? writeAdapter.GetColumns() : await asyncWriteAdapter.GetColumnsAsync().ConfigureAwait(false); + props = writeAdapter is not null + ? writeAdapter.GetColumns() + : await asyncWriteAdapter.GetColumnsAsync().ConfigureAwait(false); #endif if (props is null) @@ -91,7 +88,7 @@ await _writer.WriteAsync(newLine #endif ).ConfigureAwait(false); } - + var rowBuilder = new StringBuilder(); var rowsWritten = 0; @@ -124,6 +121,7 @@ await _writer.WriteAsync(newLine else { #if !SYNC_ONLY +#pragma warning disable CA2007 await foreach (var row in asyncWriteAdapter.GetRowsAsync(props, cancellationToken).ConfigureAwait(false)) { cancellationToken.ThrowIfCancellationRequested(); @@ -133,6 +131,7 @@ await _writer.WriteAsync(newLine { AppendColumn(rowBuilder, column); } +#pragma warning restore CA2007 RemoveTrailingSeparator(rowBuilder); await _writer.WriteAsync(rowBuilder.ToString() @@ -153,7 +152,7 @@ await _writer.WriteAsync(newLine return rowsWritten; } - [Zomp.SyncMethodGenerator.CreateSyncVersion] + [CreateSyncVersion] public async Task SaveAsAsync(CancellationToken cancellationToken = default) { cancellationToken.ThrowIfCancellationRequested(); @@ -169,7 +168,7 @@ await _writer.WriteAsync("" #endif ).ConfigureAwait(false); await _writer.FlushAsync( -#if NET8_0_OR_GREATER +#if NET5_0_OR_GREATER cancellationToken #endif ).ConfigureAwait(false); @@ -178,22 +177,22 @@ await _writer.FlushAsync( var rowsWritten = await WriteValuesAsync(_writer, _value, seperator, newLine, cancellationToken).ConfigureAwait(false); await _writer.FlushAsync( -#if NET8_0_OR_GREATER - cancellationToken +#if NET5_0_OR_GREATER + cancellationToken #endif ).ConfigureAwait(false); return [rowsWritten]; } - [Zomp.SyncMethodGenerator.CreateSyncVersion] + [CreateSyncVersion] public async Task InsertAsync(bool overwriteSheet = false, CancellationToken cancellationToken = default) { var rowsWritten = await SaveAsAsync(cancellationToken).ConfigureAwait(false); return rowsWritten.FirstOrDefault(); } - public string ToCsvString(object? value, ExcelColumnInfo? p) + public string ToCsvString(object? value, MiniExcelColumnInfo? p) { if (value is null) return ""; @@ -213,10 +212,14 @@ public string ToCsvString(object? value, ExcelColumnInfo? p) return Convert.ToString(value, _configuration.Culture) ?? ""; } - + + private string GetHeader(List props) => string.Join( + _configuration.Seperator.ToString(), + props.Select(s => CsvHelper.ConvertToCsvValue(s?.ExcelColumnName, _configuration))); + protected virtual void Dispose(bool disposing) { - if (!_disposedValue) + if (!_disposed) { if (disposing) { @@ -226,7 +229,7 @@ protected virtual void Dispose(bool disposing) // TODO: free unmanaged resources (unmanaged objects) and override finalizer // TODO: set large fields to null - _disposedValue = true; + _disposed = true; } } diff --git a/src/MiniExcelLib.Csv/MiniExcelLib.Csv.csproj b/src/MiniExcelLib.Csv/MiniExcelLib.Csv.csproj new file mode 100644 index 00000000..08bdccb4 --- /dev/null +++ b/src/MiniExcelLib.Csv/MiniExcelLib.Csv.csproj @@ -0,0 +1,15 @@ + + + + True + ..\miniexcel.snk + + + + + + + + + + diff --git a/src/MiniExcel/miniexcel.snk b/src/miniexcel.snk similarity index 100% rename from src/MiniExcel/miniexcel.snk rename to src/miniexcel.snk diff --git a/tests/MiniExcelTests/MiniExcelAutoAdjustWidthTests.cs b/tests/MiniExcelTests/MiniExcelAutoAdjustWidthTests.cs index 41265180..99585b29 100644 --- a/tests/MiniExcelTests/MiniExcelAutoAdjustWidthTests.cs +++ b/tests/MiniExcelTests/MiniExcelAutoAdjustWidthTests.cs @@ -1,12 +1,14 @@ -using DocumentFormat.OpenXml.Packaging; -using DocumentFormat.OpenXml.Spreadsheet; -using MiniExcelLibs.OpenXml; -using MiniExcelLibs.Tests.Utils; -using System.Data; +using System.Data; using System.Data.SQLite; +using DocumentFormat.OpenXml.Packaging; +using DocumentFormat.OpenXml.Spreadsheet; +using MiniExcelLib.Core.OpenXml; +using MiniExcelLib.Core.OpenXml.Models; +using MiniExcelLib.Tests.Utils; +using Exporter = MiniExcelLib.MiniExcel.Exporter; using Xunit; -namespace MiniExcelLibs.Tests; +namespace MiniExcelLib.Tests; public class MiniExcelAutoAdjustWidthTests { @@ -16,7 +18,7 @@ public async Task AutoAdjustWidthThrowsExceptionWithoutFastMode_Async() using var file = AutoDeletingPath.Create(); var path = file.ToString(); - await Assert.ThrowsAsync(() => MiniExcel.SaveAsAsync(path, AutoAdjustTestParameters.GetDictionaryTestData(), configuration: new OpenXmlConfiguration + await Assert.ThrowsAsync(() => Exporter.ExportXlsxAsync(path, AutoAdjustTestParameters.GetDictionaryTestData(), configuration: new OpenXmlConfiguration { EnableAutoWidth = true, })); @@ -28,7 +30,7 @@ public void AutoAdjustWidthThrowsExceptionWithoutFastMode() using var file = AutoDeletingPath.Create(); var path = file.ToString(); - Assert.Throws(() => MiniExcel.SaveAs(path, AutoAdjustTestParameters.GetDictionaryTestData(), configuration: new OpenXmlConfiguration + Assert.Throws(() => Exporter.ExportXlsx(path, AutoAdjustTestParameters.GetDictionaryTestData(), configuration: new OpenXmlConfiguration { EnableAutoWidth = true, })); @@ -41,7 +43,7 @@ public async Task AutoAdjustWidthEnumerable_Async() var path = file.ToString(); var configuration = AutoAdjustTestParameters.GetConfiguration(); - await MiniExcel.SaveAsAsync(path, AutoAdjustTestParameters.GetDictionaryTestData(), configuration: configuration); + await Exporter.ExportXlsxAsync(path, AutoAdjustTestParameters.GetDictionaryTestData(), configuration: configuration); AssertExpectedWidth(path, configuration); } @@ -53,7 +55,7 @@ public void AutoAdjustWidthEnumerable() var path = file.ToString(); var configuration = AutoAdjustTestParameters.GetConfiguration(); - MiniExcel.SaveAs(path, AutoAdjustTestParameters.GetDictionaryTestData(), configuration: configuration); + Exporter.ExportXlsx(path, AutoAdjustTestParameters.GetDictionaryTestData(), configuration: configuration); AssertExpectedWidth(path, configuration); } @@ -71,7 +73,7 @@ public async Task AutoAdjustWidthDataReader_Async() await using var command = new SQLiteCommand(Db.GenerateDummyQuery(AutoAdjustTestParameters.GetDictionaryTestData()), connection); connection.Open(); await using var reader = command.ExecuteReader(); - await MiniExcel.SaveAsAsync(path, reader, configuration: configuration); + await Exporter.ExportXlsxAsync(path, reader, configuration: configuration); } AssertExpectedWidth(path, configuration); @@ -90,7 +92,7 @@ public void AutoAdjustWidthDataReader() using var command = new SQLiteCommand(Db.GenerateDummyQuery(AutoAdjustTestParameters.GetDictionaryTestData()), connection); connection.Open(); using var reader = command.ExecuteReader(); - MiniExcel.SaveAs(path, reader, configuration: configuration); + Exporter.ExportXlsx(path, reader, configuration: configuration); } AssertExpectedWidth(path, configuration); @@ -115,7 +117,7 @@ public async Task AutoAdjustWidthDataTable_Async() } var configuration = AutoAdjustTestParameters.GetConfiguration(); - await MiniExcel.SaveAsAsync(path, table, configuration: configuration); + await Exporter.ExportXlsxAsync(path, table, configuration: configuration); AssertExpectedWidth(path, configuration); } @@ -138,7 +140,7 @@ public void AutoAdjustWidthDataTable() } var configuration = AutoAdjustTestParameters.GetConfiguration(); - MiniExcel.SaveAs(path, table, configuration: configuration); + Exporter.ExportXlsx(path, table, configuration: configuration); AssertExpectedWidth(path, configuration); } diff --git a/tests/MiniExcelTests/MiniExcelCsvAsycTests.cs b/tests/MiniExcelTests/MiniExcelCsvAsycTests.cs index 79aff1b2..f42807f1 100644 --- a/tests/MiniExcelTests/MiniExcelCsvAsycTests.cs +++ b/tests/MiniExcelTests/MiniExcelCsvAsycTests.cs @@ -1,11 +1,14 @@ -using CsvHelper; -using MiniExcelLibs.Tests.Utils; -using System.Data; +using System.Data; using System.Globalization; using System.Text; +using MiniExcelLib.Csv; +using MiniExcelLib.Tests.Utils; using Xunit; +using Importer = MiniExcelLib.MiniExcel.Importer; +using Exporter = MiniExcelLib.MiniExcel.Exporter; +using CsvReader = CsvHelper.CsvReader; -namespace MiniExcelLibs.Tests; +namespace MiniExcelLib.Tests; public class MiniExcelCsvAsycTests { @@ -14,11 +17,11 @@ public async Task Gb2312_Encoding_Read_Test() { Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); var path = PathHelper.GetFile("csv/gb2312_Encoding_Read_Test.csv"); - var config = new Csv.CsvConfiguration + var config = new CsvConfiguration { StreamReaderFunc = stream => new StreamReader(stream, encoding: Encoding.GetEncoding("gb2312")) }; - var q = MiniExcel.QueryAsync(path, true, excelType: ExcelType.CSV, configuration: config).ToBlockingEnumerable(); + var q = Importer.QueryCsvAsync(path, true, configuration: config).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal("世界你好", rows[0].栏位1); } @@ -26,7 +29,7 @@ public async Task Gb2312_Encoding_Read_Test() [Fact] public async Task SeperatorTest() { - using var file = AutoDeletingPath.Create(ExcelType.CSV); + using var file = AutoDeletingPath.Create(ExcelType.Csv); var path = file.ToString(); List> values = @@ -48,7 +51,7 @@ public async Task SeperatorTest() } ]; - var rowsWritten = await MiniExcel.SaveAsAsync(path, values, configuration: new Csv.CsvConfiguration { Seperator = ';' }); + var rowsWritten = await Exporter.ExportCsvAsync(path, values, configuration: new CsvConfiguration { Seperator = ';' }); Assert.Equal(2, rowsWritten[0]); const string expected = @@ -66,24 +69,24 @@ public async Task SeperatorTest() public async Task SaveAsByDictionary() { { - using var file = AutoDeletingPath.Create(ExcelType.CSV); + using var file = AutoDeletingPath.Create(ExcelType.Csv); var path = file.ToString(); var table = new List>(); - await MiniExcel.SaveAsAsync(path, table); + await Exporter.ExportCsvAsync(path, table); Assert.Equal("\r\n", await File.ReadAllTextAsync(path)); } { - using var file = AutoDeletingPath.Create(ExcelType.CSV); + using var file = AutoDeletingPath.Create(ExcelType.Csv); var path = file.ToString(); var table = new Dictionary(); //TODO - Assert.Throws(() => MiniExcel.SaveAs(path, table)); + Assert.Throws(() => Exporter.ExportCsv(path, table)); } { - using var file = AutoDeletingPath.Create(ExcelType.CSV); + using var file = AutoDeletingPath.Create(ExcelType.Csv); var path = file.ToString(); List> values = @@ -103,7 +106,7 @@ public async Task SaveAsByDictionary() { "d", new DateTime(2021, 1, 2) } } ]; - var rowsWritten = await MiniExcel.SaveAsAsync(path, values); + var rowsWritten = await Exporter.ExportCsvAsync(path, values); Assert.Equal(2, rowsWritten[0]); using var reader = new StreamReader(path); @@ -122,7 +125,7 @@ public async Task SaveAsByDictionary() } { - using var file = AutoDeletingPath.Create(ExcelType.CSV); + using var file = AutoDeletingPath.Create(ExcelType.Csv); var path = file.ToString(); List> values = @@ -144,7 +147,7 @@ public async Task SaveAsByDictionary() } ]; - var rowsWritten = await MiniExcel.SaveAsAsync(path, values); + var rowsWritten = await Exporter.ExportCsvAsync(path, values); Assert.Equal(2, rowsWritten[0]); using var reader = new StreamReader(path); @@ -168,17 +171,17 @@ public async Task SaveAsByDictionary() [Fact] public async Task SaveAsByDataTableTest() { - using var file1 = AutoDeletingPath.Create(ExcelType.CSV); + using var file1 = AutoDeletingPath.Create(ExcelType.Csv); var path1 = file1.ToString(); var emptyTable = new DataTable(); - await MiniExcel.SaveAsAsync(path1, emptyTable); + await Exporter.ExportCsvAsync(path1, emptyTable); var text = await File.ReadAllTextAsync(path1); Assert.Equal("\r\n", text); - using var file2= AutoDeletingPath.Create(ExcelType.CSV); + using var file2= AutoDeletingPath.Create(ExcelType.Csv); var path2 = file2.ToString(); var table = new DataTable(); @@ -189,7 +192,7 @@ public async Task SaveAsByDataTableTest() table.Rows.Add(@"""<>+-*//}{\\n", 1234567890, true, new DateTime(2021, 1, 1)); table.Rows.Add("Hello World", -1234567890, false, new DateTime(2021, 1, 2)); - var rowsWritten = await MiniExcel.SaveAsAsync(path2, table); + var rowsWritten = await Exporter.ExportCsvAsync(path2, table); Assert.Equal(2, rowsWritten[0]); using var reader = new StreamReader(path2); @@ -217,17 +220,17 @@ private class Test [Fact] public async Task CsvExcelTypeTest() { - using var file = AutoDeletingPath.Create(ExcelType.CSV); + using var file = AutoDeletingPath.Create(ExcelType.Csv); var path = file.ToString(); var input = new[] { new { A = "Test1", B = "Test2" } }; - await MiniExcel.SaveAsAsync(path, input); + await Exporter.ExportCsvAsync(path, input); var texts = await File.ReadAllLinesAsync(path); Assert.Equal("A,B", texts[0]); Assert.Equal("Test1,Test2", texts[1]); - var q = MiniExcel.QueryAsync(path).ToBlockingEnumerable(); + var q = Importer.QueryCsvAsync(path).ToBlockingEnumerable(); var rows1 = q.ToList(); Assert.Equal("A", rows1[0].A); @@ -246,10 +249,10 @@ public async Task CsvExcelTypeTest() [Fact] public async Task Create2x2_Test() { - using var file = AutoDeletingPath.Create(ExcelType.CSV); + using var file = AutoDeletingPath.Create(ExcelType.Csv); var path = file.ToString(); - await MiniExcel.SaveAsAsync(path, new[] + await Exporter.ExportCsvAsync(path, new[] { new { c1 = "A1", c2 = "B1"}, new { c1 = "A2", c2 = "B2"}, @@ -257,7 +260,7 @@ await MiniExcel.SaveAsAsync(path, new[] await using (var stream = File.OpenRead(path)) { - var rows = stream.QueryAsync(useHeaderRow: true, excelType: ExcelType.CSV).ToBlockingEnumerable().ToList(); + var rows = Importer.QueryCsvAsync(stream, useHeaderRow: true).ToBlockingEnumerable().ToList(); Assert.Equal("A1", rows[0].c1); Assert.Equal("B1", rows[0].c2); Assert.Equal("A2", rows[1].c1); @@ -265,7 +268,7 @@ await MiniExcel.SaveAsAsync(path, new[] } { - var rows = MiniExcel.QueryAsync(path, useHeaderRow: true, excelType: ExcelType.CSV).ToBlockingEnumerable().ToList(); + var rows = Importer.QueryCsvAsync(path, useHeaderRow: true).ToBlockingEnumerable().ToList(); Assert.Equal("A1", rows[0].c1); Assert.Equal("B1", rows[0].c2); Assert.Equal("A2", rows[1].c1); @@ -276,10 +279,10 @@ await MiniExcel.SaveAsAsync(path, new[] [Fact] public async Task CsvTypeMappingTest() { - using var file = AutoDeletingPath.Create(ExcelType.CSV); + using var file = AutoDeletingPath.Create(ExcelType.Csv); var path = file.ToString(); - await MiniExcel.SaveAsAsync(path, new[] + await Exporter.ExportCsvAsync(path, new[] { new { c1 = "A1", c2 = "B1"}, new { c1 = "A2", c2 = "B2"} @@ -287,7 +290,7 @@ await MiniExcel.SaveAsAsync(path, new[] await using (var stream = File.OpenRead(path)) { - var rows = stream.Query(excelType: ExcelType.CSV).ToList(); + var rows = Importer.QueryCsv(stream).ToList(); Assert.Equal("A1", rows[0].c1); Assert.Equal("B1", rows[0].c2); Assert.Equal("A2", rows[1].c1); @@ -295,7 +298,7 @@ await MiniExcel.SaveAsAsync(path, new[] } { - var rows = MiniExcel.Query(path, excelType: ExcelType.CSV).ToList(); + var rows = Importer.QueryCsv(path).ToList(); Assert.Equal("A1", rows[0].c1); Assert.Equal("B1", rows[0].c2); Assert.Equal("A2", rows[1].c1); @@ -306,10 +309,10 @@ await MiniExcel.SaveAsAsync(path, new[] [Fact] public async Task CsvReadEmptyStringAsNullTest() { - using var file = AutoDeletingPath.Create(ExcelType.CSV); + using var file = AutoDeletingPath.Create(ExcelType.Csv); var path = file.ToString(); - await MiniExcel.SaveAsAsync(path, new[] + await Exporter.ExportCsvAsync(path, new[] { new { c1 = (string?)"A1", c2 = (string?)null}, new { c1 = (string?)null, c2 = (string?)null} @@ -317,7 +320,7 @@ await MiniExcel.SaveAsAsync(path, new[] await using (var stream = File.OpenRead(path)) { - var rows = stream.Query(excelType: ExcelType.CSV).ToList(); + var rows = Importer.QueryCsv(stream).ToList(); Assert.Equal("A1", rows[0].c1); Assert.Equal(string.Empty, rows[0].c2); Assert.Equal(string.Empty, rows[1].c1); @@ -325,17 +328,17 @@ await MiniExcel.SaveAsAsync(path, new[] } { - var rows = MiniExcel.Query(path, excelType: ExcelType.CSV).ToList(); + var rows = Importer.QueryCsv(path).ToList(); Assert.Equal("A1", rows[0].c1); Assert.Equal(string.Empty, rows[0].c2); Assert.Equal(string.Empty, rows[1].c1); Assert.Equal(string.Empty, rows[1].c2); } - var config = new Csv.CsvConfiguration { ReadEmptyStringAsNull = true }; + var config = new CsvConfiguration { ReadEmptyStringAsNull = true }; await using (var stream = File.OpenRead(path)) { - var rows = stream.Query(excelType: ExcelType.CSV, configuration: config).ToList(); + var rows = Importer.QueryCsv(stream, configuration: config).ToList(); Assert.Equal("A1", rows[0].c1); Assert.Null(rows[0].c2); Assert.Null(rows[1].c1); @@ -343,7 +346,7 @@ await MiniExcel.SaveAsAsync(path, new[] } { - var rows = MiniExcel.Query(path, excelType: ExcelType.CSV, configuration: config).ToList(); + var rows = Importer.QueryCsv(path, configuration: config).ToList(); Assert.Equal("A1", rows[0].c1); Assert.Null(rows[0].c2); Assert.Null(rows[1].c1); @@ -365,10 +368,10 @@ static async IAsyncEnumerable GetValues() } #pragma warning restore CS1998 // Async method lacks 'await' operators and will run synchronously - var rowsWritten = await MiniExcel.SaveAsAsync(path, GetValues()); + var rowsWritten = await Exporter.ExportCsvAsync(path, GetValues()); Assert.Equal(2, rowsWritten[0]); - var results = MiniExcel.Query(path).ToList(); + var results = Importer.QueryCsv(path).ToList(); Assert.Equal(2, results.Count); Assert.Equal("A1", results[0].c1); Assert.Equal("B1", results[0].c2); diff --git a/tests/MiniExcelTests/MiniExcelCsvTests.cs b/tests/MiniExcelTests/MiniExcelCsvTests.cs index ad1b8e70..274e4687 100644 --- a/tests/MiniExcelTests/MiniExcelCsvTests.cs +++ b/tests/MiniExcelTests/MiniExcelCsvTests.cs @@ -1,13 +1,16 @@ -using CsvHelper; -using MiniExcelLibs.Attributes; -using MiniExcelLibs.Exceptions; -using MiniExcelLibs.Tests.Utils; -using System.Data; +using System.Data; using System.Globalization; using System.Text; +using CsvHelper; +using MiniExcelLib.Core.Attributes; +using MiniExcelLib.Core.Exceptions; +using MiniExcelLib.Csv; +using MiniExcelLib.Tests.Utils; +using Importer = MiniExcelLib.MiniExcel.Importer; +using Exporter = MiniExcelLib.MiniExcel.Exporter; using Xunit; -namespace MiniExcelLibs.Tests; +namespace MiniExcelLib.Tests; public class MiniExcelCsvTests { @@ -16,18 +19,18 @@ public void gb2312_Encoding_Read_Test() { Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); var path = PathHelper.GetFile("csv/gb2312_Encoding_Read_Test.csv"); - var config = new Csv.CsvConfiguration + var config = new CsvConfiguration { StreamReaderFunc = stream => new StreamReader(stream, encoding: Encoding.GetEncoding("gb2312")) }; - var rows = MiniExcel.Query(path, true, excelType: ExcelType.CSV, configuration: config).ToList(); + var rows = Importer.QueryCsv(path, true, configuration: config).ToList(); Assert.Equal("世界你好", rows[0].栏位1); } [Fact] public void SeperatorTest() { - using var file = AutoDeletingPath.Create(ExcelType.CSV); + using var file = AutoDeletingPath.Create(ExcelType.Csv); var path = file.ToString(); List> values = @@ -48,7 +51,7 @@ public void SeperatorTest() { "d", new DateTime(2021, 1, 2) } } ]; - var rowsWritten = MiniExcel.SaveAs(path, values, configuration: new Csv.CsvConfiguration { Seperator = ';' }); + var rowsWritten = Exporter.ExportCsv(path, values, configuration: new CsvConfiguration { Seperator = ';' }); Assert.Equal(2, rowsWritten[0]); const string expected = @@ -64,7 +67,7 @@ public void SeperatorTest() [Fact] public void DontQuoteWhitespacesTest() { - using var file = AutoDeletingPath.Create(ExcelType.CSV); + using var file = AutoDeletingPath.Create(ExcelType.Csv); var path = file.ToString(); List> values = @@ -85,7 +88,7 @@ public void DontQuoteWhitespacesTest() { "d", new DateTime(2021, 1, 2) } } ]; - var rowsWritten = MiniExcel.SaveAs(path, values, configuration: new Csv.CsvConfiguration { QuoteWhitespaces = false }); + var rowsWritten = Exporter.ExportCsv(path, values, configuration: new CsvConfiguration { QuoteWhitespaces = false }); Assert.Equal(2, rowsWritten[0]); const string expected = @@ -101,7 +104,7 @@ public void DontQuoteWhitespacesTest() [Fact] public void AlwaysQuoteTest() { - using var file = AutoDeletingPath.Create(ExcelType.CSV); + using var file = AutoDeletingPath.Create(ExcelType.Csv); var path = file.ToString(); List> values = @@ -122,7 +125,7 @@ public void AlwaysQuoteTest() } ]; - MiniExcel.SaveAs(path, values, configuration: new Csv.CsvConfiguration { AlwaysQuote = true }); + Exporter.ExportCsv(path, values, configuration: new CsvConfiguration { AlwaysQuote = true }); const string expected = """" "a","b","c","d" @@ -136,7 +139,7 @@ public void AlwaysQuoteTest() [Fact] public void QuoteSpecialCharacters() { - using var file = AutoDeletingPath.Create(ExcelType.CSV); + using var file = AutoDeletingPath.Create(ExcelType.Csv); var path = file.ToString(); List> values = @@ -150,7 +153,7 @@ public void QuoteSpecialCharacters() } ]; - var rowsWritten = MiniExcel.SaveAs(path, values, configuration: new Csv.CsvConfiguration()); + var rowsWritten = Exporter.ExportCsv(path, values, configuration: new CsvConfiguration()); Assert.Equal(1, rowsWritten[0]); const string expected = "a,b,c,d\r\n\"potato,banana\",\"text\ntest\",\"text\rpotato\",\"2021-01-01 00:00:00\"\r\n"; @@ -161,21 +164,21 @@ public void QuoteSpecialCharacters() public void SaveAsByDictionary() { { - using var path = AutoDeletingPath.Create(ExcelType.CSV); + using var path = AutoDeletingPath.Create(ExcelType.Csv); var table = new List>(); - MiniExcel.SaveAs(path.ToString(), table); + Exporter.ExportCsv(path.ToString(), table); Assert.Equal("\r\n", File.ReadAllText(path.ToString())); } { - using var path = AutoDeletingPath.Create(ExcelType.CSV); + using var path = AutoDeletingPath.Create(ExcelType.Csv); var table = new Dictionary(); //TODO - Assert.Throws(() => MiniExcel.SaveAs(path.ToString(), table)); + Assert.Throws(() => Exporter.ExportCsv(path.ToString(), table)); } { - using var path = AutoDeletingPath.Create(ExcelType.CSV); + using var path = AutoDeletingPath.Create(ExcelType.Csv); List> values = [ new() @@ -195,7 +198,7 @@ public void SaveAsByDictionary() } ]; - var rowsWritten = MiniExcel.SaveAs(path.ToString(), values); + var rowsWritten = Exporter.ExportCsv(path.ToString(), values); Assert.Equal(2, rowsWritten[0]); using var reader = new StreamReader(path.ToString()); @@ -214,7 +217,7 @@ public void SaveAsByDictionary() } { - using var path = AutoDeletingPath.Create(ExcelType.CSV); + using var path = AutoDeletingPath.Create(ExcelType.Csv); List> values = [ new() @@ -232,7 +235,7 @@ public void SaveAsByDictionary() { 4, new DateTime(2021, 1, 2) } } ]; - MiniExcel.SaveAs(path.ToString(), values); + Exporter.ExportCsv(path.ToString(), values); using (var reader = new StreamReader(path.ToString())) using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture)) @@ -260,17 +263,17 @@ public void SaveAsByDictionary() public void SaveAsByDataTableTest() { { - using var path = AutoDeletingPath.Create(ExcelType.CSV); + using var path = AutoDeletingPath.Create(ExcelType.Csv); var table = new DataTable(); - MiniExcel.SaveAs(path.ToString(), table); + Exporter.ExportCsv(path.ToString(), table); var text = File.ReadAllText(path.ToString()); Assert.Equal("\r\n", text); } { - using var path = AutoDeletingPath.Create(ExcelType.CSV); + using var path = AutoDeletingPath.Create(ExcelType.Csv); var table = new DataTable(); { @@ -282,7 +285,7 @@ public void SaveAsByDataTableTest() table.Rows.Add("Hello World", -1234567890, false, new DateTime(2021, 1, 2)); } - var rowsWritten = MiniExcel.SaveAs(path.ToString(), table); + var rowsWritten = Exporter.ExportCsv(path.ToString(), table); Assert.Equal(2, rowsWritten[0]); using (var reader = new StreamReader(path.ToString())) @@ -311,26 +314,26 @@ private class Test private class TestWithAlias { - [ExcelColumnName(excelColumnName: "c1", aliases: ["column1", "col1"])] + [MiniExcelColumnName(excelColumnName: "c1", aliases: ["column1", "col1"])] public string c1 { get; set; } - [ExcelColumnName(excelColumnName: "c2", aliases: ["column2", "col2"])] + [MiniExcelColumnName(excelColumnName: "c2", aliases: ["column2", "col2"])] public string c2 { get; set; } } [Fact] public void CsvExcelTypeTest() { - using var file = AutoDeletingPath.Create(ExcelType.CSV); + using var file = AutoDeletingPath.Create(ExcelType.Csv); var path = file.ToString(); var input = new[] { new { A = "Test1", B = "Test2" } }; - MiniExcel.SaveAs(path, input); + Exporter.ExportCsv(path, input); var texts = File.ReadAllLines(path); Assert.Equal("A,B", texts[0]); Assert.Equal("Test1,Test2", texts[1]); - var rows = MiniExcel.Query(path).ToList(); + var rows = Importer.QueryCsv(path).ToList(); Assert.Equal("A", rows[0].A); Assert.Equal("B", rows[0].B); Assert.Equal("Test1", rows[1].A); @@ -346,18 +349,20 @@ public void CsvExcelTypeTest() [Fact] public void Create2x2_Test() { - using var file = AutoDeletingPath.Create(ExcelType.CSV); + using var file = AutoDeletingPath.Create(ExcelType.Csv); var path = file.ToString(); - MiniExcel.SaveAs(path, new[] + Exporter.ExportCsv(path, new[] { new { c1 = "A1", c2 = "B1"}, new { c1 = "A2", c2 = "B2"}, }); + var txt = File.ReadAllText(path); + using (var stream = File.OpenRead(path)) { - var rows = stream.Query(useHeaderRow: true, excelType: ExcelType.CSV).ToList(); + var rows = Importer.QueryCsv(stream, useHeaderRow: true).ToList(); Assert.Equal("A1", rows[0].c1); Assert.Equal("B1", rows[0].c2); Assert.Equal("A2", rows[1].c1); @@ -365,7 +370,7 @@ public void Create2x2_Test() } { - var rows = MiniExcel.Query(path, useHeaderRow: true, excelType: ExcelType.CSV).ToList(); + var rows = Importer.QueryCsv(path, useHeaderRow: true).ToList(); Assert.Equal("A1", rows[0].c1); Assert.Equal("B1", rows[0].c2); Assert.Equal("A2", rows[1].c1); @@ -376,10 +381,10 @@ public void Create2x2_Test() [Fact] public void CsvTypeMappingTest() { - using var file = AutoDeletingPath.Create(ExcelType.CSV); + using var file = AutoDeletingPath.Create(ExcelType.Csv); var path = file.ToString(); - MiniExcel.SaveAs(path, new[] + Exporter.ExportCsv(path, new[] { new { c1 = "A1", c2 = "B1"}, new { c1 = "A2", c2 = "B2"}, @@ -387,7 +392,7 @@ public void CsvTypeMappingTest() using (var stream = File.OpenRead(path)) { - var rows = stream.Query(excelType: ExcelType.CSV).ToList(); + var rows = Importer.QueryCsv(stream).ToList(); Assert.Equal("A1", rows[0].c1); Assert.Equal("B1", rows[0].c2); Assert.Equal("A2", rows[1].c1); @@ -395,7 +400,7 @@ public void CsvTypeMappingTest() } { - var rows = MiniExcel.Query(path, excelType: ExcelType.CSV).ToList(); + var rows = Importer.QueryCsv(path).ToList(); Assert.Equal("A1", rows[0].c1); Assert.Equal("B1", rows[0].c2); Assert.Equal("A2", rows[1].c1); @@ -406,14 +411,14 @@ public void CsvTypeMappingTest() [Fact] public void CsvColumnNotFoundTest() { - using var file = AutoDeletingPath.Create(ExcelType.CSV); + using var file = AutoDeletingPath.Create(ExcelType.Csv); var path = file.ToString(); File.WriteAllLines(path, ["c1,c2", "v1"]); using (var stream = File.OpenRead(path)) { - var exception = Assert.Throws(() => stream.Query(excelType: ExcelType.CSV).ToList()); + var exception = Assert.Throws(() => Importer.QueryCsv(stream).ToList()); Assert.Equal("c2", exception.ColumnName); Assert.Equal(2, exception.RowIndex); @@ -423,7 +428,7 @@ public void CsvColumnNotFoundTest() } { - var exception = Assert.Throws(() => MiniExcel.Query(path, excelType: ExcelType.CSV).ToList()); + var exception = Assert.Throws(() => Importer.QueryCsv(path).ToList()); Assert.Equal("c2", exception.ColumnName); Assert.Equal(2, exception.RowIndex); @@ -436,13 +441,13 @@ public void CsvColumnNotFoundTest() [Fact] public void CsvColumnNotFoundWithAliasTest() { - using var file = AutoDeletingPath.Create(ExcelType.CSV); + using var file = AutoDeletingPath.Create(ExcelType.Csv); var path = file.ToString(); File.WriteAllLines(path, ["col1,col2", "v1"]); using (var stream = File.OpenRead(path)) { - var exception = Assert.Throws(() => stream.Query(excelType: ExcelType.CSV).ToList()); + var exception = Assert.Throws(() => Importer.QueryCsv(stream).ToList()); Assert.Equal("c2", exception.ColumnName); Assert.Equal(2, exception.RowIndex); @@ -452,7 +457,7 @@ public void CsvColumnNotFoundWithAliasTest() } { - var exception = Assert.Throws(() => MiniExcel.Query(path, excelType: ExcelType.CSV).ToList()); + var exception = Assert.Throws(() => Importer.QueryCsv(path).ToList()); Assert.Equal("c2", exception.ColumnName); Assert.Equal(2, exception.RowIndex); @@ -477,7 +482,7 @@ public void Delimiters_Test() private static string Generate(string value) { - using var file = AutoDeletingPath.Create(ExcelType.CSV); + using var file = AutoDeletingPath.Create(ExcelType.Csv); var path = file.ToString(); using (var writer = new StreamWriter(path)) @@ -493,17 +498,76 @@ private static string Generate(string value) private static string MiniExcelGenerateCsv(string value) { - using var file = AutoDeletingPath.Create(ExcelType.CSV); + using var file = AutoDeletingPath.Create(ExcelType.Csv); var path = file.ToString(); using (var stream = File.Create(path)) { IEnumerable records = [new { v1 = value, v2 = value }]; - var rowsWritten = stream.SaveAs(records, excelType: ExcelType.CSV); + var rowsWritten = Exporter.ExportCsv(stream, records); Assert.Equal(1, rowsWritten[0]); } var content = File.ReadAllText(path); return content; } + + + [Fact] + public async Task InsertCsvTest() + { + using var file = AutoDeletingPath.Create(ExcelType.Csv); + var path = file.ToString(); + + { + var value = new[] + { + new { ID=1,Name ="Jack",InDate=new DateTime(2021,01,03)}, + new { ID=2,Name ="Henry",InDate=new DateTime(2020,05,03)}, + }; + await Exporter.ExportCsvAsync(path, value); + var content = await File.ReadAllTextAsync(path); + Assert.Equal( + """ + ID,Name,InDate + 1,Jack,"2021-01-03 00:00:00" + 2,Henry,"2020-05-03 00:00:00" + + """, content); + } + { + var value = new { ID = 3, Name = "Mike", InDate = new DateTime(2021, 04, 23) }; + await Exporter.AppendToCsvAsync(path, value); + var content = await File.ReadAllTextAsync(path); + Assert.Equal( + """ + ID,Name,InDate + 1,Jack,"2021-01-03 00:00:00" + 2,Henry,"2020-05-03 00:00:00" + 3,Mike,"2021-04-23 00:00:00" + + """, content); + } + { + var value = new[] + { + new { ID=4,Name ="Frank",InDate=new DateTime(2021,06,07)}, + new { ID=5,Name ="Gloria",InDate=new DateTime(2022,05,03)}, + }; + + await Exporter.AppendToCsvAsync(path, value); + var content = await File.ReadAllTextAsync(path); + Assert.Equal( + """ + ID,Name,InDate + 1,Jack,"2021-01-03 00:00:00" + 2,Henry,"2020-05-03 00:00:00" + 3,Mike,"2021-04-23 00:00:00" + 4,Frank,"2021-06-07 00:00:00" + 5,Gloria,"2022-05-03 00:00:00" + + """, content); + } + } + } \ No newline at end of file diff --git a/tests/MiniExcelTests/MiniExcelIssueAsyncTests.cs b/tests/MiniExcelTests/MiniExcelIssueAsyncTests.cs index f81a1ba2..22cd870c 100644 --- a/tests/MiniExcelTests/MiniExcelIssueAsyncTests.cs +++ b/tests/MiniExcelTests/MiniExcelIssueAsyncTests.cs @@ -1,23 +1,26 @@ -using Dapper; -using MiniExcelLibs.Attributes; -using MiniExcelLibs.OpenXml; -using MiniExcelLibs.Tests.Utils; -using Newtonsoft.Json; -using OfficeOpenXml; -using System.Data; +using System.Data; using System.Data.SQLite; using System.Globalization; using System.Text; +using Dapper; +using MiniExcelLib.Core.Attributes; +using MiniExcelLib.Core.OpenXml; +using MiniExcelLib.Csv; +using MiniExcelLib.Tests.Utils; +using Importer = MiniExcelLib.MiniExcel.Importer; +using Exporter = MiniExcelLib.MiniExcel.Exporter; +using Templater = MiniExcelLib.MiniExcel.Templater; +using Newtonsoft.Json; +using OfficeOpenXml; using Xunit; using Xunit.Abstractions; -using static MiniExcelLibs.Tests.MiniExcelOpenXmlTests; -namespace MiniExcelLibs.Tests; +namespace MiniExcelLib.Tests; public class MiniExcelIssueAsyncTests(ITestOutputHelper output) { private readonly ITestOutputHelper _output = output; - + /// /// [SaveAsByTemplate support DateTime custom format · Issue #255 · mini-software/MiniExcel] /// (https://github.com/mini-software/MiniExcel/issues/255) @@ -37,8 +40,8 @@ public async Task Issue255() } }; - await MiniExcel.SaveAsByTemplateAsync(path.ToString(), templatePath, value); - var q = MiniExcel.QueryAsync(path.ToString()).ToBlockingEnumerable(); + await Templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); + var q = Importer.QueryXlsxAsync(path.ToString()).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal("2021", rows[1].A.ToString()); @@ -55,11 +58,11 @@ public async Task Issue255() Time2 = new DateTime(2021, 01, 01) } }; - var rowsWritten = await MiniExcel.SaveAsAsync(path.ToString(), value); + var rowsWritten = await Exporter.ExportXlsxAsync(path.ToString(), value); Assert.Single(rowsWritten); Assert.Equal(1, rowsWritten[0]); - var q = MiniExcel.QueryAsync(path.ToString()).ToBlockingEnumerable(); + var q = Importer.QueryXlsxAsync(path.ToString()).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal("2021", rows[1].A.ToString()); Assert.Equal("2021", rows[1].B.ToString()); @@ -68,10 +71,10 @@ public async Task Issue255() private class Issue255DTO { - [ExcelFormat("yyyy")] + [MiniExcelFormat("yyyy")] public DateTime Time { get; set; } - [ExcelColumn(Format = "yyyy")] + [MiniExcelColumn(Format = "yyyy")] public DateTime Time2 { get; set; } } @@ -83,7 +86,7 @@ private class Issue255DTO public async Task Issue256() { var path = PathHelper.GetFile("xlsx/TestIssue256.xlsx"); - var q = MiniExcel.QueryAsync(path, false).ToBlockingEnumerable(); + var q = Importer.QueryXlsxAsync(path, false).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal(new DateTime(2003, 4, 16), rows[1].A); @@ -99,9 +102,9 @@ public async Task Issue253() { { var value = new[] { new { col1 = "世界你好" } }; - using var path = AutoDeletingPath.Create(ExcelType.CSV); + using var path = AutoDeletingPath.Create(ExcelType.Csv); - await MiniExcel.SaveAsAsync(path.ToString(), value); + await Exporter.ExportCsvAsync(path.ToString(), value); const string expected = """ col1 @@ -115,14 +118,14 @@ public async Task Issue253() { Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); var value = new[] { new { col1 = "世界你好" } }; - using var path = AutoDeletingPath.Create(ExcelType.CSV); + using var path = AutoDeletingPath.Create(ExcelType.Csv); - var config = new Csv.CsvConfiguration + var config = new CsvConfiguration { StreamWriterFunc = stream => new StreamWriter(stream, Encoding.GetEncoding("gb2312")) }; - await MiniExcel.SaveAsAsync(path.ToString(), value, excelType: ExcelType.CSV, configuration: config); + await Exporter.ExportCsvAsync(path.ToString(), value, configuration: config); const string expected = """ col1 @@ -137,8 +140,8 @@ public async Task Issue253() { var value = await cn.ExecuteReaderAsync("select '世界你好' col1"); - using var path = AutoDeletingPath.Create(ExcelType.CSV); - await MiniExcel.SaveAsAsync(path.ToString(), value); + using var path = AutoDeletingPath.Create(ExcelType.Csv); + await Exporter.ExportCsvAsync(path.ToString(), value); const string expected = """ col1 @@ -159,8 +162,8 @@ public async Task Issue251() await using var cn = Db.GetConnection(); var reader = await cn.ExecuteReaderAsync(@"select '""<>+-*//}{\\n' a,1234567890 b union all select 'Hello World',-1234567890"); - using var path = AutoDeletingPath.Create(ExcelType.CSV); - var rowsWritten = await MiniExcel.SaveAsAsync(path.ToString(), reader); + using var path = AutoDeletingPath.Create(ExcelType.Csv); + var rowsWritten = await Exporter.ExportCsvAsync(path.ToString(), reader); Assert.Single(rowsWritten); Assert.Equal(2, rowsWritten[0]); @@ -183,10 +186,10 @@ public async Task Issue251() public async Task Issue242() { var path = PathHelper.GetFile("xls/TestIssue242.xls"); - Assert.Throws(() => _ = MiniExcel.QueryAsync(path).ToBlockingEnumerable().ToList()); + Assert.Throws(() => _ = Importer.QueryXlsxAsync(path).ToBlockingEnumerable().ToList()); await using var stream = File.OpenRead(path); - Assert.Throws(() => _ = (stream.QueryAsync().ToBlockingEnumerable()).ToList()); + Assert.Throws(() => _ = Importer.QueryXlsxAsync(stream).ToBlockingEnumerable().ToList()); } /// @@ -195,18 +198,18 @@ public async Task Issue242() [Fact] public async Task Issue243() { - using var path = AutoDeletingPath.Create(ExcelType.CSV); + using var path = AutoDeletingPath.Create(ExcelType.Csv); var value = new[] { new { Name ="Jack",Age=25,InDate=new DateTime(2021,01,03)}, new { Name ="Henry",Age=36,InDate=new DateTime(2020,05,03)}, }; - var rowsWritten = await MiniExcel.SaveAsAsync(path.ToString(), value); + var rowsWritten = await Exporter.ExportXlsxAsync(path.ToString(), value); Assert.Single(rowsWritten); Assert.Equal(2, rowsWritten[0]); - var q = MiniExcel.QueryAsync(path.ToString()).ToBlockingEnumerable(); + var q = Importer.QueryXlsxAsync(path.ToString()).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal("Jack", rows[0].Name); @@ -239,15 +242,15 @@ public async Task Issue241() // csv { - using var file = AutoDeletingPath.Create(ExcelType.CSV); + using var file = AutoDeletingPath.Create(ExcelType.Csv); var path = file.ToString(); - var rowsWritten = await MiniExcel.SaveAsAsync(path, value); + var rowsWritten = await Exporter.ExportXlsxAsync(path, value); Assert.Single(rowsWritten); Assert.Equal(2, rowsWritten[0]); { - var q = MiniExcel.QueryAsync(path, true).ToBlockingEnumerable(); + var q = Importer.QueryXlsxAsync(path, true).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal(rows[0].InDate, "01 04, 2021"); @@ -255,7 +258,7 @@ public async Task Issue241() } { - var q = MiniExcel.QueryAsync(path).ToBlockingEnumerable(); + var q = Importer.QueryXlsxAsync(path).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal(rows[0].InDate, new DateTime(2021, 01, 04)); @@ -267,13 +270,13 @@ public async Task Issue241() { using var file = AutoDeletingPath.Create(); var path = file.ToString(); - var rowsWritten = await MiniExcel.SaveAsAsync(path, value); + var rowsWritten = await Exporter.ExportXlsxAsync(path, value); Assert.Single(rowsWritten); Assert.Equal(2, rowsWritten[0]); { - var q = MiniExcel.QueryAsync(path, true).ToBlockingEnumerable(); + var q = Importer.QueryXlsxAsync(path, true).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal(rows[0].InDate, "01 04, 2021"); @@ -281,7 +284,7 @@ public async Task Issue241() } { - var q = MiniExcel.QueryAsync(path).ToBlockingEnumerable(); + var q = Importer.QueryXlsxAsync(path).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal(rows[0].InDate, new DateTime(2021, 01, 04)); @@ -294,7 +297,7 @@ private class Issue241Dto { public string Name { get; set; } - [ExcelFormat("MM dd, yyyy")] + [MiniExcelFormat("MM dd, yyyy")] public DateTime InDate { get; set; } } @@ -312,7 +315,7 @@ public async Task Issue132() new { Name ="Henry", Age=36, InDate=new DateTime(2020,05,03)}, }; - await MiniExcel.SaveAsAsync(path.ToString(), value); + await Exporter.ExportXlsxAsync(path.ToString(), value); } { @@ -326,7 +329,7 @@ public async Task Issue132() { TableStyles = TableStyles.None }; - var rowsWritten = await MiniExcel.SaveAsAsync(path.ToString(), value, configuration: config); + var rowsWritten = await Exporter.ExportXlsxAsync(path.ToString(), value, configuration: config); Assert.Single(rowsWritten); Assert.Equal(2, rowsWritten[0]); @@ -341,7 +344,7 @@ public async Task Issue132() new { Name ="Henry", Age=36,InDate=new DateTime(2020,05,03)}, }) ); - var rowsWritten = await MiniExcel.SaveAsAsync(path.ToString(), value); + var rowsWritten = await Exporter.ExportXlsxAsync(path.ToString(), value); Assert.Single(rowsWritten); Assert.Equal(2, rowsWritten[0]); @@ -366,16 +369,16 @@ public async Task Issue235() department.TableName = "department"; sheets.Tables.Add(department); - var rowsWritten = await MiniExcel.SaveAsAsync(path, sheets); + var rowsWritten = await Exporter.ExportXlsxAsync(path, sheets); Assert.Equal(2, rowsWritten.Length); Assert.Equal(2, rowsWritten[0]); - var sheetNames = MiniExcel.GetSheetNames(path); + var sheetNames = await Importer.GetSheetNamesAsync(path); Assert.Equal("users", sheetNames[0]); Assert.Equal("department", sheetNames[1]); { - var q = MiniExcel.QueryAsync(path, true, sheetName: "users").ToBlockingEnumerable(); + var q = Importer.QueryXlsxAsync(path, true, sheetName: "users").ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal("Jack", rows[0].Name); Assert.Equal(25, rows[0].Age); @@ -383,7 +386,7 @@ public async Task Issue235() Assert.Equal(44, rows[1].Age); } { - var q = MiniExcel.QueryAsync(path, true, sheetName: "department").ToBlockingEnumerable(); + var q = Importer.QueryXlsxAsync(path, true, sheetName: "department").ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal("01", rows[0].ID); Assert.Equal("HR", rows[0].Name); @@ -400,9 +403,9 @@ public async Task Issue233() { var path = PathHelper.GetFile("xlsx/TestIssue233.xlsx"); -#pragma warning disable CS0618 // Type or member is obsolete - var dt = await MiniExcel.QueryAsDataTableAsync(path); -#pragma warning restore CS0618 // Type or member is obsolete + + var dt = await Importer.QueryXlsxAsDataTableAsync(path); + var rows = dt.Rows; @@ -417,15 +420,15 @@ public async Task Issue233() [Fact] public async Task Issue237() { - using var path = AutoDeletingPath.Create(ExcelType.CSV); + using var path = AutoDeletingPath.Create(ExcelType.Csv); var value = new[] { new{ id="\"\"1,2,3\"\""}, new{ id="1,2,3"}, }; - await MiniExcel.SaveAsAsync(path.ToString(), value); + await Exporter.ExportXlsxAsync(path.ToString(), value); - var q = MiniExcel.QueryAsync(path.ToString(), true).ToBlockingEnumerable(); + var q = Importer.QueryXlsxAsync(path.ToString(), true).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal("\"\"1,2,3\"\"", rows[0].id); @@ -456,18 +459,18 @@ public async Task Issue234() ["users"] = users, ["department"] = department }; - var rowsWritten = await MiniExcel.SaveAsAsync(path, sheets); + var rowsWritten = await Exporter.ExportXlsxAsync(path, sheets); Assert.Equal(2, rowsWritten.Length); Assert.Equal(2, rowsWritten[0]); - var sheetNames = MiniExcel.GetSheetNames(path); + var sheetNames = Importer.GetSheetNames(path); Assert.Equal("users", sheetNames[0]); Assert.Equal("department", sheetNames[1]); { - var q = MiniExcel.QueryAsync(path, true, sheetName: "users").ToBlockingEnumerable(); + var q = Importer.QueryXlsxAsync(path, true, sheetName: "users").ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal("Jack", rows[0].Name); @@ -476,7 +479,7 @@ public async Task Issue234() Assert.Equal(44, rows[1].Age); } { - var q = MiniExcel.QueryAsync(path, true, sheetName: "department").ToBlockingEnumerable(); + var q = Importer.QueryXlsxAsync(path, true, sheetName: "department").ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal("01", rows[0].ID); @@ -535,12 +538,12 @@ public async Task Issue230() await using (var reader = await cmd3.ExecuteReaderAsync(CommandBehavior.CloseConnection)) { using var path = AutoDeletingPath.Create(); - var rowsWritten = await MiniExcel.SaveAsAsync(path.ToString(), reader, printHeader: true); + var rowsWritten = await Exporter.ExportXlsxAsync(path.ToString(), reader, printHeader: true); Assert.Single(rowsWritten); Assert.Equal(2, rowsWritten[0]); - var q = MiniExcel.QueryAsync(path.ToString(), true).ToBlockingEnumerable(); + var q = Importer.QueryXlsxAsync(path.ToString(), true).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal(1, rows[0].id); @@ -557,9 +560,7 @@ public async Task Issue229() { var path = PathHelper.GetFile("xlsx/TestIssue229.xlsx"); -#pragma warning disable CS0618 // Type or member is obsolete - var dt = await MiniExcel.QueryAsDataTableAsync(path); -#pragma warning restore CS0618 // Type or member is obsolete + var dt = await Importer.QueryXlsxAsDataTableAsync(path); foreach (DataColumn column in dt.Columns) { @@ -581,7 +582,7 @@ public Task Issue122() }; var path1 = PathHelper.GetFile("xlsx/TestIssue122.xlsx"); - var rows1 = MiniExcel.QueryAsync(path1, useHeaderRow: true, configuration: config).ToBlockingEnumerable().ToList(); + var rows1 = Importer.QueryXlsxAsync(path1, useHeaderRow: true, configuration: config).ToBlockingEnumerable().ToList(); Assert.Equal("HR", rows1[0].Department); Assert.Equal("HR", rows1[1].Department); @@ -591,7 +592,7 @@ public Task Issue122() Assert.Equal("IT", rows1[5].Department); var path2 = PathHelper.GetFile("xlsx/TestIssue122_2.xlsx"); - var rows2 = MiniExcel.QueryAsync(path2, useHeaderRow: true, configuration: config).ToBlockingEnumerable().ToList(); + var rows2 = Importer.QueryXlsxAsync(path2, useHeaderRow: true, configuration: config).ToBlockingEnumerable().ToList(); Assert.Equal("V1", rows2[2].Test1); Assert.Equal("V2", rows2[5].Test2); @@ -612,14 +613,14 @@ public async Task Issue227() { { var path = PathHelper.GetTempPath("xlsm"); - Assert.Throws(() => MiniExcel.SaveAs(path, new[] { new { V = "A1" }, new { V = "A2" } })); + Assert.Throws(() => Exporter.ExportXlsx(path, new[] { new { V = "A1" }, new { V = "A2" } })); File.Delete(path); } { var path = PathHelper.GetFile("xlsx/TestIssue227.xlsm"); { - var q = MiniExcel.QueryAsync(path).ToBlockingEnumerable(); + var q = Importer.QueryXlsxAsync(path).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal(100, rows.Count); @@ -633,7 +634,7 @@ public async Task Issue227() } { await using var stream = File.OpenRead(path); - var q = stream.QueryAsync().ToBlockingEnumerable(); + var q = Importer.QueryXlsxAsync(stream).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal(100, rows.Count); @@ -657,7 +658,7 @@ public async Task Issue226() { using var path = AutoDeletingPath.Create(); var templatePath = PathHelper.GetFile("xlsx/TestIssue226.xlsx"); - await MiniExcel.SaveAsByTemplateAsync(path.ToString(), templatePath, new { employees = new[] { new { name = "123" }, new { name = "123" } } }); + await Templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, new { employees = new[] { new { name = "123" }, new { name = "123" } } }); Assert.Equal("A1:A3", Helpers.GetFirstSheetDimensionRefValue(path.ToString())); } @@ -675,12 +676,12 @@ public async Task Issue223() new() { { "A", Guid.NewGuid() }, { "B", "HelloWorld" } } ]; using var path = AutoDeletingPath.Create(); - var rowsWritten = await MiniExcel.SaveAsAsync(path.ToString(), value); + var rowsWritten = await Exporter.ExportXlsxAsync(path.ToString(), value); Assert.Single(rowsWritten); Assert.Equal(3, rowsWritten[0]); -#pragma warning disable CS0618 // Type or member is obsolete - var dt = await MiniExcel.QueryAsDataTableAsync(path.ToString()); + + var dt = await Importer.QueryXlsxAsDataTableAsync(path.ToString()); #pragma warning restore CS0618 var columns = dt.Columns; Assert.Equal(typeof(object), columns[0].DataType); @@ -698,7 +699,7 @@ public async Task Issue223() public async Task Issue222() { var path = PathHelper.GetFile("xlsx/TestIssue222.xlsx"); - var q = MiniExcel.QueryAsync(path).ToBlockingEnumerable(); + var q = Importer.QueryXlsxAsync(path).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal(typeof(DateTime), rows[1].A.GetType()); Assert.Equal(new DateTime(2021, 4, 29), rows[1].A); @@ -713,7 +714,7 @@ public async Task Issue147() { { var path = PathHelper.GetFile("xlsx/TestIssue147.xlsx"); - var q = MiniExcel.QueryAsync(path, useHeaderRow: false, startCell: "C3", sheetName: "Sheet1").ToBlockingEnumerable(); + var q = Importer.QueryXlsxAsync(path, useHeaderRow: false, startCell: "C3", sheetName: "Sheet1").ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal(["C", "D", "E"], (rows[0] as IDictionary)?.Keys); @@ -729,13 +730,13 @@ public async Task Issue147() } Assert.Equal(11, rows.Count); - var columns = MiniExcel.GetColumns(path, startCell: "C3"); + var columns = await Importer.GetXlsxColumnsAsync(path, startCell: "C3"); Assert.Equal(["C", "D", "E"], columns); } { var path = PathHelper.GetFile("xlsx/TestIssue147.xlsx"); - var q = MiniExcel.QueryAsync(path, useHeaderRow: true, startCell: "C3", sheetName: "Sheet1").ToBlockingEnumerable(); + var q = Importer.QueryXlsxAsync(path, useHeaderRow: true, startCell: "C3", sheetName: "Sheet1").ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal(["Column1", "Column2", "Column3"], (rows[0] as IDictionary)?.Keys); @@ -750,7 +751,7 @@ public async Task Issue147() } Assert.Equal(10, rows.Count); - var columns = MiniExcel.GetColumns(path, useHeaderRow: true, startCell: "C3"); + var columns = await Importer.GetXlsxColumnsAsync(path, useHeaderRow: true, startCell: "C3"); Assert.Equal(["Column1", "Column2", "Column3"], columns); } } @@ -770,11 +771,11 @@ public async Task Issue211() await using var connection = new SQLiteConnection(connectionString); using var reader = await connection.ExecuteReaderAsync("select 1 Test1,2 Test2 union all select 3 , 4 union all select 5 ,6"); - var rowsWritten = await MiniExcel.SaveAsAsync(path.ToString(), reader); + var rowsWritten = await Exporter.ExportXlsxAsync(path.ToString(), reader); Assert.Single(rowsWritten); Assert.Equal(3, rowsWritten[0]); - var q = MiniExcel.QueryAsync(path.ToString(), true).ToBlockingEnumerable(); + var q = Importer.QueryXlsxAsync(path.ToString(), true).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal(1.0, rows[0].Test1); Assert.Equal(2.0, rows[0].Test2); @@ -797,11 +798,11 @@ public async Task EmptyDataReaderIssue() await using var connection2 = new SQLiteConnection(connectionString); using var reader = await connection2.ExecuteReaderAsync("SELECT * FROM test"); - var rowsWritten = await MiniExcel.SaveAsAsync(path.ToString(), reader); + var rowsWritten = await Exporter.ExportXlsxAsync(path.ToString(), reader); Assert.Single(rowsWritten); Assert.Equal(0, rowsWritten[0]); - var q = MiniExcel.QueryAsync(path.ToString(), true).ToBlockingEnumerable(); + var q = Importer.QueryXlsxAsync(path.ToString(), true).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Empty(rows); } @@ -814,15 +815,12 @@ public async Task Issue216() { using var path = AutoDeletingPath.Create(); var value = new[] { new { Test1 = "1", Test2 = 2 }, new { Test1 = "3", Test2 = 4 } }; - var rowsWritten = await MiniExcel.SaveAsAsync(path.ToString(), value); + var rowsWritten = await Exporter.ExportXlsxAsync(path.ToString(), value); Assert.Single(rowsWritten); Assert.Equal(2, rowsWritten[0]); { -#pragma warning disable CS0618 // Type or member is obsolete - var table = await MiniExcel.QueryAsDataTableAsync(path.ToString()); -#pragma warning restore CS0618 // Type or member is obsolete - + var table = await Importer.QueryXlsxAsDataTableAsync(path.ToString()); Assert.Equal("Test1", table.Columns[0].ColumnName); Assert.Equal("Test2", table.Columns[1].ColumnName); Assert.Equal("1", table.Rows[0]["Test1"]); @@ -832,10 +830,7 @@ public async Task Issue216() } { -#pragma warning disable CS0618 // Type or member is obsolete - var dt = await MiniExcel.QueryAsDataTableAsync(path.ToString(), false); -#pragma warning restore CS0618 - + var dt = await Importer.QueryXlsxAsDataTableAsync(path.ToString(), false); Assert.Equal("Test1", dt.Rows[0]["A"]); Assert.Equal("Test2", dt.Rows[0]["B"]); Assert.Equal("1", dt.Rows[1]["A"]); @@ -855,9 +850,9 @@ public async Task IssueI3OSKV() { using var path = AutoDeletingPath.Create(); var value = new[] { new { Test = "12345678901234567890" } }; - await MiniExcel.SaveAsAsync(path.ToString(), value); + await Exporter.ExportXlsxAsync(path.ToString(), value); - var q = MiniExcel.QueryAsync(path.ToString(), true).ToBlockingEnumerable(); + var q = Importer.QueryXlsxAsync(path.ToString(), true).ToBlockingEnumerable(); var A2 = q.First().Test; Assert.Equal("12345678901234567890", A2); } @@ -865,9 +860,9 @@ public async Task IssueI3OSKV() { using var path = AutoDeletingPath.Create(); var value = new[] { new { Test = 123456.789 } }; - await MiniExcel.SaveAsAsync(path.ToString(), value); + await Exporter.ExportXlsxAsync(path.ToString(), value); - var q = MiniExcel.QueryAsync(path.ToString(), true).ToBlockingEnumerable(); + var q = Importer.QueryXlsxAsync(path.ToString(), true).ToBlockingEnumerable(); var A2 = q.First().Test; Assert.Equal(123456.789, A2); } @@ -881,7 +876,7 @@ public async Task IssueI3OSKV() public async Task Issue220() { var path = PathHelper.GetFile("xlsx/TestIssue220.xlsx"); - var rows = MiniExcel.QueryAsync(path, useHeaderRow: true).ToBlockingEnumerable(); + var rows = Importer.QueryXlsxAsync(path, useHeaderRow: true).ToBlockingEnumerable(); var result = rows .GroupBy(s => s.PRT_ID) .Select(g => new @@ -905,9 +900,9 @@ public async Task Issue220() public async Task Issue215() { await using var stream = new MemoryStream(); - await stream.SaveAsAsync(new[] { new { V = "test1" }, new { V = "test2" } }); + await Exporter.ExportXlsxAsync(stream, new[] { new { V = "test1" }, new { V = "test2" } }); - var q = (stream.QueryAsync(true).ToBlockingEnumerable()).Cast>(); + var q = Importer.QueryXlsxAsync(stream, true).ToBlockingEnumerable().Cast>(); var rows = q.ToList(); Assert.Equal("test1", rows[0]["V"]); @@ -937,7 +932,7 @@ public async Task Issue89() await writer.FlushAsync(); stream.Position = 0; - var q = stream.QueryAsync(excelType: ExcelType.CSV).ToBlockingEnumerable(); + var q = Importer.QueryCsvAsync(stream).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal(Issue89VO.WorkState.OnDuty, rows[0].State); @@ -945,11 +940,11 @@ public async Task Issue89() Assert.Equal(Issue89VO.WorkState.Leave, rows[2].State); var outputPath = PathHelper.GetTempPath("xlsx"); - var rowsWritten = await MiniExcel.SaveAsAsync(outputPath, rows); + var rowsWritten = await Exporter.ExportXlsxAsync(outputPath, rows); Assert.Single(rowsWritten); Assert.Equal(3, rowsWritten[0]); - var q2 = MiniExcel.QueryAsync(outputPath).ToBlockingEnumerable(); + var q2 = Importer.QueryXlsxAsync(outputPath).ToBlockingEnumerable(); var rows2 = q2.ToList(); Assert.Equal(Issue89VO.WorkState.OnDuty, rows2[0].State); Assert.Equal(Issue89VO.WorkState.Fired, rows2[1].State); @@ -959,18 +954,18 @@ public async Task Issue89() //xlsx { var path = PathHelper.GetFile("xlsx/TestIssue89.xlsx"); - var q = MiniExcel.QueryAsync(path).ToBlockingEnumerable(); + var q = Importer.QueryXlsxAsync(path).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal(Issue89VO.WorkState.OnDuty, rows[0].State); Assert.Equal(Issue89VO.WorkState.Fired, rows[1].State); Assert.Equal(Issue89VO.WorkState.Leave, rows[2].State); var outputPath = PathHelper.GetTempPath(); - var rowsWritten = await MiniExcel.SaveAsAsync(outputPath, rows); + var rowsWritten = await Exporter.ExportXlsxAsync(outputPath, rows); Assert.Single(rowsWritten); Assert.Equal(3, rowsWritten[0]); - var q1 = MiniExcel.QueryAsync(outputPath).ToBlockingEnumerable(); + var q1 = Importer.QueryXlsxAsync(outputPath).ToBlockingEnumerable(); var rows2 = q1.ToList(); Assert.Equal(Issue89VO.WorkState.OnDuty, rows2[0].State); Assert.Equal(Issue89VO.WorkState.Fired, rows2[1].State); @@ -1007,11 +1002,11 @@ public async Task Issue217() // openxml { using var path = AutoDeletingPath.Create(); - var rowsWritten = await MiniExcel.SaveAsAsync(path.ToString(), table); + var rowsWritten = await Exporter.ExportXlsxAsync(path.ToString(), table); Assert.Single(rowsWritten); Assert.Equal(2, rowsWritten[0]); - var q = MiniExcel.QueryAsync(path.ToString()).ToBlockingEnumerable(); + var q = Importer.QueryXlsxAsync(path.ToString()).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal("Name", rows[0].B); Assert.Equal("Limit", rows[0].C); @@ -1019,10 +1014,10 @@ public async Task Issue217() // csv { - using var path = AutoDeletingPath.Create(ExcelType.CSV); - await MiniExcel.SaveAsAsync(path.ToString(), table); + using var path = AutoDeletingPath.Create(ExcelType.Csv); + await Exporter.ExportXlsxAsync(path.ToString(), table); - var q = MiniExcel.QueryAsync(path.ToString()).ToBlockingEnumerable(); + var q = Importer.QueryXlsxAsync(path.ToString()).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal("Name", rows[0].B); Assert.Equal("Limit", rows[0].C); @@ -1030,7 +1025,7 @@ public async Task Issue217() } /// - /// MiniExcel.SaveAs(path, table,sheetName:“Name”) ,the actual sheetName is Sheet1 + /// _exporter.ExportXlsx(path, table,sheetName:“Name”) ,the actual sheetName is Sheet1 /// https://github.com/mini-software/MiniExcel/issues/212 /// [Fact] @@ -1039,9 +1034,9 @@ public async Task Issue212() const string sheetName = "Demo"; using var path = AutoDeletingPath.Create(); - await MiniExcel.SaveAsAsync(path.ToString(), new[] { new { x = 1, y = 2 } }, sheetName: sheetName); + await Exporter.ExportXlsxAsync(path.ToString(), new[] { new { x = 1, y = 2 } }, sheetName: sheetName); - var actualSheetName = MiniExcel.GetSheetNames(path.ToString()).ToList()[0]; + var actualSheetName = Importer.GetSheetNames(path.ToString()).ToList()[0]; Assert.Equal(sheetName, actualSheetName); } @@ -1068,8 +1063,8 @@ public async Task Issue207() } }; - await MiniExcel.SaveAsByTemplateAsync(path, templatePath, value); - var q = MiniExcel.QueryAsync(path).ToBlockingEnumerable(); + await Templater.ApplyXlsxTemplateAsync(path, templatePath, value); + var q = Importer.QueryXlsxAsync(path).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal("項目1", rows[0].A); @@ -1114,9 +1109,9 @@ public async Task Issue207() } }; - await MiniExcel.SaveAsByTemplateAsync(path, templatePath, value); + await Templater.ApplyXlsxTemplateAsync(path, templatePath, value); - var q = MiniExcel.QueryAsync(path).ToBlockingEnumerable(); + var q = Importer.QueryXlsxAsync(path).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal("項目1", rows[0].A); Assert.Equal("[]內容1,[]內容2,[]內容3,[]內容4,[]內容5", rows[0].C); @@ -1146,10 +1141,10 @@ public async Task Issue87() }; await using var stream = File.OpenRead(templatePath); - var q = MiniExcel.QueryAsync(templatePath).ToBlockingEnumerable(); + var q = Importer.QueryXlsxAsync(templatePath).ToBlockingEnumerable(); var rows = q.ToList(); - await MiniExcel.SaveAsByTemplateAsync(path.ToString(), templatePath, value); + await Templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); } /// @@ -1171,7 +1166,7 @@ public async Task Issue206() { ["employees"] = dt }; - await MiniExcel.SaveAsByTemplateAsync(path.ToString(), templatePath, value); + await Templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); var dimension = Helpers.GetFirstSheetDimensionRefValue(path.ToString()); Assert.Equal("A1:B2", dimension); @@ -1187,7 +1182,7 @@ public async Task Issue206() dt.Rows.Add("Jack", "HR"); } var value = new Dictionary { ["employees"] = dt }; - await MiniExcel.SaveAsByTemplateAsync(path.ToString(), templatePath, value); + await Templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); var dimension = Helpers.GetFirstSheetDimensionRefValue(path.ToString()); Assert.Equal("A1:B2", dimension); @@ -1223,11 +1218,11 @@ public async Task Issue193() new {name="Keaton",department="IT"} } }; - await MiniExcel.SaveAsByTemplateAsync(path, templatePath, value); + await Templater.ApplyXlsxTemplateAsync(path, templatePath, value); - foreach (var sheetName in MiniExcel.GetSheetNames(path)) + foreach (var sheetName in Importer.GetSheetNames(path)) { - var q = MiniExcel.QueryAsync(path, sheetName: sheetName).ToBlockingEnumerable(); + var q = Importer.QueryXlsxAsync(path, sheetName: sheetName).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal(9, rows.Count); @@ -1278,9 +1273,9 @@ public async Task Issue193() new {name="Keaton",department="IT"} } }; - await MiniExcel.SaveAsByTemplateAsync(path, templatePath, value); + await Templater.ApplyXlsxTemplateAsync(path, templatePath, value); - var q = MiniExcel.QueryAsync(path).ToBlockingEnumerable(); + var q = Importer.QueryXlsxAsync(path).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal("FooCompany", rows[0].A); Assert.Equal("Jack", rows[2].B); @@ -1309,10 +1304,10 @@ public async Task Issue142() { using var file = AutoDeletingPath.Create(); var path = file.ToString(); - await MiniExcel.SaveAsAsync(path, new[] { new Issue142VO { MyProperty1 = "MyProperty1", MyProperty2 = "MyProperty2", MyProperty3 = "MyProperty3", MyProperty4 = "MyProperty4", MyProperty5 = "MyProperty5", MyProperty6 = "MyProperty6", MyProperty7 = "MyProperty7" } }); + await Exporter.ExportXlsxAsync(path, new[] { new Issue142VO { MyProperty1 = "MyProperty1", MyProperty2 = "MyProperty2", MyProperty3 = "MyProperty3", MyProperty4 = "MyProperty4", MyProperty5 = "MyProperty5", MyProperty6 = "MyProperty6", MyProperty7 = "MyProperty7" } }); { - var q = MiniExcel.QueryAsync(path).ToBlockingEnumerable(); + var q = Importer.QueryXlsxAsync(path).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal("MyProperty4", rows[0].A); Assert.Equal("CustomColumnName", rows[0].B); //note @@ -1332,7 +1327,7 @@ public async Task Issue142() } { - var q = MiniExcel.QueryAsync(path).ToBlockingEnumerable(); + var q = Importer.QueryXlsxAsync(path).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal("MyProperty4", rows[0].MyProperty4); @@ -1346,9 +1341,9 @@ public async Task Issue142() } { - using var file = AutoDeletingPath.Create(ExcelType.CSV); + using var file = AutoDeletingPath.Create(ExcelType.Csv); var path = file.ToString(); - await MiniExcel.SaveAsAsync(path, new [] { new Issue142VO { MyProperty1 = "MyProperty1", MyProperty2 = "MyProperty2", MyProperty3 = "MyProperty3", MyProperty4 = "MyProperty4", MyProperty5 = "MyProperty5", MyProperty6 = "MyProperty6", MyProperty7 = "MyProperty7" } }); + await Exporter.ExportCsvAsync(path, new [] { new Issue142VO { MyProperty1 = "MyProperty1", MyProperty2 = "MyProperty2", MyProperty3 = "MyProperty3", MyProperty4 = "MyProperty4", MyProperty5 = "MyProperty5", MyProperty6 = "MyProperty6", MyProperty7 = "MyProperty7" } }); const string expected = """ MyProperty4,CustomColumnName,MyProperty5,MyProperty2,MyProperty6,,MyProperty3 @@ -1358,7 +1353,7 @@ public async Task Issue142() Assert.Equal(expected, await File.ReadAllTextAsync(path)); { - var q = MiniExcel.QueryAsync(path).ToBlockingEnumerable(); + var q = Importer.QueryCsvAsync(path).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal("MyProperty4", rows[0].MyProperty4); @@ -1374,7 +1369,7 @@ public async Task Issue142() { using var path = AutoDeletingPath.Create(); Issue142VoDuplicateColumnName[] input = [ new() { MyProperty1 = 0, MyProperty2 = 0, MyProperty3 = 0, MyProperty4 = 0 } ]; - Assert.Throws(() => MiniExcel.SaveAs(path.ToString(), input)); + Assert.Throws(() => Exporter.ExportXlsx(path.ToString(), input)); } } @@ -1384,19 +1379,19 @@ public async Task Issue142_Query() const string path = "../../../../../samples/xlsx/TestIssue142.xlsx"; const string pathCsv = "../../../../../samples/xlsx/TestIssue142.csv"; { - var rows = MiniExcel.QueryAsync(path).ToBlockingEnumerable().ToList(); + var rows = Importer.QueryXlsxAsync(path).ToBlockingEnumerable().ToList(); Assert.Equal(0, rows[0].MyProperty1); } { await Assert.ThrowsAsync(async () => { - var q = MiniExcel.QueryAsync(path).ToBlockingEnumerable().ToList(); + var q = Importer.QueryXlsxAsync(path).ToBlockingEnumerable().ToList(); }); } { - var q = MiniExcel.QueryAsync(path).ToBlockingEnumerable(); + var q = Importer.QueryXlsxAsync(path).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal("CustomColumnName", rows[0].MyProperty1); Assert.Null(rows[0].MyProperty7); @@ -1408,7 +1403,7 @@ await Assert.ThrowsAsync(async () => } { - var q = MiniExcel.QueryAsync(path).ToBlockingEnumerable(); + var q = Importer.QueryXlsxAsync(path).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal("CustomColumnName", rows[0].MyProperty1); Assert.Null(rows[0].MyProperty7); @@ -1422,41 +1417,41 @@ await Assert.ThrowsAsync(async () => private class Issue142VO { - [ExcelColumnName("CustomColumnName")] + [MiniExcelColumnName("CustomColumnName")] public string MyProperty1 { get; set; } //index = 1 - [ExcelIgnore] + [MiniExcelIgnore] public string MyProperty7 { get; set; } //index = null public string MyProperty2 { get; set; } //index = 3 - [ExcelColumnIndex(6)] + [MiniExcelColumnIndex(6)] public string MyProperty3 { get; set; } //index = 6 - [ExcelColumnIndex("A")] // equal column index 0 + [MiniExcelColumnIndex("A")] // equal column index 0 public string MyProperty4 { get; set; } - [ExcelColumnIndex(2)] + [MiniExcelColumnIndex(2)] public string MyProperty5 { get; set; } //index = 2 public string MyProperty6 { get; set; } //index = 4 } private class Issue142VoDuplicateColumnName { - [ExcelColumnIndex("A")] + [MiniExcelColumnIndex("A")] public int MyProperty1 { get; set; } - [ExcelColumnIndex("A")] + [MiniExcelColumnIndex("A")] public int MyProperty2 { get; set; } public int MyProperty3 { get; set; } - [ExcelColumnIndex("B")] + [MiniExcelColumnIndex("B")] public int MyProperty4 { get; set; } } private class Issue142VoOverIndex { - [ExcelColumnIndex("Z")] + [MiniExcelColumnIndex("Z")] public int MyProperty1 { get; set; } } private class Issue142VoExcelColumnNameNotFound { - [ExcelColumnIndex("B")] + [MiniExcelColumnIndex("B")] public int MyProperty1 { get; set; } } @@ -1468,19 +1463,19 @@ public async Task Issue150() { var path = PathHelper.GetTempFilePath(); - await Assert.ThrowsAnyAsync(async () => await MiniExcel.SaveAsAsync(path, new[] { 1, 2 })); + await Assert.ThrowsAnyAsync(async () => await Exporter.ExportXlsxAsync(path, new[] { 1, 2 })); File.Delete(path); - await Assert.ThrowsAnyAsync(async () => await MiniExcel.SaveAsAsync(path, new[] { "1", "2" })); + await Assert.ThrowsAnyAsync(async () => await Exporter.ExportXlsxAsync(path, new[] { "1", "2" })); File.Delete(path); - await Assert.ThrowsAnyAsync(async () => await MiniExcel.SaveAsAsync(path, new[] { '1', '2' })); + await Assert.ThrowsAnyAsync(async () => await Exporter.ExportXlsxAsync(path, new[] { '1', '2' })); File.Delete(path); - await Assert.ThrowsAnyAsync(async () => await MiniExcel.SaveAsAsync(path, new[] { DateTime.Now })); + await Assert.ThrowsAnyAsync(async () => await Exporter.ExportXlsxAsync(path, new[] { DateTime.Now })); File.Delete(path); - await Assert.ThrowsAnyAsync(async () => await MiniExcel.SaveAsAsync(path, new[] { Guid.NewGuid() })); + await Assert.ThrowsAnyAsync(async () => await Exporter.ExportXlsxAsync(path, new[] { Guid.NewGuid() })); File.Delete(path); } @@ -1495,7 +1490,7 @@ public async Task Issue157() var path = file.ToString(); _output.WriteLine("==== SaveAs by strongly type ===="); - var input = JsonConvert.DeserializeObject>( + var input = JsonConvert.DeserializeObject>( """ [ { @@ -1545,14 +1540,14 @@ public async Task Issue157() } ] """); - var rowsWritten = await MiniExcel.SaveAsAsync(path, input); + var rowsWritten = await Exporter.ExportXlsxAsync(path, input); Assert.Single(rowsWritten); Assert.Equal(5, rowsWritten[0]); - var q = MiniExcel.QueryAsync(path, sheetName: "Sheet1").ToBlockingEnumerable(); + var q = Importer.QueryXlsxAsync(path, sheetName: "Sheet1").ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal(6, rows.Count); - Assert.Equal("Sheet1", MiniExcel.GetSheetNames(path).First()); + Assert.Equal("Sheet1", Importer.GetSheetNames(path).First()); using var p = new ExcelPackage(new FileInfo(path)); var ws = p.Workbook.Worksheets.First(); @@ -1562,10 +1557,10 @@ public async Task Issue157() { const string path = "../../../../../samples/xlsx/TestIssue157.xlsx"; { - var q = MiniExcel.QueryAsync(path, sheetName: "Sheet1").ToBlockingEnumerable(); + var q = Importer.QueryXlsxAsync(path, sheetName: "Sheet1").ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal(6, rows.Count); - Assert.Equal("Sheet1", MiniExcel.GetSheetNames(path).First()); + Assert.Equal("Sheet1", Importer.GetSheetNames(path).First()); } using (var p = new ExcelPackage(new FileInfo(path))) { @@ -1575,7 +1570,7 @@ public async Task Issue157() } { - var q = MiniExcel.QueryAsync(path, sheetName: "Sheet1").ToBlockingEnumerable(); + var q = Importer.QueryXlsxAsync(path, sheetName: "Sheet1").ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal(5, rows.Count); @@ -1609,7 +1604,7 @@ public async Task Issue149() { const string path = "../../../../../samples/xlsx/TestIssue149.xlsx"; - var q = MiniExcel.QueryAsync(path).ToBlockingEnumerable(); + var q = Importer.QueryXlsxAsync(path).ToBlockingEnumerable(); var rows = q.Select(s => (string)s.A).ToList(); for (int i = 0; i < chars.Length; i++) @@ -1626,9 +1621,9 @@ public async Task Issue149() var path = file.ToString(); var input = chars.Select(s => new { Test = s.ToString() }); - await MiniExcel.SaveAsAsync(path, input); + await Exporter.ExportXlsxAsync(path, input); - var q = MiniExcel.QueryAsync(path, true).ToBlockingEnumerable(); + var q = Importer.QueryXlsxAsync(path, true).ToBlockingEnumerable(); var rows = q.Select(s => (string)s.Test).ToList(); for (int i = 0; i < chars.Length; i++) @@ -1646,9 +1641,9 @@ public async Task Issue149() var path = file.ToString(); var input = chars.Select(s => new { Test = s.ToString() }); - await MiniExcel.SaveAsAsync(path, input); + await Exporter.ExportXlsxAsync(path, input); - var q = MiniExcel.QueryAsync(path).ToBlockingEnumerable(); + var q = Importer.QueryXlsxAsync(path).ToBlockingEnumerable(); var rows = q.Select(s => s.Test).ToList(); for (int i = 0; i < chars.Length; i++) @@ -1674,7 +1669,7 @@ private class Issue149VO public async Task Issue153() { const string path = "../../../../../samples/xlsx/TestIssue153.xlsx"; - var q = MiniExcel.QueryAsync(path, true).ToBlockingEnumerable(); + var q = Importer.QueryXlsxAsync(path, true).ToBlockingEnumerable(); var rows = q.First() as IDictionary; Assert.Equal( @@ -1693,7 +1688,7 @@ public async Task Issue137() var path = "../../../../../samples/xlsx/TestIssue137.xlsx"; { - var q = MiniExcel.QueryAsync(path).ToBlockingEnumerable(); + var q = Importer.QueryXlsxAsync(path).ToBlockingEnumerable(); var rows = q.ToList(); var first = rows[0] as IDictionary; // https://user-images.githubusercontent.com/12729184/113266322-ba06e400-9307-11eb-9521-d36abfda75cc.png Assert.Equal(["A", "B", "C", "D", "E", "F", "G", "H"], first?.Keys.ToArray()); @@ -1729,7 +1724,7 @@ public async Task Issue137() // dynamic query with head { - var q = MiniExcel.QueryAsync(path, true).ToBlockingEnumerable(); + var q = Importer.QueryXlsxAsync(path, true).ToBlockingEnumerable(); var rows = q.ToList(); var first = rows[0] as IDictionary; // https://user-images.githubusercontent.com/12729184/113266322-ba06e400-9307-11eb-9521-d36abfda75cc.png Assert.Equal(["比例", "商品", "滿倉口數", "0", "1為港幣 0為台幣"], first?.Keys.ToArray()); @@ -1751,7 +1746,7 @@ public async Task Issue137() } { - var q = MiniExcel.QueryAsync(path).ToBlockingEnumerable(); + var q = Importer.QueryXlsxAsync(path).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal(10, rows.Count); @@ -1785,7 +1780,7 @@ public async Task Issue138() { const string path = "../../../../../samples/xlsx/TestIssue138.xlsx"; { - var q = MiniExcel.QueryAsync(path, true).ToBlockingEnumerable(); + var q = Importer.QueryXlsxAsync(path, true).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal(6, rows.Count); @@ -1811,7 +1806,7 @@ public async Task Issue138() } { - var q = MiniExcel.QueryAsync(path).ToBlockingEnumerable(); + var q = Importer.QueryXlsxAsync(path).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal(6, rows.Count); Assert.Equal(new DateTime(2021, 3, 1), rows[0].Date); diff --git a/tests/MiniExcelTests/MiniExcelIssueTests.cs b/tests/MiniExcelTests/MiniExcelIssueTests.cs index 9181a16e..ebdb1f45 100644 --- a/tests/MiniExcelTests/MiniExcelIssueTests.cs +++ b/tests/MiniExcelTests/MiniExcelIssueTests.cs @@ -1,34 +1,33 @@ -using Dapper; -using MiniExcelLibs.Attributes; -using MiniExcelLibs.Csv; -using MiniExcelLibs.Exceptions; -using MiniExcelLibs.OpenXml; -using MiniExcelLibs.Tests.Utils; -using Newtonsoft.Json; -using NPOI.XSSF.UserModel; -using OfficeOpenXml; -using System.Collections; +using System.Collections; using System.ComponentModel; using System.Data; using System.Data.SQLite; using System.Globalization; using System.Text; using System.Text.RegularExpressions; -using MiniExcelLibs.Utils; +using Dapper; +using MiniExcelLib.Core.Attributes; +using MiniExcelLib.Core.Exceptions; +using MiniExcelLib.Core.OpenXml; +using MiniExcelLib.Core.OpenXml.Picture; +using MiniExcelLib.Core.OpenXml.Utils; +using MiniExcelLib.Csv; +using MiniExcelLib.Tests.Utils; +using Importer = MiniExcelLib.MiniExcel.Importer; +using Exporter = MiniExcelLib.MiniExcel.Exporter; +using Templater = MiniExcelLib.MiniExcel.Templater; +using Newtonsoft.Json; +using NPOI.XSSF.UserModel; +using OfficeOpenXml; using Xunit; using Xunit.Abstractions; -using static MiniExcelLibs.Tests.MiniExcelOpenXmlTests; -using MiniExcelLibs.Picture; -using TableStyles = MiniExcelLibs.OpenXml.TableStyles; -using System.Threading.Tasks; -using LicenseContext = OfficeOpenXml.LicenseContext; -namespace MiniExcelLibs.Tests; +namespace MiniExcelLib.Tests; public class MiniExcelIssueTests(ITestOutputHelper output) { private readonly ITestOutputHelper _output = output; - + /// /// https://github.com/mini-software/MiniExcel/issues/549 /// @@ -43,8 +42,8 @@ public void TestIssue549() using var file = AutoDeletingPath.Create(); var path = file.ToString(); - MiniExcel.SaveAs(path, data); - var rows = MiniExcel.Query(path, true).ToList(); + Exporter.ExportXlsx(path, data); + var rows = Importer.QueryXlsx(path, true).ToList(); { using var stream = new FileStream(path, FileMode.Open, FileAccess.Read); using var workbook = new XSSFWorkbook(stream); @@ -72,7 +71,7 @@ public void TestIssue24020201() new() { { "specialMark", 3 } }, } }; - MiniExcel.SaveAsByTemplate(path.ToString(), templatePath, data); + Templater.ApplyXlsxTemplate(path.ToString(), templatePath, data); } [Fact] @@ -89,9 +88,9 @@ public void TestIssue553() new{ ITM=3 } } }; - MiniExcel.SaveAsByTemplate(path.ToString(), templatePath, data); + Templater.ApplyXlsxTemplate(path.ToString(), templatePath, data); - var rows = MiniExcel.Query(path.ToString()).ToList(); + var rows = Importer.QueryXlsx(path.ToString()).ToList(); Assert.Equal(rows[2].A, 1); Assert.Equal(rows[3].A, 2); Assert.Equal(rows[4].A, 3); @@ -107,7 +106,7 @@ public void TestPR10() .Select(s => Regex.Replace(s.Replace("\"\"", "\""), "^\"|\"$", "")) .ToArray() }; - var rows = MiniExcel.Query(path, configuration: config).ToList(); + var rows = Importer.QueryCsv(path, configuration: config).ToList(); } [Fact] @@ -120,9 +119,9 @@ public void TestIssue289() new() { Name="0002", UserType=DescriptionEnum.V2 }, new() { Name="0003", UserType=DescriptionEnum.V3 } ]; - MiniExcel.SaveAs(path.ToString(), value); + Exporter.ExportXlsx(path.ToString(), value); - var rows = MiniExcel.Query(path.ToString()).ToList(); + var rows = Importer.QueryXlsx(path.ToString()).ToList(); Assert.Equal(DescriptionEnum.V1, rows[0].UserType); Assert.Equal(DescriptionEnum.V2, rows[1].UserType); @@ -148,7 +147,7 @@ private enum DescriptionEnum [Fact] public void TestIssueI4X92G() { - using var file = AutoDeletingPath.Create(ExcelType.CSV); + using var file = AutoDeletingPath.Create(ExcelType.Csv); var path = file.ToString(); { @@ -157,7 +156,7 @@ public void TestIssueI4X92G() new { ID = 1, Name = "Jack", InDate = new DateTime(2021,01,03)}, new { ID = 2, Name = "Henry", InDate = new DateTime(2020,05,03)} }; - MiniExcel.SaveAs(path, value); + Exporter.ExportCsv(path, value); var content = File.ReadAllText(path); Assert.Equal( """ @@ -170,7 +169,7 @@ public void TestIssueI4X92G() } { var value = new { ID = 3, Name = "Mike", InDate = new DateTime(2021, 04, 23) }; - var rowsWritten = MiniExcel.Insert(path, value); + var rowsWritten = Exporter.AppendToCsv(path, value); Assert.Equal(1, rowsWritten); var content = File.ReadAllText(path); @@ -190,7 +189,7 @@ public void TestIssueI4X92G() new { ID=4,Name ="Frank",InDate=new DateTime(2021,06,07)}, new { ID=5,Name ="Gloria",InDate=new DateTime(2022,05,03)}, }; - var rowsWritten = MiniExcel.Insert(path, value); + var rowsWritten = Exporter.AppendToCsv(path, value); Assert.Equal(2, rowsWritten); var content = File.ReadAllText(path); @@ -210,7 +209,7 @@ public void TestIssueI4X92G() /// - /// Exception : MiniExcelLibs.Exceptions.ExcelInvalidCastException: 'ColumnName : Date, CellRow : 2, Value : 2021-01-31 10:03:00 +08:00, it can't cast to DateTimeOffset type.' + /// Exception : MiniExcelLibs.Core.Exceptions.ExcelInvalidCastException: 'ColumnName : Date, CellRow : 2, Value : 2021-01-31 10:03:00 +08:00, it can't cast to DateTimeOffset type.' /// [Fact] public void TestIssue430() @@ -220,14 +219,14 @@ public void TestIssue430() { new TestIssue430Dto{ Date=DateTimeOffset.Parse("2021-01-31 10:03:00 +05:00")} }; - MiniExcel.SaveAs(path.ToString(), value); - var rows = MiniExcel.Query(path.ToString()).ToArray(); + Exporter.ExportXlsx(path.ToString(), value); + var rows = Importer.QueryXlsx(path.ToString()).ToArray(); Assert.Equal("2021-01-31 10:03:00 +05:00", rows[0].Date.ToString("yyyy-MM-dd HH:mm:ss zzz")); } private class TestIssue430Dto { - [ExcelFormat("yyyy-MM-dd HH:mm:ss zzz")] + [MiniExcelFormat("yyyy-MM-dd HH:mm:ss zzz")] public DateTimeOffset Date { get; set; } } @@ -244,7 +243,7 @@ public void TestIssue_DataReaderSupportDimension() using var path = AutoDeletingPath.Create(); using var reader = table.CreateDataReader(); var config = new OpenXmlConfiguration { FastMode = true }; - MiniExcel.SaveAs(path.ToString(), reader, configuration: config); + Exporter.ExportXlsx(path.ToString(), reader, configuration: config); var xml = Helpers.GetZipFileContent(path.ToString(), "xl/worksheets/sheet1.xml"); Assert.Contains("", xml); @@ -268,8 +267,8 @@ public void TestIssue413() } }; var templatePath = PathHelper.GetFile("xlsx/TestIssue413.xlsx"); - MiniExcel.SaveAsByTemplate(path.ToString(), templatePath, value); - var rows = MiniExcel.Query(path.ToString()).ToList(); + Templater.ApplyXlsxTemplate(path.ToString(), templatePath, value); + var rows = Importer.QueryXlsx(path.ToString()).ToList(); Assert.Equal("2022-12-25 00:00:00", rows[1].B); Assert.Equal("2022-09-23 00:00:00", rows[2].B); @@ -284,7 +283,7 @@ public void TestIssue405() { using var path = AutoDeletingPath.Create(); var value = new[] { new { id = 1, name = "test" } }; - MiniExcel.SaveAs(path.ToString(), value); + Exporter.ExportXlsx(path.ToString(), value); var xml = Helpers.GetZipFileContent(path.ToString(), "xl/sharedStrings.xml"); Assert.StartsWith("[] sheets = [new() { ["ID"] = "0001", ["Name"] = "Jack" }]; using var stream = new MemoryStream(); - stream.SaveAs(sheets, excelType: ExcelType.CSV); - stream.Position = 0; + + var config = new CsvConfiguration { StreamWriterFunc = x => new StreamWriter(x, Encoding.Default, leaveOpen: true)}; + Exporter.ExportCsv(stream, sheets, configuration: config); + stream.Seek(0, SeekOrigin.Begin); // convert stream to string using var reader = new StreamReader(stream); @@ -335,9 +336,9 @@ public void TestIssue370() }, Formatting.Indented); var value = JsonConvert.DeserializeObject>>(json); - MiniExcel.SaveAs(path.ToString(), value, configuration: config); + Exporter.ExportXlsx(path.ToString(), value, configuration: config); - var rows = MiniExcel.Query(path.ToString()).ToList(); + var rows = Importer.QueryXlsx(path.ToString()).ToList(); Assert.Equal("createdate", rows[0].A); Assert.Equal(new DateTime(2022, 04, 12), rows[1].A); Assert.Equal("name", rows[0].B); @@ -361,9 +362,9 @@ public void TestIssue369() }; using var path = AutoDeletingPath.Create(); var value = new[] { new { id = 1, name = "Jack", createdate = new DateTime(2022, 04, 12), point = 123.456 } }; - MiniExcel.SaveAs(path.ToString(), value, configuration: config); + Exporter.ExportXlsx(path.ToString(), value, configuration: config); - var rows = MiniExcel.Query(path.ToString()).ToList(); + var rows = Importer.QueryXlsx(path.ToString()).ToList(); Assert.Equal("createdate", rows[0].A); Assert.Equal(new DateTime(2022, 04, 12), rows[1].A); Assert.Equal("name", rows[0].B); @@ -377,9 +378,9 @@ public void TestIssueI4ZYUU() { using var path = AutoDeletingPath.Create(); TestIssueI4ZYUUDto[] value = [new() { MyProperty = "1", MyProperty2 = new DateTime(2022, 10, 15) }]; - MiniExcel.SaveAs(path.ToString(), value); + Exporter.ExportXlsx(path.ToString(), value); - var rows = MiniExcel.Query(path.ToString()).ToList(); + var rows = Importer.QueryXlsx(path.ToString()).ToList(); Assert.Equal("2022-10", rows[1].B); using var workbook = new ClosedXML.Excel.XLWorkbook(path.ToString()); @@ -391,9 +392,9 @@ public void TestIssueI4ZYUU() private class TestIssueI4ZYUUDto { - [ExcelColumn(Name = "ID", Index = 0)] + [MiniExcelColumn(Name = "ID", Index = 0)] public string MyProperty { get; set; } - [ExcelColumn(Name = "CreateDate", Index = 1, Format = "yyyy-MM", Width = 100)] + [MiniExcelColumn(Name = "CreateDate", Index = 1, Format = "yyyy-MM", Width = 100)] public DateTime MyProperty2 { get; set; } } @@ -402,10 +403,10 @@ public void TestIssue360() { var path = PathHelper.GetFile("xlsx/NotDuplicateSharedStrings_10x100.xlsx"); var config = new OpenXmlConfiguration { SharedStringCacheSize = 1 }; - var sheets = MiniExcel.GetSheetNames(path); + var sheets = Importer.GetSheetNames(path); foreach (var sheetName in sheets) { - var dt = MiniExcel.QueryAsDataTable(path, useHeaderRow: true, sheetName: sheetName, configuration: config); + var dt = Importer.QueryXlsxAsDataTable(path, useHeaderRow: true, sheetName: sheetName, configuration: config); } } @@ -442,7 +443,7 @@ public void TestIssue352() using var path = AutoDeletingPath.Create(); var reader = table.CreateDataReader(); - MiniExcel.SaveAs(path.ToString(), reader); + Exporter.ExportXlsx(path.ToString(), reader); var xml = Helpers.GetZipFileContent(path.ToString(), "xl/worksheets/sheet1.xml"); var cnt = Regex.Matches(xml, "").Count; } @@ -455,7 +456,7 @@ public void TestIssue352() using var path = AutoDeletingPath.Create(); var reader = table.CreateDataReader(); - MiniExcel.SaveAs(path.ToString(), reader, false); + Exporter.ExportXlsx(path.ToString(), reader, false); var xml = Helpers.GetZipFileContent(path.ToString(), "xl/worksheets/sheet1.xml"); var cnt = Regex.Matches(xml, "").Count; } @@ -466,7 +467,7 @@ public void TestIssue352() using var path = AutoDeletingPath.Create(); var reader = table.CreateDataReader(); - MiniExcel.SaveAs(path.ToString(), reader); + Exporter.ExportXlsx(path.ToString(), reader); var xml = Helpers.GetZipFileContent(path.ToString(), "xl/worksheets/sheet1.xml"); var cnt = Regex.Matches(xml, "").Count; } @@ -490,7 +491,7 @@ public void TestIssue401(bool autoFilter, int count) var reader = table.CreateDataReader(); using var path = AutoDeletingPath.Create(); var config = new OpenXmlConfiguration { AutoFilter = autoFilter }; - MiniExcel.SaveAs(path.ToString(), reader, configuration: config); + Exporter.ExportXlsx(path.ToString(), reader, configuration: config); var xml = Helpers.GetZipFileContent(path.ToString(), "xl/worksheets/sheet1.xml"); var cnt = Regex.Matches(xml, "").Count; @@ -507,7 +508,7 @@ public void TestIssue401(bool autoFilter, int count) var reader = table.CreateDataReader(); using var path = AutoDeletingPath.Create(); var config = new OpenXmlConfiguration { AutoFilter = autoFilter }; - MiniExcel.SaveAs(path.ToString(), reader, false, configuration: config); + Exporter.ExportXlsx(path.ToString(), reader, false, configuration: config); var xml = Helpers.GetZipFileContent(path.ToString(), "xl/worksheets/sheet1.xml"); var cnt = Regex.Matches(xml, "").Count; @@ -522,7 +523,7 @@ public void TestIssue401(bool autoFilter, int count) var reader = table.CreateDataReader(); using var path = AutoDeletingPath.Create(); var config = new OpenXmlConfiguration { AutoFilter = autoFilter }; - MiniExcel.SaveAs(path.ToString(), reader, configuration: config); + Exporter.ExportXlsx(path.ToString(), reader, configuration: config); var xml = Helpers.GetZipFileContent(path.ToString(), "xl/worksheets/sheet1.xml"); var cnt = Regex.Matches(xml, "").Count; @@ -540,7 +541,7 @@ public void TestIssue401(bool autoFilter, int count) using var command = connection.CreateCommand(); command.CommandText = """ - SELECT + SELECT 'MiniExcel' as Column1, 1 as Column2 @@ -549,7 +550,7 @@ UNION ALL """; using var reader = command.ExecuteReader(); - MiniExcel.SaveAs(path.ToString(), reader, configuration: config); + Exporter.ExportXlsx(path.ToString(), reader, configuration: config); } var xml = Helpers.GetZipFileContent(path.ToString(), "xl/worksheets/sheet1.xml"); @@ -573,7 +574,7 @@ UNION ALL using (var transaction = connection.BeginTransaction()) using (var stream = File.OpenRead(xlsxPath)) { - var rows = stream.Query(); + var rows = Importer.QueryXlsx(stream); foreach (var row in rows) connection.Execute( "insert into T (A,B) values (@A,@B)", @@ -591,7 +592,7 @@ UNION ALL using var command = new SQLiteCommand("select * from T", connection); connection.Open(); using var reader = command.ExecuteReader(); - MiniExcel.SaveAs(path.ToString(), reader, configuration: config); + Exporter.ExportXlsx(path.ToString(), reader, configuration: config); } var xml = Helpers.GetZipFileContent(path.ToString(), "xl/worksheets/sheet1.xml"); @@ -607,12 +608,12 @@ public async Task TestIssue307() var path = file.ToString(); var value = new[] { new { id = 1, name = "Jack" } }; - await MiniExcel.SaveAsAsync(path, value); - Assert.Throws(() => MiniExcel.SaveAs(path, value)); + await Exporter.ExportXlsxAsync(path, value); + Assert.Throws(() => Exporter.ExportXlsx(path, value)); - await MiniExcel.SaveAsAsync(path, value, overwriteFile: true); - await Assert.ThrowsAsync(async () => await MiniExcel.SaveAsAsync(path, value)); - await MiniExcel.SaveAsAsync(path, value, overwriteFile: true); + await Exporter.ExportXlsxAsync(path, value, overwriteFile: true); + await Assert.ThrowsAsync(async () => await Exporter.ExportXlsxAsync(path, value)); + await Exporter.ExportXlsxAsync(path, value, overwriteFile: true); } [Fact] @@ -620,8 +621,8 @@ public void TestIssue310() { using var path = AutoDeletingPath.Create(); var value = new[] { new TestIssue310Dto { V1 = null }, new TestIssue310Dto { V1 = 2 } }; - MiniExcel.SaveAs(path.ToString(), value); - var rows = MiniExcel.Query(path.ToString()).ToList(); + Exporter.ExportXlsx(path.ToString(), value); + var rows = Importer.QueryXlsx(path.ToString()).ToList(); } [Fact] @@ -633,8 +634,8 @@ public void TestIssue310Fix497() new TestIssue310Dto { V1 = null }, new TestIssue310Dto { V1 = 2 } }; - MiniExcel.SaveAs(path.ToString(), value, configuration: new OpenXmlConfiguration { EnableWriteNullValueCell = false }); - var rows = MiniExcel.Query(path.ToString()).ToList(); + Exporter.ExportXlsx(path.ToString(), value, configuration: new OpenXmlConfiguration { EnableWriteNullValueCell = false }); + var rows = Importer.QueryXlsx(path.ToString()).ToList(); } private class TestIssue310Dto @@ -660,9 +661,9 @@ public void TestIssue343() table.Rows.Add(date, date); } var reader = table.CreateDataReader(); - MiniExcel.SaveAs(path.ToString(), reader); + Exporter.ExportXlsx(path.ToString(), reader); - var rows = MiniExcel.Query(path.ToString(), true).ToArray(); + var rows = Importer.QueryXlsx(path.ToString(), true).ToArray(); Assert.Equal(date, rows[0].time1); Assert.Equal(date, rows[0].time2); } @@ -670,10 +671,10 @@ public void TestIssue343() [Fact] public void TestIssueI4YCLQ_2() { - var c = ExcelOpenXmlUtils.ConvertColumnName(1); - var c2 = ExcelOpenXmlUtils.ConvertColumnName(3); + var c = GeneralHelper.ConvertColumnName(1); + var c2 = GeneralHelper.ConvertColumnName(3); var path = PathHelper.GetFile("xlsx/TestIssueI4YCLQ_2.xlsx"); - var rows = MiniExcel.Query(path, startCell: "B2").ToList(); + var rows = Importer.QueryXlsx(path, startCell: "B2").ToList(); Assert.Null(rows[0].站点编码); Assert.Equal("N1", rows[0].站址名称); @@ -690,26 +691,26 @@ public void TestIssueI4YCLQ_2() private class TestIssueI4YCLQ_2Dto { - [ExcelColumnIndex("A")] + [MiniExcelColumnIndex("A")] public string 站点编码 { get; set; } - [ExcelColumnIndex("B")] + [MiniExcelColumnIndex("B")] public string 站址名称 { get; set; } - [ExcelColumnIndex("C")] + [MiniExcelColumnIndex("C")] public string 值1 { get; set; } - [ExcelColumnIndex("D")] + [MiniExcelColumnIndex("D")] public string 值2 { get; set; } - [ExcelColumnIndex("E")] + [MiniExcelColumnIndex("E")] public string 值3 { get; set; } - [ExcelColumnIndex("F")] + [MiniExcelColumnIndex("F")] public string 资源ID { get; set; } - [ExcelColumnIndex("G")] + [MiniExcelColumnIndex("G")] public string 值4 { get; set; } - [ExcelColumnIndex("H")] + [MiniExcelColumnIndex("H")] public string 值5 { get; set; } - [ExcelColumnIndex("I")] + [MiniExcelColumnIndex("I")] public string 值6 { get; set; } public string 值7 { get; set; } - [ExcelColumnName("NotExist")] + [MiniExcelColumnName("NotExist")] public string 值8 { get; set; } } @@ -719,7 +720,7 @@ public async Task TestIssue338() Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); { var path = PathHelper.GetFile("csv/TestIssue338.csv"); - var row = MiniExcel.QueryAsync(path).ToBlockingEnumerable().FirstOrDefault(); + var row = Importer.QueryCsvAsync(path).ToBlockingEnumerable().FirstOrDefault(); Assert.Equal("���IJ�������", row!.A); } { @@ -728,7 +729,7 @@ public async Task TestIssue338() { StreamReaderFunc = stream => new StreamReader(stream, Encoding.GetEncoding("gb2312")) }; - var row = MiniExcel.QueryAsync(path, configuration: config).ToBlockingEnumerable().FirstOrDefault(); + var row = Importer.QueryCsvAsync(path, configuration: config).ToBlockingEnumerable().FirstOrDefault(); Assert.Equal("中文测试内容", row!.A); } { @@ -739,7 +740,7 @@ public async Task TestIssue338() }; await using (var stream = new FileStream(path, FileMode.Open, FileAccess.Read)) { - var row = stream.QueryAsync(configuration: config, excelType: ExcelType.CSV).ToBlockingEnumerable().FirstOrDefault(); + var row = Importer.QueryCsvAsync(stream, configuration: config).ToBlockingEnumerable().FirstOrDefault(); Assert.Equal("中文测试内容", row!.A); } } @@ -754,8 +755,8 @@ public void TestIssueI4WM67() { ["users"] = Array.Empty() }; - MiniExcel.SaveAsByTemplate(path.ToString(), templatePath, value); - var rows = MiniExcel.Query(path.ToString()).ToList(); + Templater.ApplyXlsxTemplate(path.ToString(), templatePath, value); + var rows = Importer.QueryXlsx(path.ToString()).ToList(); Assert.Single(rows); } @@ -777,7 +778,7 @@ public void TestIssueI4WXFB() ["Amount"] = 1000, ["Department"] = "HR" }; - MiniExcel.SaveAsByTemplate(path.ToString(), templatePath, value); + Templater.ApplyXlsxTemplate(path.ToString(), templatePath, value); } { @@ -793,21 +794,21 @@ public void TestIssueI4WXFB() ["Amount"] = 1000, ["Department"] = "HR" }; - Assert.Throws(() => MiniExcel.SaveAsByTemplate(path.ToString(), templatePath, value, config)); + Assert.Throws(() => Templater.ApplyXlsxTemplate(path.ToString(), templatePath, value, config)); } } [Fact] public void TestIssueI4WDA9() { - using var path = AutoDeletingPath.Create(ExcelType.CSV); + using var path = AutoDeletingPath.Create(ExcelType.Csv); var value = new DataTable(); { value.Columns.Add("\"name\""); value.Rows.Add("\"Jack\""); } - MiniExcel.SaveAs(path.ToString(), value); + Exporter.ExportCsv(path.ToString(), value); Assert.Equal("\"\"\"name\"\"\"\r\n\"\"\"Jack\"\"\"\r\n", File.ReadAllText(path.ToString())); } @@ -832,7 +833,7 @@ public void TestIssue331_2() }); using var path = AutoDeletingPath.Create(); - MiniExcel.SaveAs(path.ToString(), data, configuration: config); + Exporter.ExportXlsx(path.ToString(), data, configuration: config); CultureInfo.CurrentCulture = CultureInfo.GetCultureInfo(cln); } @@ -851,9 +852,9 @@ public void TestIssue331() }); using var path = AutoDeletingPath.Create(); - MiniExcel.SaveAs(path.ToString(), data); + Exporter.ExportXlsx(path.ToString(), data); - var rows = MiniExcel.Query(path.ToString(), startCell: "A2").ToArray(); + var rows = Importer.QueryXlsx(path.ToString(), startCell: "A2").ToArray(); Assert.Equal(1.5, rows[2].B); Assert.Equal(1.5, rows[2].C); @@ -875,16 +876,16 @@ public void TestIssueI4TXGT() var path = file.ToString(); var value = new[] { new TestIssueI4TXGTDto { ID = 1, Name = "Apple", Spc = "X", Up = 6999 } }; - MiniExcel.SaveAs(path, value); + Exporter.ExportXlsx(path, value); { - var rows = MiniExcel.Query(path).ToList(); + var rows = Importer.QueryXlsx(path).ToList(); Assert.Equal("ID", rows[0].A); Assert.Equal("Name", rows[0].B); Assert.Equal("Specification", rows[0].C); Assert.Equal("Unit Price", rows[0].D); } { - var rows = MiniExcel.Query(path).ToList(); + var rows = Importer.QueryXlsx(path).ToList(); Assert.Equal(1, rows[0].ID); Assert.Equal("Apple", rows[0].Name); Assert.Equal("X", rows[0].Spc); @@ -923,10 +924,10 @@ public void TestIssue328() file = File.ReadAllBytes(PathHelper.GetFile("other/TestIssue327.txt")) }, }; - MiniExcel.SaveAs(path.ToString(), value); + Exporter.ExportXlsx(path.ToString(), value); var rowIndx = 0; - using var reader = MiniExcel.GetReader(path.ToString(), true); + using var reader = Importer.GetXlsxDataReader(path.ToString(), true); Assert.Equal("id", reader.GetName(0)); Assert.Equal("name", reader.GetName(1)); @@ -963,8 +964,8 @@ public void TestIssue327() new { id = 2, file = File.ReadAllBytes(PathHelper.GetFile("other/TestIssue327.txt")) }, new { id = 3, file = File.ReadAllBytes(PathHelper.GetFile("other/TestIssue327.html")) }, }; - MiniExcel.SaveAs(path.ToString(), value); - var rows = MiniExcel.Query(path.ToString(), true).ToList(); + Exporter.ExportXlsx(path.ToString(), value); + var rows = Importer.QueryXlsx(path.ToString(), true).ToList(); Assert.Equal(value[0].file, rows[0].file); Assert.Equal(value[1].file, rows[1].file); @@ -978,162 +979,153 @@ public void TestIssue316() { // XLSX { + using var file = AutoDeletingPath.Create(); + var path = file.ToString(); + var value = new[] + { + new{ Amount=123_456.789M, CreateTime=DateTime.Parse("2018-01-31",CultureInfo.InvariantCulture)} + }; + var config = new OpenXmlConfiguration + { + Culture = new CultureInfo("fr-FR"), + }; + Exporter.ExportXlsx(path, value, configuration: config); + + //Datetime error + Assert.Throws(() => { - using var file = AutoDeletingPath.Create(); - var path = file.ToString(); - var value = new[] + var conf = new OpenXmlConfiguration { - new{ Amount=123_456.789M, CreateTime=DateTime.Parse("2018-01-31",CultureInfo.InvariantCulture)} + Culture = new CultureInfo("en-US"), }; + _ = Importer.QueryXlsx(path, configuration: conf).ToList(); + }); + + // dynamic + var rows = Importer.QueryXlsx(path, true).ToList(); + Assert.Equal("123456,789", rows[0].Amount); + Assert.Equal("31/01/2018 00:00:00", rows[0].CreateTime); + } + + // type + { + using var file = AutoDeletingPath.Create(); + var path = file.ToString(); + var value = new[] + { + new { Amount = 123_456.789M, CreateTime = new DateTime(2018, 5, 12) } + }; + { var config = new OpenXmlConfiguration { Culture = new CultureInfo("fr-FR"), }; - MiniExcel.SaveAs(path, value, configuration: config); - - //Datetime error - { - Assert.Throws(() => - { - var conf = new OpenXmlConfiguration - { - Culture = new CultureInfo("en-US"), - }; - _ = MiniExcel.Query(path, configuration: conf).ToList(); - }); - } + Exporter.ExportXlsx(path, value, configuration: config); + } - // dynamic - { - var rows = MiniExcel.Query(path, true).ToList(); - Assert.Equal("123456,789", rows[0].Amount); - Assert.Equal("31/01/2018 00:00:00", rows[0].CreateTime); - } + { + var rows = Importer.QueryXlsx(path, true).ToList(); + Assert.Equal("123456,789", rows[0].Amount); + Assert.Equal("12/05/2018 00:00:00", rows[0].CreateTime); } - // type { - using var file = AutoDeletingPath.Create(); - var path = file.ToString(); - var value = new[] + var config = new OpenXmlConfiguration { - new{ Amount=123_456.789M, CreateTime=DateTime.Parse("2018-05-12", CultureInfo.InvariantCulture)} + Culture = new CultureInfo("en-US"), }; - { - var config = new OpenXmlConfiguration - { - Culture = new CultureInfo("fr-FR"), - }; - MiniExcel.SaveAs(path, value, configuration: config); - } + var rows = Importer.QueryXlsx(path, configuration: config).ToList(); - { - var rows = MiniExcel.Query(path, true).ToList(); - Assert.Equal("123456,789", rows[0].Amount); - Assert.Equal("12/05/2018 00:00:00", rows[0].CreateTime); - } + Assert.Equal("2018-12-05 00:00:00", rows[0].CreateTime.ToString("yyyy-MM-dd HH:mm:ss")); + Assert.Equal(123456789m, rows[0].Amount); + } + { + var config = new OpenXmlConfiguration { - var config = new OpenXmlConfiguration - { - Culture = new CultureInfo("en-US"), - }; - var rows = MiniExcel.Query(path, configuration: config).ToList(); - - Assert.Equal("2018-12-05 00:00:00", rows[0].CreateTime.ToString("yyyy-MM-dd HH:mm:ss")); - Assert.Equal(123456789m, rows[0].Amount); - } + Culture = new CultureInfo("fr-FR"), + }; + var rows = Importer.QueryXlsx(path, configuration: config).ToList(); - { - var config = new OpenXmlConfiguration - { - Culture = new CultureInfo("fr-FR"), - }; - var rows = MiniExcel.Query(path, configuration: config).ToList(); - - Assert.Equal("2018-05-12 00:00:00", rows[0].CreateTime.ToString("yyyy-MM-dd HH:mm:ss")); - Assert.Equal(123456.789m, rows[0].Amount); - } + Assert.Equal("2018-05-12 00:00:00", rows[0].CreateTime.ToString("yyyy-MM-dd HH:mm:ss")); + Assert.Equal(123456.789m, rows[0].Amount); } } // CSV { + using var file = AutoDeletingPath.Create(ExcelType.Csv); + var path = file.ToString(); + var value = new[] + { + new { Amount = 123_456.789M, CreateTime = new DateTime(2018, 1, 31) } + }; + + var config = new CsvConfiguration + { + Culture = new CultureInfo("fr-FR"), + }; + Exporter.ExportCsv(path, value, configuration: config); + + //Datetime error + Assert.Throws(() => { - using var file = AutoDeletingPath.Create(ExcelType.CSV); - var path = file.ToString(); - var value = new[] + var conf = new CsvConfiguration { - new{ Amount=123_456.789M, CreateTime=DateTime.Parse("2018-01-31", CultureInfo.InvariantCulture)} + Culture = new CultureInfo("en-US") }; + _ = Importer.QueryCsv(path, configuration: conf).ToList(); + }); + + // dynamic + var rows = Importer.QueryCsv(path, true).ToList(); + Assert.Equal("123456,789", rows[0].Amount); + Assert.Equal("31/01/2018 00:00:00", rows[0].CreateTime); + } + + // type + { + using var file = AutoDeletingPath.Create(ExcelType.Csv); + var path = file.ToString(); + + var value = new[] + { + new{ Amount=123_456.789M, CreateTime=DateTime.Parse("2018-05-12", CultureInfo.InvariantCulture)} + }; + { var config = new CsvConfiguration { Culture = new CultureInfo("fr-FR"), }; - MiniExcel.SaveAs(path, value, configuration: config); - - //Datetime error - { - Assert.Throws(() => - { - var conf = new CsvConfiguration - { - Culture = new CultureInfo("en-US"), - }; - _ = MiniExcel.Query(path, configuration: conf).ToList(); - }); - } + Exporter.ExportCsv(path, value, configuration: config); + } - // dynamic - { - var rows = MiniExcel.Query(path, true).ToList(); - Assert.Equal("123456,789", rows[0].Amount); - Assert.Equal("31/01/2018 00:00:00", rows[0].CreateTime); - } + { + var rows = Importer.QueryCsv(path, true).ToList(); + Assert.Equal("123456,789", rows[0].Amount); + Assert.Equal("12/05/2018 00:00:00", rows[0].CreateTime); } - // type { - var path = PathHelper.GetTempFilePath("csv"); - var value = new[] + var config = new CsvConfiguration { - new{ Amount=123_456.789M, CreateTime=DateTime.Parse("2018-05-12", CultureInfo.InvariantCulture)} + Culture = new CultureInfo("en-US"), }; - { - var config = new CsvConfiguration - { - Culture = new CultureInfo("fr-FR"), - }; - MiniExcel.SaveAs(path, value, configuration: config); - } + var rows = Importer.QueryCsv(path, configuration: config).ToList(); - { - var rows = MiniExcel.Query(path, true).ToList(); - Assert.Equal("123456,789", rows[0].Amount); - Assert.Equal("12/05/2018 00:00:00", rows[0].CreateTime); - } + Assert.Equal("2018-12-05 00:00:00", rows[0].CreateTime.ToString("yyyy-MM-dd HH:mm:ss")); + Assert.Equal(123456789m, rows[0].Amount); + } + { + var config = new CsvConfiguration { - var config = new CsvConfiguration - { - Culture = new CultureInfo("en-US"), - }; - var rows = MiniExcel.Query(path, configuration: config).ToList(); - - Assert.Equal("2018-12-05 00:00:00", rows[0].CreateTime.ToString("yyyy-MM-dd HH:mm:ss")); - Assert.Equal(123456789m, rows[0].Amount); - } + Culture = new CultureInfo("fr-FR"), + }; + var rows = Importer.QueryCsv(path, configuration: config).ToList(); - { - var config = new CsvConfiguration - { - Culture = new CultureInfo("fr-FR"), - }; - var rows = MiniExcel.Query(path, configuration: config).ToList(); - - Assert.Equal("2018-05-12 00:00:00", rows[0].CreateTime.ToString("yyyy-MM-dd HH:mm:ss")); - Assert.Equal(123456.789m, rows[0].Amount); - } + Assert.Equal("2018-05-12 00:00:00", rows[0].CreateTime.ToString("yyyy-MM-dd HH:mm:ss")); + Assert.Equal(123456.789m, rows[0].Amount); } } } @@ -1156,7 +1148,7 @@ public void TestIssue325() { "sheet1",new[]{ new { id = 1, date = DateTime.Parse("2022-01-01") } }}, { "sheet2",new[]{ new { id = 2, date = DateTime.Parse("2022-01-01") } }}, }; - MiniExcel.SaveAs(path.ToString(), value); + Exporter.ExportXlsx(path.ToString(), value); var xml = Helpers.GetZipFileContent(path.ToString(), "xl/worksheets/_rels/sheet2.xml.rels"); var cnt = Regex.Matches(xml, "Id=\"drawing2\"").Count; @@ -1178,30 +1170,30 @@ public void TestIssueI49RZH() new TestIssueI49RZHDto{ dd = DateTimeOffset.Parse("2022-01-22")}, new TestIssueI49RZHDto{ dd = null} }; - MiniExcel.SaveAs(path.ToString(), value); + Exporter.ExportXlsx(path.ToString(), value); - var rows = MiniExcel.Query(path.ToString()).ToList(); + var rows = Importer.QueryXlsx(path.ToString()).ToList(); Assert.Equal("2022-01-22", rows[1].A); } //TODO:CSV { - using var path = AutoDeletingPath.Create(ExcelType.CSV); + using var path = AutoDeletingPath.Create(ExcelType.Csv); var value = new[] { new TestIssueI49RZHDto{ dd = DateTimeOffset.Parse("2022-01-22")}, new TestIssueI49RZHDto{ dd = null} }; - MiniExcel.SaveAs(path.ToString(), value); + Exporter.ExportXlsx(path.ToString(), value); - var rows = MiniExcel.Query(path.ToString()).ToList(); + var rows = Importer.QueryXlsx(path.ToString()).ToList(); Assert.Equal("2022-01-22", rows[1].A); } } private class TestIssueI49RZHDto { - [ExcelFormat("yyyy-MM-dd")] + [MiniExcelFormat("yyyy-MM-dd")] public DateTimeOffset? dd { get; set; } } @@ -1219,30 +1211,30 @@ public void TestIssue312() new() { Value = 12345.6789}, new() { Value = null} ]; - MiniExcel.SaveAs(path.ToString(), value); + Exporter.ExportXlsx(path.ToString(), value); - var rows = MiniExcel.Query(path.ToString()).ToList(); + var rows = Importer.QueryXlsx(path.ToString()).ToList(); Assert.Equal("12,345.68", rows[1].A); } //TODO:CSV { - using var path = AutoDeletingPath.Create(ExcelType.CSV); + using var path = AutoDeletingPath.Create(ExcelType.Csv); TestIssue312Dto[] value = [ new() { Value = 12345.6789}, new() { Value = null} ]; - MiniExcel.SaveAs(path.ToString(), value); + Exporter.ExportXlsx(path.ToString(), value); - var rows = MiniExcel.Query(path.ToString()).ToList(); + var rows = Importer.QueryXlsx(path.ToString()).ToList(); Assert.Equal("12,345.68", rows[1].A); } } private class TestIssue312Dto { - [ExcelFormat("0,0.00")] + [MiniExcelFormat("0,0.00")] public double? Value { get; set; } } @@ -1256,9 +1248,9 @@ public void TestIssue209() try { var path = PathHelper.GetFile("xlsx/TestIssue309.xlsx"); - var rows = MiniExcel.Query(path).ToList(); + var rows = Importer.QueryXlsx(path).ToList(); } - catch (ExcelInvalidCastException ex) + catch (MiniExcelInvalidCastException ex) { Assert.Equal("SEQ", ex.ColumnName); Assert.Equal(4, ex.Row); @@ -1287,13 +1279,13 @@ public void TestIssue318() { new { Name="github", Image=imageByte}, }; - MiniExcel.SaveAs(path.ToString(), value); + Exporter.ExportXlsx(path.ToString(), value); // import to byte[] { const string expectedBase64 = "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAIAAAD9b0jDAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAEXRFWHRTb2Z0d2FyZQBTbmlwYXN0ZV0Xzt0AAALNSURBVEiJ7ZVLTBNBGMdndrfdIofy0ERbCgcFeYRuCy2JGOPNRA9qeIZS6YEEogQj0YMmGOqDSATxQaLRxKtRID4SgjGelUBpaQvGZ7kpII8aWtjd2dkdDxsJoS1pIh6M/k+z8833m/3+8+0OJISArRa15cT/0D8CZTYPe32+Zy+GxjzjMzOzAACDYafdZquqOG7hzJtkwUQthRC6cavv0eN+QRTBujUQQp1OV1dbffZMq1arTRaqKIok4eZTrSNjHqIo6gIIIQBgbQwpal+Z/f7dPo2GoaiNHtJut3vjPhBe7+kdfvW61Mq1nGyaX1xYjkRzsk2Z6Rm8IOTvzWs73SLwwqjHK4jCgf3lcV6VxGgiECji7AXm0gvtHYQQnue/zy8ghCRJWlxaWuV5Qsilq9cKzLYiiz04ORVLiHP6A4NPRQlhjLWsVpZlnU63Y3umRqNhGCYjPV3HsrIsMwyDsYQQejIwGEuIA/WMT1AAaDSahnoHTdPKL1vXPKVp2umoZVkWAOj1+ZOCzs7NKYTo9XqjYRcAgKIo9ZRUu9VxltGYZTQAAL5+m0kKijEmAPCrqyJCcRuOECKI4lL4ByEEYykpaE62iQIgurLi9wchhLIsry8fYwwh9PomwuEwACDbZEoKauHMgKJSU1PbOy6Hpqdpml5fPsMwn7+EOru6IYQAghKrJSloTVUFURSX02G3lRw+WulqbA4EJ9XQh4+f2s6dr65zhkLTEEIKwtqaylhCnG/fauFO1Nfde/Bw6Hm/0WiYevc+LU2vhlK2pQwNvwQAsCwrYexyOrji4lhCnOaXZRljXONoOHTk2Ju3I/5AcC3EC0JZ+cE9Bea8IqursUkUker4BsWBqpIk6aL7Sm4htzvfvByJqJORaDS3kMsvLuns6kYIJcpNCFU17pvouXlHEET1URDEnt7bo2OezbMS/vp+R3/PdfKPQ38Ccg0E/CDcpY8AAAAASUVORK5CYII="; - var rows = MiniExcel.Query(path.ToString(), true).ToList(); + var rows = Importer.QueryXlsx(path.ToString(), true).ToList(); var actulBase64 = Convert.ToBase64String((byte[])rows[0].Image); Assert.Equal(expectedBase64, actulBase64); } @@ -1301,7 +1293,7 @@ public void TestIssue318() // import to base64 string { var config = new OpenXmlConfiguration { EnableConvertByteArray = false }; - var rows = MiniExcel.Query(path.ToString(), true, configuration: config).ToList(); + var rows = Importer.QueryXlsx(path.ToString(), true, configuration: config).ToList(); var image = (string)rows[0].Image; Assert.StartsWith("@@@fileid@@@,xl/media/", image); } @@ -1324,7 +1316,7 @@ public void TestIssue304() new { Name="reddit", Image=File.ReadAllBytes(PathHelper.GetFile("images/reddit_logo.png"))}, new { Name="statck_overflow", Image=File.ReadAllBytes(PathHelper.GetFile("images/statck_overflow_logo.png"))}, }; - MiniExcel.SaveAs(path, value); + Exporter.ExportXlsx(path, value); Assert.Contains("/xl/media/", Helpers.GetZipFileContent(path, "xl/drawings/_rels/drawing1.xml.rels")); Assert.Contains("ext cx=\"609600\" cy=\"190500\"", Helpers.GetZipFileContent(path, "xl/drawings/drawing1.xml")); @@ -1348,9 +1340,9 @@ public void TestIssueI4HL54() { { "Texts",reader} }; - MiniExcel.SaveAsByTemplate(path.ToString(), templatePath, value); + Templater.ApplyXlsxTemplate(path.ToString(), templatePath, value); - var rows = MiniExcel.Query(path.ToString(), true).ToList(); + var rows = Importer.QueryXlsx(path.ToString(), true).ToList(); Assert.Equal("Hello World1", rows[0].Text); Assert.Equal("Hello World2", rows[1].Text); } @@ -1365,21 +1357,21 @@ public void TestIssue294() { using var path = AutoDeletingPath.Create(); var value = new[] { new { Name = " Jack" } }; - MiniExcel.SaveAs(path.ToString(), value); + Exporter.ExportXlsx(path.ToString(), value); var sheetXml = Helpers.GetZipFileContent(path.ToString(), "xl/worksheets/sheet1.xml"); Assert.Contains("xml:space=\"preserve\"", sheetXml); } { using var path = AutoDeletingPath.Create(); var value = new[] { new { Name = "Ja ck" } }; - MiniExcel.SaveAs(path.ToString(), value); + Exporter.ExportXlsx(path.ToString(), value); var sheetXml = Helpers.GetZipFileContent(path.ToString(), "xl/worksheets/sheet1.xml"); Assert.DoesNotContain("xml:space=\"preserve\"", sheetXml); } { using var path = AutoDeletingPath.Create(); var value = new[] { new { Name = "Jack " } }; - MiniExcel.SaveAs(path.ToString(), value); + Exporter.ExportXlsx(path.ToString(), value); var sheetXml = Helpers.GetZipFileContent(path.ToString(), "xl/worksheets/sheet1.xml"); Assert.Contains("xml:space=\"preserve\"", sheetXml); } @@ -1394,7 +1386,7 @@ public void TestIssue298() { var path = PathHelper.GetFile("/csv/TestIssue298.csv"); #pragma warning disable CS0618 // Type or member is obsolete - var dt = MiniExcel.QueryAsDataTable(path); + var dt = Importer.QueryCsvAsDataTable(path); #pragma warning restore CS0618 Assert.Equal(["ID", "Name", "Age"], dt.Columns.Cast().Select(x => x.ColumnName)); } @@ -1413,7 +1405,7 @@ public void TestIssueI4DQUN() { "Title", "Hello & World < , > , \" , '" }, { "Details", new[] { new { Value = "Hello & Value < , > , \" , '" } } }, }; - MiniExcel.SaveAsByTemplate(path.ToString(), templatePath, value); + Templater.ApplyXlsxTemplate(path.ToString(), templatePath, value); var sheetXml = Helpers.GetZipFileContent(path.ToString(), "xl/worksheets/sheet1.xml"); Assert.Contains("Hello & World < , > , \" , '", sheetXml); @@ -1429,7 +1421,7 @@ public void TestIssue190() { using var path = AutoDeletingPath.Create(); var value = new TestIssue190Dto[] { }; - MiniExcel.SaveAs(path.ToString(), value, configuration: new OpenXmlConfiguration { AutoFilter = false }); + Exporter.ExportXlsx(path.ToString(), value, configuration: new OpenXmlConfiguration { AutoFilter = false }); var sheetXml = Helpers.GetZipFileContent(path.ToString(), "xl/worksheets/sheet1.xml"); Assert.DoesNotContain("", sheetXml); @@ -1437,7 +1429,7 @@ public void TestIssue190() { using var path = AutoDeletingPath.Create(); var value = new TestIssue190Dto[] { }; - MiniExcel.SaveAs(path.ToString(), value); + Exporter.ExportXlsx(path.ToString(), value); var sheetXml = Helpers.GetZipFileContent(path.ToString(), "xl/worksheets/sheet1.xml"); Assert.Contains("", sheetXml); @@ -1449,7 +1441,7 @@ public void TestIssue190() new() { ID = 1, Name = "Jack", Age = 32 }, new() { ID = 2, Name = "Lisa", Age = 45 } ]; - MiniExcel.SaveAs(path.ToString(), value); + Exporter.ExportXlsx(path.ToString(), value); var sheetXml = Helpers.GetZipFileContent(path.ToString(), "xl/worksheets/sheet1.xml"); Assert.Contains("", sheetXml); @@ -1471,10 +1463,10 @@ public void TestIssue292() { { var xlsxPath = PathHelper.GetFile("/xlsx/TestIssue292.xlsx"); - using var path = AutoDeletingPath.Create(ExcelType.CSV); - MiniExcel.ConvertXlsxToCsv(xlsxPath, path.ToString()); + using var csvPath = AutoDeletingPath.Create(ExcelType.Csv); + Exporter.ConvertXlsxToCsv(xlsxPath, csvPath.ToString(), false); - var actualCotent = File.ReadAllText(path.ToString()); + var actualCotent = File.ReadAllText(csvPath.ToString()); Assert.Equal( """ Name,Age,Name,Age @@ -1488,9 +1480,9 @@ public void TestIssue292() { var csvPath = PathHelper.GetFile("/csv/TestIssue292.csv"); using var path = AutoDeletingPath.Create(); - MiniExcel.ConvertCsvToXlsx(csvPath, path.ToString()); + Exporter.ConvertCsvToXlsx(csvPath, path.ToString()); - var rows = MiniExcel.Query(path.ToString()).ToList(); + var rows = Importer.QueryXlsx(path.ToString()).ToList(); Assert.Equal(3, rows.Count); Assert.Equal("Name", rows[0].A); Assert.Equal("Age", rows[0].B); @@ -1512,8 +1504,8 @@ public void TestIssue293() var path = PathHelper.GetFile("/csv/Test5x2.csv"); using var tempPath = AutoDeletingPath.Create(); using var csv = File.OpenRead(path); - var value = csv.Query(useHeaderRow: false, excelType: ExcelType.CSV); - MiniExcel.SaveAs(tempPath.ToString(), value, printHeader: false, excelType: ExcelType.XLSX); + var value = Importer.QueryCsv(csv, useHeaderRow: false); + Exporter.ExportXlsx(tempPath.ToString(), value, printHeader: false); } [Fact] @@ -1527,8 +1519,8 @@ public void TestIssueI49RYZ() new() { Name="Lisa", UserType=null } ]; using var path = AutoDeletingPath.Create(); - MiniExcel.SaveAs(path.ToString(), values); - var rows = MiniExcel.Query(path.ToString(), true).ToList(); + Exporter.ExportXlsx(path.ToString(), values); + var rows = Importer.QueryXlsx(path.ToString(), true).ToList(); Assert.Equal("GeneralUser", rows[0].UserType); Assert.Equal("SuperAdministrator", rows[1].UserType); Assert.Equal("GeneralAdministrator", rows[2].UserType); @@ -1544,8 +1536,8 @@ public void TestIssue286() new() { E = TestIssue286Enum.VIP2 } ]; using var path = AutoDeletingPath.Create(); - MiniExcel.SaveAs(path.ToString(), values); - var rows = MiniExcel.Query(path.ToString(), true).ToList(); + Exporter.ExportXlsx(path.ToString(), values); + var rows = Importer.QueryXlsx(path.ToString(), true).ToList(); Assert.Equal("VIP1", rows[0].E); Assert.Equal("VIP2", rows[1].E); @@ -1586,11 +1578,11 @@ public void TestIssue283() { "sheet01", cn.ExecuteReader("select 'v1' col1") }, { "sheet02", cn.ExecuteReader("select 'v2' col1") } }; - var rows = MiniExcel.SaveAs(path.ToString(), sheets); + var rows = Exporter.ExportXlsx(path.ToString(), sheets); Assert.Equal(2, rows.Length); } - var sheetNames = MiniExcel.GetSheetNames(path.ToString()); + var sheetNames = Importer.GetSheetNames(path.ToString()); Assert.Equal(["sheet01", "sheet02"], sheetNames); } @@ -1602,25 +1594,25 @@ public void TestIssueI40QA5() { { var path = PathHelper.GetFile("/xlsx/TestIssueI40QA5_1.xlsx"); - var rows = MiniExcel.Query(path).ToList(); + var rows = Importer.QueryXlsx(path).ToList(); Assert.Equal("E001", rows[0].Empno); Assert.Equal("E002", rows[1].Empno); } { var path = PathHelper.GetFile("/xlsx/TestIssueI40QA5_2.xlsx"); - var rows = MiniExcel.Query(path).ToList(); + var rows = Importer.QueryXlsx(path).ToList(); Assert.Equal("E001", rows[0].Empno); Assert.Equal("E002", rows[1].Empno); } { var path = PathHelper.GetFile("/xlsx/TestIssueI40QA5_3.xlsx"); - var rows = MiniExcel.Query(path).ToList(); + var rows = Importer.QueryXlsx(path).ToList(); Assert.Equal("E001", rows[0].Empno); Assert.Equal("E002", rows[1].Empno); } { var path = PathHelper.GetFile("/xlsx/TestIssueI40QA5_4.xlsx"); - var rows = MiniExcel.Query(path).ToList(); + var rows = Importer.QueryXlsx(path).ToList(); Assert.Null(rows[0].Empno); Assert.Null(rows[1].Empno); } @@ -1628,7 +1620,7 @@ public void TestIssueI40QA5() private class TestIssueI40QA5Dto { - [ExcelColumnName(excelColumnName: "EmployeeNo", aliases: new[] { "EmpNo", "No" })] + [MiniExcelColumnName(excelColumnName: "EmployeeNo", aliases: new[] { "EmpNo", "No" })] public string Empno { get; set; } public string Name { get; set; } } @@ -1642,8 +1634,8 @@ public void TestIssues133() var value = new DataTable(); value.Columns.Add("Id"); value.Columns.Add("Name"); - MiniExcel.SaveAs(path.ToString(), value); - var rows = MiniExcel.Query(path.ToString()).ToList(); + Exporter.ExportXlsx(path.ToString(), value); + var rows = Importer.QueryXlsx(path.ToString()).ToList(); Assert.Equal("Id", rows[0].A); Assert.Equal("Name", rows[0].B); @@ -1655,8 +1647,8 @@ public void TestIssues133() using var path = AutoDeletingPath.Create(); var value = Array.Empty(); - MiniExcel.SaveAs(path.ToString(), value); - var rows = MiniExcel.Query(path.ToString()).ToList(); + Exporter.ExportXlsx(path.ToString(), value); + var rows = Importer.QueryXlsx(path.ToString()).ToList(); Assert.Equal("Id", rows[0].A); Assert.Equal("Name", rows[0].B); @@ -1680,7 +1672,7 @@ public void TestIssueI45TF5_2() { var value = new[] { new Dictionary { { "Col1&Col2", "V1&V2" } } }; var path = PathHelper.GetTempPath(); - MiniExcel.SaveAs(path, value); + Exporter.ExportXlsx(path, value); //System.Xml.XmlException : '<' is an unexpected token. The expected token is ';'. Helpers.GetZipFileContent(path, "xl/worksheets/sheet1.xml"); //check illegal format or not } @@ -1690,7 +1682,7 @@ public void TestIssueI45TF5_2() dt.Columns.Add("Col1&Col2"); dt.Rows.Add("V1&V2"); var path = PathHelper.GetTempPath(); - MiniExcel.SaveAs(path, dt); + Exporter.ExportXlsx(path, dt); //System.Xml.XmlException : '<' is an unexpected token. The expected token is ';'. Helpers.GetZipFileContent(path, "xl/worksheets/sheet1.xml"); //check illegal format or not } @@ -1700,7 +1692,7 @@ public void TestIssueI45TF5_2() public void TestIssueI45TF5() { using var path = AutoDeletingPath.Create(); - MiniExcel.SaveAs(path.ToString(), new[] { new { C1 = "1&2;3,4", C2 = "1&2;3,4" } }); + Exporter.ExportXlsx(path.ToString(), new[] { new { C1 = "1&2;3,4", C2 = "1&2;3,4" } }); var sheet1Xml = Helpers.GetZipFileContent(path.ToString(), "xl/worksheets/sheet1.xml"); Assert.DoesNotContain("", sheet1Xml); } @@ -1717,14 +1709,14 @@ public void TestIssue280() new() { ID = 2, Name = "Mike" } ]; using var path = AutoDeletingPath.Create(); - MiniExcel.SaveAs(path.ToString(), value); + Exporter.ExportXlsx(path.ToString(), value); } private class TestIssue280Dto { - [ExcelColumnWidth(20)] + [MiniExcelColumnWidth(20)] public int ID { get; set; } - [ExcelColumnWidth(15.50)] + [MiniExcelColumnWidth(15.50)] public string Name { get; set; } } @@ -1736,7 +1728,7 @@ public void TestIssue279() { var path = PathHelper.GetFile("/csv/TestHeader.csv"); #pragma warning disable CS0618 // Type or member is obsolete - using var dt = MiniExcel.QueryAsDataTable(path, true, null, ExcelType.CSV); + using var dt = Importer.QueryCsvAsDataTable(path); #pragma warning restore CS0618 Assert.Equal("A1", dt.Rows[0]["Column1"]); Assert.Equal("A2", dt.Rows[1]["Column1"]); @@ -1751,7 +1743,7 @@ public void TestIssue279() public void TestIssue272() { var path = PathHelper.GetFile("/xlsx/TestIssue272.xlsx"); - Assert.Throws(() => MiniExcel.Query(path).ToList()); + Assert.Throws(() => Importer.QueryXlsx(path).ToList()); } /// @@ -1761,7 +1753,7 @@ public void TestIssue272() public void TestIssue267() { var path = PathHelper.GetFile("/xlsx/TestIssue267.xlsx"); - var row = MiniExcel.Query(path).SingleOrDefault(); + var row = Importer.QueryXlsx(path).SingleOrDefault(); Assert.Equal(10618, row!.A); Assert.Equal("2021-02-23", row.B); Assert.Equal(43.199999999999996, row.C); @@ -1804,7 +1796,7 @@ public void TestIssueI3X2ZL() try { var path = PathHelper.GetFile("xlsx/TestIssueI3X2ZL_datetime_error.xlsx"); - var rows = MiniExcel.Query(path, startCell: "B3").ToList(); + var rows = Importer.QueryXlsx(path, startCell: "B3").ToList(); } catch (InvalidCastException ex) { @@ -1817,7 +1809,7 @@ public void TestIssueI3X2ZL() try { var path = PathHelper.GetFile("xlsx/TestIssueI3X2ZL_int_error.xlsx"); - var rows = MiniExcel.Query(path).ToList(); + var rows = Importer.QueryXlsx(path).ToList(); } catch (InvalidCastException ex) { @@ -1842,8 +1834,9 @@ public void TestIssue261() { var csvPath = PathHelper.GetFile("csv/TestCsvToXlsx.csv"); using var path = AutoDeletingPath.Create(); - CsvToXlsx(csvPath, path.ToString()); - var rows = MiniExcel.Query(path.ToString()).ToList(); + + Exporter.ConvertCsvToXlsx(csvPath, path.FilePath); + var rows = Importer.QueryXlsx(path.ToString()).ToList(); Assert.Equal("Name", rows[0].A); Assert.Equal("Jack", rows[1].A); @@ -1857,12 +1850,6 @@ public void TestIssue261() Assert.Null(rows[4].B); } - private static void CsvToXlsx(string csvPath, string xlsxPath) - { - var value = MiniExcel.Query(csvPath, true); - MiniExcel.SaveAs(xlsxPath, value); - } - /// /// [SaveAsByTemplate support DateTime custom format · Issue #255 · mini-software/MiniExcel] /// (https://github.com/mini-software/MiniExcel/issues/255) @@ -1881,8 +1868,8 @@ public void Issue255() new Issue255DTO { Time = new DateTime(2021, 01, 01), Time2 = new DateTime(2021, 01, 01) } } }; - MiniExcel.SaveAsByTemplate(path.ToString(), templatePath, value); - var rows = MiniExcel.Query(path.ToString()).ToList(); + Templater.ApplyXlsxTemplate(path.ToString(), templatePath, value); + var rows = Importer.QueryXlsx(path.ToString()).ToList(); Assert.Equal("2021", rows[1].A.ToString()); Assert.Equal("2021", rows[1].B.ToString()); } @@ -1893,18 +1880,18 @@ public void Issue255() { new Issue255DTO { Time = new DateTime(2021, 01, 01) } }; - MiniExcel.SaveAs(path.ToString(), value); - var rows = MiniExcel.Query(path.ToString()).ToList(); + Exporter.ExportXlsx(path.ToString(), value); + var rows = Importer.QueryXlsx(path.ToString()).ToList(); Assert.Equal("2021", rows[1].A.ToString()); } } private class Issue255DTO { - [ExcelFormat("yyyy")] + [MiniExcelFormat("yyyy")] public DateTime Time { get; set; } - [ExcelColumn(Format = "yyyy")] + [MiniExcelColumn(Format = "yyyy")] public DateTime Time2 { get; set; } } @@ -1916,7 +1903,7 @@ private class Issue255DTO public void Issue256() { var path = PathHelper.GetFile("xlsx/TestIssue256.xlsx"); - var rows = MiniExcel.Query(path, false).ToList(); + var rows = Importer.QueryXlsx(path, false).ToList(); Assert.Equal(new DateTime(2003, 4, 16), rows[1].A); Assert.Equal(new DateTime(2004, 4, 16), rows[1].B); } @@ -1930,8 +1917,8 @@ public void Issue253() { { var value = new[] { new { col1 = "世界你好" } }; - using var path = AutoDeletingPath.Create(ExcelType.CSV); - MiniExcel.SaveAs(path.ToString(), value); + using var path = AutoDeletingPath.Create(ExcelType.Csv); + Exporter.ExportCsv(path.ToString(), value); const string expected = """ col1 @@ -1944,12 +1931,12 @@ public void Issue253() { Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); var value = new[] { new { col1 = "世界你好" } }; - using var path = AutoDeletingPath.Create(ExcelType.CSV); + using var path = AutoDeletingPath.Create(ExcelType.Csv); var config = new CsvConfiguration { StreamWriterFunc = stream => new StreamWriter(stream, Encoding.GetEncoding("gb2312")) }; - MiniExcel.SaveAs(path.ToString(), value, excelType: ExcelType.CSV, configuration: config); + Exporter.ExportCsv(path.ToString(), value, configuration: config); const string expected = """ col1 @@ -1963,8 +1950,8 @@ public void Issue253() { var value = cn.ExecuteReader("select '世界你好' col1"); - using var path = AutoDeletingPath.Create(ExcelType.CSV); - MiniExcel.SaveAs(path.ToString(), value); + using var path = AutoDeletingPath.Create(ExcelType.Csv); + Exporter.ExportCsv(path.ToString(), value); const string expected = """ col1 @@ -1983,8 +1970,8 @@ public void Issue251() { using var cn = Db.GetConnection(); using var reader = cn.ExecuteReader(@"select '""<>+-*//}{\\n' a,1234567890 b union all select 'Hello World',-1234567890"); - using var path = AutoDeletingPath.Create(ExcelType.CSV); - MiniExcel.SaveAs(path.ToString(), reader); + using var path = AutoDeletingPath.Create(ExcelType.Csv); + Exporter.ExportCsv(path.ToString(), reader); const string expected = """" a,b @@ -2003,10 +1990,10 @@ public void Issue251() public void Issue242() { var path = PathHelper.GetFile("xls/TestIssue242.xls"); - Assert.Throws(() => MiniExcel.Query(path).ToList()); + Assert.Throws(() => Importer.QueryXlsx(path).ToList()); using var stream = File.OpenRead(path); - Assert.Throws(() => stream.Query().ToList()); + Assert.Throws(() => Importer.QueryXlsx(stream).ToList()); } /// @@ -2015,15 +2002,15 @@ public void Issue242() [Fact] public void Issue243() { - using var path = AutoDeletingPath.Create(ExcelType.CSV); + using var path = AutoDeletingPath.Create(ExcelType.Csv); var value = new[] { new { Name = "Jack", Age = 25, InDate = new DateTime(2021,01,03) }, new { Name = "Henry", Age = 36, InDate = new DateTime(2020,05,03) }, }; - MiniExcel.SaveAs(path.ToString(), value); + Exporter.ExportXlsx(path.ToString(), value); - var rows = MiniExcel.Query(path.ToString()).ToList(); + var rows = Importer.QueryXlsx(path.ToString()).ToList(); Assert.Equal("Jack", rows[0].Name); Assert.Equal(25, rows[0].Age); Assert.Equal(new DateTime(2021, 01, 03), rows[0].InDate); @@ -2055,17 +2042,17 @@ public void Issue241() // csv { - using var path = AutoDeletingPath.Create(ExcelType.CSV); - MiniExcel.SaveAs(path.ToString(), value); + using var path = AutoDeletingPath.Create(ExcelType.Csv); + Exporter.ExportXlsx(path.ToString(), value); { - var rows = MiniExcel.Query(path.ToString(), true).ToList(); + var rows = Importer.QueryXlsx(path.ToString(), true).ToList(); Assert.Equal(rows[0].InDate, "01 04, 2021"); Assert.Equal(rows[1].InDate, "04 05, 2020"); } { - var rows = MiniExcel.Query(path.ToString()).ToList(); + var rows = Importer.QueryXlsx(path.ToString()).ToList(); Assert.Equal(rows[0].InDate, new DateTime(2021, 01, 04)); Assert.Equal(rows[1].InDate, new DateTime(2020, 04, 05)); } @@ -2074,16 +2061,16 @@ public void Issue241() // xlsx { using var path = AutoDeletingPath.Create(); - MiniExcel.SaveAs(path.ToString(), value); + Exporter.ExportXlsx(path.ToString(), value); { - var rows = MiniExcel.Query(path.ToString(), true).ToList(); + var rows = Importer.QueryXlsx(path.ToString(), true).ToList(); Assert.Equal(rows[0].InDate, "01 04, 2021"); Assert.Equal(rows[1].InDate, "04 05, 2020"); } { - var rows = MiniExcel.Query(path.ToString()).ToList(); + var rows = Importer.QueryXlsx(path.ToString()).ToList(); Assert.Equal(rows[0].InDate, new DateTime(2021, 01, 04)); Assert.Equal(rows[1].InDate, new DateTime(2020, 04, 05)); } @@ -2094,7 +2081,7 @@ private class Issue241Dto { public string Name { get; set; } - [ExcelFormat("MM dd, yyyy")] + [MiniExcelFormat("MM dd, yyyy")] public DateTime InDate { get; set; } } @@ -2111,7 +2098,7 @@ public void Issue132() new { name = "Henry", Age = 36, InDate = new DateTime(2020,05,03)}, }; - MiniExcel.SaveAs(path.ToString(), value); + Exporter.ExportXlsx(path.ToString(), value); } { @@ -2125,7 +2112,7 @@ public void Issue132() { TableStyles = TableStyles.None }; - MiniExcel.SaveAs(path.ToString(), value, configuration: config); + Exporter.ExportXlsx(path.ToString(), value, configuration: config); } { @@ -2137,7 +2124,7 @@ public void Issue132() new { name = "Henry", Age = 36, InDate = new DateTime(2020,05,03)}, }) ); - MiniExcel.SaveAs(path.ToString(), value); + Exporter.ExportXlsx(path.ToString(), value); } } @@ -2167,23 +2154,23 @@ public void Issue235() dataSet.Tables.Add(users); dataSet.Tables.Add(department); - var rowsWritten = MiniExcel.SaveAs(path.ToString(), dataSet); + var rowsWritten = Exporter.ExportXlsx(path.ToString(), dataSet); Assert.Equal(2, rowsWritten.Length); Assert.Equal(2, rowsWritten[0]); - var sheetNames = MiniExcel.GetSheetNames(path.ToString()); + var sheetNames = Importer.GetSheetNames(path.ToString()); Assert.Equal("users", sheetNames[0]); Assert.Equal("department", sheetNames[1]); { - var rows = MiniExcel.Query(path.ToString(), true, sheetName: "users").ToList(); + var rows = Importer.QueryXlsx(path.ToString(), true, sheetName: "users").ToList(); Assert.Equal("Jack", rows[0].Name); Assert.Equal(25, rows[0].Age); Assert.Equal("Mike", rows[1].Name); Assert.Equal(44, rows[1].Age); } { - var rows = MiniExcel.Query(path.ToString(), true, sheetName: "department").ToList(); + var rows = Importer.QueryXlsx(path.ToString(), true, sheetName: "department").ToList(); Assert.Equal("01", rows[0].ID); Assert.Equal("HR", rows[0].Name); Assert.Equal("02", rows[1].ID); @@ -2199,7 +2186,7 @@ public void Issue233() { var path = PathHelper.GetFile("xlsx/TestIssue233.xlsx"); #pragma warning disable CS0618 // Type or member is obsolete - var dt = MiniExcel.QueryAsDataTable(path); + var dt = Importer.QueryXlsxAsDataTable(path); #pragma warning restore CS0618 var rows = dt.Rows; @@ -2219,10 +2206,10 @@ public void Issue237() new{ id="\"\"1,2,3\"\""}, new{ id="1,2,3"}, }; - using var path = AutoDeletingPath.Create(ExcelType.CSV); - MiniExcel.SaveAs(path.ToString(), value); + using var path = AutoDeletingPath.Create(ExcelType.Csv); + Exporter.ExportXlsx(path.ToString(), value); - var rows = MiniExcel.Query(path.ToString(), true).ToList(); + var rows = Importer.QueryXlsx(path.ToString(), true).ToList(); Assert.Equal("\"\"1,2,3\"\"", rows[0].id); Assert.Equal("1,2,3", rows[1].id); @@ -2252,21 +2239,21 @@ public void Issue234() ["users"] = users, ["department"] = department }; - MiniExcel.SaveAs(path, sheets); + Exporter.ExportXlsx(path, sheets); - var sheetNames = MiniExcel.GetSheetNames(path); + var sheetNames = Importer.GetSheetNames(path); Assert.Equal("users", sheetNames[0]); Assert.Equal("department", sheetNames[1]); { - var rows = MiniExcel.Query(path, true, sheetName: "users").ToList(); + var rows = Importer.QueryXlsx(path, true, sheetName: "users").ToList(); Assert.Equal("Jack", rows[0].Name); Assert.Equal(25, rows[0].Age); Assert.Equal("Mike", rows[1].Name); Assert.Equal(44, rows[1].Age); } { - var rows = MiniExcel.Query(path, true, sheetName: "department").ToList(); + var rows = Importer.QueryXlsx(path, true, sheetName: "department").ToList(); Assert.Equal("01", rows[0].ID); Assert.Equal("HR", rows[0].Name); Assert.Equal("02", rows[1].ID); @@ -2321,8 +2308,8 @@ public void Issue230() using (var reader = cmd3.ExecuteReader(CommandBehavior.CloseConnection)) { using var path = AutoDeletingPath.Create(); - MiniExcel.SaveAs(path.ToString(), reader, printHeader: true); - var rows = MiniExcel.Query(path.ToString(), true).ToList(); + Exporter.ExportXlsx(path.ToString(), reader, printHeader: true); + var rows = Importer.QueryXlsx(path.ToString(), true).ToList(); Assert.Equal(1, rows[0].id); Assert.Equal(2, rows[1].id); } @@ -2337,7 +2324,7 @@ public void Issue229() { var path = PathHelper.GetFile("xlsx/TestIssue229.xlsx"); #pragma warning disable CS0618 // Type or member is obsolete - using var dt = MiniExcel.QueryAsDataTable(path); + using var dt = Importer.QueryXlsxAsDataTable(path); #pragma warning restore CS0618 foreach (DataColumn column in dt.Columns) { @@ -2360,7 +2347,7 @@ public void Issue122() { var path = PathHelper.GetFile("xlsx/TestIssue122.xlsx"); { - var rows = MiniExcel.Query(path, useHeaderRow: true, configuration: config).ToList(); + var rows = Importer.QueryXlsx(path, useHeaderRow: true, configuration: config).ToList(); Assert.Equal("HR", rows[0].Department); Assert.Equal("HR", rows[1].Department); Assert.Equal("HR", rows[2].Department); @@ -2373,7 +2360,7 @@ public void Issue122() { var path = PathHelper.GetFile("xlsx/TestIssue122_2.xlsx"); { - var rows = MiniExcel.Query(path, useHeaderRow: true, configuration: config).ToList(); + var rows = Importer.QueryXlsx(path, useHeaderRow: true, configuration: config).ToList(); Assert.Equal("V1", rows[2].Test1); Assert.Equal("V2", rows[5].Test2); Assert.Equal("V3", rows[1].Test3); @@ -2393,14 +2380,14 @@ public void Issue227() { { var path = PathHelper.GetTempPath("xlsm"); - Assert.Throws(() => MiniExcel.SaveAs(path, new[] { new { V = "A1" }, new { V = "A2" } })); + Assert.Throws(() => Exporter.ExportXlsx(path, new[] { new { V = "A1" }, new { V = "A2" } })); File.Delete(path); } { var path = PathHelper.GetFile("xlsx/TestIssue227.xlsm"); { - var rows = MiniExcel.Query(path).ToList(); + var rows = Importer.QueryXlsx(path).ToList(); Assert.Equal(100, rows.Count); Assert.Equal(Guid.Parse("78DE23D2-DCB6-BD3D-EC67-C112BBC322A2"), rows[0].ID); @@ -2413,7 +2400,7 @@ public void Issue227() } { using var stream = File.OpenRead(path); - var rows = stream.Query().ToList(); + var rows = Importer.QueryXlsx(stream).ToList(); Assert.Equal(100, rows.Count); Assert.Equal(Guid.Parse("78DE23D2-DCB6-BD3D-EC67-C112BBC322A2"), rows[0].ID); @@ -2438,7 +2425,7 @@ public void Issue226() { using var path = AutoDeletingPath.Create(); var templatePath = PathHelper.GetFile("xlsx/TestIssue226.xlsx"); - MiniExcel.SaveAsByTemplate(path.ToString(), templatePath, new { employees = new[] { new { name = "123" }, new { name = "123" } } }); + Templater.ApplyXlsxTemplate(path.ToString(), templatePath, new { employees = new[] { new { name = "123" }, new { name = "123" } } }); Assert.Equal("A1:A3", Helpers.GetFirstSheetDimensionRefValue(path.ToString())); } @@ -2456,10 +2443,10 @@ public void Issue223() new() { { "A", Guid.NewGuid() }, { "B", "HelloWorld" } } ]; using var path = AutoDeletingPath.Create(); - MiniExcel.SaveAs(path.ToString(), value); + Exporter.ExportXlsx(path.ToString(), value); #pragma warning disable CS0618 // Type or member is obsolete - using var dt = MiniExcel.QueryAsDataTable(path.ToString()); + using var dt = Importer.QueryXlsxAsDataTable(path.ToString()); #pragma warning restore CS0618 var columns = dt.Columns; Assert.Equal(typeof(object), columns[0].DataType); @@ -2477,7 +2464,7 @@ public void Issue223() public void Issue222() { var path = PathHelper.GetFile("xlsx/TestIssue222.xlsx"); - var rows = MiniExcel.Query(path).ToList(); + var rows = Importer.QueryXlsx(path).ToList(); Assert.Equal(typeof(DateTime), rows[1].A.GetType()); Assert.Equal(new DateTime(2021, 4, 29), rows[1].A); } @@ -2491,7 +2478,7 @@ public void Issue147() { { var path = PathHelper.GetFile("xlsx/TestIssue147.xlsx"); - var rows = MiniExcel.Query(path, useHeaderRow: false, startCell: "C3", sheetName: "Sheet1").ToList(); + var rows = Importer.QueryXlsx(path, useHeaderRow: false, startCell: "C3", sheetName: "Sheet1").ToList(); Assert.Equal(["C", "D", "E"], (rows[0] as IDictionary)?.Keys); Assert.Equal(["Column1", "Column2", "Column3"], new[] { rows[0].C as string, rows[0].D as string, rows[0].E as string }); @@ -2505,13 +2492,13 @@ public void Issue147() Assert.Equal(11, rows.Count); - var columns = MiniExcel.GetColumns(path, startCell: "C3"); + var columns = Importer.GetXlsxColumns(path, startCell: "C3"); Assert.Equal(["C", "D", "E"], columns); } { var path = PathHelper.GetFile("xlsx/TestIssue147.xlsx"); - var rows = MiniExcel.Query(path, useHeaderRow: true, startCell: "C3", sheetName: "Sheet1").ToList(); + var rows = Importer.QueryXlsx(path, useHeaderRow: true, startCell: "C3", sheetName: "Sheet1").ToList(); Assert.Equal(["Column1", "Column2", "Column3"], (rows[0] as IDictionary)?.Keys); Assert.Equal(["C4", "D4", "E4"], new[] { rows[0].Column1 as string, rows[0].Column2 as string, rows[0].Column3 as string }); @@ -2523,7 +2510,7 @@ public void Issue147() Assert.Equal(10, rows.Count); - var columns = MiniExcel.GetColumns(path, useHeaderRow: true, startCell: "C3"); + var columns = Importer.GetXlsxColumns(path, useHeaderRow: true, startCell: "C3"); Assert.Equal(["Column1", "Column2", "Column3"], columns); } } @@ -2542,8 +2529,8 @@ public void Issue211() using var connection = new SQLiteConnection(connectionString); var reader = connection.ExecuteReader(@"select 1 Test1,2 Test2 union all select 3 , 4 union all select 5 ,6"); - MiniExcel.SaveAs(path.ToString(), reader); - var rows = MiniExcel.Query(path.ToString(), true).ToList(); + Exporter.ExportXlsx(path.ToString(), reader); + var rows = Importer.QueryXlsx(path.ToString(), true).ToList(); Assert.Equal(1.0, rows[0].Test1); Assert.Equal(2.0, rows[0].Test2); @@ -2563,11 +2550,11 @@ public void Issue216() new { Test1 = "1", Test2 = 2 }, new { Test1 = "3", Test2 = 4 } }; - MiniExcel.SaveAs(path.ToString(), value); + Exporter.ExportXlsx(path.ToString(), value); { #pragma warning disable CS0618 // Type or member is obsolete - using var table = MiniExcel.QueryAsDataTable(path.ToString()); + using var table = Importer.QueryXlsxAsDataTable(path.ToString()); #pragma warning restore CS0618 Assert.Equal("Test1", table.Columns[0].ColumnName); Assert.Equal("Test2", table.Columns[1].ColumnName); @@ -2579,7 +2566,7 @@ public void Issue216() { #pragma warning disable CS0618 // Type or member is obsolete - using var dt = MiniExcel.QueryAsDataTable(path.ToString(), false); + using var dt = Importer.QueryXlsxAsDataTable(path.ToString(), false); #pragma warning restore CS0618 Assert.Equal("Test1", dt.Rows[0]["A"]); Assert.Equal("Test2", dt.Rows[0]["B"]); @@ -2600,18 +2587,18 @@ public void IssueI3OSKV() { using var path = AutoDeletingPath.Create(); var value = new[] { new { Test = "12345678901234567890" } }; - MiniExcel.SaveAs(path.ToString(), value); + Exporter.ExportXlsx(path.ToString(), value); - var A2 = MiniExcel.Query(path.ToString(), true).First().Test; + var A2 = Importer.QueryXlsx(path.ToString(), true).First().Test; Assert.Equal("12345678901234567890", A2); } { using var path = AutoDeletingPath.Create(); var value = new[] { new { Test = 123456.789 } }; - MiniExcel.SaveAs(path.ToString(), value); + Exporter.ExportXlsx(path.ToString(), value); - var A2 = MiniExcel.Query(path.ToString(), true).First().Test; + var A2 = Importer.QueryXlsx(path.ToString(), true).First().Test; Assert.Equal(123456.789, A2); } } @@ -2625,7 +2612,7 @@ public void IssueI3OSKV() public void Issue220() { var path = PathHelper.GetFile("xlsx/TestIssue220.xlsx"); - var rows = MiniExcel.Query(path, useHeaderRow: true); + var rows = Importer.QueryXlsx(path, useHeaderRow: true); var result = rows .GroupBy(s => s.PRT_ID) .Select(g => new @@ -2649,8 +2636,8 @@ public void Issue220() public void Issue215() { using var stream = new MemoryStream(); - stream.SaveAs(new[] { new { V = "test1" }, new { V = "test2" } }); - var rows = stream.Query(true).ToList(); + Exporter.ExportXlsx(stream, new[] { new { V = "test1" }, new { V = "test2" } }); + var rows = Importer.QueryXlsx(stream, true).ToList(); Assert.Equal("test1", rows[0].V); Assert.Equal("test2", rows[1].V); @@ -2666,7 +2653,7 @@ public void Issue89() //csv { const string text = - """ + """ State OnDuty Fired @@ -2679,15 +2666,15 @@ public void Issue89() writer.Write(text); writer.Flush(); stream.Position = 0; - var rows = stream.Query(excelType: ExcelType.CSV).ToList(); + var rows = Importer.QueryCsv(stream, useHeaderRow: true).ToList(); - Assert.Equal(Issue89VO.WorkState.OnDuty, rows[0].State); - Assert.Equal(Issue89VO.WorkState.Fired, rows[1].State); - Assert.Equal(Issue89VO.WorkState.Leave, rows[2].State); + Assert.Equal(nameof(Issue89VO.WorkState.OnDuty), rows[0].State); + Assert.Equal(nameof(Issue89VO.WorkState.Fired), rows[1].State); + Assert.Equal(nameof(Issue89VO.WorkState.Leave), rows[2].State); - using var path = AutoDeletingPath.Create(ExcelType.CSV); - MiniExcel.SaveAs(path.ToString(), rows); - var rows2 = MiniExcel.Query(path.ToString()).ToList(); + using var path = AutoDeletingPath.Create(ExcelType.Csv); + Exporter.ExportCsv(path.ToString(), rows); + var rows2 = Importer.QueryCsv(path.ToString()).ToList(); Assert.Equal(Issue89VO.WorkState.OnDuty, rows2[0].State); Assert.Equal(Issue89VO.WorkState.Fired, rows2[1].State); @@ -2697,15 +2684,15 @@ public void Issue89() //xlsx { var path = PathHelper.GetFile("xlsx/TestIssue89.xlsx"); - var rows = MiniExcel.Query(path).ToList(); + var rows = Importer.QueryXlsx(path).ToList(); Assert.Equal(Issue89VO.WorkState.OnDuty, rows[0].State); Assert.Equal(Issue89VO.WorkState.Fired, rows[1].State); Assert.Equal(Issue89VO.WorkState.Leave, rows[2].State); using var xlsxPath = AutoDeletingPath.Create(); - MiniExcel.SaveAs(xlsxPath.ToString(), rows); - var rows2 = MiniExcel.Query(xlsxPath.ToString()).ToList(); + Exporter.ExportXlsx(xlsxPath.ToString(), rows); + var rows2 = Importer.QueryXlsx(xlsxPath.ToString()).ToList(); Assert.Equal(Issue89VO.WorkState.OnDuty, rows2[0].State); Assert.Equal(Issue89VO.WorkState.Fired, rows2[1].State); @@ -2742,26 +2729,26 @@ public void Issue217() // openxml { using var path = AutoDeletingPath.Create(); - MiniExcel.SaveAs(path.ToString(), table); + Exporter.ExportXlsx(path.ToString(), table); - var rows = MiniExcel.Query(path.ToString()).ToList(); + var rows = Importer.QueryXlsx(path.ToString()).ToList(); Assert.Equal("Name", rows[0].B); Assert.Equal("Limit", rows[0].C); } // csv { - using var path = AutoDeletingPath.Create(ExcelType.CSV); - MiniExcel.SaveAs(path.ToString(), table); + using var path = AutoDeletingPath.Create(ExcelType.Csv); + Exporter.ExportXlsx(path.ToString(), table); - var rows = MiniExcel.Query(path.ToString()).ToList(); + var rows = Importer.QueryXlsx(path.ToString()).ToList(); Assert.Equal("Name", rows[0].B); Assert.Equal("Limit", rows[0].C); } } /// - /// MiniExcel.SaveAs(path, table,sheetName:“Name”) ,the actual sheetName is Sheet1 + /// _exporter.ExportXlsx(path, table,sheetName:“Name”) ,the actual sheetName is Sheet1 /// https://github.com/mini-software/MiniExcel/issues/212 /// [Fact] @@ -2769,9 +2756,9 @@ public void Issue212() { const string sheetName = "Demo"; using var path = AutoDeletingPath.Create(); - MiniExcel.SaveAs(path.ToString(), new[] { new { x = 1, y = 2 } }, sheetName: sheetName); + Exporter.ExportXlsx(path.ToString(), new[] { new { x = 1, y = 2 } }, sheetName: sheetName); - var actualSheetName = MiniExcel.GetSheetNames(path.ToString()).ToList()[0]; + var actualSheetName = Importer.GetSheetNames(path.ToString()).ToList()[0]; Assert.Equal(sheetName, actualSheetName); } @@ -2797,8 +2784,8 @@ public void Issue207() } }; - MiniExcel.SaveAsByTemplate(path, tempaltePath, value); - var rows = MiniExcel.Query(path).ToList(); + Templater.ApplyXlsxTemplate(path, tempaltePath, value); + var rows = Importer.QueryXlsx(path).ToList(); Assert.Equal("項目1", rows[0].A); Assert.Equal("[]內容1,[]內容2,[]內容3,[]內容4,[]內容5", rows[0].B); @@ -2841,8 +2828,8 @@ public void Issue207() } }; - MiniExcel.SaveAsByTemplate(path, tempaltePath, value); - var rows = MiniExcel.Query(path).ToList(); + Templater.ApplyXlsxTemplate(path, tempaltePath, value); + var rows = Importer.QueryXlsx(path).ToList(); Assert.Equal("項目1", rows[0].A); Assert.Equal("[]內容1,[]內容2,[]內容3,[]內容4,[]內容5", rows[0].C); @@ -2870,8 +2857,8 @@ public void Issue87() Tests = Enumerable.Range(1, 5).Select((_, i) => new { test1 = i, test2 = i }) }; - var rows = MiniExcel.Query(templatePath).ToList(); - MiniExcel.SaveAsByTemplate(path.ToString(), templatePath, value); + var rows = Importer.QueryXlsx(templatePath).ToList(); + Templater.ApplyXlsxTemplate(path.ToString(), templatePath, value); } /// @@ -2881,7 +2868,7 @@ public void Issue87() public void Issue208() { const string path = "../../../../../samples/xlsx/TestIssue208.xlsx"; - var columns = MiniExcel.GetColumns(path).ToList(); + var columns = Importer.GetXlsxColumns(path).ToList(); Assert.Equal(16384, columns.Count); Assert.Equal("XFD", columns[16383]); } @@ -2905,7 +2892,7 @@ public void Issue206() { ["employees"] = dt }; - MiniExcel.SaveAsByTemplate(path.ToString(), templatePath, value); + Templater.ApplyXlsxTemplate(path.ToString(), templatePath, value); var dimension = Helpers.GetFirstSheetDimensionRefValue(path.ToString()); Assert.Equal("A1:B2", dimension); @@ -2921,7 +2908,7 @@ public void Issue206() dt.Rows.Add("Jack", "HR"); var value = new Dictionary { ["employees"] = dt }; - MiniExcel.SaveAsByTemplate(path.ToString(), templatePath, value); + Templater.ApplyXlsxTemplate(path.ToString(), templatePath, value); var dimension = Helpers.GetFirstSheetDimensionRefValue(path.ToString()); Assert.Equal("A1:B2", dimension); @@ -2957,11 +2944,11 @@ public void Issue193() new { name = "Keaton", department = "IT" } } }; - MiniExcel.SaveAsByTemplate(path, templatePath, value); + Templater.ApplyXlsxTemplate(path, templatePath, value); - foreach (var sheetName in MiniExcel.GetSheetNames(path)) + foreach (var sheetName in Importer.GetSheetNames(path)) { - var rows = MiniExcel.Query(path, sheetName: sheetName).ToList(); + var rows = Importer.QueryXlsx(path, sheetName: sheetName).ToList(); Assert.Equal(9, rows.Count); Assert.Equal("FooCompany", rows[0].A); @@ -3008,8 +2995,8 @@ public void Issue193() new {name="Keaton",department="IT"} } }; - MiniExcel.SaveAsByTemplate(path.ToString(), templatePath, value); - var rows = MiniExcel.Query(path.ToString()).ToList(); + Templater.ApplyXlsxTemplate(path.ToString(), templatePath, value); + var rows = Importer.QueryXlsx(path.ToString()).ToList(); Assert.Equal("FooCompany", rows[0].A); Assert.Equal("Jack", rows[2].B); @@ -3047,12 +3034,12 @@ public void Issue142() MyProperty7 = "MyProperty7" } ]; - var rowsWritten = MiniExcel.SaveAs(path, values); + var rowsWritten = Exporter.ExportXlsx(path, values); Assert.Single(rowsWritten); Assert.Equal(1, rowsWritten[0]); { - var rows = MiniExcel.Query(path).ToList(); + var rows = Importer.QueryXlsx(path).ToList(); Assert.Equal("MyProperty4", rows[0].A); Assert.Equal("CustomColumnName", rows[0].B); @@ -3072,7 +3059,7 @@ public void Issue142() } { - var rows = MiniExcel.Query(path).ToList(); + var rows = Importer.QueryXlsx(path).ToList(); Assert.Equal("MyProperty4", rows[0].MyProperty4); Assert.Equal("MyProperty1", rows[0].MyProperty1); @@ -3085,7 +3072,7 @@ public void Issue142() } { - using var file = AutoDeletingPath.Create(ExcelType.CSV); + using var file = AutoDeletingPath.Create(ExcelType.Csv); var path = file.ToString(); Issue142VO[] values = [ @@ -3096,7 +3083,7 @@ public void Issue142() MyProperty7 = "MyProperty7" } ]; - var rowsWritten = MiniExcel.SaveAs(path, values); + var rowsWritten = Exporter.ExportCsv(path, values); Assert.Single(rowsWritten); Assert.Equal(1, rowsWritten[0]); @@ -3110,7 +3097,7 @@ public void Issue142() Assert.Equal(expected, File.ReadAllText(path)); { - var rows = MiniExcel.Query(path).ToList(); + var rows = Importer.QueryCsv(path).ToList(); Assert.Equal("MyProperty4", rows[0].MyProperty4); Assert.Equal("MyProperty1", rows[0].MyProperty1); @@ -3123,12 +3110,12 @@ public void Issue142() } { - using var path = AutoDeletingPath.Create(ExcelType.CSV); + using var path = AutoDeletingPath.Create(ExcelType.Csv); Issue142VoDuplicateColumnName[] input = [ new() { MyProperty1 = 0, MyProperty2 = 0, MyProperty3 = 0, MyProperty4 = 0 } ]; - Assert.Throws(() => MiniExcel.SaveAs(path.ToString(), input)); + Assert.Throws(() => Exporter.ExportCsv(path.ToString(), input)); } } @@ -3138,13 +3125,13 @@ public void Issue142_Query() const string path = "../../../../../samples/xlsx/TestIssue142.xlsx"; const string csvPath = "../../../../../samples/csv/TestIssue142.csv"; { - var rows = MiniExcel.Query(path).ToList(); + var rows = Importer.QueryXlsx(path).ToList(); Assert.Equal(0, rows[0].MyProperty1); } - Assert.Throws(() => MiniExcel.Query(path).ToList()); + Assert.Throws(() => Importer.QueryXlsx(path).ToList()); - var rowsXlsx = MiniExcel.Query(path).ToList(); + var rowsXlsx = Importer.QueryXlsx(path).ToList(); Assert.Equal("CustomColumnName", rowsXlsx[0].MyProperty1); Assert.Null(rowsXlsx[0].MyProperty7); Assert.Equal("MyProperty2", rowsXlsx[0].MyProperty2); @@ -3153,7 +3140,7 @@ public void Issue142_Query() Assert.Equal("MyProperty102", rowsXlsx[0].MyProperty5); Assert.Equal("MyProperty6", rowsXlsx[0].MyProperty6); - var rowsCsv = MiniExcel.Query(csvPath).ToList(); + var rowsCsv = Importer.QueryCsv(csvPath).ToList(); Assert.Equal("CustomColumnName", rowsCsv[0].MyProperty1); Assert.Null(rowsCsv[0].MyProperty7); Assert.Equal("MyProperty2", rowsCsv[0].MyProperty2); @@ -3165,41 +3152,41 @@ public void Issue142_Query() private class Issue142VO { - [ExcelColumnName("CustomColumnName")] + [MiniExcelColumnName("CustomColumnName")] public string MyProperty1 { get; set; } //index = 1 - [ExcelIgnore] + [MiniExcelIgnore] public string MyProperty7 { get; set; } //index = null public string MyProperty2 { get; set; } //index = 3 - [ExcelColumnIndex(6)] + [MiniExcelColumnIndex(6)] public string MyProperty3 { get; set; } //index = 6 - [ExcelColumnIndex("A")] // equal column index 0 + [MiniExcelColumnIndex("A")] // equal column index 0 public string MyProperty4 { get; set; } - [ExcelColumnIndex(2)] + [MiniExcelColumnIndex(2)] public string MyProperty5 { get; set; } //index = 2 public string MyProperty6 { get; set; } //index = 4 } private class Issue142VoDuplicateColumnName { - [ExcelColumnIndex("A")] + [MiniExcelColumnIndex("A")] public int MyProperty1 { get; set; } - [ExcelColumnIndex("A")] + [MiniExcelColumnIndex("A")] public int MyProperty2 { get; set; } public int MyProperty3 { get; set; } - [ExcelColumnIndex("B")] + [MiniExcelColumnIndex("B")] public int MyProperty4 { get; set; } } private class Issue142VoOverIndex { - [ExcelColumnIndex("Z")] + [MiniExcelColumnIndex("Z")] public int MyProperty1 { get; set; } } private class Issue142VoExcelColumnNameNotFound { - [ExcelColumnIndex("B")] + [MiniExcelColumnIndex("B")] public int MyProperty1 { get; set; } } @@ -3211,19 +3198,19 @@ public void Issue150() { var path = Path.Combine(Path.GetTempPath(), $"{Guid.NewGuid()}.xlsx"); - Assert.Throws(() => MiniExcel.SaveAs(path, new[] { 1, 2 })); + Assert.Throws(() => Exporter.ExportXlsx(path, new[] { 1, 2 })); File.Delete(path); - Assert.Throws(() => MiniExcel.SaveAs(path, new[] { "1", "2" })); + Assert.Throws(() => Exporter.ExportXlsx(path, new[] { "1", "2" })); File.Delete(path); - Assert.Throws(() => MiniExcel.SaveAs(path, new[] { '1', '2' })); + Assert.Throws(() => Exporter.ExportXlsx(path, new[] { '1', '2' })); File.Delete(path); - Assert.Throws(() => MiniExcel.SaveAs(path, new[] { DateTime.Now })); + Assert.Throws(() => Exporter.ExportXlsx(path, new[] { DateTime.Now })); File.Delete(path); - Assert.Throws(() => MiniExcel.SaveAs(path, new[] { Guid.NewGuid() })); + Assert.Throws(() => Exporter.ExportXlsx(path, new[] { Guid.NewGuid() })); File.Delete(path); } @@ -3238,7 +3225,7 @@ public void Issue157() var path = file.ToString(); _output.WriteLine("==== SaveAs by strongly type ===="); - var input = JsonConvert.DeserializeObject>( + var input = JsonConvert.DeserializeObject>( """ [ { @@ -3273,11 +3260,11 @@ public void Issue157() } ] """); - MiniExcel.SaveAs(path, input); + Exporter.ExportXlsx(path, input); - var rows = MiniExcel.Query(path, sheetName: "Sheet1").ToList(); + var rows = Importer.QueryXlsx(path, sheetName: "Sheet1").ToList(); Assert.Equal(6, rows.Count); - Assert.Equal("Sheet1", MiniExcel.GetSheetNames(path).First()); + Assert.Equal("Sheet1", Importer.GetSheetNames(path).First()); using var p = new ExcelPackage(new FileInfo(path)); var ws = p.Workbook.Worksheets.First(); @@ -3288,9 +3275,9 @@ public void Issue157() const string path = "../../../../../samples/xlsx/TestIssue157.xlsx"; { - var rows = MiniExcel.Query(path, sheetName: "Sheet1").ToList(); + var rows = Importer.QueryXlsx(path, sheetName: "Sheet1").ToList(); Assert.Equal(6, rows.Count); - Assert.Equal("Sheet1", MiniExcel.GetSheetNames(path).First()); + Assert.Equal("Sheet1", Importer.GetSheetNames(path).First()); } using (var p = new ExcelPackage(new FileInfo(path))) { @@ -3300,7 +3287,7 @@ public void Issue157() } { - var rows = MiniExcel.Query(path, sheetName: "Sheet1").ToList(); + var rows = Importer.QueryXlsx(path, sheetName: "Sheet1").ToList(); Assert.Equal(5, rows.Count); Assert.Equal(Guid.Parse("78DE23D2-DCB6-BD3D-EC67-C112BBC322A2"), rows[0].ID); @@ -3333,7 +3320,7 @@ public void Issue149() { const string path = "../../../../../samples/xlsx/TestIssue149.xlsx"; - var rows = MiniExcel.Query(path).Select(s => (string)s.A).ToList(); + var rows = Importer.QueryXlsx(path).Select(s => (string)s.A).ToList(); for (int i = 0; i < chars.Length; i++) { //output.WriteLine($"{i} , {chars[i]} , {rows[i]}"); @@ -3347,9 +3334,9 @@ public void Issue149() { using var path = AutoDeletingPath.Create(); var input = chars.Select(s => new { Test = s.ToString() }); - MiniExcel.SaveAs(path.ToString(), input); + Exporter.ExportXlsx(path.ToString(), input); - var rows = MiniExcel.Query(path.ToString(), true).Select(s => (string)s.Test).ToList(); + var rows = Importer.QueryXlsx(path.ToString(), true).Select(s => (string)s.Test).ToList(); for (int i = 0; i < chars.Length; i++) { _output.WriteLine($"{i}, {chars[i]}, {rows[i]}"); @@ -3363,9 +3350,9 @@ public void Issue149() { using var path = AutoDeletingPath.Create(); var input = chars.Select(s => new { Test = s.ToString() }); - MiniExcel.SaveAs(path.ToString(), input); + Exporter.ExportXlsx(path.ToString(), input); - var rows = MiniExcel.Query(path.ToString()).Select(s => s.Test).ToList(); + var rows = Importer.QueryXlsx(path.ToString()).Select(s => s.Test).ToList(); for (int i = 0; i < chars.Length; i++) { _output.WriteLine($"{i}, {chars[i]}, {rows[i]}"); @@ -3389,7 +3376,7 @@ private class Issue149VO public void Issue153() { const string path = "../../../../../samples/xlsx/TestIssue153.xlsx"; - var rows = MiniExcel.Query(path, true).First() as IDictionary; + var rows = Importer.QueryXlsx(path, true).First() as IDictionary; Assert.Equal( [ "序号", "代号", "新代号", "名称", "XXX", "部门名称", "单位", "ERP工时 (小时)A", "工时(秒) A/3600", "标准人工工时(秒)", @@ -3406,7 +3393,7 @@ public void Issue137() const string path = "../../../../../samples/xlsx/TestIssue137.xlsx"; { - var rows = MiniExcel.Query(path).ToList(); + var rows = Importer.QueryXlsx(path).ToList(); var first = rows[0] as IDictionary; // https://user-images.githubusercontent.com/12729184/113266322-ba06e400-9307-11eb-9521-d36abfda75cc.png Assert.Equal(["A", "B", "C", "D", "E", "F", "G", "H"], first?.Keys.ToArray()); Assert.Equal(11, rows.Count); @@ -3440,7 +3427,7 @@ public void Issue137() // dynamic query with head { - var rows = MiniExcel.Query(path, true).ToList(); + var rows = Importer.QueryXlsx(path, true).ToList(); var first = rows[0] as IDictionary; //![image](https://user-images.githubusercontent.com/12729184/113266322-ba06e400-9307-11eb-9521-d36abfda75cc.png) Assert.Equal(["比例", "商品", "滿倉口數", "0", "1為港幣 0為台幣"], first?.Keys.ToArray()); Assert.Equal(10, rows.Count); @@ -3460,7 +3447,7 @@ public void Issue137() } { - var rows = MiniExcel.Query(path).ToList(); + var rows = Importer.QueryXlsx(path).ToList(); Assert.Equal(10, rows.Count); { var row = rows[0]; @@ -3492,7 +3479,7 @@ public void Issue138() { const string path = "../../../../../samples/xlsx/TestIssue138.xlsx"; { - var rows = MiniExcel.Query(path, true).ToList(); + var rows = Importer.QueryXlsx(path, true).ToList(); Assert.Equal(6, rows.Count); foreach (var index in new[] { 0, 2, 5 }) @@ -3517,7 +3504,7 @@ public void Issue138() } { - var rows = MiniExcel.Query(path).ToList(); + var rows = Importer.QueryXlsx(path).ToList(); Assert.Equal(6, rows.Count); Assert.Equal(new DateTime(2021, 3, 1), rows[0].Date); @@ -3583,7 +3570,7 @@ public void IssueI50VD5() ["A"] = list1, ["B"] = list2, }; - MiniExcel.SaveAs(path, sheets); + Exporter.ExportXlsx(path, sheets); { Assert.Contains("/xl/media/", Helpers.GetZipFileContent(path, "xl/drawings/_rels/drawing1.xml.rels")); @@ -3626,7 +3613,7 @@ public void Issue422() var enumerableWithCount = new Issue422Enumerable(items); using var path = AutoDeletingPath.Create(); - MiniExcel.SaveAs(path.ToString(), enumerableWithCount); + Exporter.ExportXlsx(path.ToString(), enumerableWithCount); Assert.Equal(1, enumerableWithCount.GetEnumeratorCount); } @@ -3652,7 +3639,7 @@ public void Issue459() } }; - ms.SaveAsByTemplate(template, values); + Templater.ApplyXlsxTemplate(ms, template, values); } [Fact] @@ -3668,9 +3655,9 @@ public void Issue527() var template = PathHelper.GetFile("xlsx/Issue527Template.xlsx"); using var path = AutoDeletingPath.Create(); - MiniExcel.SaveAsByTemplate(path.FilePath, template, value); + Templater.ApplyXlsxTemplate(path.FilePath, template, value); - var rows = MiniExcel.Query(path.FilePath).ToList(); + var rows = Importer.QueryXlsx(path.FilePath).ToList(); Assert.Equal("General User", rows[1].B); Assert.Equal("General Administrator", rows[2].B); } @@ -3704,9 +3691,9 @@ WITH test('Id', 'Name') AS ( using var reader = cmd.ExecuteReader(); using var path = AutoDeletingPath.Create(); - MiniExcel.SaveAs(path.FilePath, reader, configuration: excelconfig, overwriteFile: true); + Exporter.ExportXlsx(path.FilePath, reader, configuration: excelconfig, overwriteFile: true); - var rows = MiniExcel.Query(path.FilePath).ToList(); + var rows = Importer.QueryXlsx(path.FilePath).ToList(); Assert.All(rows, x => Assert.Single(x)); Assert.Equal("Name", rows[0].A); } @@ -3722,7 +3709,7 @@ private class Issue585VO2 { public string Col1 { get; set; } - [ExcelColumnName("Col2")] + [MiniExcelColumnName("Col2")] public string Prop2 { get; set; } public string Col3 { get; set; } @@ -3732,7 +3719,7 @@ private class Issue585VO3 { public string Col1 { get; set; } - [ExcelColumnIndex("B")] + [MiniExcelColumnIndex("B")] public string Prop2 { get; set; } public string Col3 { get; set; } @@ -3743,20 +3730,20 @@ public void Issue585() { const string path = "../../../../../samples/xlsx/TestIssue585.xlsx"; - var items1 = MiniExcel.Query(path); + var items1 = Importer.QueryXlsx(path); Assert.Equal(2, items1.Count()); - var items2 = MiniExcel.Query(path); + var items2 = Importer.QueryXlsx(path); Assert.Equal(2, items2.Count()); - var items3 = MiniExcel.Query(path); + var items3 = Importer.QueryXlsx(path); Assert.Equal(2, items3.Count()); } private class Issue542 { - [ExcelColumnIndex(0)] public Guid ID { get; set; } - [ExcelColumnIndex(1)] public string Name { get; set; } + [MiniExcelColumnIndex(0)] public Guid ID { get; set; } + [MiniExcelColumnIndex(1)] public string Name { get; set; } } [Fact] @@ -3764,8 +3751,8 @@ public void Issue_542() { const string path = "../../../../../samples/xlsx/TestIssue542.xlsx"; - var resultWithoutFirstRow = MiniExcel.Query(path).ToList(); - var resultWithFirstRow = MiniExcel.Query(path, hasHeader: false).ToList(); + var resultWithoutFirstRow = Importer.QueryXlsx(path).ToList(); + var resultWithFirstRow = Importer.QueryXlsx(path, treatHeaderAsData: true).ToList(); Assert.Equal(15, resultWithoutFirstRow.Count); Assert.Equal(16, resultWithFirstRow.Count); @@ -3812,11 +3799,11 @@ public void Issue507_1() // create using (var stream = File.Create(path)) { - stream.SaveAs(values, excelType: ExcelType.CSV, configuration: config); + Exporter.ExportCsv(stream, values, configuration: config); } // read - var getRowsInfo = MiniExcel.Query(path, excelType: ExcelType.CSV, configuration: config).ToArray(); + var getRowsInfo = Importer.QueryCsv(path, configuration: config).ToArray(); Assert.Equal(values.Length, getRowsInfo.Length); @@ -3859,11 +3846,11 @@ public void Issue507_2() // create using (var stream = File.Create(path)) { - stream.SaveAs(values, excelType: ExcelType.CSV, configuration: config); + Exporter.ExportCsv(stream, values, true, config); } // read - var getRowsInfo = MiniExcel.Query(path, excelType: ExcelType.CSV, configuration: config).ToArray(); + var getRowsInfo = Importer.QueryCsv(path, configuration: config).ToArray(); Assert.Equal(values.Length, getRowsInfo.Length); File.Delete(path); @@ -3885,7 +3872,7 @@ public void Issue507_3_MismatchedQuoteCsv() using var stream = new MemoryStream(Encoding.UTF8.GetBytes("A,B,C\n\"r1a: no end quote,r1b,r1c")); // read - var getRowsInfo = stream.Query(excelType: ExcelType.CSV, configuration: config).ToArray(); + var getRowsInfo = Importer.QueryCsv(stream, configuration: config).ToArray(); Assert.Equal(2, getRowsInfo.Length); } @@ -3933,7 +3920,7 @@ public void Issue606_1() ); const string templateFileName = "../../../../../samples/xlsx/TestIssue606_Template.xlsx"; - MiniExcel.SaveAsByTemplate(path, Path.GetFullPath(templateFileName), value); + Templater.ApplyXlsxTemplate(path, Path.GetFullPath(templateFileName), value); File.Delete(path); } @@ -3954,7 +3941,7 @@ public void TestIssue627() using var path = AutoDeletingPath.Create(); var value = new[] { new { long2 = "1550432695793487872" } }; - var rowsWritten = MiniExcel.SaveAs(path.ToString(), value, configuration: config); + var rowsWritten = Exporter.ExportXlsx(path.ToString(), value, configuration: config); Assert.Single(rowsWritten); Assert.Equal(1, rowsWritten[0]); @@ -3990,7 +3977,7 @@ public void Issue632_1() string.Concat(nameof(MiniExcelIssueTests), "_", nameof(Issue632_1), ".xlsx") ); - MiniExcel.SaveAs(path, values, excelType: ExcelType.XLSX, configuration: config, overwriteFile: true); + Exporter.ExportXlsx(path, values, configuration: config, overwriteFile: true); File.Delete(path); } @@ -4015,7 +4002,7 @@ static IEnumerable GetTestData() using var memoryStream = new MemoryStream(); var testData = GetTestData(); - var rowsWritten = memoryStream.SaveAs(testData, configuration: new OpenXmlConfiguration + var rowsWritten = Exporter.ExportXlsx(memoryStream, testData, configuration: new OpenXmlConfiguration { FastMode = true }); @@ -4024,7 +4011,7 @@ static IEnumerable GetTestData() memoryStream.Position = 0; - var queryData = memoryStream.Query().ToList(); + var queryData = Importer.QueryXlsx(memoryStream).ToList(); Assert.Equal(testData.Count(), queryData.Count); @@ -4053,14 +4040,14 @@ static IEnumerable GetTestData() using var memoryStream = new MemoryStream(); var testData = GetTestData(); - await memoryStream.SaveAsAsync(testData, configuration: new OpenXmlConfiguration + await Exporter.ExportXlsxAsync(memoryStream, testData, configuration: new OpenXmlConfiguration { FastMode = true, }); memoryStream.Position = 0; - var queryData = (memoryStream.QueryAsync().ToBlockingEnumerable()).ToList(); + var queryData = Importer.QueryXlsxAsync(memoryStream).ToBlockingEnumerable().ToList(); Assert.Equal(testData.Count(), queryData.Count); @@ -4078,10 +4065,10 @@ public void Issue_686() { var path = PathHelper.GetFile("xlsx/TestIssue686.xlsx"); Assert.Throws(() => - MiniExcel.QueryRange(path, useHeaderRow: false, startCell: "ZZFF10", endCell: "ZZFF11").First()); + Importer.QueryRangeXlsx(path, useHeaderRow: false, startCell: "ZZFF10", endCell: "ZZFF11").First()); Assert.Throws(() => - MiniExcel.QueryRange(path, useHeaderRow: false, startCell: "ZZFF@@10", endCell: "ZZFF@@11").First()); + Importer.QueryRangeXlsx(path, useHeaderRow: false, startCell: "ZZFF@@10", endCell: "ZZFF@@11").First()); } [Fact] @@ -4091,9 +4078,9 @@ public void Test_Issue_693_SaveSheetWithLongName() using var path2 = AutoDeletingPath.Create(); List> data = [new() { ["First"] = 1, ["Second"] = 2 }]; - Assert.Throws(() => MiniExcel.SaveAs(path1.ToString(), data, sheetName: "Some Really Looooooooooong Sheet Name")); - MiniExcel.SaveAs(path2.ToString(), new List>()); - Assert.Throws(() => MiniExcel.Insert(path2.ToString(), data, sheetName: "Some Other Very Looooooong Sheet Name")); + Assert.Throws(() => Exporter.ExportXlsx(path1.ToString(), data, sheetName: "Some Really Looooooooooong Sheet Name")); + Exporter.ExportXlsx(path2.ToString(), new List>()); + Assert.Throws(() => Exporter.InsertXlsxSheet(path2.ToString(), data, sheetName: "Some Other Very Looooooong Sheet Name")); } private class Issue697 @@ -4107,8 +4094,8 @@ private class Issue697 public void Test_Issue_697_EmptyRowsStronglyTypedQuery() { const string path = "../../../../../samples/xlsx/TestIssue697.xlsx"; - var rowsIgnoreEmpty = MiniExcel.Query(path, configuration: new OpenXmlConfiguration { IgnoreEmptyRows = true }).ToList(); - var rowsCountEmpty = MiniExcel.Query(path).ToList(); + var rowsIgnoreEmpty = Importer.QueryXlsx(path, configuration: new OpenXmlConfiguration { IgnoreEmptyRows = true }).ToList(); + var rowsCountEmpty = Importer.QueryXlsx(path).ToList(); Assert.Equal(4, rowsIgnoreEmpty.Count); Assert.Equal(5, rowsCountEmpty.Count); } @@ -4118,13 +4105,13 @@ public void Issue_710() { var values = new[] { new { Column1 = "MiniExcel", Column2 = 1, Column3 = "Test" } }; using var memoryStream = new MemoryStream(); - memoryStream.SaveAs(values, configuration: new OpenXmlConfiguration + Exporter.ExportXlsx(memoryStream, values, configuration: new OpenXmlConfiguration { FastMode = true }); memoryStream.Position = 0; - using var dataReader = memoryStream.GetReader(useHeaderRow: false); + using var dataReader = Importer.GetXlsxDataReader(memoryStream, useHeaderRow: false); dataReader.Read(); for (int i = 0; i < dataReader.FieldCount; i++) @@ -4143,9 +4130,9 @@ public void Issue_732_First_Sheet_Active() const string path2 = "../../../../../samples/xlsx/TestIssue732_2.xlsx"; const string path3 = "../../../../../samples/xlsx/TestIssue732_3.xlsx"; - var info1 = MiniExcel.GetSheetInformations(path1); - var info2 = MiniExcel.GetSheetInformations(path2); - var info3 = MiniExcel.GetSheetInformations(path3); + var info1 = Importer.GetSheetInformations(path1); + var info2 = Importer.GetSheetInformations(path2); + var info3 = Importer.GetSheetInformations(path3); Assert.Equal(0u, info1.SingleOrDefault(x => x.Active)?.Index); // first sheet is active Assert.Equal(1u, info2.SingleOrDefault(x => x.Active)?.Index); // second sheet is active @@ -4164,9 +4151,9 @@ public void TestIssue750() ["list"] = Enumerable.Range(0, 10_000) .Select(_ => new { value1 = Guid.NewGuid(), value2 = Guid.NewGuid(), }) }; - MiniExcel.SaveAsByTemplate(path.ToString(), templatePath, data); + Templater.ApplyXlsxTemplate(path.ToString(), templatePath, data); - var rows = MiniExcel.Query(path.ToString()) + var rows = Importer.QueryXlsx(path.ToString()) .Skip(1453) .Take(2) .ToList(); @@ -4196,7 +4183,7 @@ public void TestIssue751() { ["list"] = list }; - MiniExcel.SaveAsByTemplate(path.ToString(), templatePath, data); + Templater.ApplyXlsxTemplate(path.ToString(), templatePath, data); using var stream = File.OpenRead(path.ToString()); using var workbook = new XSSFWorkbook(stream); @@ -4225,7 +4212,7 @@ public void TestIssue751() public void TestIssue763() { var path = PathHelper.GetFile("xlsx/TestIssue763.xlsx"); - var rows = MiniExcel.QueryRange(path, startCell: "A3", endCell: "J3").ToArray(); + var rows = Importer.QueryRangeXlsx(path, startCell: "A3", endCell: "J3").ToArray(); Assert.Equal("A3", rows[0].A); Assert.Equal(null, rows[0].J); } @@ -4254,8 +4241,8 @@ public void TestIssue768() ["list"] = list }; - MiniExcel.SaveAsByTemplate(path.ToString(), templatePath, data); - var rows = MiniExcel.Query(path.ToString(), startCell: "A16").ToList(); + Templater.ApplyXlsxTemplate(path.ToString(), templatePath, data); + var rows = Importer.QueryXlsx(path.ToString(), startCell: "A16").ToList(); Assert.Equal(list[0].value1.ToString(), rows[0].A.ToString()); Assert.Equal(list[1].value1.ToString(), rows[1].A.ToString()); @@ -4290,7 +4277,7 @@ public void TestIssue186() } ]; - MiniExcel.AddPicture(path.FilePath, images); + Exporter.AddPictureXlsx(path.FilePath, images); } /// @@ -4318,8 +4305,8 @@ public void TestIssue771() list12 = GetEnumerable() }; - MiniExcel.SaveAsByTemplate(path.FilePath, template, value); - var rows = MiniExcel.Query(path.FilePath).ToList(); + Templater.ApplyXlsxTemplate(path.FilePath, template, value); + var rows = Importer.QueryXlsx(path.FilePath).ToList(); Assert.Equal("2025-1", rows[2].B); Assert.Equal(null, rows[3].B); @@ -4337,7 +4324,7 @@ public void TestIssue771() public void TestIssue772() { var path = PathHelper.GetFile("xlsx/TestIssue772.xlsx"); - var rows = MiniExcel.Query(path, sheetName: "Supply plan(daily)", startCell: "A1") + var rows = Importer.QueryXlsx(path, sheetName: "Supply plan(daily)", startCell: "A1") .Cast>() .ToArray(); @@ -4361,8 +4348,8 @@ public void TestIssue773() var fill = new { t = a }; using var path = AutoDeletingPath.Create(); - MiniExcel.SaveAsByTemplate(path.FilePath, templatePath, fill); - var rows = MiniExcel.Query(path.FilePath).ToList(); + Templater.ApplyXlsxTemplate(path.FilePath, templatePath, fill); + var rows = Importer.QueryXlsx(path.FilePath).ToList(); Assert.Equal("H1", rows[4].AF); Assert.Equal("c3", rows[6].AA); @@ -4381,7 +4368,7 @@ public void TestIssue789() new Dictionary { {"no","2"} }, new Dictionary { {"no","3"} }, }; - MiniExcel.SaveAs(path, value); + Exporter.ExportXlsx(path, value); var xml = Helpers.GetZipFileContent(path.ToString(), "xl/worksheets/sheet1.xml"); @@ -4426,11 +4413,12 @@ public void TestIssue814() } ]; - MiniExcel.AddPicture(path.FilePath, images); + Exporter.AddPictureXlsx(path.FilePath, images); using var package = new ExcelPackage(new FileInfo(path.FilePath)); - // Check picture in the first sheet (C3) - var firstSheet = package.Workbook.Worksheets[0]; + + // Check picture in the first sheet (C3) + var firstSheet = package.Workbook.Worksheets[0]; var pictureInC3 = firstSheet.Drawings.OfType().FirstOrDefault(p => p.From.Column == 2 && p.From.Row == 2); Assert.NotNull(pictureInC3); @@ -4478,10 +4466,9 @@ public void TestIssue815() } ]; - MiniExcel.AddPicture(path.FilePath, images); - //ExcelPackage.LicenseContext = LicenseContext.NonCommercial; + Exporter.AddPictureXlsx(path.FilePath, images); - using (var package = new ExcelPackage(new FileInfo(path.FilePath))) + using (var package = new ExcelPackage(new FileInfo(path.FilePath))) { // Check picture in the first sheet (C3) var firstSheet = package.Workbook.Worksheets[0]; @@ -4538,10 +4525,9 @@ public void TestIssue816() } ]; - MiniExcel.AddPicture(path.FilePath, images); - //ExcelPackage.LicenseContext = LicenseContext.NonCommercial; + Exporter.AddPictureXlsx(path.FilePath, images); - using var package = new ExcelPackage(new FileInfo(path.FilePath)); + using var package = new ExcelPackage(new FileInfo(path.FilePath)); // Check picture in the first sheet (C3) var firstSheet = package.Workbook.Worksheets[0]; @@ -4591,7 +4577,7 @@ public void TestIssue816() } ]; - MiniExcel.AddPicture(path.FilePath, images); + Exporter.AddPictureXlsx(path.FilePath, images); using var package = new ExcelPackage(new FileInfo(path.FilePath)); // Check picture in the first sheet (C3) @@ -4640,7 +4626,7 @@ public void TestIssue816() public void TestIssue809() { var path = PathHelper.GetFile("xlsx/TestIssue809.xlsx"); - var rows = MiniExcel.Query(path).ToList(); + var rows = Importer.QueryXlsx(path).ToList(); Assert.Equal(3, rows.Count); Assert.Equal(null, rows[0].A); diff --git a/tests/MiniExcelTests/MiniExcelOpenXmlAsyncTests.cs b/tests/MiniExcelTests/MiniExcelOpenXmlAsyncTests.cs index abf31b64..951a036d 100644 --- a/tests/MiniExcelTests/MiniExcelOpenXmlAsyncTests.cs +++ b/tests/MiniExcelTests/MiniExcelOpenXmlAsyncTests.cs @@ -1,18 +1,21 @@ -using ClosedXML.Excel; -using Dapper; -using ExcelDataReader; -using MiniExcelLibs.Attributes; -using MiniExcelLibs.OpenXml; -using MiniExcelLibs.Tests.Utils; -using OfficeOpenXml; -using System.Data; +using System.Data; using System.Data.SQLite; using System.Globalization; using System.IO.Packaging; using System.Text; +using ClosedXML.Excel; +using Dapper; +using ExcelDataReader; +using MiniExcelLib.Core.Abstractions; +using MiniExcelLib.Core.Attributes; +using MiniExcelLib.Core.OpenXml; +using MiniExcelLib.Tests.Utils; +using Importer = MiniExcelLib.MiniExcel.Importer; +using Exporter = MiniExcelLib.MiniExcel.Exporter; +using OfficeOpenXml; using Xunit; -namespace MiniExcelLibs.Tests; +namespace MiniExcelLib.Tests; public class MiniExcelOpenXmlAsyncTests { @@ -33,10 +36,10 @@ public async Task SaveAsControlChracter() '\u0017','\u0018','\u0019','\u001A','\u001B','\u001C','\u001D','\u001E','\u001F','\u007F' ]; var input = chars.Select(s => new { Test = s.ToString() }); - await MiniExcel.SaveAsAsync(path, input); + await Exporter.ExportXlsxAsync(path, input); - var rows2 = MiniExcel.QueryAsync(path, true).ToBlockingEnumerable().ToArray(); - var rows1 = MiniExcel.QueryAsync(path).ToBlockingEnumerable().ToArray(); + var rows2 = Importer.QueryXlsxAsync(path, true).ToBlockingEnumerable().ToArray(); + var rows1 = Importer.QueryXlsxAsync(path).ToBlockingEnumerable().ToArray(); } private class SaveAsControlChracterVO @@ -46,33 +49,33 @@ private class SaveAsControlChracterVO private class ExcelAttributeDemo { - [ExcelColumnName("Column1")] + [MiniExcelColumnName("Column1")] public string Test1 { get; set; } - [ExcelColumnName("Column2")] + [MiniExcelColumnName("Column2")] public string Test2 { get; set; } - [ExcelIgnore] + [MiniExcelIgnore] public string Test3 { get; set; } - [ExcelColumnIndex("I")] // system will convert "I" to 8 index + [MiniExcelColumnIndex("I")] // system will convert "I" to 8 index public string Test4 { get; set; } public string Test5 { get; } //wihout set will ignore public string Test6 { get; private set; } //un-public set will ignore - [ExcelColumnIndex(3)] // start with 0 + [MiniExcelColumnIndex(3)] // start with 0 public string Test7 { get; set; } } private class ExcelAttributeDemo2 { - [ExcelColumn(Name = "Column1")] + [MiniExcelColumn(Name = "Column1")] public string Test1 { get; set; } - [ExcelColumn(Name = "Column2")] + [MiniExcelColumn(Name = "Column2")] public string Test2 { get; set; } - [ExcelColumn(Ignore = true)] + [MiniExcelColumn(Ignore = true)] public string Test3 { get; set; } - [ExcelColumn(IndexName = "I")] // system will convert "I" to 8 index + [MiniExcelColumn(IndexName = "I")] // system will convert "I" to 8 index public string Test4 { get; set; } public string Test5 { get; } //wihout set will ignore public string Test6 { get; private set; } //un-public set will ignore - [ExcelColumn(Index = 3)] // start with 0 + [MiniExcelColumn(Index = 3)] // start with 0 public string Test7 { get; set; } } @@ -82,7 +85,7 @@ public async Task CustomAttributeWihoutVaildPropertiesTest() const string path = "../../../../../samples/xlsx/TestCustomExcelColumnAttribute.xlsx"; await Assert.ThrowsAsync(async () => { - _ = MiniExcel.QueryAsync(path).ToBlockingEnumerable().ToList(); + _ = Importer.QueryXlsxAsync(path).ToBlockingEnumerable().ToList(); }); } @@ -90,7 +93,7 @@ await Assert.ThrowsAsync(async () => public async Task QueryCustomAttributesTest() { const string path = "../../../../../samples/xlsx/TestCustomExcelColumnAttribute.xlsx"; - var rows = MiniExcel.QueryAsync(path).ToBlockingEnumerable().ToList(); + var rows = Importer.QueryXlsxAsync(path).ToBlockingEnumerable().ToList(); Assert.Equal("Column1", rows[0].Test1); Assert.Equal("Column2", rows[0].Test2); @@ -105,7 +108,7 @@ public async Task QueryCustomAttributesTest() public async Task QueryCustomAttributes2Test() { const string path = "../../../../../samples/xlsx/TestCustomExcelColumnAttribute.xlsx"; - var rows = MiniExcel.QueryAsync(path).ToBlockingEnumerable().ToList(); + var rows = Importer.QueryXlsxAsync(path).ToBlockingEnumerable().ToList(); Assert.Equal("Column1", rows[0].Test1); Assert.Equal("Column2", rows[0].Test2); @@ -129,8 +132,8 @@ public async Task SaveAsCustomAttributesTest() Test4 = "Test4", }); - await MiniExcel.SaveAsAsync(path.ToString(), input); - var d = MiniExcel.QueryAsync(path.ToString(), true).ToBlockingEnumerable(); + await Exporter.ExportXlsxAsync(path.ToString(), input); + var d = Importer.QueryXlsxAsync(path.ToString(), true).ToBlockingEnumerable(); var rows = d.ToList(); var first = rows[0] as IDictionary; @@ -156,8 +159,8 @@ public async Task SaveAsCustomAttributes2Test() Test4 = "Test4", }); - await MiniExcel.SaveAsAsync(path.ToString(), input); - var d = MiniExcel.QueryAsync(path.ToString(), true).ToBlockingEnumerable(); + await Exporter.ExportXlsxAsync(path.ToString(), input); + var d = Importer.QueryXlsxAsync(path.ToString(), true).ToBlockingEnumerable(); var rows = d.ToList(); var first = rows[0] as IDictionary; @@ -172,7 +175,7 @@ public async Task SaveAsCustomAttributes2Test() private class CustomAttributesWihoutVaildPropertiesTestPoco { - [ExcelIgnore] + [MiniExcelIgnore] public string Test3 { get; set; } public string Test5 { get; } public string Test6 { get; private set; } @@ -182,7 +185,7 @@ private class CustomAttributesWihoutVaildPropertiesTestPoco public async Task QueryCastToIDictionary() { const string path = "../../../../../samples/xlsx/TestCenterEmptyRow/TestCenterEmptyRow.xlsx"; - foreach (IDictionary row in MiniExcel.QueryAsync(path).ToBlockingEnumerable()) + foreach (IDictionary row in Importer.QueryXlsxAsync(path).ToBlockingEnumerable()) { _ = row; } @@ -194,7 +197,7 @@ public async Task CenterEmptyRowsQueryTest() const string path = "../../../../../samples/xlsx/TestCenterEmptyRow/TestCenterEmptyRow.xlsx"; await using (var stream = File.OpenRead(path)) { - var d = (stream.QueryAsync().ToBlockingEnumerable()).Cast>(); + var d = Importer.QueryXlsxAsync(stream).ToBlockingEnumerable().Cast>(); var rows = d.ToList(); Assert.Equal("a", rows[0]["A"]); Assert.Equal("b", rows[0]["B"]); @@ -230,7 +233,7 @@ public async Task CenterEmptyRowsQueryTest() await using (var stream = File.OpenRead(path)) { - var d = (stream.QueryAsync(useHeaderRow: true).ToBlockingEnumerable()).Cast>(); + var d = Importer.QueryXlsxAsync(stream, useHeaderRow: true).ToBlockingEnumerable().Cast>(); var rows = d.ToList(); Assert.Equal(1d, rows[0]["a"]); Assert.Null(rows[0]["b"]); @@ -264,7 +267,7 @@ public async Task TestDynamicQueryBasic_WithoutHead() { const string path = "../../../../../samples/xlsx/TestDynamicQueryBasic_WithoutHead.xlsx"; await using var stream = File.OpenRead(path); - var d = (stream.QueryAsync().ToBlockingEnumerable()).Cast>(); + var d = Importer.QueryXlsxAsync(stream).ToBlockingEnumerable().Cast>(); var rows = d.ToList(); Assert.Equal("MiniExcel", rows[0]["A"]); @@ -279,7 +282,7 @@ public async Task TestDynamicQueryBasic_useHeaderRow() const string path = "../../../../../samples/xlsx/TestDynamicQueryBasic.xlsx"; await using (var stream = File.OpenRead(path)) { - var d = (stream.QueryAsync(useHeaderRow: true).ToBlockingEnumerable()).Cast>(); + var d = Importer.QueryXlsxAsync(stream, useHeaderRow: true).ToBlockingEnumerable().Cast>(); var rows = d.ToList(); Assert.Equal("MiniExcel", rows[0]["Column1"]); Assert.Equal(1d, rows[0]["Column2"]); @@ -288,7 +291,7 @@ public async Task TestDynamicQueryBasic_useHeaderRow() } { - var d = MiniExcel.QueryAsync(path, useHeaderRow: true).ToBlockingEnumerable(); + var d = Importer.QueryXlsxAsync(path, useHeaderRow: true).ToBlockingEnumerable(); var rows = d.ToList(); Assert.Equal("MiniExcel", rows[0].Column1); Assert.Equal(1d, rows[0].Column2); @@ -319,7 +322,7 @@ public async Task QueryStrongTypeMapping_Test() const string path = "../../../../../samples/xlsx/TestTypeMapping.xlsx"; await using (var stream = File.OpenRead(path)) { - var d = stream.QueryAsync(); + var d = Importer.QueryXlsxAsync(stream); var rows = d.ToBlockingEnumerable().ToList(); Assert.Equal(100, rows.Count); @@ -333,7 +336,7 @@ public async Task QueryStrongTypeMapping_Test() } { - var rows = MiniExcel.Query(path).ToList(); + var rows = Importer.QueryXlsx(path).ToList(); Assert.Equal(100, rows.Count); Assert.Equal(Guid.Parse("78DE23D2-DCB6-BD3D-EC67-C112BBC322A2"), rows[0].ID); @@ -360,7 +363,7 @@ public async Task AutoCheckTypeTest() { const string path = "../../../../../samples/xlsx/TestTypeMapping_AutoCheckFormat.xlsx"; await using var stream = FileHelper.OpenRead(path); - _ = stream.QueryAsync().ToBlockingEnumerable().ToList(); + _ = Importer.QueryXlsxAsync(stream).ToBlockingEnumerable().ToList(); } [Fact] @@ -369,7 +372,7 @@ public async Task TestDatetimeSpanFormat_ClosedXml() const string path = "../../../../../samples/xlsx/TestDatetimeSpanFormat_ClosedXml.xlsx"; await using var stream = FileHelper.OpenRead(path); - var d = (stream.QueryAsync().ToBlockingEnumerable()).Cast>(); + var d = Importer.QueryXlsxAsync(stream).ToBlockingEnumerable().Cast>(); var row = d.First(); var a = row["A"]; var b = row["B"]; @@ -384,13 +387,13 @@ public async Task LargeFileQueryStrongTypeMapping_Test() const string path = "../../../../../benchmarks/MiniExcel.Benchmarks/Test1,000,000x10.xlsx"; await using (var stream = File.OpenRead(path)) { - var d = stream.QueryAsync().ToBlockingEnumerable(); + var d = Importer.QueryXlsxAsync(stream).ToBlockingEnumerable(); var rows = d.Take(2).ToList(); Assert.Equal("HelloWorld2", rows[0].HelloWorld1); Assert.Equal("HelloWorld3", rows[1].HelloWorld1); } { - var d = MiniExcel.QueryAsync(path).ToBlockingEnumerable(); + var d = Importer.QueryXlsxAsync(path).ToBlockingEnumerable(); var rows = d.Take(2).ToList(); Assert.Equal("HelloWorld2", rows[0].HelloWorld1); Assert.Equal("HelloWorld3", rows[1].HelloWorld1); @@ -407,11 +410,11 @@ public async Task QueryExcelDataReaderCheckTest(string path) #endif await using var fs = File.OpenRead(path); - using var reader = ExcelDataReader.ExcelReaderFactory.CreateReader(fs); + using var reader = ExcelReaderFactory.CreateReader(fs); var exceldatareaderResult = reader.AsDataSet(); await using var stream = File.OpenRead(path); - var d = stream.QueryAsync().ToBlockingEnumerable(); + var d = Importer.QueryXlsxAsync(stream).ToBlockingEnumerable(); var rows = d.ToList(); Assert.Equal(exceldatareaderResult.Tables[0].Rows.Count, rows.Count); @@ -433,7 +436,7 @@ public async Task QuerySheetWithoutRAttribute() const string path = "../../../../../samples/xlsx/TestWihoutRAttribute.xlsx"; await using var stream = File.OpenRead(path); - var d = (stream.QueryAsync().ToBlockingEnumerable()).Cast>(); + var d = Importer.QueryXlsxAsync(stream).ToBlockingEnumerable().Cast>(); var rows = d.ToList(); var keys = rows.First().Keys; @@ -456,7 +459,7 @@ public async Task FixDimensionJustOneColumnParsingError_Test() { const string path = "../../../../../samples/xlsx/TestDimensionC3.xlsx"; await using var stream = File.OpenRead(path); - var d = stream.QueryAsync().ToBlockingEnumerable(); + var d = Importer.QueryXlsxAsync(stream).ToBlockingEnumerable(); var rows = d.ToList(); var keys = (rows.First() as IDictionary)?.Keys; Assert.Equal(3, keys?.Count); @@ -482,10 +485,10 @@ public async Task SaveAsFileWithDimensionByICollection() using (var file = AutoDeletingPath.Create()) { var path = file.ToString(); - await MiniExcel.SaveAsAsync(path, values); + await Exporter.ExportXlsxAsync(path, values); await using (var stream = File.OpenRead(path)) { - var d = (stream.QueryAsync(useHeaderRow: false).ToBlockingEnumerable()).Cast>(); + var d = Importer.QueryXlsxAsync(stream, useHeaderRow: false).ToBlockingEnumerable().Cast>(); var rows = d.ToList(); Assert.Equal(3, rows.Count); Assert.Equal("A", rows[0]["A"]); @@ -495,7 +498,7 @@ public async Task SaveAsFileWithDimensionByICollection() await using (var stream = File.OpenRead(path)) { - var d = (stream.QueryAsync(useHeaderRow: true).ToBlockingEnumerable()).Cast>(); + var d = Importer.QueryXlsxAsync(stream, useHeaderRow: true).ToBlockingEnumerable().Cast>(); var rows = d.ToList(); Assert.Equal(2, rows.Count); Assert.Equal("A", rows[0]["A"]); @@ -506,7 +509,7 @@ public async Task SaveAsFileWithDimensionByICollection() } using var newPath = AutoDeletingPath.Create(); - await MiniExcel.SaveAsAsync(newPath.ToString(), values, false); + await Exporter.ExportXlsxAsync(newPath.ToString(), values, false); Assert.Equal("A1:B2", Helpers.GetFirstSheetDimensionRefValue(newPath.ToString())); } @@ -516,10 +519,10 @@ public async Task SaveAsFileWithDimensionByICollection() using (var file = AutoDeletingPath.Create()) { var path = file.ToString(); - await MiniExcel.SaveAsAsync(path, values, false); + await Exporter.ExportXlsxAsync(path, values, false); await using (var stream = File.OpenRead(path)) { - var d = stream.QueryAsync(useHeaderRow: false).ToBlockingEnumerable(); + var d = Importer.QueryXlsxAsync(stream, useHeaderRow: false).ToBlockingEnumerable(); var rows = d.ToList(); Assert.Empty(rows); } @@ -530,10 +533,10 @@ public async Task SaveAsFileWithDimensionByICollection() using (var file = AutoDeletingPath.Create()) { var path = file.ToString(); - await MiniExcel.SaveAsAsync(path, values); + await Exporter.ExportXlsxAsync(path, values); { await using var stream = File.OpenRead(path); - var d = stream.QueryAsync(useHeaderRow: false).ToBlockingEnumerable(); + var d = Importer.QueryXlsxAsync(stream, useHeaderRow: false).ToBlockingEnumerable(); var rows = d.ToList(); Assert.Single(rows); } @@ -552,11 +555,11 @@ public async Task SaveAsFileWithDimensionByICollection() using (var file = AutoDeletingPath.Create()) { var path = file.ToString(); - await MiniExcel.SaveAsAsync(path, values); + await Exporter.ExportXlsxAsync(path, values); await using (var stream = File.OpenRead(path)) { - var d = (stream.QueryAsync(useHeaderRow: false).ToBlockingEnumerable()).Cast>(); + var d = Importer.QueryXlsxAsync(stream, useHeaderRow: false).ToBlockingEnumerable().Cast>(); var rows = d.ToList(); Assert.Equal(3, rows.Count); Assert.Equal("A", rows[0]["A"]); @@ -566,7 +569,7 @@ public async Task SaveAsFileWithDimensionByICollection() await using (var stream = File.OpenRead(path)) { - var d = (stream.QueryAsync(useHeaderRow: true).ToBlockingEnumerable()).Cast>(); + var d = Importer.QueryXlsxAsync(stream, useHeaderRow: true).ToBlockingEnumerable().Cast>(); var rows = d.ToList(); Assert.Equal(2, rows.Count); Assert.Equal("A", rows[0]["A"]); @@ -578,7 +581,7 @@ public async Task SaveAsFileWithDimensionByICollection() using (var path = AutoDeletingPath.Create()) { - await MiniExcel.SaveAsAsync(path.ToString(), values, false); + await Exporter.ExportXlsxAsync(path.ToString(), values, false); Assert.Equal("A1:B2", Helpers.GetFirstSheetDimensionRefValue(path.ToString())); } } @@ -587,7 +590,7 @@ public async Task SaveAsFileWithDimensionByICollection() { using var path = AutoDeletingPath.Create(); var values = new List(); - await Assert.ThrowsAsync(() => MiniExcel.SaveAsAsync(path.ToString(), values)); + await Assert.ThrowsAsync(() => Exporter.ExportXlsxAsync(path.ToString(), values)); } } @@ -599,15 +602,15 @@ public async Task SaveAsFileWithDimension() var path = file.ToString(); using var table = new DataTable(); - await MiniExcel.SaveAsAsync(path, table); + await Exporter.ExportXlsxAsync(path, table); Assert.Equal("A1", Helpers.GetFirstSheetDimensionRefValue(path)); { await using var stream = File.OpenRead(path); - var d = stream.QueryAsync().ToBlockingEnumerable(); + var d = Importer.QueryXlsxAsync(stream).ToBlockingEnumerable(); var rows = d.ToList(); Assert.Single(rows); } - await MiniExcel.SaveAsAsync(path, table, printHeader: false, overwriteFile: true); + await Exporter.ExportXlsxAsync(path, table, printHeader: false, overwriteFile: true); Assert.Equal("A1", Helpers.GetFirstSheetDimensionRefValue(path)); } { @@ -622,12 +625,12 @@ public async Task SaveAsFileWithDimension() table.Rows.Add(@"""<>+-*//}{\\n", 1234567890); table.Rows.Add("Hello World", -1234567890, false, DateTime.Now); - await MiniExcel.SaveAsAsync(path, table); + await Exporter.ExportXlsxAsync(path, table); Assert.Equal("A1:D3", Helpers.GetFirstSheetDimensionRefValue(path)); await using (var stream = File.OpenRead(path)) { - var d = (stream.QueryAsync(useHeaderRow: true).ToBlockingEnumerable()).Cast>(); + var d = Importer.QueryXlsxAsync(stream, useHeaderRow: true).ToBlockingEnumerable().Cast>(); var rows = d.ToList(); Assert.Equal(2, rows.Count); Assert.Equal(@"""<>+-*//}{\\n", rows[0]["a"]); @@ -638,7 +641,7 @@ public async Task SaveAsFileWithDimension() await using (var stream = File.OpenRead(path)) { - var d = (stream.QueryAsync().ToBlockingEnumerable()).Cast>(); + var d = Importer.QueryXlsxAsync(stream).ToBlockingEnumerable().Cast>(); var rows = d.ToList(); Assert.Equal(3, rows.Count); Assert.Equal("a", rows[0]["A"]); @@ -647,7 +650,7 @@ public async Task SaveAsFileWithDimension() Assert.Equal("d", rows[0]["D"]); } - await MiniExcel.SaveAsAsync(path, table, printHeader: false, overwriteFile: true); + await Exporter.ExportXlsxAsync(path, table, printHeader: false, overwriteFile: true); Assert.Equal("A1:D2", Helpers.GetFirstSheetDimensionRefValue(path)); } @@ -658,7 +661,7 @@ public async Task SaveAsFileWithDimension() table.Rows.Add("A"); table.Rows.Add("B"); - await MiniExcel.SaveAsAsync(path.ToString(), table); + await Exporter.ExportXlsxAsync(path.ToString(), table); Assert.Equal("A1:A3", Helpers.GetFirstSheetDimensionRefValue(path.ToString())); } } @@ -680,7 +683,7 @@ public async Task SaveAsByDataTableTest() table.Rows.Add(@"""<>+-*//}{\\n", 1234567890, true, now); table.Rows.Add("Hello World", -1234567890, false, now.Date); - await MiniExcel.SaveAsAsync(path, table); + await Exporter.ExportXlsxAsync(path, table); using var p = new ExcelPackage(new FileInfo(path)); var ws = p.Workbook.Worksheets.First(); @@ -703,7 +706,7 @@ public async Task SaveAsByDataTableTest() table.Rows.Add("MiniExcel", 1); table.Rows.Add("Github", 2); - await MiniExcel.SaveAsAsync(path.ToString(), table); + await Exporter.ExportXlsxAsync(path.ToString(), table); } } @@ -713,19 +716,19 @@ public async Task QueryByLINQExtensionsVoidTaskLargeFileOOMTest() const string path = "../../../../../benchmarks/MiniExcel.Benchmarks/Test1,000,000x10.xlsx"; { - var row = (MiniExcel.QueryAsync(path).ToBlockingEnumerable()).First(); + var row = Importer.QueryXlsxAsync(path).ToBlockingEnumerable().First(); Assert.Equal("HelloWorld1", row.A); } await using (var stream = File.OpenRead(path)) { - var d = (stream.QueryAsync().ToBlockingEnumerable()).Cast>(); + var d = Importer.QueryXlsxAsync(stream).ToBlockingEnumerable().Cast>(); var row = d.First(); Assert.Equal("HelloWorld1", row["A"]); } { - var d = (MiniExcel.QueryAsync(path).ToBlockingEnumerable()).Cast>(); + var d = Importer.QueryXlsxAsync(path).ToBlockingEnumerable().Cast>(); var rows = d.Take(10); Assert.Equal(10, rows.Count()); } @@ -739,12 +742,12 @@ public async Task EmptyTest() await using (var connection = Db.GetConnection("Data Source=:memory:")) { var rows = await connection.QueryAsync("with cte as (select 1 id,2 val) select * from cte where 1=2"); - await MiniExcel.SaveAsAsync(path.ToString(), rows); + await Exporter.ExportXlsxAsync(path.ToString(), rows); } await using (var stream = File.OpenRead(path.ToString())) { - var row = stream.QueryAsync(useHeaderRow: true).ToBlockingEnumerable(); + var row = Importer.QueryXlsxAsync(stream, useHeaderRow: true).ToBlockingEnumerable(); Assert.Empty(row); } } @@ -761,11 +764,11 @@ public async Task SaveAsByIEnumerableIDictionary() new() { { "Column1", "MiniExcel" }, { "Column2", 1 } }, new() { { "Column1", "Github" }, { "Column2", 2 } } ]; - await MiniExcel.SaveAsAsync(path, values); + await Exporter.ExportXlsxAsync(path, values); await using (var stream = File.OpenRead(path)) { - var d = (stream.QueryAsync(useHeaderRow: false).ToBlockingEnumerable()).Cast>(); + var d = Importer.QueryXlsxAsync(stream, useHeaderRow: false).ToBlockingEnumerable().Cast>(); var rows = d.ToList(); Assert.Equal("Column1", rows[0]["A"]); Assert.Equal("Column2", rows[0]["B"]); @@ -777,7 +780,7 @@ public async Task SaveAsByIEnumerableIDictionary() await using (var stream = File.OpenRead(path)) { - var d = (stream.QueryAsync(useHeaderRow: true).ToBlockingEnumerable()).Cast>(); + var d = Importer.QueryXlsxAsync(stream, useHeaderRow: true).ToBlockingEnumerable().Cast>(); var rows = d.ToList(); Assert.Equal(2, rows.Count); Assert.Equal("MiniExcel", rows[0]["Column1"]); @@ -798,11 +801,11 @@ public async Task SaveAsByIEnumerableIDictionary() new() { { 1, "MiniExcel" }, { 2, 1 } }, new() { { 1, "Github" }, { 2, 2 } } ]; - await MiniExcel.SaveAsAsync(path, values); + await Exporter.ExportXlsxAsync(path, values); await using (var stream = File.OpenRead(path)) { - var d = stream.QueryAsync(useHeaderRow: false).ToBlockingEnumerable(); + var d = Importer.QueryXlsxAsync(stream, useHeaderRow: false).ToBlockingEnumerable(); var rows = d.ToList(); Assert.Equal(3, rows.Count); } @@ -830,11 +833,11 @@ public async Task SaveAsByIEnumerableIDictionaryWithDynamicConfiguration() new() { { "Column1", "MiniExcel" }, { "Column2", 1 } }, new() { { "Column1", "Github" }, { "Column2", 2 } } ]; - await MiniExcel.SaveAsAsync(path, values, configuration: config); + await Exporter.ExportXlsxAsync(path, values, configuration: config); await using (var stream = File.OpenRead(path)) { - var d = (stream.QueryAsync(useHeaderRow: true).ToBlockingEnumerable()).Cast>(); + var d = Importer.QueryXlsxAsync(stream, useHeaderRow: true).ToBlockingEnumerable().Cast>(); var rows = d.ToList(); Assert.Equal(2, rows.Count); Assert.Equal("Name Column", rows[0].Keys.ElementAt(0)); @@ -861,7 +864,7 @@ public async Task SaveAsFrozenRowsAndColumnsTest() using var file = AutoDeletingPath.Create(); var path = file.ToString(); - await MiniExcel.SaveAsAsync( + await Exporter.ExportXlsxAsync( path, new[] { @@ -873,7 +876,7 @@ await MiniExcel.SaveAsAsync( await using (var stream = File.OpenRead(path)) { - var rows = (stream.QueryAsync(useHeaderRow: true).ToBlockingEnumerable()).ToList(); + var rows = Importer.QueryXlsxAsync(stream, useHeaderRow: true).ToBlockingEnumerable().ToList(); Assert.Equal("MiniExcel", rows[0].Column1); Assert.Equal(1, rows[0].Column2); @@ -892,13 +895,13 @@ await MiniExcel.SaveAsAsync( table.Rows.Add("Hello World", -1234567890, false, DateTime.Now.Date); using var pathTable = AutoDeletingPath.Create(); - await MiniExcel.SaveAsAsync(pathTable.ToString(), table, configuration: config); + await Exporter.ExportXlsxAsync(pathTable.ToString(), table, configuration: config); Assert.Equal("A1:D3", Helpers.GetFirstSheetDimensionRefValue(pathTable.ToString())); // data reader await using var reader = table.CreateDataReader(); using var pathReader = AutoDeletingPath.Create(); - await MiniExcel.SaveAsAsync(pathReader.ToString(), reader, configuration: config); + await Exporter.ExportXlsxAsync(pathReader.ToString(), reader, configuration: config); Assert.Equal("A1:D3", Helpers.GetFirstSheetDimensionRefValue(pathTable.ToString())); } @@ -912,13 +915,13 @@ public async Task SaveAsByDapperRows() await using (var connection = Db.GetConnection("Data Source=:memory:")) { var rows = await connection.QueryAsync("select 'MiniExcel' as Column1,1 as Column2 union all select 'Github',2"); - await MiniExcel.SaveAsAsync(path, rows); + await Exporter.ExportXlsxAsync(path, rows); } Assert.Equal("A1:B3", Helpers.GetFirstSheetDimensionRefValue(path)); await using (var stream = File.OpenRead(path)) { - var rows = (stream.QueryAsync(useHeaderRow: true).ToBlockingEnumerable()).Cast>().ToList(); + var rows = Importer.QueryXlsxAsync(stream, useHeaderRow: true).ToBlockingEnumerable().Cast>().ToList(); Assert.Equal("MiniExcel", rows[0]["Column1"]); Assert.Equal(1d, rows[0]["Column2"]); Assert.Equal("Github", rows[1]["Column1"]); @@ -929,18 +932,18 @@ public async Task SaveAsByDapperRows() await using (var connection = Db.GetConnection("Data Source=:memory:")) { var rows = (await connection.QueryAsync("with cte as (select 'MiniExcel' as Column1,1 as Column2 union all select 'Github',2)select * from cte where 1=2")).ToList(); - await MiniExcel.SaveAsAsync(path, rows, overwriteFile: true); + await Exporter.ExportXlsxAsync(path, rows, overwriteFile: true); } await using (var stream = File.OpenRead(path)) { - var rows = (stream.QueryAsync(useHeaderRow: false).ToBlockingEnumerable()).ToList(); + var rows = Importer.QueryXlsxAsync(stream, useHeaderRow: false).ToBlockingEnumerable().ToList(); Assert.Empty(rows); } await using (var stream = File.OpenRead(path)) { - var rows = (stream.QueryAsync(useHeaderRow: true).ToBlockingEnumerable()).ToList(); + var rows = Importer.QueryXlsxAsync(stream, useHeaderRow: true).ToBlockingEnumerable().ToList(); Assert.Empty(rows); } Assert.Equal("A1", Helpers.GetFirstSheetDimensionRefValue(path)); @@ -949,13 +952,13 @@ public async Task SaveAsByDapperRows() await using (var connection = Db.GetConnection("Data Source=:memory:")) { var rows = (await connection.QueryAsync("select 'MiniExcel' as Column1,1 as Column2 union all select 'Github',2")).ToList(); - await MiniExcel.SaveAsAsync(path, rows, overwriteFile: true); + await Exporter.ExportXlsxAsync(path, rows, overwriteFile: true); } Assert.Equal("A1:B3", Helpers.GetFirstSheetDimensionRefValue(path)); await using (var stream = File.OpenRead(path)) { - var rows = (stream.QueryAsync(useHeaderRow: false).ToBlockingEnumerable()).Cast>().ToList(); + var rows = Importer.QueryXlsxAsync(stream, useHeaderRow: false).ToBlockingEnumerable().Cast>().ToList(); Assert.Equal("Column1", rows[0]["A"]); Assert.Equal("Column2", rows[0]["B"]); Assert.Equal("MiniExcel", rows[1]["A"]); @@ -966,7 +969,7 @@ public async Task SaveAsByDapperRows() await using (var stream = File.OpenRead(path)) { - var rows = (stream.QueryAsync(useHeaderRow: true).ToBlockingEnumerable()).Cast>().ToList(); + var rows = Importer.QueryXlsxAsync(stream, useHeaderRow: true).ToBlockingEnumerable().Cast>().ToList(); Assert.Equal("MiniExcel", rows[0]["Column1"]); Assert.Equal(1d, rows[0]["Column2"]); Assert.Equal("Github", rows[1]["Column1"]); @@ -990,10 +993,10 @@ public async Task QueryByStrongTypeParameterTest() new() { Column1 = "MiniExcel", Column2 = 1 }, new() { Column1 = "Github", Column2 = 2 } ]; - await MiniExcel.SaveAsAsync(path, values); + await Exporter.ExportXlsxAsync(path, values); await using var stream = File.OpenRead(path); - var rows = (stream.QueryAsync(useHeaderRow: true).ToBlockingEnumerable()).Cast>().ToList(); + var rows = Importer.QueryXlsxAsync(stream, useHeaderRow: true).ToBlockingEnumerable().Cast>().ToList(); Assert.Equal("MiniExcel", rows[0]["Column1"]); Assert.Equal(1d, rows[0]["Column2"]); @@ -1011,10 +1014,10 @@ public async Task QueryByDictionaryStringAndObjectParameterTest() new() { { "Column1", "MiniExcel" }, { "Column2", 1 } }, new() { { "Column1", "Github" }, { "Column2", 2 } } ]; - await MiniExcel.SaveAsAsync(path, values); + await Exporter.ExportXlsxAsync(path, values); await using var stream = File.OpenRead(path); - var rows = (stream.QueryAsync(useHeaderRow: true).ToBlockingEnumerable()).Cast>().ToList(); + var rows = Importer.QueryXlsxAsync(stream, useHeaderRow: true).ToBlockingEnumerable().Cast>().ToList(); Assert.Equal("MiniExcel", rows[0]["Column1"]); Assert.Equal(1d, rows[0]["Column2"]); @@ -1041,7 +1044,7 @@ public async Task SQLiteInsertTest() await using (var transaction = connection.BeginTransaction()) await using (var stream = File.OpenRead(path)) { - var rows = (stream.QueryAsync().ToBlockingEnumerable()).Cast>(); + var rows = Importer.QueryXlsxAsync(stream).ToBlockingEnumerable().Cast>(); foreach (var row in rows) await connection.ExecuteAsync( "insert into T (A,B) values (@A,@B)", @@ -1066,7 +1069,7 @@ public async Task SaveAsBasicCreateTest() using var file = AutoDeletingPath.Create(); var path = file.ToString(); - await MiniExcel.SaveAsAsync(path, new[] + await Exporter.ExportXlsxAsync(path, new[] { new { Column1 = "MiniExcel", Column2 = 1 }, new { Column1 = "Github", Column2 = 2} @@ -1074,7 +1077,7 @@ await MiniExcel.SaveAsAsync(path, new[] await using (var stream = File.OpenRead(path)) { - var d = (stream.QueryAsync(useHeaderRow: true).ToBlockingEnumerable()).Cast>(); + var d = Importer.QueryXlsxAsync(stream, useHeaderRow: true).ToBlockingEnumerable().Cast>(); var rows = d.ToList(); Assert.Equal("MiniExcel", rows[0]["Column1"]); Assert.Equal(1d, rows[0]["Column2"]); @@ -1098,12 +1101,12 @@ public async Task SaveAsBasicStreamTest() }; await using (var stream = new FileStream(path, FileMode.CreateNew)) { - await stream.SaveAsAsync(values); + await Exporter.ExportXlsxAsync(stream, values); } await using (var stream = File.OpenRead(path)) { - var rows = (stream.QueryAsync(useHeaderRow: true).ToBlockingEnumerable()).Cast>().ToList(); + var rows = Importer.QueryXlsxAsync(stream, useHeaderRow: true).ToBlockingEnumerable().Cast>().ToList(); Assert.Equal("MiniExcel", rows[0]["Column1"]); Assert.Equal(1d, rows[0]["Column2"]); Assert.Equal("Github", rows[1]["Column1"]); @@ -1121,14 +1124,14 @@ public async Task SaveAsBasicStreamTest() await using (var stream = new MemoryStream()) await using (var fileStream = new FileStream(path, FileMode.Create)) { - await stream.SaveAsAsync(values); + await Exporter.ExportXlsxAsync(stream, values); stream.Seek(0, SeekOrigin.Begin); await stream.CopyToAsync(fileStream); } await using (var stream = File.OpenRead(path)) { - var rows = (stream.QueryAsync(useHeaderRow: true).ToBlockingEnumerable()).Cast>().ToList(); + var rows = Importer.QueryXlsxAsync(stream, useHeaderRow: true).ToBlockingEnumerable().Cast>().ToList(); Assert.Equal("MiniExcel", rows[0]["Column1"]); Assert.Equal(1d, rows[0]["Column2"]); Assert.Equal("Github", rows[1]["Column1"]); @@ -1141,7 +1144,7 @@ public async Task SaveAsBasicStreamTest() public async Task SaveAsSpecialAndTypeCreateTest() { using var path = AutoDeletingPath.Create(); - await MiniExcel.SaveAsAsync(path.ToString(), new[] + await Exporter.ExportXlsxAsync(path.ToString(), new[] { new { a = @"""<>+-*//}{\\n", b = 1234567890, c = true, d = DateTime.Now }, new { a = "Hello World", b = -1234567890, c = false, d = DateTime.Now.Date} @@ -1156,7 +1159,7 @@ public async Task SaveAsFileEpplusCanReadTest() using var path = AutoDeletingPath.Create(); var now = DateTime.Now; - await MiniExcel.SaveAsAsync(path.ToString(), new[] + await Exporter.ExportXlsxAsync(path.ToString(), new[] { new { a = @"""<>+-*//}{\\n", b = 1234567890, c = true, d = now}, new { a = "Hello World", b = -1234567890, c = false, d = now.Date} @@ -1182,7 +1185,7 @@ public async Task SavaAsClosedXmlCanReadTest() var now = DateTime.Now; using var path = AutoDeletingPath.Create(); - await MiniExcel.SaveAsAsync(path.ToString(), new[] + await Exporter.ExportXlsxAsync(path.ToString(), new[] { new { a = @"""<>+-*//}{\\n", b = 1234567890, c = true, d = now}, new { a = "Hello World", b = -1234567890, c = false, d = now.Date} @@ -1207,7 +1210,7 @@ public async Task ContentTypeUriContentTypeReadCheckTest() var now = DateTime.Now; using var path = AutoDeletingPath.Create(); - await MiniExcel.SaveAsAsync(path.ToString(), new[] + await Exporter.ExportXlsxAsync(path.ToString(), new[] { new { a = @"""<>+-*//}{\\n", b = 1234567890, c = true, d = now}, new { a = "Hello World", b = -1234567890, c = false, d = now.Date} @@ -1235,7 +1238,7 @@ await Assert.ThrowsAsync(async () => await cts.CancelAsync(); await using var stream = FileHelper.OpenRead(path); - var rows = stream.QueryAsync(cancellationToken: cts.Token).ToBlockingEnumerable(cts.Token).ToList(); + var rows = Importer.QueryXlsxAsync(stream, cancellationToken: cts.Token).ToBlockingEnumerable(cts.Token).ToList(); }); } @@ -1255,7 +1258,7 @@ await Assert.ThrowsAsync(async () => }); await using var stream = FileHelper.OpenRead(path); - var d = stream.QueryAsync(cancellationToken: cts.Token).ToBlockingEnumerable(cts.Token); + var d = Importer.QueryXlsxAsync(stream, cancellationToken: cts.Token).ToBlockingEnumerable(cts.Token); await cancelTask; _ = d.ToList(); }); @@ -1303,10 +1306,10 @@ public async Task DynamicColumnsConfigurationIsUsedWhenCreatingExcelUsingIDataRe ] }; await using var reader = table.CreateDataReader(); - await MiniExcel.SaveAsAsync(path.ToString(), reader, configuration: configuration); + await Exporter.ExportXlsxAsync(path.ToString(), reader, configuration: configuration); await using var stream = File.OpenRead(path.ToString()); - var rows = (stream.QueryAsync(useHeaderRow: true).ToBlockingEnumerable()) + var rows = Importer.QueryXlsxAsync(stream, useHeaderRow: true).ToBlockingEnumerable() .Cast>() .ToList(); @@ -1369,10 +1372,10 @@ public async Task DynamicColumnsConfigurationIsUsedWhenCreatingExcelUsingDataTab } ] }; - await MiniExcel.SaveAsAsync(path.ToString(), table, configuration: configuration); + await Exporter.ExportXlsxAsync(path.ToString(), table, configuration: configuration); await using var stream = File.OpenRead(path.ToString()); - var rows = (stream.QueryAsync(useHeaderRow: true).ToBlockingEnumerable()) + var rows = Importer.QueryXlsxAsync(stream, useHeaderRow: true).ToBlockingEnumerable() .Cast>() .ToList(); @@ -1405,13 +1408,13 @@ public async Task SaveAsByMiniExcelDataReader() new() { Column1= "MiniExcel" ,Column2 = 1 }, new() { Column1 = "Github", Column2 = 2 } }; - await MiniExcel.SaveAsAsync(path1.ToString(), values); + await Exporter.ExportXlsxAsync(path1.ToString(), values); - await using (IMiniExcelDataReader? reader = MiniExcel.GetReader(path1.ToString(), true)) + await using (IMiniExcelDataReader? reader = Importer.GetXlsxDataReader(path1.ToString(), true)) { using var path2 = AutoDeletingPath.Create(); - await MiniExcel.SaveAsAsync(path2.ToString(), reader); - var results = MiniExcel.QueryAsync(path2.ToString()).ToBlockingEnumerable().ToList(); + await Exporter.ExportXlsxAsync(path2.ToString(), reader); + var results = Importer.QueryXlsxAsync(path2.ToString()).ToBlockingEnumerable().ToList(); Assert.True(results.Count == 2); Assert.True(results.First().Column1 == "MiniExcel"); @@ -1437,7 +1440,7 @@ public async Task InsertSheetTest() table.Rows.Add(@"""<>+-*//}{\\n", 1234567890, true, now); table.Rows.Add("Hello World", -1234567890, false, now.Date); - await MiniExcel.InsertAsync(path, table, sheetName: "Sheet1"); + await Exporter.InsertXlsxSheetAsync(path, table, sheetName: "Sheet1"); using var p = new ExcelPackage(new FileInfo(path)); var sheet1 = p.Workbook.Worksheets[0]; @@ -1460,7 +1463,7 @@ public async Task InsertSheetTest() table.Rows.Add("MiniExcel", 1); table.Rows.Add("Github", 2); - await MiniExcel.InsertAsync(path, table, sheetName: "Sheet2"); + await Exporter.InsertXlsxSheetAsync(path, table, sheetName: "Sheet2"); using var p = new ExcelPackage(new FileInfo(path)); var sheet2 = p.Workbook.Worksheets[1]; @@ -1481,7 +1484,7 @@ public async Task InsertSheetTest() table.Columns.Add("Column2", typeof(DateTime)); table.Rows.Add("Test", now); - await MiniExcel.InsertAsync(path, table, sheetName: "Sheet2", printHeader: false, configuration: new OpenXmlConfiguration + await Exporter.InsertXlsxSheetAsync(path, table, sheetName: "Sheet2", printHeader: false, configuration: new OpenXmlConfiguration { FastMode = true, AutoFilter = false, @@ -1512,7 +1515,7 @@ public async Task InsertSheetTest() table.Rows.Add("MiniExcel", now); table.Rows.Add("Github", now); - await MiniExcel.InsertAsync(path, table, sheetName: "Sheet3", configuration: new OpenXmlConfiguration + await Exporter.InsertXlsxSheetAsync(path, table, sheetName: "Sheet3", configuration: new OpenXmlConfiguration { FastMode = true, AutoFilter = false, @@ -1545,63 +1548,6 @@ public async Task InsertSheetTest() } } - [Fact] - public async Task InsertCsvTest() - { - using var file = AutoDeletingPath.Create(ExcelType.CSV); - var path = file.ToString(); - - { - var value = new[] - { - new { ID=1,Name ="Jack",InDate=new DateTime(2021,01,03)}, - new { ID=2,Name ="Henry",InDate=new DateTime(2020,05,03)}, - }; - await MiniExcel.SaveAsAsync(path, value); - var content = await File.ReadAllTextAsync(path); - Assert.Equal( - """ - ID,Name,InDate - 1,Jack,"2021-01-03 00:00:00" - 2,Henry,"2020-05-03 00:00:00" - - """, content); - } - { - var value = new { ID = 3, Name = "Mike", InDate = new DateTime(2021, 04, 23) }; - await MiniExcel.InsertAsync(path, value); - var content = await File.ReadAllTextAsync(path); - Assert.Equal( - """ - ID,Name,InDate - 1,Jack,"2021-01-03 00:00:00" - 2,Henry,"2020-05-03 00:00:00" - 3,Mike,"2021-04-23 00:00:00" - - """, content); - } - { - var value = new[] - { - new { ID=4,Name ="Frank",InDate=new DateTime(2021,06,07)}, - new { ID=5,Name ="Gloria",InDate=new DateTime(2022,05,03)}, - }; - - await MiniExcel.InsertAsync(path, value); - var content = await File.ReadAllTextAsync(path); - Assert.Equal( - """ - ID,Name,InDate - 1,Jack,"2021-01-03 00:00:00" - 2,Henry,"2020-05-03 00:00:00" - 3,Mike,"2021-04-23 00:00:00" - 4,Frank,"2021-06-07 00:00:00" - 5,Gloria,"2022-05-03 00:00:00" - - """, content); - } - } - [Fact] public async Task SaveAsByAsyncEnumerable() { @@ -1615,8 +1561,8 @@ static async IAsyncEnumerable GetValues() } #pragma warning restore CS1998 - await MiniExcel.SaveAsAsync(path.ToString(), GetValues()); - var results = MiniExcel.Query(path.ToString()).ToList(); + await Exporter.ExportXlsxAsync(path.ToString(), GetValues()); + var results = Importer.QueryXlsx(path.ToString()).ToList(); Assert.True(results.Count == 2); Assert.True(results.First().Column1 == "MiniExcel"); diff --git a/tests/MiniExcelTests/MiniExcelOpenXmlConfigurationTest.cs b/tests/MiniExcelTests/MiniExcelOpenXmlConfigurationTest.cs index 64030d00..be13eb23 100644 --- a/tests/MiniExcelTests/MiniExcelOpenXmlConfigurationTest.cs +++ b/tests/MiniExcelTests/MiniExcelOpenXmlConfigurationTest.cs @@ -1,9 +1,12 @@ -using MiniExcelLibs.Attributes; -using MiniExcelLibs.OpenXml; -using MiniExcelLibs.Tests.Utils; +using MiniExcelLib.Core.Attributes; +using MiniExcelLib.Core.Helpers; +using MiniExcelLib.Core.OpenXml; +using MiniExcelLib.Tests.Utils; +using Importer = MiniExcelLib.MiniExcel.Importer; +using Exporter = MiniExcelLib.MiniExcel.Exporter; using Xunit; -namespace MiniExcelLibs.Tests; +namespace MiniExcelLib.Tests; public class MiniExcelOpenXmlConfigurationTest { @@ -11,30 +14,30 @@ public class MiniExcelOpenXmlConfigurationTest public async Task EnableWriteFilePathTest() { var img = await new HttpClient().GetByteArrayAsync("https://user-images.githubusercontent.com/12729184/150462383-ad9931b3-ed8d-4221-a1d6-66f799743433.png"); - var value = new[] - { - new ImgExportTestDto { Name = "github", Img = File.ReadAllBytes(PathHelper.GetFile("images/github_logo.png")) }, - new ImgExportTestDto { Name = "google", Img = File.ReadAllBytes(PathHelper.GetFile("images/google_logo.png")) }, - new ImgExportTestDto { Name = "microsoft", Img = File.ReadAllBytes(PathHelper.GetFile("images/microsoft_logo.png")) }, - new ImgExportTestDto { Name = "reddit", Img = File.ReadAllBytes(PathHelper.GetFile("images/reddit_logo.png")) }, - new ImgExportTestDto { Name = "statck_overflow", Img = File.ReadAllBytes(PathHelper.GetFile("images/statck_overflow_logo.png")) }, - new ImgExportTestDto { Name = "statck_over", Img = img }, - }; + ImgExportTestDto[] value = + [ + new() { Name = "github", Img = await File.ReadAllBytesAsync(PathHelper.GetFile("images/github_logo.png")) }, + new() { Name = "google", Img = await File.ReadAllBytesAsync(PathHelper.GetFile("images/google_logo.png")) }, + new() { Name = "microsoft", Img = await File.ReadAllBytesAsync(PathHelper.GetFile("images/microsoft_logo.png")) }, + new() { Name = "reddit", Img = await File.ReadAllBytesAsync(PathHelper.GetFile("images/reddit_logo.png")) }, + new() { Name = "statck_overflow", Img = await File.ReadAllBytesAsync(PathHelper.GetFile("images/statck_overflow_logo.png")) }, + new() { Name = "statck_over", Img = img } + ]; var path = PathHelper.GetFile("xlsx/Test_EnableWriteFilePath.xlsx"); - MiniExcel.SaveAs(path, value, configuration: new OpenXmlConfiguration { EnableWriteFilePath = false }, overwriteFile: true); + await Exporter.ExportXlsxAsync(path, value, configuration: new OpenXmlConfiguration { EnableWriteFilePath = false }, overwriteFile: true); Assert.True(File.Exists(path)); - var rows = MiniExcel.Query(path).ToList(); - Assert.True(rows.All(x => x.Img is null || x.Img.Length < 1)); + var rows = await Importer.QueryXlsxAsync(path).CreateListAsync(); + Assert.True(rows.All(x => x.Img is null or [])); } private class ImgExportTestDto { public string Name { get; set; } - [ExcelColumn(Name = "图片", Width = 100)] - public byte[] Img { get; set; } + [MiniExcelColumn(Name = "图片", Width = 100)] + public byte[]? Img { get; set; } } } diff --git a/tests/MiniExcelTests/MiniExcelOpenXmlMultipleSheetAsyncTests.cs b/tests/MiniExcelTests/MiniExcelOpenXmlMultipleSheetAsyncTests.cs index adc17b73..ad0991d6 100644 --- a/tests/MiniExcelTests/MiniExcelOpenXmlMultipleSheetAsyncTests.cs +++ b/tests/MiniExcelTests/MiniExcelOpenXmlMultipleSheetAsyncTests.cs @@ -1,6 +1,7 @@ -using Xunit; +using Importer = MiniExcelLib.MiniExcel.Importer; +using Xunit; -namespace MiniExcelLibs.Tests; +namespace MiniExcelLib.Tests; public class MiniExcelOpenXmlMultipleSheetAsyncTests { @@ -9,21 +10,21 @@ public async Task SpecifySheetNameQueryTest() { const string path = "../../../../../samples/xlsx/TestMultiSheet.xlsx"; { - var q = MiniExcel.QueryAsync(path, sheetName: "Sheet3").ToBlockingEnumerable(); + var q = Importer.QueryXlsxAsync(path, sheetName: "Sheet3").ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal(5, rows.Count); Assert.Equal(3, rows[0].A); Assert.Equal(3, rows[0].B); } { - var q = MiniExcel.QueryAsync(path, sheetName: "Sheet2").ToBlockingEnumerable(); + var q = Importer.QueryXlsxAsync(path, sheetName: "Sheet2").ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal(12, rows.Count); Assert.Equal(1, rows[0].A); Assert.Equal(1, rows[0].B); } { - var q = MiniExcel.QueryAsync(path, sheetName: "Sheet1").ToBlockingEnumerable(); + var q = Importer.QueryXlsxAsync(path, sheetName: "Sheet1").ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal(12, rows.Count); Assert.Equal(2, rows[0].A); @@ -32,7 +33,7 @@ public async Task SpecifySheetNameQueryTest() { await Assert.ThrowsAsync(() => { - _ = MiniExcel.QueryAsync(path, sheetName: "xxxx").ToBlockingEnumerable().ToList(); + _ = Importer.QueryXlsxAsync(path, sheetName: "xxxx").ToBlockingEnumerable().ToList(); return Task.CompletedTask; }); } @@ -40,25 +41,25 @@ await Assert.ThrowsAsync(() => await using var stream = File.OpenRead(path); { - var rows = (stream.QueryAsync(sheetName: "Sheet3").ToBlockingEnumerable()).Cast>().ToList(); + var rows = Importer.QueryXlsxAsync(stream, sheetName: "Sheet3").ToBlockingEnumerable().Cast>().ToList(); Assert.Equal(5, rows.Count); Assert.Equal(3d, rows[0]["A"]); Assert.Equal(3d, rows[0]["B"]); } { - var rows = (stream.QueryAsync(sheetName: "Sheet2").ToBlockingEnumerable()).Cast>().ToList(); + var rows = Importer.QueryXlsxAsync(stream, sheetName: "Sheet2").ToBlockingEnumerable().Cast>().ToList(); Assert.Equal(12, rows.Count); Assert.Equal(1d, rows[0]["A"]); Assert.Equal(1d, rows[0]["B"]); } { - var rows = (stream.QueryAsync(sheetName: "Sheet1").ToBlockingEnumerable()).Cast>().ToList(); + var rows = Importer.QueryXlsxAsync(stream, sheetName: "Sheet1").ToBlockingEnumerable().Cast>().ToList(); Assert.Equal(12, rows.Count); Assert.Equal(2d, rows[0]["A"]); Assert.Equal(2d, rows[0]["B"]); } { - var rows = (stream.QueryAsync(sheetName: "Sheet1").ToBlockingEnumerable()).Cast>().ToList(); + var rows = Importer.QueryXlsxAsync(stream, sheetName: "Sheet1").ToBlockingEnumerable().Cast>().ToList(); Assert.Equal(12, rows.Count); Assert.Equal(2d, rows[0]["A"]); Assert.Equal(2d, rows[0]["B"]); @@ -70,9 +71,9 @@ public async Task MultiSheetsQueryBasicTest() { const string path = "../../../../../samples/xlsx/TestMultiSheet.xlsx"; await using var stream = File.OpenRead(path); - _ = stream.QueryAsync(sheetName: "Sheet1").ToBlockingEnumerable(); - _ = stream.QueryAsync(sheetName: "Sheet2").ToBlockingEnumerable(); - _ = stream.QueryAsync(sheetName: "Sheet3").ToBlockingEnumerable(); + _ = Importer.QueryXlsxAsync(stream, sheetName: "Sheet1").ToBlockingEnumerable(); + _ = Importer.QueryXlsxAsync(stream, sheetName: "Sheet2").ToBlockingEnumerable(); + _ = Importer.QueryXlsxAsync(stream, sheetName: "Sheet3").ToBlockingEnumerable(); } [Fact] @@ -80,21 +81,21 @@ public async Task MultiSheetsQueryTest() { const string path = "../../../../../samples/xlsx/TestMultiSheet.xlsx"; { - var sheetNames = (await MiniExcel.GetSheetNamesAsync(path)).ToList(); + var sheetNames = (await Importer.GetSheetNamesAsync(path)).ToList(); foreach (var sheetName in sheetNames) { - _ = MiniExcel.QueryAsync(path, sheetName: sheetName).ToBlockingEnumerable(); + _ = Importer.QueryXlsxAsync(path, sheetName: sheetName).ToBlockingEnumerable(); } Assert.Equal(new[] { "Sheet1", "Sheet2", "Sheet3" }, sheetNames); } { await using var stream = File.OpenRead(path); - var sheetNames = (await stream.GetSheetNamesAsync()).ToList(); + var sheetNames = (await Importer.GetSheetNamesAsync(stream)).ToList(); Assert.Equal(new[] { "Sheet1", "Sheet2", "Sheet3" }, sheetNames); foreach (var sheetName in sheetNames) { - _ = stream.QueryAsync(sheetName: sheetName).ToBlockingEnumerable().ToList(); + _ = Importer.QueryXlsxAsync(stream, sheetName: sheetName).ToBlockingEnumerable().ToList(); } } } diff --git a/tests/MiniExcelTests/MiniExcelOpenXmlMultipleSheetTests.cs b/tests/MiniExcelTests/MiniExcelOpenXmlMultipleSheetTests.cs index f957063b..78ee2a81 100644 --- a/tests/MiniExcelTests/MiniExcelOpenXmlMultipleSheetTests.cs +++ b/tests/MiniExcelTests/MiniExcelOpenXmlMultipleSheetTests.cs @@ -1,9 +1,12 @@ -using MiniExcelLibs.Attributes; -using MiniExcelLibs.OpenXml; -using MiniExcelLibs.Tests.Utils; +using MiniExcelLib.Core.OpenXml; +using MiniExcelLib.Core.OpenXml.Attributes; +using MiniExcelLib.Core.OpenXml.Models; +using MiniExcelLib.Tests.Utils; +using Importer = MiniExcelLib.MiniExcel.Importer; +using Exporter = MiniExcelLib.MiniExcel.Exporter; using Xunit; -namespace MiniExcelLibs.Tests; +namespace MiniExcelLib.Tests; public class MiniExcelOpenXmlMultipleSheetTests { @@ -12,47 +15,47 @@ public void SpecifySheetNameQueryTest() { const string path = "../../../../../samples/xlsx/TestMultiSheet.xlsx"; { - var rows = MiniExcel.Query(path, sheetName: "Sheet3").ToList(); + var rows = Importer.QueryXlsx(path, sheetName: "Sheet3").ToList(); Assert.Equal(5, rows.Count); Assert.Equal(3, rows[0].A); Assert.Equal(3, rows[0].B); } { - var rows = MiniExcel.Query(path, sheetName: "Sheet2").ToList(); + var rows = Importer.QueryXlsx(path, sheetName: "Sheet2").ToList(); Assert.Equal(12, rows.Count); Assert.Equal(1, rows[0].A); Assert.Equal(1, rows[0].B); } { - var rows = MiniExcel.Query(path, sheetName: "Sheet1").ToList(); + var rows = Importer.QueryXlsx(path, sheetName: "Sheet1").ToList(); Assert.Equal(12, rows.Count); Assert.Equal(2, rows[0].A); Assert.Equal(2, rows[0].B); } - Assert.Throws(() => MiniExcel.Query(path, sheetName: "xxxx").ToList()); + Assert.Throws(() => Importer.QueryXlsx(path, sheetName: "xxxx").ToList()); using var stream = File.OpenRead(path); { - var rows = stream.Query(sheetName: "Sheet3").ToList(); + var rows = Importer.QueryXlsx(stream, sheetName: "Sheet3").ToList(); Assert.Equal(5, rows.Count); Assert.Equal(3, rows[0].A); Assert.Equal(3, rows[0].B); } { - var rows = stream.Query(sheetName: "Sheet2").ToList(); + var rows = Importer.QueryXlsx(stream, sheetName: "Sheet2").ToList(); Assert.Equal(12, rows.Count); Assert.Equal(1, rows[0].A); Assert.Equal(1, rows[0].B); } { - var rows = stream.Query(sheetName: "Sheet1").ToList(); + var rows = Importer.QueryXlsx(stream, sheetName: "Sheet1").ToList(); Assert.Equal(12, rows.Count); Assert.Equal(2, rows[0].A); Assert.Equal(2, rows[0].B); } { - var rows = stream.Query(sheetName: "Sheet1").ToList(); + var rows = Importer.QueryXlsx(stream, sheetName: "Sheet1").ToList(); Assert.Equal(12, rows.Count); Assert.Equal(2, rows[0].A); Assert.Equal(2, rows[0].B); @@ -65,9 +68,9 @@ public void MultiSheetsQueryBasicTest() const string path = "../../../../../samples/xlsx/TestMultiSheet.xlsx"; using var stream = File.OpenRead(path); - _ = stream.Query(sheetName: "Sheet1"); - _ = stream.Query(sheetName: "Sheet2"); - _ = stream.Query(sheetName: "Sheet3"); + _ = Importer.QueryXlsx(stream, sheetName: "Sheet1"); + _ = Importer.QueryXlsx(stream, sheetName: "Sheet2"); + _ = Importer.QueryXlsx(stream, sheetName: "Sheet3"); } [Fact] @@ -75,10 +78,10 @@ public void MultiSheetsQueryTest() { const string path = "../../../../../samples/xlsx/TestMultiSheet.xlsx"; { - var sheetNames = MiniExcel.GetSheetNames(path).ToList(); + var sheetNames = Importer.GetSheetNames(path).ToList(); foreach (var sheetName in sheetNames) { - var rows = MiniExcel.Query(path, sheetName: sheetName).ToList(); + var rows = Importer.QueryXlsx(path, sheetName: sheetName).ToList(); } Assert.Equal(new[] { "Sheet1", "Sheet2", "Sheet3" }, sheetNames); @@ -86,11 +89,12 @@ public void MultiSheetsQueryTest() { using var stream = File.OpenRead(path); - var sheetNames = stream.GetSheetNames().ToList(); + var sheetNames = Importer.GetSheetNames(stream).ToList(); Assert.Equal(new[] { "Sheet1", "Sheet2", "Sheet3" }, sheetNames); + foreach (var sheetName in sheetNames) { - var rows = stream.Query(sheetName: sheetName).ToList(); + var rows = Importer.QueryXlsx(stream, sheetName: sheetName).ToList(); } } } @@ -115,21 +119,21 @@ public void ExcelSheetAttributeIsUsedWhenReadExcel() const string path = "../../../../../samples/xlsx/TestDynamicSheet.xlsx"; using (var stream = File.OpenRead(path)) { - var users = stream.Query().ToList(); + var users = Importer.QueryXlsx(stream).ToList(); Assert.Equal(2, users.Count); Assert.Equal("Jack", users[0].Name); - var departments = stream.Query().ToList(); + var departments = Importer.QueryXlsx(stream).ToList(); Assert.Equal(2, departments.Count); Assert.Equal("HR", departments[0].Name); } { - var users = MiniExcel.Query(path).ToList(); + var users = Importer.QueryXlsx(path).ToList(); Assert.Equal(2, users.Count); Assert.Equal("Jack", users[0].Name); - var departments = MiniExcel.Query(path).ToList(); + var departments = Importer.QueryXlsx(path).ToList(); Assert.Equal(2, departments.Count); Assert.Equal("HR", departments[0].Name); } @@ -151,34 +155,34 @@ public void DynamicSheetConfigurationIsUsedWhenReadExcel() using (var stream = File.OpenRead(path)) { // take first sheet as default - var users = stream.Query(configuration: configuration, useHeaderRow: true).ToList(); + var users = Importer.QueryXlsx(stream, configuration: configuration, useHeaderRow: true).ToList(); Assert.Equal(2, users.Count); Assert.Equal("Jack", users[0].Name); // take second sheet by sheet name - var departments = stream.Query(sheetName: "Departments", configuration: configuration, useHeaderRow: true).ToList(); + var departments = Importer.QueryXlsx(stream, sheetName: "Departments", configuration: configuration, useHeaderRow: true).ToList(); Assert.Equal(2, departments.Count); Assert.Equal("HR", departments[0].Name); // take second sheet by sheet key - departments = stream.Query(sheetName: "departmentSheet", configuration: configuration, useHeaderRow: true).ToList(); + departments = Importer.QueryXlsx(stream, sheetName: "departmentSheet", configuration: configuration, useHeaderRow: true).ToList(); Assert.Equal(2, departments.Count); Assert.Equal("HR", departments[0].Name); } { // take first sheet as default - var users = MiniExcel.Query(path, configuration: configuration, useHeaderRow: true).ToList(); + var users = Importer.QueryXlsx(path, configuration: configuration, useHeaderRow: true).ToList(); Assert.Equal(2, users.Count); Assert.Equal("Jack", users[0].Name); // take second sheet by sheet name - var departments = MiniExcel.Query(path, sheetName: "Departments", configuration: configuration, useHeaderRow: true).ToList(); + var departments = Importer.QueryXlsx(path, sheetName: "Departments", configuration: configuration, useHeaderRow: true).ToList(); Assert.Equal(2, departments.Count); Assert.Equal("HR", departments[0].Name); // take second sheet by sheet key - departments = MiniExcel.Query(path, sheetName: "departmentSheet", configuration: configuration, useHeaderRow: true).ToList(); + departments = Importer.QueryXlsx(path, sheetName: "departmentSheet", configuration: configuration, useHeaderRow: true).ToList(); Assert.Equal(2, departments.Count); Assert.Equal("HR", departments[0].Name); } @@ -189,7 +193,7 @@ public void ReadSheetVisibilityStateTest() { const string path = "../../../../../samples/xlsx/TestMultiSheetWithHiddenSheet.xlsx"; { - var sheetInfos = MiniExcel.GetSheetInformations(path).ToList(); + var sheetInfos = Importer.GetSheetInformations(path).ToList(); Assert.Collection(sheetInfos, i => { @@ -253,12 +257,12 @@ public void WriteHiddenSheetTest() using var file = AutoDeletingPath.Create(); var path = file.ToString(); - var rowsWritten = MiniExcel.SaveAs(path, sheets, configuration: configuration); + var rowsWritten = Exporter.ExportXlsx(path, sheets, configuration: configuration); Assert.Equal(2, rowsWritten.Length); Assert.Equal(2, rowsWritten[0]); - var sheetInfos = MiniExcel.GetSheetInformations(path).ToList(); + var sheetInfos = Importer.GetSheetInformations(path).ToList(); Assert.Collection(sheetInfos, i => { @@ -277,7 +281,7 @@ public void WriteHiddenSheetTest() foreach (var sheetName in sheetInfos.Select(s => s.Name)) { - var rows = MiniExcel.Query(path, sheetName: sheetName).ToList(); + var rows = Importer.QueryXlsx(path, sheetName: sheetName).ToList(); } } } \ No newline at end of file diff --git a/tests/MiniExcelTests/MiniExcelOpenXmlTests.cs b/tests/MiniExcelTests/MiniExcelOpenXmlTests.cs index f43d3520..1dc3d713 100644 --- a/tests/MiniExcelTests/MiniExcelOpenXmlTests.cs +++ b/tests/MiniExcelTests/MiniExcelOpenXmlTests.cs @@ -1,42 +1,45 @@ -using ClosedXML.Excel; -using Dapper; -using ExcelDataReader; -using MiniExcelLibs.Attributes; -using MiniExcelLibs.OpenXml; -using MiniExcelLibs.Tests.Utils; -using OfficeOpenXml; -using System.Data; +using System.Data; using System.Data.SQLite; using System.Diagnostics; using System.Globalization; using System.IO.Packaging; using System.Text; +using ClosedXML.Excel; +using Dapper; +using ExcelDataReader; +using MiniExcelLib.Core.Attributes; +using MiniExcelLib.Core.OpenXml; +using MiniExcelLib.Core.OpenXml.Utils; +using MiniExcelLib.Tests.Utils; +using OfficeOpenXml; using Xunit; using Xunit.Abstractions; +using Importer = MiniExcelLib.MiniExcel.Importer; +using Exporter = MiniExcelLib.MiniExcel.Exporter; -namespace MiniExcelLibs.Tests; +namespace MiniExcelLib.Tests; public class MiniExcelOpenXmlTests(ITestOutputHelper output) { private readonly ITestOutputHelper _output = output; - + [Fact] public void GetColumnsTest() { const string tmPath = "../../../../../samples/xlsx/TestTypeMapping.xlsx"; const string tePath = "../../../../../samples/xlsx/TestEmpty.xlsx"; { - var columns = MiniExcel.GetColumns(tmPath); + var columns = Importer.GetXlsxColumns (tmPath); Assert.Equal(["A", "B", "C", "D", "E", "F", "G", "H"], columns); } { - var columns = MiniExcel.GetColumns(tmPath); + var columns = Importer.GetXlsxColumns (tmPath); Assert.Equal(8, columns.Count); } { - var columns = MiniExcel.GetColumns(tePath); + var columns = Importer.GetXlsxColumns (tePath); Assert.Empty(columns); } } @@ -56,10 +59,10 @@ public void SaveAsControlChracter() '\u0017','\u0018','\u0019','\u001A','\u001B','\u001C','\u001D','\u001E','\u001F','\u007F' ]; var input = chars.Select(s => new { Test = s.ToString() }); - MiniExcel.SaveAs(path.ToString(), input); + Exporter.ExportXlsx(path.ToString(), input); - var rows2 = MiniExcel.Query(path.ToString(), true).Select(s => s.Test).ToArray(); - var rows1 = MiniExcel.Query(path.ToString()).Select(s => s.Test).ToArray(); + var rows2 = Importer.QueryXlsx(path.ToString(), true).Select(s => s.Test).ToArray(); + var rows1 = Importer.QueryXlsx(path.ToString()).Select(s => s.Test).ToArray(); } private class SaveAsControlChracterVO @@ -69,17 +72,17 @@ private class SaveAsControlChracterVO private class ExcelAttributeDemo { - [ExcelColumnName("Column1")] + [MiniExcelColumnName("Column1")] public string Test1 { get; set; } - [ExcelColumnName("Column2")] + [MiniExcelColumnName("Column2")] public string Test2 { get; set; } - [ExcelIgnore] + [MiniExcelIgnore] public string Test3 { get; set; } - [ExcelColumnIndex("I")] // system will convert "I" to 8 index + [MiniExcelColumnIndex("I")] // system will convert "I" to 8 index public string Test4 { get; set; } public string Test5 { get; } //wihout set will ignore public string Test6 { get; private set; } //un-public set will ignore - [ExcelColumnIndex(3)] // start with 0 + [MiniExcelColumnIndex(3)] // start with 0 public string Test7 { get; set; } } @@ -87,14 +90,14 @@ private class ExcelAttributeDemo public void CustomAttributeWihoutVaildPropertiesTest() { const string path = "../../../../../samples/xlsx/TestCustomExcelColumnAttribute.xlsx"; - Assert.Throws(() => MiniExcel.Query(path).ToList()); + Assert.Throws(() => Importer.QueryXlsx(path).ToList()); } [Fact] public void QueryCustomAttributesTest() { const string path = "../../../../../samples/xlsx/TestCustomExcelColumnAttribute.xlsx"; - var rows = MiniExcel.Query(path).ToList(); + var rows = Importer.QueryXlsx(path).ToList(); Assert.Equal("Column1", rows[0].Test1); Assert.Equal("Column2", rows[0].Test2); @@ -118,8 +121,8 @@ public void SaveAsCustomAttributesTest() Test4 = "Test4", }); - MiniExcel.SaveAs(path.ToString(), input); - var rows = MiniExcel.Query(path.ToString(), true).ToList(); + Exporter.ExportXlsx(path.ToString(), input); + var rows = Importer.QueryXlsx(path.ToString(), true).ToList(); var first = rows[0] as IDictionary; Assert.Equal(3, rows.Count); @@ -133,7 +136,7 @@ public void SaveAsCustomAttributesTest() private class CustomAttributesWihoutVaildPropertiesTestPoco { - [ExcelIgnore] + [MiniExcelIgnore] public string Test3 { get; set; } public string Test5 { get; } public string Test6 { get; private set; } @@ -145,7 +148,7 @@ private class CustomAttributesWihoutVaildPropertiesTestPoco public void QueryCastToIDictionary() { const string path = "../../../../../samples/xlsx/TestCenterEmptyRow/TestCenterEmptyRow.xlsx"; - foreach (IDictionary row in MiniExcel.Query(path)) + foreach (IDictionary row in Importer.QueryXlsx(path)) { _ = row; } @@ -156,7 +159,7 @@ public void QueryRangeToIDictionary() { const string path = "../../../../../samples/xlsx/TestCenterEmptyRow/TestCenterEmptyRow.xlsx"; // tips:Only uppercase letters are effective - var rows = MiniExcel.QueryRange(path, startCell: "A2", endCell: "C7") + var rows = Importer.QueryRangeXlsx(path, startCell: "A2", endCell: "C7") .Cast>() .ToList(); @@ -165,9 +168,9 @@ public void QueryRangeToIDictionary() Assert.Equal(2d, rows[1]["B"]); Assert.Equal(null!, rows[2]["A"]); - var startCellXY = MiniExcelLibs.Utils.ReferenceHelper.ConvertCellToXY("A2"); - var endCellXY = MiniExcelLibs.Utils.ReferenceHelper.ConvertCellToXY("C7"); - rows = MiniExcel.QueryRange(path, startRowIndex: startCellXY.Item2, startColumnIndex: startCellXY.Item1, endRowIndex: endCellXY.Item2, endColumnIndex: endCellXY.Item1) + var startCellXY = ReferenceHelper.ConvertCellToCoordinates("A2"); + var endCellXY = ReferenceHelper.ConvertCellToCoordinates("C7"); + rows = Importer.QueryRangeXlsx(path, startRowIndex: startCellXY.Item2, startColumnIndex: startCellXY.Item1, endRowIndex: endCellXY.Item2, endColumnIndex: endCellXY.Item1) .Cast>() .ToList(); Assert.Equal(5, rows.Count); @@ -175,14 +178,14 @@ public void QueryRangeToIDictionary() Assert.Equal(2d, rows[1]["B"]); Assert.Equal(null!, rows[2]["A"]); - rows = MiniExcel.QueryRange(path, startRowIndex:2, startColumnIndex: 1, endRowIndex: 3) + rows = Importer.QueryRangeXlsx(path, startRowIndex:2, startColumnIndex: 1, endRowIndex: 3) .Cast>() .ToList(); Assert.Equal(2, rows.Count); Assert.Equal(4, rows[0].Count); Assert.Equal(4d, rows[1]["D"]); - rows = MiniExcel.QueryRange(path, startRowIndex: 2, startColumnIndex: 1, endColumnIndex: 3) + rows = Importer.QueryRangeXlsx(path, startRowIndex: 2, startColumnIndex: 1, endColumnIndex: 3) .Cast>() .ToList(); Assert.Equal(5, rows.Count); @@ -196,7 +199,7 @@ public void CenterEmptyRowsQueryTest() const string path = "../../../../../samples/xlsx/TestCenterEmptyRow/TestCenterEmptyRow.xlsx"; using (var stream = File.OpenRead(path)) { - var rows = stream.Query().ToList(); + var rows = Importer.QueryXlsx(stream).ToList(); Assert.Equal("a", rows[0].A); Assert.Equal("b", rows[0].B); @@ -231,7 +234,7 @@ public void CenterEmptyRowsQueryTest() using (var stream = File.OpenRead(path)) { - var rows = stream.Query(useHeaderRow: true).ToList(); + var rows = Importer.QueryXlsx(stream, useHeaderRow: true).ToList(); Assert.Equal(1, rows[0].a); Assert.Equal(null, rows[0].b); @@ -265,7 +268,7 @@ public void TestEmptyRowsQuerySelfClosingTag() { const string path = "../../../../../samples/xlsx/TestEmptySelfClosingRow.xlsx"; using var stream = File.OpenRead(path); - var rows = stream.Query().ToList(); + var rows = Importer.QueryXlsx(stream).ToList(); Assert.Equal(null, rows[0].A); Assert.Equal(1, rows[1].A); @@ -284,7 +287,7 @@ public void TestDynamicQueryBasic_WithoutHead() { const string path = "../../../../../samples/xlsx/TestDynamicQueryBasic_WithoutHead.xlsx"; using var stream = File.OpenRead(path); - var rows = stream.Query().ToList(); + var rows = Importer.QueryXlsx(stream).ToList(); Assert.Equal("MiniExcel", rows[0].A); Assert.Equal(1, rows[0].B); @@ -298,7 +301,7 @@ public void TestDynamicQueryBasic_useHeaderRow() const string path = "../../../../../samples/xlsx/TestDynamicQueryBasic.xlsx"; using (var stream = File.OpenRead(path)) { - var rows = stream.Query(useHeaderRow: true).ToList(); + var rows = Importer.QueryXlsx(stream, useHeaderRow: true).ToList(); Assert.Equal("MiniExcel", rows[0].Column1); Assert.Equal(1, rows[0].Column2); @@ -307,7 +310,7 @@ public void TestDynamicQueryBasic_useHeaderRow() } { - var rows = MiniExcel.Query(path, useHeaderRow: true).ToList(); + var rows = Importer.QueryXlsx(path, useHeaderRow: true).ToList(); Assert.Equal("MiniExcel", rows[0].Column1); Assert.Equal(1, rows[0].Column2); @@ -338,7 +341,7 @@ public void QueryStrongTypeMapping_Test() const string path = "../../../../../samples/xlsx/TestTypeMapping.xlsx"; using (var stream = File.OpenRead(path)) { - var rows = stream.Query().ToList(); + var rows = Importer.QueryXlsx(stream).ToList(); Assert.Equal(100, rows.Count); Assert.Equal(Guid.Parse("78DE23D2-DCB6-BD3D-EC67-C112BBC322A2"), rows[0].ID); @@ -351,7 +354,7 @@ public void QueryStrongTypeMapping_Test() } { - var rows = MiniExcel.Query(path).ToList(); + var rows = Importer.QueryXlsx(path).ToList(); Assert.Equal(100, rows.Count); Assert.Equal(Guid.Parse("78DE23D2-DCB6-BD3D-EC67-C112BBC322A2"), rows[0].ID); @@ -377,7 +380,7 @@ public void AutoCheckTypeTest() { const string path = "../../../../../samples/xlsx/TestTypeMapping_AutoCheckFormat.xlsx"; using var stream = FileHelper.OpenRead(path); - var rows = stream.Query().ToList(); + var rows = Importer.QueryXlsx(stream).ToList(); } private class ExcelUriDemo @@ -392,7 +395,7 @@ public void UriMappingTest() { const string path = "../../../../../samples/xlsx/TestUriMapping.xlsx"; using var stream = File.OpenRead(path); - var rows = stream.Query().ToList(); + var rows = Importer.QueryXlsx(stream).ToList(); Assert.Equal("Felix", rows[1].Name); Assert.Equal(44, rows[1].Age); @@ -410,7 +413,7 @@ private class SimpleAccount public void TrimColumnNamesTest() { const string path = "../../../../../samples/xlsx/TestTrimColumnNames.xlsx"; - var rows = MiniExcel.Query(path).ToList(); + var rows = Importer.QueryXlsx(path).ToList(); Assert.Equal("Raymond", rows[4].Name); Assert.Equal(18, rows[4].Age); @@ -424,7 +427,7 @@ public void TestDatetimeSpanFormat_ClosedXml() const string path = "../../../../../samples/xlsx/TestDatetimeSpanFormat_ClosedXml.xlsx"; using var stream = FileHelper.OpenRead(path); - var row = stream.Query().First(); + var row = Importer.QueryXlsx(stream).First(); var a = row.A; var b = row.B; Assert.Equal(DateTime.Parse("2021-03-20T23:39:42.3130000"), (DateTime)a); @@ -437,13 +440,13 @@ public void LargeFileQueryStrongTypeMapping_Test() const string path = "../../../../../benchmarks/MiniExcel.Benchmarks/Test1,000,000x10.xlsx"; using (var stream = File.OpenRead(path)) { - var rows = stream.Query().Take(2).ToList(); + var rows = Importer.QueryXlsx(stream).Take(2).ToList(); Assert.Equal("HelloWorld2", rows[0].HelloWorld1); Assert.Equal("HelloWorld3", rows[1].HelloWorld1); } { - var rows = MiniExcel.Query(path).Take(2).ToList(); + var rows = Importer.QueryXlsx(path).Take(2).ToList(); Assert.Equal("HelloWorld2", rows[0].HelloWorld1); Assert.Equal("HelloWorld3", rows[1].HelloWorld1); @@ -459,11 +462,11 @@ public void QueryExcelDataReaderCheckTest(string path) Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); #endif using var fs = File.OpenRead(path); - using var reader = ExcelDataReader.ExcelReaderFactory.CreateReader(fs); + using var reader = ExcelReaderFactory.CreateReader(fs); var exceldatareaderResult = reader.AsDataSet(); using var stream = File.OpenRead(path); - var rows = stream.Query().ToList(); + var rows = Importer.QueryXlsx(stream).ToList(); Assert.Equal(exceldatareaderResult.Tables[0].Rows.Count, rows.Count); foreach (IDictionary row in rows) @@ -493,7 +496,7 @@ public void QuerySheetWithoutRAttribute() { const string path = "../../../../../samples/xlsx/TestWihoutRAttribute.xlsx"; using var stream = File.OpenRead(path); - var rows = stream.Query().ToList(); + var rows = Importer.QueryXlsx(stream).ToList(); var keys = (rows.First() as IDictionary)!.Keys; Assert.Equal(2, rows.Count); @@ -515,7 +518,7 @@ public void FixDimensionJustOneColumnParsingError_Test() { const string path = "../../../../../samples/xlsx/TestDimensionC3.xlsx"; using var stream = File.OpenRead(path); - var rows = stream.Query().ToList(); + var rows = Importer.QueryXlsx(stream).ToList(); var keys = ((IDictionary)rows.First()).Keys; Assert.Equal(3, keys.Count); Assert.Equal(2, rows.Count); @@ -539,11 +542,11 @@ public void SaveAsFileWithDimensionByICollection() new() { A = "A", B = "B" }, new() { A = "A", B = "B" } ]; - MiniExcel.SaveAs(path, values); + Exporter.ExportXlsx(path, values); using (var stream = File.OpenRead(path)) { - var rows = stream.Query(useHeaderRow: false).ToList(); + var rows = Importer.QueryXlsx(stream, useHeaderRow: false).ToList(); Assert.Equal(3, rows.Count); Assert.Equal("A", rows[0].A); Assert.Equal("A", rows[1].A); @@ -551,14 +554,14 @@ public void SaveAsFileWithDimensionByICollection() } using (var stream = File.OpenRead(path)) { - var rows = stream.Query(useHeaderRow: true).ToList(); + var rows = Importer.QueryXlsx(stream, useHeaderRow: true).ToList(); Assert.Equal(2, rows.Count); Assert.Equal("A", rows[0].A); Assert.Equal("A", rows[1].A); } Assert.Equal("A1:B3", Helpers.GetFirstSheetDimensionRefValue(path)); - MiniExcel.SaveAs(path, values, false, overwriteFile: true); + Exporter.ExportXlsx(path, values, false, overwriteFile: true); Assert.Equal("A1:B2", Helpers.GetFirstSheetDimensionRefValue(path)); } @@ -568,20 +571,20 @@ public void SaveAsFileWithDimensionByICollection() var path = file.ToString(); List values = []; - MiniExcel.SaveAs(path, values, false); + Exporter.ExportXlsx(path, values, false); { using (var stream = File.OpenRead(path)) { - var rows = stream.Query(useHeaderRow: false).ToList(); + var rows = Importer.QueryXlsx(stream, useHeaderRow: false).ToList(); Assert.Empty(rows); } Assert.Equal("A1:B1", Helpers.GetFirstSheetDimensionRefValue(path)); } - MiniExcel.SaveAs(path, values, overwriteFile: true); + Exporter.ExportXlsx(path, values, overwriteFile: true); { using var stream = File.OpenRead(path); - var rows = stream.Query(useHeaderRow: false).ToList(); + var rows = Importer.QueryXlsx(stream, useHeaderRow: false).ToList(); Assert.Single(rows); } Assert.Equal("A1:B1", Helpers.GetFirstSheetDimensionRefValue(path)); @@ -596,11 +599,11 @@ public void SaveAsFileWithDimensionByICollection() new {A="A",B="B"}, new {A="A",B="B"}, }; - MiniExcel.SaveAs(path, values); + Exporter.ExportXlsx(path, values); { using (var stream = File.OpenRead(path)) { - var rows = stream.Query(useHeaderRow: false).ToList(); + var rows = Importer.QueryXlsx(stream, useHeaderRow: false).ToList(); Assert.Equal(3, rows.Count); Assert.Equal("A", rows[0].A); Assert.Equal("A", rows[1].A); @@ -608,7 +611,7 @@ public void SaveAsFileWithDimensionByICollection() } using (var stream = File.OpenRead(path)) { - var rows = stream.Query(useHeaderRow: true).ToList(); + var rows = Importer.QueryXlsx(stream, useHeaderRow: true).ToList(); Assert.Equal(2, rows.Count); Assert.Equal("A", rows[0].A); Assert.Equal("A", rows[1].A); @@ -616,7 +619,7 @@ public void SaveAsFileWithDimensionByICollection() } Assert.Equal("A1:B3", Helpers.GetFirstSheetDimensionRefValue(path)); - MiniExcel.SaveAs(path, values, false, overwriteFile: true); + Exporter.ExportXlsx(path, values, false, overwriteFile: true); Assert.Equal("A1:B2", Helpers.GetFirstSheetDimensionRefValue(path)); } @@ -624,7 +627,7 @@ public void SaveAsFileWithDimensionByICollection() { using var path = AutoDeletingPath.Create(); var values = new List(); - Assert.Throws(() => MiniExcel.SaveAs(path.ToString(), values)); + Assert.Throws(() => Exporter.ExportXlsx(path.ToString(), values)); } } @@ -636,15 +639,15 @@ public void SaveAsFileWithDimension() var path = file.ToString(); var table = new DataTable(); - MiniExcel.SaveAs(path, table); + Exporter.ExportXlsx(path, table); Assert.Equal("A1", Helpers.GetFirstSheetDimensionRefValue(path)); { using var stream = File.OpenRead(path); - var rows = stream.Query().ToList(); + var rows = Importer.QueryXlsx(stream).ToList(); Assert.Single(rows); } - MiniExcel.SaveAs(path, table, printHeader: false, overwriteFile: true); + Exporter.ExportXlsx(path, table, printHeader: false, overwriteFile: true); Assert.Equal("A1", Helpers.GetFirstSheetDimensionRefValue(path)); } @@ -660,12 +663,12 @@ public void SaveAsFileWithDimension() table.Rows.Add(@"""<>+-*//}{\\n", 1234567890); table.Rows.Add("Hello World", -1234567890, false, DateTime.Now); - MiniExcel.SaveAs(path, table); + Exporter.ExportXlsx(path, table); Assert.Equal("A1:D3", Helpers.GetFirstSheetDimensionRefValue(path)); using (var stream = File.OpenRead(path)) { - var rows = stream.Query(useHeaderRow: true).ToList(); + var rows = Importer.QueryXlsx(stream, useHeaderRow: true).ToList(); Assert.Equal(2, rows.Count); Assert.Equal(@"""<>+-*//}{\\n", rows[0].a); Assert.Equal(1234567890, rows[0].b); @@ -675,7 +678,7 @@ public void SaveAsFileWithDimension() using (var stream = File.OpenRead(path)) { - var rows = stream.Query().ToList(); + var rows = Importer.QueryXlsx(stream).ToList(); Assert.Equal(3, rows.Count); Assert.Equal("a", rows[0].A); Assert.Equal("b", rows[0].B); @@ -683,7 +686,7 @@ public void SaveAsFileWithDimension() Assert.Equal("d", rows[0].D); } - MiniExcel.SaveAs(path, table, printHeader: false, overwriteFile: true); + Exporter.ExportXlsx(path, table, printHeader: false, overwriteFile: true); Assert.Equal("A1:D2", Helpers.GetFirstSheetDimensionRefValue(path)); } @@ -696,7 +699,7 @@ public void SaveAsFileWithDimension() table.Rows.Add("A"); table.Rows.Add("B"); - MiniExcel.SaveAs(path.ToString(), table); + Exporter.ExportXlsx(path.ToString(), table); Assert.Equal("A1:A3", Helpers.GetFirstSheetDimensionRefValue(path.ToString())); } } @@ -717,7 +720,7 @@ public void SaveAsByDataTableTest() table.Rows.Add(@"""<>+-*//}{\\n", 1234567890, true, now); table.Rows.Add("Hello World", -1234567890, false, now.Date); - MiniExcel.SaveAs(path, table, sheetName: "R&D"); + Exporter.ExportXlsx(path, table, sheetName: "R&D"); using var p = new ExcelPackage(new FileInfo(path)); var ws = p.Workbook.Worksheets.First(); @@ -742,7 +745,7 @@ public void SaveAsByDataTableTest() table.Rows.Add("MiniExcel", 1); table.Rows.Add("Github", 2); - MiniExcel.SaveAs(path.ToString(), table); + Exporter.ExportXlsx(path.ToString(), table); } } @@ -751,16 +754,16 @@ public void QueryByLINQExtensionsAvoidLargeFileOOMTest() { const string path = "../../../../../benchmarks/MiniExcel.Benchmarks/Test1,000,000x10.xlsx"; - var query1 = MiniExcel.Query(path).First(); + var query1 = Importer.QueryXlsx(path).First(); Assert.Equal("HelloWorld1", query1.A); using (var stream = File.OpenRead(path)) { - var query2 = stream.Query().First(); + var query2 = Importer.QueryXlsx(stream).First(); Assert.Equal("HelloWorld1", query2.A); } - var query3 = MiniExcel.Query(path).Take(10); + var query3 = Importer.QueryXlsx(path).Take(10); Assert.Equal(10, query3.Count()); } @@ -771,11 +774,11 @@ public void EmptyTest() using (var connection = Db.GetConnection("Data Source=:memory:")) { var rows = connection.Query("with cte as (select 1 id,2 val) select * from cte where 1=2"); - MiniExcel.SaveAs(path.ToString(), rows); + Exporter.ExportXlsx(path.ToString(), rows); } using (var stream = File.OpenRead(path.ToString())) { - var rows = stream.Query(useHeaderRow: true).ToList(); + var rows = Importer.QueryXlsx(stream, useHeaderRow: true).ToList(); Assert.Empty(rows); } } @@ -797,11 +800,11 @@ public void SaveAsByIEnumerableIDictionary() ["R&D"] = values, ["success!"] = values }; - MiniExcel.SaveAs(path, sheets); + Exporter.ExportXlsx(path, sheets); using (var stream = File.OpenRead(path)) { - var rows = stream.Query(useHeaderRow: false).ToList(); + var rows = Importer.QueryXlsx(stream, useHeaderRow: false).ToList(); Assert.Equal("Column1", rows[0].A); Assert.Equal("Column2", rows[0].B); Assert.Equal("MiniExcel", rows[1].A); @@ -809,12 +812,12 @@ public void SaveAsByIEnumerableIDictionary() Assert.Equal("Github", rows[2].A); Assert.Equal(2, rows[2].B); - Assert.Equal("R&D", stream.GetSheetNames()[0]); + Assert.Equal("R&D", Importer.GetSheetNames(stream)[0]); } using (var stream = File.OpenRead(path)) { - var rows = stream.Query(useHeaderRow: true).ToList(); + var rows = Importer.QueryXlsx(stream, useHeaderRow: true).ToList(); Assert.Equal(2, rows.Count); Assert.Equal("MiniExcel", rows[0].Column1); @@ -822,7 +825,7 @@ public void SaveAsByIEnumerableIDictionary() Assert.Equal("Github", rows[1].Column1); Assert.Equal(2, rows[1].Column2); - Assert.Equal("success!", stream.GetSheetNames()[1]); + Assert.Equal("success!", Importer.GetSheetNames(stream)[1]); } Assert.Equal("A1:B3", Helpers.GetFirstSheetDimensionRefValue(path)); @@ -834,11 +837,11 @@ public void SaveAsByIEnumerableIDictionary() new() { { 1, "MiniExcel"}, { 2, 1 } }, new() { { 1, "Github" }, { 2, 2 } }, }; - MiniExcel.SaveAs(path, values, overwriteFile: true); + Exporter.ExportXlsx(path, values, overwriteFile: true); using (var stream = File.OpenRead(path)) { - var rows = stream.Query(useHeaderRow: false).ToList(); + var rows = Importer.QueryXlsx(stream, useHeaderRow: false).ToList(); Assert.Equal(3, rows.Count); } @@ -857,7 +860,7 @@ public void SaveAsFrozenRowsAndColumnsTest() // Test enumerable using var path = AutoDeletingPath.Create(); - MiniExcel.SaveAs( + Exporter.ExportXlsx( path.ToString(), new[] { @@ -869,7 +872,7 @@ public void SaveAsFrozenRowsAndColumnsTest() using (var stream = File.OpenRead(path.ToString())) { - var rows = stream.Query(useHeaderRow: true).ToList(); + var rows = Importer.QueryXlsx(stream, useHeaderRow: true).ToList(); Assert.Equal("MiniExcel", rows[0].Column1); Assert.Equal(1, rows[0].Column2); @@ -889,14 +892,14 @@ public void SaveAsFrozenRowsAndColumnsTest() table.Rows.Add("Hello World", -1234567890, false, DateTime.Now.Date); using var pathTable = AutoDeletingPath.Create(); - MiniExcel.SaveAs(pathTable.ToString(), table, configuration: config); + Exporter.ExportXlsx(pathTable.ToString(), table, configuration: config); Assert.Equal("A1:D3", Helpers.GetFirstSheetDimensionRefValue(pathTable.ToString())); // data reader var reader = table.CreateDataReader(); using var pathReader = AutoDeletingPath.Create(); - MiniExcel.SaveAs(pathReader.ToString(), reader, configuration: config, overwriteFile: true); + Exporter.ExportXlsx(pathReader.ToString(), reader, configuration: config, overwriteFile: true); Assert.Equal("A1:D3", Helpers.GetFirstSheetDimensionRefValue(pathTable.ToString())); //TODO: fix datareader not writing ref dimension (also in async version) } @@ -910,14 +913,14 @@ public void SaveAsByDapperRows() using (var connection = Db.GetConnection("Data Source=:memory:")) { var rows = connection.Query("select 'MiniExcel' as Column1,1 as Column2 union all select 'Github',2"); - MiniExcel.SaveAs(path, rows); + Exporter.ExportXlsx(path, rows); } Assert.Equal("A1:B3", Helpers.GetFirstSheetDimensionRefValue(path)); using (var stream = File.OpenRead(path)) { - var rows = stream.Query(useHeaderRow: true).ToList(); + var rows = Importer.QueryXlsx(stream, useHeaderRow: true).ToList(); Assert.Equal("MiniExcel", rows[0].Column1); Assert.Equal(1, rows[0].Column2); @@ -929,18 +932,18 @@ public void SaveAsByDapperRows() using (var connection = Db.GetConnection("Data Source=:memory:")) { var rows = connection.Query("with cte as (select 'MiniExcel' as Column1,1 as Column2 union all select 'Github',2)select * from cte where 1=2").ToList(); - MiniExcel.SaveAs(path, rows, overwriteFile: true); + Exporter.ExportXlsx(path, rows, overwriteFile: true); } using (var stream = File.OpenRead(path)) { - var rows = stream.Query(useHeaderRow: false).ToList(); + var rows = Importer.QueryXlsx(stream, useHeaderRow: false).ToList(); Assert.Empty(rows); } using (var stream = File.OpenRead(path)) { - var rows = stream.Query(useHeaderRow: true).ToList(); + var rows = Importer.QueryXlsx(stream, useHeaderRow: true).ToList(); Assert.Empty(rows); } @@ -950,14 +953,14 @@ public void SaveAsByDapperRows() using (var connection = Db.GetConnection("Data Source=:memory:")) { var rows = connection.Query("select 'MiniExcel' as Column1,1 as Column2 union all select 'Github',2").ToList(); - MiniExcel.SaveAs(path, rows, overwriteFile: true); + Exporter.ExportXlsx(path, rows, overwriteFile: true); } Assert.Equal("A1:B3", Helpers.GetFirstSheetDimensionRefValue(path)); using (var stream = File.OpenRead(path)) { - var rows = stream.Query(useHeaderRow: false).ToList(); + var rows = Importer.QueryXlsx(stream, useHeaderRow: false).ToList(); Assert.Equal("Column1", rows[0].A); Assert.Equal("Column2", rows[0].B); @@ -969,7 +972,7 @@ public void SaveAsByDapperRows() using (var stream = File.OpenRead(path)) { - var rows = stream.Query(useHeaderRow: true).ToList(); + var rows = Importer.QueryXlsx(stream, useHeaderRow: true).ToList(); Assert.Equal("MiniExcel", rows[0].Column1); Assert.Equal(1, rows[0].Column2); @@ -992,10 +995,10 @@ public void QueryByStrongTypeParameterTest() new() { Column1 = "MiniExcel", Column2 = 1 }, new() { Column1 = "Github", Column2 = 2 } ]; - MiniExcel.SaveAs(path.ToString(), values); + Exporter.ExportXlsx(path.ToString(), values); using var stream = File.OpenRead(path.ToString()); - var rows = stream.Query(useHeaderRow: true).ToList(); + var rows = Importer.QueryXlsx(stream, useHeaderRow: true).ToList(); Assert.Equal("MiniExcel", rows[0].Column1); Assert.Equal(1, rows[0].Column2); @@ -1012,10 +1015,10 @@ public void QueryByDictionaryStringAndObjectParameterTest() new() { { "Column1", "MiniExcel" }, { "Column2", 1 } }, new() { { "Column1", "Github" }, { "Column2", 2 } } ]; - MiniExcel.SaveAs(path.ToString(), values); + Exporter.ExportXlsx(path.ToString(), values); using var stream = File.OpenRead(path.ToString()); - var rows = stream.Query(useHeaderRow: true).ToList(); + var rows = Importer.QueryXlsx(stream, useHeaderRow: true).ToList(); Assert.Equal("MiniExcel", rows[0].Column1); Assert.Equal(1, rows[0].Column2); @@ -1042,7 +1045,7 @@ public void SQLiteInsertTest() using (var transaction = connection.BeginTransaction()) using (var stream = File.OpenRead(path)) { - var rows = stream.Query(); + var rows = Importer.QueryXlsx(stream); foreach (var row in rows) { _ = connection.Execute("insert into T (A,B) values (@A,@B)", new { row.A, row.B }, transaction: transaction); @@ -1064,7 +1067,7 @@ public void SaveAsBasicCreateTest() { using var path = AutoDeletingPath.Create(); - var rowsWritten = MiniExcel.SaveAs(path.ToString(), new[] + var rowsWritten = Exporter.ExportXlsx(path.ToString(), new[] { new { Column1 = "MiniExcel", Column2 = 1 }, new { Column1 = "Github", Column2 = 2} @@ -1075,7 +1078,7 @@ public void SaveAsBasicCreateTest() using (var stream = File.OpenRead(path.ToString())) { - var rows = stream.Query(useHeaderRow: true).ToList(); + var rows = Importer.QueryXlsx(stream, useHeaderRow: true).ToList(); Assert.Equal("MiniExcel", rows[0].Column1); Assert.Equal(1, rows[0].Column2); @@ -1098,14 +1101,14 @@ public void SaveAsBasicStreamTest() }; using (var stream = new FileStream(path.ToString(), FileMode.CreateNew)) { - var rowsWritten = stream.SaveAs(values); + var rowsWritten = Exporter.ExportXlsx(stream, values); Assert.Single(rowsWritten); Assert.Equal(2, rowsWritten[0]); } using (var stream = File.OpenRead(path.ToString())) { - var rows = stream.Query(useHeaderRow: true).ToList(); + var rows = Importer.QueryXlsx(stream, useHeaderRow: true).ToList(); Assert.Equal("MiniExcel", rows[0].Column1); Assert.Equal(1, rows[0].Column2); @@ -1123,7 +1126,7 @@ public void SaveAsBasicStreamTest() using (var stream = new MemoryStream()) using (var fileStream = new FileStream(path.ToString(), FileMode.Create)) { - var rowsWritten = stream.SaveAs(values); + var rowsWritten = Exporter.ExportXlsx(stream, values); stream.Seek(0, SeekOrigin.Begin); stream.CopyTo(fileStream); Assert.Single(rowsWritten); @@ -1132,7 +1135,7 @@ public void SaveAsBasicStreamTest() using (var stream = File.OpenRead(path.ToString())) { - var rows = stream.Query(useHeaderRow: true).ToList(); + var rows = Importer.QueryXlsx(stream, useHeaderRow: true).ToList(); Assert.Equal("MiniExcel", rows[0].Column1); Assert.Equal(1, rows[0].Column2); @@ -1146,7 +1149,7 @@ public void SaveAsBasicStreamTest() public void SaveAsSpecialAndTypeCreateTest() { using var path = AutoDeletingPath.Create(); - var rowsWritten = MiniExcel.SaveAs(path.ToString(), new[] + var rowsWritten = Exporter.ExportXlsx(path.ToString(), new[] { new { a = @"""<>+-*//}{\\n", b = 1234567890, c = true, d = DateTime.Now }, new { a = "Hello World", b = -1234567890, c = false, d = DateTime.Now.Date } @@ -1163,7 +1166,7 @@ public void SaveAsFileEpplusCanReadTest() { var now = DateTime.Now; using var path = AutoDeletingPath.Create(); - var rowsWritten = MiniExcel.SaveAs(path.ToString(), new[] + var rowsWritten = Exporter.ExportXlsx(path.ToString(), new[] { new { a = @"""<>+-*//}{\\n", b = 1234567890, c = true, d = now}, new { a = "Hello World", b = -1234567890, c = false, d = now.Date } @@ -1190,7 +1193,7 @@ public void SavaAsClosedXmlCanReadTest() { var now = DateTime.Now; using var path = AutoDeletingPath.Create(); - var rowsWritten = MiniExcel.SaveAs(path.ToString(), new[] + var rowsWritten = Exporter.ExportXlsx(path.ToString(), new[] { new { a = @"""<>+-*//}{\\n", b = 1234567890, c = true, d = now }, new { a = "Hello World", b = -1234567890, c = false, d = now.Date } @@ -1220,7 +1223,7 @@ public void ContentTypeUriContentTypeReadCheckTest() { var now = DateTime.Now; using var path = AutoDeletingPath.Create(); - var rowsWritten = MiniExcel.SaveAs(path.ToString(), new[] + var rowsWritten = Exporter.ExportXlsx(path.ToString(), new[] { new { a = @"""<>+-*//}{\\n", b = 1234567890, c = true, d= now }, new { a = "Hello World", b = -1234567890, c = false, d = now.Date } @@ -1244,10 +1247,10 @@ public void ContentTypeUriContentTypeReadCheckTest() public void TestStirctOpenXml() { const string path = "../../../../../samples/xlsx/TestStrictOpenXml.xlsx"; - var columns = MiniExcel.GetColumns(path); + var columns = Importer.GetXlsxColumns (path); Assert.Equal(["A", "B", "C"], columns); - var rows = MiniExcel.Query(path).ToList(); + var rows = Importer.QueryXlsx(path).ToList(); Assert.Equal(rows[0].A, "title1"); Assert.Equal(rows[0].B, "title2"); Assert.Equal(rows[0].C, "title3"); @@ -1262,7 +1265,7 @@ public void SharedStringCacheTest() const string path = "../../../../../benchmarks/MiniExcel.Benchmarks/Test1,000,000x10_SharingStrings.xlsx"; var ts = Stopwatch.GetTimestamp(); - _ = MiniExcel.Query(path, configuration: new OpenXmlConfiguration { EnableSharedStringCache = true }).First(); + _ = Importer.QueryXlsx(path, configuration: new OpenXmlConfiguration { EnableSharedStringCache = true }).First(); using var currentProcess = Process.GetCurrentProcess(); var totalBytesOfMemoryUsed = currentProcess.WorkingSet64; @@ -1276,7 +1279,7 @@ public void SharedStringNoCacheTest() const string path = "../../../../../benchmarks/MiniExcel.Benchmarks/Test1,000,000x10_SharingStrings.xlsx"; var ts = Stopwatch.GetTimestamp(); - _ = MiniExcel.Query(path).First(); + _ = Importer.QueryXlsx(path).First(); using var currentProcess = Process.GetCurrentProcess(); var totalBytesOfMemoryUsed = currentProcess.WorkingSet64; _output.WriteLine("totalBytesOfMemoryUsed: " + totalBytesOfMemoryUsed); @@ -1324,10 +1327,10 @@ public void DynamicColumnsConfigurationIsUsedWhenCreatingExcelUsingIDataReader() ] }; var reader = table.CreateDataReader(); - MiniExcel.SaveAs(path.ToString(), reader, configuration: configuration); + Exporter.ExportXlsx(path.ToString(), reader, configuration: configuration); using var stream = File.OpenRead(path.ToString()); - var rows = stream.Query(useHeaderRow: true) + var rows = Importer.QueryXlsx(stream, useHeaderRow: true) .Select(x => (IDictionary)x) .ToList(); @@ -1390,10 +1393,10 @@ public void DynamicColumnsConfigurationIsUsedWhenCreatingExcelUsingDataTable() } ] }; - MiniExcel.SaveAs(path.ToString(), table, configuration: configuration); + Exporter.ExportXlsx(path.ToString(), table, configuration: configuration); using var stream = File.OpenRead(path.ToString()); - var rows = stream.Query(useHeaderRow: true) + var rows = Importer.QueryXlsx(stream, useHeaderRow: true) .Select(x => (IDictionary)x) .Select(x => (IDictionary)x) .ToList(); @@ -1434,7 +1437,7 @@ public void InsertSheetTest() table.Rows.Add(@"""<>+-*//}{\\n", 1234567890, true, now); table.Rows.Add("Hello World", -1234567890, false, now.Date); - var rowsWritten = MiniExcel.Insert(path, table, sheetName: "Sheet1"); + var rowsWritten = Exporter.InsertXlsxSheet(path, table, sheetName: "Sheet1"); Assert.Equal(2, rowsWritten); using var p = new ExcelPackage(new FileInfo(path)); @@ -1459,7 +1462,7 @@ public void InsertSheetTest() table.Rows.Add("MiniExcel", 1); table.Rows.Add("Github", 2); - var rowsWritten = MiniExcel.Insert(path, table, sheetName: "Sheet2"); + var rowsWritten = Exporter.InsertXlsxSheet(path, table, sheetName: "Sheet2"); Assert.Equal(2, rowsWritten); using var p = new ExcelPackage(new FileInfo(path)); @@ -1482,7 +1485,7 @@ public void InsertSheetTest() table.Columns.Add("Column2", typeof(DateTime)); table.Rows.Add("Test", now); - var rowsWritten = MiniExcel.Insert(path, table, sheetName: "Sheet2", printHeader: false, configuration: new OpenXmlConfiguration + var rowsWritten = Exporter.InsertXlsxSheet(path, table, sheetName: "Sheet2", printHeader: false, configuration: new OpenXmlConfiguration { FastMode = true, AutoFilter = false, @@ -1515,7 +1518,7 @@ public void InsertSheetTest() table.Rows.Add("MiniExcel", now); table.Rows.Add("Github", now); - var rowsWritten = MiniExcel.Insert(path, table, sheetName: "Sheet3", configuration: new OpenXmlConfiguration + var rowsWritten = Exporter.InsertXlsxSheet(path, table, sheetName: "Sheet3", configuration: new OpenXmlConfiguration { FastMode = true, AutoFilter = false, @@ -1552,13 +1555,13 @@ public void InsertSheetTest() private class DateOnlyTest { public DateOnly Date { get; set; } - [ExcelFormat("d.M.yyyy")] public DateOnly DateWithFormat { get; set; } + [MiniExcelFormat("d.M.yyyy")] public DateOnly DateWithFormat { get; set; } } [Fact] public void DateOnlySupportTest() { - var query = MiniExcel.Query(PathHelper.GetFile("xlsx/TestDateOnlyMapping.xlsx")).ToList(); + var query = Importer.QueryXlsx(PathHelper.GetFile("xlsx/TestDateOnlyMapping.xlsx")).ToList(); Assert.Equal(new DateOnly(2020, 9, 27), query[0].Date); Assert.Equal(new DateOnly(2020, 10, 25), query[1].Date); @@ -1573,7 +1576,7 @@ public void DateOnlySupportTest() public void SheetDimensionsTest() { var path1 = PathHelper.GetFile("xlsx/TestTypeMapping.xlsx"); - var dim1 = MiniExcel.GetSheetDimensions(path1); + var dim1 = Importer.GetSheetDimensions(path1); Assert.Equal("A1", dim1[0].StartCell); Assert.Equal("H101", dim1[0].EndCell); Assert.Equal(101, dim1[0].Rows.Count); @@ -1584,7 +1587,7 @@ public void SheetDimensionsTest() Assert.Equal(8, dim1[0].Columns.EndIndex); var path2 = PathHelper.GetFile("xlsx/TestNoDimension.xlsx"); - var dim2 = MiniExcel.GetSheetDimensions(path2); + var dim2 = Importer.GetSheetDimensions(path2); Assert.Equal(101, dim2[0].Rows.Count); Assert.Equal(7, dim2[0].Columns.Count); Assert.Equal(1, dim2[0].Rows.StartIndex); @@ -1597,7 +1600,7 @@ public void SheetDimensionsTest() public void SheetDimensionsTest_MultiSheet() { var path = PathHelper.GetFile("xlsx/TestMultiSheet.xlsx"); - var dim = MiniExcel.GetSheetDimensions(path); + var dim = Importer.GetSheetDimensions(path); Assert.Equal("A1", dim[0].StartCell); Assert.Equal("D12", dim[0].EndCell); diff --git a/tests/MiniExcelTests/MiniExcelTests.csproj b/tests/MiniExcelTests/MiniExcelTests.csproj index 50838497..160fcbcd 100644 --- a/tests/MiniExcelTests/MiniExcelTests.csproj +++ b/tests/MiniExcelTests/MiniExcelTests.csproj @@ -7,9 +7,9 @@ false true - ..\..\src\MiniExcel\miniexcel.snk + ..\..\src\miniexcel.snk $(NoWarn);IDE0017;IDE0034;IDE0037;IDE0039;IDE0042;IDE0044;IDE0051;IDE0052;IDE0059;IDE0060;IDE0063;IDE1006;xUnit1004;CA1806;CA1816;CA1822;CA1825;CA1849;CA2000;CA2007;CA2208 - MiniExcelLibs.Tests + MiniExcelLib.Tests @@ -30,13 +30,17 @@ all - + - + + + - + - + + miniexcel.snk + diff --git a/tests/MiniExcelTests/SaveByTemplate/InputValueExtractorTests.cs b/tests/MiniExcelTests/SaveByTemplate/InputValueExtractorTests.cs index 7c39b890..54d4fe92 100644 --- a/tests/MiniExcelTests/SaveByTemplate/InputValueExtractorTests.cs +++ b/tests/MiniExcelTests/SaveByTemplate/InputValueExtractorTests.cs @@ -1,8 +1,8 @@ using System.Data; -using MiniExcelLibs.SaveByTemplate; +using MiniExcelLib.Core.OpenXml.Templates; using Xunit; -namespace MiniExcelLibs.Tests.SaveByTemplate; +namespace MiniExcelLib.Tests.SaveByTemplate; public class InputValueExtractorTests { @@ -16,7 +16,7 @@ public void ToValueDictionary_Given_InputIsDictionaryWithoutDataReader_Then_Outp ["Fruits"] = new List { "Apples, Oranges" }, }; - var sut = new InputValueExtractor(); + var sut = new OpenXmlValueExtractor(); var result = sut.ToValueDictionary(valueDictionary); Assert.Equal(result.Count, valueDictionary.Count); @@ -47,7 +47,7 @@ public void ToValueDictionary_Given_InputIsDictionaryWithDataReader_Then_DataRea ["DataReader"] = dataTable.CreateDataReader() }; - var sut = new InputValueExtractor(); + var sut = new OpenXmlValueExtractor(); var extracted = sut.ToValueDictionary(valueDictionary); var result = (List>)extracted["DataReader"]; @@ -76,7 +76,7 @@ public void ToValueDictionary_Given_InputIsPocoRecord_Then_Output_IsAnEquivalent ["Fruits"] = new List { "Apples, Oranges" } }; - var sut = new InputValueExtractor(); + var sut = new OpenXmlValueExtractor(); var result = sut.ToValueDictionary(valueObject); Assert.Equal(result.Count, expectedOutput.Count); @@ -103,7 +103,7 @@ public void ToValueDictionary_Given_InputIsPocoClass_Then_Output_IsAnEquivalentD ["Fruits"] = new List { "Apples, Oranges" } }; - var sut = new InputValueExtractor(); + var sut = new OpenXmlValueExtractor(); var result = sut.ToValueDictionary(valueObject); Assert.Equal(result.Count, expectedOutput.Count); diff --git a/tests/MiniExcelTests/SaveByTemplate/MiniExcelTemplateAsyncTests.cs b/tests/MiniExcelTests/SaveByTemplate/MiniExcelTemplateAsyncTests.cs index a48ca63e..2731ec1e 100644 --- a/tests/MiniExcelTests/SaveByTemplate/MiniExcelTemplateAsyncTests.cs +++ b/tests/MiniExcelTests/SaveByTemplate/MiniExcelTemplateAsyncTests.cs @@ -1,9 +1,11 @@ using System.Data; using Dapper; -using MiniExcelLibs.Tests.Utils; +using MiniExcelLib.Tests.Utils; +using Importer = MiniExcelLib.MiniExcel.Importer; +using Templater = MiniExcelLib.MiniExcel.Templater; using Xunit; -namespace MiniExcelLibs.Tests.SaveByTemplate; +namespace MiniExcelLib.Tests.SaveByTemplate; public class MiniExcelTemplateAsyncTests { @@ -29,8 +31,8 @@ public async Task DatatableTemptyRowTest() ["managers"] = managers, ["employees"] = employees }; - await MiniExcel.SaveAsByTemplateAsync(path.ToString(), templatePath, value); - var rows = MiniExcel.QueryAsync(path.ToString()).ToBlockingEnumerable().ToList(); + await Templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); + var rows = Importer.QueryXlsxAsync(path.ToString()).ToBlockingEnumerable().ToList(); var dimension = Helpers.GetFirstSheetDimensionRefValue(path.ToString()); Assert.Equal("A1:C5", dimension); @@ -54,8 +56,8 @@ public async Task DatatableTemptyRowTest() ["employees"] = employees }; - await MiniExcel.SaveAsByTemplateAsync(path.ToString(), templatePath, value); - var rows = MiniExcel.QueryAsync(path.ToString()).ToBlockingEnumerable().ToList(); + await Templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); + var rows = Importer.QueryXlsxAsync(path.ToString()).ToBlockingEnumerable().ToList(); var dimension = Helpers.GetFirstSheetDimensionRefValue(path.ToString()); Assert.Equal("A1:C5", dimension); @@ -88,8 +90,8 @@ public async Task DatatableTest() ["managers"] = managers, ["employees"] = employees }; - await MiniExcel.SaveAsByTemplateAsync(path.ToString(), templatePath, value); - var rows = MiniExcel.QueryAsync(path.ToString()).ToBlockingEnumerable().ToList(); + await Templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); + var rows = Importer.QueryXlsxAsync(path.ToString()).ToBlockingEnumerable().ToList(); var dimension = Helpers.GetFirstSheetDimensionRefValue(path.ToString()); Assert.Equal("A1:C9", dimension); @@ -112,7 +114,7 @@ public async Task DatatableTest() Assert.Equal("IT", rows[8].C); { - rows = MiniExcel.QueryAsync(path.ToString(), sheetName: "Sheet2").ToBlockingEnumerable().ToList(); + rows = Importer.QueryXlsxAsync(path.ToString(), sheetName: "Sheet2").ToBlockingEnumerable().ToList(); Assert.Equal(9, rows.Count); Assert.Equal("FooCompany", rows[0].A); @@ -149,10 +151,10 @@ public async Task DapperTemplateTest() ["managers"] = connection.Query("select 'Jack' name,'HR' department union all select 'Loan','IT'"), ["employees"] = connection.Query(@"select 'Wade' name,'HR' department union all select 'Felix','HR' union all select 'Eric','IT' union all select 'Keaton','IT'") }; - await MiniExcel.SaveAsByTemplateAsync(path.ToString(), templatePath, value); + await Templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); { - var rows = MiniExcel.QueryAsync(path.ToString()).ToBlockingEnumerable().ToList(); + var rows = Importer.QueryXlsxAsync(path.ToString()).ToBlockingEnumerable().ToList(); Assert.Equal(9, rows.Count); @@ -177,7 +179,7 @@ public async Task DapperTemplateTest() } { - var rows = MiniExcel.QueryAsync(path.ToString(), sheetName: "Sheet2").ToBlockingEnumerable().ToList(); + var rows = Importer.QueryXlsxAsync(path.ToString(), sheetName: "Sheet2").ToBlockingEnumerable().ToList(); Assert.Equal(9, rows.Count); Assert.Equal("FooCompany", rows[0].A); @@ -223,10 +225,10 @@ public async Task DictionaryTemplateTest() new Dictionary{["name"]="Keaton",["department"]="IT"} } }; - await MiniExcel.SaveAsByTemplateAsync(path, templatePath, value); + await Templater.ApplyXlsxTemplateAsync(path, templatePath, value); { - var rows = MiniExcel.Query(path).ToList(); + var rows = Importer.QueryXlsx(path).ToList(); Assert.Equal(9, rows.Count); @@ -251,7 +253,7 @@ public async Task DictionaryTemplateTest() } { - var rows = MiniExcel.Query(path, sheetName: "Sheet2").ToList(); + var rows = Importer.QueryXlsx(path, sheetName: "Sheet2").ToList(); Assert.Equal(9, rows.Count); @@ -294,9 +296,9 @@ public async Task TestGithubProject() Projects = projects, TotalStar = projects.Sum(s => s.Star) }; - await MiniExcel.SaveAsByTemplateAsync(path.ToString(), templatePath, value); + await Templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); - var rows = MiniExcel.QueryAsync(path.ToString()).ToBlockingEnumerable().ToList(); + var rows = Importer.QueryXlsxAsync(path.ToString()).ToBlockingEnumerable().ToList(); Assert.Equal("ITWeiHan Github Projects", rows[0].B); Assert.Equal("Total Star : 178", rows[8].C); @@ -342,9 +344,9 @@ public async Task TestIEnumerableType() poco } }; - await MiniExcel.SaveAsByTemplateAsync(path.ToString(), templatePath, value); + await Templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); - var rows = MiniExcel.Query(path.ToString()).ToList(); + var rows = Importer.QueryXlsx(path.ToString()).ToList(); Assert.Equal(poco.@string, rows[0].@string); Assert.Equal(poco.@int, rows[0].@int); Assert.Equal(poco.@double, rows[0].@double); @@ -407,9 +409,9 @@ public async Task TestTemplateTypeMapping() @bool = true, Guid = Guid.NewGuid() }; - await MiniExcel.SaveAsByTemplateAsync(path.ToString(), templatePath, value); + await Templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); - var rows = MiniExcel.Query(path.ToString()).ToList(); + var rows = Importer.QueryXlsx(path.ToString()).ToList(); Assert.Equal(value.@string, rows[0].@string); Assert.Equal(value.@int, rows[0].@int); Assert.Equal(value.@double, rows[0].@double); @@ -431,7 +433,7 @@ public async Task TemplateCenterEmptyTest() { Tests = Enumerable.Range(1, 5).Select(i => new { test1 = i, test2 = i }) }; - await MiniExcel.SaveAsByTemplateAsync(path.ToString(), templatePath, value); + await Templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); } [Fact] @@ -449,9 +451,9 @@ public async Task TemplateAsyncBasiTest() VIP = true, Points = 123 }; - await MiniExcel.SaveAsByTemplateAsync(path.ToString(), templatePath, value); + await Templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); - var rows = MiniExcel.QueryAsync(path.ToString()).ToBlockingEnumerable().ToList(); + var rows = Importer.QueryXlsxAsync(path.ToString()).ToBlockingEnumerable().ToList(); Assert.Equal("Jack", rows[1].A); Assert.Equal("2021-01-01 00:00:00", rows[1].B); Assert.Equal(true, rows[1].C); @@ -473,9 +475,9 @@ public async Task TemplateAsyncBasiTest() VIP = true, Points = 123 }; - await MiniExcel.SaveAsByTemplateAsync(path, templateBytes, value); + await Templater.ApplyXlsxTemplateAsync(path, templateBytes, value); - var rows = (MiniExcel.QueryAsync(path).ToBlockingEnumerable()).ToList(); + var rows = (Importer.QueryXlsxAsync(path).ToBlockingEnumerable()).ToList(); Assert.Equal("Jack", rows[1].A); Assert.Equal("2021-01-01 00:00:00", rows[1].B); Assert.Equal(true, rows[1].C); @@ -500,10 +502,10 @@ public async Task TemplateAsyncBasiTest() }; await using (var stream = File.Create(path.ToString())) { - await stream.SaveAsByTemplateAsync(templateBytes, value); + await Templater.ApplyXlsxTemplateAsync(stream, templateBytes, value); } - var rows = MiniExcel.QueryAsync(path.ToString()).ToBlockingEnumerable().ToList(); + var rows = Importer.QueryXlsxAsync(path.ToString()).ToBlockingEnumerable().ToList(); Assert.Equal("Jack", rows[1].A); Assert.Equal("2021-01-01 00:00:00", rows[1].B); Assert.Equal(true, rows[1].C); @@ -525,9 +527,9 @@ public async Task TemplateAsyncBasiTest() ["VIP"] = true, ["Points"] = 123 }; - await MiniExcel.SaveAsByTemplateAsync(path.ToString(), templatePath, value); + await Templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); - var rows = MiniExcel.QueryAsync(path.ToString()).ToBlockingEnumerable().ToList(); + var rows = Importer.QueryXlsxAsync(path.ToString()).ToBlockingEnumerable().ToList(); Assert.Equal("Jack", rows[1].A); Assert.Equal("2021-01-01 00:00:00", rows[1].B); Assert.Equal(true, rows[1].C); @@ -559,7 +561,7 @@ public async Task TestIEnumerable() new { name = "Loan", department = "IT "} } }; - await MiniExcel.SaveAsByTemplateAsync(path.ToString(), templatePath, value); + await Templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); var dimension = Helpers.GetFirstSheetDimensionRefValue(path.ToString()); Assert.Equal("A1:B7", dimension); @@ -581,7 +583,7 @@ public async Task TestIEnumerable() new { name = "Loan", department = "IT "} } }; - await MiniExcel.SaveAsByTemplateAsync(path.ToString(), templatePath, value); + await Templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); var dimension = Helpers.GetFirstSheetDimensionRefValue(path.ToString()); Assert.Equal("A1:B7", dimension); @@ -606,7 +608,7 @@ public async Task TestIEnumerable() { ["employees"] = dt }; - await MiniExcel.SaveAsByTemplateAsync(path.ToString(), templatePath, value); + await Templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); var dimension = Helpers.GetFirstSheetDimensionRefValue(path.ToString()); Assert.Equal("A1:B7", dimension); @@ -633,7 +635,7 @@ public async Task TestIEnumerableGrouped() new { name = "Loan", department = "IT" } } }; - await MiniExcel.SaveAsByTemplateAsync(path.ToString(), templatePath, value); + await Templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); var dimension = Helpers.GetFirstSheetDimensionRefValue(path.ToString()); Assert.Equal("A1:B18", dimension); @@ -655,7 +657,7 @@ public async Task TestIEnumerableGrouped() new { name = "Loan", department = "IT "} } }; - await MiniExcel.SaveAsByTemplateAsync(path.ToString(), templatePath, value); + await Templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); var dimension = Helpers.GetFirstSheetDimensionRefValue(path.ToString()); Assert.Equal("A1:B18", dimension); @@ -680,7 +682,7 @@ public async Task TestIEnumerableGrouped() { ["employees"] = dt }; - await MiniExcel.SaveAsByTemplateAsync(path.ToString(), templatePath, value); + await Templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); var dimension = Helpers.GetFirstSheetDimensionRefValue(path.ToString()); Assert.Equal("A1:B18", dimension); @@ -707,7 +709,7 @@ public async Task TestIEnumerableConditional() new { name = "Loan", department = "IT "} } }; - await MiniExcel.SaveAsByTemplateAsync(path.ToString(), templatePath, value); + await Templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); var dimension = Helpers.GetFirstSheetDimensionRefValue(path.ToString()); Assert.Equal("A1:B18", dimension); @@ -729,7 +731,7 @@ public async Task TestIEnumerableConditional() new { name = "Loan", department = "IT" } } }; - await MiniExcel.SaveAsByTemplateAsync(path.ToString(), templatePath, value); + await Templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); var dimension = Helpers.GetFirstSheetDimensionRefValue(path.ToString()); Assert.Equal("A1:B18", dimension); @@ -754,7 +756,7 @@ public async Task TestIEnumerableConditional() { ["employees"] = dt }; - await MiniExcel.SaveAsByTemplateAsync(path.ToString(), templatePath, value); + await Templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); var dimension = Helpers.GetFirstSheetDimensionRefValue(path.ToString()); Assert.Equal("A1:B18", dimension); @@ -785,10 +787,10 @@ public async Task TemplateTest() new { name = "Keaton", department = "IT" } } }; - await MiniExcel.SaveAsByTemplateAsync(path.ToString(), templatePath, value); + await Templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); { - var rows = MiniExcel.QueryAsync(path.ToString()).ToBlockingEnumerable().ToList(); + var rows = Importer.QueryXlsxAsync(path.ToString()).ToBlockingEnumerable().ToList(); Assert.Equal(9, rows.Count); Assert.Equal("FooCompany", rows[0].A); @@ -812,7 +814,7 @@ public async Task TemplateTest() } { - var rows = MiniExcel.QueryAsync(path.ToString(), sheetName: "Sheet2").ToBlockingEnumerable().ToList(); + var rows = Importer.QueryXlsxAsync(path.ToString(), sheetName: "Sheet2").ToBlockingEnumerable().ToList(); Assert.Equal(9, rows.Count); Assert.Equal("FooCompany", rows[0].A); @@ -856,9 +858,9 @@ public async Task TemplateTest() new { name = "Keaton", department = "IT" } } }; - await MiniExcel.SaveAsByTemplateAsync(path.ToString(), templatePath, value); + await Templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); - var rows = MiniExcel.QueryAsync(path.ToString()).ToBlockingEnumerable().ToList(); + var rows = Importer.QueryXlsxAsync(path.ToString()).ToBlockingEnumerable().ToList(); Assert.Equal("FooCompany", rows[0].A); Assert.Equal("Jack", rows[2].B); Assert.Equal("HR", rows[2].C); @@ -898,7 +900,7 @@ await Assert.ThrowsAsync(async () => }; await cts.CancelAsync(); - await MiniExcel.SaveAsByTemplateAsync(path.ToString(), templatePath, value, cancellationToken: cts.Token); + await Templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value, cancellationToken: cts.Token); }); } } \ No newline at end of file diff --git a/tests/MiniExcelTests/SaveByTemplate/MiniExcelTemplateTests.cs b/tests/MiniExcelTests/SaveByTemplate/MiniExcelTemplateTests.cs index cadd66be..46e2408c 100644 --- a/tests/MiniExcelTests/SaveByTemplate/MiniExcelTemplateTests.cs +++ b/tests/MiniExcelTests/SaveByTemplate/MiniExcelTemplateTests.cs @@ -1,15 +1,13 @@ -using Dapper; -using DocumentFormat.OpenXml.Office2013.ExcelAc; -using MiniExcelLibs.Enums; -using MiniExcelLibs.Picture; -using MiniExcelLibs.Tests.Utils; -using OfficeOpenXml; -using OfficeOpenXml.Drawing; using System.Data; -using System.IO.Compression; +using Dapper; +using MiniExcelLib.Core.Enums; +using MiniExcelLib.Core.OpenXml.Picture; +using MiniExcelLib.Tests.Utils; +using Importer = MiniExcelLib.MiniExcel.Importer; +using Templater = MiniExcelLib.MiniExcel.Templater; using Xunit; -namespace MiniExcelLibs.Tests.SaveByTemplate; +namespace MiniExcelLib.Tests.SaveByTemplate; public class MiniExcelTemplateTests { @@ -95,7 +93,8 @@ public void TestImageType() } } } - [Fact] + + [Fact] public void DatatableTemptyRowTest() { const string templatePath = "../../../../../samples/xlsx/TestTemplateComplex.xlsx"; @@ -116,9 +115,9 @@ public void DatatableTemptyRowTest() ["managers"] = managers, ["employees"] = employees }; - MiniExcel.SaveAsByTemplate(path.ToString(), templatePath, value); + Templater.ApplyXlsxTemplate(path.ToString(), templatePath, value); - var rows = MiniExcel.Query(path.ToString()).ToList(); + var rows = Importer.QueryXlsx(path.ToString()).ToList(); var dimension = Helpers.GetFirstSheetDimensionRefValue(path.ToString()); Assert.Equal("A1:C5", dimension); } @@ -141,9 +140,9 @@ public void DatatableTemptyRowTest() ["managers"] = managers, ["employees"] = employees }; - MiniExcel.SaveAsByTemplate(path.ToString(), templatePath, value); + Templater.ApplyXlsxTemplate(path.ToString(), templatePath, value); - var rows = MiniExcel.Query(path.ToString()).ToList(); + var rows = Importer.QueryXlsx(path.ToString()).ToList(); var dimension = Helpers.GetFirstSheetDimensionRefValue(path.ToString()); Assert.Equal("A1:C5", dimension); } @@ -176,10 +175,10 @@ public void DatatableTest() ["managers"] = managers, ["employees"] = employees }; - MiniExcel.SaveAsByTemplate(path, templatePath, value); + Templater.ApplyXlsxTemplate(path, templatePath, value); { - var rows = MiniExcel.Query(path).ToList(); + var rows = Importer.QueryXlsx(path).ToList(); var dimension = Helpers.GetFirstSheetDimensionRefValue(path); Assert.Equal("A1:C9", dimension); @@ -204,7 +203,7 @@ public void DatatableTest() } { - var rows = MiniExcel.Query(path, sheetName: "Sheet2").ToList(); + var rows = Importer.QueryXlsx(path, sheetName: "Sheet2").ToList(); Assert.Equal(9, rows.Count); Assert.Equal("FooCompany", rows[0].A); @@ -243,10 +242,10 @@ public void DapperTemplateTest() ["managers"] = connection.Query("select 'Jack' name,'HR' department union all select 'Loan','IT'"), ["employees"] = connection.Query("select 'Wade' name,'HR' department union all select 'Felix','HR' union all select 'Eric','IT' union all select 'Keaton','IT'") }; - MiniExcel.SaveAsByTemplate(path, templatePath, value); + Templater.ApplyXlsxTemplate(path, templatePath, value); { - var rows = MiniExcel.Query(path).ToList(); + var rows = Importer.QueryXlsx(path).ToList(); Assert.Equal(9, rows.Count); Assert.Equal("FooCompany", rows[0].A); @@ -270,7 +269,7 @@ public void DapperTemplateTest() } { - var rows = MiniExcel.Query(path, sheetName: "Sheet2").ToList(); + var rows = Importer.QueryXlsx(path, sheetName: "Sheet2").ToList(); Assert.Equal(9, rows.Count); Assert.Equal("FooCompany", rows[0].A); @@ -318,10 +317,10 @@ public void DictionaryTemplateTest() new Dictionary { ["name"] = "Keaton", ["department"] = "IT" } } }; - MiniExcel.SaveAsByTemplate(path, templatePath, value); + Templater.ApplyXlsxTemplate(path, templatePath, value); { - var rows = MiniExcel.Query(path).ToList(); + var rows = Importer.QueryXlsx(path).ToList(); Assert.Equal(9, rows.Count); Assert.Equal("FooCompany", rows[0].A); @@ -345,7 +344,7 @@ public void DictionaryTemplateTest() } { - var rows = MiniExcel.Query(path, sheetName: "Sheet2").ToList(); + var rows = Importer.QueryXlsx(path, sheetName: "Sheet2").ToList(); Assert.Equal(9, rows.Count); Assert.Equal("FooCompany", rows[0].A); @@ -395,9 +394,9 @@ public void GroupTemplateTest() new() { name = "Felix", department = "HR" } } }; - MiniExcel.SaveAsByTemplate(path, templatePath, value); + Templater.ApplyXlsxTemplate(path, templatePath, value); - var rows = MiniExcel.Query(path).ToList(); + var rows = Importer.QueryXlsx(path).ToList(); Assert.Equal(16, rows.Count); Assert.Equal("Jack", rows[1].A); @@ -464,9 +463,9 @@ public void TestGithubProject() Projects = projects, TotalStar = projects.Sum(s => s.Star) }; - MiniExcel.SaveAsByTemplate(path.ToString(), templatePath, value); + Templater.ApplyXlsxTemplate(path.ToString(), templatePath, value); - var rows = MiniExcel.Query(path.ToString()).ToList(); + var rows = Importer.QueryXlsx(path.ToString()).ToList(); Assert.Equal("ITWeiHan Github Projects", rows[0].B); Assert.Equal("Total Star : 178", rows[8].C); @@ -489,7 +488,7 @@ private class TestIEnumerableTypePoco public void TestIEnumerableType() { { - const string templatePath = @"../../../../../samples/xlsx/TestIEnumerableType.xlsx"; + const string templatePath = "../../../../../samples/xlsx/TestIEnumerableType.xlsx"; using var path = AutoDeletingPath.Create(); //1. By POCO @@ -515,9 +514,9 @@ public void TestIEnumerableType() poco } }; - MiniExcel.SaveAsByTemplate(path.ToString(), templatePath, value); + Templater.ApplyXlsxTemplate(path.ToString(), templatePath, value); - var rows = MiniExcel.Query(path.ToString()).ToList(); + var rows = Importer.QueryXlsx(path.ToString()).ToList(); Assert.Equal(poco.@string, rows[0].@string); Assert.Equal(poco.@int, rows[0].@int); Assert.Equal(poco.@double, rows[0].@double); @@ -583,9 +582,9 @@ public void TestTemplateTypeMapping() @bool = true, Guid = Guid.NewGuid() }; - MiniExcel.SaveAsByTemplate(path.ToString(), templatePath, value); + Templater.ApplyXlsxTemplate(path.ToString(), templatePath, value); - var rows = MiniExcel.Query(path.ToString()).ToList(); + var rows = Importer.QueryXlsx(path.ToString()).ToList(); Assert.Equal(value.@string, rows[0].@string); Assert.Equal(value.@int, rows[0].@int); Assert.Equal(value.@double, rows[0].@double); @@ -608,7 +607,7 @@ public void TemplateCenterEmptyTest() { Tests = Enumerable.Range(1, 5).Select(i => new { test1 = i, test2 = i }) }; - MiniExcel.SaveAsByTemplate(path.ToString(), templatePath, value); + Templater.ApplyXlsxTemplate(path.ToString(), templatePath, value); } [Fact] @@ -626,9 +625,9 @@ public void TemplateBasicTest() VIP = true, Points = 123 }; - MiniExcel.SaveAsByTemplate(path.ToString(), templatePath, value); + Templater.ApplyXlsxTemplate(path.ToString(), templatePath, value); - var rows = MiniExcel.Query(path.ToString()).ToList(); + var rows = Importer.QueryXlsx(path.ToString()).ToList(); Assert.Equal("Jack", rows[1].A); Assert.Equal("2021-01-01 00:00:00", rows[1].B); Assert.Equal(true, rows[1].C); @@ -650,9 +649,9 @@ public void TemplateBasicTest() VIP = true, Points = 123 }; - MiniExcel.SaveAsByTemplate(path.ToString(), templateBytes, value); + Templater.ApplyXlsxTemplate(path.ToString(), templateBytes, value); - var rows = MiniExcel.Query(path.ToString()).ToList(); + var rows = Importer.QueryXlsx(path.ToString()).ToList(); Assert.Equal("Jack", rows[1].A); Assert.Equal("2021-01-01 00:00:00", rows[1].B); Assert.Equal(true, rows[1].C); @@ -677,10 +676,10 @@ public void TemplateBasicTest() }; using (var stream = File.Create(path.ToString())) { - stream.SaveAsByTemplate(templateBytes, value); + Templater.ApplyXlsxTemplate(stream, templateBytes, value); } - var rows = MiniExcel.Query(path.ToString()).ToList(); + var rows = Importer.QueryXlsx(path.ToString()).ToList(); Assert.Equal("Jack", rows[1].A); Assert.Equal("2021-01-01 00:00:00", rows[1].B); Assert.Equal(true, rows[1].C); @@ -702,9 +701,9 @@ public void TemplateBasicTest() ["VIP"] = true, ["Points"] = 123 }; - MiniExcel.SaveAsByTemplate(path.ToString(), templatePath, value); + Templater.ApplyXlsxTemplate(path.ToString(), templatePath, value); - var rows = MiniExcel.Query(path.ToString()).ToList(); + var rows = Importer.QueryXlsx(path.ToString()).ToList(); Assert.Equal("Jack", rows[1].A); Assert.Equal("2021-01-01 00:00:00", rows[1].B); Assert.Equal(true, rows[1].C); @@ -736,7 +735,7 @@ public void TestIEnumerable() new { name = "Loan", department = "IT" } } }; - MiniExcel.SaveAsByTemplate(path.ToString(), templatePath, value); + Templater.ApplyXlsxTemplate(path.ToString(), templatePath, value); var dimension = Helpers.GetFirstSheetDimensionRefValue(path.ToString()); Assert.Equal("A1:B7", dimension); @@ -758,7 +757,7 @@ public void TestIEnumerable() new { name = "Loan", department = "IT" } } }; - MiniExcel.SaveAsByTemplate(path.ToString(), templatePath, value); + Templater.ApplyXlsxTemplate(path.ToString(), templatePath, value); var dimension = Helpers.GetFirstSheetDimensionRefValue(path.ToString()); Assert.Equal("A1:B7", dimension); @@ -783,7 +782,7 @@ public void TestIEnumerable() { ["employees"] = dt }; - MiniExcel.SaveAsByTemplate(path.ToString(), templatePath, value); + Templater.ApplyXlsxTemplate(path.ToString(), templatePath, value); var dimension = Helpers.GetFirstSheetDimensionRefValue(path.ToString()); Assert.Equal("A1:B7", dimension); @@ -808,7 +807,7 @@ public void TestIEnumerableWithFormulas() new { name = "Joan", department = "IT", salary = 120000 } } }; - MiniExcel.SaveAsByTemplate(path.ToString(), templatePath, value); + Templater.ApplyXlsxTemplate(path.ToString(), templatePath, value); var dimension = Helpers.GetFirstSheetDimensionRefValue(path.ToString()); Assert.Equal("A1:C13", dimension); @@ -838,10 +837,10 @@ public void TemplateTest() new { name = "Keaton", department = "IT" } } }; - MiniExcel.SaveAsByTemplate(path.ToString(), templatePath, value); + Templater.ApplyXlsxTemplate(path.ToString(), templatePath, value); { - var rows = MiniExcel.Query(path.ToString()).ToList(); + var rows = Importer.QueryXlsx(path.ToString()).ToList(); Assert.Equal(9, rows.Count); @@ -866,7 +865,7 @@ public void TemplateTest() } { - var rows = MiniExcel.Query(path.ToString(), sheetName: "Sheet2").ToList(); + var rows = Importer.QueryXlsx(path.ToString(), sheetName: "Sheet2").ToList(); Assert.Equal(9, rows.Count); @@ -912,9 +911,9 @@ public void TemplateTest() new { name = "Keaton", department = "IT" } } }; - MiniExcel.SaveAsByTemplate(path.ToString(), templatePath, value); + Templater.ApplyXlsxTemplate(path.ToString(), templatePath, value); - var rows = MiniExcel.Query(path.ToString()).ToList(); + var rows = Importer.QueryXlsx(path.ToString()).ToList(); Assert.Equal("FooCompany", rows[0].A); Assert.Equal("Jack", rows[2].B); Assert.Equal("HR", rows[2].C); @@ -942,7 +941,7 @@ public void MergeSameCellsWithTagTest() const string path = "../../../../../samples/xlsx/TestMergeWithTag.xlsx"; using var mergedFilePath = AutoDeletingPath.Create(); - MiniExcel.MergeSameCells(mergedFilePath.ToString(), path); + Templater.MergeSameCells(mergedFilePath.ToString(), path); var mergedCells = Helpers.GetFirstSheetMergedCells(mergedFilePath.ToString()); Assert.Equal("A2:A4", mergedCells[0]); @@ -956,7 +955,7 @@ public void MergeSameCellsWithLimitTagTest() const string path = "../../../../../samples/xlsx/TestMergeWithLimitTag.xlsx"; using var mergedFilePath = AutoDeletingPath.Create(); - MiniExcel.MergeSameCells(mergedFilePath.ToString(), path); + Templater.MergeSameCells(mergedFilePath.ToString(), path); var mergedCells = Helpers.GetFirstSheetMergedCells(mergedFilePath.ToString()); Assert.Equal("A3:A4", mergedCells[0]); diff --git a/tests/MiniExcelTests/Utils/AutoDeletingPath.cs b/tests/MiniExcelTests/Utils/AutoDeletingPath.cs index 139779bf..b2e0dded 100644 --- a/tests/MiniExcelTests/Utils/AutoDeletingPath.cs +++ b/tests/MiniExcelTests/Utils/AutoDeletingPath.cs @@ -1,4 +1,4 @@ -namespace MiniExcelLibs.Tests.Utils; +namespace MiniExcelLib.Tests.Utils; public class AutoDeletingPath : IDisposable { @@ -11,7 +11,7 @@ private AutoDeletingPath(string path) public static AutoDeletingPath Create(string path) => new(path); public static AutoDeletingPath Create(string path, string filename) => new(Path.Combine(path, filename)); - public static AutoDeletingPath Create(ExcelType type = ExcelType.XLSX) => Create( + public static AutoDeletingPath Create(ExcelType type = ExcelType.Xlsx) => Create( Path.GetTempPath(), $"{Guid.NewGuid()}.{type.ToString().ToLowerInvariant()}"); @@ -21,4 +21,6 @@ public void Dispose() } public override string ToString() => FilePath; -} \ No newline at end of file +} + +public enum ExcelType { Xlsx, Csv } \ No newline at end of file diff --git a/tests/MiniExcelTests/Utils/Db.cs b/tests/MiniExcelTests/Utils/Db.cs index 38ab7b44..983b2339 100644 --- a/tests/MiniExcelTests/Utils/Db.cs +++ b/tests/MiniExcelTests/Utils/Db.cs @@ -1,7 +1,7 @@ using System.Data.SQLite; using System.Text; -namespace MiniExcelLibs.Tests.Utils; +namespace MiniExcelLib.Tests.Utils; internal static class Db { diff --git a/tests/MiniExcelTests/Utils/EpplusLicense.cs b/tests/MiniExcelTests/Utils/EpplusLicense.cs index fe0374e6..4b39459e 100644 --- a/tests/MiniExcelTests/Utils/EpplusLicense.cs +++ b/tests/MiniExcelTests/Utils/EpplusLicense.cs @@ -1,6 +1,6 @@ using OfficeOpenXml; -namespace MiniExcelLibs.Tests.Utils; +namespace MiniExcelLib.Tests.Utils; internal static class EpplusLicence { diff --git a/tests/MiniExcelTests/Utils/FileHelper.cs b/tests/MiniExcelTests/Utils/FileHelper.cs index 32fcd9eb..b0a7b122 100644 --- a/tests/MiniExcelTests/Utils/FileHelper.cs +++ b/tests/MiniExcelTests/Utils/FileHelper.cs @@ -1,4 +1,4 @@ -namespace MiniExcelLibs.Tests.Utils; +namespace MiniExcelLib.Tests.Utils; public static class FileHelper { diff --git a/tests/MiniExcelTests/Utils/Helpers.cs b/tests/MiniExcelTests/Utils/Helpers.cs index 40695ac7..f19903c4 100644 --- a/tests/MiniExcelTests/Utils/Helpers.cs +++ b/tests/MiniExcelTests/Utils/Helpers.cs @@ -4,7 +4,7 @@ using System.Xml.Linq; using System.Xml.XPath; -namespace MiniExcelLibs.Tests.Utils; +namespace MiniExcelLib.Tests.Utils; internal static class Helpers { diff --git a/tests/MiniExcelTests/Utils/PathHelper.cs b/tests/MiniExcelTests/Utils/PathHelper.cs index d09df59e..1edb6401 100644 --- a/tests/MiniExcelTests/Utils/PathHelper.cs +++ b/tests/MiniExcelTests/Utils/PathHelper.cs @@ -1,4 +1,4 @@ -namespace MiniExcelLibs.Tests.Utils; +namespace MiniExcelLib.Tests.Utils; internal static class PathHelper { From e6b2335bdcaabc811485fece6af655423b1411a0 Mon Sep 17 00:00:00 2001 From: Michele Bastione Date: Wed, 2 Jul 2025 00:04:04 +0200 Subject: [PATCH 02/26] Rebasing, fixing merge conflicts and updating workflows --- .github/workflows/benchmark.yml | 8 ++++---- src/{MiniExcel => MiniExcelLib.Core}/Enums/XlsxImgType.cs | 4 +--- .../OpenXml/Picture/OpenXmlPictureImplement.cs | 4 +++- .../SaveByTemplate/MiniExcelTemplateTests.cs | 5 ++++- 4 files changed, 12 insertions(+), 9 deletions(-) rename src/{MiniExcel => MiniExcelLib.Core}/Enums/XlsxImgType.cs (90%) diff --git a/.github/workflows/benchmark.yml b/.github/workflows/benchmark.yml index c61ab47a..2a9cedad 100644 --- a/.github/workflows/benchmark.yml +++ b/.github/workflows/benchmark.yml @@ -3,7 +3,7 @@ name: MiniExcel Benchmarks on: workflow_dispatch: release: - branches: [master] + branches: [master, v1.x-maintenance] types: [published] permissions: @@ -32,7 +32,7 @@ jobs: BenchmarkMode: Automatic BenchmarkSection: query - name: Renaming result file - run: mv MiniExcelLibs.Benchmarks.BenchmarkSections.QueryXlsxBenchmark-report-github.md query-benchmark.md + run: mv MiniExcelLib.Benchmarks.BenchmarkSections.QueryXlsxBenchmark-report-github.md query-benchmark.md working-directory: ./benchmarks/MiniExcel.Benchmarks/BenchmarkDotNet.Artifacts/results - name: Save benchmark results uses: actions/upload-artifact@v4 @@ -62,7 +62,7 @@ jobs: BenchmarkMode: Automatic BenchmarkSection: create - name: Renaming result file - run: mv MiniExcelLibs.Benchmarks.BenchmarkSections.CreateXlsxBenchmark-report-github.md create-benchmark.md + run: mv MiniExcelLib.Benchmarks.BenchmarkSections.CreateXlsxBenchmark-report-github.md create-benchmark.md working-directory: ./benchmarks/MiniExcel.Benchmarks/BenchmarkDotNet.Artifacts/results - name: Save benchmark results uses: actions/upload-artifact@v4 @@ -92,7 +92,7 @@ jobs: BenchmarkMode: Automatic BenchmarkSection: template - name: Renaming result file - run: mv MiniExcelLibs.Benchmarks.BenchmarkSections.TemplateXlsxBenchmark-report-github.md template-benchmark.md + run: mv MiniExcelLib.Benchmarks.BenchmarkSections.TemplateXlsxBenchmark-report-github.md template-benchmark.md working-directory: ./benchmarks/MiniExcel.Benchmarks/BenchmarkDotNet.Artifacts/results - name: Save benchmark results uses: actions/upload-artifact@v4 diff --git a/src/MiniExcel/Enums/XlsxImgType.cs b/src/MiniExcelLib.Core/Enums/XlsxImgType.cs similarity index 90% rename from src/MiniExcel/Enums/XlsxImgType.cs rename to src/MiniExcelLib.Core/Enums/XlsxImgType.cs index b10973a2..066ff335 100644 --- a/src/MiniExcel/Enums/XlsxImgType.cs +++ b/src/MiniExcelLib.Core/Enums/XlsxImgType.cs @@ -1,6 +1,4 @@ -using System; - -namespace MiniExcelLibs.Enums; +namespace MiniExcelLib.Core.Enums; /// /// Excel image display mode (whether the image aligns/scales with cells). diff --git a/src/MiniExcelLib.Core/OpenXml/Picture/OpenXmlPictureImplement.cs b/src/MiniExcelLib.Core/OpenXml/Picture/OpenXmlPictureImplement.cs index b94fe50f..55b325f2 100644 --- a/src/MiniExcelLib.Core/OpenXml/Picture/OpenXmlPictureImplement.cs +++ b/src/MiniExcelLib.Core/OpenXml/Picture/OpenXmlPictureImplement.cs @@ -138,6 +138,8 @@ public static async Task AddPictureAsync(Stream excelStream, CancellationToken c var row = image.RowNumber; var widthPx = image.WidthPx; var heightPx = image.HeightPx; + var imgtype = image.ImgType; + var location = image.Location; // Step 1: Add image to /xl/media/ var imageName = $"image{Guid.NewGuid():N}.png"; @@ -378,7 +380,7 @@ private static XmlDocument CreateDrawingXml(XmlDocument existingDoc, int col, in { return DrawingXmlHelper.CreateOrUpdateDrawingXml(existingDoc, col, row, widthPx, heightPx, relId); } - private static XmlDocument CreateDrawingXml(XmlDocument existingDoc, int col, int row, int widthPx, int heightPx, string relId,XlsxImgType imgtype,Point location) + private static XmlDocument CreateDrawingXml(XmlDocument existingDoc, int col, int row, int widthPx, int heightPx, string relId,XlsxImgType imgtype, Point location) { return DrawingXmlHelper.CreateOrUpdateDrawingXml(existingDoc, col, row, widthPx, heightPx, relId,imgtype, location); } diff --git a/tests/MiniExcelTests/SaveByTemplate/MiniExcelTemplateTests.cs b/tests/MiniExcelTests/SaveByTemplate/MiniExcelTemplateTests.cs index 46e2408c..a16abc52 100644 --- a/tests/MiniExcelTests/SaveByTemplate/MiniExcelTemplateTests.cs +++ b/tests/MiniExcelTests/SaveByTemplate/MiniExcelTemplateTests.cs @@ -1,8 +1,11 @@ using System.Data; +using System.IO.Compression; using Dapper; using MiniExcelLib.Core.Enums; using MiniExcelLib.Core.OpenXml.Picture; using MiniExcelLib.Tests.Utils; +using OfficeOpenXml; +using OfficeOpenXml.Drawing; using Importer = MiniExcelLib.MiniExcel.Importer; using Templater = MiniExcelLib.MiniExcel.Templater; using Xunit; @@ -58,7 +61,7 @@ public void TestImageType() }; // Act - MiniExcel.AddPicture(path.ToString(), pictures); + MiniExcel.Exporter.AddPictureXlsx(path.ToString(), pictures); // Assert using var zip = ZipFile.OpenRead(path.FilePath); From 08d76a052ef5cba50a60441982444ab790cc9db9 Mon Sep 17 00:00:00 2001 From: Michele Bastione Date: Thu, 3 Jul 2025 23:51:23 +0200 Subject: [PATCH 03/26] Made core and csv projects fully independent Moving importer, exporter and templater classes into core project and making them extensible, changing project names, fixing directory.build.props dependency warnings, turning solution file to slnx format, adding (basic) async implementation of MiniExcelDataReader --- MiniExcel.sln | 85 --- MiniExcel.slnx | 32 + .../BenchmarkSections/CreateXlsxBenchmark.cs | 14 +- .../BenchmarkSections/QueryXlsxBenchmark.cs | 9 +- .../TemplateXlsxBenchmark.cs | 10 +- .../BenchmarkSections/XlsxAsyncBenchmark.cs | 19 +- .../MiniExcel.Benchmarks.csproj | 2 +- src/Directory.Build.props | 7 +- .../Abstractions/IInputValueExtractor.cs | 0 .../Abstractions/IMiniExcelDataReader.cs | 0 .../Abstractions/IMiniExcelReader.cs | 0 .../Abstractions/IMiniExcelTemplate.cs | 0 .../Abstractions/IMiniExcelWriteAdapter.cs | 0 .../IMiniExcelWriteAdapterAsync.cs | 0 .../Abstractions/IMiniExcelWriter.cs | 0 .../Attributes/MiniExcelColumnAttribute.cs | 0 .../MiniExcelColumnIndexAttribute.cs | 0 .../MiniExcelColumnNameAttribute.cs | 0 .../MiniExcelColumnWidthAttribute.cs | 0 .../Attributes/MiniExcelFormatAttribute.cs | 0 .../Attributes/MiniExcelIgnoreAttribute.cs | 0 .../DataReader/MiniExcelAsyncDataReader.cs | 108 +++ .../DataReader/MiniExcelDataReader.cs | 3 + .../DataReader/MiniExcelDataReaderBase.cs | 0 .../Enums/XlsxImgType.cs | 0 .../MiniExcelColumnNotFoundException.cs | 0 .../MiniExcelInvalidCastException.cs | 0 .../Helpers/AttributeExtension.cs | 0 .../Helpers/ColumnHelper.cs | 0 .../Helpers/FileHelper.cs | 0 .../Helpers/ImageHelper.cs | 0 .../Helpers/ListHelper.cs | 0 .../Helpers/SafeStreamWriter.cs | 0 .../Helpers/StringHelper.cs | 0 .../Helpers/TaskHelper.cs | 0 .../Helpers/ThrowHelper.cs | 0 .../Helpers/TypeHelper.cs | 0 .../Helpers/XmlHelper.cs | 0 src/MiniExcel.Core/MiniExcel.Core.csproj | 11 + .../MiniExcelConfiguration.cs | 0 src/MiniExcel.Core/MiniExcelExporter.cs | 75 +++ src/MiniExcel.Core/MiniExcelImporter.cs | 337 ++++++++++ src/MiniExcel.Core/MiniExcelTemplater.cs | 75 +++ .../OpenXml/Attributes/ExcelSheetAttribute.cs | 0 .../OpenXml/Constants/ExcelContentTypes.cs | 0 .../OpenXml/Constants/ExcelFileNames.cs | 0 .../OpenXml/Constants/ExcelXml.cs | 0 .../OpenXml/Constants/Schemas.cs | 0 .../OpenXml/Constants/WorksheetXml.cs | 0 .../OpenXml/Models/DrawingDto.cs | 0 .../OpenXml/Models/ExcelRange.cs | 0 .../OpenXml/Models/ExcelWidthCollection.cs | 0 .../OpenXml/Models/ExcellSheetInfo.cs | 0 .../OpenXml/Models/FileDto.cs | 0 .../OpenXml/Models/MergeCells.cs | 0 .../OpenXml/Models/SheetDto.cs | 0 .../OpenXml/Models/SheetInfo.cs | 0 .../OpenXml/Models/SheetRecord.cs | 0 .../OpenXml/OpenXmlConfiguration.cs | 0 .../OpenXml/OpenXmlReader.cs | 0 .../OpenXml/OpenXmlStyleOptions.cs | 0 .../OpenXml/OpenXmlStyles.cs | 0 .../OpenXml/OpenXmlWriter.DefaultOpenXml.cs | 0 .../OpenXml/OpenXmlWriter.cs | 0 .../OpenXml/Picture/OpenXmlPicture.cs | 0 .../Picture/OpenXmlPictureImplement.cs | 0 .../Styles/DefaultSheetStyleBuilder.cs | 0 .../OpenXml/Styles/ISheetStyleBuilder.cs | 0 .../Styles/MinimalSheetStyleBuilder.cs | 0 .../OpenXml/Styles/SheetStyleBuildContext.cs | 0 .../OpenXml/Styles/SheetStyleBuildResult.cs | 0 .../OpenXml/Styles/SheetStyleBuilderBase.cs | 0 .../OpenXml/Styles/SheetStyleBuilderHelper.cs | 0 .../OpenXml/Styles/SheetStyleElementInfos.cs | 0 .../OpenXml/Templates/OpenXmlTemplate.Impl.cs | 0 .../Templates/OpenXmlTemplate.MergeCells.cs | 0 .../OpenXml/Templates/OpenXmlTemplate.cs | 0 .../Templates/OpenXmlValueExtractor.cs | 0 .../OpenXml/Utils/CalcChainHelper.cs | 0 .../OpenXml/Utils/DateTimeHelper.cs | 0 .../OpenXml/Utils/GeneralHelper.cs | 0 .../OpenXml/Utils/MiniExcelPropertyHelper.cs | 0 .../Utils/OpenXmlNumberFormatHelper.cs | 0 .../OpenXml/Utils/ReferenceHelper.cs | 0 .../OpenXml/Utils/SharedStringsDiskCache.cs | 0 .../OpenXml/Utils/XmlReaderHelper.cs | 0 .../OpenXml/Zip/MiniExcelZipArchive.cs | 0 .../OpenXml/Zip/OpenXmlZip.cs | 0 .../OpenXml/Zip/ZipPackageInfo.cs | 0 .../Properties/AssemblyInfo.cs | 0 .../Reflection/CustomPropertyHelper.cs | 0 .../Reflection/MemberGetter.cs | 0 .../Reflection/MemberSetter.cs | 0 .../Reflection/MiniExcelColumnInfo.cs | 0 .../Reflection/MiniExcelMapper.cs | 0 .../Reflection/MiniExcelProperty.cs | 0 .../AsyncEnumerableWriteAdapter.cs | 0 .../WriteAdapters/DataReaderWriteAdapter.cs | 0 .../WriteAdapters/DataTableWriteAdapter.cs | 0 .../WriteAdapters/EnumerableWriteAdapter.cs | 0 .../MiniExcelDataReaderWriteAdapter.cs | 0 .../MiniExcelWriteAdapterFactory.cs | 0 .../icon.png | Bin .../miniexcel.publickey | Bin .../CsvConfiguration.cs | 0 .../CsvHelper.cs | 0 .../CsvReader.cs | 0 .../CsvWriter.cs | 0 src/MiniExcel.Csv/MiniExcel.Csv.csproj | 11 + .../MiniExcelExtensions/Exporter.cs | 91 +++ .../MiniExcelExtensions/Importer.cs | 212 ++++++ .../Exporter/MiniExcelExporter.Csv.cs | 93 --- .../Exporter/MiniExcelExporter.OpenXml.cs | 78 --- .../Importer/MiniExcelImporter.Csv.cs | 180 ----- .../Importer/MiniExcelImporter.OpenXml.cs | 305 --------- src/MiniExcel/MiniExcel.cs | 29 +- src/MiniExcel/MiniExcel.csproj | 6 +- .../Templater/MiniExcelTemplater.OpenXml.cs | 70 -- .../MiniExcelLib.Core.csproj | 12 - src/MiniExcelLib.Csv/MiniExcelLib.Csv.csproj | 15 - .../MiniExcelAutoAdjustWidthTests.cs | 20 +- tests/MiniExcelTests/MiniExcelCsvAsycTests.cs | 53 +- tests/MiniExcelTests/MiniExcelCsvTests.cs | 61 +- .../MiniExcelIssueAsyncTests.cs | 251 +++---- tests/MiniExcelTests/MiniExcelIssueTests.cs | 623 +++++++++--------- .../MiniExcelOpenXmlAsyncTests.cs | 212 +++--- .../MiniExcelOpenXmlConfigurationTest.cs | 11 +- ...MiniExcelOpenXmlMultipleSheetAsyncTests.cs | 34 +- .../MiniExcelOpenXmlMultipleSheetTests.cs | 65 +- tests/MiniExcelTests/MiniExcelOpenXmlTests.cs | 226 +++---- tests/MiniExcelTests/MiniExcelTests.csproj | 4 +- .../MiniExcelTemplateAsyncTests.cs | 92 +-- .../SaveByTemplate/MiniExcelTemplateTests.cs | 90 +-- 133 files changed, 1891 insertions(+), 1740 deletions(-) delete mode 100644 MiniExcel.sln create mode 100644 MiniExcel.slnx rename src/{MiniExcelLib.Core => MiniExcel.Core}/Abstractions/IInputValueExtractor.cs (100%) rename src/{MiniExcelLib.Core => MiniExcel.Core}/Abstractions/IMiniExcelDataReader.cs (100%) rename src/{MiniExcelLib.Core => MiniExcel.Core}/Abstractions/IMiniExcelReader.cs (100%) rename src/{MiniExcelLib.Core => MiniExcel.Core}/Abstractions/IMiniExcelTemplate.cs (100%) rename src/{MiniExcelLib.Core => MiniExcel.Core}/Abstractions/IMiniExcelWriteAdapter.cs (100%) rename src/{MiniExcelLib.Core => MiniExcel.Core}/Abstractions/IMiniExcelWriteAdapterAsync.cs (100%) rename src/{MiniExcelLib.Core => MiniExcel.Core}/Abstractions/IMiniExcelWriter.cs (100%) rename src/{MiniExcelLib.Core => MiniExcel.Core}/Attributes/MiniExcelColumnAttribute.cs (100%) rename src/{MiniExcelLib.Core => MiniExcel.Core}/Attributes/MiniExcelColumnIndexAttribute.cs (100%) rename src/{MiniExcelLib.Core => MiniExcel.Core}/Attributes/MiniExcelColumnNameAttribute.cs (100%) rename src/{MiniExcelLib.Core => MiniExcel.Core}/Attributes/MiniExcelColumnWidthAttribute.cs (100%) rename src/{MiniExcelLib.Core => MiniExcel.Core}/Attributes/MiniExcelFormatAttribute.cs (100%) rename src/{MiniExcelLib.Core => MiniExcel.Core}/Attributes/MiniExcelIgnoreAttribute.cs (100%) create mode 100644 src/MiniExcel.Core/DataReader/MiniExcelAsyncDataReader.cs rename src/{MiniExcelLib.Core => MiniExcel.Core}/DataReader/MiniExcelDataReader.cs (95%) rename src/{MiniExcelLib.Core => MiniExcel.Core}/DataReader/MiniExcelDataReaderBase.cs (100%) rename src/{MiniExcelLib.Core => MiniExcel.Core}/Enums/XlsxImgType.cs (100%) rename src/{MiniExcelLib.Core => MiniExcel.Core}/Exceptions/MiniExcelColumnNotFoundException.cs (100%) rename src/{MiniExcelLib.Core => MiniExcel.Core}/Exceptions/MiniExcelInvalidCastException.cs (100%) rename src/{MiniExcelLib.Core => MiniExcel.Core}/Helpers/AttributeExtension.cs (100%) rename src/{MiniExcelLib.Core => MiniExcel.Core}/Helpers/ColumnHelper.cs (100%) rename src/{MiniExcelLib.Core => MiniExcel.Core}/Helpers/FileHelper.cs (100%) rename src/{MiniExcelLib.Core => MiniExcel.Core}/Helpers/ImageHelper.cs (100%) rename src/{MiniExcelLib.Core => MiniExcel.Core}/Helpers/ListHelper.cs (100%) rename src/{MiniExcelLib.Core => MiniExcel.Core}/Helpers/SafeStreamWriter.cs (100%) rename src/{MiniExcelLib.Core => MiniExcel.Core}/Helpers/StringHelper.cs (100%) rename src/{MiniExcelLib.Core => MiniExcel.Core}/Helpers/TaskHelper.cs (100%) rename src/{MiniExcelLib.Core => MiniExcel.Core}/Helpers/ThrowHelper.cs (100%) rename src/{MiniExcelLib.Core => MiniExcel.Core}/Helpers/TypeHelper.cs (100%) rename src/{MiniExcelLib.Core => MiniExcel.Core}/Helpers/XmlHelper.cs (100%) create mode 100644 src/MiniExcel.Core/MiniExcel.Core.csproj rename src/{MiniExcelLib.Core => MiniExcel.Core}/MiniExcelConfiguration.cs (100%) create mode 100644 src/MiniExcel.Core/MiniExcelExporter.cs create mode 100644 src/MiniExcel.Core/MiniExcelImporter.cs create mode 100644 src/MiniExcel.Core/MiniExcelTemplater.cs rename src/{MiniExcelLib.Core => MiniExcel.Core}/OpenXml/Attributes/ExcelSheetAttribute.cs (100%) rename src/{MiniExcelLib.Core => MiniExcel.Core}/OpenXml/Constants/ExcelContentTypes.cs (100%) rename src/{MiniExcelLib.Core => MiniExcel.Core}/OpenXml/Constants/ExcelFileNames.cs (100%) rename src/{MiniExcelLib.Core => MiniExcel.Core}/OpenXml/Constants/ExcelXml.cs (100%) rename src/{MiniExcelLib.Core => MiniExcel.Core}/OpenXml/Constants/Schemas.cs (100%) rename src/{MiniExcelLib.Core => MiniExcel.Core}/OpenXml/Constants/WorksheetXml.cs (100%) rename src/{MiniExcelLib.Core => MiniExcel.Core}/OpenXml/Models/DrawingDto.cs (100%) rename src/{MiniExcelLib.Core => MiniExcel.Core}/OpenXml/Models/ExcelRange.cs (100%) rename src/{MiniExcelLib.Core => MiniExcel.Core}/OpenXml/Models/ExcelWidthCollection.cs (100%) rename src/{MiniExcelLib.Core => MiniExcel.Core}/OpenXml/Models/ExcellSheetInfo.cs (100%) rename src/{MiniExcelLib.Core => MiniExcel.Core}/OpenXml/Models/FileDto.cs (100%) rename src/{MiniExcelLib.Core => MiniExcel.Core}/OpenXml/Models/MergeCells.cs (100%) rename src/{MiniExcelLib.Core => MiniExcel.Core}/OpenXml/Models/SheetDto.cs (100%) rename src/{MiniExcelLib.Core => MiniExcel.Core}/OpenXml/Models/SheetInfo.cs (100%) rename src/{MiniExcelLib.Core => MiniExcel.Core}/OpenXml/Models/SheetRecord.cs (100%) rename src/{MiniExcelLib.Core => MiniExcel.Core}/OpenXml/OpenXmlConfiguration.cs (100%) rename src/{MiniExcelLib.Core => MiniExcel.Core}/OpenXml/OpenXmlReader.cs (100%) rename src/{MiniExcelLib.Core => MiniExcel.Core}/OpenXml/OpenXmlStyleOptions.cs (100%) rename src/{MiniExcelLib.Core => MiniExcel.Core}/OpenXml/OpenXmlStyles.cs (100%) rename src/{MiniExcelLib.Core => MiniExcel.Core}/OpenXml/OpenXmlWriter.DefaultOpenXml.cs (100%) rename src/{MiniExcelLib.Core => MiniExcel.Core}/OpenXml/OpenXmlWriter.cs (100%) rename src/{MiniExcelLib.Core => MiniExcel.Core}/OpenXml/Picture/OpenXmlPicture.cs (100%) rename src/{MiniExcelLib.Core => MiniExcel.Core}/OpenXml/Picture/OpenXmlPictureImplement.cs (100%) rename src/{MiniExcelLib.Core => MiniExcel.Core}/OpenXml/Styles/DefaultSheetStyleBuilder.cs (100%) rename src/{MiniExcelLib.Core => MiniExcel.Core}/OpenXml/Styles/ISheetStyleBuilder.cs (100%) rename src/{MiniExcelLib.Core => MiniExcel.Core}/OpenXml/Styles/MinimalSheetStyleBuilder.cs (100%) rename src/{MiniExcelLib.Core => MiniExcel.Core}/OpenXml/Styles/SheetStyleBuildContext.cs (100%) rename src/{MiniExcelLib.Core => MiniExcel.Core}/OpenXml/Styles/SheetStyleBuildResult.cs (100%) rename src/{MiniExcelLib.Core => MiniExcel.Core}/OpenXml/Styles/SheetStyleBuilderBase.cs (100%) rename src/{MiniExcelLib.Core => MiniExcel.Core}/OpenXml/Styles/SheetStyleBuilderHelper.cs (100%) rename src/{MiniExcelLib.Core => MiniExcel.Core}/OpenXml/Styles/SheetStyleElementInfos.cs (100%) rename src/{MiniExcelLib.Core => MiniExcel.Core}/OpenXml/Templates/OpenXmlTemplate.Impl.cs (100%) rename src/{MiniExcelLib.Core => MiniExcel.Core}/OpenXml/Templates/OpenXmlTemplate.MergeCells.cs (100%) rename src/{MiniExcelLib.Core => MiniExcel.Core}/OpenXml/Templates/OpenXmlTemplate.cs (100%) rename src/{MiniExcelLib.Core => MiniExcel.Core}/OpenXml/Templates/OpenXmlValueExtractor.cs (100%) rename src/{MiniExcelLib.Core => MiniExcel.Core}/OpenXml/Utils/CalcChainHelper.cs (100%) rename src/{MiniExcelLib.Core => MiniExcel.Core}/OpenXml/Utils/DateTimeHelper.cs (100%) rename src/{MiniExcelLib.Core => MiniExcel.Core}/OpenXml/Utils/GeneralHelper.cs (100%) rename src/{MiniExcelLib.Core => MiniExcel.Core}/OpenXml/Utils/MiniExcelPropertyHelper.cs (100%) rename src/{MiniExcelLib.Core => MiniExcel.Core}/OpenXml/Utils/OpenXmlNumberFormatHelper.cs (100%) rename src/{MiniExcelLib.Core => MiniExcel.Core}/OpenXml/Utils/ReferenceHelper.cs (100%) rename src/{MiniExcelLib.Core => MiniExcel.Core}/OpenXml/Utils/SharedStringsDiskCache.cs (100%) rename src/{MiniExcelLib.Core => MiniExcel.Core}/OpenXml/Utils/XmlReaderHelper.cs (100%) rename src/{MiniExcelLib.Core => MiniExcel.Core}/OpenXml/Zip/MiniExcelZipArchive.cs (100%) rename src/{MiniExcelLib.Core => MiniExcel.Core}/OpenXml/Zip/OpenXmlZip.cs (100%) rename src/{MiniExcelLib.Core => MiniExcel.Core}/OpenXml/Zip/ZipPackageInfo.cs (100%) rename src/{MiniExcelLib.Core => MiniExcel.Core}/Properties/AssemblyInfo.cs (100%) rename src/{MiniExcelLib.Core => MiniExcel.Core}/Reflection/CustomPropertyHelper.cs (100%) rename src/{MiniExcelLib.Core => MiniExcel.Core}/Reflection/MemberGetter.cs (100%) rename src/{MiniExcelLib.Core => MiniExcel.Core}/Reflection/MemberSetter.cs (100%) rename src/{MiniExcelLib.Core => MiniExcel.Core}/Reflection/MiniExcelColumnInfo.cs (100%) rename src/{MiniExcelLib.Core => MiniExcel.Core}/Reflection/MiniExcelMapper.cs (100%) rename src/{MiniExcelLib.Core => MiniExcel.Core}/Reflection/MiniExcelProperty.cs (100%) rename src/{MiniExcelLib.Core => MiniExcel.Core}/WriteAdapters/AsyncEnumerableWriteAdapter.cs (100%) rename src/{MiniExcelLib.Core => MiniExcel.Core}/WriteAdapters/DataReaderWriteAdapter.cs (100%) rename src/{MiniExcelLib.Core => MiniExcel.Core}/WriteAdapters/DataTableWriteAdapter.cs (100%) rename src/{MiniExcelLib.Core => MiniExcel.Core}/WriteAdapters/EnumerableWriteAdapter.cs (100%) rename src/{MiniExcelLib.Core => MiniExcel.Core}/WriteAdapters/MiniExcelDataReaderWriteAdapter.cs (100%) rename src/{MiniExcelLib.Core => MiniExcel.Core}/WriteAdapters/MiniExcelWriteAdapterFactory.cs (100%) rename src/{MiniExcelLib.Core => MiniExcel.Core}/icon.png (100%) rename src/{MiniExcelLib.Core => MiniExcel.Core}/miniexcel.publickey (100%) rename src/{MiniExcelLib.Csv => MiniExcel.Csv}/CsvConfiguration.cs (100%) rename src/{MiniExcelLib.Csv => MiniExcel.Csv}/CsvHelper.cs (100%) rename src/{MiniExcelLib.Csv => MiniExcel.Csv}/CsvReader.cs (100%) rename src/{MiniExcelLib.Csv => MiniExcel.Csv}/CsvWriter.cs (100%) create mode 100644 src/MiniExcel.Csv/MiniExcel.Csv.csproj create mode 100644 src/MiniExcel.Csv/MiniExcelExtensions/Exporter.cs create mode 100644 src/MiniExcel.Csv/MiniExcelExtensions/Importer.cs delete mode 100644 src/MiniExcel/Exporter/MiniExcelExporter.Csv.cs delete mode 100644 src/MiniExcel/Exporter/MiniExcelExporter.OpenXml.cs delete mode 100644 src/MiniExcel/Importer/MiniExcelImporter.Csv.cs delete mode 100644 src/MiniExcel/Importer/MiniExcelImporter.OpenXml.cs delete mode 100644 src/MiniExcel/Templater/MiniExcelTemplater.OpenXml.cs delete mode 100644 src/MiniExcelLib.Core/MiniExcelLib.Core.csproj delete mode 100644 src/MiniExcelLib.Csv/MiniExcelLib.Csv.csproj diff --git a/MiniExcel.sln b/MiniExcel.sln deleted file mode 100644 index 7541336a..00000000 --- a/MiniExcel.sln +++ /dev/null @@ -1,85 +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}") = "MiniExcelLib.Core", "src\MiniExcelLib.Core\MiniExcelLib.Core.csproj", "{097903C9-1F81-4427-B4C8-530CB59687B8}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MiniExcelLib.Csv", "src\MiniExcelLib.Csv\MiniExcelLib.Csv.csproj", "{0B0C3A11-BA5A-457F-BCBE-3001CEAF9FB6}" -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 - docs\core_logic_diagram.drawio = docs\core_logic_diagram.drawio - 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 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MiniExcel", "src\MiniExcel\MiniExcel.csproj", "{BF42A3A5-6C2D-4C20-9494-450B9605CA6F}" -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 - {0B0C3A11-BA5A-457F-BCBE-3001CEAF9FB6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {0B0C3A11-BA5A-457F-BCBE-3001CEAF9FB6}.Debug|Any CPU.Build.0 = Debug|Any CPU - {0B0C3A11-BA5A-457F-BCBE-3001CEAF9FB6}.Release|Any CPU.ActiveCfg = Release|Any CPU - {0B0C3A11-BA5A-457F-BCBE-3001CEAF9FB6}.Release|Any CPU.Build.0 = Release|Any CPU - {BF42A3A5-6C2D-4C20-9494-450B9605CA6F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {BF42A3A5-6C2D-4C20-9494-450B9605CA6F}.Debug|Any CPU.Build.0 = Debug|Any CPU - {BF42A3A5-6C2D-4C20-9494-450B9605CA6F}.Release|Any CPU.ActiveCfg = Release|Any CPU - {BF42A3A5-6C2D-4C20-9494-450B9605CA6F}.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} - {0B0C3A11-BA5A-457F-BCBE-3001CEAF9FB6} = {CC1E0601-AEC9-42D7-8F6A-3FB3939EED16} - {BF42A3A5-6C2D-4C20-9494-450B9605CA6F} = {CC1E0601-AEC9-42D7-8F6A-3FB3939EED16} - 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..9a3685e4 --- /dev/null +++ b/MiniExcel.slnx @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/CreateXlsxBenchmark.cs b/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/CreateXlsxBenchmark.cs index 54232b19..0b425777 100644 --- a/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/CreateXlsxBenchmark.cs +++ b/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/CreateXlsxBenchmark.cs @@ -5,26 +5,29 @@ using DocumentFormat.OpenXml.Packaging; using DocumentFormat.OpenXml.Spreadsheet; using MiniExcelLib.Benchmarks.Utils; +using MiniExcelLib.Core; using NPOI.XSSF.UserModel; using OfficeOpenXml; -using Exporter = MiniExcelLib.MiniExcel.Exporter; namespace MiniExcelLib.Benchmarks.BenchmarkSections; public class CreateXlsxBenchmark : BenchmarkBase { + private MiniExcelExporter _exporter; + [GlobalSetup] public void SetUp() { ExcelPackage.LicenseContext = LicenseContext.NonCommercial; Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); + _exporter = new MiniExcelExporter(); } [Benchmark(Description = "MiniExcel Create Xlsx")] public void MiniExcelCreateTest() { using var path = AutoDeletingPath.Create(); - Exporter.ExportXlsx(path.FilePath, GetValue()); + _exporter.ExportXlsx(path.FilePath, GetValue()); } [Benchmark(Description = "ClosedXml Create Xlsx")] @@ -73,10 +76,9 @@ public void NPOICreateTest() row.CreateCell(9).SetCellValue(item.Column10); i++; } - using (var fs = File.Create(path.FilePath)) - { - wb.Write(fs); - } + + using var fs = File.Create(path.FilePath); + wb.Write(fs); } [Benchmark(Description = "OpenXmlSdk Create Xlsx by DOM mode")] diff --git a/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/QueryXlsxBenchmark.cs b/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/QueryXlsxBenchmark.cs index 413d92a6..e834c31a 100644 --- a/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/QueryXlsxBenchmark.cs +++ b/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/QueryXlsxBenchmark.cs @@ -4,31 +4,34 @@ using DocumentFormat.OpenXml.Packaging; using DocumentFormat.OpenXml.Spreadsheet; using ExcelDataReader; +using MiniExcelLib.Core; using NPOI.XSSF.UserModel; using OfficeOpenXml; -using Importer = MiniExcelLib.MiniExcel.Importer; namespace MiniExcelLib.Benchmarks.BenchmarkSections; public class QueryXlsxBenchmark : BenchmarkBase { + private MiniExcelImporter _importer; + [GlobalSetup] public void SetUp() { ExcelPackage.LicenseContext = LicenseContext.NonCommercial; Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); + _importer = new MiniExcelImporter(); } [Benchmark(Description = "MiniExcel QueryFirst")] public void MiniExcel_QueryFirst_Test() { - _ = Importer.QueryXlsx(FilePath).First(); + _ = _importer.QueryXlsx(FilePath).First(); } [Benchmark(Description = "MiniExcel Query")] public void MiniExcel_Query() { - foreach (var _ in Importer.QueryXlsx(FilePath)) { } + foreach (var _ in _importer.QueryXlsx(FilePath)) { } } [Benchmark(Description = "ExcelDataReader QueryFirst")] diff --git a/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/TemplateXlsxBenchmark.cs b/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/TemplateXlsxBenchmark.cs index c60e4cd6..d8755933 100644 --- a/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/TemplateXlsxBenchmark.cs +++ b/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/TemplateXlsxBenchmark.cs @@ -1,12 +1,20 @@ using BenchmarkDotNet.Attributes; using ClosedXML.Report; using MiniExcelLib.Benchmarks.Utils; -using _templater = MiniExcelLib.MiniExcel.Templater; +using MiniExcelLib.Core; namespace MiniExcelLib.Benchmarks.BenchmarkSections; public class TemplateXlsxBenchmark : BenchmarkBase { + private MiniExcelTemplater _templater; + + [GlobalSetup] + public void Setup() + { + _templater = new MiniExcelTemplater(); + } + [Benchmark(Description = "MiniExcel Template Generate")] public void MiniExcel_Template_Generate_Test() { diff --git a/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/XlsxAsyncBenchmark.cs b/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/XlsxAsyncBenchmark.cs index 33d75d33..ab026ef6 100644 --- a/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/XlsxAsyncBenchmark.cs +++ b/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/XlsxAsyncBenchmark.cs @@ -1,19 +1,28 @@ using BenchmarkDotNet.Attributes; using MiniExcelLib.Benchmarks.Utils; -using Exporter = MiniExcelLib.MiniExcel.Exporter; -using Templater = MiniExcelLib.MiniExcel.Templater; +using MiniExcelLib.Core; namespace MiniExcelLib.Benchmarks.BenchmarkSections; public class XlsxAsyncBenchmark : BenchmarkBase { + private MiniExcelExporter _exporter; + private MiniExcelTemplater _templater; + + [GlobalSetup] + public void Setup() + { + _exporter = new MiniExcelExporter(); + _templater = new MiniExcelTemplater(); + } + [Benchmark(Description = "MiniExcel Create Xlsx Async")] public async Task MiniExcelCreateAsyncTest() { using var path = AutoDeletingPath.Create(); - using var stream = File.Create(path.FilePath); + await using var stream = File.Create(path.FilePath); - await Exporter.ExportXlsxAsync(stream, GetValue()); + await _exporter.ExportXlsxAsync(stream, GetValue()); } [Benchmark(Description = "MiniExcel Generate Template Async")] @@ -32,6 +41,6 @@ public async Task MiniExcel_Template_Generate_Async_Test() }) }; - await Templater.ApplyXlsxTemplateAsync(path.FilePath, templatePath, value); + await _templater.ApplyXlsxTemplateAsync(path.FilePath, templatePath, value); } } diff --git a/benchmarks/MiniExcel.Benchmarks/MiniExcel.Benchmarks.csproj b/benchmarks/MiniExcel.Benchmarks/MiniExcel.Benchmarks.csproj index 3c5b0adc..eb8f5230 100644 --- a/benchmarks/MiniExcel.Benchmarks/MiniExcel.Benchmarks.csproj +++ b/benchmarks/MiniExcel.Benchmarks/MiniExcel.Benchmarks.csproj @@ -35,7 +35,7 @@ - + diff --git a/src/Directory.Build.props b/src/Directory.Build.props index 248593f1..aeea3ecb 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -7,6 +7,11 @@ enable 13 + + + True + ..\miniexcel.snk + @@ -15,7 +20,7 @@ - + diff --git a/src/MiniExcelLib.Core/Abstractions/IInputValueExtractor.cs b/src/MiniExcel.Core/Abstractions/IInputValueExtractor.cs similarity index 100% rename from src/MiniExcelLib.Core/Abstractions/IInputValueExtractor.cs rename to src/MiniExcel.Core/Abstractions/IInputValueExtractor.cs diff --git a/src/MiniExcelLib.Core/Abstractions/IMiniExcelDataReader.cs b/src/MiniExcel.Core/Abstractions/IMiniExcelDataReader.cs similarity index 100% rename from src/MiniExcelLib.Core/Abstractions/IMiniExcelDataReader.cs rename to src/MiniExcel.Core/Abstractions/IMiniExcelDataReader.cs diff --git a/src/MiniExcelLib.Core/Abstractions/IMiniExcelReader.cs b/src/MiniExcel.Core/Abstractions/IMiniExcelReader.cs similarity index 100% rename from src/MiniExcelLib.Core/Abstractions/IMiniExcelReader.cs rename to src/MiniExcel.Core/Abstractions/IMiniExcelReader.cs diff --git a/src/MiniExcelLib.Core/Abstractions/IMiniExcelTemplate.cs b/src/MiniExcel.Core/Abstractions/IMiniExcelTemplate.cs similarity index 100% rename from src/MiniExcelLib.Core/Abstractions/IMiniExcelTemplate.cs rename to src/MiniExcel.Core/Abstractions/IMiniExcelTemplate.cs diff --git a/src/MiniExcelLib.Core/Abstractions/IMiniExcelWriteAdapter.cs b/src/MiniExcel.Core/Abstractions/IMiniExcelWriteAdapter.cs similarity index 100% rename from src/MiniExcelLib.Core/Abstractions/IMiniExcelWriteAdapter.cs rename to src/MiniExcel.Core/Abstractions/IMiniExcelWriteAdapter.cs diff --git a/src/MiniExcelLib.Core/Abstractions/IMiniExcelWriteAdapterAsync.cs b/src/MiniExcel.Core/Abstractions/IMiniExcelWriteAdapterAsync.cs similarity index 100% rename from src/MiniExcelLib.Core/Abstractions/IMiniExcelWriteAdapterAsync.cs rename to src/MiniExcel.Core/Abstractions/IMiniExcelWriteAdapterAsync.cs diff --git a/src/MiniExcelLib.Core/Abstractions/IMiniExcelWriter.cs b/src/MiniExcel.Core/Abstractions/IMiniExcelWriter.cs similarity index 100% rename from src/MiniExcelLib.Core/Abstractions/IMiniExcelWriter.cs rename to src/MiniExcel.Core/Abstractions/IMiniExcelWriter.cs diff --git a/src/MiniExcelLib.Core/Attributes/MiniExcelColumnAttribute.cs b/src/MiniExcel.Core/Attributes/MiniExcelColumnAttribute.cs similarity index 100% rename from src/MiniExcelLib.Core/Attributes/MiniExcelColumnAttribute.cs rename to src/MiniExcel.Core/Attributes/MiniExcelColumnAttribute.cs diff --git a/src/MiniExcelLib.Core/Attributes/MiniExcelColumnIndexAttribute.cs b/src/MiniExcel.Core/Attributes/MiniExcelColumnIndexAttribute.cs similarity index 100% rename from src/MiniExcelLib.Core/Attributes/MiniExcelColumnIndexAttribute.cs rename to src/MiniExcel.Core/Attributes/MiniExcelColumnIndexAttribute.cs diff --git a/src/MiniExcelLib.Core/Attributes/MiniExcelColumnNameAttribute.cs b/src/MiniExcel.Core/Attributes/MiniExcelColumnNameAttribute.cs similarity index 100% rename from src/MiniExcelLib.Core/Attributes/MiniExcelColumnNameAttribute.cs rename to src/MiniExcel.Core/Attributes/MiniExcelColumnNameAttribute.cs diff --git a/src/MiniExcelLib.Core/Attributes/MiniExcelColumnWidthAttribute.cs b/src/MiniExcel.Core/Attributes/MiniExcelColumnWidthAttribute.cs similarity index 100% rename from src/MiniExcelLib.Core/Attributes/MiniExcelColumnWidthAttribute.cs rename to src/MiniExcel.Core/Attributes/MiniExcelColumnWidthAttribute.cs diff --git a/src/MiniExcelLib.Core/Attributes/MiniExcelFormatAttribute.cs b/src/MiniExcel.Core/Attributes/MiniExcelFormatAttribute.cs similarity index 100% rename from src/MiniExcelLib.Core/Attributes/MiniExcelFormatAttribute.cs rename to src/MiniExcel.Core/Attributes/MiniExcelFormatAttribute.cs diff --git a/src/MiniExcelLib.Core/Attributes/MiniExcelIgnoreAttribute.cs b/src/MiniExcel.Core/Attributes/MiniExcelIgnoreAttribute.cs similarity index 100% rename from src/MiniExcelLib.Core/Attributes/MiniExcelIgnoreAttribute.cs rename to src/MiniExcel.Core/Attributes/MiniExcelIgnoreAttribute.cs diff --git a/src/MiniExcel.Core/DataReader/MiniExcelAsyncDataReader.cs b/src/MiniExcel.Core/DataReader/MiniExcelAsyncDataReader.cs new file mode 100644 index 00000000..bd70ce33 --- /dev/null +++ b/src/MiniExcel.Core/DataReader/MiniExcelAsyncDataReader.cs @@ -0,0 +1,108 @@ +namespace MiniExcelLib.Core.DataReader; + +// todo: this is way improvable, let's try to merge the sync and async implementations +public class MiniExcelAsyncDataReader : MiniExcelDataReaderBase, IAsyncDisposable +{ + private readonly IAsyncEnumerator> _source; + + private readonly Stream _stream; + private List _keys; + private int _fieldCount; + + private bool _isFirst = true; + private bool _disposed = false; + + /// + /// Initializes a new instance of the class. + /// + + internal MiniExcelAsyncDataReader(Stream? stream, IAsyncEnumerable> values) + { + _stream = stream ?? throw new ArgumentNullException(nameof(stream)); + _source = values.GetAsyncEnumerator(); + } + + public static async Task CreateAsync(Stream? stream, IAsyncEnumerable> values) + { + var reader = new MiniExcelAsyncDataReader(stream, values); + if (await reader._source.MoveNextAsync().ConfigureAwait(false)) + { + reader._keys = reader._source.Current?.Keys.ToList() ?? []; + reader._fieldCount = reader._keys.Count; + } + return reader; + } + + + /// + public override object? GetValue(int i) + { + if (_source.Current is null) + throw new InvalidOperationException("No current row available."); + + return _source.Current[_keys[i]]; + } + + /// + public override int FieldCount => _fieldCount; + + /// + /// This method will throw a NotSupportedException. Please use ReadAsync or the synchronous MiniExcelDataReader implementation. + /// + public override bool Read() => throw new NotSupportedException("Use the ReadAsync method instead."); + + public override async Task ReadAsync(CancellationToken cancellationToken = default) + { + if (_isFirst) + { + _isFirst = false; + return await Task.FromResult(true).ConfigureAwait(false); + } + + return await _source.MoveNextAsync().ConfigureAwait(false); + } + + /// + public override string GetName(int i) + { + return _keys[i]; + } + + /// + public override int GetOrdinal(string name) + { + return _keys.IndexOf(name); + } + + /// + protected override void Dispose(bool disposing) + { + if (!_disposed) + { + if (disposing) + { + _stream?.Dispose(); + _source.DisposeAsync().GetAwaiter().GetResult(); + } + _disposed = true; + } + base.Dispose(disposing); + } + + /// + /// Disposes the object. + /// + public new void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + public async ValueTask DisposeAsync() + { + _stream?.Dispose(); + await _source.DisposeAsync().ConfigureAwait(false); + + GC.SuppressFinalize(this); + } +} \ No newline at end of file diff --git a/src/MiniExcelLib.Core/DataReader/MiniExcelDataReader.cs b/src/MiniExcel.Core/DataReader/MiniExcelDataReader.cs similarity index 95% rename from src/MiniExcelLib.Core/DataReader/MiniExcelDataReader.cs rename to src/MiniExcel.Core/DataReader/MiniExcelDataReader.cs index 89107d5d..df1d14e0 100644 --- a/src/MiniExcelLib.Core/DataReader/MiniExcelDataReader.cs +++ b/src/MiniExcel.Core/DataReader/MiniExcelDataReader.cs @@ -3,6 +3,7 @@ public class MiniExcelDataReader : MiniExcelDataReaderBase { private readonly IEnumerator> _source; + private readonly Stream _stream; private readonly List _keys; private readonly int _fieldCount; @@ -27,6 +28,7 @@ internal MiniExcelDataReader(Stream? stream, IEnumerable> values) => new(stream, values); + /// public override object? GetValue(int i) { @@ -50,6 +52,7 @@ public override bool Read() _isFirst = false; return true; } + return _source.MoveNext(); } diff --git a/src/MiniExcelLib.Core/DataReader/MiniExcelDataReaderBase.cs b/src/MiniExcel.Core/DataReader/MiniExcelDataReaderBase.cs similarity index 100% rename from src/MiniExcelLib.Core/DataReader/MiniExcelDataReaderBase.cs rename to src/MiniExcel.Core/DataReader/MiniExcelDataReaderBase.cs diff --git a/src/MiniExcelLib.Core/Enums/XlsxImgType.cs b/src/MiniExcel.Core/Enums/XlsxImgType.cs similarity index 100% rename from src/MiniExcelLib.Core/Enums/XlsxImgType.cs rename to src/MiniExcel.Core/Enums/XlsxImgType.cs diff --git a/src/MiniExcelLib.Core/Exceptions/MiniExcelColumnNotFoundException.cs b/src/MiniExcel.Core/Exceptions/MiniExcelColumnNotFoundException.cs similarity index 100% rename from src/MiniExcelLib.Core/Exceptions/MiniExcelColumnNotFoundException.cs rename to src/MiniExcel.Core/Exceptions/MiniExcelColumnNotFoundException.cs diff --git a/src/MiniExcelLib.Core/Exceptions/MiniExcelInvalidCastException.cs b/src/MiniExcel.Core/Exceptions/MiniExcelInvalidCastException.cs similarity index 100% rename from src/MiniExcelLib.Core/Exceptions/MiniExcelInvalidCastException.cs rename to src/MiniExcel.Core/Exceptions/MiniExcelInvalidCastException.cs diff --git a/src/MiniExcelLib.Core/Helpers/AttributeExtension.cs b/src/MiniExcel.Core/Helpers/AttributeExtension.cs similarity index 100% rename from src/MiniExcelLib.Core/Helpers/AttributeExtension.cs rename to src/MiniExcel.Core/Helpers/AttributeExtension.cs diff --git a/src/MiniExcelLib.Core/Helpers/ColumnHelper.cs b/src/MiniExcel.Core/Helpers/ColumnHelper.cs similarity index 100% rename from src/MiniExcelLib.Core/Helpers/ColumnHelper.cs rename to src/MiniExcel.Core/Helpers/ColumnHelper.cs diff --git a/src/MiniExcelLib.Core/Helpers/FileHelper.cs b/src/MiniExcel.Core/Helpers/FileHelper.cs similarity index 100% rename from src/MiniExcelLib.Core/Helpers/FileHelper.cs rename to src/MiniExcel.Core/Helpers/FileHelper.cs diff --git a/src/MiniExcelLib.Core/Helpers/ImageHelper.cs b/src/MiniExcel.Core/Helpers/ImageHelper.cs similarity index 100% rename from src/MiniExcelLib.Core/Helpers/ImageHelper.cs rename to src/MiniExcel.Core/Helpers/ImageHelper.cs diff --git a/src/MiniExcelLib.Core/Helpers/ListHelper.cs b/src/MiniExcel.Core/Helpers/ListHelper.cs similarity index 100% rename from src/MiniExcelLib.Core/Helpers/ListHelper.cs rename to src/MiniExcel.Core/Helpers/ListHelper.cs diff --git a/src/MiniExcelLib.Core/Helpers/SafeStreamWriter.cs b/src/MiniExcel.Core/Helpers/SafeStreamWriter.cs similarity index 100% rename from src/MiniExcelLib.Core/Helpers/SafeStreamWriter.cs rename to src/MiniExcel.Core/Helpers/SafeStreamWriter.cs diff --git a/src/MiniExcelLib.Core/Helpers/StringHelper.cs b/src/MiniExcel.Core/Helpers/StringHelper.cs similarity index 100% rename from src/MiniExcelLib.Core/Helpers/StringHelper.cs rename to src/MiniExcel.Core/Helpers/StringHelper.cs diff --git a/src/MiniExcelLib.Core/Helpers/TaskHelper.cs b/src/MiniExcel.Core/Helpers/TaskHelper.cs similarity index 100% rename from src/MiniExcelLib.Core/Helpers/TaskHelper.cs rename to src/MiniExcel.Core/Helpers/TaskHelper.cs diff --git a/src/MiniExcelLib.Core/Helpers/ThrowHelper.cs b/src/MiniExcel.Core/Helpers/ThrowHelper.cs similarity index 100% rename from src/MiniExcelLib.Core/Helpers/ThrowHelper.cs rename to src/MiniExcel.Core/Helpers/ThrowHelper.cs diff --git a/src/MiniExcelLib.Core/Helpers/TypeHelper.cs b/src/MiniExcel.Core/Helpers/TypeHelper.cs similarity index 100% rename from src/MiniExcelLib.Core/Helpers/TypeHelper.cs rename to src/MiniExcel.Core/Helpers/TypeHelper.cs diff --git a/src/MiniExcelLib.Core/Helpers/XmlHelper.cs b/src/MiniExcel.Core/Helpers/XmlHelper.cs similarity index 100% rename from src/MiniExcelLib.Core/Helpers/XmlHelper.cs rename to src/MiniExcel.Core/Helpers/XmlHelper.cs diff --git a/src/MiniExcel.Core/MiniExcel.Core.csproj b/src/MiniExcel.Core/MiniExcel.Core.csproj new file mode 100644 index 00000000..5f30fcdc --- /dev/null +++ b/src/MiniExcel.Core/MiniExcel.Core.csproj @@ -0,0 +1,11 @@ + + + + MiniExcelLib.Core + + + + + + + diff --git a/src/MiniExcelLib.Core/MiniExcelConfiguration.cs b/src/MiniExcel.Core/MiniExcelConfiguration.cs similarity index 100% rename from src/MiniExcelLib.Core/MiniExcelConfiguration.cs rename to src/MiniExcel.Core/MiniExcelConfiguration.cs diff --git a/src/MiniExcel.Core/MiniExcelExporter.cs b/src/MiniExcel.Core/MiniExcelExporter.cs new file mode 100644 index 00000000..401ee91c --- /dev/null +++ b/src/MiniExcel.Core/MiniExcelExporter.cs @@ -0,0 +1,75 @@ +using MiniExcelLib.Core.OpenXml; +using MiniExcelLib.Core.OpenXml.Picture; +using Zomp.SyncMethodGenerator; + +namespace MiniExcelLib.Core; + +public sealed partial class MiniExcelExporter +{ + [CreateSyncVersion] + public async Task AddPictureXlsxAsync(string path, CancellationToken cancellationToken = default, params MiniExcelPicture[] images) + { + using var stream = File.Open(path, FileMode.OpenOrCreate); + await MiniExcelPictureImplement.AddPictureAsync(stream, cancellationToken, images).ConfigureAwait(false); + } + + [CreateSyncVersion] + public async Task AddPictureXlsxAsync(Stream excelStream, CancellationToken cancellationToken = default, params MiniExcelPicture[] images) + { + await MiniExcelPictureImplement.AddPictureAsync(excelStream, cancellationToken, images).ConfigureAwait(false); + } + + [CreateSyncVersion] + public async Task InsertXlsxSheetAsync(string path, object value, string? sheetName = "Sheet1", bool printHeader = true, bool overwriteSheet = false, OpenXmlConfiguration? configuration = null, CancellationToken cancellationToken = default) + { + if (Path.GetExtension(path).Equals(".xlsm", StringComparison.InvariantCultureIgnoreCase)) + throw new NotSupportedException("MiniExcel's Insert does not support the .xlsm format"); + + if (!File.Exists(path)) + { + var rowsWritten = await ExportXlsxAsync(path, value, printHeader, sheetName, configuration: configuration, cancellationToken: cancellationToken).ConfigureAwait(false); + return rowsWritten.FirstOrDefault(); + } + + using var stream = new FileStream(path, FileMode.Open, FileAccess.ReadWrite, FileShare.Read, 4096, FileOptions.SequentialScan); + return await InsertXlsxSheetAsync(stream, value, sheetName, printHeader, overwriteSheet, configuration, cancellationToken).ConfigureAwait(false); + } + + [CreateSyncVersion] + public async Task InsertXlsxSheetAsync(Stream stream, object value, string? sheetName = "Sheet1", + bool printHeader = true, bool overwriteSheet = false, OpenXmlConfiguration? configuration = null, + CancellationToken cancellationToken = default) + { + stream.Seek(0, SeekOrigin.End); + configuration ??= new OpenXmlConfiguration { FastMode = true }; + + var writer = await OpenXmlWriter + .CreateAsync(stream, value, sheetName, printHeader, configuration, cancellationToken) + .ConfigureAwait(false); + + return await writer.InsertAsync(overwriteSheet, cancellationToken).ConfigureAwait(false); + } + + [CreateSyncVersion] + public async Task ExportXlsxAsync(string path, object value, bool printHeader = true, + string? sheetName = "Sheet1", bool overwriteFile = false, OpenXmlConfiguration? configuration = null, + CancellationToken cancellationToken = default) + { + if (Path.GetExtension(path).Equals(".xlsm", StringComparison.InvariantCultureIgnoreCase)) + throw new NotSupportedException("MiniExcel's SaveAs does not support the .xlsm format"); + + using var stream = overwriteFile ? File.Create(path) : new FileStream(path, FileMode.CreateNew); + return await ExportXlsxAsync(stream, value, printHeader, sheetName, configuration, cancellationToken).ConfigureAwait(false); + } + + [CreateSyncVersion] + public async Task ExportXlsxAsync(Stream stream, object value, bool printHeader = true, string? sheetName = "Sheet1", + OpenXmlConfiguration? configuration = null, CancellationToken cancellationToken = default) + { + var writer = await OpenXmlWriter + .CreateAsync(stream, value, sheetName, printHeader, configuration, cancellationToken) + .ConfigureAwait(false); + + return await writer.SaveAsAsync(cancellationToken).ConfigureAwait(false); + } +} \ No newline at end of file diff --git a/src/MiniExcel.Core/MiniExcelImporter.cs b/src/MiniExcel.Core/MiniExcelImporter.cs new file mode 100644 index 00000000..98219d76 --- /dev/null +++ b/src/MiniExcel.Core/MiniExcelImporter.cs @@ -0,0 +1,337 @@ +using System.Data; +using System.Diagnostics.CodeAnalysis; +using System.Dynamic; +using System.Runtime.CompilerServices; +using MiniExcelLib.Core.DataReader; +using MiniExcelLib.Core.Helpers; +using MiniExcelLib.Core.OpenXml; +using MiniExcelLib.Core.OpenXml.Models; +using MiniExcelLib.Core.OpenXml.Zip; +using Zomp.SyncMethodGenerator; + +namespace MiniExcelLib.Core; + +public sealed partial class MiniExcelImporter +{ + #region Query + + [CreateSyncVersion] + public async IAsyncEnumerable QueryXlsxAsync(string path, string? sheetName = null, + string startCell = "A1", bool treatHeaderAsData = false, OpenXmlConfiguration? configuration = null, + [EnumeratorCancellation] CancellationToken cancellationToken = default) where T : class, new() + { + using var stream = FileHelper.OpenSharedRead(path); + + var query = QueryXlsxAsync(stream, sheetName, startCell, treatHeaderAsData, configuration, cancellationToken); + + //Foreach yield return twice reason : https://stackoverflow.com/questions/66791982/ienumerable-extract-code-lazy-loading-show-stream-was-not-readable + await foreach (var item in query.ConfigureAwait(false)) + yield return item; + } + + [CreateSyncVersion] + [SuppressMessage("Reliability", "CA2007:Do not directly await a Task")] + public async IAsyncEnumerable QueryXlsxAsync(Stream stream, string? sheetName = null, + string startCell = "A1", bool treatHeaderAsData = false, OpenXmlConfiguration? configuration = null, + [EnumeratorCancellation] CancellationToken cancellationToken = default) where T : class, new() + { + using var reader = await OpenXmlReader.CreateAsync(stream, configuration, cancellationToken).ConfigureAwait(false); + await foreach (var item in reader.QueryAsync(sheetName, startCell, treatHeaderAsData, cancellationToken).ConfigureAwait(false)) + yield return item; + } + + [CreateSyncVersion] + public async IAsyncEnumerable QueryXlsxAsync(string path, bool useHeaderRow = false, + string? sheetName = null, string startCell = "A1", OpenXmlConfiguration? configuration = null, + [EnumeratorCancellation] CancellationToken cancellationToken = default) + { + using var stream = FileHelper.OpenSharedRead(path); + await foreach (var item in QueryXlsxAsync(stream, useHeaderRow, sheetName, startCell, configuration, cancellationToken).ConfigureAwait(false)) + yield return item; + } + + [CreateSyncVersion] + [SuppressMessage("Reliability", "CA2007:Do not directly await a Task")] + public async IAsyncEnumerable QueryXlsxAsync(Stream stream, bool useHeaderRow = false, + string? sheetName = null, string startCell = "A1", OpenXmlConfiguration? configuration = null, + [EnumeratorCancellation] CancellationToken cancellationToken = default) + { + using var excelReader = await OpenXmlReader.CreateAsync(stream, configuration, cancellationToken).ConfigureAwait(false); + await foreach (var item in excelReader.QueryAsync(useHeaderRow, sheetName, startCell, cancellationToken).ConfigureAwait(false)) + yield return item.Aggregate(seed: GetNewExpandoObject(), func: AddPairToDict); + } + + #endregion + + #region Query Range + + /// + /// Extract the given range。 Only uppercase letters are effective。 + /// e.g. + /// MiniExcel.QueryRange(path, startCell: "A2", endCell: "C3") + /// A2 represents the second row of column A, C3 represents the third row of column C + /// If you don't want to restrict rows, just don't include numbers + /// + /// + [CreateSyncVersion] + public async IAsyncEnumerable QueryRangeXlsxAsync(string path, bool useHeaderRow = false, + string? sheetName = null, string startCell = "A1", string endCell = "", OpenXmlConfiguration? configuration = null, + [EnumeratorCancellation] CancellationToken cancellationToken = default) + { + using var stream = FileHelper.OpenSharedRead(path); + await foreach (var item in QueryRangeXlsxAsync(stream, useHeaderRow, sheetName, startCell, endCell, configuration, cancellationToken).ConfigureAwait(false)) + yield return item; + } + + [CreateSyncVersion] + [SuppressMessage("Reliability", "CA2007:Do not directly await a Task")] + public async IAsyncEnumerable QueryRangeXlsxAsync(Stream stream, bool useHeaderRow = false, + string? sheetName = null, string startCell = "A1", string endCell = "", OpenXmlConfiguration? configuration = null, + [EnumeratorCancellation] CancellationToken cancellationToken = default) + { + using var excelReader = await OpenXmlReader.CreateAsync(stream, configuration, cancellationToken).ConfigureAwait(false); + await foreach (var item in excelReader.QueryRangeAsync(useHeaderRow, sheetName, startCell, endCell, cancellationToken).ConfigureAwait(false)) + yield return item.Aggregate(seed: GetNewExpandoObject(), func: AddPairToDict); + } + + [CreateSyncVersion] + public async IAsyncEnumerable QueryRangeXlsxAsync(string path, bool useHeaderRow = false, + string? sheetName = null, int startRowIndex = 1, int startColumnIndex = 1, int? endRowIndex = null, + int? endColumnIndex = null, OpenXmlConfiguration? configuration = null, + [EnumeratorCancellation] CancellationToken cancellationToken = default) + { + using var stream = FileHelper.OpenSharedRead(path); + await foreach (var item in QueryRangeXlsxAsync(stream, useHeaderRow, sheetName, startRowIndex, startColumnIndex, endRowIndex, endColumnIndex, configuration, cancellationToken).ConfigureAwait(false)) + yield return item; + } + + [CreateSyncVersion] + [SuppressMessage("Reliability", "CA2007:Do not directly await a Task")] + public async IAsyncEnumerable QueryRangeXlsxAsync(Stream stream, bool useHeaderRow = false, + string? sheetName = null, int startRowIndex = 1, int startColumnIndex = 1, int? endRowIndex = null, + int? endColumnIndex = null, OpenXmlConfiguration? configuration = null, + [EnumeratorCancellation] CancellationToken cancellationToken = default) + { + using var excelReader = await OpenXmlReader.CreateAsync(stream, configuration, cancellationToken).ConfigureAwait(false); + await foreach (var item in excelReader.QueryRangeAsync(useHeaderRow, sheetName, startRowIndex, startColumnIndex, endRowIndex, endColumnIndex, cancellationToken).ConfigureAwait(false)) + yield return item.Aggregate(seed: GetNewExpandoObject(), func: AddPairToDict); + } + + #endregion + + #region Query As DataTable + + /// + /// QueryAsDataTable is not recommended, because it'll load all data into memory. + /// + [CreateSyncVersion] + public async Task QueryXlsxAsDataTableAsync(string path, bool useHeaderRow = true, + string? sheetName = null, string startCell = "A1", OpenXmlConfiguration? configuration = null, + CancellationToken cancellationToken = default) + { + using var stream = FileHelper.OpenSharedRead(path); + return await QueryXlsxAsDataTableAsync(stream, useHeaderRow, sheetName, startCell, configuration, cancellationToken).ConfigureAwait(false); + } + + /// + /// QueryAsDataTable is not recommended, because it'll load all data into memory. + /// + [CreateSyncVersion] + public async Task QueryXlsxAsDataTableAsync(Stream stream, bool useHeaderRow = true, + string? sheetName = null, string startCell = "A1", OpenXmlConfiguration? configuration = null, + CancellationToken cancellationToken = default) + { + /*Issue #279*/ + sheetName ??= (await GetSheetNamesAsync(stream, configuration, cancellationToken).ConfigureAwait(false)).First(); + + var dt = new DataTable(sheetName); + var first = true; + using var reader = await OpenXmlReader.CreateAsync(stream, configuration, cancellationToken).ConfigureAwait(false); + var rows = reader.QueryAsync(false, sheetName, startCell, cancellationToken); + + var columnDict = new Dictionary(); +#pragma warning disable CA2007 + await foreach (var row in rows.ConfigureAwait(false)) +#pragma warning restore CA2007 + { + if (first) + { + foreach (var entry in row) + { + cancellationToken.ThrowIfCancellationRequested(); + + var columnName = useHeaderRow ? entry.Value?.ToString() : entry.Key; + if (!string.IsNullOrWhiteSpace(columnName)) // avoid #298 : Column '' does not belong to table + { + var column = new DataColumn(columnName, typeof(object)) { Caption = columnName }; + dt.Columns.Add(column); + columnDict.Add(entry.Key, columnName); //same column name throw exception??? + } + } + + dt.BeginLoadData(); + first = false; + if (useHeaderRow) + { + continue; + } + } + + var newRow = dt.NewRow(); + foreach (var entry in columnDict) + { + newRow[entry.Value] = row[entry.Key]; //TODO: optimize not using string key + } + + dt.Rows.Add(newRow); + } + + dt.EndLoadData(); + return dt; + } + + #endregion + + #region Sheet Info + + [CreateSyncVersion] + public async Task> GetSheetNamesAsync(string path, OpenXmlConfiguration? config = null, + CancellationToken cancellationToken = default) + { + using var stream = FileHelper.OpenSharedRead(path); + return await GetSheetNamesAsync(stream, config, cancellationToken).ConfigureAwait(false); + } + + [CreateSyncVersion] + public async Task> GetSheetNamesAsync(Stream stream, OpenXmlConfiguration? config = null, + CancellationToken cancellationToken = default) + { + config ??= OpenXmlConfiguration.DefaultConfig; + + // todo: figure out why adding using statement breaks the tests +#pragma warning disable CA2000 // Dispose objects before losing scope + var archive = new OpenXmlZip(stream); +#pragma warning restore CA2000 // Dispose objects before losing scope + + using var reader = await OpenXmlReader.CreateAsync(stream, config, cancellationToken: cancellationToken).ConfigureAwait(false); + var rels = await reader.GetWorkbookRelsAsync(archive.EntryCollection, cancellationToken).ConfigureAwait(false); + + return rels?.Select(s => s.Name).ToList() ?? []; + } + + [CreateSyncVersion] + public async Task> GetSheetInformationsAsync(string path, OpenXmlConfiguration? config = null, CancellationToken cancellationToken = default) + { + using var stream = FileHelper.OpenSharedRead(path); + return await GetSheetInformationsAsync(stream, config, cancellationToken).ConfigureAwait(false); + } + + [CreateSyncVersion] + public async Task> GetSheetInformationsAsync(Stream stream, OpenXmlConfiguration? config = null, CancellationToken cancellationToken = default) + { + config ??= OpenXmlConfiguration.DefaultConfig; + + using var archive = new OpenXmlZip(stream); + using var reader = await OpenXmlReader.CreateAsync(stream, config, cancellationToken: cancellationToken).ConfigureAwait(false); + var rels = await reader.GetWorkbookRelsAsync(archive.EntryCollection, cancellationToken).ConfigureAwait(false); + + return rels?.Select((s, i) => s.ToSheetInfo((uint)i)).ToList() ?? []; + } + + [CreateSyncVersion] + public async Task> GetSheetDimensionsAsync(string path, CancellationToken cancellationToken = default) + { + using var stream = FileHelper.OpenSharedRead(path); + return await GetSheetDimensionsAsync(stream, cancellationToken).ConfigureAwait(false); + } + + [CreateSyncVersion] + public async Task> GetSheetDimensionsAsync(Stream stream, CancellationToken cancellationToken = default) + { + using var reader = await OpenXmlReader.CreateAsync(stream, null, cancellationToken: cancellationToken).ConfigureAwait(false); + return await reader.GetDimensionsAsync(cancellationToken).ConfigureAwait(false); + } + + [CreateSyncVersion] + public async Task> GetXlsxColumnsAsync(string path, bool useHeaderRow = false, + string? sheetName = null, string startCell = "A1", OpenXmlConfiguration? configuration = null, + CancellationToken cancellationToken = default) + { + using var stream = FileHelper.OpenSharedRead(path); + return await GetXlsxColumnsAsync(stream, useHeaderRow, sheetName, startCell, configuration, cancellationToken).ConfigureAwait(false); + } + + [CreateSyncVersion] + public async Task> GetXlsxColumnsAsync(Stream stream, bool useHeaderRow = false, + string? sheetName = null, string startCell = "A1", OpenXmlConfiguration? configuration = null, + CancellationToken cancellationToken = default) + { +#pragma warning disable CA2007 // Consider calling ConfigureAwait on the awaited task + await using var enumerator = QueryXlsxAsync(stream, useHeaderRow, sheetName, startCell, configuration, cancellationToken).GetAsyncEnumerator(cancellationToken); +#pragma warning restore CA2007 // Consider calling ConfigureAwait on the awaited task + + _ = enumerator.ConfigureAwait(false); + if (await enumerator.MoveNextAsync().ConfigureAwait(false)) + { + return (enumerator.Current as IDictionary)?.Keys ?? []; + } + + return []; + } + + #endregion + + #region DataReader + + public MiniExcelDataReader GetXlsxDataReader(string path, bool useHeaderRow = false, + string? sheetName = null, string startCell = "A1", OpenXmlConfiguration? configuration = null) + { + var stream = FileHelper.OpenSharedRead(path); + var values = QueryXlsx(stream, useHeaderRow, sheetName, startCell, configuration).Cast>(); + + return MiniExcelDataReader.Create(stream, values); + } + + public MiniExcelDataReader GetXlsxDataReader(Stream stream, bool useHeaderRow = false, + string? sheetName = null, string startCell = "A1", OpenXmlConfiguration? configuration = null) + { + var values = QueryXlsx(stream, useHeaderRow, sheetName, startCell, configuration).Cast>(); + return MiniExcelDataReader.Create(stream, values); + } + + public async Task GetAsyncXlsxDataReader(string path, bool useHeaderRow = false, + string? sheetName = null, string startCell = "A1", OpenXmlConfiguration? configuration = null, + CancellationToken cancellationToken = default) + { + var stream = FileHelper.OpenSharedRead(path); + var values = QueryXlsxAsync(stream, useHeaderRow, sheetName, startCell, configuration, cancellationToken); + + return await MiniExcelAsyncDataReader.CreateAsync(stream, CastAsync(values, cancellationToken)).ConfigureAwait(false); + } + + public async Task GetAsyncXlsxDataReader(Stream stream, bool useHeaderRow = false, + string? sheetName = null, string startCell = "A1", OpenXmlConfiguration? configuration = null, + CancellationToken cancellationToken = default) + { + var values = QueryXlsxAsync(stream, useHeaderRow, sheetName, startCell, configuration, cancellationToken); + return await MiniExcelAsyncDataReader.CreateAsync(stream, CastAsync(values, cancellationToken)).ConfigureAwait(false); + } + + #endregion + + private static IDictionary GetNewExpandoObject() => new ExpandoObject(); + private static IDictionary AddPairToDict(IDictionary dict, KeyValuePair pair) + { + dict.Add(pair); + return dict; + } + + private static async IAsyncEnumerable> CastAsync(IAsyncEnumerable enumerable, CancellationToken cancellationToken = default) + { + await foreach (var item in enumerable.WithCancellation(cancellationToken).ConfigureAwait(false)) + { + if (item is IDictionary dict) + yield return dict; + } + } +} \ No newline at end of file diff --git a/src/MiniExcel.Core/MiniExcelTemplater.cs b/src/MiniExcel.Core/MiniExcelTemplater.cs new file mode 100644 index 00000000..1b8e295a --- /dev/null +++ b/src/MiniExcel.Core/MiniExcelTemplater.cs @@ -0,0 +1,75 @@ +using MiniExcelLib.Core.OpenXml; +using MiniExcelLib.Core.OpenXml.Templates; +using Zomp.SyncMethodGenerator; + +namespace MiniExcelLib.Core; + +public sealed partial class MiniExcelTemplater +{ + [CreateSyncVersion] + public async Task ApplyXlsxTemplateAsync(string path, string templatePath, object value, + OpenXmlConfiguration? configuration = null, CancellationToken cancellationToken = default) + { + using var stream = File.Create(path); + await ApplyXlsxTemplateAsync(stream, templatePath, value, configuration, cancellationToken).ConfigureAwait(false); + } + + [CreateSyncVersion] + public async Task ApplyXlsxTemplateAsync(Stream stream, string templatePath, object value, + OpenXmlConfiguration? configuration = null, CancellationToken cancellationToken = default) + { + var template = GetOpenXmlTemplate(stream, configuration); + await template.SaveAsByTemplateAsync(templatePath, value, cancellationToken).ConfigureAwait(false); + } + + [CreateSyncVersion] + public async Task ApplyXlsxTemplateAsync(string path, byte[] templateBytes, object value, + OpenXmlConfiguration? configuration = null, CancellationToken cancellationToken = default) + { + using var stream = File.Create(path); + await ApplyXlsxTemplateAsync(stream, templateBytes, value, configuration, cancellationToken).ConfigureAwait(false); + } + + [CreateSyncVersion] + public async Task ApplyXlsxTemplateAsync(Stream stream, byte[] templateBytes, object value, + OpenXmlConfiguration? configuration = null, CancellationToken cancellationToken = default) + { + var template = GetOpenXmlTemplate(stream, configuration); + await template.SaveAsByTemplateAsync(templateBytes, value, cancellationToken).ConfigureAwait(false); + } + + #region Merge Cells + + [CreateSyncVersion] + public async Task MergeSameCellsAsync(string mergedFilePath, string path, + OpenXmlConfiguration? configuration = null, CancellationToken cancellationToken = default) + { + using var stream = File.Create(mergedFilePath); + await MergeSameCellsAsync(stream, path, configuration, cancellationToken).ConfigureAwait(false); + } + + [CreateSyncVersion] + public async Task MergeSameCellsAsync(Stream stream, string path, + OpenXmlConfiguration? configuration = null, CancellationToken cancellationToken = default) + { + var template = GetOpenXmlTemplate(stream, configuration); + await template.MergeSameCellsAsync(path, cancellationToken).ConfigureAwait(false); + } + + [CreateSyncVersion] + public async Task MergeSameCellsAsync(Stream stream, byte[] file, + OpenXmlConfiguration? configuration = null, CancellationToken cancellationToken = default) + { + var template = GetOpenXmlTemplate(stream, configuration); + await template.MergeSameCellsAsync(file, cancellationToken).ConfigureAwait(false); + } + + + private OpenXmlTemplate GetOpenXmlTemplate(Stream stream, OpenXmlConfiguration? configuration) + { + var valueExtractor = new OpenXmlValueExtractor(); + return new OpenXmlTemplate(stream, configuration, valueExtractor); + } + + #endregion +} \ No newline at end of file diff --git a/src/MiniExcelLib.Core/OpenXml/Attributes/ExcelSheetAttribute.cs b/src/MiniExcel.Core/OpenXml/Attributes/ExcelSheetAttribute.cs similarity index 100% rename from src/MiniExcelLib.Core/OpenXml/Attributes/ExcelSheetAttribute.cs rename to src/MiniExcel.Core/OpenXml/Attributes/ExcelSheetAttribute.cs diff --git a/src/MiniExcelLib.Core/OpenXml/Constants/ExcelContentTypes.cs b/src/MiniExcel.Core/OpenXml/Constants/ExcelContentTypes.cs similarity index 100% rename from src/MiniExcelLib.Core/OpenXml/Constants/ExcelContentTypes.cs rename to src/MiniExcel.Core/OpenXml/Constants/ExcelContentTypes.cs diff --git a/src/MiniExcelLib.Core/OpenXml/Constants/ExcelFileNames.cs b/src/MiniExcel.Core/OpenXml/Constants/ExcelFileNames.cs similarity index 100% rename from src/MiniExcelLib.Core/OpenXml/Constants/ExcelFileNames.cs rename to src/MiniExcel.Core/OpenXml/Constants/ExcelFileNames.cs diff --git a/src/MiniExcelLib.Core/OpenXml/Constants/ExcelXml.cs b/src/MiniExcel.Core/OpenXml/Constants/ExcelXml.cs similarity index 100% rename from src/MiniExcelLib.Core/OpenXml/Constants/ExcelXml.cs rename to src/MiniExcel.Core/OpenXml/Constants/ExcelXml.cs diff --git a/src/MiniExcelLib.Core/OpenXml/Constants/Schemas.cs b/src/MiniExcel.Core/OpenXml/Constants/Schemas.cs similarity index 100% rename from src/MiniExcelLib.Core/OpenXml/Constants/Schemas.cs rename to src/MiniExcel.Core/OpenXml/Constants/Schemas.cs diff --git a/src/MiniExcelLib.Core/OpenXml/Constants/WorksheetXml.cs b/src/MiniExcel.Core/OpenXml/Constants/WorksheetXml.cs similarity index 100% rename from src/MiniExcelLib.Core/OpenXml/Constants/WorksheetXml.cs rename to src/MiniExcel.Core/OpenXml/Constants/WorksheetXml.cs diff --git a/src/MiniExcelLib.Core/OpenXml/Models/DrawingDto.cs b/src/MiniExcel.Core/OpenXml/Models/DrawingDto.cs similarity index 100% rename from src/MiniExcelLib.Core/OpenXml/Models/DrawingDto.cs rename to src/MiniExcel.Core/OpenXml/Models/DrawingDto.cs diff --git a/src/MiniExcelLib.Core/OpenXml/Models/ExcelRange.cs b/src/MiniExcel.Core/OpenXml/Models/ExcelRange.cs similarity index 100% rename from src/MiniExcelLib.Core/OpenXml/Models/ExcelRange.cs rename to src/MiniExcel.Core/OpenXml/Models/ExcelRange.cs diff --git a/src/MiniExcelLib.Core/OpenXml/Models/ExcelWidthCollection.cs b/src/MiniExcel.Core/OpenXml/Models/ExcelWidthCollection.cs similarity index 100% rename from src/MiniExcelLib.Core/OpenXml/Models/ExcelWidthCollection.cs rename to src/MiniExcel.Core/OpenXml/Models/ExcelWidthCollection.cs diff --git a/src/MiniExcelLib.Core/OpenXml/Models/ExcellSheetInfo.cs b/src/MiniExcel.Core/OpenXml/Models/ExcellSheetInfo.cs similarity index 100% rename from src/MiniExcelLib.Core/OpenXml/Models/ExcellSheetInfo.cs rename to src/MiniExcel.Core/OpenXml/Models/ExcellSheetInfo.cs diff --git a/src/MiniExcelLib.Core/OpenXml/Models/FileDto.cs b/src/MiniExcel.Core/OpenXml/Models/FileDto.cs similarity index 100% rename from src/MiniExcelLib.Core/OpenXml/Models/FileDto.cs rename to src/MiniExcel.Core/OpenXml/Models/FileDto.cs diff --git a/src/MiniExcelLib.Core/OpenXml/Models/MergeCells.cs b/src/MiniExcel.Core/OpenXml/Models/MergeCells.cs similarity index 100% rename from src/MiniExcelLib.Core/OpenXml/Models/MergeCells.cs rename to src/MiniExcel.Core/OpenXml/Models/MergeCells.cs diff --git a/src/MiniExcelLib.Core/OpenXml/Models/SheetDto.cs b/src/MiniExcel.Core/OpenXml/Models/SheetDto.cs similarity index 100% rename from src/MiniExcelLib.Core/OpenXml/Models/SheetDto.cs rename to src/MiniExcel.Core/OpenXml/Models/SheetDto.cs diff --git a/src/MiniExcelLib.Core/OpenXml/Models/SheetInfo.cs b/src/MiniExcel.Core/OpenXml/Models/SheetInfo.cs similarity index 100% rename from src/MiniExcelLib.Core/OpenXml/Models/SheetInfo.cs rename to src/MiniExcel.Core/OpenXml/Models/SheetInfo.cs diff --git a/src/MiniExcelLib.Core/OpenXml/Models/SheetRecord.cs b/src/MiniExcel.Core/OpenXml/Models/SheetRecord.cs similarity index 100% rename from src/MiniExcelLib.Core/OpenXml/Models/SheetRecord.cs rename to src/MiniExcel.Core/OpenXml/Models/SheetRecord.cs diff --git a/src/MiniExcelLib.Core/OpenXml/OpenXmlConfiguration.cs b/src/MiniExcel.Core/OpenXml/OpenXmlConfiguration.cs similarity index 100% rename from src/MiniExcelLib.Core/OpenXml/OpenXmlConfiguration.cs rename to src/MiniExcel.Core/OpenXml/OpenXmlConfiguration.cs diff --git a/src/MiniExcelLib.Core/OpenXml/OpenXmlReader.cs b/src/MiniExcel.Core/OpenXml/OpenXmlReader.cs similarity index 100% rename from src/MiniExcelLib.Core/OpenXml/OpenXmlReader.cs rename to src/MiniExcel.Core/OpenXml/OpenXmlReader.cs diff --git a/src/MiniExcelLib.Core/OpenXml/OpenXmlStyleOptions.cs b/src/MiniExcel.Core/OpenXml/OpenXmlStyleOptions.cs similarity index 100% rename from src/MiniExcelLib.Core/OpenXml/OpenXmlStyleOptions.cs rename to src/MiniExcel.Core/OpenXml/OpenXmlStyleOptions.cs diff --git a/src/MiniExcelLib.Core/OpenXml/OpenXmlStyles.cs b/src/MiniExcel.Core/OpenXml/OpenXmlStyles.cs similarity index 100% rename from src/MiniExcelLib.Core/OpenXml/OpenXmlStyles.cs rename to src/MiniExcel.Core/OpenXml/OpenXmlStyles.cs diff --git a/src/MiniExcelLib.Core/OpenXml/OpenXmlWriter.DefaultOpenXml.cs b/src/MiniExcel.Core/OpenXml/OpenXmlWriter.DefaultOpenXml.cs similarity index 100% rename from src/MiniExcelLib.Core/OpenXml/OpenXmlWriter.DefaultOpenXml.cs rename to src/MiniExcel.Core/OpenXml/OpenXmlWriter.DefaultOpenXml.cs diff --git a/src/MiniExcelLib.Core/OpenXml/OpenXmlWriter.cs b/src/MiniExcel.Core/OpenXml/OpenXmlWriter.cs similarity index 100% rename from src/MiniExcelLib.Core/OpenXml/OpenXmlWriter.cs rename to src/MiniExcel.Core/OpenXml/OpenXmlWriter.cs diff --git a/src/MiniExcelLib.Core/OpenXml/Picture/OpenXmlPicture.cs b/src/MiniExcel.Core/OpenXml/Picture/OpenXmlPicture.cs similarity index 100% rename from src/MiniExcelLib.Core/OpenXml/Picture/OpenXmlPicture.cs rename to src/MiniExcel.Core/OpenXml/Picture/OpenXmlPicture.cs diff --git a/src/MiniExcelLib.Core/OpenXml/Picture/OpenXmlPictureImplement.cs b/src/MiniExcel.Core/OpenXml/Picture/OpenXmlPictureImplement.cs similarity index 100% rename from src/MiniExcelLib.Core/OpenXml/Picture/OpenXmlPictureImplement.cs rename to src/MiniExcel.Core/OpenXml/Picture/OpenXmlPictureImplement.cs diff --git a/src/MiniExcelLib.Core/OpenXml/Styles/DefaultSheetStyleBuilder.cs b/src/MiniExcel.Core/OpenXml/Styles/DefaultSheetStyleBuilder.cs similarity index 100% rename from src/MiniExcelLib.Core/OpenXml/Styles/DefaultSheetStyleBuilder.cs rename to src/MiniExcel.Core/OpenXml/Styles/DefaultSheetStyleBuilder.cs diff --git a/src/MiniExcelLib.Core/OpenXml/Styles/ISheetStyleBuilder.cs b/src/MiniExcel.Core/OpenXml/Styles/ISheetStyleBuilder.cs similarity index 100% rename from src/MiniExcelLib.Core/OpenXml/Styles/ISheetStyleBuilder.cs rename to src/MiniExcel.Core/OpenXml/Styles/ISheetStyleBuilder.cs diff --git a/src/MiniExcelLib.Core/OpenXml/Styles/MinimalSheetStyleBuilder.cs b/src/MiniExcel.Core/OpenXml/Styles/MinimalSheetStyleBuilder.cs similarity index 100% rename from src/MiniExcelLib.Core/OpenXml/Styles/MinimalSheetStyleBuilder.cs rename to src/MiniExcel.Core/OpenXml/Styles/MinimalSheetStyleBuilder.cs diff --git a/src/MiniExcelLib.Core/OpenXml/Styles/SheetStyleBuildContext.cs b/src/MiniExcel.Core/OpenXml/Styles/SheetStyleBuildContext.cs similarity index 100% rename from src/MiniExcelLib.Core/OpenXml/Styles/SheetStyleBuildContext.cs rename to src/MiniExcel.Core/OpenXml/Styles/SheetStyleBuildContext.cs diff --git a/src/MiniExcelLib.Core/OpenXml/Styles/SheetStyleBuildResult.cs b/src/MiniExcel.Core/OpenXml/Styles/SheetStyleBuildResult.cs similarity index 100% rename from src/MiniExcelLib.Core/OpenXml/Styles/SheetStyleBuildResult.cs rename to src/MiniExcel.Core/OpenXml/Styles/SheetStyleBuildResult.cs diff --git a/src/MiniExcelLib.Core/OpenXml/Styles/SheetStyleBuilderBase.cs b/src/MiniExcel.Core/OpenXml/Styles/SheetStyleBuilderBase.cs similarity index 100% rename from src/MiniExcelLib.Core/OpenXml/Styles/SheetStyleBuilderBase.cs rename to src/MiniExcel.Core/OpenXml/Styles/SheetStyleBuilderBase.cs diff --git a/src/MiniExcelLib.Core/OpenXml/Styles/SheetStyleBuilderHelper.cs b/src/MiniExcel.Core/OpenXml/Styles/SheetStyleBuilderHelper.cs similarity index 100% rename from src/MiniExcelLib.Core/OpenXml/Styles/SheetStyleBuilderHelper.cs rename to src/MiniExcel.Core/OpenXml/Styles/SheetStyleBuilderHelper.cs diff --git a/src/MiniExcelLib.Core/OpenXml/Styles/SheetStyleElementInfos.cs b/src/MiniExcel.Core/OpenXml/Styles/SheetStyleElementInfos.cs similarity index 100% rename from src/MiniExcelLib.Core/OpenXml/Styles/SheetStyleElementInfos.cs rename to src/MiniExcel.Core/OpenXml/Styles/SheetStyleElementInfos.cs diff --git a/src/MiniExcelLib.Core/OpenXml/Templates/OpenXmlTemplate.Impl.cs b/src/MiniExcel.Core/OpenXml/Templates/OpenXmlTemplate.Impl.cs similarity index 100% rename from src/MiniExcelLib.Core/OpenXml/Templates/OpenXmlTemplate.Impl.cs rename to src/MiniExcel.Core/OpenXml/Templates/OpenXmlTemplate.Impl.cs diff --git a/src/MiniExcelLib.Core/OpenXml/Templates/OpenXmlTemplate.MergeCells.cs b/src/MiniExcel.Core/OpenXml/Templates/OpenXmlTemplate.MergeCells.cs similarity index 100% rename from src/MiniExcelLib.Core/OpenXml/Templates/OpenXmlTemplate.MergeCells.cs rename to src/MiniExcel.Core/OpenXml/Templates/OpenXmlTemplate.MergeCells.cs diff --git a/src/MiniExcelLib.Core/OpenXml/Templates/OpenXmlTemplate.cs b/src/MiniExcel.Core/OpenXml/Templates/OpenXmlTemplate.cs similarity index 100% rename from src/MiniExcelLib.Core/OpenXml/Templates/OpenXmlTemplate.cs rename to src/MiniExcel.Core/OpenXml/Templates/OpenXmlTemplate.cs diff --git a/src/MiniExcelLib.Core/OpenXml/Templates/OpenXmlValueExtractor.cs b/src/MiniExcel.Core/OpenXml/Templates/OpenXmlValueExtractor.cs similarity index 100% rename from src/MiniExcelLib.Core/OpenXml/Templates/OpenXmlValueExtractor.cs rename to src/MiniExcel.Core/OpenXml/Templates/OpenXmlValueExtractor.cs diff --git a/src/MiniExcelLib.Core/OpenXml/Utils/CalcChainHelper.cs b/src/MiniExcel.Core/OpenXml/Utils/CalcChainHelper.cs similarity index 100% rename from src/MiniExcelLib.Core/OpenXml/Utils/CalcChainHelper.cs rename to src/MiniExcel.Core/OpenXml/Utils/CalcChainHelper.cs diff --git a/src/MiniExcelLib.Core/OpenXml/Utils/DateTimeHelper.cs b/src/MiniExcel.Core/OpenXml/Utils/DateTimeHelper.cs similarity index 100% rename from src/MiniExcelLib.Core/OpenXml/Utils/DateTimeHelper.cs rename to src/MiniExcel.Core/OpenXml/Utils/DateTimeHelper.cs diff --git a/src/MiniExcelLib.Core/OpenXml/Utils/GeneralHelper.cs b/src/MiniExcel.Core/OpenXml/Utils/GeneralHelper.cs similarity index 100% rename from src/MiniExcelLib.Core/OpenXml/Utils/GeneralHelper.cs rename to src/MiniExcel.Core/OpenXml/Utils/GeneralHelper.cs diff --git a/src/MiniExcelLib.Core/OpenXml/Utils/MiniExcelPropertyHelper.cs b/src/MiniExcel.Core/OpenXml/Utils/MiniExcelPropertyHelper.cs similarity index 100% rename from src/MiniExcelLib.Core/OpenXml/Utils/MiniExcelPropertyHelper.cs rename to src/MiniExcel.Core/OpenXml/Utils/MiniExcelPropertyHelper.cs diff --git a/src/MiniExcelLib.Core/OpenXml/Utils/OpenXmlNumberFormatHelper.cs b/src/MiniExcel.Core/OpenXml/Utils/OpenXmlNumberFormatHelper.cs similarity index 100% rename from src/MiniExcelLib.Core/OpenXml/Utils/OpenXmlNumberFormatHelper.cs rename to src/MiniExcel.Core/OpenXml/Utils/OpenXmlNumberFormatHelper.cs diff --git a/src/MiniExcelLib.Core/OpenXml/Utils/ReferenceHelper.cs b/src/MiniExcel.Core/OpenXml/Utils/ReferenceHelper.cs similarity index 100% rename from src/MiniExcelLib.Core/OpenXml/Utils/ReferenceHelper.cs rename to src/MiniExcel.Core/OpenXml/Utils/ReferenceHelper.cs diff --git a/src/MiniExcelLib.Core/OpenXml/Utils/SharedStringsDiskCache.cs b/src/MiniExcel.Core/OpenXml/Utils/SharedStringsDiskCache.cs similarity index 100% rename from src/MiniExcelLib.Core/OpenXml/Utils/SharedStringsDiskCache.cs rename to src/MiniExcel.Core/OpenXml/Utils/SharedStringsDiskCache.cs diff --git a/src/MiniExcelLib.Core/OpenXml/Utils/XmlReaderHelper.cs b/src/MiniExcel.Core/OpenXml/Utils/XmlReaderHelper.cs similarity index 100% rename from src/MiniExcelLib.Core/OpenXml/Utils/XmlReaderHelper.cs rename to src/MiniExcel.Core/OpenXml/Utils/XmlReaderHelper.cs diff --git a/src/MiniExcelLib.Core/OpenXml/Zip/MiniExcelZipArchive.cs b/src/MiniExcel.Core/OpenXml/Zip/MiniExcelZipArchive.cs similarity index 100% rename from src/MiniExcelLib.Core/OpenXml/Zip/MiniExcelZipArchive.cs rename to src/MiniExcel.Core/OpenXml/Zip/MiniExcelZipArchive.cs diff --git a/src/MiniExcelLib.Core/OpenXml/Zip/OpenXmlZip.cs b/src/MiniExcel.Core/OpenXml/Zip/OpenXmlZip.cs similarity index 100% rename from src/MiniExcelLib.Core/OpenXml/Zip/OpenXmlZip.cs rename to src/MiniExcel.Core/OpenXml/Zip/OpenXmlZip.cs diff --git a/src/MiniExcelLib.Core/OpenXml/Zip/ZipPackageInfo.cs b/src/MiniExcel.Core/OpenXml/Zip/ZipPackageInfo.cs similarity index 100% rename from src/MiniExcelLib.Core/OpenXml/Zip/ZipPackageInfo.cs rename to src/MiniExcel.Core/OpenXml/Zip/ZipPackageInfo.cs diff --git a/src/MiniExcelLib.Core/Properties/AssemblyInfo.cs b/src/MiniExcel.Core/Properties/AssemblyInfo.cs similarity index 100% rename from src/MiniExcelLib.Core/Properties/AssemblyInfo.cs rename to src/MiniExcel.Core/Properties/AssemblyInfo.cs diff --git a/src/MiniExcelLib.Core/Reflection/CustomPropertyHelper.cs b/src/MiniExcel.Core/Reflection/CustomPropertyHelper.cs similarity index 100% rename from src/MiniExcelLib.Core/Reflection/CustomPropertyHelper.cs rename to src/MiniExcel.Core/Reflection/CustomPropertyHelper.cs diff --git a/src/MiniExcelLib.Core/Reflection/MemberGetter.cs b/src/MiniExcel.Core/Reflection/MemberGetter.cs similarity index 100% rename from src/MiniExcelLib.Core/Reflection/MemberGetter.cs rename to src/MiniExcel.Core/Reflection/MemberGetter.cs diff --git a/src/MiniExcelLib.Core/Reflection/MemberSetter.cs b/src/MiniExcel.Core/Reflection/MemberSetter.cs similarity index 100% rename from src/MiniExcelLib.Core/Reflection/MemberSetter.cs rename to src/MiniExcel.Core/Reflection/MemberSetter.cs diff --git a/src/MiniExcelLib.Core/Reflection/MiniExcelColumnInfo.cs b/src/MiniExcel.Core/Reflection/MiniExcelColumnInfo.cs similarity index 100% rename from src/MiniExcelLib.Core/Reflection/MiniExcelColumnInfo.cs rename to src/MiniExcel.Core/Reflection/MiniExcelColumnInfo.cs diff --git a/src/MiniExcelLib.Core/Reflection/MiniExcelMapper.cs b/src/MiniExcel.Core/Reflection/MiniExcelMapper.cs similarity index 100% rename from src/MiniExcelLib.Core/Reflection/MiniExcelMapper.cs rename to src/MiniExcel.Core/Reflection/MiniExcelMapper.cs diff --git a/src/MiniExcelLib.Core/Reflection/MiniExcelProperty.cs b/src/MiniExcel.Core/Reflection/MiniExcelProperty.cs similarity index 100% rename from src/MiniExcelLib.Core/Reflection/MiniExcelProperty.cs rename to src/MiniExcel.Core/Reflection/MiniExcelProperty.cs diff --git a/src/MiniExcelLib.Core/WriteAdapters/AsyncEnumerableWriteAdapter.cs b/src/MiniExcel.Core/WriteAdapters/AsyncEnumerableWriteAdapter.cs similarity index 100% rename from src/MiniExcelLib.Core/WriteAdapters/AsyncEnumerableWriteAdapter.cs rename to src/MiniExcel.Core/WriteAdapters/AsyncEnumerableWriteAdapter.cs diff --git a/src/MiniExcelLib.Core/WriteAdapters/DataReaderWriteAdapter.cs b/src/MiniExcel.Core/WriteAdapters/DataReaderWriteAdapter.cs similarity index 100% rename from src/MiniExcelLib.Core/WriteAdapters/DataReaderWriteAdapter.cs rename to src/MiniExcel.Core/WriteAdapters/DataReaderWriteAdapter.cs diff --git a/src/MiniExcelLib.Core/WriteAdapters/DataTableWriteAdapter.cs b/src/MiniExcel.Core/WriteAdapters/DataTableWriteAdapter.cs similarity index 100% rename from src/MiniExcelLib.Core/WriteAdapters/DataTableWriteAdapter.cs rename to src/MiniExcel.Core/WriteAdapters/DataTableWriteAdapter.cs diff --git a/src/MiniExcelLib.Core/WriteAdapters/EnumerableWriteAdapter.cs b/src/MiniExcel.Core/WriteAdapters/EnumerableWriteAdapter.cs similarity index 100% rename from src/MiniExcelLib.Core/WriteAdapters/EnumerableWriteAdapter.cs rename to src/MiniExcel.Core/WriteAdapters/EnumerableWriteAdapter.cs diff --git a/src/MiniExcelLib.Core/WriteAdapters/MiniExcelDataReaderWriteAdapter.cs b/src/MiniExcel.Core/WriteAdapters/MiniExcelDataReaderWriteAdapter.cs similarity index 100% rename from src/MiniExcelLib.Core/WriteAdapters/MiniExcelDataReaderWriteAdapter.cs rename to src/MiniExcel.Core/WriteAdapters/MiniExcelDataReaderWriteAdapter.cs diff --git a/src/MiniExcelLib.Core/WriteAdapters/MiniExcelWriteAdapterFactory.cs b/src/MiniExcel.Core/WriteAdapters/MiniExcelWriteAdapterFactory.cs similarity index 100% rename from src/MiniExcelLib.Core/WriteAdapters/MiniExcelWriteAdapterFactory.cs rename to src/MiniExcel.Core/WriteAdapters/MiniExcelWriteAdapterFactory.cs diff --git a/src/MiniExcelLib.Core/icon.png b/src/MiniExcel.Core/icon.png similarity index 100% rename from src/MiniExcelLib.Core/icon.png rename to src/MiniExcel.Core/icon.png diff --git a/src/MiniExcelLib.Core/miniexcel.publickey b/src/MiniExcel.Core/miniexcel.publickey similarity index 100% rename from src/MiniExcelLib.Core/miniexcel.publickey rename to src/MiniExcel.Core/miniexcel.publickey diff --git a/src/MiniExcelLib.Csv/CsvConfiguration.cs b/src/MiniExcel.Csv/CsvConfiguration.cs similarity index 100% rename from src/MiniExcelLib.Csv/CsvConfiguration.cs rename to src/MiniExcel.Csv/CsvConfiguration.cs diff --git a/src/MiniExcelLib.Csv/CsvHelper.cs b/src/MiniExcel.Csv/CsvHelper.cs similarity index 100% rename from src/MiniExcelLib.Csv/CsvHelper.cs rename to src/MiniExcel.Csv/CsvHelper.cs diff --git a/src/MiniExcelLib.Csv/CsvReader.cs b/src/MiniExcel.Csv/CsvReader.cs similarity index 100% rename from src/MiniExcelLib.Csv/CsvReader.cs rename to src/MiniExcel.Csv/CsvReader.cs diff --git a/src/MiniExcelLib.Csv/CsvWriter.cs b/src/MiniExcel.Csv/CsvWriter.cs similarity index 100% rename from src/MiniExcelLib.Csv/CsvWriter.cs rename to src/MiniExcel.Csv/CsvWriter.cs diff --git a/src/MiniExcel.Csv/MiniExcel.Csv.csproj b/src/MiniExcel.Csv/MiniExcel.Csv.csproj new file mode 100644 index 00000000..dcba1d8b --- /dev/null +++ b/src/MiniExcel.Csv/MiniExcel.Csv.csproj @@ -0,0 +1,11 @@ + + + + MiniExcelLib.Csv + + + + + + + diff --git a/src/MiniExcel.Csv/MiniExcelExtensions/Exporter.cs b/src/MiniExcel.Csv/MiniExcelExtensions/Exporter.cs new file mode 100644 index 00000000..8f57529d --- /dev/null +++ b/src/MiniExcel.Csv/MiniExcelExtensions/Exporter.cs @@ -0,0 +1,91 @@ +using System.Collections; +using System.Data; +using MiniExcelLib.Core; +using MiniExcelLib.Core.Helpers; +using Zomp.SyncMethodGenerator; + +namespace MiniExcelLib.Csv.MiniExcelExtensions; + +public static partial class Exporter +{ + #region Append / Export + + [CreateSyncVersion] + public static async Task AppendToCsvAsync(this MiniExcelExporter me, string path, object value, bool printHeader = true, + CsvConfiguration? configuration = null, CancellationToken cancellationToken = default) + { + if (!File.Exists(path)) + { + var rowsWritten = await ExportCsvAsync(me, path, value, printHeader, false, configuration, cancellationToken: cancellationToken).ConfigureAwait(false); + return rowsWritten.FirstOrDefault(); + } + + using var stream = new FileStream(path, FileMode.Append, FileAccess.Write, FileShare.Read, 4096, FileOptions.SequentialScan); + return await me.AppendToCsvAsync(stream, value, configuration, cancellationToken).ConfigureAwait(false); + } + + [CreateSyncVersion] + public static async Task AppendToCsvAsync(this MiniExcelExporter me, Stream stream, object value, CsvConfiguration? configuration = null, CancellationToken cancellationToken = default) + { + stream.Seek(0, SeekOrigin.End); + + var newValue = value is IEnumerable or IDataReader ? value : new[] { value }; + + using var writer = new CsvWriter(stream, newValue, false, configuration); + return await writer.InsertAsync(false, cancellationToken).ConfigureAwait(false); + } + + [CreateSyncVersion] + public static async Task ExportCsvAsync(this MiniExcelExporter me, string path, object value, bool printHeader = true, bool overwriteFile = false, + CsvConfiguration? configuration = null, CancellationToken cancellationToken = default) + { + using var stream = overwriteFile ? File.Create(path) : new FileStream(path, FileMode.CreateNew); + return await ExportCsvAsync(me, stream, value, printHeader, configuration, cancellationToken).ConfigureAwait(false); + } + + [CreateSyncVersion] + public static async Task ExportCsvAsync(this MiniExcelExporter me, Stream stream, object value, bool printHeader = true, + CsvConfiguration? configuration = null, CancellationToken cancellationToken = default) + { + using var writer = new CsvWriter(stream, value, printHeader, configuration); + return await writer.SaveAsAsync(cancellationToken).ConfigureAwait(false); + } + + #endregion + + #region Convert + + [CreateSyncVersion] + public static async Task ConvertCsvToXlsxAsync(this MiniExcelExporter me, Stream csv, Stream xlsx, bool csvHasHeader = false, CancellationToken cancellationToken = default) + { + var value = new MiniExcelImporter().QueryCsvAsync(csv, useHeaderRow: csvHasHeader, cancellationToken: cancellationToken); + await me.ExportXlsxAsync(xlsx, value, printHeader: csvHasHeader, cancellationToken: cancellationToken).ConfigureAwait(false); + } + + [CreateSyncVersion] + public static async Task ConvertCsvToXlsxAsync(this MiniExcelExporter me, string csvPath, string xlsx, bool csvHasHeader = false, CancellationToken cancellationToken = default) + { + using var csvStream = FileHelper.OpenSharedRead(csvPath); + using var xlsxStream = new FileStream(xlsx, FileMode.CreateNew); + + await me.ConvertCsvToXlsxAsync(csvStream, xlsxStream, csvHasHeader, cancellationToken).ConfigureAwait(false); + } + + [CreateSyncVersion] + public static async Task ConvertXlsxToCsvAsync(this MiniExcelExporter me, string xlsx, string csvPath, bool xlsxHasHeader = true, CancellationToken cancellationToken = default) + { + using var xlsxStream = FileHelper.OpenSharedRead(xlsx); + using var csvStream = new FileStream(csvPath, FileMode.CreateNew); + + await me.ConvertXlsxToCsvAsync(xlsxStream, csvStream, xlsxHasHeader, cancellationToken).ConfigureAwait(false); + } + + [CreateSyncVersion] + public static async Task ConvertXlsxToCsvAsync(this MiniExcelExporter me, Stream xlsx, Stream csv, bool xlsxHasHeader = true, CancellationToken cancellationToken = default) + { + var value = new MiniExcelImporter().QueryXlsxAsync(xlsx, useHeaderRow: xlsxHasHeader, cancellationToken: cancellationToken).ConfigureAwait(false); + await me.ExportCsvAsync(csv, value, printHeader: xlsxHasHeader, cancellationToken: cancellationToken).ConfigureAwait(false); + } + + #endregion +} \ No newline at end of file diff --git a/src/MiniExcel.Csv/MiniExcelExtensions/Importer.cs b/src/MiniExcel.Csv/MiniExcelExtensions/Importer.cs new file mode 100644 index 00000000..c8b667a5 --- /dev/null +++ b/src/MiniExcel.Csv/MiniExcelExtensions/Importer.cs @@ -0,0 +1,212 @@ +using System.Data; +using System.Dynamic; +using System.Runtime.CompilerServices; +using MiniExcelLib.Core; +using MiniExcelLib.Core.DataReader; +using MiniExcelLib.Core.Helpers; +using Zomp.SyncMethodGenerator; + +namespace MiniExcelLib.Csv.MiniExcelExtensions; + +public static partial class Importer +{ + #region Query + + [CreateSyncVersion] + public static async IAsyncEnumerable QueryCsvAsync(this MiniExcelImporter me, string path, CsvConfiguration? configuration = null, + bool treatHeaderAsData = false, [EnumeratorCancellation] CancellationToken cancellationToken = default) + where T : class, new() + { + using var stream = FileHelper.OpenSharedRead(path); + + var query = QueryCsvAsync(me, stream, treatHeaderAsData, configuration, cancellationToken); + + //Foreach yield return twice reason : https://stackoverflow.com/questions/66791982/ienumerable-extract-code-lazy-loading-show-stream-was-not-readable + await foreach (var item in query.ConfigureAwait(false)) + yield return item; + } + + [CreateSyncVersion] + public static async IAsyncEnumerable QueryCsvAsync(this MiniExcelImporter me, Stream stream, bool treatHeaderAsData = false, + CsvConfiguration? configuration = null, + [EnumeratorCancellation] CancellationToken cancellationToken = default) + where T : class, new() + { + using var csv = new CsvReader(stream, configuration); + await foreach (var item in csv.QueryAsync(null, "A1", treatHeaderAsData, cancellationToken).ConfigureAwait(false)) + yield return item; + } + + [CreateSyncVersion] + public static async IAsyncEnumerable QueryCsvAsync(this MiniExcelImporter me, string path, bool useHeaderRow = false, + CsvConfiguration? configuration = null, + [EnumeratorCancellation] CancellationToken cancellationToken = default) + { + using var stream = FileHelper.OpenSharedRead(path); + await foreach (var item in QueryCsvAsync(me, stream, useHeaderRow, configuration, cancellationToken).ConfigureAwait(false)) + yield return item; + } + + [CreateSyncVersion] + public static async IAsyncEnumerable QueryCsvAsync(this MiniExcelImporter me, Stream stream, bool useHeaderRow = false, + CsvConfiguration? configuration = null, + [EnumeratorCancellation] CancellationToken cancellationToken = default) + { +#pragma warning disable CA2007 + using var excelReader = new CsvReader(stream, configuration); + await foreach (var item in excelReader.QueryAsync(useHeaderRow, null, "A1", cancellationToken).ConfigureAwait(false)) + yield return item.Aggregate(seed: GetNewExpandoObject(), func: AddPairToDict); +#pragma warning restore CA2007 + } + + #endregion + + #region Query As DataTable + + /// + /// QueryAsDataTable is not recommended, because it'll load all data into memory. + /// + [CreateSyncVersion] + public static async Task QueryCsvAsDataTableAsync(this MiniExcelImporter me, string path, bool useHeaderRow = true, + CsvConfiguration? configuration = null, CancellationToken cancellationToken = default) + { + using var stream = FileHelper.OpenSharedRead(path); + return await QueryCsvAsDataTableAsync(me, stream, useHeaderRow, configuration, cancellationToken).ConfigureAwait(false); + } + + /// + /// QueryAsDataTable is not recommended, because it'll load all data into memory. + /// + [CreateSyncVersion] + public static async Task QueryCsvAsDataTableAsync(this MiniExcelImporter me, Stream stream, bool useHeaderRow = true, + CsvConfiguration? configuration = null, CancellationToken cancellationToken = default) + { + var dt = new DataTable(); + var first = true; + using var reader = new CsvReader(stream, configuration); + var rows = reader.QueryAsync(false, null, "A1", cancellationToken); + + var columnDict = new Dictionary(); +#pragma warning disable CA2007 + await foreach (var row in rows.ConfigureAwait(false)) +#pragma warning restore CA2007 + { + if (first) + { + foreach (var entry in row) + { + cancellationToken.ThrowIfCancellationRequested(); + + var columnName = useHeaderRow ? entry.Value?.ToString() : entry.Key; + if (!string.IsNullOrWhiteSpace(columnName)) // avoid #298 : Column '' does not belong to table + { + var column = new DataColumn(columnName, typeof(object)) { Caption = columnName }; + dt.Columns.Add(column); + columnDict.Add(entry.Key, columnName!); //same column name throw exception??? + } + } + + dt.BeginLoadData(); + first = false; + if (useHeaderRow) + { + continue; + } + } + + var newRow = dt.NewRow(); + foreach (var entry in columnDict) + { + newRow[entry.Value] = row[entry.Key]; //TODO: optimize not using string key + } + + dt.Rows.Add(newRow); + } + + dt.EndLoadData(); + return dt; + } + + #endregion + + #region Info + + [CreateSyncVersion] + public static async Task> GetCsvColumnsAsync(this MiniExcelImporter me, string path, bool useHeaderRow = false, + CsvConfiguration? configuration = null, CancellationToken cancellationToken = default) + { + using var stream = FileHelper.OpenSharedRead(path); + return await GetCsvColumnsAsync(me, stream, useHeaderRow, configuration, cancellationToken).ConfigureAwait(false); + } + + [CreateSyncVersion] + public static async Task> GetCsvColumnsAsync(this MiniExcelImporter me, Stream stream, bool useHeaderRow = false, + CsvConfiguration? configuration = null, CancellationToken cancellationToken = default) + { +#pragma warning disable CA2007 // Consider calling ConfigureAwait on the awaited task + await using var enumerator = QueryCsvAsync(me, stream, useHeaderRow, configuration, cancellationToken).GetAsyncEnumerator(cancellationToken); +#pragma warning restore CA2007 // Consider calling ConfigureAwait on the awaited task + + _ = enumerator.ConfigureAwait(false); + if (await enumerator.MoveNextAsync().ConfigureAwait(false)) + { + return (enumerator.Current as IDictionary)?.Keys ?? []; + } + + return []; + } + + #endregion + + #region DataReader + + public static MiniExcelDataReader GetCsvDataReader(this MiniExcelImporter me, string path, bool useHeaderRow = false, CsvConfiguration? configuration = null) + { + var stream = FileHelper.OpenSharedRead(path); + var values = QueryCsv(me, stream, useHeaderRow, configuration).Cast>(); + + return MiniExcelDataReader.Create(stream, values); + } + + public static MiniExcelDataReader GetCsvDataReader(this MiniExcelImporter me, Stream stream, bool useHeaderRow = false, CsvConfiguration? configuration = null) + { + var values = QueryCsv(me, stream, useHeaderRow, configuration).Cast>(); + return MiniExcelDataReader.Create(stream, values); + } + + public static async Task GetAsyncCsvDataReader(this MiniExcelImporter me, string path, bool useHeaderRow = false, + string? sheetName = null, string startCell = "A1", CsvConfiguration? configuration = null, + CancellationToken cancellationToken = default) + { + var stream = FileHelper.OpenSharedRead(path); + var values = QueryCsvAsync(me, stream, useHeaderRow, configuration, cancellationToken); + + return await MiniExcelAsyncDataReader.CreateAsync(stream, CastAsync(values, cancellationToken)).ConfigureAwait(false); + } + + public static async Task GetAsyncCsvDataReader(this MiniExcelImporter me, Stream stream, bool useHeaderRow = false, + string? sheetName = null, string startCell = "A1", CsvConfiguration? configuration = null, + CancellationToken cancellationToken = default) + { + var values = QueryCsvAsync(me, stream, useHeaderRow, configuration, cancellationToken); + return await MiniExcelAsyncDataReader.CreateAsync(stream, CastAsync(values, cancellationToken)).ConfigureAwait(false); + } + + #endregion + + private static IDictionary GetNewExpandoObject() => new ExpandoObject(); + private static IDictionary AddPairToDict(IDictionary dict, KeyValuePair pair) + { + dict.Add(pair); + return dict; + } + + private static async IAsyncEnumerable> CastAsync(IAsyncEnumerable enumerable, CancellationToken cancellationToken = default) + { + await foreach (var item in enumerable.WithCancellation(cancellationToken).ConfigureAwait(false)) + { + if (item is IDictionary dict) + yield return dict; + } + } +} \ No newline at end of file diff --git a/src/MiniExcel/Exporter/MiniExcelExporter.Csv.cs b/src/MiniExcel/Exporter/MiniExcelExporter.Csv.cs deleted file mode 100644 index 1cb82c55..00000000 --- a/src/MiniExcel/Exporter/MiniExcelExporter.Csv.cs +++ /dev/null @@ -1,93 +0,0 @@ -using System.Collections; -using System.Data; -using MiniExcelLib.Core.Helpers; -using MiniExcelLib.Csv; -using Zomp.SyncMethodGenerator; - -namespace MiniExcelLib; - -public static partial class MiniExcel -{ - public static partial class Exporter - { - #region Append / Export - [CreateSyncVersion] - public static async Task AppendToCsvAsync(string path, object value, bool printHeader = true, - CsvConfiguration? configuration = null, CancellationToken cancellationToken = default) - { - if (!File.Exists(path)) - { - var rowsWritten = await ExportCsvAsync(path, value, printHeader, false, configuration, cancellationToken: cancellationToken).ConfigureAwait(false); - return rowsWritten.FirstOrDefault(); - } - - using var stream = new FileStream(path, FileMode.Append, FileAccess.Write, FileShare.Read, 4096, FileOptions.SequentialScan); - return await AppendToCsvAsync(stream, value, configuration, cancellationToken).ConfigureAwait(false); - } - - [CreateSyncVersion] - public static async Task AppendToCsvAsync(Stream stream, object value, CsvConfiguration? configuration = null, CancellationToken cancellationToken = default) - { - stream.Seek(0, SeekOrigin.End); - - var newValue = value is IEnumerable or IDataReader ? value : new[] { value }; - - using var writer = new CsvWriter(stream, newValue, false, configuration); - return await writer.InsertAsync(false, cancellationToken).ConfigureAwait(false); - } - - [CreateSyncVersion] - public static async Task ExportCsvAsync(string path, object value, bool printHeader = true, bool overwriteFile = false, - CsvConfiguration? configuration = null, CancellationToken cancellationToken = default) - { - using var stream = overwriteFile ? File.Create(path) : new FileStream(path, FileMode.CreateNew); - return await ExportCsvAsync(stream, value, printHeader, configuration, cancellationToken).ConfigureAwait(false); - } - - [CreateSyncVersion] - public static async Task ExportCsvAsync(Stream stream, object value, bool printHeader = true, - CsvConfiguration? configuration = null, CancellationToken cancellationToken = default) - { - using var writer = new CsvWriter(stream, value, printHeader, configuration); - return await writer.SaveAsAsync(cancellationToken).ConfigureAwait(false); - } - - #endregion - - #region Convert - - [CreateSyncVersion] - public static async Task ConvertCsvToXlsxAsync(Stream csv, Stream xlsx, bool csvHasHeader = false, CancellationToken cancellationToken = default) - { - var value = Importer.QueryCsvAsync(csv, useHeaderRow: csvHasHeader, cancellationToken: cancellationToken); - await ExportXlsxAsync(xlsx, value, printHeader: csvHasHeader, cancellationToken: cancellationToken).ConfigureAwait(false); - } - - [CreateSyncVersion] - public static async Task ConvertCsvToXlsxAsync(string csvPath, string xlsx, bool csvHasHeader = false, CancellationToken cancellationToken = default) - { - using var csvStream = FileHelper.OpenSharedRead(csvPath); - using var xlsxStream = new FileStream(xlsx, FileMode.CreateNew); - - await ConvertCsvToXlsxAsync(csvStream, xlsxStream, csvHasHeader, cancellationToken).ConfigureAwait(false); - } - - [CreateSyncVersion] - public static async Task ConvertXlsxToCsvAsync(string xlsx, string csvPath, bool xlsxHasHeader = true, CancellationToken cancellationToken = default) - { - using var xlsxStream = FileHelper.OpenSharedRead(xlsx); - using var csvStream = new FileStream(csvPath, FileMode.CreateNew); - - await ConvertXlsxToCsvAsync(xlsxStream, csvStream, xlsxHasHeader, cancellationToken).ConfigureAwait(false); - } - - [CreateSyncVersion] - public static async Task ConvertXlsxToCsvAsync(Stream xlsx, Stream csv, bool xlsxHasHeader = true, CancellationToken cancellationToken = default) - { - var value = Importer.QueryXlsxAsync(xlsx, useHeaderRow: xlsxHasHeader, cancellationToken: cancellationToken).ConfigureAwait(false); - await ExportCsvAsync(csv, value, printHeader: xlsxHasHeader, cancellationToken: cancellationToken).ConfigureAwait(false); - } - - #endregion - } -} \ No newline at end of file diff --git a/src/MiniExcel/Exporter/MiniExcelExporter.OpenXml.cs b/src/MiniExcel/Exporter/MiniExcelExporter.OpenXml.cs deleted file mode 100644 index 52ca691e..00000000 --- a/src/MiniExcel/Exporter/MiniExcelExporter.OpenXml.cs +++ /dev/null @@ -1,78 +0,0 @@ -using MiniExcelLib.Core.OpenXml; -using MiniExcelLib.Core.OpenXml.Picture; -using Zomp.SyncMethodGenerator; - -namespace MiniExcelLib; - -public static partial class MiniExcel -{ - public static partial class Exporter - { - [CreateSyncVersion] - public static async Task AddPictureXlsxAsync(string path, CancellationToken cancellationToken = default, params MiniExcelPicture[] images) - { - using var stream = File.Open(path, FileMode.OpenOrCreate); - await MiniExcelPictureImplement.AddPictureAsync(stream, cancellationToken, images).ConfigureAwait(false); - } - - [CreateSyncVersion] - public static async Task AddPictureXlsxAsync(Stream excelStream, CancellationToken cancellationToken = default, params MiniExcelPicture[] images) - { - await MiniExcelPictureImplement.AddPictureAsync(excelStream, cancellationToken, images).ConfigureAwait(false); - } - - [CreateSyncVersion] - public static async Task InsertXlsxSheetAsync(string path, object value, string? sheetName = "Sheet1", bool printHeader = true, bool overwriteSheet = false, OpenXmlConfiguration? configuration = null, CancellationToken cancellationToken = default) - { - if (Path.GetExtension(path).Equals(".xlsm", StringComparison.InvariantCultureIgnoreCase)) - throw new NotSupportedException("MiniExcel's Insert does not support the .xlsm format"); - - if (!File.Exists(path)) - { - var rowsWritten = await ExportXlsxAsync(path, value, printHeader, sheetName, configuration: configuration, cancellationToken: cancellationToken).ConfigureAwait(false); - return rowsWritten.FirstOrDefault(); - } - - using var stream = new FileStream(path, FileMode.Open, FileAccess.ReadWrite, FileShare.Read, 4096, FileOptions.SequentialScan); - return await InsertXlsxSheetAsync(stream, value, sheetName, printHeader, overwriteSheet, configuration, cancellationToken).ConfigureAwait(false); - } - - [CreateSyncVersion] - public static async Task InsertXlsxSheetAsync(Stream stream, object value, string? sheetName = "Sheet1", - bool printHeader = true, bool overwriteSheet = false, OpenXmlConfiguration? configuration = null, - CancellationToken cancellationToken = default) - { - stream.Seek(0, SeekOrigin.End); - configuration ??= new OpenXmlConfiguration { FastMode = true }; - - var writer = await OpenXmlWriter - .CreateAsync(stream, value, sheetName, printHeader, configuration, cancellationToken) - .ConfigureAwait(false); - - return await writer.InsertAsync(overwriteSheet, cancellationToken).ConfigureAwait(false); - } - - [CreateSyncVersion] - public static async Task ExportXlsxAsync(string path, object value, bool printHeader = true, - string? sheetName = "Sheet1", bool overwriteFile = false, OpenXmlConfiguration? configuration = null, - CancellationToken cancellationToken = default) - { - if (Path.GetExtension(path).Equals(".xlsm", StringComparison.InvariantCultureIgnoreCase)) - throw new NotSupportedException("MiniExcel's SaveAs does not support the .xlsm format"); - - using var stream = overwriteFile ? File.Create(path) : new FileStream(path, FileMode.CreateNew); - return await ExportXlsxAsync(stream, value, printHeader, sheetName, configuration, cancellationToken).ConfigureAwait(false); - } - - [CreateSyncVersion] - public static async Task ExportXlsxAsync(Stream stream, object value, bool printHeader = true, string? sheetName = "Sheet1", - OpenXmlConfiguration? configuration = null, CancellationToken cancellationToken = default) - { - var writer = await OpenXmlWriter - .CreateAsync(stream, value, sheetName, printHeader, configuration, cancellationToken) - .ConfigureAwait(false); - - return await writer.SaveAsAsync(cancellationToken).ConfigureAwait(false); - } - } -} \ No newline at end of file diff --git a/src/MiniExcel/Importer/MiniExcelImporter.Csv.cs b/src/MiniExcel/Importer/MiniExcelImporter.Csv.cs deleted file mode 100644 index 6fd487cb..00000000 --- a/src/MiniExcel/Importer/MiniExcelImporter.Csv.cs +++ /dev/null @@ -1,180 +0,0 @@ -using System.Data; -using System.Runtime.CompilerServices; -using MiniExcelLib.Core.DataReader; -using MiniExcelLib.Core.Helpers; -using MiniExcelLib.Csv; -using Zomp.SyncMethodGenerator; - -namespace MiniExcelLib; - -public static partial class MiniExcel -{ - public static partial class Importer - { - #region Query - - [CreateSyncVersion] - public static async IAsyncEnumerable QueryCsvAsync(string path, CsvConfiguration? configuration = null, - bool treatHeaderAsData = false, [EnumeratorCancellation] CancellationToken cancellationToken = default) - where T : class, new() - { - using var stream = FileHelper.OpenSharedRead(path); - - var query = QueryCsvAsync(stream, treatHeaderAsData, configuration, cancellationToken); - - //Foreach yield return twice reason : https://stackoverflow.com/questions/66791982/ienumerable-extract-code-lazy-loading-show-stream-was-not-readable - await foreach (var item in query.ConfigureAwait(false)) - yield return item; - } - - [CreateSyncVersion] - public static async IAsyncEnumerable QueryCsvAsync(Stream stream, bool treatHeaderAsData = false, - CsvConfiguration? configuration = null, - [EnumeratorCancellation] CancellationToken cancellationToken = default) - where T : class, new() - { - using var csv = new CsvReader(stream, configuration); - await foreach (var item in csv.QueryAsync(null, "A1", treatHeaderAsData, cancellationToken).ConfigureAwait(false)) - yield return item; - } - - [CreateSyncVersion] - public static async IAsyncEnumerable QueryCsvAsync(string path, bool useHeaderRow = false, - CsvConfiguration? configuration = null, - [EnumeratorCancellation] CancellationToken cancellationToken = default) - { - using var stream = FileHelper.OpenSharedRead(path); - await foreach (var item in QueryCsvAsync(stream, useHeaderRow, configuration, cancellationToken).ConfigureAwait(false)) - yield return item; - } - - [CreateSyncVersion] - public static async IAsyncEnumerable QueryCsvAsync(Stream stream, bool useHeaderRow = false, - CsvConfiguration? configuration = null, - [EnumeratorCancellation] CancellationToken cancellationToken = default) - { -#pragma warning disable CA2007 - using var excelReader = new CsvReader(stream, configuration); - await foreach (var item in excelReader.QueryAsync(useHeaderRow, null, "A1", cancellationToken).ConfigureAwait(false)) - yield return item.Aggregate(seed: GetNewExpandoObject(), func: AddPairToDict); -#pragma warning restore CA2007 - } - - #endregion - - #region Query As DataTable - - /// - /// QueryAsDataTable is not recommended, because it'll load all data into memory. - /// - [CreateSyncVersion] - public static async Task QueryCsvAsDataTableAsync(string path, bool useHeaderRow = true, - CsvConfiguration? configuration = null, CancellationToken cancellationToken = default) - { - using var stream = FileHelper.OpenSharedRead(path); - return await QueryCsvAsDataTableAsync(stream, useHeaderRow, configuration, cancellationToken).ConfigureAwait(false); - } - - /// - /// QueryAsDataTable is not recommended, because it'll load all data into memory. - /// - [CreateSyncVersion] - public static async Task QueryCsvAsDataTableAsync(Stream stream, bool useHeaderRow = true, - CsvConfiguration? configuration = null, CancellationToken cancellationToken = default) - { - var dt = new DataTable(); - var first = true; - using var reader = new CsvReader(stream, configuration); - var rows = reader.QueryAsync(false, null, "A1", cancellationToken); - - var columnDict = new Dictionary(); -#pragma warning disable CA2007 - await foreach (var row in rows.ConfigureAwait(false)) -#pragma warning restore CA2007 - { - if (first) - { - foreach (var entry in row) - { - cancellationToken.ThrowIfCancellationRequested(); - - var columnName = useHeaderRow ? entry.Value?.ToString() : entry.Key; - if (!string.IsNullOrWhiteSpace(columnName)) // avoid #298 : Column '' does not belong to table - { - var column = new DataColumn(columnName, typeof(object)) { Caption = columnName }; - dt.Columns.Add(column); - columnDict.Add(entry.Key, columnName!); //same column name throw exception??? - } - } - - dt.BeginLoadData(); - first = false; - if (useHeaderRow) - { - continue; - } - } - - var newRow = dt.NewRow(); - foreach (var entry in columnDict) - { - newRow[entry.Value] = row[entry.Key]; //TODO: optimize not using string key - } - - dt.Rows.Add(newRow); - } - - dt.EndLoadData(); - return dt; - } - - #endregion - - #region Info - - [CreateSyncVersion] - public static async Task> GetCsvColumnsAsync(string path, bool useHeaderRow = false, - CsvConfiguration? configuration = null, CancellationToken cancellationToken = default) - { - using var stream = FileHelper.OpenSharedRead(path); - return await GetCsvColumnsAsync(stream, useHeaderRow, configuration, cancellationToken).ConfigureAwait(false); - } - - [CreateSyncVersion] - public static async Task> GetCsvColumnsAsync(Stream stream, bool useHeaderRow = false, - CsvConfiguration? configuration = null, CancellationToken cancellationToken = default) - { -#pragma warning disable CA2007 // Consider calling ConfigureAwait on the awaited task - await using var enumerator = QueryCsvAsync(stream, useHeaderRow, configuration, cancellationToken).GetAsyncEnumerator(cancellationToken); -#pragma warning restore CA2007 // Consider calling ConfigureAwait on the awaited task - - _ = enumerator.ConfigureAwait(false); - if (await enumerator.MoveNextAsync().ConfigureAwait(false)) - { - return (enumerator.Current as IDictionary)?.Keys ?? []; - } - - return []; - } - - #endregion - - #region DataReader - - public static MiniExcelDataReader GetCsvDataReader(string path, bool useHeaderRow = false, CsvConfiguration? configuration = null) - { - var stream = FileHelper.OpenSharedRead(path); - var values = QueryCsv(stream, useHeaderRow, configuration).Cast>(); - - return MiniExcelDataReader.Create(stream, values); - } - - public static MiniExcelDataReader GetCsvDataReader(Stream stream, bool useHeaderRow = false, CsvConfiguration? configuration = null) - { - var values = QueryCsv(stream, useHeaderRow, configuration).Cast>(); - return MiniExcelDataReader.Create(stream, values); - } - - #endregion - } -} \ No newline at end of file diff --git a/src/MiniExcel/Importer/MiniExcelImporter.OpenXml.cs b/src/MiniExcel/Importer/MiniExcelImporter.OpenXml.cs deleted file mode 100644 index 24c7dc0e..00000000 --- a/src/MiniExcel/Importer/MiniExcelImporter.OpenXml.cs +++ /dev/null @@ -1,305 +0,0 @@ -using System.Data; -using System.Diagnostics.CodeAnalysis; -using System.Runtime.CompilerServices; -using MiniExcelLib.Core.DataReader; -using MiniExcelLib.Core.Helpers; -using MiniExcelLib.Core.OpenXml; -using MiniExcelLib.Core.OpenXml.Models; -using MiniExcelLib.Core.OpenXml.Zip; -using Zomp.SyncMethodGenerator; - -namespace MiniExcelLib; - -public static partial class MiniExcel -{ - public static partial class Importer - { - #region Query - - [CreateSyncVersion] - public static async IAsyncEnumerable QueryXlsxAsync(string path, string? sheetName = null, - string startCell = "A1", bool treatHeaderAsData = false, OpenXmlConfiguration? configuration = null, - [EnumeratorCancellation] CancellationToken cancellationToken = default) where T : class, new() - { - using var stream = FileHelper.OpenSharedRead(path); - - var query = QueryXlsxAsync(stream, sheetName, startCell, treatHeaderAsData, configuration, cancellationToken); - - //Foreach yield return twice reason : https://stackoverflow.com/questions/66791982/ienumerable-extract-code-lazy-loading-show-stream-was-not-readable - await foreach (var item in query.ConfigureAwait(false)) - yield return item; - } - - [CreateSyncVersion] - [SuppressMessage("Reliability", "CA2007:Do not directly await a Task")] - public static async IAsyncEnumerable QueryXlsxAsync(Stream stream, string? sheetName = null, - string startCell = "A1", bool treatHeaderAsData = false, OpenXmlConfiguration? configuration = null, - [EnumeratorCancellation] CancellationToken cancellationToken = default) where T : class, new() - { - using var reader = await OpenXmlReader.CreateAsync(stream, configuration, cancellationToken).ConfigureAwait(false); - await foreach (var item in reader.QueryAsync(sheetName, startCell, treatHeaderAsData, cancellationToken).ConfigureAwait(false)) - yield return item; - } - - [CreateSyncVersion] - public static async IAsyncEnumerable QueryXlsxAsync(string path, bool useHeaderRow = false, - string? sheetName = null, string startCell = "A1", OpenXmlConfiguration? configuration = null, - [EnumeratorCancellation] CancellationToken cancellationToken = default) - { - using var stream = FileHelper.OpenSharedRead(path); - await foreach (var item in QueryXlsxAsync(stream, useHeaderRow, sheetName, startCell, configuration, cancellationToken).ConfigureAwait(false)) - yield return item; - } - - [CreateSyncVersion] - [SuppressMessage("Reliability", "CA2007:Do not directly await a Task")] - public static async IAsyncEnumerable QueryXlsxAsync(Stream stream, bool useHeaderRow = false, - string? sheetName = null, string startCell = "A1", OpenXmlConfiguration? configuration = null, - [EnumeratorCancellation] CancellationToken cancellationToken = default) - { - using var excelReader = await OpenXmlReader.CreateAsync(stream, configuration, cancellationToken).ConfigureAwait(false); - await foreach (var item in excelReader.QueryAsync(useHeaderRow, sheetName, startCell, cancellationToken).ConfigureAwait(false)) - yield return item.Aggregate(seed: GetNewExpandoObject(), func: AddPairToDict); - } - - #endregion - - #region Query Range - - /// - /// Extract the given range。 Only uppercase letters are effective。 - /// e.g. - /// MiniExcel.QueryRange(path, startCell: "A2", endCell: "C3") - /// A2 represents the second row of column A, C3 represents the third row of column C - /// If you don't want to restrict rows, just don't include numbers - /// - /// - [CreateSyncVersion] - public static async IAsyncEnumerable QueryRangeXlsxAsync(string path, bool useHeaderRow = false, - string? sheetName = null, string startCell = "A1", string endCell = "", OpenXmlConfiguration? configuration = null, - [EnumeratorCancellation] CancellationToken cancellationToken = default) - { - using var stream = FileHelper.OpenSharedRead(path); - await foreach (var item in QueryRangeXlsxAsync(stream, useHeaderRow, sheetName, startCell, endCell, configuration, cancellationToken).ConfigureAwait(false)) - yield return item; - } - - [CreateSyncVersion] - [SuppressMessage("Reliability", "CA2007:Do not directly await a Task")] - public static async IAsyncEnumerable QueryRangeXlsxAsync(Stream stream, bool useHeaderRow = false, - string? sheetName = null, string startCell = "A1", string endCell = "", OpenXmlConfiguration? configuration = null, - [EnumeratorCancellation] CancellationToken cancellationToken = default) - { - using var excelReader = await OpenXmlReader.CreateAsync(stream, configuration, cancellationToken).ConfigureAwait(false); - await foreach (var item in excelReader.QueryRangeAsync(useHeaderRow, sheetName, startCell, endCell, cancellationToken).ConfigureAwait(false)) - yield return item.Aggregate(seed: GetNewExpandoObject(), func: AddPairToDict); - } - - [CreateSyncVersion] - public static async IAsyncEnumerable QueryRangeXlsxAsync(string path, bool useHeaderRow = false, - string? sheetName = null, int startRowIndex = 1, int startColumnIndex = 1, int? endRowIndex = null, - int? endColumnIndex = null, OpenXmlConfiguration? configuration = null, - [EnumeratorCancellation] CancellationToken cancellationToken = default) - { - using var stream = FileHelper.OpenSharedRead(path); - await foreach (var item in QueryRangeXlsxAsync(stream, useHeaderRow, sheetName, startRowIndex, startColumnIndex, endRowIndex, endColumnIndex, configuration, cancellationToken).ConfigureAwait(false)) - yield return item; - } - - [CreateSyncVersion] - [SuppressMessage("Reliability", "CA2007:Do not directly await a Task")] - public static async IAsyncEnumerable QueryRangeXlsxAsync(Stream stream, bool useHeaderRow = false, - string? sheetName = null, int startRowIndex = 1, int startColumnIndex = 1, int? endRowIndex = null, - int? endColumnIndex = null, OpenXmlConfiguration? configuration = null, - [EnumeratorCancellation] CancellationToken cancellationToken = default) - { - using var excelReader = await OpenXmlReader.CreateAsync(stream, configuration, cancellationToken).ConfigureAwait(false); - await foreach (var item in excelReader.QueryRangeAsync(useHeaderRow, sheetName, startRowIndex, startColumnIndex, endRowIndex, endColumnIndex, cancellationToken).ConfigureAwait(false)) - yield return item.Aggregate(seed: GetNewExpandoObject(), func: AddPairToDict); - } - - #endregion - - #region Query As DataTable - - /// - /// QueryAsDataTable is not recommended, because it'll load all data into memory. - /// - [CreateSyncVersion] - public static async Task QueryXlsxAsDataTableAsync(string path, bool useHeaderRow = true, - string? sheetName = null, string startCell = "A1", OpenXmlConfiguration? configuration = null, - CancellationToken cancellationToken = default) - { - using var stream = FileHelper.OpenSharedRead(path); - return await QueryXlsxAsDataTableAsync(stream, useHeaderRow, sheetName, startCell, configuration, cancellationToken).ConfigureAwait(false); - } - - /// - /// QueryAsDataTable is not recommended, because it'll load all data into memory. - /// - [CreateSyncVersion] - public static async Task QueryXlsxAsDataTableAsync(Stream stream, bool useHeaderRow = true, - string? sheetName = null, string startCell = "A1", OpenXmlConfiguration? configuration = null, - CancellationToken cancellationToken = default) - { - /*Issue #279*/ - sheetName ??= (await GetSheetNamesAsync(stream, configuration, cancellationToken).ConfigureAwait(false)).First(); - - var dt = new DataTable(sheetName); - var first = true; - using var reader = await OpenXmlReader.CreateAsync(stream, configuration, cancellationToken).ConfigureAwait(false); - var rows = reader.QueryAsync(false, sheetName, startCell, cancellationToken); - - var columnDict = new Dictionary(); -#pragma warning disable CA2007 - await foreach (var row in rows.ConfigureAwait(false)) -#pragma warning restore CA2007 - { - if (first) - { - foreach (var entry in row) - { - cancellationToken.ThrowIfCancellationRequested(); - - var columnName = useHeaderRow ? entry.Value?.ToString() : entry.Key; - if (!string.IsNullOrWhiteSpace(columnName)) // avoid #298 : Column '' does not belong to table - { - var column = new DataColumn(columnName, typeof(object)) { Caption = columnName }; - dt.Columns.Add(column); - columnDict.Add(entry.Key, columnName!); //same column name throw exception??? - } - } - - dt.BeginLoadData(); - first = false; - if (useHeaderRow) - { - continue; - } - } - - var newRow = dt.NewRow(); - foreach (var entry in columnDict) - { - newRow[entry.Value] = row[entry.Key]; //TODO: optimize not using string key - } - - dt.Rows.Add(newRow); - } - - dt.EndLoadData(); - return dt; - } - - #endregion - - #region Sheet Info - - [CreateSyncVersion] - public static async Task> GetSheetNamesAsync(string path, OpenXmlConfiguration? config = null, - CancellationToken cancellationToken = default) - { - using var stream = FileHelper.OpenSharedRead(path); - return await GetSheetNamesAsync(stream, config, cancellationToken).ConfigureAwait(false); - } - - [CreateSyncVersion] - public static async Task> GetSheetNamesAsync(Stream stream, OpenXmlConfiguration? config = null, - CancellationToken cancellationToken = default) - { - config ??= OpenXmlConfiguration.DefaultConfig; - - // todo: figure out why adding using statement breaks the tests -#pragma warning disable CA2000 // Dispose objects before losing scope - var archive = new OpenXmlZip(stream); -#pragma warning restore CA2000 // Dispose objects before losing scope - - using var reader = await OpenXmlReader.CreateAsync(stream, config, cancellationToken: cancellationToken).ConfigureAwait(false); - var rels = await reader.GetWorkbookRelsAsync(archive.EntryCollection, cancellationToken).ConfigureAwait(false); - - return rels?.Select(s => s.Name).ToList() ?? []; - } - - [CreateSyncVersion] - public static async Task> GetSheetInformationsAsync(string path, OpenXmlConfiguration? config = null, CancellationToken cancellationToken = default) - { - using var stream = FileHelper.OpenSharedRead(path); - return await GetSheetInformationsAsync(stream, config, cancellationToken).ConfigureAwait(false); - } - - [CreateSyncVersion] - public static async Task> GetSheetInformationsAsync(Stream stream, OpenXmlConfiguration? config = null, CancellationToken cancellationToken = default) - { - config ??= OpenXmlConfiguration.DefaultConfig; - - using var archive = new OpenXmlZip(stream); - using var reader = await OpenXmlReader.CreateAsync(stream, config, cancellationToken: cancellationToken).ConfigureAwait(false); - var rels = await reader.GetWorkbookRelsAsync(archive.EntryCollection, cancellationToken).ConfigureAwait(false); - - return rels?.Select((s, i) => s.ToSheetInfo((uint)i)).ToList() ?? []; - } - - [CreateSyncVersion] - public static async Task> GetSheetDimensionsAsync(string path, CancellationToken cancellationToken = default) - { - using var stream = FileHelper.OpenSharedRead(path); - return await GetSheetDimensionsAsync(stream, cancellationToken).ConfigureAwait(false); - } - - [CreateSyncVersion] - public static async Task> GetSheetDimensionsAsync(Stream stream, CancellationToken cancellationToken = default) - { - using var reader = await OpenXmlReader.CreateAsync(stream, null, cancellationToken: cancellationToken).ConfigureAwait(false); - return await reader.GetDimensionsAsync(cancellationToken).ConfigureAwait(false); - } - - [CreateSyncVersion] - public static async Task> GetXlsxColumnsAsync(string path, bool useHeaderRow = false, - string? sheetName = null, string startCell = "A1", OpenXmlConfiguration? configuration = null, - CancellationToken cancellationToken = default) - { - using var stream = FileHelper.OpenSharedRead(path); - return await GetXlsxColumnsAsync(stream, useHeaderRow, sheetName, startCell, configuration, cancellationToken).ConfigureAwait(false); - } - - [CreateSyncVersion] - public static async Task> GetXlsxColumnsAsync(Stream stream, bool useHeaderRow = false, - string? sheetName = null, string startCell = "A1", OpenXmlConfiguration? configuration = null, - CancellationToken cancellationToken = default) - { -#pragma warning disable CA2007 // Consider calling ConfigureAwait on the awaited task - await using var enumerator = QueryXlsxAsync(stream, useHeaderRow, sheetName, startCell, configuration, cancellationToken).GetAsyncEnumerator(cancellationToken); -#pragma warning restore CA2007 // Consider calling ConfigureAwait on the awaited task - - _ = enumerator.ConfigureAwait(false); - if (await enumerator.MoveNextAsync().ConfigureAwait(false)) - { - return (enumerator.Current as IDictionary)?.Keys ?? []; - } - - return []; - } - - #endregion - - #region DataReader - - public static MiniExcelDataReader GetXlsxDataReader(string path, bool useHeaderRow = false, - string? sheetName = null, string startCell = "A1", OpenXmlConfiguration? configuration = null) - { - var stream = FileHelper.OpenSharedRead(path); - var values = QueryXlsx(stream, useHeaderRow, sheetName, startCell, configuration).Cast>(); - - return new MiniExcelDataReader(stream, values); - } - - public static MiniExcelDataReader GetXlsxDataReader(Stream stream, bool useHeaderRow = false, - string? sheetName = null, string startCell = "A1", OpenXmlConfiguration? configuration = null) - { - var values = QueryXlsx(stream, useHeaderRow, sheetName, startCell, configuration).Cast>(); - return new MiniExcelDataReader(stream, values); - } - - #endregion - } -} \ No newline at end of file diff --git a/src/MiniExcel/MiniExcel.cs b/src/MiniExcel/MiniExcel.cs index f47fce55..1367bcd8 100644 --- a/src/MiniExcel/MiniExcel.cs +++ b/src/MiniExcel/MiniExcel.cs @@ -1,29 +1,10 @@ -using System.Dynamic; -using MiniExcelLib.Core.OpenXml; -using MiniExcelLib.Core.OpenXml.Templates; +using MiniExcelLib.Core; namespace MiniExcelLib; -public static partial class MiniExcel +public static class MiniExcel { - public static partial class Exporter; - - public static partial class Importer - { - private static IDictionary GetNewExpandoObject() => new ExpandoObject(); - private static IDictionary AddPairToDict(IDictionary dict, KeyValuePair pair) - { - dict.Add(pair); - return dict; - } - } - - public static partial class Templater - { - private static OpenXmlTemplate GetOpenXmlTemplate(Stream stream, OpenXmlConfiguration? configuration) - { - var valueExtractor = new OpenXmlValueExtractor(); - return new OpenXmlTemplate(stream, configuration, valueExtractor); - } - } + public static MiniExcelExporter GetExporter() => new(); + public static MiniExcelImporter GetImporter() => new(); + public static MiniExcelTemplater GetTemplater() => new(); } \ No newline at end of file diff --git a/src/MiniExcel/MiniExcel.csproj b/src/MiniExcel/MiniExcel.csproj index b5ccf6b4..11b6187c 100644 --- a/src/MiniExcel/MiniExcel.csproj +++ b/src/MiniExcel/MiniExcel.csproj @@ -2,8 +2,6 @@ MiniExcelLib - True - ..\miniexcel.snk @@ -34,8 +32,8 @@ - - + + diff --git a/src/MiniExcel/Templater/MiniExcelTemplater.OpenXml.cs b/src/MiniExcel/Templater/MiniExcelTemplater.OpenXml.cs deleted file mode 100644 index 7f216f6e..00000000 --- a/src/MiniExcel/Templater/MiniExcelTemplater.OpenXml.cs +++ /dev/null @@ -1,70 +0,0 @@ -using MiniExcelLib.Core.OpenXml; -using Zomp.SyncMethodGenerator; - -namespace MiniExcelLib; - -public static partial class MiniExcel -{ - public static partial class Templater - { - [CreateSyncVersion] - public static async Task ApplyXlsxTemplateAsync(string path, string templatePath, object value, - OpenXmlConfiguration? configuration = null, CancellationToken cancellationToken = default) - { - using var stream = File.Create(path); - await ApplyXlsxTemplateAsync(stream, templatePath, value, configuration, cancellationToken).ConfigureAwait(false); - } - - [CreateSyncVersion] - public static async Task ApplyXlsxTemplateAsync(string path, byte[] templateBytes, object value, - OpenXmlConfiguration? configuration = null, CancellationToken cancellationToken = default) - { - using var stream = File.Create(path); - await ApplyXlsxTemplateAsync(stream, templateBytes, value, configuration, cancellationToken).ConfigureAwait(false); - } - - [CreateSyncVersion] - public static async Task ApplyXlsxTemplateAsync(Stream stream, string templatePath, object value, - OpenXmlConfiguration? configuration = null, CancellationToken cancellationToken = default) - { - var template = GetOpenXmlTemplate(stream, configuration); - await template.SaveAsByTemplateAsync(templatePath, value, cancellationToken).ConfigureAwait(false); - } - - [CreateSyncVersion] - public static async Task ApplyXlsxTemplateAsync(Stream stream, byte[] templateBytes, object value, - OpenXmlConfiguration? configuration = null, CancellationToken cancellationToken = default) - { - var template = GetOpenXmlTemplate(stream, configuration); - await template.SaveAsByTemplateAsync(templateBytes, value, cancellationToken).ConfigureAwait(false); - } - - #region Merge Cells - - [CreateSyncVersion] - public static async Task MergeSameCellsAsync(string mergedFilePath, string path, - OpenXmlConfiguration? configuration = null, CancellationToken cancellationToken = default) - { - using var stream = File.Create(mergedFilePath); - await MergeSameCellsAsync(stream, path, configuration, cancellationToken).ConfigureAwait(false); - } - - [CreateSyncVersion] - public static async Task MergeSameCellsAsync(Stream stream, string path, - OpenXmlConfiguration? configuration = null, CancellationToken cancellationToken = default) - { - var template = GetOpenXmlTemplate(stream, configuration); - await template.MergeSameCellsAsync(path, cancellationToken).ConfigureAwait(false); - } - - [CreateSyncVersion] - public static async Task MergeSameCellsAsync(Stream stream, byte[] file, - OpenXmlConfiguration? configuration = null, CancellationToken cancellationToken = default) - { - var template = GetOpenXmlTemplate(stream, configuration); - await template.MergeSameCellsAsync(file, cancellationToken).ConfigureAwait(false); - } - - #endregion - } -} \ No newline at end of file diff --git a/src/MiniExcelLib.Core/MiniExcelLib.Core.csproj b/src/MiniExcelLib.Core/MiniExcelLib.Core.csproj deleted file mode 100644 index 27661dac..00000000 --- a/src/MiniExcelLib.Core/MiniExcelLib.Core.csproj +++ /dev/null @@ -1,12 +0,0 @@ - - - - True - ..\miniexcel.snk - - - - - - - diff --git a/src/MiniExcelLib.Csv/MiniExcelLib.Csv.csproj b/src/MiniExcelLib.Csv/MiniExcelLib.Csv.csproj deleted file mode 100644 index 08bdccb4..00000000 --- a/src/MiniExcelLib.Csv/MiniExcelLib.Csv.csproj +++ /dev/null @@ -1,15 +0,0 @@ - - - - True - ..\miniexcel.snk - - - - - - - - - - diff --git a/tests/MiniExcelTests/MiniExcelAutoAdjustWidthTests.cs b/tests/MiniExcelTests/MiniExcelAutoAdjustWidthTests.cs index 99585b29..55eaee4a 100644 --- a/tests/MiniExcelTests/MiniExcelAutoAdjustWidthTests.cs +++ b/tests/MiniExcelTests/MiniExcelAutoAdjustWidthTests.cs @@ -2,23 +2,25 @@ using System.Data.SQLite; using DocumentFormat.OpenXml.Packaging; using DocumentFormat.OpenXml.Spreadsheet; +using MiniExcelLib.Core; using MiniExcelLib.Core.OpenXml; using MiniExcelLib.Core.OpenXml.Models; using MiniExcelLib.Tests.Utils; -using Exporter = MiniExcelLib.MiniExcel.Exporter; using Xunit; namespace MiniExcelLib.Tests; public class MiniExcelAutoAdjustWidthTests { + private readonly MiniExcelExporter _exporter = MiniExcel.GetExporter(); + [Fact] public async Task AutoAdjustWidthThrowsExceptionWithoutFastMode_Async() { using var file = AutoDeletingPath.Create(); var path = file.ToString(); - await Assert.ThrowsAsync(() => Exporter.ExportXlsxAsync(path, AutoAdjustTestParameters.GetDictionaryTestData(), configuration: new OpenXmlConfiguration + await Assert.ThrowsAsync(() => _exporter.ExportXlsxAsync(path, AutoAdjustTestParameters.GetDictionaryTestData(), configuration: new OpenXmlConfiguration { EnableAutoWidth = true, })); @@ -30,7 +32,7 @@ public void AutoAdjustWidthThrowsExceptionWithoutFastMode() using var file = AutoDeletingPath.Create(); var path = file.ToString(); - Assert.Throws(() => Exporter.ExportXlsx(path, AutoAdjustTestParameters.GetDictionaryTestData(), configuration: new OpenXmlConfiguration + Assert.Throws(() => _exporter.ExportXlsx(path, AutoAdjustTestParameters.GetDictionaryTestData(), configuration: new OpenXmlConfiguration { EnableAutoWidth = true, })); @@ -43,7 +45,7 @@ public async Task AutoAdjustWidthEnumerable_Async() var path = file.ToString(); var configuration = AutoAdjustTestParameters.GetConfiguration(); - await Exporter.ExportXlsxAsync(path, AutoAdjustTestParameters.GetDictionaryTestData(), configuration: configuration); + await _exporter.ExportXlsxAsync(path, AutoAdjustTestParameters.GetDictionaryTestData(), configuration: configuration); AssertExpectedWidth(path, configuration); } @@ -55,7 +57,7 @@ public void AutoAdjustWidthEnumerable() var path = file.ToString(); var configuration = AutoAdjustTestParameters.GetConfiguration(); - Exporter.ExportXlsx(path, AutoAdjustTestParameters.GetDictionaryTestData(), configuration: configuration); + _exporter.ExportXlsx(path, AutoAdjustTestParameters.GetDictionaryTestData(), configuration: configuration); AssertExpectedWidth(path, configuration); } @@ -73,7 +75,7 @@ public async Task AutoAdjustWidthDataReader_Async() await using var command = new SQLiteCommand(Db.GenerateDummyQuery(AutoAdjustTestParameters.GetDictionaryTestData()), connection); connection.Open(); await using var reader = command.ExecuteReader(); - await Exporter.ExportXlsxAsync(path, reader, configuration: configuration); + await _exporter.ExportXlsxAsync(path, reader, configuration: configuration); } AssertExpectedWidth(path, configuration); @@ -92,7 +94,7 @@ public void AutoAdjustWidthDataReader() using var command = new SQLiteCommand(Db.GenerateDummyQuery(AutoAdjustTestParameters.GetDictionaryTestData()), connection); connection.Open(); using var reader = command.ExecuteReader(); - Exporter.ExportXlsx(path, reader, configuration: configuration); + _exporter.ExportXlsx(path, reader, configuration: configuration); } AssertExpectedWidth(path, configuration); @@ -117,7 +119,7 @@ public async Task AutoAdjustWidthDataTable_Async() } var configuration = AutoAdjustTestParameters.GetConfiguration(); - await Exporter.ExportXlsxAsync(path, table, configuration: configuration); + await _exporter.ExportXlsxAsync(path, table, configuration: configuration); AssertExpectedWidth(path, configuration); } @@ -140,7 +142,7 @@ public void AutoAdjustWidthDataTable() } var configuration = AutoAdjustTestParameters.GetConfiguration(); - Exporter.ExportXlsx(path, table, configuration: configuration); + _exporter.ExportXlsx(path, table, configuration: configuration); AssertExpectedWidth(path, configuration); } diff --git a/tests/MiniExcelTests/MiniExcelCsvAsycTests.cs b/tests/MiniExcelTests/MiniExcelCsvAsycTests.cs index f42807f1..4cbff294 100644 --- a/tests/MiniExcelTests/MiniExcelCsvAsycTests.cs +++ b/tests/MiniExcelTests/MiniExcelCsvAsycTests.cs @@ -1,17 +1,20 @@ using System.Data; using System.Globalization; using System.Text; +using MiniExcelLib.Core; using MiniExcelLib.Csv; +using MiniExcelLib.Csv.MiniExcelExtensions; using MiniExcelLib.Tests.Utils; using Xunit; -using Importer = MiniExcelLib.MiniExcel.Importer; -using Exporter = MiniExcelLib.MiniExcel.Exporter; using CsvReader = CsvHelper.CsvReader; namespace MiniExcelLib.Tests; public class MiniExcelCsvAsycTests { + private readonly MiniExcelImporter _importer = MiniExcel.GetImporter(); + private readonly MiniExcelExporter _exporter = MiniExcel.GetExporter(); + [Fact] public async Task Gb2312_Encoding_Read_Test() { @@ -21,7 +24,7 @@ public async Task Gb2312_Encoding_Read_Test() { StreamReaderFunc = stream => new StreamReader(stream, encoding: Encoding.GetEncoding("gb2312")) }; - var q = Importer.QueryCsvAsync(path, true, configuration: config).ToBlockingEnumerable(); + var q = _importer.QueryCsvAsync(path, true, configuration: config).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal("世界你好", rows[0].栏位1); } @@ -51,7 +54,7 @@ public async Task SeperatorTest() } ]; - var rowsWritten = await Exporter.ExportCsvAsync(path, values, configuration: new CsvConfiguration { Seperator = ';' }); + var rowsWritten = await _exporter.ExportCsvAsync(path, values, configuration: new CsvConfiguration { Seperator = ';' }); Assert.Equal(2, rowsWritten[0]); const string expected = @@ -73,7 +76,7 @@ public async Task SaveAsByDictionary() var path = file.ToString(); var table = new List>(); - await Exporter.ExportCsvAsync(path, table); + await _exporter.ExportCsvAsync(path, table); Assert.Equal("\r\n", await File.ReadAllTextAsync(path)); } @@ -82,7 +85,7 @@ public async Task SaveAsByDictionary() var path = file.ToString(); var table = new Dictionary(); //TODO - Assert.Throws(() => Exporter.ExportCsv(path, table)); + Assert.Throws(() => _exporter.ExportCsv(path, table)); } { @@ -106,7 +109,7 @@ public async Task SaveAsByDictionary() { "d", new DateTime(2021, 1, 2) } } ]; - var rowsWritten = await Exporter.ExportCsvAsync(path, values); + var rowsWritten = await _exporter.ExportCsvAsync(path, values); Assert.Equal(2, rowsWritten[0]); using var reader = new StreamReader(path); @@ -147,7 +150,7 @@ public async Task SaveAsByDictionary() } ]; - var rowsWritten = await Exporter.ExportCsvAsync(path, values); + var rowsWritten = await _exporter.ExportCsvAsync(path, values); Assert.Equal(2, rowsWritten[0]); using var reader = new StreamReader(path); @@ -175,7 +178,7 @@ public async Task SaveAsByDataTableTest() var path1 = file1.ToString(); var emptyTable = new DataTable(); - await Exporter.ExportCsvAsync(path1, emptyTable); + await _exporter.ExportCsvAsync(path1, emptyTable); var text = await File.ReadAllTextAsync(path1); Assert.Equal("\r\n", text); @@ -192,7 +195,7 @@ public async Task SaveAsByDataTableTest() table.Rows.Add(@"""<>+-*//}{\\n", 1234567890, true, new DateTime(2021, 1, 1)); table.Rows.Add("Hello World", -1234567890, false, new DateTime(2021, 1, 2)); - var rowsWritten = await Exporter.ExportCsvAsync(path2, table); + var rowsWritten = await _exporter.ExportCsvAsync(path2, table); Assert.Equal(2, rowsWritten[0]); using var reader = new StreamReader(path2); @@ -224,13 +227,13 @@ public async Task CsvExcelTypeTest() var path = file.ToString(); var input = new[] { new { A = "Test1", B = "Test2" } }; - await Exporter.ExportCsvAsync(path, input); + await _exporter.ExportCsvAsync(path, input); var texts = await File.ReadAllLinesAsync(path); Assert.Equal("A,B", texts[0]); Assert.Equal("Test1,Test2", texts[1]); - var q = Importer.QueryCsvAsync(path).ToBlockingEnumerable(); + var q = _importer.QueryCsvAsync(path).ToBlockingEnumerable(); var rows1 = q.ToList(); Assert.Equal("A", rows1[0].A); @@ -252,7 +255,7 @@ public async Task Create2x2_Test() using var file = AutoDeletingPath.Create(ExcelType.Csv); var path = file.ToString(); - await Exporter.ExportCsvAsync(path, new[] + await _exporter.ExportCsvAsync(path, new[] { new { c1 = "A1", c2 = "B1"}, new { c1 = "A2", c2 = "B2"}, @@ -260,7 +263,7 @@ await Exporter.ExportCsvAsync(path, new[] await using (var stream = File.OpenRead(path)) { - var rows = Importer.QueryCsvAsync(stream, useHeaderRow: true).ToBlockingEnumerable().ToList(); + var rows = _importer.QueryCsvAsync(stream, useHeaderRow: true).ToBlockingEnumerable().ToList(); Assert.Equal("A1", rows[0].c1); Assert.Equal("B1", rows[0].c2); Assert.Equal("A2", rows[1].c1); @@ -268,7 +271,7 @@ await Exporter.ExportCsvAsync(path, new[] } { - var rows = Importer.QueryCsvAsync(path, useHeaderRow: true).ToBlockingEnumerable().ToList(); + var rows = _importer.QueryCsvAsync(path, useHeaderRow: true).ToBlockingEnumerable().ToList(); Assert.Equal("A1", rows[0].c1); Assert.Equal("B1", rows[0].c2); Assert.Equal("A2", rows[1].c1); @@ -282,7 +285,7 @@ public async Task CsvTypeMappingTest() using var file = AutoDeletingPath.Create(ExcelType.Csv); var path = file.ToString(); - await Exporter.ExportCsvAsync(path, new[] + await _exporter.ExportCsvAsync(path, new[] { new { c1 = "A1", c2 = "B1"}, new { c1 = "A2", c2 = "B2"} @@ -290,7 +293,7 @@ await Exporter.ExportCsvAsync(path, new[] await using (var stream = File.OpenRead(path)) { - var rows = Importer.QueryCsv(stream).ToList(); + var rows = _importer.QueryCsv(stream).ToList(); Assert.Equal("A1", rows[0].c1); Assert.Equal("B1", rows[0].c2); Assert.Equal("A2", rows[1].c1); @@ -298,7 +301,7 @@ await Exporter.ExportCsvAsync(path, new[] } { - var rows = Importer.QueryCsv(path).ToList(); + var rows = _importer.QueryCsv(path).ToList(); Assert.Equal("A1", rows[0].c1); Assert.Equal("B1", rows[0].c2); Assert.Equal("A2", rows[1].c1); @@ -312,7 +315,7 @@ public async Task CsvReadEmptyStringAsNullTest() using var file = AutoDeletingPath.Create(ExcelType.Csv); var path = file.ToString(); - await Exporter.ExportCsvAsync(path, new[] + await _exporter.ExportCsvAsync(path, new[] { new { c1 = (string?)"A1", c2 = (string?)null}, new { c1 = (string?)null, c2 = (string?)null} @@ -320,7 +323,7 @@ await Exporter.ExportCsvAsync(path, new[] await using (var stream = File.OpenRead(path)) { - var rows = Importer.QueryCsv(stream).ToList(); + var rows = _importer.QueryCsv(stream).ToList(); Assert.Equal("A1", rows[0].c1); Assert.Equal(string.Empty, rows[0].c2); Assert.Equal(string.Empty, rows[1].c1); @@ -328,7 +331,7 @@ await Exporter.ExportCsvAsync(path, new[] } { - var rows = Importer.QueryCsv(path).ToList(); + var rows = _importer.QueryCsv(path).ToList(); Assert.Equal("A1", rows[0].c1); Assert.Equal(string.Empty, rows[0].c2); Assert.Equal(string.Empty, rows[1].c1); @@ -338,7 +341,7 @@ await Exporter.ExportCsvAsync(path, new[] var config = new CsvConfiguration { ReadEmptyStringAsNull = true }; await using (var stream = File.OpenRead(path)) { - var rows = Importer.QueryCsv(stream, configuration: config).ToList(); + var rows = _importer.QueryCsv(stream, configuration: config).ToList(); Assert.Equal("A1", rows[0].c1); Assert.Null(rows[0].c2); Assert.Null(rows[1].c1); @@ -346,7 +349,7 @@ await Exporter.ExportCsvAsync(path, new[] } { - var rows = Importer.QueryCsv(path, configuration: config).ToList(); + var rows = _importer.QueryCsv(path, configuration: config).ToList(); Assert.Equal("A1", rows[0].c1); Assert.Null(rows[0].c2); Assert.Null(rows[1].c1); @@ -368,10 +371,10 @@ static async IAsyncEnumerable GetValues() } #pragma warning restore CS1998 // Async method lacks 'await' operators and will run synchronously - var rowsWritten = await Exporter.ExportCsvAsync(path, GetValues()); + var rowsWritten = await _exporter.ExportCsvAsync(path, GetValues()); Assert.Equal(2, rowsWritten[0]); - var results = Importer.QueryCsv(path).ToList(); + var results = _importer.QueryCsv(path).ToList(); Assert.Equal(2, results.Count); Assert.Equal("A1", results[0].c1); Assert.Equal("B1", results[0].c2); diff --git a/tests/MiniExcelTests/MiniExcelCsvTests.cs b/tests/MiniExcelTests/MiniExcelCsvTests.cs index 274e4687..14eca59e 100644 --- a/tests/MiniExcelTests/MiniExcelCsvTests.cs +++ b/tests/MiniExcelTests/MiniExcelCsvTests.cs @@ -2,18 +2,21 @@ using System.Globalization; using System.Text; using CsvHelper; +using MiniExcelLib.Core; using MiniExcelLib.Core.Attributes; using MiniExcelLib.Core.Exceptions; using MiniExcelLib.Csv; +using MiniExcelLib.Csv.MiniExcelExtensions; using MiniExcelLib.Tests.Utils; -using Importer = MiniExcelLib.MiniExcel.Importer; -using Exporter = MiniExcelLib.MiniExcel.Exporter; using Xunit; namespace MiniExcelLib.Tests; public class MiniExcelCsvTests { + private readonly MiniExcelImporter _importer = MiniExcel.GetImporter(); + private readonly MiniExcelExporter _exporter = MiniExcel.GetExporter(); + [Fact] public void gb2312_Encoding_Read_Test() { @@ -23,7 +26,7 @@ public void gb2312_Encoding_Read_Test() { StreamReaderFunc = stream => new StreamReader(stream, encoding: Encoding.GetEncoding("gb2312")) }; - var rows = Importer.QueryCsv(path, true, configuration: config).ToList(); + var rows = _importer.QueryCsv(path, true, configuration: config).ToList(); Assert.Equal("世界你好", rows[0].栏位1); } @@ -51,7 +54,7 @@ public void SeperatorTest() { "d", new DateTime(2021, 1, 2) } } ]; - var rowsWritten = Exporter.ExportCsv(path, values, configuration: new CsvConfiguration { Seperator = ';' }); + var rowsWritten = _exporter.ExportCsv(path, values, configuration: new CsvConfiguration { Seperator = ';' }); Assert.Equal(2, rowsWritten[0]); const string expected = @@ -88,7 +91,7 @@ public void DontQuoteWhitespacesTest() { "d", new DateTime(2021, 1, 2) } } ]; - var rowsWritten = Exporter.ExportCsv(path, values, configuration: new CsvConfiguration { QuoteWhitespaces = false }); + var rowsWritten = _exporter.ExportCsv(path, values, configuration: new CsvConfiguration { QuoteWhitespaces = false }); Assert.Equal(2, rowsWritten[0]); const string expected = @@ -125,7 +128,7 @@ public void AlwaysQuoteTest() } ]; - Exporter.ExportCsv(path, values, configuration: new CsvConfiguration { AlwaysQuote = true }); + _exporter.ExportCsv(path, values, configuration: new CsvConfiguration { AlwaysQuote = true }); const string expected = """" "a","b","c","d" @@ -153,7 +156,7 @@ public void QuoteSpecialCharacters() } ]; - var rowsWritten = Exporter.ExportCsv(path, values, configuration: new CsvConfiguration()); + var rowsWritten = _exporter.ExportCsv(path, values, configuration: new CsvConfiguration()); Assert.Equal(1, rowsWritten[0]); const string expected = "a,b,c,d\r\n\"potato,banana\",\"text\ntest\",\"text\rpotato\",\"2021-01-01 00:00:00\"\r\n"; @@ -166,7 +169,7 @@ public void SaveAsByDictionary() { using var path = AutoDeletingPath.Create(ExcelType.Csv); var table = new List>(); - Exporter.ExportCsv(path.ToString(), table); + _exporter.ExportCsv(path.ToString(), table); Assert.Equal("\r\n", File.ReadAllText(path.ToString())); } @@ -174,7 +177,7 @@ public void SaveAsByDictionary() using var path = AutoDeletingPath.Create(ExcelType.Csv); var table = new Dictionary(); //TODO - Assert.Throws(() => Exporter.ExportCsv(path.ToString(), table)); + Assert.Throws(() => _exporter.ExportCsv(path.ToString(), table)); } { @@ -198,7 +201,7 @@ public void SaveAsByDictionary() } ]; - var rowsWritten = Exporter.ExportCsv(path.ToString(), values); + var rowsWritten = _exporter.ExportCsv(path.ToString(), values); Assert.Equal(2, rowsWritten[0]); using var reader = new StreamReader(path.ToString()); @@ -235,7 +238,7 @@ public void SaveAsByDictionary() { 4, new DateTime(2021, 1, 2) } } ]; - Exporter.ExportCsv(path.ToString(), values); + _exporter.ExportCsv(path.ToString(), values); using (var reader = new StreamReader(path.ToString())) using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture)) @@ -266,7 +269,7 @@ public void SaveAsByDataTableTest() using var path = AutoDeletingPath.Create(ExcelType.Csv); var table = new DataTable(); - Exporter.ExportCsv(path.ToString(), table); + _exporter.ExportCsv(path.ToString(), table); var text = File.ReadAllText(path.ToString()); Assert.Equal("\r\n", text); @@ -285,7 +288,7 @@ public void SaveAsByDataTableTest() table.Rows.Add("Hello World", -1234567890, false, new DateTime(2021, 1, 2)); } - var rowsWritten = Exporter.ExportCsv(path.ToString(), table); + var rowsWritten = _exporter.ExportCsv(path.ToString(), table); Assert.Equal(2, rowsWritten[0]); using (var reader = new StreamReader(path.ToString())) @@ -327,13 +330,13 @@ public void CsvExcelTypeTest() var path = file.ToString(); var input = new[] { new { A = "Test1", B = "Test2" } }; - Exporter.ExportCsv(path, input); + _exporter.ExportCsv(path, input); var texts = File.ReadAllLines(path); Assert.Equal("A,B", texts[0]); Assert.Equal("Test1,Test2", texts[1]); - var rows = Importer.QueryCsv(path).ToList(); + var rows = _importer.QueryCsv(path).ToList(); Assert.Equal("A", rows[0].A); Assert.Equal("B", rows[0].B); Assert.Equal("Test1", rows[1].A); @@ -352,7 +355,7 @@ public void Create2x2_Test() using var file = AutoDeletingPath.Create(ExcelType.Csv); var path = file.ToString(); - Exporter.ExportCsv(path, new[] + _exporter.ExportCsv(path, new[] { new { c1 = "A1", c2 = "B1"}, new { c1 = "A2", c2 = "B2"}, @@ -362,7 +365,7 @@ public void Create2x2_Test() using (var stream = File.OpenRead(path)) { - var rows = Importer.QueryCsv(stream, useHeaderRow: true).ToList(); + var rows = _importer.QueryCsv(stream, useHeaderRow: true).ToList(); Assert.Equal("A1", rows[0].c1); Assert.Equal("B1", rows[0].c2); Assert.Equal("A2", rows[1].c1); @@ -370,7 +373,7 @@ public void Create2x2_Test() } { - var rows = Importer.QueryCsv(path, useHeaderRow: true).ToList(); + var rows = _importer.QueryCsv(path, useHeaderRow: true).ToList(); Assert.Equal("A1", rows[0].c1); Assert.Equal("B1", rows[0].c2); Assert.Equal("A2", rows[1].c1); @@ -384,7 +387,7 @@ public void CsvTypeMappingTest() using var file = AutoDeletingPath.Create(ExcelType.Csv); var path = file.ToString(); - Exporter.ExportCsv(path, new[] + _exporter.ExportCsv(path, new[] { new { c1 = "A1", c2 = "B1"}, new { c1 = "A2", c2 = "B2"}, @@ -392,7 +395,7 @@ public void CsvTypeMappingTest() using (var stream = File.OpenRead(path)) { - var rows = Importer.QueryCsv(stream).ToList(); + var rows = _importer.QueryCsv(stream).ToList(); Assert.Equal("A1", rows[0].c1); Assert.Equal("B1", rows[0].c2); Assert.Equal("A2", rows[1].c1); @@ -400,7 +403,7 @@ public void CsvTypeMappingTest() } { - var rows = Importer.QueryCsv(path).ToList(); + var rows = _importer.QueryCsv(path).ToList(); Assert.Equal("A1", rows[0].c1); Assert.Equal("B1", rows[0].c2); Assert.Equal("A2", rows[1].c1); @@ -418,7 +421,7 @@ public void CsvColumnNotFoundTest() using (var stream = File.OpenRead(path)) { - var exception = Assert.Throws(() => Importer.QueryCsv(stream).ToList()); + var exception = Assert.Throws(() => _importer.QueryCsv(stream).ToList()); Assert.Equal("c2", exception.ColumnName); Assert.Equal(2, exception.RowIndex); @@ -428,7 +431,7 @@ public void CsvColumnNotFoundTest() } { - var exception = Assert.Throws(() => Importer.QueryCsv(path).ToList()); + var exception = Assert.Throws(() => _importer.QueryCsv(path).ToList()); Assert.Equal("c2", exception.ColumnName); Assert.Equal(2, exception.RowIndex); @@ -447,7 +450,7 @@ public void CsvColumnNotFoundWithAliasTest() File.WriteAllLines(path, ["col1,col2", "v1"]); using (var stream = File.OpenRead(path)) { - var exception = Assert.Throws(() => Importer.QueryCsv(stream).ToList()); + var exception = Assert.Throws(() => _importer.QueryCsv(stream).ToList()); Assert.Equal("c2", exception.ColumnName); Assert.Equal(2, exception.RowIndex); @@ -457,7 +460,7 @@ public void CsvColumnNotFoundWithAliasTest() } { - var exception = Assert.Throws(() => Importer.QueryCsv(path).ToList()); + var exception = Assert.Throws(() => _importer.QueryCsv(path).ToList()); Assert.Equal("c2", exception.ColumnName); Assert.Equal(2, exception.RowIndex); @@ -504,7 +507,7 @@ private static string MiniExcelGenerateCsv(string value) using (var stream = File.Create(path)) { IEnumerable records = [new { v1 = value, v2 = value }]; - var rowsWritten = Exporter.ExportCsv(stream, records); + var rowsWritten = MiniExcel.GetExporter().ExportCsv(stream, records); Assert.Equal(1, rowsWritten[0]); } @@ -525,7 +528,7 @@ public async Task InsertCsvTest() new { ID=1,Name ="Jack",InDate=new DateTime(2021,01,03)}, new { ID=2,Name ="Henry",InDate=new DateTime(2020,05,03)}, }; - await Exporter.ExportCsvAsync(path, value); + await _exporter.ExportCsvAsync(path, value); var content = await File.ReadAllTextAsync(path); Assert.Equal( """ @@ -537,7 +540,7 @@ public async Task InsertCsvTest() } { var value = new { ID = 3, Name = "Mike", InDate = new DateTime(2021, 04, 23) }; - await Exporter.AppendToCsvAsync(path, value); + await _exporter.AppendToCsvAsync(path, value); var content = await File.ReadAllTextAsync(path); Assert.Equal( """ @@ -555,7 +558,7 @@ public async Task InsertCsvTest() new { ID=5,Name ="Gloria",InDate=new DateTime(2022,05,03)}, }; - await Exporter.AppendToCsvAsync(path, value); + await _exporter.AppendToCsvAsync(path, value); var content = await File.ReadAllTextAsync(path); Assert.Equal( """ diff --git a/tests/MiniExcelTests/MiniExcelIssueAsyncTests.cs b/tests/MiniExcelTests/MiniExcelIssueAsyncTests.cs index 22cd870c..c537b067 100644 --- a/tests/MiniExcelTests/MiniExcelIssueAsyncTests.cs +++ b/tests/MiniExcelTests/MiniExcelIssueAsyncTests.cs @@ -3,13 +3,12 @@ using System.Globalization; using System.Text; using Dapper; +using MiniExcelLib.Core; using MiniExcelLib.Core.Attributes; using MiniExcelLib.Core.OpenXml; using MiniExcelLib.Csv; +using MiniExcelLib.Csv.MiniExcelExtensions; using MiniExcelLib.Tests.Utils; -using Importer = MiniExcelLib.MiniExcel.Importer; -using Exporter = MiniExcelLib.MiniExcel.Exporter; -using Templater = MiniExcelLib.MiniExcel.Templater; using Newtonsoft.Json; using OfficeOpenXml; using Xunit; @@ -21,6 +20,10 @@ public class MiniExcelIssueAsyncTests(ITestOutputHelper output) { private readonly ITestOutputHelper _output = output; + private readonly MiniExcelImporter _importer = MiniExcel.GetImporter(); + private readonly MiniExcelExporter _exporter = MiniExcel.GetExporter(); + private readonly MiniExcelTemplater _templater = MiniExcel.GetTemplater(); + /// /// [SaveAsByTemplate support DateTime custom format · Issue #255 · mini-software/MiniExcel] /// (https://github.com/mini-software/MiniExcel/issues/255) @@ -40,8 +43,8 @@ public async Task Issue255() } }; - await Templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); - var q = Importer.QueryXlsxAsync(path.ToString()).ToBlockingEnumerable(); + await _templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); + var q = _importer.QueryXlsxAsync(path.ToString()).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal("2021", rows[1].A.ToString()); @@ -58,11 +61,11 @@ public async Task Issue255() Time2 = new DateTime(2021, 01, 01) } }; - var rowsWritten = await Exporter.ExportXlsxAsync(path.ToString(), value); + var rowsWritten = await _exporter.ExportXlsxAsync(path.ToString(), value); Assert.Single(rowsWritten); Assert.Equal(1, rowsWritten[0]); - var q = Importer.QueryXlsxAsync(path.ToString()).ToBlockingEnumerable(); + var q = _importer.QueryXlsxAsync(path.ToString()).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal("2021", rows[1].A.ToString()); Assert.Equal("2021", rows[1].B.ToString()); @@ -86,7 +89,7 @@ private class Issue255DTO public async Task Issue256() { var path = PathHelper.GetFile("xlsx/TestIssue256.xlsx"); - var q = Importer.QueryXlsxAsync(path, false).ToBlockingEnumerable(); + var q = _importer.QueryXlsxAsync(path, false).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal(new DateTime(2003, 4, 16), rows[1].A); @@ -104,7 +107,7 @@ public async Task Issue253() var value = new[] { new { col1 = "世界你好" } }; using var path = AutoDeletingPath.Create(ExcelType.Csv); - await Exporter.ExportCsvAsync(path.ToString(), value); + await _exporter.ExportCsvAsync(path.ToString(), value); const string expected = """ col1 @@ -125,7 +128,7 @@ public async Task Issue253() StreamWriterFunc = stream => new StreamWriter(stream, Encoding.GetEncoding("gb2312")) }; - await Exporter.ExportCsvAsync(path.ToString(), value, configuration: config); + await _exporter.ExportCsvAsync(path.ToString(), value, configuration: config); const string expected = """ col1 @@ -141,7 +144,7 @@ public async Task Issue253() { var value = await cn.ExecuteReaderAsync("select '世界你好' col1"); using var path = AutoDeletingPath.Create(ExcelType.Csv); - await Exporter.ExportCsvAsync(path.ToString(), value); + await _exporter.ExportCsvAsync(path.ToString(), value); const string expected = """ col1 @@ -163,7 +166,7 @@ public async Task Issue251() var reader = await cn.ExecuteReaderAsync(@"select '""<>+-*//}{\\n' a,1234567890 b union all select 'Hello World',-1234567890"); using var path = AutoDeletingPath.Create(ExcelType.Csv); - var rowsWritten = await Exporter.ExportCsvAsync(path.ToString(), reader); + var rowsWritten = await _exporter.ExportCsvAsync(path.ToString(), reader); Assert.Single(rowsWritten); Assert.Equal(2, rowsWritten[0]); @@ -186,10 +189,10 @@ public async Task Issue251() public async Task Issue242() { var path = PathHelper.GetFile("xls/TestIssue242.xls"); - Assert.Throws(() => _ = Importer.QueryXlsxAsync(path).ToBlockingEnumerable().ToList()); + Assert.Throws(() => _ = _importer.QueryXlsxAsync(path).ToBlockingEnumerable().ToList()); await using var stream = File.OpenRead(path); - Assert.Throws(() => _ = Importer.QueryXlsxAsync(stream).ToBlockingEnumerable().ToList()); + Assert.Throws(() => _ = _importer.QueryXlsxAsync(stream).ToBlockingEnumerable().ToList()); } /// @@ -205,11 +208,11 @@ public async Task Issue243() new { Name ="Henry",Age=36,InDate=new DateTime(2020,05,03)}, }; - var rowsWritten = await Exporter.ExportXlsxAsync(path.ToString(), value); + var rowsWritten = await _exporter.ExportXlsxAsync(path.ToString(), value); Assert.Single(rowsWritten); Assert.Equal(2, rowsWritten[0]); - var q = Importer.QueryXlsxAsync(path.ToString()).ToBlockingEnumerable(); + var q = _importer.QueryXlsxAsync(path.ToString()).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal("Jack", rows[0].Name); @@ -244,13 +247,13 @@ public async Task Issue241() { using var file = AutoDeletingPath.Create(ExcelType.Csv); var path = file.ToString(); - var rowsWritten = await Exporter.ExportXlsxAsync(path, value); + var rowsWritten = await _exporter.ExportXlsxAsync(path, value); Assert.Single(rowsWritten); Assert.Equal(2, rowsWritten[0]); { - var q = Importer.QueryXlsxAsync(path, true).ToBlockingEnumerable(); + var q = _importer.QueryXlsxAsync(path, true).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal(rows[0].InDate, "01 04, 2021"); @@ -258,7 +261,7 @@ public async Task Issue241() } { - var q = Importer.QueryXlsxAsync(path).ToBlockingEnumerable(); + var q = _importer.QueryXlsxAsync(path).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal(rows[0].InDate, new DateTime(2021, 01, 04)); @@ -270,13 +273,13 @@ public async Task Issue241() { using var file = AutoDeletingPath.Create(); var path = file.ToString(); - var rowsWritten = await Exporter.ExportXlsxAsync(path, value); + var rowsWritten = await _exporter.ExportXlsxAsync(path, value); Assert.Single(rowsWritten); Assert.Equal(2, rowsWritten[0]); { - var q = Importer.QueryXlsxAsync(path, true).ToBlockingEnumerable(); + var q = _importer.QueryXlsxAsync(path, true).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal(rows[0].InDate, "01 04, 2021"); @@ -284,7 +287,7 @@ public async Task Issue241() } { - var q = Importer.QueryXlsxAsync(path).ToBlockingEnumerable(); + var q = _importer.QueryXlsxAsync(path).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal(rows[0].InDate, new DateTime(2021, 01, 04)); @@ -315,7 +318,7 @@ public async Task Issue132() new { Name ="Henry", Age=36, InDate=new DateTime(2020,05,03)}, }; - await Exporter.ExportXlsxAsync(path.ToString(), value); + await _exporter.ExportXlsxAsync(path.ToString(), value); } { @@ -329,7 +332,7 @@ public async Task Issue132() { TableStyles = TableStyles.None }; - var rowsWritten = await Exporter.ExportXlsxAsync(path.ToString(), value, configuration: config); + var rowsWritten = await _exporter.ExportXlsxAsync(path.ToString(), value, configuration: config); Assert.Single(rowsWritten); Assert.Equal(2, rowsWritten[0]); @@ -344,7 +347,7 @@ public async Task Issue132() new { Name ="Henry", Age=36,InDate=new DateTime(2020,05,03)}, }) ); - var rowsWritten = await Exporter.ExportXlsxAsync(path.ToString(), value); + var rowsWritten = await _exporter.ExportXlsxAsync(path.ToString(), value); Assert.Single(rowsWritten); Assert.Equal(2, rowsWritten[0]); @@ -369,16 +372,16 @@ public async Task Issue235() department.TableName = "department"; sheets.Tables.Add(department); - var rowsWritten = await Exporter.ExportXlsxAsync(path, sheets); + var rowsWritten = await _exporter.ExportXlsxAsync(path, sheets); Assert.Equal(2, rowsWritten.Length); Assert.Equal(2, rowsWritten[0]); - var sheetNames = await Importer.GetSheetNamesAsync(path); + var sheetNames = await _importer.GetSheetNamesAsync(path); Assert.Equal("users", sheetNames[0]); Assert.Equal("department", sheetNames[1]); { - var q = Importer.QueryXlsxAsync(path, true, sheetName: "users").ToBlockingEnumerable(); + var q = _importer.QueryXlsxAsync(path, true, sheetName: "users").ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal("Jack", rows[0].Name); Assert.Equal(25, rows[0].Age); @@ -386,7 +389,7 @@ public async Task Issue235() Assert.Equal(44, rows[1].Age); } { - var q = Importer.QueryXlsxAsync(path, true, sheetName: "department").ToBlockingEnumerable(); + var q = _importer.QueryXlsxAsync(path, true, sheetName: "department").ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal("01", rows[0].ID); Assert.Equal("HR", rows[0].Name); @@ -404,7 +407,7 @@ public async Task Issue233() var path = PathHelper.GetFile("xlsx/TestIssue233.xlsx"); - var dt = await Importer.QueryXlsxAsDataTableAsync(path); + var dt = await _importer.QueryXlsxAsDataTableAsync(path); var rows = dt.Rows; @@ -426,9 +429,9 @@ public async Task Issue237() new{ id="\"\"1,2,3\"\""}, new{ id="1,2,3"}, }; - await Exporter.ExportXlsxAsync(path.ToString(), value); + await _exporter.ExportXlsxAsync(path.ToString(), value); - var q = Importer.QueryXlsxAsync(path.ToString(), true).ToBlockingEnumerable(); + var q = _importer.QueryXlsxAsync(path.ToString(), true).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal("\"\"1,2,3\"\"", rows[0].id); @@ -459,18 +462,18 @@ public async Task Issue234() ["users"] = users, ["department"] = department }; - var rowsWritten = await Exporter.ExportXlsxAsync(path, sheets); + var rowsWritten = await _exporter.ExportXlsxAsync(path, sheets); Assert.Equal(2, rowsWritten.Length); Assert.Equal(2, rowsWritten[0]); - var sheetNames = Importer.GetSheetNames(path); + var sheetNames = _importer.GetSheetNames(path); Assert.Equal("users", sheetNames[0]); Assert.Equal("department", sheetNames[1]); { - var q = Importer.QueryXlsxAsync(path, true, sheetName: "users").ToBlockingEnumerable(); + var q = _importer.QueryXlsxAsync(path, true, sheetName: "users").ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal("Jack", rows[0].Name); @@ -479,7 +482,7 @@ public async Task Issue234() Assert.Equal(44, rows[1].Age); } { - var q = Importer.QueryXlsxAsync(path, true, sheetName: "department").ToBlockingEnumerable(); + var q = _importer.QueryXlsxAsync(path, true, sheetName: "department").ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal("01", rows[0].ID); @@ -538,12 +541,12 @@ public async Task Issue230() await using (var reader = await cmd3.ExecuteReaderAsync(CommandBehavior.CloseConnection)) { using var path = AutoDeletingPath.Create(); - var rowsWritten = await Exporter.ExportXlsxAsync(path.ToString(), reader, printHeader: true); + var rowsWritten = await _exporter.ExportXlsxAsync(path.ToString(), reader, printHeader: true); Assert.Single(rowsWritten); Assert.Equal(2, rowsWritten[0]); - var q = Importer.QueryXlsxAsync(path.ToString(), true).ToBlockingEnumerable(); + var q = _importer.QueryXlsxAsync(path.ToString(), true).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal(1, rows[0].id); @@ -560,7 +563,7 @@ public async Task Issue229() { var path = PathHelper.GetFile("xlsx/TestIssue229.xlsx"); - var dt = await Importer.QueryXlsxAsDataTableAsync(path); + var dt = await _importer.QueryXlsxAsDataTableAsync(path); foreach (DataColumn column in dt.Columns) { @@ -582,7 +585,7 @@ public Task Issue122() }; var path1 = PathHelper.GetFile("xlsx/TestIssue122.xlsx"); - var rows1 = Importer.QueryXlsxAsync(path1, useHeaderRow: true, configuration: config).ToBlockingEnumerable().ToList(); + var rows1 = _importer.QueryXlsxAsync(path1, useHeaderRow: true, configuration: config).ToBlockingEnumerable().ToList(); Assert.Equal("HR", rows1[0].Department); Assert.Equal("HR", rows1[1].Department); @@ -592,7 +595,7 @@ public Task Issue122() Assert.Equal("IT", rows1[5].Department); var path2 = PathHelper.GetFile("xlsx/TestIssue122_2.xlsx"); - var rows2 = Importer.QueryXlsxAsync(path2, useHeaderRow: true, configuration: config).ToBlockingEnumerable().ToList(); + var rows2 = _importer.QueryXlsxAsync(path2, useHeaderRow: true, configuration: config).ToBlockingEnumerable().ToList(); Assert.Equal("V1", rows2[2].Test1); Assert.Equal("V2", rows2[5].Test2); @@ -613,14 +616,14 @@ public async Task Issue227() { { var path = PathHelper.GetTempPath("xlsm"); - Assert.Throws(() => Exporter.ExportXlsx(path, new[] { new { V = "A1" }, new { V = "A2" } })); + Assert.Throws(() => _exporter.ExportXlsx(path, new[] { new { V = "A1" }, new { V = "A2" } })); File.Delete(path); } { var path = PathHelper.GetFile("xlsx/TestIssue227.xlsm"); { - var q = Importer.QueryXlsxAsync(path).ToBlockingEnumerable(); + var q = _importer.QueryXlsxAsync(path).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal(100, rows.Count); @@ -634,7 +637,7 @@ public async Task Issue227() } { await using var stream = File.OpenRead(path); - var q = Importer.QueryXlsxAsync(stream).ToBlockingEnumerable(); + var q = _importer.QueryXlsxAsync(stream).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal(100, rows.Count); @@ -658,7 +661,7 @@ public async Task Issue226() { using var path = AutoDeletingPath.Create(); var templatePath = PathHelper.GetFile("xlsx/TestIssue226.xlsx"); - await Templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, new { employees = new[] { new { name = "123" }, new { name = "123" } } }); + await _templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, new { employees = new[] { new { name = "123" }, new { name = "123" } } }); Assert.Equal("A1:A3", Helpers.GetFirstSheetDimensionRefValue(path.ToString())); } @@ -676,12 +679,12 @@ public async Task Issue223() new() { { "A", Guid.NewGuid() }, { "B", "HelloWorld" } } ]; using var path = AutoDeletingPath.Create(); - var rowsWritten = await Exporter.ExportXlsxAsync(path.ToString(), value); + var rowsWritten = await _exporter.ExportXlsxAsync(path.ToString(), value); Assert.Single(rowsWritten); Assert.Equal(3, rowsWritten[0]); - var dt = await Importer.QueryXlsxAsDataTableAsync(path.ToString()); + var dt = await _importer.QueryXlsxAsDataTableAsync(path.ToString()); #pragma warning restore CS0618 var columns = dt.Columns; Assert.Equal(typeof(object), columns[0].DataType); @@ -699,7 +702,7 @@ public async Task Issue223() public async Task Issue222() { var path = PathHelper.GetFile("xlsx/TestIssue222.xlsx"); - var q = Importer.QueryXlsxAsync(path).ToBlockingEnumerable(); + var q = _importer.QueryXlsxAsync(path).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal(typeof(DateTime), rows[1].A.GetType()); Assert.Equal(new DateTime(2021, 4, 29), rows[1].A); @@ -714,7 +717,7 @@ public async Task Issue147() { { var path = PathHelper.GetFile("xlsx/TestIssue147.xlsx"); - var q = Importer.QueryXlsxAsync(path, useHeaderRow: false, startCell: "C3", sheetName: "Sheet1").ToBlockingEnumerable(); + var q = _importer.QueryXlsxAsync(path, useHeaderRow: false, startCell: "C3", sheetName: "Sheet1").ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal(["C", "D", "E"], (rows[0] as IDictionary)?.Keys); @@ -730,13 +733,13 @@ public async Task Issue147() } Assert.Equal(11, rows.Count); - var columns = await Importer.GetXlsxColumnsAsync(path, startCell: "C3"); + var columns = await _importer.GetXlsxColumnsAsync(path, startCell: "C3"); Assert.Equal(["C", "D", "E"], columns); } { var path = PathHelper.GetFile("xlsx/TestIssue147.xlsx"); - var q = Importer.QueryXlsxAsync(path, useHeaderRow: true, startCell: "C3", sheetName: "Sheet1").ToBlockingEnumerable(); + var q = _importer.QueryXlsxAsync(path, useHeaderRow: true, startCell: "C3", sheetName: "Sheet1").ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal(["Column1", "Column2", "Column3"], (rows[0] as IDictionary)?.Keys); @@ -751,7 +754,7 @@ public async Task Issue147() } Assert.Equal(10, rows.Count); - var columns = await Importer.GetXlsxColumnsAsync(path, useHeaderRow: true, startCell: "C3"); + var columns = await _importer.GetXlsxColumnsAsync(path, useHeaderRow: true, startCell: "C3"); Assert.Equal(["Column1", "Column2", "Column3"], columns); } } @@ -771,11 +774,11 @@ public async Task Issue211() await using var connection = new SQLiteConnection(connectionString); using var reader = await connection.ExecuteReaderAsync("select 1 Test1,2 Test2 union all select 3 , 4 union all select 5 ,6"); - var rowsWritten = await Exporter.ExportXlsxAsync(path.ToString(), reader); + var rowsWritten = await _exporter.ExportXlsxAsync(path.ToString(), reader); Assert.Single(rowsWritten); Assert.Equal(3, rowsWritten[0]); - var q = Importer.QueryXlsxAsync(path.ToString(), true).ToBlockingEnumerable(); + var q = _importer.QueryXlsxAsync(path.ToString(), true).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal(1.0, rows[0].Test1); Assert.Equal(2.0, rows[0].Test2); @@ -798,11 +801,11 @@ public async Task EmptyDataReaderIssue() await using var connection2 = new SQLiteConnection(connectionString); using var reader = await connection2.ExecuteReaderAsync("SELECT * FROM test"); - var rowsWritten = await Exporter.ExportXlsxAsync(path.ToString(), reader); + var rowsWritten = await _exporter.ExportXlsxAsync(path.ToString(), reader); Assert.Single(rowsWritten); Assert.Equal(0, rowsWritten[0]); - var q = Importer.QueryXlsxAsync(path.ToString(), true).ToBlockingEnumerable(); + var q = _importer.QueryXlsxAsync(path.ToString(), true).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Empty(rows); } @@ -815,12 +818,12 @@ public async Task Issue216() { using var path = AutoDeletingPath.Create(); var value = new[] { new { Test1 = "1", Test2 = 2 }, new { Test1 = "3", Test2 = 4 } }; - var rowsWritten = await Exporter.ExportXlsxAsync(path.ToString(), value); + var rowsWritten = await _exporter.ExportXlsxAsync(path.ToString(), value); Assert.Single(rowsWritten); Assert.Equal(2, rowsWritten[0]); { - var table = await Importer.QueryXlsxAsDataTableAsync(path.ToString()); + var table = await _importer.QueryXlsxAsDataTableAsync(path.ToString()); Assert.Equal("Test1", table.Columns[0].ColumnName); Assert.Equal("Test2", table.Columns[1].ColumnName); Assert.Equal("1", table.Rows[0]["Test1"]); @@ -830,7 +833,7 @@ public async Task Issue216() } { - var dt = await Importer.QueryXlsxAsDataTableAsync(path.ToString(), false); + var dt = await _importer.QueryXlsxAsDataTableAsync(path.ToString(), false); Assert.Equal("Test1", dt.Rows[0]["A"]); Assert.Equal("Test2", dt.Rows[0]["B"]); Assert.Equal("1", dt.Rows[1]["A"]); @@ -850,9 +853,9 @@ public async Task IssueI3OSKV() { using var path = AutoDeletingPath.Create(); var value = new[] { new { Test = "12345678901234567890" } }; - await Exporter.ExportXlsxAsync(path.ToString(), value); + await _exporter.ExportXlsxAsync(path.ToString(), value); - var q = Importer.QueryXlsxAsync(path.ToString(), true).ToBlockingEnumerable(); + var q = _importer.QueryXlsxAsync(path.ToString(), true).ToBlockingEnumerable(); var A2 = q.First().Test; Assert.Equal("12345678901234567890", A2); } @@ -860,9 +863,9 @@ public async Task IssueI3OSKV() { using var path = AutoDeletingPath.Create(); var value = new[] { new { Test = 123456.789 } }; - await Exporter.ExportXlsxAsync(path.ToString(), value); + await _exporter.ExportXlsxAsync(path.ToString(), value); - var q = Importer.QueryXlsxAsync(path.ToString(), true).ToBlockingEnumerable(); + var q = _importer.QueryXlsxAsync(path.ToString(), true).ToBlockingEnumerable(); var A2 = q.First().Test; Assert.Equal(123456.789, A2); } @@ -876,7 +879,7 @@ public async Task IssueI3OSKV() public async Task Issue220() { var path = PathHelper.GetFile("xlsx/TestIssue220.xlsx"); - var rows = Importer.QueryXlsxAsync(path, useHeaderRow: true).ToBlockingEnumerable(); + var rows = _importer.QueryXlsxAsync(path, useHeaderRow: true).ToBlockingEnumerable(); var result = rows .GroupBy(s => s.PRT_ID) .Select(g => new @@ -900,9 +903,9 @@ public async Task Issue220() public async Task Issue215() { await using var stream = new MemoryStream(); - await Exporter.ExportXlsxAsync(stream, new[] { new { V = "test1" }, new { V = "test2" } }); + await _exporter.ExportXlsxAsync(stream, new[] { new { V = "test1" }, new { V = "test2" } }); - var q = Importer.QueryXlsxAsync(stream, true).ToBlockingEnumerable().Cast>(); + var q = _importer.QueryXlsxAsync(stream, true).ToBlockingEnumerable().Cast>(); var rows = q.ToList(); Assert.Equal("test1", rows[0]["V"]); @@ -932,7 +935,7 @@ public async Task Issue89() await writer.FlushAsync(); stream.Position = 0; - var q = Importer.QueryCsvAsync(stream).ToBlockingEnumerable(); + var q = _importer.QueryCsvAsync(stream).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal(Issue89VO.WorkState.OnDuty, rows[0].State); @@ -940,11 +943,11 @@ public async Task Issue89() Assert.Equal(Issue89VO.WorkState.Leave, rows[2].State); var outputPath = PathHelper.GetTempPath("xlsx"); - var rowsWritten = await Exporter.ExportXlsxAsync(outputPath, rows); + var rowsWritten = await _exporter.ExportXlsxAsync(outputPath, rows); Assert.Single(rowsWritten); Assert.Equal(3, rowsWritten[0]); - var q2 = Importer.QueryXlsxAsync(outputPath).ToBlockingEnumerable(); + var q2 = _importer.QueryXlsxAsync(outputPath).ToBlockingEnumerable(); var rows2 = q2.ToList(); Assert.Equal(Issue89VO.WorkState.OnDuty, rows2[0].State); Assert.Equal(Issue89VO.WorkState.Fired, rows2[1].State); @@ -954,18 +957,18 @@ public async Task Issue89() //xlsx { var path = PathHelper.GetFile("xlsx/TestIssue89.xlsx"); - var q = Importer.QueryXlsxAsync(path).ToBlockingEnumerable(); + var q = _importer.QueryXlsxAsync(path).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal(Issue89VO.WorkState.OnDuty, rows[0].State); Assert.Equal(Issue89VO.WorkState.Fired, rows[1].State); Assert.Equal(Issue89VO.WorkState.Leave, rows[2].State); var outputPath = PathHelper.GetTempPath(); - var rowsWritten = await Exporter.ExportXlsxAsync(outputPath, rows); + var rowsWritten = await _exporter.ExportXlsxAsync(outputPath, rows); Assert.Single(rowsWritten); Assert.Equal(3, rowsWritten[0]); - var q1 = Importer.QueryXlsxAsync(outputPath).ToBlockingEnumerable(); + var q1 = _importer.QueryXlsxAsync(outputPath).ToBlockingEnumerable(); var rows2 = q1.ToList(); Assert.Equal(Issue89VO.WorkState.OnDuty, rows2[0].State); Assert.Equal(Issue89VO.WorkState.Fired, rows2[1].State); @@ -1002,11 +1005,11 @@ public async Task Issue217() // openxml { using var path = AutoDeletingPath.Create(); - var rowsWritten = await Exporter.ExportXlsxAsync(path.ToString(), table); + var rowsWritten = await _exporter.ExportXlsxAsync(path.ToString(), table); Assert.Single(rowsWritten); Assert.Equal(2, rowsWritten[0]); - var q = Importer.QueryXlsxAsync(path.ToString()).ToBlockingEnumerable(); + var q = _importer.QueryXlsxAsync(path.ToString()).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal("Name", rows[0].B); Assert.Equal("Limit", rows[0].C); @@ -1015,9 +1018,9 @@ public async Task Issue217() // csv { using var path = AutoDeletingPath.Create(ExcelType.Csv); - await Exporter.ExportXlsxAsync(path.ToString(), table); + await _exporter.ExportXlsxAsync(path.ToString(), table); - var q = Importer.QueryXlsxAsync(path.ToString()).ToBlockingEnumerable(); + var q = _importer.QueryXlsxAsync(path.ToString()).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal("Name", rows[0].B); Assert.Equal("Limit", rows[0].C); @@ -1025,7 +1028,7 @@ public async Task Issue217() } /// - /// _exporter.ExportXlsx(path, table,sheetName:“Name”) ,the actual sheetName is Sheet1 + /// _ _exporter.ExportXlsx(path, table,sheetName:“Name”) ,the actual sheetName is Sheet1 /// https://github.com/mini-software/MiniExcel/issues/212 /// [Fact] @@ -1034,9 +1037,9 @@ public async Task Issue212() const string sheetName = "Demo"; using var path = AutoDeletingPath.Create(); - await Exporter.ExportXlsxAsync(path.ToString(), new[] { new { x = 1, y = 2 } }, sheetName: sheetName); + await _exporter.ExportXlsxAsync(path.ToString(), new[] { new { x = 1, y = 2 } }, sheetName: sheetName); - var actualSheetName = Importer.GetSheetNames(path.ToString()).ToList()[0]; + var actualSheetName = _importer.GetSheetNames(path.ToString()).ToList()[0]; Assert.Equal(sheetName, actualSheetName); } @@ -1063,8 +1066,8 @@ public async Task Issue207() } }; - await Templater.ApplyXlsxTemplateAsync(path, templatePath, value); - var q = Importer.QueryXlsxAsync(path).ToBlockingEnumerable(); + await _templater.ApplyXlsxTemplateAsync(path, templatePath, value); + var q = _importer.QueryXlsxAsync(path).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal("項目1", rows[0].A); @@ -1109,9 +1112,9 @@ public async Task Issue207() } }; - await Templater.ApplyXlsxTemplateAsync(path, templatePath, value); + await _templater.ApplyXlsxTemplateAsync(path, templatePath, value); - var q = Importer.QueryXlsxAsync(path).ToBlockingEnumerable(); + var q = _importer.QueryXlsxAsync(path).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal("項目1", rows[0].A); Assert.Equal("[]內容1,[]內容2,[]內容3,[]內容4,[]內容5", rows[0].C); @@ -1141,10 +1144,10 @@ public async Task Issue87() }; await using var stream = File.OpenRead(templatePath); - var q = Importer.QueryXlsxAsync(templatePath).ToBlockingEnumerable(); + var q = _importer.QueryXlsxAsync(templatePath).ToBlockingEnumerable(); var rows = q.ToList(); - await Templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); + await _templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); } /// @@ -1166,7 +1169,7 @@ public async Task Issue206() { ["employees"] = dt }; - await Templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); + await _templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); var dimension = Helpers.GetFirstSheetDimensionRefValue(path.ToString()); Assert.Equal("A1:B2", dimension); @@ -1182,7 +1185,7 @@ public async Task Issue206() dt.Rows.Add("Jack", "HR"); } var value = new Dictionary { ["employees"] = dt }; - await Templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); + await _templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); var dimension = Helpers.GetFirstSheetDimensionRefValue(path.ToString()); Assert.Equal("A1:B2", dimension); @@ -1218,11 +1221,11 @@ public async Task Issue193() new {name="Keaton",department="IT"} } }; - await Templater.ApplyXlsxTemplateAsync(path, templatePath, value); + await _templater.ApplyXlsxTemplateAsync(path, templatePath, value); - foreach (var sheetName in Importer.GetSheetNames(path)) + foreach (var sheetName in _importer.GetSheetNames(path)) { - var q = Importer.QueryXlsxAsync(path, sheetName: sheetName).ToBlockingEnumerable(); + var q = _importer.QueryXlsxAsync(path, sheetName: sheetName).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal(9, rows.Count); @@ -1273,9 +1276,9 @@ public async Task Issue193() new {name="Keaton",department="IT"} } }; - await Templater.ApplyXlsxTemplateAsync(path, templatePath, value); + await _templater.ApplyXlsxTemplateAsync(path, templatePath, value); - var q = Importer.QueryXlsxAsync(path).ToBlockingEnumerable(); + var q = _importer.QueryXlsxAsync(path).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal("FooCompany", rows[0].A); Assert.Equal("Jack", rows[2].B); @@ -1304,10 +1307,10 @@ public async Task Issue142() { using var file = AutoDeletingPath.Create(); var path = file.ToString(); - await Exporter.ExportXlsxAsync(path, new[] { new Issue142VO { MyProperty1 = "MyProperty1", MyProperty2 = "MyProperty2", MyProperty3 = "MyProperty3", MyProperty4 = "MyProperty4", MyProperty5 = "MyProperty5", MyProperty6 = "MyProperty6", MyProperty7 = "MyProperty7" } }); + await _exporter.ExportXlsxAsync(path, new[] { new Issue142VO { MyProperty1 = "MyProperty1", MyProperty2 = "MyProperty2", MyProperty3 = "MyProperty3", MyProperty4 = "MyProperty4", MyProperty5 = "MyProperty5", MyProperty6 = "MyProperty6", MyProperty7 = "MyProperty7" } }); { - var q = Importer.QueryXlsxAsync(path).ToBlockingEnumerable(); + var q = _importer.QueryXlsxAsync(path).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal("MyProperty4", rows[0].A); Assert.Equal("CustomColumnName", rows[0].B); //note @@ -1327,7 +1330,7 @@ public async Task Issue142() } { - var q = Importer.QueryXlsxAsync(path).ToBlockingEnumerable(); + var q = _importer.QueryXlsxAsync(path).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal("MyProperty4", rows[0].MyProperty4); @@ -1343,7 +1346,7 @@ public async Task Issue142() { using var file = AutoDeletingPath.Create(ExcelType.Csv); var path = file.ToString(); - await Exporter.ExportCsvAsync(path, new [] { new Issue142VO { MyProperty1 = "MyProperty1", MyProperty2 = "MyProperty2", MyProperty3 = "MyProperty3", MyProperty4 = "MyProperty4", MyProperty5 = "MyProperty5", MyProperty6 = "MyProperty6", MyProperty7 = "MyProperty7" } }); + await _exporter.ExportCsvAsync(path, new [] { new Issue142VO { MyProperty1 = "MyProperty1", MyProperty2 = "MyProperty2", MyProperty3 = "MyProperty3", MyProperty4 = "MyProperty4", MyProperty5 = "MyProperty5", MyProperty6 = "MyProperty6", MyProperty7 = "MyProperty7" } }); const string expected = """ MyProperty4,CustomColumnName,MyProperty5,MyProperty2,MyProperty6,,MyProperty3 @@ -1353,7 +1356,7 @@ public async Task Issue142() Assert.Equal(expected, await File.ReadAllTextAsync(path)); { - var q = Importer.QueryCsvAsync(path).ToBlockingEnumerable(); + var q = _importer.QueryCsvAsync(path).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal("MyProperty4", rows[0].MyProperty4); @@ -1369,7 +1372,7 @@ public async Task Issue142() { using var path = AutoDeletingPath.Create(); Issue142VoDuplicateColumnName[] input = [ new() { MyProperty1 = 0, MyProperty2 = 0, MyProperty3 = 0, MyProperty4 = 0 } ]; - Assert.Throws(() => Exporter.ExportXlsx(path.ToString(), input)); + Assert.Throws(() => _exporter.ExportXlsx(path.ToString(), input)); } } @@ -1379,19 +1382,19 @@ public async Task Issue142_Query() const string path = "../../../../../samples/xlsx/TestIssue142.xlsx"; const string pathCsv = "../../../../../samples/xlsx/TestIssue142.csv"; { - var rows = Importer.QueryXlsxAsync(path).ToBlockingEnumerable().ToList(); + var rows = _importer.QueryXlsxAsync(path).ToBlockingEnumerable().ToList(); Assert.Equal(0, rows[0].MyProperty1); } { await Assert.ThrowsAsync(async () => { - var q = Importer.QueryXlsxAsync(path).ToBlockingEnumerable().ToList(); + var q = _importer.QueryXlsxAsync(path).ToBlockingEnumerable().ToList(); }); } { - var q = Importer.QueryXlsxAsync(path).ToBlockingEnumerable(); + var q = _importer.QueryXlsxAsync(path).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal("CustomColumnName", rows[0].MyProperty1); Assert.Null(rows[0].MyProperty7); @@ -1403,7 +1406,7 @@ await Assert.ThrowsAsync(async () => } { - var q = Importer.QueryXlsxAsync(path).ToBlockingEnumerable(); + var q = _importer.QueryXlsxAsync(path).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal("CustomColumnName", rows[0].MyProperty1); Assert.Null(rows[0].MyProperty7); @@ -1463,19 +1466,19 @@ public async Task Issue150() { var path = PathHelper.GetTempFilePath(); - await Assert.ThrowsAnyAsync(async () => await Exporter.ExportXlsxAsync(path, new[] { 1, 2 })); + await Assert.ThrowsAnyAsync(async () => await _exporter.ExportXlsxAsync(path, new[] { 1, 2 })); File.Delete(path); - await Assert.ThrowsAnyAsync(async () => await Exporter.ExportXlsxAsync(path, new[] { "1", "2" })); + await Assert.ThrowsAnyAsync(async () => await _exporter.ExportXlsxAsync(path, new[] { "1", "2" })); File.Delete(path); - await Assert.ThrowsAnyAsync(async () => await Exporter.ExportXlsxAsync(path, new[] { '1', '2' })); + await Assert.ThrowsAnyAsync(async () => await _exporter.ExportXlsxAsync(path, new[] { '1', '2' })); File.Delete(path); - await Assert.ThrowsAnyAsync(async () => await Exporter.ExportXlsxAsync(path, new[] { DateTime.Now })); + await Assert.ThrowsAnyAsync(async () => await _exporter.ExportXlsxAsync(path, new[] { DateTime.Now })); File.Delete(path); - await Assert.ThrowsAnyAsync(async () => await Exporter.ExportXlsxAsync(path, new[] { Guid.NewGuid() })); + await Assert.ThrowsAnyAsync(async () => await _exporter.ExportXlsxAsync(path, new[] { Guid.NewGuid() })); File.Delete(path); } @@ -1540,14 +1543,14 @@ public async Task Issue157() } ] """); - var rowsWritten = await Exporter.ExportXlsxAsync(path, input); + var rowsWritten = await _exporter.ExportXlsxAsync(path, input); Assert.Single(rowsWritten); Assert.Equal(5, rowsWritten[0]); - var q = Importer.QueryXlsxAsync(path, sheetName: "Sheet1").ToBlockingEnumerable(); + var q = _importer.QueryXlsxAsync(path, sheetName: "Sheet1").ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal(6, rows.Count); - Assert.Equal("Sheet1", Importer.GetSheetNames(path).First()); + Assert.Equal("Sheet1", _importer.GetSheetNames(path).First()); using var p = new ExcelPackage(new FileInfo(path)); var ws = p.Workbook.Worksheets.First(); @@ -1557,10 +1560,10 @@ public async Task Issue157() { const string path = "../../../../../samples/xlsx/TestIssue157.xlsx"; { - var q = Importer.QueryXlsxAsync(path, sheetName: "Sheet1").ToBlockingEnumerable(); + var q = _importer.QueryXlsxAsync(path, sheetName: "Sheet1").ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal(6, rows.Count); - Assert.Equal("Sheet1", Importer.GetSheetNames(path).First()); + Assert.Equal("Sheet1", _importer.GetSheetNames(path).First()); } using (var p = new ExcelPackage(new FileInfo(path))) { @@ -1570,7 +1573,7 @@ public async Task Issue157() } { - var q = Importer.QueryXlsxAsync(path, sheetName: "Sheet1").ToBlockingEnumerable(); + var q = _importer.QueryXlsxAsync(path, sheetName: "Sheet1").ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal(5, rows.Count); @@ -1604,7 +1607,7 @@ public async Task Issue149() { const string path = "../../../../../samples/xlsx/TestIssue149.xlsx"; - var q = Importer.QueryXlsxAsync(path).ToBlockingEnumerable(); + var q = _importer.QueryXlsxAsync(path).ToBlockingEnumerable(); var rows = q.Select(s => (string)s.A).ToList(); for (int i = 0; i < chars.Length; i++) @@ -1621,9 +1624,9 @@ public async Task Issue149() var path = file.ToString(); var input = chars.Select(s => new { Test = s.ToString() }); - await Exporter.ExportXlsxAsync(path, input); + await _exporter.ExportXlsxAsync(path, input); - var q = Importer.QueryXlsxAsync(path, true).ToBlockingEnumerable(); + var q = _importer.QueryXlsxAsync(path, true).ToBlockingEnumerable(); var rows = q.Select(s => (string)s.Test).ToList(); for (int i = 0; i < chars.Length; i++) @@ -1641,9 +1644,9 @@ public async Task Issue149() var path = file.ToString(); var input = chars.Select(s => new { Test = s.ToString() }); - await Exporter.ExportXlsxAsync(path, input); + await _exporter.ExportXlsxAsync(path, input); - var q = Importer.QueryXlsxAsync(path).ToBlockingEnumerable(); + var q = _importer.QueryXlsxAsync(path).ToBlockingEnumerable(); var rows = q.Select(s => s.Test).ToList(); for (int i = 0; i < chars.Length; i++) @@ -1669,7 +1672,7 @@ private class Issue149VO public async Task Issue153() { const string path = "../../../../../samples/xlsx/TestIssue153.xlsx"; - var q = Importer.QueryXlsxAsync(path, true).ToBlockingEnumerable(); + var q = _importer.QueryXlsxAsync(path, true).ToBlockingEnumerable(); var rows = q.First() as IDictionary; Assert.Equal( @@ -1688,7 +1691,7 @@ public async Task Issue137() var path = "../../../../../samples/xlsx/TestIssue137.xlsx"; { - var q = Importer.QueryXlsxAsync(path).ToBlockingEnumerable(); + var q = _importer.QueryXlsxAsync(path).ToBlockingEnumerable(); var rows = q.ToList(); var first = rows[0] as IDictionary; // https://user-images.githubusercontent.com/12729184/113266322-ba06e400-9307-11eb-9521-d36abfda75cc.png Assert.Equal(["A", "B", "C", "D", "E", "F", "G", "H"], first?.Keys.ToArray()); @@ -1724,7 +1727,7 @@ public async Task Issue137() // dynamic query with head { - var q = Importer.QueryXlsxAsync(path, true).ToBlockingEnumerable(); + var q = _importer.QueryXlsxAsync(path, true).ToBlockingEnumerable(); var rows = q.ToList(); var first = rows[0] as IDictionary; // https://user-images.githubusercontent.com/12729184/113266322-ba06e400-9307-11eb-9521-d36abfda75cc.png Assert.Equal(["比例", "商品", "滿倉口數", "0", "1為港幣 0為台幣"], first?.Keys.ToArray()); @@ -1746,7 +1749,7 @@ public async Task Issue137() } { - var q = Importer.QueryXlsxAsync(path).ToBlockingEnumerable(); + var q = _importer.QueryXlsxAsync(path).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal(10, rows.Count); @@ -1780,7 +1783,7 @@ public async Task Issue138() { const string path = "../../../../../samples/xlsx/TestIssue138.xlsx"; { - var q = Importer.QueryXlsxAsync(path, true).ToBlockingEnumerable(); + var q = _importer.QueryXlsxAsync(path, true).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal(6, rows.Count); @@ -1806,7 +1809,7 @@ public async Task Issue138() } { - var q = Importer.QueryXlsxAsync(path).ToBlockingEnumerable(); + var q = _importer.QueryXlsxAsync(path).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal(6, rows.Count); Assert.Equal(new DateTime(2021, 3, 1), rows[0].Date); diff --git a/tests/MiniExcelTests/MiniExcelIssueTests.cs b/tests/MiniExcelTests/MiniExcelIssueTests.cs index ebdb1f45..294f1eaf 100644 --- a/tests/MiniExcelTests/MiniExcelIssueTests.cs +++ b/tests/MiniExcelTests/MiniExcelIssueTests.cs @@ -6,16 +6,15 @@ using System.Text; using System.Text.RegularExpressions; using Dapper; +using MiniExcelLib.Core; using MiniExcelLib.Core.Attributes; using MiniExcelLib.Core.Exceptions; using MiniExcelLib.Core.OpenXml; using MiniExcelLib.Core.OpenXml.Picture; using MiniExcelLib.Core.OpenXml.Utils; using MiniExcelLib.Csv; +using MiniExcelLib.Csv.MiniExcelExtensions; using MiniExcelLib.Tests.Utils; -using Importer = MiniExcelLib.MiniExcel.Importer; -using Exporter = MiniExcelLib.MiniExcel.Exporter; -using Templater = MiniExcelLib.MiniExcel.Templater; using Newtonsoft.Json; using NPOI.XSSF.UserModel; using OfficeOpenXml; @@ -28,6 +27,10 @@ public class MiniExcelIssueTests(ITestOutputHelper output) { private readonly ITestOutputHelper _output = output; + private readonly MiniExcelImporter _importer = MiniExcel.GetImporter(); + private readonly MiniExcelExporter _exporter = MiniExcel.GetExporter(); + private readonly MiniExcelTemplater _templater = MiniExcel.GetTemplater(); + /// /// https://github.com/mini-software/MiniExcel/issues/549 /// @@ -42,8 +45,8 @@ public void TestIssue549() using var file = AutoDeletingPath.Create(); var path = file.ToString(); - Exporter.ExportXlsx(path, data); - var rows = Importer.QueryXlsx(path, true).ToList(); + _exporter.ExportXlsx(path, data); + var rows = _importer.QueryXlsx(path, true).ToList(); { using var stream = new FileStream(path, FileMode.Open, FileAccess.Read); using var workbook = new XSSFWorkbook(stream); @@ -71,7 +74,7 @@ public void TestIssue24020201() new() { { "specialMark", 3 } }, } }; - Templater.ApplyXlsxTemplate(path.ToString(), templatePath, data); + _templater.ApplyXlsxTemplate(path.ToString(), templatePath, data); } [Fact] @@ -88,9 +91,9 @@ public void TestIssue553() new{ ITM=3 } } }; - Templater.ApplyXlsxTemplate(path.ToString(), templatePath, data); + _templater.ApplyXlsxTemplate(path.ToString(), templatePath, data); - var rows = Importer.QueryXlsx(path.ToString()).ToList(); + var rows = _importer.QueryXlsx(path.ToString()).ToList(); Assert.Equal(rows[2].A, 1); Assert.Equal(rows[3].A, 2); Assert.Equal(rows[4].A, 3); @@ -106,7 +109,7 @@ public void TestPR10() .Select(s => Regex.Replace(s.Replace("\"\"", "\""), "^\"|\"$", "")) .ToArray() }; - var rows = Importer.QueryCsv(path, configuration: config).ToList(); + var rows = _importer.QueryCsv(path, configuration: config).ToList(); } [Fact] @@ -119,9 +122,9 @@ public void TestIssue289() new() { Name="0002", UserType=DescriptionEnum.V2 }, new() { Name="0003", UserType=DescriptionEnum.V3 } ]; - Exporter.ExportXlsx(path.ToString(), value); + _exporter.ExportXlsx(path.ToString(), value); - var rows = Importer.QueryXlsx(path.ToString()).ToList(); + var rows = _importer.QueryXlsx(path.ToString()).ToList(); Assert.Equal(DescriptionEnum.V1, rows[0].UserType); Assert.Equal(DescriptionEnum.V2, rows[1].UserType); @@ -156,7 +159,7 @@ public void TestIssueI4X92G() new { ID = 1, Name = "Jack", InDate = new DateTime(2021,01,03)}, new { ID = 2, Name = "Henry", InDate = new DateTime(2020,05,03)} }; - Exporter.ExportCsv(path, value); + _exporter.ExportCsv(path, value); var content = File.ReadAllText(path); Assert.Equal( """ @@ -169,7 +172,7 @@ public void TestIssueI4X92G() } { var value = new { ID = 3, Name = "Mike", InDate = new DateTime(2021, 04, 23) }; - var rowsWritten = Exporter.AppendToCsv(path, value); + var rowsWritten = _exporter.AppendToCsv(path, value); Assert.Equal(1, rowsWritten); var content = File.ReadAllText(path); @@ -189,7 +192,7 @@ public void TestIssueI4X92G() new { ID=4,Name ="Frank",InDate=new DateTime(2021,06,07)}, new { ID=5,Name ="Gloria",InDate=new DateTime(2022,05,03)}, }; - var rowsWritten = Exporter.AppendToCsv(path, value); + var rowsWritten = _exporter.AppendToCsv(path, value); Assert.Equal(2, rowsWritten); var content = File.ReadAllText(path); @@ -219,8 +222,8 @@ public void TestIssue430() { new TestIssue430Dto{ Date=DateTimeOffset.Parse("2021-01-31 10:03:00 +05:00")} }; - Exporter.ExportXlsx(path.ToString(), value); - var rows = Importer.QueryXlsx(path.ToString()).ToArray(); + _exporter.ExportXlsx(path.ToString(), value); + var rows = _importer.QueryXlsx(path.ToString()).ToArray(); Assert.Equal("2021-01-31 10:03:00 +05:00", rows[0].Date.ToString("yyyy-MM-dd HH:mm:ss zzz")); } @@ -243,7 +246,7 @@ public void TestIssue_DataReaderSupportDimension() using var path = AutoDeletingPath.Create(); using var reader = table.CreateDataReader(); var config = new OpenXmlConfiguration { FastMode = true }; - Exporter.ExportXlsx(path.ToString(), reader, configuration: config); + _exporter.ExportXlsx(path.ToString(), reader, configuration: config); var xml = Helpers.GetZipFileContent(path.ToString(), "xl/worksheets/sheet1.xml"); Assert.Contains("", xml); @@ -267,8 +270,8 @@ public void TestIssue413() } }; var templatePath = PathHelper.GetFile("xlsx/TestIssue413.xlsx"); - Templater.ApplyXlsxTemplate(path.ToString(), templatePath, value); - var rows = Importer.QueryXlsx(path.ToString()).ToList(); + _templater.ApplyXlsxTemplate(path.ToString(), templatePath, value); + var rows = _importer.QueryXlsx(path.ToString()).ToList(); Assert.Equal("2022-12-25 00:00:00", rows[1].B); Assert.Equal("2022-09-23 00:00:00", rows[2].B); @@ -283,7 +286,7 @@ public void TestIssue405() { using var path = AutoDeletingPath.Create(); var value = new[] { new { id = 1, name = "test" } }; - Exporter.ExportXlsx(path.ToString(), value); + _exporter.ExportXlsx(path.ToString(), value); var xml = Helpers.GetZipFileContent(path.ToString(), "xl/sharedStrings.xml"); Assert.StartsWith(" new StreamWriter(x, Encoding.Default, leaveOpen: true)}; - Exporter.ExportCsv(stream, sheets, configuration: config); + _exporter.ExportCsv(stream, sheets, configuration: config); stream.Seek(0, SeekOrigin.Begin); // convert stream to string @@ -336,9 +339,9 @@ public void TestIssue370() }, Formatting.Indented); var value = JsonConvert.DeserializeObject>>(json); - Exporter.ExportXlsx(path.ToString(), value, configuration: config); + _exporter.ExportXlsx(path.ToString(), value, configuration: config); - var rows = Importer.QueryXlsx(path.ToString()).ToList(); + var rows = _importer.QueryXlsx(path.ToString()).ToList(); Assert.Equal("createdate", rows[0].A); Assert.Equal(new DateTime(2022, 04, 12), rows[1].A); Assert.Equal("name", rows[0].B); @@ -362,9 +365,9 @@ public void TestIssue369() }; using var path = AutoDeletingPath.Create(); var value = new[] { new { id = 1, name = "Jack", createdate = new DateTime(2022, 04, 12), point = 123.456 } }; - Exporter.ExportXlsx(path.ToString(), value, configuration: config); + _exporter.ExportXlsx(path.ToString(), value, configuration: config); - var rows = Importer.QueryXlsx(path.ToString()).ToList(); + var rows = _importer.QueryXlsx(path.ToString()).ToList(); Assert.Equal("createdate", rows[0].A); Assert.Equal(new DateTime(2022, 04, 12), rows[1].A); Assert.Equal("name", rows[0].B); @@ -378,9 +381,9 @@ public void TestIssueI4ZYUU() { using var path = AutoDeletingPath.Create(); TestIssueI4ZYUUDto[] value = [new() { MyProperty = "1", MyProperty2 = new DateTime(2022, 10, 15) }]; - Exporter.ExportXlsx(path.ToString(), value); + _exporter.ExportXlsx(path.ToString(), value); - var rows = Importer.QueryXlsx(path.ToString()).ToList(); + var rows = _importer.QueryXlsx(path.ToString()).ToList(); Assert.Equal("2022-10", rows[1].B); using var workbook = new ClosedXML.Excel.XLWorkbook(path.ToString()); @@ -403,10 +406,10 @@ public void TestIssue360() { var path = PathHelper.GetFile("xlsx/NotDuplicateSharedStrings_10x100.xlsx"); var config = new OpenXmlConfiguration { SharedStringCacheSize = 1 }; - var sheets = Importer.GetSheetNames(path); + var sheets = _importer.GetSheetNames(path); foreach (var sheetName in sheets) { - var dt = Importer.QueryXlsxAsDataTable(path, useHeaderRow: true, sheetName: sheetName, configuration: config); + var dt = _importer.QueryXlsxAsDataTable(path, useHeaderRow: true, sheetName: sheetName, configuration: config); } } @@ -443,7 +446,7 @@ public void TestIssue352() using var path = AutoDeletingPath.Create(); var reader = table.CreateDataReader(); - Exporter.ExportXlsx(path.ToString(), reader); + _exporter.ExportXlsx(path.ToString(), reader); var xml = Helpers.GetZipFileContent(path.ToString(), "xl/worksheets/sheet1.xml"); var cnt = Regex.Matches(xml, "").Count; } @@ -456,7 +459,7 @@ public void TestIssue352() using var path = AutoDeletingPath.Create(); var reader = table.CreateDataReader(); - Exporter.ExportXlsx(path.ToString(), reader, false); + _exporter.ExportXlsx(path.ToString(), reader, false); var xml = Helpers.GetZipFileContent(path.ToString(), "xl/worksheets/sheet1.xml"); var cnt = Regex.Matches(xml, "").Count; } @@ -467,7 +470,7 @@ public void TestIssue352() using var path = AutoDeletingPath.Create(); var reader = table.CreateDataReader(); - Exporter.ExportXlsx(path.ToString(), reader); + _exporter.ExportXlsx(path.ToString(), reader); var xml = Helpers.GetZipFileContent(path.ToString(), "xl/worksheets/sheet1.xml"); var cnt = Regex.Matches(xml, "").Count; } @@ -491,7 +494,7 @@ public void TestIssue401(bool autoFilter, int count) var reader = table.CreateDataReader(); using var path = AutoDeletingPath.Create(); var config = new OpenXmlConfiguration { AutoFilter = autoFilter }; - Exporter.ExportXlsx(path.ToString(), reader, configuration: config); + _exporter.ExportXlsx(path.ToString(), reader, configuration: config); var xml = Helpers.GetZipFileContent(path.ToString(), "xl/worksheets/sheet1.xml"); var cnt = Regex.Matches(xml, "").Count; @@ -508,7 +511,7 @@ public void TestIssue401(bool autoFilter, int count) var reader = table.CreateDataReader(); using var path = AutoDeletingPath.Create(); var config = new OpenXmlConfiguration { AutoFilter = autoFilter }; - Exporter.ExportXlsx(path.ToString(), reader, false, configuration: config); + _exporter.ExportXlsx(path.ToString(), reader, false, configuration: config); var xml = Helpers.GetZipFileContent(path.ToString(), "xl/worksheets/sheet1.xml"); var cnt = Regex.Matches(xml, "").Count; @@ -523,7 +526,7 @@ public void TestIssue401(bool autoFilter, int count) var reader = table.CreateDataReader(); using var path = AutoDeletingPath.Create(); var config = new OpenXmlConfiguration { AutoFilter = autoFilter }; - Exporter.ExportXlsx(path.ToString(), reader, configuration: config); + _exporter.ExportXlsx(path.ToString(), reader, configuration: config); var xml = Helpers.GetZipFileContent(path.ToString(), "xl/worksheets/sheet1.xml"); var cnt = Regex.Matches(xml, "").Count; @@ -550,7 +553,7 @@ UNION ALL """; using var reader = command.ExecuteReader(); - Exporter.ExportXlsx(path.ToString(), reader, configuration: config); + _exporter.ExportXlsx(path.ToString(), reader, configuration: config); } var xml = Helpers.GetZipFileContent(path.ToString(), "xl/worksheets/sheet1.xml"); @@ -574,7 +577,7 @@ UNION ALL using (var transaction = connection.BeginTransaction()) using (var stream = File.OpenRead(xlsxPath)) { - var rows = Importer.QueryXlsx(stream); + var rows = _importer.QueryXlsx(stream); foreach (var row in rows) connection.Execute( "insert into T (A,B) values (@A,@B)", @@ -592,7 +595,7 @@ UNION ALL using var command = new SQLiteCommand("select * from T", connection); connection.Open(); using var reader = command.ExecuteReader(); - Exporter.ExportXlsx(path.ToString(), reader, configuration: config); + _exporter.ExportXlsx(path.ToString(), reader, configuration: config); } var xml = Helpers.GetZipFileContent(path.ToString(), "xl/worksheets/sheet1.xml"); @@ -608,12 +611,12 @@ public async Task TestIssue307() var path = file.ToString(); var value = new[] { new { id = 1, name = "Jack" } }; - await Exporter.ExportXlsxAsync(path, value); - Assert.Throws(() => Exporter.ExportXlsx(path, value)); + await _exporter.ExportXlsxAsync(path, value); + Assert.Throws(() => _exporter.ExportXlsx(path, value)); - await Exporter.ExportXlsxAsync(path, value, overwriteFile: true); - await Assert.ThrowsAsync(async () => await Exporter.ExportXlsxAsync(path, value)); - await Exporter.ExportXlsxAsync(path, value, overwriteFile: true); + await _exporter.ExportXlsxAsync(path, value, overwriteFile: true); + await Assert.ThrowsAsync(async () => await _exporter.ExportXlsxAsync(path, value)); + await _exporter.ExportXlsxAsync(path, value, overwriteFile: true); } [Fact] @@ -621,8 +624,8 @@ public void TestIssue310() { using var path = AutoDeletingPath.Create(); var value = new[] { new TestIssue310Dto { V1 = null }, new TestIssue310Dto { V1 = 2 } }; - Exporter.ExportXlsx(path.ToString(), value); - var rows = Importer.QueryXlsx(path.ToString()).ToList(); + _exporter.ExportXlsx(path.ToString(), value); + var rows = _importer.QueryXlsx(path.ToString()).ToList(); } [Fact] @@ -634,8 +637,8 @@ public void TestIssue310Fix497() new TestIssue310Dto { V1 = null }, new TestIssue310Dto { V1 = 2 } }; - Exporter.ExportXlsx(path.ToString(), value, configuration: new OpenXmlConfiguration { EnableWriteNullValueCell = false }); - var rows = Importer.QueryXlsx(path.ToString()).ToList(); + _exporter.ExportXlsx(path.ToString(), value, configuration: new OpenXmlConfiguration { EnableWriteNullValueCell = false }); + var rows = _importer.QueryXlsx(path.ToString()).ToList(); } private class TestIssue310Dto @@ -661,9 +664,9 @@ public void TestIssue343() table.Rows.Add(date, date); } var reader = table.CreateDataReader(); - Exporter.ExportXlsx(path.ToString(), reader); + _exporter.ExportXlsx(path.ToString(), reader); - var rows = Importer.QueryXlsx(path.ToString(), true).ToArray(); + var rows = _importer.QueryXlsx(path.ToString(), true).ToArray(); Assert.Equal(date, rows[0].time1); Assert.Equal(date, rows[0].time2); } @@ -674,7 +677,7 @@ public void TestIssueI4YCLQ_2() var c = GeneralHelper.ConvertColumnName(1); var c2 = GeneralHelper.ConvertColumnName(3); var path = PathHelper.GetFile("xlsx/TestIssueI4YCLQ_2.xlsx"); - var rows = Importer.QueryXlsx(path, startCell: "B2").ToList(); + var rows = _importer.QueryXlsx(path, startCell: "B2").ToList(); Assert.Null(rows[0].站点编码); Assert.Equal("N1", rows[0].站址名称); @@ -720,7 +723,7 @@ public async Task TestIssue338() Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); { var path = PathHelper.GetFile("csv/TestIssue338.csv"); - var row = Importer.QueryCsvAsync(path).ToBlockingEnumerable().FirstOrDefault(); + var row = _importer.QueryCsvAsync(path).ToBlockingEnumerable().FirstOrDefault(); Assert.Equal("���IJ�������", row!.A); } { @@ -729,7 +732,7 @@ public async Task TestIssue338() { StreamReaderFunc = stream => new StreamReader(stream, Encoding.GetEncoding("gb2312")) }; - var row = Importer.QueryCsvAsync(path, configuration: config).ToBlockingEnumerable().FirstOrDefault(); + var row = _importer.QueryCsvAsync(path, configuration: config).ToBlockingEnumerable().FirstOrDefault(); Assert.Equal("中文测试内容", row!.A); } { @@ -740,7 +743,7 @@ public async Task TestIssue338() }; await using (var stream = new FileStream(path, FileMode.Open, FileAccess.Read)) { - var row = Importer.QueryCsvAsync(stream, configuration: config).ToBlockingEnumerable().FirstOrDefault(); + var row = _importer.QueryCsvAsync(stream, configuration: config).ToBlockingEnumerable().FirstOrDefault(); Assert.Equal("中文测试内容", row!.A); } } @@ -755,8 +758,8 @@ public void TestIssueI4WM67() { ["users"] = Array.Empty() }; - Templater.ApplyXlsxTemplate(path.ToString(), templatePath, value); - var rows = Importer.QueryXlsx(path.ToString()).ToList(); + _templater.ApplyXlsxTemplate(path.ToString(), templatePath, value); + var rows = _importer.QueryXlsx(path.ToString()).ToList(); Assert.Single(rows); } @@ -778,7 +781,7 @@ public void TestIssueI4WXFB() ["Amount"] = 1000, ["Department"] = "HR" }; - Templater.ApplyXlsxTemplate(path.ToString(), templatePath, value); + _templater.ApplyXlsxTemplate(path.ToString(), templatePath, value); } { @@ -794,7 +797,7 @@ public void TestIssueI4WXFB() ["Amount"] = 1000, ["Department"] = "HR" }; - Assert.Throws(() => Templater.ApplyXlsxTemplate(path.ToString(), templatePath, value, config)); + Assert.Throws(() => _templater.ApplyXlsxTemplate(path.ToString(), templatePath, value, config)); } } @@ -808,7 +811,7 @@ public void TestIssueI4WDA9() value.Rows.Add("\"Jack\""); } - Exporter.ExportCsv(path.ToString(), value); + _exporter.ExportCsv(path.ToString(), value); Assert.Equal("\"\"\"name\"\"\"\r\n\"\"\"Jack\"\"\"\r\n", File.ReadAllText(path.ToString())); } @@ -833,7 +836,7 @@ public void TestIssue331_2() }); using var path = AutoDeletingPath.Create(); - Exporter.ExportXlsx(path.ToString(), data, configuration: config); + _exporter.ExportXlsx(path.ToString(), data, configuration: config); CultureInfo.CurrentCulture = CultureInfo.GetCultureInfo(cln); } @@ -852,9 +855,9 @@ public void TestIssue331() }); using var path = AutoDeletingPath.Create(); - Exporter.ExportXlsx(path.ToString(), data); + _exporter.ExportXlsx(path.ToString(), data); - var rows = Importer.QueryXlsx(path.ToString(), startCell: "A2").ToArray(); + var rows = _importer.QueryXlsx(path.ToString(), startCell: "A2").ToArray(); Assert.Equal(1.5, rows[2].B); Assert.Equal(1.5, rows[2].C); @@ -876,16 +879,16 @@ public void TestIssueI4TXGT() var path = file.ToString(); var value = new[] { new TestIssueI4TXGTDto { ID = 1, Name = "Apple", Spc = "X", Up = 6999 } }; - Exporter.ExportXlsx(path, value); + _exporter.ExportXlsx(path, value); { - var rows = Importer.QueryXlsx(path).ToList(); + var rows = _importer.QueryXlsx(path).ToList(); Assert.Equal("ID", rows[0].A); Assert.Equal("Name", rows[0].B); Assert.Equal("Specification", rows[0].C); Assert.Equal("Unit Price", rows[0].D); } { - var rows = Importer.QueryXlsx(path).ToList(); + var rows = _importer.QueryXlsx(path).ToList(); Assert.Equal(1, rows[0].ID); Assert.Equal("Apple", rows[0].Name); Assert.Equal("X", rows[0].Spc); @@ -924,10 +927,10 @@ public void TestIssue328() file = File.ReadAllBytes(PathHelper.GetFile("other/TestIssue327.txt")) }, }; - Exporter.ExportXlsx(path.ToString(), value); + _exporter.ExportXlsx(path.ToString(), value); var rowIndx = 0; - using var reader = Importer.GetXlsxDataReader(path.ToString(), true); + using var reader = _importer.GetXlsxDataReader(path.ToString(), true); Assert.Equal("id", reader.GetName(0)); Assert.Equal("name", reader.GetName(1)); @@ -964,8 +967,8 @@ public void TestIssue327() new { id = 2, file = File.ReadAllBytes(PathHelper.GetFile("other/TestIssue327.txt")) }, new { id = 3, file = File.ReadAllBytes(PathHelper.GetFile("other/TestIssue327.html")) }, }; - Exporter.ExportXlsx(path.ToString(), value); - var rows = Importer.QueryXlsx(path.ToString(), true).ToList(); + _exporter.ExportXlsx(path.ToString(), value); + var rows = _importer.QueryXlsx(path.ToString(), true).ToList(); Assert.Equal(value[0].file, rows[0].file); Assert.Equal(value[1].file, rows[1].file); @@ -989,7 +992,7 @@ public void TestIssue316() { Culture = new CultureInfo("fr-FR"), }; - Exporter.ExportXlsx(path, value, configuration: config); + _exporter.ExportXlsx(path, value, configuration: config); //Datetime error Assert.Throws(() => @@ -998,11 +1001,11 @@ public void TestIssue316() { Culture = new CultureInfo("en-US"), }; - _ = Importer.QueryXlsx(path, configuration: conf).ToList(); + _ = _importer.QueryXlsx(path, configuration: conf).ToList(); }); // dynamic - var rows = Importer.QueryXlsx(path, true).ToList(); + var rows = _importer.QueryXlsx(path, true).ToList(); Assert.Equal("123456,789", rows[0].Amount); Assert.Equal("31/01/2018 00:00:00", rows[0].CreateTime); } @@ -1020,11 +1023,11 @@ public void TestIssue316() { Culture = new CultureInfo("fr-FR"), }; - Exporter.ExportXlsx(path, value, configuration: config); + _exporter.ExportXlsx(path, value, configuration: config); } { - var rows = Importer.QueryXlsx(path, true).ToList(); + var rows = _importer.QueryXlsx(path, true).ToList(); Assert.Equal("123456,789", rows[0].Amount); Assert.Equal("12/05/2018 00:00:00", rows[0].CreateTime); } @@ -1034,7 +1037,7 @@ public void TestIssue316() { Culture = new CultureInfo("en-US"), }; - var rows = Importer.QueryXlsx(path, configuration: config).ToList(); + var rows = _importer.QueryXlsx(path, configuration: config).ToList(); Assert.Equal("2018-12-05 00:00:00", rows[0].CreateTime.ToString("yyyy-MM-dd HH:mm:ss")); Assert.Equal(123456789m, rows[0].Amount); @@ -1045,7 +1048,7 @@ public void TestIssue316() { Culture = new CultureInfo("fr-FR"), }; - var rows = Importer.QueryXlsx(path, configuration: config).ToList(); + var rows = _importer.QueryXlsx(path, configuration: config).ToList(); Assert.Equal("2018-05-12 00:00:00", rows[0].CreateTime.ToString("yyyy-MM-dd HH:mm:ss")); Assert.Equal(123456.789m, rows[0].Amount); @@ -1065,7 +1068,7 @@ public void TestIssue316() { Culture = new CultureInfo("fr-FR"), }; - Exporter.ExportCsv(path, value, configuration: config); + _exporter.ExportCsv(path, value, configuration: config); //Datetime error Assert.Throws(() => @@ -1074,11 +1077,11 @@ public void TestIssue316() { Culture = new CultureInfo("en-US") }; - _ = Importer.QueryCsv(path, configuration: conf).ToList(); + _ = _importer.QueryCsv(path, configuration: conf).ToList(); }); // dynamic - var rows = Importer.QueryCsv(path, true).ToList(); + var rows = _importer.QueryCsv(path, true).ToList(); Assert.Equal("123456,789", rows[0].Amount); Assert.Equal("31/01/2018 00:00:00", rows[0].CreateTime); } @@ -1097,11 +1100,11 @@ public void TestIssue316() { Culture = new CultureInfo("fr-FR"), }; - Exporter.ExportCsv(path, value, configuration: config); + _exporter.ExportCsv(path, value, configuration: config); } { - var rows = Importer.QueryCsv(path, true).ToList(); + var rows = _importer.QueryCsv(path, true).ToList(); Assert.Equal("123456,789", rows[0].Amount); Assert.Equal("12/05/2018 00:00:00", rows[0].CreateTime); } @@ -1111,7 +1114,7 @@ public void TestIssue316() { Culture = new CultureInfo("en-US"), }; - var rows = Importer.QueryCsv(path, configuration: config).ToList(); + var rows = _importer.QueryCsv(path, configuration: config).ToList(); Assert.Equal("2018-12-05 00:00:00", rows[0].CreateTime.ToString("yyyy-MM-dd HH:mm:ss")); Assert.Equal(123456789m, rows[0].Amount); @@ -1122,7 +1125,7 @@ public void TestIssue316() { Culture = new CultureInfo("fr-FR"), }; - var rows = Importer.QueryCsv(path, configuration: config).ToList(); + var rows = _importer.QueryCsv(path, configuration: config).ToList(); Assert.Equal("2018-05-12 00:00:00", rows[0].CreateTime.ToString("yyyy-MM-dd HH:mm:ss")); Assert.Equal(123456.789m, rows[0].Amount); @@ -1148,7 +1151,7 @@ public void TestIssue325() { "sheet1",new[]{ new { id = 1, date = DateTime.Parse("2022-01-01") } }}, { "sheet2",new[]{ new { id = 2, date = DateTime.Parse("2022-01-01") } }}, }; - Exporter.ExportXlsx(path.ToString(), value); + _exporter.ExportXlsx(path.ToString(), value); var xml = Helpers.GetZipFileContent(path.ToString(), "xl/worksheets/_rels/sheet2.xml.rels"); var cnt = Regex.Matches(xml, "Id=\"drawing2\"").Count; @@ -1170,9 +1173,9 @@ public void TestIssueI49RZH() new TestIssueI49RZHDto{ dd = DateTimeOffset.Parse("2022-01-22")}, new TestIssueI49RZHDto{ dd = null} }; - Exporter.ExportXlsx(path.ToString(), value); + _exporter.ExportXlsx(path.ToString(), value); - var rows = Importer.QueryXlsx(path.ToString()).ToList(); + var rows = _importer.QueryXlsx(path.ToString()).ToList(); Assert.Equal("2022-01-22", rows[1].A); } @@ -1184,9 +1187,9 @@ public void TestIssueI49RZH() new TestIssueI49RZHDto{ dd = DateTimeOffset.Parse("2022-01-22")}, new TestIssueI49RZHDto{ dd = null} }; - Exporter.ExportXlsx(path.ToString(), value); + _exporter.ExportXlsx(path.ToString(), value); - var rows = Importer.QueryXlsx(path.ToString()).ToList(); + var rows = _importer.QueryXlsx(path.ToString()).ToList(); Assert.Equal("2022-01-22", rows[1].A); } } @@ -1211,9 +1214,9 @@ public void TestIssue312() new() { Value = 12345.6789}, new() { Value = null} ]; - Exporter.ExportXlsx(path.ToString(), value); + _exporter.ExportXlsx(path.ToString(), value); - var rows = Importer.QueryXlsx(path.ToString()).ToList(); + var rows = _importer.QueryXlsx(path.ToString()).ToList(); Assert.Equal("12,345.68", rows[1].A); } @@ -1225,9 +1228,9 @@ public void TestIssue312() new() { Value = 12345.6789}, new() { Value = null} ]; - Exporter.ExportXlsx(path.ToString(), value); + _exporter.ExportXlsx(path.ToString(), value); - var rows = Importer.QueryXlsx(path.ToString()).ToList(); + var rows = _importer.QueryXlsx(path.ToString()).ToList(); Assert.Equal("12,345.68", rows[1].A); } } @@ -1248,7 +1251,7 @@ public void TestIssue209() try { var path = PathHelper.GetFile("xlsx/TestIssue309.xlsx"); - var rows = Importer.QueryXlsx(path).ToList(); + var rows = _importer.QueryXlsx(path).ToList(); } catch (MiniExcelInvalidCastException ex) { @@ -1279,13 +1282,13 @@ public void TestIssue318() { new { Name="github", Image=imageByte}, }; - Exporter.ExportXlsx(path.ToString(), value); + _exporter.ExportXlsx(path.ToString(), value); // import to byte[] { const string expectedBase64 = "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAIAAAD9b0jDAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAEXRFWHRTb2Z0d2FyZQBTbmlwYXN0ZV0Xzt0AAALNSURBVEiJ7ZVLTBNBGMdndrfdIofy0ERbCgcFeYRuCy2JGOPNRA9qeIZS6YEEogQj0YMmGOqDSATxQaLRxKtRID4SgjGelUBpaQvGZ7kpII8aWtjd2dkdDxsJoS1pIh6M/k+z8833m/3+8+0OJISArRa15cT/0D8CZTYPe32+Zy+GxjzjMzOzAACDYafdZquqOG7hzJtkwUQthRC6cavv0eN+QRTBujUQQp1OV1dbffZMq1arTRaqKIok4eZTrSNjHqIo6gIIIQBgbQwpal+Z/f7dPo2GoaiNHtJut3vjPhBe7+kdfvW61Mq1nGyaX1xYjkRzsk2Z6Rm8IOTvzWs73SLwwqjHK4jCgf3lcV6VxGgiECji7AXm0gvtHYQQnue/zy8ghCRJWlxaWuV5Qsilq9cKzLYiiz04ORVLiHP6A4NPRQlhjLWsVpZlnU63Y3umRqNhGCYjPV3HsrIsMwyDsYQQejIwGEuIA/WMT1AAaDSahnoHTdPKL1vXPKVp2umoZVkWAOj1+ZOCzs7NKYTo9XqjYRcAgKIo9ZRUu9VxltGYZTQAAL5+m0kKijEmAPCrqyJCcRuOECKI4lL4ByEEYykpaE62iQIgurLi9wchhLIsry8fYwwh9PomwuEwACDbZEoKauHMgKJSU1PbOy6Hpqdpml5fPsMwn7+EOru6IYQAghKrJSloTVUFURSX02G3lRw+WulqbA4EJ9XQh4+f2s6dr65zhkLTEEIKwtqaylhCnG/fauFO1Nfde/Bw6Hm/0WiYevc+LU2vhlK2pQwNvwQAsCwrYexyOrji4lhCnOaXZRljXONoOHTk2Ju3I/5AcC3EC0JZ+cE9Bea8IqursUkUker4BsWBqpIk6aL7Sm4htzvfvByJqJORaDS3kMsvLuns6kYIJcpNCFU17pvouXlHEET1URDEnt7bo2OezbMS/vp+R3/PdfKPQ38Ccg0E/CDcpY8AAAAASUVORK5CYII="; - var rows = Importer.QueryXlsx(path.ToString(), true).ToList(); + var rows = _importer.QueryXlsx(path.ToString(), true).ToList(); var actulBase64 = Convert.ToBase64String((byte[])rows[0].Image); Assert.Equal(expectedBase64, actulBase64); } @@ -1293,7 +1296,7 @@ public void TestIssue318() // import to base64 string { var config = new OpenXmlConfiguration { EnableConvertByteArray = false }; - var rows = Importer.QueryXlsx(path.ToString(), true, configuration: config).ToList(); + var rows = _importer.QueryXlsx(path.ToString(), true, configuration: config).ToList(); var image = (string)rows[0].Image; Assert.StartsWith("@@@fileid@@@,xl/media/", image); } @@ -1316,7 +1319,7 @@ public void TestIssue304() new { Name="reddit", Image=File.ReadAllBytes(PathHelper.GetFile("images/reddit_logo.png"))}, new { Name="statck_overflow", Image=File.ReadAllBytes(PathHelper.GetFile("images/statck_overflow_logo.png"))}, }; - Exporter.ExportXlsx(path, value); + _exporter.ExportXlsx(path, value); Assert.Contains("/xl/media/", Helpers.GetZipFileContent(path, "xl/drawings/_rels/drawing1.xml.rels")); Assert.Contains("ext cx=\"609600\" cy=\"190500\"", Helpers.GetZipFileContent(path, "xl/drawings/drawing1.xml")); @@ -1340,9 +1343,9 @@ public void TestIssueI4HL54() { { "Texts",reader} }; - Templater.ApplyXlsxTemplate(path.ToString(), templatePath, value); + _templater.ApplyXlsxTemplate(path.ToString(), templatePath, value); - var rows = Importer.QueryXlsx(path.ToString(), true).ToList(); + var rows = _importer.QueryXlsx(path.ToString(), true).ToList(); Assert.Equal("Hello World1", rows[0].Text); Assert.Equal("Hello World2", rows[1].Text); } @@ -1357,21 +1360,21 @@ public void TestIssue294() { using var path = AutoDeletingPath.Create(); var value = new[] { new { Name = " Jack" } }; - Exporter.ExportXlsx(path.ToString(), value); + _exporter.ExportXlsx(path.ToString(), value); var sheetXml = Helpers.GetZipFileContent(path.ToString(), "xl/worksheets/sheet1.xml"); Assert.Contains("xml:space=\"preserve\"", sheetXml); } { using var path = AutoDeletingPath.Create(); var value = new[] { new { Name = "Ja ck" } }; - Exporter.ExportXlsx(path.ToString(), value); + _exporter.ExportXlsx(path.ToString(), value); var sheetXml = Helpers.GetZipFileContent(path.ToString(), "xl/worksheets/sheet1.xml"); Assert.DoesNotContain("xml:space=\"preserve\"", sheetXml); } { using var path = AutoDeletingPath.Create(); var value = new[] { new { Name = "Jack " } }; - Exporter.ExportXlsx(path.ToString(), value); + _exporter.ExportXlsx(path.ToString(), value); var sheetXml = Helpers.GetZipFileContent(path.ToString(), "xl/worksheets/sheet1.xml"); Assert.Contains("xml:space=\"preserve\"", sheetXml); } @@ -1386,7 +1389,7 @@ public void TestIssue298() { var path = PathHelper.GetFile("/csv/TestIssue298.csv"); #pragma warning disable CS0618 // Type or member is obsolete - var dt = Importer.QueryCsvAsDataTable(path); + var dt = _importer.QueryCsvAsDataTable(path); #pragma warning restore CS0618 Assert.Equal(["ID", "Name", "Age"], dt.Columns.Cast().Select(x => x.ColumnName)); } @@ -1405,7 +1408,7 @@ public void TestIssueI4DQUN() { "Title", "Hello & World < , > , \" , '" }, { "Details", new[] { new { Value = "Hello & Value < , > , \" , '" } } }, }; - Templater.ApplyXlsxTemplate(path.ToString(), templatePath, value); + _templater.ApplyXlsxTemplate(path.ToString(), templatePath, value); var sheetXml = Helpers.GetZipFileContent(path.ToString(), "xl/worksheets/sheet1.xml"); Assert.Contains("Hello & World < , > , \" , '", sheetXml); @@ -1421,7 +1424,7 @@ public void TestIssue190() { using var path = AutoDeletingPath.Create(); var value = new TestIssue190Dto[] { }; - Exporter.ExportXlsx(path.ToString(), value, configuration: new OpenXmlConfiguration { AutoFilter = false }); + _exporter.ExportXlsx(path.ToString(), value, configuration: new OpenXmlConfiguration { AutoFilter = false }); var sheetXml = Helpers.GetZipFileContent(path.ToString(), "xl/worksheets/sheet1.xml"); Assert.DoesNotContain("", sheetXml); @@ -1429,7 +1432,7 @@ public void TestIssue190() { using var path = AutoDeletingPath.Create(); var value = new TestIssue190Dto[] { }; - Exporter.ExportXlsx(path.ToString(), value); + _exporter.ExportXlsx(path.ToString(), value); var sheetXml = Helpers.GetZipFileContent(path.ToString(), "xl/worksheets/sheet1.xml"); Assert.Contains("", sheetXml); @@ -1441,7 +1444,7 @@ public void TestIssue190() new() { ID = 1, Name = "Jack", Age = 32 }, new() { ID = 2, Name = "Lisa", Age = 45 } ]; - Exporter.ExportXlsx(path.ToString(), value); + _exporter.ExportXlsx(path.ToString(), value); var sheetXml = Helpers.GetZipFileContent(path.ToString(), "xl/worksheets/sheet1.xml"); Assert.Contains("", sheetXml); @@ -1464,7 +1467,7 @@ public void TestIssue292() { var xlsxPath = PathHelper.GetFile("/xlsx/TestIssue292.xlsx"); using var csvPath = AutoDeletingPath.Create(ExcelType.Csv); - Exporter.ConvertXlsxToCsv(xlsxPath, csvPath.ToString(), false); + _exporter.ConvertXlsxToCsv(xlsxPath, csvPath.ToString(), false); var actualCotent = File.ReadAllText(csvPath.ToString()); Assert.Equal( @@ -1480,9 +1483,9 @@ public void TestIssue292() { var csvPath = PathHelper.GetFile("/csv/TestIssue292.csv"); using var path = AutoDeletingPath.Create(); - Exporter.ConvertCsvToXlsx(csvPath, path.ToString()); + _exporter.ConvertCsvToXlsx(csvPath, path.ToString()); - var rows = Importer.QueryXlsx(path.ToString()).ToList(); + var rows = _importer.QueryXlsx(path.ToString()).ToList(); Assert.Equal(3, rows.Count); Assert.Equal("Name", rows[0].A); Assert.Equal("Age", rows[0].B); @@ -1504,8 +1507,8 @@ public void TestIssue293() var path = PathHelper.GetFile("/csv/Test5x2.csv"); using var tempPath = AutoDeletingPath.Create(); using var csv = File.OpenRead(path); - var value = Importer.QueryCsv(csv, useHeaderRow: false); - Exporter.ExportXlsx(tempPath.ToString(), value, printHeader: false); + var value = _importer.QueryCsv(csv, useHeaderRow: false); + _exporter.ExportXlsx(tempPath.ToString(), value, printHeader: false); } [Fact] @@ -1519,8 +1522,8 @@ public void TestIssueI49RYZ() new() { Name="Lisa", UserType=null } ]; using var path = AutoDeletingPath.Create(); - Exporter.ExportXlsx(path.ToString(), values); - var rows = Importer.QueryXlsx(path.ToString(), true).ToList(); + _exporter.ExportXlsx(path.ToString(), values); + var rows = _importer.QueryXlsx(path.ToString(), true).ToList(); Assert.Equal("GeneralUser", rows[0].UserType); Assert.Equal("SuperAdministrator", rows[1].UserType); Assert.Equal("GeneralAdministrator", rows[2].UserType); @@ -1536,8 +1539,8 @@ public void TestIssue286() new() { E = TestIssue286Enum.VIP2 } ]; using var path = AutoDeletingPath.Create(); - Exporter.ExportXlsx(path.ToString(), values); - var rows = Importer.QueryXlsx(path.ToString(), true).ToList(); + _exporter.ExportXlsx(path.ToString(), values); + var rows = _importer.QueryXlsx(path.ToString(), true).ToList(); Assert.Equal("VIP1", rows[0].E); Assert.Equal("VIP2", rows[1].E); @@ -1578,11 +1581,11 @@ public void TestIssue283() { "sheet01", cn.ExecuteReader("select 'v1' col1") }, { "sheet02", cn.ExecuteReader("select 'v2' col1") } }; - var rows = Exporter.ExportXlsx(path.ToString(), sheets); + var rows = _exporter.ExportXlsx(path.ToString(), sheets); Assert.Equal(2, rows.Length); } - var sheetNames = Importer.GetSheetNames(path.ToString()); + var sheetNames = _importer.GetSheetNames(path.ToString()); Assert.Equal(["sheet01", "sheet02"], sheetNames); } @@ -1594,25 +1597,25 @@ public void TestIssueI40QA5() { { var path = PathHelper.GetFile("/xlsx/TestIssueI40QA5_1.xlsx"); - var rows = Importer.QueryXlsx(path).ToList(); + var rows = _importer.QueryXlsx(path).ToList(); Assert.Equal("E001", rows[0].Empno); Assert.Equal("E002", rows[1].Empno); } { var path = PathHelper.GetFile("/xlsx/TestIssueI40QA5_2.xlsx"); - var rows = Importer.QueryXlsx(path).ToList(); + var rows = _importer.QueryXlsx(path).ToList(); Assert.Equal("E001", rows[0].Empno); Assert.Equal("E002", rows[1].Empno); } { var path = PathHelper.GetFile("/xlsx/TestIssueI40QA5_3.xlsx"); - var rows = Importer.QueryXlsx(path).ToList(); + var rows = _importer.QueryXlsx(path).ToList(); Assert.Equal("E001", rows[0].Empno); Assert.Equal("E002", rows[1].Empno); } { var path = PathHelper.GetFile("/xlsx/TestIssueI40QA5_4.xlsx"); - var rows = Importer.QueryXlsx(path).ToList(); + var rows = _importer.QueryXlsx(path).ToList(); Assert.Null(rows[0].Empno); Assert.Null(rows[1].Empno); } @@ -1634,8 +1637,8 @@ public void TestIssues133() var value = new DataTable(); value.Columns.Add("Id"); value.Columns.Add("Name"); - Exporter.ExportXlsx(path.ToString(), value); - var rows = Importer.QueryXlsx(path.ToString()).ToList(); + _exporter.ExportXlsx(path.ToString(), value); + var rows = _importer.QueryXlsx(path.ToString()).ToList(); Assert.Equal("Id", rows[0].A); Assert.Equal("Name", rows[0].B); @@ -1647,8 +1650,8 @@ public void TestIssues133() using var path = AutoDeletingPath.Create(); var value = Array.Empty(); - Exporter.ExportXlsx(path.ToString(), value); - var rows = Importer.QueryXlsx(path.ToString()).ToList(); + _exporter.ExportXlsx(path.ToString(), value); + var rows = _importer.QueryXlsx(path.ToString()).ToList(); Assert.Equal("Id", rows[0].A); Assert.Equal("Name", rows[0].B); @@ -1672,7 +1675,7 @@ public void TestIssueI45TF5_2() { var value = new[] { new Dictionary { { "Col1&Col2", "V1&V2" } } }; var path = PathHelper.GetTempPath(); - Exporter.ExportXlsx(path, value); + _exporter.ExportXlsx(path, value); //System.Xml.XmlException : '<' is an unexpected token. The expected token is ';'. Helpers.GetZipFileContent(path, "xl/worksheets/sheet1.xml"); //check illegal format or not } @@ -1682,7 +1685,7 @@ public void TestIssueI45TF5_2() dt.Columns.Add("Col1&Col2"); dt.Rows.Add("V1&V2"); var path = PathHelper.GetTempPath(); - Exporter.ExportXlsx(path, dt); + _exporter.ExportXlsx(path, dt); //System.Xml.XmlException : '<' is an unexpected token. The expected token is ';'. Helpers.GetZipFileContent(path, "xl/worksheets/sheet1.xml"); //check illegal format or not } @@ -1692,7 +1695,7 @@ public void TestIssueI45TF5_2() public void TestIssueI45TF5() { using var path = AutoDeletingPath.Create(); - Exporter.ExportXlsx(path.ToString(), new[] { new { C1 = "1&2;3,4", C2 = "1&2;3,4" } }); + _exporter.ExportXlsx(path.ToString(), new[] { new { C1 = "1&2;3,4", C2 = "1&2;3,4" } }); var sheet1Xml = Helpers.GetZipFileContent(path.ToString(), "xl/worksheets/sheet1.xml"); Assert.DoesNotContain("", sheet1Xml); } @@ -1709,7 +1712,7 @@ public void TestIssue280() new() { ID = 2, Name = "Mike" } ]; using var path = AutoDeletingPath.Create(); - Exporter.ExportXlsx(path.ToString(), value); + _exporter.ExportXlsx(path.ToString(), value); } private class TestIssue280Dto @@ -1728,7 +1731,7 @@ public void TestIssue279() { var path = PathHelper.GetFile("/csv/TestHeader.csv"); #pragma warning disable CS0618 // Type or member is obsolete - using var dt = Importer.QueryCsvAsDataTable(path); + using var dt = _importer.QueryCsvAsDataTable(path); #pragma warning restore CS0618 Assert.Equal("A1", dt.Rows[0]["Column1"]); Assert.Equal("A2", dt.Rows[1]["Column1"]); @@ -1743,7 +1746,7 @@ public void TestIssue279() public void TestIssue272() { var path = PathHelper.GetFile("/xlsx/TestIssue272.xlsx"); - Assert.Throws(() => Importer.QueryXlsx(path).ToList()); + Assert.Throws(() => _importer.QueryXlsx(path).ToList()); } /// @@ -1753,7 +1756,7 @@ public void TestIssue272() public void TestIssue267() { var path = PathHelper.GetFile("/xlsx/TestIssue267.xlsx"); - var row = Importer.QueryXlsx(path).SingleOrDefault(); + var row = _importer.QueryXlsx(path).SingleOrDefault(); Assert.Equal(10618, row!.A); Assert.Equal("2021-02-23", row.B); Assert.Equal(43.199999999999996, row.C); @@ -1796,7 +1799,7 @@ public void TestIssueI3X2ZL() try { var path = PathHelper.GetFile("xlsx/TestIssueI3X2ZL_datetime_error.xlsx"); - var rows = Importer.QueryXlsx(path, startCell: "B3").ToList(); + var rows = _importer.QueryXlsx(path, startCell: "B3").ToList(); } catch (InvalidCastException ex) { @@ -1809,7 +1812,7 @@ public void TestIssueI3X2ZL() try { var path = PathHelper.GetFile("xlsx/TestIssueI3X2ZL_int_error.xlsx"); - var rows = Importer.QueryXlsx(path).ToList(); + var rows = _importer.QueryXlsx(path).ToList(); } catch (InvalidCastException ex) { @@ -1835,8 +1838,8 @@ public void TestIssue261() var csvPath = PathHelper.GetFile("csv/TestCsvToXlsx.csv"); using var path = AutoDeletingPath.Create(); - Exporter.ConvertCsvToXlsx(csvPath, path.FilePath); - var rows = Importer.QueryXlsx(path.ToString()).ToList(); + _exporter.ConvertCsvToXlsx(csvPath, path.FilePath); + var rows = _importer.QueryXlsx(path.ToString()).ToList(); Assert.Equal("Name", rows[0].A); Assert.Equal("Jack", rows[1].A); @@ -1868,8 +1871,8 @@ public void Issue255() new Issue255DTO { Time = new DateTime(2021, 01, 01), Time2 = new DateTime(2021, 01, 01) } } }; - Templater.ApplyXlsxTemplate(path.ToString(), templatePath, value); - var rows = Importer.QueryXlsx(path.ToString()).ToList(); + _templater.ApplyXlsxTemplate(path.ToString(), templatePath, value); + var rows = _importer.QueryXlsx(path.ToString()).ToList(); Assert.Equal("2021", rows[1].A.ToString()); Assert.Equal("2021", rows[1].B.ToString()); } @@ -1880,8 +1883,8 @@ public void Issue255() { new Issue255DTO { Time = new DateTime(2021, 01, 01) } }; - Exporter.ExportXlsx(path.ToString(), value); - var rows = Importer.QueryXlsx(path.ToString()).ToList(); + _exporter.ExportXlsx(path.ToString(), value); + var rows = _importer.QueryXlsx(path.ToString()).ToList(); Assert.Equal("2021", rows[1].A.ToString()); } } @@ -1903,7 +1906,7 @@ private class Issue255DTO public void Issue256() { var path = PathHelper.GetFile("xlsx/TestIssue256.xlsx"); - var rows = Importer.QueryXlsx(path, false).ToList(); + var rows = _importer.QueryXlsx(path, false).ToList(); Assert.Equal(new DateTime(2003, 4, 16), rows[1].A); Assert.Equal(new DateTime(2004, 4, 16), rows[1].B); } @@ -1918,7 +1921,7 @@ public void Issue253() { var value = new[] { new { col1 = "世界你好" } }; using var path = AutoDeletingPath.Create(ExcelType.Csv); - Exporter.ExportCsv(path.ToString(), value); + _exporter.ExportCsv(path.ToString(), value); const string expected = """ col1 @@ -1936,7 +1939,7 @@ public void Issue253() { StreamWriterFunc = stream => new StreamWriter(stream, Encoding.GetEncoding("gb2312")) }; - Exporter.ExportCsv(path.ToString(), value, configuration: config); + _exporter.ExportCsv(path.ToString(), value, configuration: config); const string expected = """ col1 @@ -1951,7 +1954,7 @@ public void Issue253() { var value = cn.ExecuteReader("select '世界你好' col1"); using var path = AutoDeletingPath.Create(ExcelType.Csv); - Exporter.ExportCsv(path.ToString(), value); + _exporter.ExportCsv(path.ToString(), value); const string expected = """ col1 @@ -1971,7 +1974,7 @@ public void Issue251() using var cn = Db.GetConnection(); using var reader = cn.ExecuteReader(@"select '""<>+-*//}{\\n' a,1234567890 b union all select 'Hello World',-1234567890"); using var path = AutoDeletingPath.Create(ExcelType.Csv); - Exporter.ExportCsv(path.ToString(), reader); + _exporter.ExportCsv(path.ToString(), reader); const string expected = """" a,b @@ -1990,10 +1993,10 @@ public void Issue251() public void Issue242() { var path = PathHelper.GetFile("xls/TestIssue242.xls"); - Assert.Throws(() => Importer.QueryXlsx(path).ToList()); + Assert.Throws(() => _importer.QueryXlsx(path).ToList()); using var stream = File.OpenRead(path); - Assert.Throws(() => Importer.QueryXlsx(stream).ToList()); + Assert.Throws(() => _importer.QueryXlsx(stream).ToList()); } /// @@ -2008,9 +2011,9 @@ public void Issue243() new { Name = "Jack", Age = 25, InDate = new DateTime(2021,01,03) }, new { Name = "Henry", Age = 36, InDate = new DateTime(2020,05,03) }, }; - Exporter.ExportXlsx(path.ToString(), value); + _exporter.ExportXlsx(path.ToString(), value); - var rows = Importer.QueryXlsx(path.ToString()).ToList(); + var rows = _importer.QueryXlsx(path.ToString()).ToList(); Assert.Equal("Jack", rows[0].Name); Assert.Equal(25, rows[0].Age); Assert.Equal(new DateTime(2021, 01, 03), rows[0].InDate); @@ -2043,16 +2046,16 @@ public void Issue241() // csv { using var path = AutoDeletingPath.Create(ExcelType.Csv); - Exporter.ExportXlsx(path.ToString(), value); + _exporter.ExportXlsx(path.ToString(), value); { - var rows = Importer.QueryXlsx(path.ToString(), true).ToList(); + var rows = _importer.QueryXlsx(path.ToString(), true).ToList(); Assert.Equal(rows[0].InDate, "01 04, 2021"); Assert.Equal(rows[1].InDate, "04 05, 2020"); } { - var rows = Importer.QueryXlsx(path.ToString()).ToList(); + var rows = _importer.QueryXlsx(path.ToString()).ToList(); Assert.Equal(rows[0].InDate, new DateTime(2021, 01, 04)); Assert.Equal(rows[1].InDate, new DateTime(2020, 04, 05)); } @@ -2061,16 +2064,16 @@ public void Issue241() // xlsx { using var path = AutoDeletingPath.Create(); - Exporter.ExportXlsx(path.ToString(), value); + _exporter.ExportXlsx(path.ToString(), value); { - var rows = Importer.QueryXlsx(path.ToString(), true).ToList(); + var rows = _importer.QueryXlsx(path.ToString(), true).ToList(); Assert.Equal(rows[0].InDate, "01 04, 2021"); Assert.Equal(rows[1].InDate, "04 05, 2020"); } { - var rows = Importer.QueryXlsx(path.ToString()).ToList(); + var rows = _importer.QueryXlsx(path.ToString()).ToList(); Assert.Equal(rows[0].InDate, new DateTime(2021, 01, 04)); Assert.Equal(rows[1].InDate, new DateTime(2020, 04, 05)); } @@ -2098,7 +2101,7 @@ public void Issue132() new { name = "Henry", Age = 36, InDate = new DateTime(2020,05,03)}, }; - Exporter.ExportXlsx(path.ToString(), value); + _exporter.ExportXlsx(path.ToString(), value); } { @@ -2112,7 +2115,7 @@ public void Issue132() { TableStyles = TableStyles.None }; - Exporter.ExportXlsx(path.ToString(), value, configuration: config); + _exporter.ExportXlsx(path.ToString(), value, configuration: config); } { @@ -2124,7 +2127,7 @@ public void Issue132() new { name = "Henry", Age = 36, InDate = new DateTime(2020,05,03)}, }) ); - Exporter.ExportXlsx(path.ToString(), value); + _exporter.ExportXlsx(path.ToString(), value); } } @@ -2154,23 +2157,23 @@ public void Issue235() dataSet.Tables.Add(users); dataSet.Tables.Add(department); - var rowsWritten = Exporter.ExportXlsx(path.ToString(), dataSet); + var rowsWritten = _exporter.ExportXlsx(path.ToString(), dataSet); Assert.Equal(2, rowsWritten.Length); Assert.Equal(2, rowsWritten[0]); - var sheetNames = Importer.GetSheetNames(path.ToString()); + var sheetNames = _importer.GetSheetNames(path.ToString()); Assert.Equal("users", sheetNames[0]); Assert.Equal("department", sheetNames[1]); { - var rows = Importer.QueryXlsx(path.ToString(), true, sheetName: "users").ToList(); + var rows = _importer.QueryXlsx(path.ToString(), true, sheetName: "users").ToList(); Assert.Equal("Jack", rows[0].Name); Assert.Equal(25, rows[0].Age); Assert.Equal("Mike", rows[1].Name); Assert.Equal(44, rows[1].Age); } { - var rows = Importer.QueryXlsx(path.ToString(), true, sheetName: "department").ToList(); + var rows = _importer.QueryXlsx(path.ToString(), true, sheetName: "department").ToList(); Assert.Equal("01", rows[0].ID); Assert.Equal("HR", rows[0].Name); Assert.Equal("02", rows[1].ID); @@ -2186,7 +2189,7 @@ public void Issue233() { var path = PathHelper.GetFile("xlsx/TestIssue233.xlsx"); #pragma warning disable CS0618 // Type or member is obsolete - var dt = Importer.QueryXlsxAsDataTable(path); + var dt = _importer.QueryXlsxAsDataTable(path); #pragma warning restore CS0618 var rows = dt.Rows; @@ -2207,9 +2210,9 @@ public void Issue237() new{ id="1,2,3"}, }; using var path = AutoDeletingPath.Create(ExcelType.Csv); - Exporter.ExportXlsx(path.ToString(), value); + _exporter.ExportXlsx(path.ToString(), value); - var rows = Importer.QueryXlsx(path.ToString(), true).ToList(); + var rows = _importer.QueryXlsx(path.ToString(), true).ToList(); Assert.Equal("\"\"1,2,3\"\"", rows[0].id); Assert.Equal("1,2,3", rows[1].id); @@ -2239,21 +2242,21 @@ public void Issue234() ["users"] = users, ["department"] = department }; - Exporter.ExportXlsx(path, sheets); + _exporter.ExportXlsx(path, sheets); - var sheetNames = Importer.GetSheetNames(path); + var sheetNames = _importer.GetSheetNames(path); Assert.Equal("users", sheetNames[0]); Assert.Equal("department", sheetNames[1]); { - var rows = Importer.QueryXlsx(path, true, sheetName: "users").ToList(); + var rows = _importer.QueryXlsx(path, true, sheetName: "users").ToList(); Assert.Equal("Jack", rows[0].Name); Assert.Equal(25, rows[0].Age); Assert.Equal("Mike", rows[1].Name); Assert.Equal(44, rows[1].Age); } { - var rows = Importer.QueryXlsx(path, true, sheetName: "department").ToList(); + var rows = _importer.QueryXlsx(path, true, sheetName: "department").ToList(); Assert.Equal("01", rows[0].ID); Assert.Equal("HR", rows[0].Name); Assert.Equal("02", rows[1].ID); @@ -2308,8 +2311,8 @@ public void Issue230() using (var reader = cmd3.ExecuteReader(CommandBehavior.CloseConnection)) { using var path = AutoDeletingPath.Create(); - Exporter.ExportXlsx(path.ToString(), reader, printHeader: true); - var rows = Importer.QueryXlsx(path.ToString(), true).ToList(); + _exporter.ExportXlsx(path.ToString(), reader, printHeader: true); + var rows = _importer.QueryXlsx(path.ToString(), true).ToList(); Assert.Equal(1, rows[0].id); Assert.Equal(2, rows[1].id); } @@ -2324,7 +2327,7 @@ public void Issue229() { var path = PathHelper.GetFile("xlsx/TestIssue229.xlsx"); #pragma warning disable CS0618 // Type or member is obsolete - using var dt = Importer.QueryXlsxAsDataTable(path); + using var dt = _importer.QueryXlsxAsDataTable(path); #pragma warning restore CS0618 foreach (DataColumn column in dt.Columns) { @@ -2347,7 +2350,7 @@ public void Issue122() { var path = PathHelper.GetFile("xlsx/TestIssue122.xlsx"); { - var rows = Importer.QueryXlsx(path, useHeaderRow: true, configuration: config).ToList(); + var rows = _importer.QueryXlsx(path, useHeaderRow: true, configuration: config).ToList(); Assert.Equal("HR", rows[0].Department); Assert.Equal("HR", rows[1].Department); Assert.Equal("HR", rows[2].Department); @@ -2360,7 +2363,7 @@ public void Issue122() { var path = PathHelper.GetFile("xlsx/TestIssue122_2.xlsx"); { - var rows = Importer.QueryXlsx(path, useHeaderRow: true, configuration: config).ToList(); + var rows = _importer.QueryXlsx(path, useHeaderRow: true, configuration: config).ToList(); Assert.Equal("V1", rows[2].Test1); Assert.Equal("V2", rows[5].Test2); Assert.Equal("V3", rows[1].Test3); @@ -2380,14 +2383,14 @@ public void Issue227() { { var path = PathHelper.GetTempPath("xlsm"); - Assert.Throws(() => Exporter.ExportXlsx(path, new[] { new { V = "A1" }, new { V = "A2" } })); + Assert.Throws(() => _exporter.ExportXlsx(path, new[] { new { V = "A1" }, new { V = "A2" } })); File.Delete(path); } { var path = PathHelper.GetFile("xlsx/TestIssue227.xlsm"); { - var rows = Importer.QueryXlsx(path).ToList(); + var rows = _importer.QueryXlsx(path).ToList(); Assert.Equal(100, rows.Count); Assert.Equal(Guid.Parse("78DE23D2-DCB6-BD3D-EC67-C112BBC322A2"), rows[0].ID); @@ -2400,7 +2403,7 @@ public void Issue227() } { using var stream = File.OpenRead(path); - var rows = Importer.QueryXlsx(stream).ToList(); + var rows = _importer.QueryXlsx(stream).ToList(); Assert.Equal(100, rows.Count); Assert.Equal(Guid.Parse("78DE23D2-DCB6-BD3D-EC67-C112BBC322A2"), rows[0].ID); @@ -2425,7 +2428,7 @@ public void Issue226() { using var path = AutoDeletingPath.Create(); var templatePath = PathHelper.GetFile("xlsx/TestIssue226.xlsx"); - Templater.ApplyXlsxTemplate(path.ToString(), templatePath, new { employees = new[] { new { name = "123" }, new { name = "123" } } }); + _templater.ApplyXlsxTemplate(path.ToString(), templatePath, new { employees = new[] { new { name = "123" }, new { name = "123" } } }); Assert.Equal("A1:A3", Helpers.GetFirstSheetDimensionRefValue(path.ToString())); } @@ -2443,10 +2446,10 @@ public void Issue223() new() { { "A", Guid.NewGuid() }, { "B", "HelloWorld" } } ]; using var path = AutoDeletingPath.Create(); - Exporter.ExportXlsx(path.ToString(), value); + _exporter.ExportXlsx(path.ToString(), value); #pragma warning disable CS0618 // Type or member is obsolete - using var dt = Importer.QueryXlsxAsDataTable(path.ToString()); + using var dt = _importer.QueryXlsxAsDataTable(path.ToString()); #pragma warning restore CS0618 var columns = dt.Columns; Assert.Equal(typeof(object), columns[0].DataType); @@ -2464,7 +2467,7 @@ public void Issue223() public void Issue222() { var path = PathHelper.GetFile("xlsx/TestIssue222.xlsx"); - var rows = Importer.QueryXlsx(path).ToList(); + var rows = _importer.QueryXlsx(path).ToList(); Assert.Equal(typeof(DateTime), rows[1].A.GetType()); Assert.Equal(new DateTime(2021, 4, 29), rows[1].A); } @@ -2478,7 +2481,7 @@ public void Issue147() { { var path = PathHelper.GetFile("xlsx/TestIssue147.xlsx"); - var rows = Importer.QueryXlsx(path, useHeaderRow: false, startCell: "C3", sheetName: "Sheet1").ToList(); + var rows = _importer.QueryXlsx(path, useHeaderRow: false, startCell: "C3", sheetName: "Sheet1").ToList(); Assert.Equal(["C", "D", "E"], (rows[0] as IDictionary)?.Keys); Assert.Equal(["Column1", "Column2", "Column3"], new[] { rows[0].C as string, rows[0].D as string, rows[0].E as string }); @@ -2492,13 +2495,13 @@ public void Issue147() Assert.Equal(11, rows.Count); - var columns = Importer.GetXlsxColumns(path, startCell: "C3"); + var columns = _importer.GetXlsxColumns(path, startCell: "C3"); Assert.Equal(["C", "D", "E"], columns); } { var path = PathHelper.GetFile("xlsx/TestIssue147.xlsx"); - var rows = Importer.QueryXlsx(path, useHeaderRow: true, startCell: "C3", sheetName: "Sheet1").ToList(); + var rows = _importer.QueryXlsx(path, useHeaderRow: true, startCell: "C3", sheetName: "Sheet1").ToList(); Assert.Equal(["Column1", "Column2", "Column3"], (rows[0] as IDictionary)?.Keys); Assert.Equal(["C4", "D4", "E4"], new[] { rows[0].Column1 as string, rows[0].Column2 as string, rows[0].Column3 as string }); @@ -2510,7 +2513,7 @@ public void Issue147() Assert.Equal(10, rows.Count); - var columns = Importer.GetXlsxColumns(path, useHeaderRow: true, startCell: "C3"); + var columns = _importer.GetXlsxColumns(path, useHeaderRow: true, startCell: "C3"); Assert.Equal(["Column1", "Column2", "Column3"], columns); } } @@ -2529,8 +2532,8 @@ public void Issue211() using var connection = new SQLiteConnection(connectionString); var reader = connection.ExecuteReader(@"select 1 Test1,2 Test2 union all select 3 , 4 union all select 5 ,6"); - Exporter.ExportXlsx(path.ToString(), reader); - var rows = Importer.QueryXlsx(path.ToString(), true).ToList(); + _exporter.ExportXlsx(path.ToString(), reader); + var rows = _importer.QueryXlsx(path.ToString(), true).ToList(); Assert.Equal(1.0, rows[0].Test1); Assert.Equal(2.0, rows[0].Test2); @@ -2550,11 +2553,11 @@ public void Issue216() new { Test1 = "1", Test2 = 2 }, new { Test1 = "3", Test2 = 4 } }; - Exporter.ExportXlsx(path.ToString(), value); + _exporter.ExportXlsx(path.ToString(), value); { #pragma warning disable CS0618 // Type or member is obsolete - using var table = Importer.QueryXlsxAsDataTable(path.ToString()); + using var table = _importer.QueryXlsxAsDataTable(path.ToString()); #pragma warning restore CS0618 Assert.Equal("Test1", table.Columns[0].ColumnName); Assert.Equal("Test2", table.Columns[1].ColumnName); @@ -2566,7 +2569,7 @@ public void Issue216() { #pragma warning disable CS0618 // Type or member is obsolete - using var dt = Importer.QueryXlsxAsDataTable(path.ToString(), false); + using var dt = _importer.QueryXlsxAsDataTable(path.ToString(), false); #pragma warning restore CS0618 Assert.Equal("Test1", dt.Rows[0]["A"]); Assert.Equal("Test2", dt.Rows[0]["B"]); @@ -2587,18 +2590,18 @@ public void IssueI3OSKV() { using var path = AutoDeletingPath.Create(); var value = new[] { new { Test = "12345678901234567890" } }; - Exporter.ExportXlsx(path.ToString(), value); + _exporter.ExportXlsx(path.ToString(), value); - var A2 = Importer.QueryXlsx(path.ToString(), true).First().Test; + var A2 = _importer.QueryXlsx(path.ToString(), true).First().Test; Assert.Equal("12345678901234567890", A2); } { using var path = AutoDeletingPath.Create(); var value = new[] { new { Test = 123456.789 } }; - Exporter.ExportXlsx(path.ToString(), value); + _exporter.ExportXlsx(path.ToString(), value); - var A2 = Importer.QueryXlsx(path.ToString(), true).First().Test; + var A2 = _importer.QueryXlsx(path.ToString(), true).First().Test; Assert.Equal(123456.789, A2); } } @@ -2612,7 +2615,7 @@ public void IssueI3OSKV() public void Issue220() { var path = PathHelper.GetFile("xlsx/TestIssue220.xlsx"); - var rows = Importer.QueryXlsx(path, useHeaderRow: true); + var rows = _importer.QueryXlsx(path, useHeaderRow: true); var result = rows .GroupBy(s => s.PRT_ID) .Select(g => new @@ -2636,8 +2639,8 @@ public void Issue220() public void Issue215() { using var stream = new MemoryStream(); - Exporter.ExportXlsx(stream, new[] { new { V = "test1" }, new { V = "test2" } }); - var rows = Importer.QueryXlsx(stream, true).ToList(); + _exporter.ExportXlsx(stream, new[] { new { V = "test1" }, new { V = "test2" } }); + var rows = _importer.QueryXlsx(stream, true).ToList(); Assert.Equal("test1", rows[0].V); Assert.Equal("test2", rows[1].V); @@ -2666,15 +2669,15 @@ public void Issue89() writer.Write(text); writer.Flush(); stream.Position = 0; - var rows = Importer.QueryCsv(stream, useHeaderRow: true).ToList(); + var rows = _importer.QueryCsv(stream, useHeaderRow: true).ToList(); Assert.Equal(nameof(Issue89VO.WorkState.OnDuty), rows[0].State); Assert.Equal(nameof(Issue89VO.WorkState.Fired), rows[1].State); Assert.Equal(nameof(Issue89VO.WorkState.Leave), rows[2].State); using var path = AutoDeletingPath.Create(ExcelType.Csv); - Exporter.ExportCsv(path.ToString(), rows); - var rows2 = Importer.QueryCsv(path.ToString()).ToList(); + _exporter.ExportCsv(path.ToString(), rows); + var rows2 = _importer.QueryCsv(path.ToString()).ToList(); Assert.Equal(Issue89VO.WorkState.OnDuty, rows2[0].State); Assert.Equal(Issue89VO.WorkState.Fired, rows2[1].State); @@ -2684,15 +2687,15 @@ public void Issue89() //xlsx { var path = PathHelper.GetFile("xlsx/TestIssue89.xlsx"); - var rows = Importer.QueryXlsx(path).ToList(); + var rows = _importer.QueryXlsx(path).ToList(); Assert.Equal(Issue89VO.WorkState.OnDuty, rows[0].State); Assert.Equal(Issue89VO.WorkState.Fired, rows[1].State); Assert.Equal(Issue89VO.WorkState.Leave, rows[2].State); using var xlsxPath = AutoDeletingPath.Create(); - Exporter.ExportXlsx(xlsxPath.ToString(), rows); - var rows2 = Importer.QueryXlsx(xlsxPath.ToString()).ToList(); + _exporter.ExportXlsx(xlsxPath.ToString(), rows); + var rows2 = _importer.QueryXlsx(xlsxPath.ToString()).ToList(); Assert.Equal(Issue89VO.WorkState.OnDuty, rows2[0].State); Assert.Equal(Issue89VO.WorkState.Fired, rows2[1].State); @@ -2729,9 +2732,9 @@ public void Issue217() // openxml { using var path = AutoDeletingPath.Create(); - Exporter.ExportXlsx(path.ToString(), table); + _exporter.ExportXlsx(path.ToString(), table); - var rows = Importer.QueryXlsx(path.ToString()).ToList(); + var rows = _importer.QueryXlsx(path.ToString()).ToList(); Assert.Equal("Name", rows[0].B); Assert.Equal("Limit", rows[0].C); } @@ -2739,16 +2742,16 @@ public void Issue217() // csv { using var path = AutoDeletingPath.Create(ExcelType.Csv); - Exporter.ExportXlsx(path.ToString(), table); + _exporter.ExportXlsx(path.ToString(), table); - var rows = Importer.QueryXlsx(path.ToString()).ToList(); + var rows = _importer.QueryXlsx(path.ToString()).ToList(); Assert.Equal("Name", rows[0].B); Assert.Equal("Limit", rows[0].C); } } /// - /// _exporter.ExportXlsx(path, table,sheetName:“Name”) ,the actual sheetName is Sheet1 + /// _ _exporter.ExportXlsx(path, table,sheetName:“Name”) ,the actual sheetName is Sheet1 /// https://github.com/mini-software/MiniExcel/issues/212 /// [Fact] @@ -2756,9 +2759,9 @@ public void Issue212() { const string sheetName = "Demo"; using var path = AutoDeletingPath.Create(); - Exporter.ExportXlsx(path.ToString(), new[] { new { x = 1, y = 2 } }, sheetName: sheetName); + _exporter.ExportXlsx(path.ToString(), new[] { new { x = 1, y = 2 } }, sheetName: sheetName); - var actualSheetName = Importer.GetSheetNames(path.ToString()).ToList()[0]; + var actualSheetName = _importer.GetSheetNames(path.ToString()).ToList()[0]; Assert.Equal(sheetName, actualSheetName); } @@ -2784,8 +2787,8 @@ public void Issue207() } }; - Templater.ApplyXlsxTemplate(path, tempaltePath, value); - var rows = Importer.QueryXlsx(path).ToList(); + _templater.ApplyXlsxTemplate(path, tempaltePath, value); + var rows = _importer.QueryXlsx(path).ToList(); Assert.Equal("項目1", rows[0].A); Assert.Equal("[]內容1,[]內容2,[]內容3,[]內容4,[]內容5", rows[0].B); @@ -2828,8 +2831,8 @@ public void Issue207() } }; - Templater.ApplyXlsxTemplate(path, tempaltePath, value); - var rows = Importer.QueryXlsx(path).ToList(); + _templater.ApplyXlsxTemplate(path, tempaltePath, value); + var rows = _importer.QueryXlsx(path).ToList(); Assert.Equal("項目1", rows[0].A); Assert.Equal("[]內容1,[]內容2,[]內容3,[]內容4,[]內容5", rows[0].C); @@ -2857,8 +2860,8 @@ public void Issue87() Tests = Enumerable.Range(1, 5).Select((_, i) => new { test1 = i, test2 = i }) }; - var rows = Importer.QueryXlsx(templatePath).ToList(); - Templater.ApplyXlsxTemplate(path.ToString(), templatePath, value); + var rows = _importer.QueryXlsx(templatePath).ToList(); + _templater.ApplyXlsxTemplate(path.ToString(), templatePath, value); } /// @@ -2868,7 +2871,7 @@ public void Issue87() public void Issue208() { const string path = "../../../../../samples/xlsx/TestIssue208.xlsx"; - var columns = Importer.GetXlsxColumns(path).ToList(); + var columns = _importer.GetXlsxColumns(path).ToList(); Assert.Equal(16384, columns.Count); Assert.Equal("XFD", columns[16383]); } @@ -2892,7 +2895,7 @@ public void Issue206() { ["employees"] = dt }; - Templater.ApplyXlsxTemplate(path.ToString(), templatePath, value); + _templater.ApplyXlsxTemplate(path.ToString(), templatePath, value); var dimension = Helpers.GetFirstSheetDimensionRefValue(path.ToString()); Assert.Equal("A1:B2", dimension); @@ -2908,7 +2911,7 @@ public void Issue206() dt.Rows.Add("Jack", "HR"); var value = new Dictionary { ["employees"] = dt }; - Templater.ApplyXlsxTemplate(path.ToString(), templatePath, value); + _templater.ApplyXlsxTemplate(path.ToString(), templatePath, value); var dimension = Helpers.GetFirstSheetDimensionRefValue(path.ToString()); Assert.Equal("A1:B2", dimension); @@ -2944,11 +2947,11 @@ public void Issue193() new { name = "Keaton", department = "IT" } } }; - Templater.ApplyXlsxTemplate(path, templatePath, value); + _templater.ApplyXlsxTemplate(path, templatePath, value); - foreach (var sheetName in Importer.GetSheetNames(path)) + foreach (var sheetName in _importer.GetSheetNames(path)) { - var rows = Importer.QueryXlsx(path, sheetName: sheetName).ToList(); + var rows = _importer.QueryXlsx(path, sheetName: sheetName).ToList(); Assert.Equal(9, rows.Count); Assert.Equal("FooCompany", rows[0].A); @@ -2995,8 +2998,8 @@ public void Issue193() new {name="Keaton",department="IT"} } }; - Templater.ApplyXlsxTemplate(path.ToString(), templatePath, value); - var rows = Importer.QueryXlsx(path.ToString()).ToList(); + _templater.ApplyXlsxTemplate(path.ToString(), templatePath, value); + var rows = _importer.QueryXlsx(path.ToString()).ToList(); Assert.Equal("FooCompany", rows[0].A); Assert.Equal("Jack", rows[2].B); @@ -3034,12 +3037,12 @@ public void Issue142() MyProperty7 = "MyProperty7" } ]; - var rowsWritten = Exporter.ExportXlsx(path, values); + var rowsWritten = _exporter.ExportXlsx(path, values); Assert.Single(rowsWritten); Assert.Equal(1, rowsWritten[0]); { - var rows = Importer.QueryXlsx(path).ToList(); + var rows = _importer.QueryXlsx(path).ToList(); Assert.Equal("MyProperty4", rows[0].A); Assert.Equal("CustomColumnName", rows[0].B); @@ -3059,7 +3062,7 @@ public void Issue142() } { - var rows = Importer.QueryXlsx(path).ToList(); + var rows = _importer.QueryXlsx(path).ToList(); Assert.Equal("MyProperty4", rows[0].MyProperty4); Assert.Equal("MyProperty1", rows[0].MyProperty1); @@ -3083,7 +3086,7 @@ public void Issue142() MyProperty7 = "MyProperty7" } ]; - var rowsWritten = Exporter.ExportCsv(path, values); + var rowsWritten = _exporter.ExportCsv(path, values); Assert.Single(rowsWritten); Assert.Equal(1, rowsWritten[0]); @@ -3097,7 +3100,7 @@ public void Issue142() Assert.Equal(expected, File.ReadAllText(path)); { - var rows = Importer.QueryCsv(path).ToList(); + var rows = _importer.QueryCsv(path).ToList(); Assert.Equal("MyProperty4", rows[0].MyProperty4); Assert.Equal("MyProperty1", rows[0].MyProperty1); @@ -3115,7 +3118,7 @@ public void Issue142() [ new() { MyProperty1 = 0, MyProperty2 = 0, MyProperty3 = 0, MyProperty4 = 0 } ]; - Assert.Throws(() => Exporter.ExportCsv(path.ToString(), input)); + Assert.Throws(() => _exporter.ExportCsv(path.ToString(), input)); } } @@ -3125,13 +3128,13 @@ public void Issue142_Query() const string path = "../../../../../samples/xlsx/TestIssue142.xlsx"; const string csvPath = "../../../../../samples/csv/TestIssue142.csv"; { - var rows = Importer.QueryXlsx(path).ToList(); + var rows = _importer.QueryXlsx(path).ToList(); Assert.Equal(0, rows[0].MyProperty1); } - Assert.Throws(() => Importer.QueryXlsx(path).ToList()); + Assert.Throws(() => _importer.QueryXlsx(path).ToList()); - var rowsXlsx = Importer.QueryXlsx(path).ToList(); + var rowsXlsx = _importer.QueryXlsx(path).ToList(); Assert.Equal("CustomColumnName", rowsXlsx[0].MyProperty1); Assert.Null(rowsXlsx[0].MyProperty7); Assert.Equal("MyProperty2", rowsXlsx[0].MyProperty2); @@ -3140,7 +3143,7 @@ public void Issue142_Query() Assert.Equal("MyProperty102", rowsXlsx[0].MyProperty5); Assert.Equal("MyProperty6", rowsXlsx[0].MyProperty6); - var rowsCsv = Importer.QueryCsv(csvPath).ToList(); + var rowsCsv = _importer.QueryCsv(csvPath).ToList(); Assert.Equal("CustomColumnName", rowsCsv[0].MyProperty1); Assert.Null(rowsCsv[0].MyProperty7); Assert.Equal("MyProperty2", rowsCsv[0].MyProperty2); @@ -3198,19 +3201,19 @@ public void Issue150() { var path = Path.Combine(Path.GetTempPath(), $"{Guid.NewGuid()}.xlsx"); - Assert.Throws(() => Exporter.ExportXlsx(path, new[] { 1, 2 })); + Assert.Throws(() => _exporter.ExportXlsx(path, new[] { 1, 2 })); File.Delete(path); - Assert.Throws(() => Exporter.ExportXlsx(path, new[] { "1", "2" })); + Assert.Throws(() => _exporter.ExportXlsx(path, new[] { "1", "2" })); File.Delete(path); - Assert.Throws(() => Exporter.ExportXlsx(path, new[] { '1', '2' })); + Assert.Throws(() => _exporter.ExportXlsx(path, new[] { '1', '2' })); File.Delete(path); - Assert.Throws(() => Exporter.ExportXlsx(path, new[] { DateTime.Now })); + Assert.Throws(() => _exporter.ExportXlsx(path, new[] { DateTime.Now })); File.Delete(path); - Assert.Throws(() => Exporter.ExportXlsx(path, new[] { Guid.NewGuid() })); + Assert.Throws(() => _exporter.ExportXlsx(path, new[] { Guid.NewGuid() })); File.Delete(path); } @@ -3260,11 +3263,11 @@ public void Issue157() } ] """); - Exporter.ExportXlsx(path, input); + _exporter.ExportXlsx(path, input); - var rows = Importer.QueryXlsx(path, sheetName: "Sheet1").ToList(); + var rows = _importer.QueryXlsx(path, sheetName: "Sheet1").ToList(); Assert.Equal(6, rows.Count); - Assert.Equal("Sheet1", Importer.GetSheetNames(path).First()); + Assert.Equal("Sheet1", _importer.GetSheetNames(path).First()); using var p = new ExcelPackage(new FileInfo(path)); var ws = p.Workbook.Worksheets.First(); @@ -3275,9 +3278,9 @@ public void Issue157() const string path = "../../../../../samples/xlsx/TestIssue157.xlsx"; { - var rows = Importer.QueryXlsx(path, sheetName: "Sheet1").ToList(); + var rows = _importer.QueryXlsx(path, sheetName: "Sheet1").ToList(); Assert.Equal(6, rows.Count); - Assert.Equal("Sheet1", Importer.GetSheetNames(path).First()); + Assert.Equal("Sheet1", _importer.GetSheetNames(path).First()); } using (var p = new ExcelPackage(new FileInfo(path))) { @@ -3287,7 +3290,7 @@ public void Issue157() } { - var rows = Importer.QueryXlsx(path, sheetName: "Sheet1").ToList(); + var rows = _importer.QueryXlsx(path, sheetName: "Sheet1").ToList(); Assert.Equal(5, rows.Count); Assert.Equal(Guid.Parse("78DE23D2-DCB6-BD3D-EC67-C112BBC322A2"), rows[0].ID); @@ -3320,7 +3323,7 @@ public void Issue149() { const string path = "../../../../../samples/xlsx/TestIssue149.xlsx"; - var rows = Importer.QueryXlsx(path).Select(s => (string)s.A).ToList(); + var rows = _importer.QueryXlsx(path).Select(s => (string)s.A).ToList(); for (int i = 0; i < chars.Length; i++) { //output.WriteLine($"{i} , {chars[i]} , {rows[i]}"); @@ -3334,9 +3337,9 @@ public void Issue149() { using var path = AutoDeletingPath.Create(); var input = chars.Select(s => new { Test = s.ToString() }); - Exporter.ExportXlsx(path.ToString(), input); + _exporter.ExportXlsx(path.ToString(), input); - var rows = Importer.QueryXlsx(path.ToString(), true).Select(s => (string)s.Test).ToList(); + var rows = _importer.QueryXlsx(path.ToString(), true).Select(s => (string)s.Test).ToList(); for (int i = 0; i < chars.Length; i++) { _output.WriteLine($"{i}, {chars[i]}, {rows[i]}"); @@ -3350,9 +3353,9 @@ public void Issue149() { using var path = AutoDeletingPath.Create(); var input = chars.Select(s => new { Test = s.ToString() }); - Exporter.ExportXlsx(path.ToString(), input); + _exporter.ExportXlsx(path.ToString(), input); - var rows = Importer.QueryXlsx(path.ToString()).Select(s => s.Test).ToList(); + var rows = _importer.QueryXlsx(path.ToString()).Select(s => s.Test).ToList(); for (int i = 0; i < chars.Length; i++) { _output.WriteLine($"{i}, {chars[i]}, {rows[i]}"); @@ -3376,7 +3379,7 @@ private class Issue149VO public void Issue153() { const string path = "../../../../../samples/xlsx/TestIssue153.xlsx"; - var rows = Importer.QueryXlsx(path, true).First() as IDictionary; + var rows = _importer.QueryXlsx(path, true).First() as IDictionary; Assert.Equal( [ "序号", "代号", "新代号", "名称", "XXX", "部门名称", "单位", "ERP工时 (小时)A", "工时(秒) A/3600", "标准人工工时(秒)", @@ -3393,7 +3396,7 @@ public void Issue137() const string path = "../../../../../samples/xlsx/TestIssue137.xlsx"; { - var rows = Importer.QueryXlsx(path).ToList(); + var rows = _importer.QueryXlsx(path).ToList(); var first = rows[0] as IDictionary; // https://user-images.githubusercontent.com/12729184/113266322-ba06e400-9307-11eb-9521-d36abfda75cc.png Assert.Equal(["A", "B", "C", "D", "E", "F", "G", "H"], first?.Keys.ToArray()); Assert.Equal(11, rows.Count); @@ -3427,7 +3430,7 @@ public void Issue137() // dynamic query with head { - var rows = Importer.QueryXlsx(path, true).ToList(); + var rows = _importer.QueryXlsx(path, true).ToList(); var first = rows[0] as IDictionary; //![image](https://user-images.githubusercontent.com/12729184/113266322-ba06e400-9307-11eb-9521-d36abfda75cc.png) Assert.Equal(["比例", "商品", "滿倉口數", "0", "1為港幣 0為台幣"], first?.Keys.ToArray()); Assert.Equal(10, rows.Count); @@ -3447,7 +3450,7 @@ public void Issue137() } { - var rows = Importer.QueryXlsx(path).ToList(); + var rows = _importer.QueryXlsx(path).ToList(); Assert.Equal(10, rows.Count); { var row = rows[0]; @@ -3479,7 +3482,7 @@ public void Issue138() { const string path = "../../../../../samples/xlsx/TestIssue138.xlsx"; { - var rows = Importer.QueryXlsx(path, true).ToList(); + var rows = _importer.QueryXlsx(path, true).ToList(); Assert.Equal(6, rows.Count); foreach (var index in new[] { 0, 2, 5 }) @@ -3504,7 +3507,7 @@ public void Issue138() } { - var rows = Importer.QueryXlsx(path).ToList(); + var rows = _importer.QueryXlsx(path).ToList(); Assert.Equal(6, rows.Count); Assert.Equal(new DateTime(2021, 3, 1), rows[0].Date); @@ -3570,7 +3573,7 @@ public void IssueI50VD5() ["A"] = list1, ["B"] = list2, }; - Exporter.ExportXlsx(path, sheets); + _exporter.ExportXlsx(path, sheets); { Assert.Contains("/xl/media/", Helpers.GetZipFileContent(path, "xl/drawings/_rels/drawing1.xml.rels")); @@ -3613,7 +3616,7 @@ public void Issue422() var enumerableWithCount = new Issue422Enumerable(items); using var path = AutoDeletingPath.Create(); - Exporter.ExportXlsx(path.ToString(), enumerableWithCount); + _exporter.ExportXlsx(path.ToString(), enumerableWithCount); Assert.Equal(1, enumerableWithCount.GetEnumeratorCount); } @@ -3639,7 +3642,7 @@ public void Issue459() } }; - Templater.ApplyXlsxTemplate(ms, template, values); + _templater.ApplyXlsxTemplate(ms, template, values); } [Fact] @@ -3655,9 +3658,9 @@ public void Issue527() var template = PathHelper.GetFile("xlsx/Issue527Template.xlsx"); using var path = AutoDeletingPath.Create(); - Templater.ApplyXlsxTemplate(path.FilePath, template, value); + _templater.ApplyXlsxTemplate(path.FilePath, template, value); - var rows = Importer.QueryXlsx(path.FilePath).ToList(); + var rows = _importer.QueryXlsx(path.FilePath).ToList(); Assert.Equal("General User", rows[1].B); Assert.Equal("General Administrator", rows[2].B); } @@ -3691,9 +3694,9 @@ WITH test('Id', 'Name') AS ( using var reader = cmd.ExecuteReader(); using var path = AutoDeletingPath.Create(); - Exporter.ExportXlsx(path.FilePath, reader, configuration: excelconfig, overwriteFile: true); + _exporter.ExportXlsx(path.FilePath, reader, configuration: excelconfig, overwriteFile: true); - var rows = Importer.QueryXlsx(path.FilePath).ToList(); + var rows = _importer.QueryXlsx(path.FilePath).ToList(); Assert.All(rows, x => Assert.Single(x)); Assert.Equal("Name", rows[0].A); } @@ -3730,13 +3733,13 @@ public void Issue585() { const string path = "../../../../../samples/xlsx/TestIssue585.xlsx"; - var items1 = Importer.QueryXlsx(path); + var items1 = _importer.QueryXlsx(path); Assert.Equal(2, items1.Count()); - var items2 = Importer.QueryXlsx(path); + var items2 = _importer.QueryXlsx(path); Assert.Equal(2, items2.Count()); - var items3 = Importer.QueryXlsx(path); + var items3 = _importer.QueryXlsx(path); Assert.Equal(2, items3.Count()); } @@ -3751,8 +3754,8 @@ public void Issue_542() { const string path = "../../../../../samples/xlsx/TestIssue542.xlsx"; - var resultWithoutFirstRow = Importer.QueryXlsx(path).ToList(); - var resultWithFirstRow = Importer.QueryXlsx(path, treatHeaderAsData: true).ToList(); + var resultWithoutFirstRow = _importer.QueryXlsx(path).ToList(); + var resultWithFirstRow = _importer.QueryXlsx(path, treatHeaderAsData: true).ToList(); Assert.Equal(15, resultWithoutFirstRow.Count); Assert.Equal(16, resultWithFirstRow.Count); @@ -3799,11 +3802,11 @@ public void Issue507_1() // create using (var stream = File.Create(path)) { - Exporter.ExportCsv(stream, values, configuration: config); + _exporter.ExportCsv(stream, values, configuration: config); } // read - var getRowsInfo = Importer.QueryCsv(path, configuration: config).ToArray(); + var getRowsInfo = _importer.QueryCsv(path, configuration: config).ToArray(); Assert.Equal(values.Length, getRowsInfo.Length); @@ -3846,11 +3849,11 @@ public void Issue507_2() // create using (var stream = File.Create(path)) { - Exporter.ExportCsv(stream, values, true, config); + _exporter.ExportCsv(stream, values, true, config); } // read - var getRowsInfo = Importer.QueryCsv(path, configuration: config).ToArray(); + var getRowsInfo = _importer.QueryCsv(path, configuration: config).ToArray(); Assert.Equal(values.Length, getRowsInfo.Length); File.Delete(path); @@ -3872,7 +3875,7 @@ public void Issue507_3_MismatchedQuoteCsv() using var stream = new MemoryStream(Encoding.UTF8.GetBytes("A,B,C\n\"r1a: no end quote,r1b,r1c")); // read - var getRowsInfo = Importer.QueryCsv(stream, configuration: config).ToArray(); + var getRowsInfo = _importer.QueryCsv(stream, configuration: config).ToArray(); Assert.Equal(2, getRowsInfo.Length); } @@ -3920,7 +3923,7 @@ public void Issue606_1() ); const string templateFileName = "../../../../../samples/xlsx/TestIssue606_Template.xlsx"; - Templater.ApplyXlsxTemplate(path, Path.GetFullPath(templateFileName), value); + _templater.ApplyXlsxTemplate(path, Path.GetFullPath(templateFileName), value); File.Delete(path); } @@ -3941,7 +3944,7 @@ public void TestIssue627() using var path = AutoDeletingPath.Create(); var value = new[] { new { long2 = "1550432695793487872" } }; - var rowsWritten = Exporter.ExportXlsx(path.ToString(), value, configuration: config); + var rowsWritten = _exporter.ExportXlsx(path.ToString(), value, configuration: config); Assert.Single(rowsWritten); Assert.Equal(1, rowsWritten[0]); @@ -3977,7 +3980,7 @@ public void Issue632_1() string.Concat(nameof(MiniExcelIssueTests), "_", nameof(Issue632_1), ".xlsx") ); - Exporter.ExportXlsx(path, values, configuration: config, overwriteFile: true); + _exporter.ExportXlsx(path, values, configuration: config, overwriteFile: true); File.Delete(path); } @@ -4002,7 +4005,7 @@ static IEnumerable GetTestData() using var memoryStream = new MemoryStream(); var testData = GetTestData(); - var rowsWritten = Exporter.ExportXlsx(memoryStream, testData, configuration: new OpenXmlConfiguration + var rowsWritten = _exporter.ExportXlsx(memoryStream, testData, configuration: new OpenXmlConfiguration { FastMode = true }); @@ -4011,7 +4014,7 @@ static IEnumerable GetTestData() memoryStream.Position = 0; - var queryData = Importer.QueryXlsx(memoryStream).ToList(); + var queryData = _importer.QueryXlsx(memoryStream).ToList(); Assert.Equal(testData.Count(), queryData.Count); @@ -4040,14 +4043,14 @@ static IEnumerable GetTestData() using var memoryStream = new MemoryStream(); var testData = GetTestData(); - await Exporter.ExportXlsxAsync(memoryStream, testData, configuration: new OpenXmlConfiguration + await _exporter.ExportXlsxAsync(memoryStream, testData, configuration: new OpenXmlConfiguration { FastMode = true, }); memoryStream.Position = 0; - var queryData = Importer.QueryXlsxAsync(memoryStream).ToBlockingEnumerable().ToList(); + var queryData = _importer.QueryXlsxAsync(memoryStream).ToBlockingEnumerable().ToList(); Assert.Equal(testData.Count(), queryData.Count); @@ -4065,10 +4068,10 @@ public void Issue_686() { var path = PathHelper.GetFile("xlsx/TestIssue686.xlsx"); Assert.Throws(() => - Importer.QueryRangeXlsx(path, useHeaderRow: false, startCell: "ZZFF10", endCell: "ZZFF11").First()); + _importer.QueryRangeXlsx(path, useHeaderRow: false, startCell: "ZZFF10", endCell: "ZZFF11").First()); Assert.Throws(() => - Importer.QueryRangeXlsx(path, useHeaderRow: false, startCell: "ZZFF@@10", endCell: "ZZFF@@11").First()); + _importer.QueryRangeXlsx(path, useHeaderRow: false, startCell: "ZZFF@@10", endCell: "ZZFF@@11").First()); } [Fact] @@ -4078,9 +4081,9 @@ public void Test_Issue_693_SaveSheetWithLongName() using var path2 = AutoDeletingPath.Create(); List> data = [new() { ["First"] = 1, ["Second"] = 2 }]; - Assert.Throws(() => Exporter.ExportXlsx(path1.ToString(), data, sheetName: "Some Really Looooooooooong Sheet Name")); - Exporter.ExportXlsx(path2.ToString(), new List>()); - Assert.Throws(() => Exporter.InsertXlsxSheet(path2.ToString(), data, sheetName: "Some Other Very Looooooong Sheet Name")); + Assert.Throws(() => _exporter.ExportXlsx(path1.ToString(), data, sheetName: "Some Really Looooooooooong Sheet Name")); + _exporter.ExportXlsx(path2.ToString(), new List>()); + Assert.Throws(() => _exporter.InsertXlsxSheet(path2.ToString(), data, sheetName: "Some Other Very Looooooong Sheet Name")); } private class Issue697 @@ -4094,8 +4097,8 @@ private class Issue697 public void Test_Issue_697_EmptyRowsStronglyTypedQuery() { const string path = "../../../../../samples/xlsx/TestIssue697.xlsx"; - var rowsIgnoreEmpty = Importer.QueryXlsx(path, configuration: new OpenXmlConfiguration { IgnoreEmptyRows = true }).ToList(); - var rowsCountEmpty = Importer.QueryXlsx(path).ToList(); + var rowsIgnoreEmpty = _importer.QueryXlsx(path, configuration: new OpenXmlConfiguration { IgnoreEmptyRows = true }).ToList(); + var rowsCountEmpty = _importer.QueryXlsx(path).ToList(); Assert.Equal(4, rowsIgnoreEmpty.Count); Assert.Equal(5, rowsCountEmpty.Count); } @@ -4105,13 +4108,13 @@ public void Issue_710() { var values = new[] { new { Column1 = "MiniExcel", Column2 = 1, Column3 = "Test" } }; using var memoryStream = new MemoryStream(); - Exporter.ExportXlsx(memoryStream, values, configuration: new OpenXmlConfiguration + _exporter.ExportXlsx(memoryStream, values, configuration: new OpenXmlConfiguration { FastMode = true }); memoryStream.Position = 0; - using var dataReader = Importer.GetXlsxDataReader(memoryStream, useHeaderRow: false); + using var dataReader = _importer.GetXlsxDataReader(memoryStream, useHeaderRow: false); dataReader.Read(); for (int i = 0; i < dataReader.FieldCount; i++) @@ -4130,9 +4133,9 @@ public void Issue_732_First_Sheet_Active() const string path2 = "../../../../../samples/xlsx/TestIssue732_2.xlsx"; const string path3 = "../../../../../samples/xlsx/TestIssue732_3.xlsx"; - var info1 = Importer.GetSheetInformations(path1); - var info2 = Importer.GetSheetInformations(path2); - var info3 = Importer.GetSheetInformations(path3); + var info1 = _importer.GetSheetInformations(path1); + var info2 = _importer.GetSheetInformations(path2); + var info3 = _importer.GetSheetInformations(path3); Assert.Equal(0u, info1.SingleOrDefault(x => x.Active)?.Index); // first sheet is active Assert.Equal(1u, info2.SingleOrDefault(x => x.Active)?.Index); // second sheet is active @@ -4151,9 +4154,9 @@ public void TestIssue750() ["list"] = Enumerable.Range(0, 10_000) .Select(_ => new { value1 = Guid.NewGuid(), value2 = Guid.NewGuid(), }) }; - Templater.ApplyXlsxTemplate(path.ToString(), templatePath, data); + _templater.ApplyXlsxTemplate(path.ToString(), templatePath, data); - var rows = Importer.QueryXlsx(path.ToString()) + var rows = _importer.QueryXlsx(path.ToString()) .Skip(1453) .Take(2) .ToList(); @@ -4183,7 +4186,7 @@ public void TestIssue751() { ["list"] = list }; - Templater.ApplyXlsxTemplate(path.ToString(), templatePath, data); + _templater.ApplyXlsxTemplate(path.ToString(), templatePath, data); using var stream = File.OpenRead(path.ToString()); using var workbook = new XSSFWorkbook(stream); @@ -4212,7 +4215,7 @@ public void TestIssue751() public void TestIssue763() { var path = PathHelper.GetFile("xlsx/TestIssue763.xlsx"); - var rows = Importer.QueryRangeXlsx(path, startCell: "A3", endCell: "J3").ToArray(); + var rows = _importer.QueryRangeXlsx(path, startCell: "A3", endCell: "J3").ToArray(); Assert.Equal("A3", rows[0].A); Assert.Equal(null, rows[0].J); } @@ -4241,8 +4244,8 @@ public void TestIssue768() ["list"] = list }; - Templater.ApplyXlsxTemplate(path.ToString(), templatePath, data); - var rows = Importer.QueryXlsx(path.ToString(), startCell: "A16").ToList(); + _templater.ApplyXlsxTemplate(path.ToString(), templatePath, data); + var rows = _importer.QueryXlsx(path.ToString(), startCell: "A16").ToList(); Assert.Equal(list[0].value1.ToString(), rows[0].A.ToString()); Assert.Equal(list[1].value1.ToString(), rows[1].A.ToString()); @@ -4277,7 +4280,7 @@ public void TestIssue186() } ]; - Exporter.AddPictureXlsx(path.FilePath, images); + _exporter.AddPictureXlsx(path.FilePath, images); } /// @@ -4305,8 +4308,8 @@ public void TestIssue771() list12 = GetEnumerable() }; - Templater.ApplyXlsxTemplate(path.FilePath, template, value); - var rows = Importer.QueryXlsx(path.FilePath).ToList(); + _templater.ApplyXlsxTemplate(path.FilePath, template, value); + var rows = _importer.QueryXlsx(path.FilePath).ToList(); Assert.Equal("2025-1", rows[2].B); Assert.Equal(null, rows[3].B); @@ -4324,7 +4327,7 @@ public void TestIssue771() public void TestIssue772() { var path = PathHelper.GetFile("xlsx/TestIssue772.xlsx"); - var rows = Importer.QueryXlsx(path, sheetName: "Supply plan(daily)", startCell: "A1") + var rows = _importer.QueryXlsx(path, sheetName: "Supply plan(daily)", startCell: "A1") .Cast>() .ToArray(); @@ -4348,8 +4351,8 @@ public void TestIssue773() var fill = new { t = a }; using var path = AutoDeletingPath.Create(); - Templater.ApplyXlsxTemplate(path.FilePath, templatePath, fill); - var rows = Importer.QueryXlsx(path.FilePath).ToList(); + _templater.ApplyXlsxTemplate(path.FilePath, templatePath, fill); + var rows = _importer.QueryXlsx(path.FilePath).ToList(); Assert.Equal("H1", rows[4].AF); Assert.Equal("c3", rows[6].AA); @@ -4368,7 +4371,7 @@ public void TestIssue789() new Dictionary { {"no","2"} }, new Dictionary { {"no","3"} }, }; - Exporter.ExportXlsx(path, value); + _exporter.ExportXlsx(path, value); var xml = Helpers.GetZipFileContent(path.ToString(), "xl/worksheets/sheet1.xml"); @@ -4413,7 +4416,7 @@ public void TestIssue814() } ]; - Exporter.AddPictureXlsx(path.FilePath, images); + _exporter.AddPictureXlsx(path.FilePath, images); using var package = new ExcelPackage(new FileInfo(path.FilePath)); @@ -4466,7 +4469,7 @@ public void TestIssue815() } ]; - Exporter.AddPictureXlsx(path.FilePath, images); + _exporter.AddPictureXlsx(path.FilePath, images); using (var package = new ExcelPackage(new FileInfo(path.FilePath))) { @@ -4525,7 +4528,7 @@ public void TestIssue816() } ]; - Exporter.AddPictureXlsx(path.FilePath, images); + _exporter.AddPictureXlsx(path.FilePath, images); using var package = new ExcelPackage(new FileInfo(path.FilePath)); @@ -4577,7 +4580,7 @@ public void TestIssue816() } ]; - Exporter.AddPictureXlsx(path.FilePath, images); + _exporter.AddPictureXlsx(path.FilePath, images); using var package = new ExcelPackage(new FileInfo(path.FilePath)); // Check picture in the first sheet (C3) @@ -4626,7 +4629,7 @@ public void TestIssue816() public void TestIssue809() { var path = PathHelper.GetFile("xlsx/TestIssue809.xlsx"); - var rows = Importer.QueryXlsx(path).ToList(); + var rows = _importer.QueryXlsx(path).ToList(); Assert.Equal(3, rows.Count); Assert.Equal(null, rows[0].A); diff --git a/tests/MiniExcelTests/MiniExcelOpenXmlAsyncTests.cs b/tests/MiniExcelTests/MiniExcelOpenXmlAsyncTests.cs index 951a036d..afe81395 100644 --- a/tests/MiniExcelTests/MiniExcelOpenXmlAsyncTests.cs +++ b/tests/MiniExcelTests/MiniExcelOpenXmlAsyncTests.cs @@ -6,12 +6,11 @@ using ClosedXML.Excel; using Dapper; using ExcelDataReader; +using MiniExcelLib.Core; using MiniExcelLib.Core.Abstractions; using MiniExcelLib.Core.Attributes; using MiniExcelLib.Core.OpenXml; using MiniExcelLib.Tests.Utils; -using Importer = MiniExcelLib.MiniExcel.Importer; -using Exporter = MiniExcelLib.MiniExcel.Exporter; using OfficeOpenXml; using Xunit; @@ -19,6 +18,9 @@ namespace MiniExcelLib.Tests; public class MiniExcelOpenXmlAsyncTests { + private readonly MiniExcelImporter _importer = MiniExcel.GetImporter(); + private readonly MiniExcelExporter _exporter = MiniExcel.GetExporter(); + [Fact] public async Task SaveAsControlChracter() { @@ -36,10 +38,10 @@ public async Task SaveAsControlChracter() '\u0017','\u0018','\u0019','\u001A','\u001B','\u001C','\u001D','\u001E','\u001F','\u007F' ]; var input = chars.Select(s => new { Test = s.ToString() }); - await Exporter.ExportXlsxAsync(path, input); + await _exporter.ExportXlsxAsync(path, input); - var rows2 = Importer.QueryXlsxAsync(path, true).ToBlockingEnumerable().ToArray(); - var rows1 = Importer.QueryXlsxAsync(path).ToBlockingEnumerable().ToArray(); + var rows2 = _importer.QueryXlsxAsync(path, true).ToBlockingEnumerable().ToArray(); + var rows1 = _importer.QueryXlsxAsync(path).ToBlockingEnumerable().ToArray(); } private class SaveAsControlChracterVO @@ -85,7 +87,7 @@ public async Task CustomAttributeWihoutVaildPropertiesTest() const string path = "../../../../../samples/xlsx/TestCustomExcelColumnAttribute.xlsx"; await Assert.ThrowsAsync(async () => { - _ = Importer.QueryXlsxAsync(path).ToBlockingEnumerable().ToList(); + _ = _importer.QueryXlsxAsync(path).ToBlockingEnumerable().ToList(); }); } @@ -93,7 +95,7 @@ await Assert.ThrowsAsync(async () => public async Task QueryCustomAttributesTest() { const string path = "../../../../../samples/xlsx/TestCustomExcelColumnAttribute.xlsx"; - var rows = Importer.QueryXlsxAsync(path).ToBlockingEnumerable().ToList(); + var rows = _importer.QueryXlsxAsync(path).ToBlockingEnumerable().ToList(); Assert.Equal("Column1", rows[0].Test1); Assert.Equal("Column2", rows[0].Test2); @@ -108,7 +110,7 @@ public async Task QueryCustomAttributesTest() public async Task QueryCustomAttributes2Test() { const string path = "../../../../../samples/xlsx/TestCustomExcelColumnAttribute.xlsx"; - var rows = Importer.QueryXlsxAsync(path).ToBlockingEnumerable().ToList(); + var rows = _importer.QueryXlsxAsync(path).ToBlockingEnumerable().ToList(); Assert.Equal("Column1", rows[0].Test1); Assert.Equal("Column2", rows[0].Test2); @@ -132,8 +134,8 @@ public async Task SaveAsCustomAttributesTest() Test4 = "Test4", }); - await Exporter.ExportXlsxAsync(path.ToString(), input); - var d = Importer.QueryXlsxAsync(path.ToString(), true).ToBlockingEnumerable(); + await _exporter.ExportXlsxAsync(path.ToString(), input); + var d = _importer.QueryXlsxAsync(path.ToString(), true).ToBlockingEnumerable(); var rows = d.ToList(); var first = rows[0] as IDictionary; @@ -159,8 +161,8 @@ public async Task SaveAsCustomAttributes2Test() Test4 = "Test4", }); - await Exporter.ExportXlsxAsync(path.ToString(), input); - var d = Importer.QueryXlsxAsync(path.ToString(), true).ToBlockingEnumerable(); + await _exporter.ExportXlsxAsync(path.ToString(), input); + var d = _importer.QueryXlsxAsync(path.ToString(), true).ToBlockingEnumerable(); var rows = d.ToList(); var first = rows[0] as IDictionary; @@ -185,7 +187,7 @@ private class CustomAttributesWihoutVaildPropertiesTestPoco public async Task QueryCastToIDictionary() { const string path = "../../../../../samples/xlsx/TestCenterEmptyRow/TestCenterEmptyRow.xlsx"; - foreach (IDictionary row in Importer.QueryXlsxAsync(path).ToBlockingEnumerable()) + foreach (IDictionary row in _importer.QueryXlsxAsync(path).ToBlockingEnumerable()) { _ = row; } @@ -197,7 +199,7 @@ public async Task CenterEmptyRowsQueryTest() const string path = "../../../../../samples/xlsx/TestCenterEmptyRow/TestCenterEmptyRow.xlsx"; await using (var stream = File.OpenRead(path)) { - var d = Importer.QueryXlsxAsync(stream).ToBlockingEnumerable().Cast>(); + var d = _importer.QueryXlsxAsync(stream).ToBlockingEnumerable().Cast>(); var rows = d.ToList(); Assert.Equal("a", rows[0]["A"]); Assert.Equal("b", rows[0]["B"]); @@ -233,7 +235,7 @@ public async Task CenterEmptyRowsQueryTest() await using (var stream = File.OpenRead(path)) { - var d = Importer.QueryXlsxAsync(stream, useHeaderRow: true).ToBlockingEnumerable().Cast>(); + var d = _importer.QueryXlsxAsync(stream, useHeaderRow: true).ToBlockingEnumerable().Cast>(); var rows = d.ToList(); Assert.Equal(1d, rows[0]["a"]); Assert.Null(rows[0]["b"]); @@ -267,7 +269,7 @@ public async Task TestDynamicQueryBasic_WithoutHead() { const string path = "../../../../../samples/xlsx/TestDynamicQueryBasic_WithoutHead.xlsx"; await using var stream = File.OpenRead(path); - var d = Importer.QueryXlsxAsync(stream).ToBlockingEnumerable().Cast>(); + var d = _importer.QueryXlsxAsync(stream).ToBlockingEnumerable().Cast>(); var rows = d.ToList(); Assert.Equal("MiniExcel", rows[0]["A"]); @@ -282,7 +284,7 @@ public async Task TestDynamicQueryBasic_useHeaderRow() const string path = "../../../../../samples/xlsx/TestDynamicQueryBasic.xlsx"; await using (var stream = File.OpenRead(path)) { - var d = Importer.QueryXlsxAsync(stream, useHeaderRow: true).ToBlockingEnumerable().Cast>(); + var d = _importer.QueryXlsxAsync(stream, useHeaderRow: true).ToBlockingEnumerable().Cast>(); var rows = d.ToList(); Assert.Equal("MiniExcel", rows[0]["Column1"]); Assert.Equal(1d, rows[0]["Column2"]); @@ -291,7 +293,7 @@ public async Task TestDynamicQueryBasic_useHeaderRow() } { - var d = Importer.QueryXlsxAsync(path, useHeaderRow: true).ToBlockingEnumerable(); + var d = _importer.QueryXlsxAsync(path, useHeaderRow: true).ToBlockingEnumerable(); var rows = d.ToList(); Assert.Equal("MiniExcel", rows[0].Column1); Assert.Equal(1d, rows[0].Column2); @@ -322,7 +324,7 @@ public async Task QueryStrongTypeMapping_Test() const string path = "../../../../../samples/xlsx/TestTypeMapping.xlsx"; await using (var stream = File.OpenRead(path)) { - var d = Importer.QueryXlsxAsync(stream); + var d = _importer.QueryXlsxAsync(stream); var rows = d.ToBlockingEnumerable().ToList(); Assert.Equal(100, rows.Count); @@ -336,7 +338,7 @@ public async Task QueryStrongTypeMapping_Test() } { - var rows = Importer.QueryXlsx(path).ToList(); + var rows = _importer.QueryXlsx(path).ToList(); Assert.Equal(100, rows.Count); Assert.Equal(Guid.Parse("78DE23D2-DCB6-BD3D-EC67-C112BBC322A2"), rows[0].ID); @@ -363,7 +365,7 @@ public async Task AutoCheckTypeTest() { const string path = "../../../../../samples/xlsx/TestTypeMapping_AutoCheckFormat.xlsx"; await using var stream = FileHelper.OpenRead(path); - _ = Importer.QueryXlsxAsync(stream).ToBlockingEnumerable().ToList(); + _ = _importer.QueryXlsxAsync(stream).ToBlockingEnumerable().ToList(); } [Fact] @@ -372,7 +374,7 @@ public async Task TestDatetimeSpanFormat_ClosedXml() const string path = "../../../../../samples/xlsx/TestDatetimeSpanFormat_ClosedXml.xlsx"; await using var stream = FileHelper.OpenRead(path); - var d = Importer.QueryXlsxAsync(stream).ToBlockingEnumerable().Cast>(); + var d = _importer.QueryXlsxAsync(stream).ToBlockingEnumerable().Cast>(); var row = d.First(); var a = row["A"]; var b = row["B"]; @@ -387,13 +389,13 @@ public async Task LargeFileQueryStrongTypeMapping_Test() const string path = "../../../../../benchmarks/MiniExcel.Benchmarks/Test1,000,000x10.xlsx"; await using (var stream = File.OpenRead(path)) { - var d = Importer.QueryXlsxAsync(stream).ToBlockingEnumerable(); + var d = _importer.QueryXlsxAsync(stream).ToBlockingEnumerable(); var rows = d.Take(2).ToList(); Assert.Equal("HelloWorld2", rows[0].HelloWorld1); Assert.Equal("HelloWorld3", rows[1].HelloWorld1); } { - var d = Importer.QueryXlsxAsync(path).ToBlockingEnumerable(); + var d = _importer.QueryXlsxAsync(path).ToBlockingEnumerable(); var rows = d.Take(2).ToList(); Assert.Equal("HelloWorld2", rows[0].HelloWorld1); Assert.Equal("HelloWorld3", rows[1].HelloWorld1); @@ -414,7 +416,7 @@ public async Task QueryExcelDataReaderCheckTest(string path) var exceldatareaderResult = reader.AsDataSet(); await using var stream = File.OpenRead(path); - var d = Importer.QueryXlsxAsync(stream).ToBlockingEnumerable(); + var d = _importer.QueryXlsxAsync(stream).ToBlockingEnumerable(); var rows = d.ToList(); Assert.Equal(exceldatareaderResult.Tables[0].Rows.Count, rows.Count); @@ -436,7 +438,7 @@ public async Task QuerySheetWithoutRAttribute() const string path = "../../../../../samples/xlsx/TestWihoutRAttribute.xlsx"; await using var stream = File.OpenRead(path); - var d = Importer.QueryXlsxAsync(stream).ToBlockingEnumerable().Cast>(); + var d = _importer.QueryXlsxAsync(stream).ToBlockingEnumerable().Cast>(); var rows = d.ToList(); var keys = rows.First().Keys; @@ -459,7 +461,7 @@ public async Task FixDimensionJustOneColumnParsingError_Test() { const string path = "../../../../../samples/xlsx/TestDimensionC3.xlsx"; await using var stream = File.OpenRead(path); - var d = Importer.QueryXlsxAsync(stream).ToBlockingEnumerable(); + var d = _importer.QueryXlsxAsync(stream).ToBlockingEnumerable(); var rows = d.ToList(); var keys = (rows.First() as IDictionary)?.Keys; Assert.Equal(3, keys?.Count); @@ -485,10 +487,10 @@ public async Task SaveAsFileWithDimensionByICollection() using (var file = AutoDeletingPath.Create()) { var path = file.ToString(); - await Exporter.ExportXlsxAsync(path, values); + await _exporter.ExportXlsxAsync(path, values); await using (var stream = File.OpenRead(path)) { - var d = Importer.QueryXlsxAsync(stream, useHeaderRow: false).ToBlockingEnumerable().Cast>(); + var d = _importer.QueryXlsxAsync(stream, useHeaderRow: false).ToBlockingEnumerable().Cast>(); var rows = d.ToList(); Assert.Equal(3, rows.Count); Assert.Equal("A", rows[0]["A"]); @@ -498,7 +500,7 @@ public async Task SaveAsFileWithDimensionByICollection() await using (var stream = File.OpenRead(path)) { - var d = Importer.QueryXlsxAsync(stream, useHeaderRow: true).ToBlockingEnumerable().Cast>(); + var d = _importer.QueryXlsxAsync(stream, useHeaderRow: true).ToBlockingEnumerable().Cast>(); var rows = d.ToList(); Assert.Equal(2, rows.Count); Assert.Equal("A", rows[0]["A"]); @@ -509,7 +511,7 @@ public async Task SaveAsFileWithDimensionByICollection() } using var newPath = AutoDeletingPath.Create(); - await Exporter.ExportXlsxAsync(newPath.ToString(), values, false); + await _exporter.ExportXlsxAsync(newPath.ToString(), values, false); Assert.Equal("A1:B2", Helpers.GetFirstSheetDimensionRefValue(newPath.ToString())); } @@ -519,10 +521,10 @@ public async Task SaveAsFileWithDimensionByICollection() using (var file = AutoDeletingPath.Create()) { var path = file.ToString(); - await Exporter.ExportXlsxAsync(path, values, false); + await _exporter.ExportXlsxAsync(path, values, false); await using (var stream = File.OpenRead(path)) { - var d = Importer.QueryXlsxAsync(stream, useHeaderRow: false).ToBlockingEnumerable(); + var d = _importer.QueryXlsxAsync(stream, useHeaderRow: false).ToBlockingEnumerable(); var rows = d.ToList(); Assert.Empty(rows); } @@ -533,10 +535,10 @@ public async Task SaveAsFileWithDimensionByICollection() using (var file = AutoDeletingPath.Create()) { var path = file.ToString(); - await Exporter.ExportXlsxAsync(path, values); + await _exporter.ExportXlsxAsync(path, values); { await using var stream = File.OpenRead(path); - var d = Importer.QueryXlsxAsync(stream, useHeaderRow: false).ToBlockingEnumerable(); + var d = _importer.QueryXlsxAsync(stream, useHeaderRow: false).ToBlockingEnumerable(); var rows = d.ToList(); Assert.Single(rows); } @@ -555,11 +557,11 @@ public async Task SaveAsFileWithDimensionByICollection() using (var file = AutoDeletingPath.Create()) { var path = file.ToString(); - await Exporter.ExportXlsxAsync(path, values); + await _exporter.ExportXlsxAsync(path, values); await using (var stream = File.OpenRead(path)) { - var d = Importer.QueryXlsxAsync(stream, useHeaderRow: false).ToBlockingEnumerable().Cast>(); + var d = _importer.QueryXlsxAsync(stream, useHeaderRow: false).ToBlockingEnumerable().Cast>(); var rows = d.ToList(); Assert.Equal(3, rows.Count); Assert.Equal("A", rows[0]["A"]); @@ -569,7 +571,7 @@ public async Task SaveAsFileWithDimensionByICollection() await using (var stream = File.OpenRead(path)) { - var d = Importer.QueryXlsxAsync(stream, useHeaderRow: true).ToBlockingEnumerable().Cast>(); + var d = _importer.QueryXlsxAsync(stream, useHeaderRow: true).ToBlockingEnumerable().Cast>(); var rows = d.ToList(); Assert.Equal(2, rows.Count); Assert.Equal("A", rows[0]["A"]); @@ -581,7 +583,7 @@ public async Task SaveAsFileWithDimensionByICollection() using (var path = AutoDeletingPath.Create()) { - await Exporter.ExportXlsxAsync(path.ToString(), values, false); + await _exporter.ExportXlsxAsync(path.ToString(), values, false); Assert.Equal("A1:B2", Helpers.GetFirstSheetDimensionRefValue(path.ToString())); } } @@ -590,7 +592,7 @@ public async Task SaveAsFileWithDimensionByICollection() { using var path = AutoDeletingPath.Create(); var values = new List(); - await Assert.ThrowsAsync(() => Exporter.ExportXlsxAsync(path.ToString(), values)); + await Assert.ThrowsAsync(() => _exporter.ExportXlsxAsync(path.ToString(), values)); } } @@ -602,15 +604,15 @@ public async Task SaveAsFileWithDimension() var path = file.ToString(); using var table = new DataTable(); - await Exporter.ExportXlsxAsync(path, table); + await _exporter.ExportXlsxAsync(path, table); Assert.Equal("A1", Helpers.GetFirstSheetDimensionRefValue(path)); { await using var stream = File.OpenRead(path); - var d = Importer.QueryXlsxAsync(stream).ToBlockingEnumerable(); + var d = _importer.QueryXlsxAsync(stream).ToBlockingEnumerable(); var rows = d.ToList(); Assert.Single(rows); } - await Exporter.ExportXlsxAsync(path, table, printHeader: false, overwriteFile: true); + await _exporter.ExportXlsxAsync(path, table, printHeader: false, overwriteFile: true); Assert.Equal("A1", Helpers.GetFirstSheetDimensionRefValue(path)); } { @@ -625,12 +627,12 @@ public async Task SaveAsFileWithDimension() table.Rows.Add(@"""<>+-*//}{\\n", 1234567890); table.Rows.Add("Hello World", -1234567890, false, DateTime.Now); - await Exporter.ExportXlsxAsync(path, table); + await _exporter.ExportXlsxAsync(path, table); Assert.Equal("A1:D3", Helpers.GetFirstSheetDimensionRefValue(path)); await using (var stream = File.OpenRead(path)) { - var d = Importer.QueryXlsxAsync(stream, useHeaderRow: true).ToBlockingEnumerable().Cast>(); + var d = _importer.QueryXlsxAsync(stream, useHeaderRow: true).ToBlockingEnumerable().Cast>(); var rows = d.ToList(); Assert.Equal(2, rows.Count); Assert.Equal(@"""<>+-*//}{\\n", rows[0]["a"]); @@ -641,7 +643,7 @@ public async Task SaveAsFileWithDimension() await using (var stream = File.OpenRead(path)) { - var d = Importer.QueryXlsxAsync(stream).ToBlockingEnumerable().Cast>(); + var d = _importer.QueryXlsxAsync(stream).ToBlockingEnumerable().Cast>(); var rows = d.ToList(); Assert.Equal(3, rows.Count); Assert.Equal("a", rows[0]["A"]); @@ -650,7 +652,7 @@ public async Task SaveAsFileWithDimension() Assert.Equal("d", rows[0]["D"]); } - await Exporter.ExportXlsxAsync(path, table, printHeader: false, overwriteFile: true); + await _exporter.ExportXlsxAsync(path, table, printHeader: false, overwriteFile: true); Assert.Equal("A1:D2", Helpers.GetFirstSheetDimensionRefValue(path)); } @@ -661,7 +663,7 @@ public async Task SaveAsFileWithDimension() table.Rows.Add("A"); table.Rows.Add("B"); - await Exporter.ExportXlsxAsync(path.ToString(), table); + await _exporter.ExportXlsxAsync(path.ToString(), table); Assert.Equal("A1:A3", Helpers.GetFirstSheetDimensionRefValue(path.ToString())); } } @@ -683,7 +685,7 @@ public async Task SaveAsByDataTableTest() table.Rows.Add(@"""<>+-*//}{\\n", 1234567890, true, now); table.Rows.Add("Hello World", -1234567890, false, now.Date); - await Exporter.ExportXlsxAsync(path, table); + await _exporter.ExportXlsxAsync(path, table); using var p = new ExcelPackage(new FileInfo(path)); var ws = p.Workbook.Worksheets.First(); @@ -706,7 +708,7 @@ public async Task SaveAsByDataTableTest() table.Rows.Add("MiniExcel", 1); table.Rows.Add("Github", 2); - await Exporter.ExportXlsxAsync(path.ToString(), table); + await _exporter.ExportXlsxAsync(path.ToString(), table); } } @@ -716,19 +718,19 @@ public async Task QueryByLINQExtensionsVoidTaskLargeFileOOMTest() const string path = "../../../../../benchmarks/MiniExcel.Benchmarks/Test1,000,000x10.xlsx"; { - var row = Importer.QueryXlsxAsync(path).ToBlockingEnumerable().First(); + var row = _importer.QueryXlsxAsync(path).ToBlockingEnumerable().First(); Assert.Equal("HelloWorld1", row.A); } await using (var stream = File.OpenRead(path)) { - var d = Importer.QueryXlsxAsync(stream).ToBlockingEnumerable().Cast>(); + var d = _importer.QueryXlsxAsync(stream).ToBlockingEnumerable().Cast>(); var row = d.First(); Assert.Equal("HelloWorld1", row["A"]); } { - var d = Importer.QueryXlsxAsync(path).ToBlockingEnumerable().Cast>(); + var d = _importer.QueryXlsxAsync(path).ToBlockingEnumerable().Cast>(); var rows = d.Take(10); Assert.Equal(10, rows.Count()); } @@ -742,12 +744,12 @@ public async Task EmptyTest() await using (var connection = Db.GetConnection("Data Source=:memory:")) { var rows = await connection.QueryAsync("with cte as (select 1 id,2 val) select * from cte where 1=2"); - await Exporter.ExportXlsxAsync(path.ToString(), rows); + await _exporter.ExportXlsxAsync(path.ToString(), rows); } await using (var stream = File.OpenRead(path.ToString())) { - var row = Importer.QueryXlsxAsync(stream, useHeaderRow: true).ToBlockingEnumerable(); + var row = _importer.QueryXlsxAsync(stream, useHeaderRow: true).ToBlockingEnumerable(); Assert.Empty(row); } } @@ -764,11 +766,11 @@ public async Task SaveAsByIEnumerableIDictionary() new() { { "Column1", "MiniExcel" }, { "Column2", 1 } }, new() { { "Column1", "Github" }, { "Column2", 2 } } ]; - await Exporter.ExportXlsxAsync(path, values); + await _exporter.ExportXlsxAsync(path, values); await using (var stream = File.OpenRead(path)) { - var d = Importer.QueryXlsxAsync(stream, useHeaderRow: false).ToBlockingEnumerable().Cast>(); + var d = _importer.QueryXlsxAsync(stream, useHeaderRow: false).ToBlockingEnumerable().Cast>(); var rows = d.ToList(); Assert.Equal("Column1", rows[0]["A"]); Assert.Equal("Column2", rows[0]["B"]); @@ -780,7 +782,7 @@ public async Task SaveAsByIEnumerableIDictionary() await using (var stream = File.OpenRead(path)) { - var d = Importer.QueryXlsxAsync(stream, useHeaderRow: true).ToBlockingEnumerable().Cast>(); + var d = _importer.QueryXlsxAsync(stream, useHeaderRow: true).ToBlockingEnumerable().Cast>(); var rows = d.ToList(); Assert.Equal(2, rows.Count); Assert.Equal("MiniExcel", rows[0]["Column1"]); @@ -801,11 +803,11 @@ public async Task SaveAsByIEnumerableIDictionary() new() { { 1, "MiniExcel" }, { 2, 1 } }, new() { { 1, "Github" }, { 2, 2 } } ]; - await Exporter.ExportXlsxAsync(path, values); + await _exporter.ExportXlsxAsync(path, values); await using (var stream = File.OpenRead(path)) { - var d = Importer.QueryXlsxAsync(stream, useHeaderRow: false).ToBlockingEnumerable(); + var d = _importer.QueryXlsxAsync(stream, useHeaderRow: false).ToBlockingEnumerable(); var rows = d.ToList(); Assert.Equal(3, rows.Count); } @@ -833,11 +835,11 @@ public async Task SaveAsByIEnumerableIDictionaryWithDynamicConfiguration() new() { { "Column1", "MiniExcel" }, { "Column2", 1 } }, new() { { "Column1", "Github" }, { "Column2", 2 } } ]; - await Exporter.ExportXlsxAsync(path, values, configuration: config); + await _exporter.ExportXlsxAsync(path, values, configuration: config); await using (var stream = File.OpenRead(path)) { - var d = Importer.QueryXlsxAsync(stream, useHeaderRow: true).ToBlockingEnumerable().Cast>(); + var d = _importer.QueryXlsxAsync(stream, useHeaderRow: true).ToBlockingEnumerable().Cast>(); var rows = d.ToList(); Assert.Equal(2, rows.Count); Assert.Equal("Name Column", rows[0].Keys.ElementAt(0)); @@ -864,7 +866,7 @@ public async Task SaveAsFrozenRowsAndColumnsTest() using var file = AutoDeletingPath.Create(); var path = file.ToString(); - await Exporter.ExportXlsxAsync( + await _exporter.ExportXlsxAsync( path, new[] { @@ -876,7 +878,7 @@ await Exporter.ExportXlsxAsync( await using (var stream = File.OpenRead(path)) { - var rows = Importer.QueryXlsxAsync(stream, useHeaderRow: true).ToBlockingEnumerable().ToList(); + var rows = _importer.QueryXlsxAsync(stream, useHeaderRow: true).ToBlockingEnumerable().ToList(); Assert.Equal("MiniExcel", rows[0].Column1); Assert.Equal(1, rows[0].Column2); @@ -895,13 +897,13 @@ await Exporter.ExportXlsxAsync( table.Rows.Add("Hello World", -1234567890, false, DateTime.Now.Date); using var pathTable = AutoDeletingPath.Create(); - await Exporter.ExportXlsxAsync(pathTable.ToString(), table, configuration: config); + await _exporter.ExportXlsxAsync(pathTable.ToString(), table, configuration: config); Assert.Equal("A1:D3", Helpers.GetFirstSheetDimensionRefValue(pathTable.ToString())); // data reader await using var reader = table.CreateDataReader(); using var pathReader = AutoDeletingPath.Create(); - await Exporter.ExportXlsxAsync(pathReader.ToString(), reader, configuration: config); + await _exporter.ExportXlsxAsync(pathReader.ToString(), reader, configuration: config); Assert.Equal("A1:D3", Helpers.GetFirstSheetDimensionRefValue(pathTable.ToString())); } @@ -915,13 +917,13 @@ public async Task SaveAsByDapperRows() await using (var connection = Db.GetConnection("Data Source=:memory:")) { var rows = await connection.QueryAsync("select 'MiniExcel' as Column1,1 as Column2 union all select 'Github',2"); - await Exporter.ExportXlsxAsync(path, rows); + await _exporter.ExportXlsxAsync(path, rows); } Assert.Equal("A1:B3", Helpers.GetFirstSheetDimensionRefValue(path)); await using (var stream = File.OpenRead(path)) { - var rows = Importer.QueryXlsxAsync(stream, useHeaderRow: true).ToBlockingEnumerable().Cast>().ToList(); + var rows = _importer.QueryXlsxAsync(stream, useHeaderRow: true).ToBlockingEnumerable().Cast>().ToList(); Assert.Equal("MiniExcel", rows[0]["Column1"]); Assert.Equal(1d, rows[0]["Column2"]); Assert.Equal("Github", rows[1]["Column1"]); @@ -932,18 +934,18 @@ public async Task SaveAsByDapperRows() await using (var connection = Db.GetConnection("Data Source=:memory:")) { var rows = (await connection.QueryAsync("with cte as (select 'MiniExcel' as Column1,1 as Column2 union all select 'Github',2)select * from cte where 1=2")).ToList(); - await Exporter.ExportXlsxAsync(path, rows, overwriteFile: true); + await _exporter.ExportXlsxAsync(path, rows, overwriteFile: true); } await using (var stream = File.OpenRead(path)) { - var rows = Importer.QueryXlsxAsync(stream, useHeaderRow: false).ToBlockingEnumerable().ToList(); + var rows = _importer.QueryXlsxAsync(stream, useHeaderRow: false).ToBlockingEnumerable().ToList(); Assert.Empty(rows); } await using (var stream = File.OpenRead(path)) { - var rows = Importer.QueryXlsxAsync(stream, useHeaderRow: true).ToBlockingEnumerable().ToList(); + var rows = _importer.QueryXlsxAsync(stream, useHeaderRow: true).ToBlockingEnumerable().ToList(); Assert.Empty(rows); } Assert.Equal("A1", Helpers.GetFirstSheetDimensionRefValue(path)); @@ -952,13 +954,13 @@ public async Task SaveAsByDapperRows() await using (var connection = Db.GetConnection("Data Source=:memory:")) { var rows = (await connection.QueryAsync("select 'MiniExcel' as Column1,1 as Column2 union all select 'Github',2")).ToList(); - await Exporter.ExportXlsxAsync(path, rows, overwriteFile: true); + await _exporter.ExportXlsxAsync(path, rows, overwriteFile: true); } Assert.Equal("A1:B3", Helpers.GetFirstSheetDimensionRefValue(path)); await using (var stream = File.OpenRead(path)) { - var rows = Importer.QueryXlsxAsync(stream, useHeaderRow: false).ToBlockingEnumerable().Cast>().ToList(); + var rows = _importer.QueryXlsxAsync(stream, useHeaderRow: false).ToBlockingEnumerable().Cast>().ToList(); Assert.Equal("Column1", rows[0]["A"]); Assert.Equal("Column2", rows[0]["B"]); Assert.Equal("MiniExcel", rows[1]["A"]); @@ -969,7 +971,7 @@ public async Task SaveAsByDapperRows() await using (var stream = File.OpenRead(path)) { - var rows = Importer.QueryXlsxAsync(stream, useHeaderRow: true).ToBlockingEnumerable().Cast>().ToList(); + var rows = _importer.QueryXlsxAsync(stream, useHeaderRow: true).ToBlockingEnumerable().Cast>().ToList(); Assert.Equal("MiniExcel", rows[0]["Column1"]); Assert.Equal(1d, rows[0]["Column2"]); Assert.Equal("Github", rows[1]["Column1"]); @@ -993,10 +995,10 @@ public async Task QueryByStrongTypeParameterTest() new() { Column1 = "MiniExcel", Column2 = 1 }, new() { Column1 = "Github", Column2 = 2 } ]; - await Exporter.ExportXlsxAsync(path, values); + await _exporter.ExportXlsxAsync(path, values); await using var stream = File.OpenRead(path); - var rows = Importer.QueryXlsxAsync(stream, useHeaderRow: true).ToBlockingEnumerable().Cast>().ToList(); + var rows = _importer.QueryXlsxAsync(stream, useHeaderRow: true).ToBlockingEnumerable().Cast>().ToList(); Assert.Equal("MiniExcel", rows[0]["Column1"]); Assert.Equal(1d, rows[0]["Column2"]); @@ -1014,10 +1016,10 @@ public async Task QueryByDictionaryStringAndObjectParameterTest() new() { { "Column1", "MiniExcel" }, { "Column2", 1 } }, new() { { "Column1", "Github" }, { "Column2", 2 } } ]; - await Exporter.ExportXlsxAsync(path, values); + await _exporter.ExportXlsxAsync(path, values); await using var stream = File.OpenRead(path); - var rows = Importer.QueryXlsxAsync(stream, useHeaderRow: true).ToBlockingEnumerable().Cast>().ToList(); + var rows = _importer.QueryXlsxAsync(stream, useHeaderRow: true).ToBlockingEnumerable().Cast>().ToList(); Assert.Equal("MiniExcel", rows[0]["Column1"]); Assert.Equal(1d, rows[0]["Column2"]); @@ -1044,7 +1046,7 @@ public async Task SQLiteInsertTest() await using (var transaction = connection.BeginTransaction()) await using (var stream = File.OpenRead(path)) { - var rows = Importer.QueryXlsxAsync(stream).ToBlockingEnumerable().Cast>(); + var rows = _importer.QueryXlsxAsync(stream).ToBlockingEnumerable().Cast>(); foreach (var row in rows) await connection.ExecuteAsync( "insert into T (A,B) values (@A,@B)", @@ -1069,7 +1071,7 @@ public async Task SaveAsBasicCreateTest() using var file = AutoDeletingPath.Create(); var path = file.ToString(); - await Exporter.ExportXlsxAsync(path, new[] + await _exporter.ExportXlsxAsync(path, new[] { new { Column1 = "MiniExcel", Column2 = 1 }, new { Column1 = "Github", Column2 = 2} @@ -1077,7 +1079,7 @@ await Exporter.ExportXlsxAsync(path, new[] await using (var stream = File.OpenRead(path)) { - var d = Importer.QueryXlsxAsync(stream, useHeaderRow: true).ToBlockingEnumerable().Cast>(); + var d = _importer.QueryXlsxAsync(stream, useHeaderRow: true).ToBlockingEnumerable().Cast>(); var rows = d.ToList(); Assert.Equal("MiniExcel", rows[0]["Column1"]); Assert.Equal(1d, rows[0]["Column2"]); @@ -1101,12 +1103,12 @@ public async Task SaveAsBasicStreamTest() }; await using (var stream = new FileStream(path, FileMode.CreateNew)) { - await Exporter.ExportXlsxAsync(stream, values); + await _exporter.ExportXlsxAsync(stream, values); } await using (var stream = File.OpenRead(path)) { - var rows = Importer.QueryXlsxAsync(stream, useHeaderRow: true).ToBlockingEnumerable().Cast>().ToList(); + var rows = _importer.QueryXlsxAsync(stream, useHeaderRow: true).ToBlockingEnumerable().Cast>().ToList(); Assert.Equal("MiniExcel", rows[0]["Column1"]); Assert.Equal(1d, rows[0]["Column2"]); Assert.Equal("Github", rows[1]["Column1"]); @@ -1124,14 +1126,14 @@ public async Task SaveAsBasicStreamTest() await using (var stream = new MemoryStream()) await using (var fileStream = new FileStream(path, FileMode.Create)) { - await Exporter.ExportXlsxAsync(stream, values); + await _exporter.ExportXlsxAsync(stream, values); stream.Seek(0, SeekOrigin.Begin); await stream.CopyToAsync(fileStream); } await using (var stream = File.OpenRead(path)) { - var rows = Importer.QueryXlsxAsync(stream, useHeaderRow: true).ToBlockingEnumerable().Cast>().ToList(); + var rows = _importer.QueryXlsxAsync(stream, useHeaderRow: true).ToBlockingEnumerable().Cast>().ToList(); Assert.Equal("MiniExcel", rows[0]["Column1"]); Assert.Equal(1d, rows[0]["Column2"]); Assert.Equal("Github", rows[1]["Column1"]); @@ -1144,7 +1146,7 @@ public async Task SaveAsBasicStreamTest() public async Task SaveAsSpecialAndTypeCreateTest() { using var path = AutoDeletingPath.Create(); - await Exporter.ExportXlsxAsync(path.ToString(), new[] + await _exporter.ExportXlsxAsync(path.ToString(), new[] { new { a = @"""<>+-*//}{\\n", b = 1234567890, c = true, d = DateTime.Now }, new { a = "Hello World", b = -1234567890, c = false, d = DateTime.Now.Date} @@ -1159,7 +1161,7 @@ public async Task SaveAsFileEpplusCanReadTest() using var path = AutoDeletingPath.Create(); var now = DateTime.Now; - await Exporter.ExportXlsxAsync(path.ToString(), new[] + await _exporter.ExportXlsxAsync(path.ToString(), new[] { new { a = @"""<>+-*//}{\\n", b = 1234567890, c = true, d = now}, new { a = "Hello World", b = -1234567890, c = false, d = now.Date} @@ -1185,7 +1187,7 @@ public async Task SavaAsClosedXmlCanReadTest() var now = DateTime.Now; using var path = AutoDeletingPath.Create(); - await Exporter.ExportXlsxAsync(path.ToString(), new[] + await _exporter.ExportXlsxAsync(path.ToString(), new[] { new { a = @"""<>+-*//}{\\n", b = 1234567890, c = true, d = now}, new { a = "Hello World", b = -1234567890, c = false, d = now.Date} @@ -1210,7 +1212,7 @@ public async Task ContentTypeUriContentTypeReadCheckTest() var now = DateTime.Now; using var path = AutoDeletingPath.Create(); - await Exporter.ExportXlsxAsync(path.ToString(), new[] + await _exporter.ExportXlsxAsync(path.ToString(), new[] { new { a = @"""<>+-*//}{\\n", b = 1234567890, c = true, d = now}, new { a = "Hello World", b = -1234567890, c = false, d = now.Date} @@ -1238,7 +1240,7 @@ await Assert.ThrowsAsync(async () => await cts.CancelAsync(); await using var stream = FileHelper.OpenRead(path); - var rows = Importer.QueryXlsxAsync(stream, cancellationToken: cts.Token).ToBlockingEnumerable(cts.Token).ToList(); + var rows = _importer.QueryXlsxAsync(stream, cancellationToken: cts.Token).ToBlockingEnumerable(cts.Token).ToList(); }); } @@ -1258,7 +1260,7 @@ await Assert.ThrowsAsync(async () => }); await using var stream = FileHelper.OpenRead(path); - var d = Importer.QueryXlsxAsync(stream, cancellationToken: cts.Token).ToBlockingEnumerable(cts.Token); + var d = _importer.QueryXlsxAsync(stream, cancellationToken: cts.Token).ToBlockingEnumerable(cts.Token); await cancelTask; _ = d.ToList(); }); @@ -1306,10 +1308,10 @@ public async Task DynamicColumnsConfigurationIsUsedWhenCreatingExcelUsingIDataRe ] }; await using var reader = table.CreateDataReader(); - await Exporter.ExportXlsxAsync(path.ToString(), reader, configuration: configuration); + await _exporter.ExportXlsxAsync(path.ToString(), reader, configuration: configuration); await using var stream = File.OpenRead(path.ToString()); - var rows = Importer.QueryXlsxAsync(stream, useHeaderRow: true).ToBlockingEnumerable() + var rows = _importer.QueryXlsxAsync(stream, useHeaderRow: true).ToBlockingEnumerable() .Cast>() .ToList(); @@ -1372,10 +1374,10 @@ public async Task DynamicColumnsConfigurationIsUsedWhenCreatingExcelUsingDataTab } ] }; - await Exporter.ExportXlsxAsync(path.ToString(), table, configuration: configuration); + await _exporter.ExportXlsxAsync(path.ToString(), table, configuration: configuration); await using var stream = File.OpenRead(path.ToString()); - var rows = Importer.QueryXlsxAsync(stream, useHeaderRow: true).ToBlockingEnumerable() + var rows = _importer.QueryXlsxAsync(stream, useHeaderRow: true).ToBlockingEnumerable() .Cast>() .ToList(); @@ -1408,13 +1410,13 @@ public async Task SaveAsByMiniExcelDataReader() new() { Column1= "MiniExcel" ,Column2 = 1 }, new() { Column1 = "Github", Column2 = 2 } }; - await Exporter.ExportXlsxAsync(path1.ToString(), values); + await _exporter.ExportXlsxAsync(path1.ToString(), values); - await using (IMiniExcelDataReader? reader = Importer.GetXlsxDataReader(path1.ToString(), true)) + await using (IMiniExcelDataReader? reader = _importer.GetXlsxDataReader(path1.ToString(), true)) { using var path2 = AutoDeletingPath.Create(); - await Exporter.ExportXlsxAsync(path2.ToString(), reader); - var results = Importer.QueryXlsxAsync(path2.ToString()).ToBlockingEnumerable().ToList(); + await _exporter.ExportXlsxAsync(path2.ToString(), reader); + var results = _importer.QueryXlsxAsync(path2.ToString()).ToBlockingEnumerable().ToList(); Assert.True(results.Count == 2); Assert.True(results.First().Column1 == "MiniExcel"); @@ -1440,7 +1442,7 @@ public async Task InsertSheetTest() table.Rows.Add(@"""<>+-*//}{\\n", 1234567890, true, now); table.Rows.Add("Hello World", -1234567890, false, now.Date); - await Exporter.InsertXlsxSheetAsync(path, table, sheetName: "Sheet1"); + await _exporter.InsertXlsxSheetAsync(path, table, sheetName: "Sheet1"); using var p = new ExcelPackage(new FileInfo(path)); var sheet1 = p.Workbook.Worksheets[0]; @@ -1463,7 +1465,7 @@ public async Task InsertSheetTest() table.Rows.Add("MiniExcel", 1); table.Rows.Add("Github", 2); - await Exporter.InsertXlsxSheetAsync(path, table, sheetName: "Sheet2"); + await _exporter.InsertXlsxSheetAsync(path, table, sheetName: "Sheet2"); using var p = new ExcelPackage(new FileInfo(path)); var sheet2 = p.Workbook.Worksheets[1]; @@ -1484,7 +1486,7 @@ public async Task InsertSheetTest() table.Columns.Add("Column2", typeof(DateTime)); table.Rows.Add("Test", now); - await Exporter.InsertXlsxSheetAsync(path, table, sheetName: "Sheet2", printHeader: false, configuration: new OpenXmlConfiguration + await _exporter.InsertXlsxSheetAsync(path, table, sheetName: "Sheet2", printHeader: false, configuration: new OpenXmlConfiguration { FastMode = true, AutoFilter = false, @@ -1515,7 +1517,7 @@ public async Task InsertSheetTest() table.Rows.Add("MiniExcel", now); table.Rows.Add("Github", now); - await Exporter.InsertXlsxSheetAsync(path, table, sheetName: "Sheet3", configuration: new OpenXmlConfiguration + await _exporter.InsertXlsxSheetAsync(path, table, sheetName: "Sheet3", configuration: new OpenXmlConfiguration { FastMode = true, AutoFilter = false, @@ -1561,8 +1563,8 @@ static async IAsyncEnumerable GetValues() } #pragma warning restore CS1998 - await Exporter.ExportXlsxAsync(path.ToString(), GetValues()); - var results = Importer.QueryXlsx(path.ToString()).ToList(); + await _exporter.ExportXlsxAsync(path.ToString(), GetValues()); + var results = _importer.QueryXlsx(path.ToString()).ToList(); Assert.True(results.Count == 2); Assert.True(results.First().Column1 == "MiniExcel"); diff --git a/tests/MiniExcelTests/MiniExcelOpenXmlConfigurationTest.cs b/tests/MiniExcelTests/MiniExcelOpenXmlConfigurationTest.cs index be13eb23..7110c973 100644 --- a/tests/MiniExcelTests/MiniExcelOpenXmlConfigurationTest.cs +++ b/tests/MiniExcelTests/MiniExcelOpenXmlConfigurationTest.cs @@ -1,15 +1,18 @@ +using MiniExcelLib.Core; using MiniExcelLib.Core.Attributes; using MiniExcelLib.Core.Helpers; using MiniExcelLib.Core.OpenXml; +using MiniExcelLib.Csv.MiniExcelExtensions; using MiniExcelLib.Tests.Utils; -using Importer = MiniExcelLib.MiniExcel.Importer; -using Exporter = MiniExcelLib.MiniExcel.Exporter; using Xunit; namespace MiniExcelLib.Tests; public class MiniExcelOpenXmlConfigurationTest { + private readonly MiniExcelImporter _importer = MiniExcel.GetImporter(); + private readonly MiniExcelExporter _exporter = MiniExcel.GetExporter(); + [Fact] public async Task EnableWriteFilePathTest() { @@ -25,10 +28,10 @@ public async Task EnableWriteFilePathTest() ]; var path = PathHelper.GetFile("xlsx/Test_EnableWriteFilePath.xlsx"); - await Exporter.ExportXlsxAsync(path, value, configuration: new OpenXmlConfiguration { EnableWriteFilePath = false }, overwriteFile: true); + await _exporter.ExportXlsxAsync(path, value, configuration: new OpenXmlConfiguration { EnableWriteFilePath = false }, overwriteFile: true); Assert.True(File.Exists(path)); - var rows = await Importer.QueryXlsxAsync(path).CreateListAsync(); + var rows = await _importer.QueryXlsxAsync(path).CreateListAsync(); Assert.True(rows.All(x => x.Img is null or [])); } diff --git a/tests/MiniExcelTests/MiniExcelOpenXmlMultipleSheetAsyncTests.cs b/tests/MiniExcelTests/MiniExcelOpenXmlMultipleSheetAsyncTests.cs index ad0991d6..7ec896cf 100644 --- a/tests/MiniExcelTests/MiniExcelOpenXmlMultipleSheetAsyncTests.cs +++ b/tests/MiniExcelTests/MiniExcelOpenXmlMultipleSheetAsyncTests.cs @@ -1,30 +1,32 @@ -using Importer = MiniExcelLib.MiniExcel.Importer; +using MiniExcelLib.Core; using Xunit; namespace MiniExcelLib.Tests; public class MiniExcelOpenXmlMultipleSheetAsyncTests { + private readonly MiniExcelImporter _importer = MiniExcel.GetImporter(); + [Fact] public async Task SpecifySheetNameQueryTest() { const string path = "../../../../../samples/xlsx/TestMultiSheet.xlsx"; { - var q = Importer.QueryXlsxAsync(path, sheetName: "Sheet3").ToBlockingEnumerable(); + var q = _importer.QueryXlsxAsync(path, sheetName: "Sheet3").ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal(5, rows.Count); Assert.Equal(3, rows[0].A); Assert.Equal(3, rows[0].B); } { - var q = Importer.QueryXlsxAsync(path, sheetName: "Sheet2").ToBlockingEnumerable(); + var q = _importer.QueryXlsxAsync(path, sheetName: "Sheet2").ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal(12, rows.Count); Assert.Equal(1, rows[0].A); Assert.Equal(1, rows[0].B); } { - var q = Importer.QueryXlsxAsync(path, sheetName: "Sheet1").ToBlockingEnumerable(); + var q = _importer.QueryXlsxAsync(path, sheetName: "Sheet1").ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal(12, rows.Count); Assert.Equal(2, rows[0].A); @@ -33,7 +35,7 @@ public async Task SpecifySheetNameQueryTest() { await Assert.ThrowsAsync(() => { - _ = Importer.QueryXlsxAsync(path, sheetName: "xxxx").ToBlockingEnumerable().ToList(); + _ = _importer.QueryXlsxAsync(path, sheetName: "xxxx").ToBlockingEnumerable().ToList(); return Task.CompletedTask; }); } @@ -41,25 +43,25 @@ await Assert.ThrowsAsync(() => await using var stream = File.OpenRead(path); { - var rows = Importer.QueryXlsxAsync(stream, sheetName: "Sheet3").ToBlockingEnumerable().Cast>().ToList(); + var rows = _importer.QueryXlsxAsync(stream, sheetName: "Sheet3").ToBlockingEnumerable().Cast>().ToList(); Assert.Equal(5, rows.Count); Assert.Equal(3d, rows[0]["A"]); Assert.Equal(3d, rows[0]["B"]); } { - var rows = Importer.QueryXlsxAsync(stream, sheetName: "Sheet2").ToBlockingEnumerable().Cast>().ToList(); + var rows = _importer.QueryXlsxAsync(stream, sheetName: "Sheet2").ToBlockingEnumerable().Cast>().ToList(); Assert.Equal(12, rows.Count); Assert.Equal(1d, rows[0]["A"]); Assert.Equal(1d, rows[0]["B"]); } { - var rows = Importer.QueryXlsxAsync(stream, sheetName: "Sheet1").ToBlockingEnumerable().Cast>().ToList(); + var rows = _importer.QueryXlsxAsync(stream, sheetName: "Sheet1").ToBlockingEnumerable().Cast>().ToList(); Assert.Equal(12, rows.Count); Assert.Equal(2d, rows[0]["A"]); Assert.Equal(2d, rows[0]["B"]); } { - var rows = Importer.QueryXlsxAsync(stream, sheetName: "Sheet1").ToBlockingEnumerable().Cast>().ToList(); + var rows = _importer.QueryXlsxAsync(stream, sheetName: "Sheet1").ToBlockingEnumerable().Cast>().ToList(); Assert.Equal(12, rows.Count); Assert.Equal(2d, rows[0]["A"]); Assert.Equal(2d, rows[0]["B"]); @@ -71,9 +73,9 @@ public async Task MultiSheetsQueryBasicTest() { const string path = "../../../../../samples/xlsx/TestMultiSheet.xlsx"; await using var stream = File.OpenRead(path); - _ = Importer.QueryXlsxAsync(stream, sheetName: "Sheet1").ToBlockingEnumerable(); - _ = Importer.QueryXlsxAsync(stream, sheetName: "Sheet2").ToBlockingEnumerable(); - _ = Importer.QueryXlsxAsync(stream, sheetName: "Sheet3").ToBlockingEnumerable(); + _ = _importer.QueryXlsxAsync(stream, sheetName: "Sheet1").ToBlockingEnumerable(); + _ = _importer.QueryXlsxAsync(stream, sheetName: "Sheet2").ToBlockingEnumerable(); + _ = _importer.QueryXlsxAsync(stream, sheetName: "Sheet3").ToBlockingEnumerable(); } [Fact] @@ -81,21 +83,21 @@ public async Task MultiSheetsQueryTest() { const string path = "../../../../../samples/xlsx/TestMultiSheet.xlsx"; { - var sheetNames = (await Importer.GetSheetNamesAsync(path)).ToList(); + var sheetNames = (await _importer.GetSheetNamesAsync(path)).ToList(); foreach (var sheetName in sheetNames) { - _ = Importer.QueryXlsxAsync(path, sheetName: sheetName).ToBlockingEnumerable(); + _ = _importer.QueryXlsxAsync(path, sheetName: sheetName).ToBlockingEnumerable(); } Assert.Equal(new[] { "Sheet1", "Sheet2", "Sheet3" }, sheetNames); } { await using var stream = File.OpenRead(path); - var sheetNames = (await Importer.GetSheetNamesAsync(stream)).ToList(); + var sheetNames = (await _importer.GetSheetNamesAsync(stream)).ToList(); Assert.Equal(new[] { "Sheet1", "Sheet2", "Sheet3" }, sheetNames); foreach (var sheetName in sheetNames) { - _ = Importer.QueryXlsxAsync(stream, sheetName: sheetName).ToBlockingEnumerable().ToList(); + _ = _importer.QueryXlsxAsync(stream, sheetName: sheetName).ToBlockingEnumerable().ToList(); } } } diff --git a/tests/MiniExcelTests/MiniExcelOpenXmlMultipleSheetTests.cs b/tests/MiniExcelTests/MiniExcelOpenXmlMultipleSheetTests.cs index 78ee2a81..70faa62e 100644 --- a/tests/MiniExcelTests/MiniExcelOpenXmlMultipleSheetTests.cs +++ b/tests/MiniExcelTests/MiniExcelOpenXmlMultipleSheetTests.cs @@ -1,61 +1,62 @@ -using MiniExcelLib.Core.OpenXml; +using MiniExcelLib.Core; +using MiniExcelLib.Core.OpenXml; using MiniExcelLib.Core.OpenXml.Attributes; using MiniExcelLib.Core.OpenXml.Models; using MiniExcelLib.Tests.Utils; -using Importer = MiniExcelLib.MiniExcel.Importer; -using Exporter = MiniExcelLib.MiniExcel.Exporter; using Xunit; namespace MiniExcelLib.Tests; public class MiniExcelOpenXmlMultipleSheetTests { + private readonly MiniExcelImporter _importer = MiniExcel.GetImporter(); + [Fact] public void SpecifySheetNameQueryTest() { const string path = "../../../../../samples/xlsx/TestMultiSheet.xlsx"; { - var rows = Importer.QueryXlsx(path, sheetName: "Sheet3").ToList(); + var rows = _importer.QueryXlsx(path, sheetName: "Sheet3").ToList(); Assert.Equal(5, rows.Count); Assert.Equal(3, rows[0].A); Assert.Equal(3, rows[0].B); } { - var rows = Importer.QueryXlsx(path, sheetName: "Sheet2").ToList(); + var rows = _importer.QueryXlsx(path, sheetName: "Sheet2").ToList(); Assert.Equal(12, rows.Count); Assert.Equal(1, rows[0].A); Assert.Equal(1, rows[0].B); } { - var rows = Importer.QueryXlsx(path, sheetName: "Sheet1").ToList(); + var rows = _importer.QueryXlsx(path, sheetName: "Sheet1").ToList(); Assert.Equal(12, rows.Count); Assert.Equal(2, rows[0].A); Assert.Equal(2, rows[0].B); } - Assert.Throws(() => Importer.QueryXlsx(path, sheetName: "xxxx").ToList()); + Assert.Throws(() => _importer.QueryXlsx(path, sheetName: "xxxx").ToList()); using var stream = File.OpenRead(path); { - var rows = Importer.QueryXlsx(stream, sheetName: "Sheet3").ToList(); + var rows = _importer.QueryXlsx(stream, sheetName: "Sheet3").ToList(); Assert.Equal(5, rows.Count); Assert.Equal(3, rows[0].A); Assert.Equal(3, rows[0].B); } { - var rows = Importer.QueryXlsx(stream, sheetName: "Sheet2").ToList(); + var rows = _importer.QueryXlsx(stream, sheetName: "Sheet2").ToList(); Assert.Equal(12, rows.Count); Assert.Equal(1, rows[0].A); Assert.Equal(1, rows[0].B); } { - var rows = Importer.QueryXlsx(stream, sheetName: "Sheet1").ToList(); + var rows = _importer.QueryXlsx(stream, sheetName: "Sheet1").ToList(); Assert.Equal(12, rows.Count); Assert.Equal(2, rows[0].A); Assert.Equal(2, rows[0].B); } { - var rows = Importer.QueryXlsx(stream, sheetName: "Sheet1").ToList(); + var rows = _importer.QueryXlsx(stream, sheetName: "Sheet1").ToList(); Assert.Equal(12, rows.Count); Assert.Equal(2, rows[0].A); Assert.Equal(2, rows[0].B); @@ -68,9 +69,9 @@ public void MultiSheetsQueryBasicTest() const string path = "../../../../../samples/xlsx/TestMultiSheet.xlsx"; using var stream = File.OpenRead(path); - _ = Importer.QueryXlsx(stream, sheetName: "Sheet1"); - _ = Importer.QueryXlsx(stream, sheetName: "Sheet2"); - _ = Importer.QueryXlsx(stream, sheetName: "Sheet3"); + _ = _importer.QueryXlsx(stream, sheetName: "Sheet1"); + _ = _importer.QueryXlsx(stream, sheetName: "Sheet2"); + _ = _importer.QueryXlsx(stream, sheetName: "Sheet3"); } [Fact] @@ -78,10 +79,10 @@ public void MultiSheetsQueryTest() { const string path = "../../../../../samples/xlsx/TestMultiSheet.xlsx"; { - var sheetNames = Importer.GetSheetNames(path).ToList(); + var sheetNames = _importer.GetSheetNames(path).ToList(); foreach (var sheetName in sheetNames) { - var rows = Importer.QueryXlsx(path, sheetName: sheetName).ToList(); + var rows = _importer.QueryXlsx(path, sheetName: sheetName).ToList(); } Assert.Equal(new[] { "Sheet1", "Sheet2", "Sheet3" }, sheetNames); @@ -89,12 +90,12 @@ public void MultiSheetsQueryTest() { using var stream = File.OpenRead(path); - var sheetNames = Importer.GetSheetNames(stream).ToList(); + var sheetNames = _importer.GetSheetNames(stream).ToList(); Assert.Equal(new[] { "Sheet1", "Sheet2", "Sheet3" }, sheetNames); foreach (var sheetName in sheetNames) { - var rows = Importer.QueryXlsx(stream, sheetName: sheetName).ToList(); + var rows = _importer.QueryXlsx(stream, sheetName: sheetName).ToList(); } } } @@ -119,21 +120,21 @@ public void ExcelSheetAttributeIsUsedWhenReadExcel() const string path = "../../../../../samples/xlsx/TestDynamicSheet.xlsx"; using (var stream = File.OpenRead(path)) { - var users = Importer.QueryXlsx(stream).ToList(); + var users = _importer.QueryXlsx(stream).ToList(); Assert.Equal(2, users.Count); Assert.Equal("Jack", users[0].Name); - var departments = Importer.QueryXlsx(stream).ToList(); + var departments = _importer.QueryXlsx(stream).ToList(); Assert.Equal(2, departments.Count); Assert.Equal("HR", departments[0].Name); } { - var users = Importer.QueryXlsx(path).ToList(); + var users = _importer.QueryXlsx(path).ToList(); Assert.Equal(2, users.Count); Assert.Equal("Jack", users[0].Name); - var departments = Importer.QueryXlsx(path).ToList(); + var departments = _importer.QueryXlsx(path).ToList(); Assert.Equal(2, departments.Count); Assert.Equal("HR", departments[0].Name); } @@ -155,34 +156,34 @@ public void DynamicSheetConfigurationIsUsedWhenReadExcel() using (var stream = File.OpenRead(path)) { // take first sheet as default - var users = Importer.QueryXlsx(stream, configuration: configuration, useHeaderRow: true).ToList(); + var users = _importer.QueryXlsx(stream, configuration: configuration, useHeaderRow: true).ToList(); Assert.Equal(2, users.Count); Assert.Equal("Jack", users[0].Name); // take second sheet by sheet name - var departments = Importer.QueryXlsx(stream, sheetName: "Departments", configuration: configuration, useHeaderRow: true).ToList(); + var departments = _importer.QueryXlsx(stream, sheetName: "Departments", configuration: configuration, useHeaderRow: true).ToList(); Assert.Equal(2, departments.Count); Assert.Equal("HR", departments[0].Name); // take second sheet by sheet key - departments = Importer.QueryXlsx(stream, sheetName: "departmentSheet", configuration: configuration, useHeaderRow: true).ToList(); + departments = _importer.QueryXlsx(stream, sheetName: "departmentSheet", configuration: configuration, useHeaderRow: true).ToList(); Assert.Equal(2, departments.Count); Assert.Equal("HR", departments[0].Name); } { // take first sheet as default - var users = Importer.QueryXlsx(path, configuration: configuration, useHeaderRow: true).ToList(); + var users = _importer.QueryXlsx(path, configuration: configuration, useHeaderRow: true).ToList(); Assert.Equal(2, users.Count); Assert.Equal("Jack", users[0].Name); // take second sheet by sheet name - var departments = Importer.QueryXlsx(path, sheetName: "Departments", configuration: configuration, useHeaderRow: true).ToList(); + var departments = _importer.QueryXlsx(path, sheetName: "Departments", configuration: configuration, useHeaderRow: true).ToList(); Assert.Equal(2, departments.Count); Assert.Equal("HR", departments[0].Name); // take second sheet by sheet key - departments = Importer.QueryXlsx(path, sheetName: "departmentSheet", configuration: configuration, useHeaderRow: true).ToList(); + departments = _importer.QueryXlsx(path, sheetName: "departmentSheet", configuration: configuration, useHeaderRow: true).ToList(); Assert.Equal(2, departments.Count); Assert.Equal("HR", departments[0].Name); } @@ -193,7 +194,7 @@ public void ReadSheetVisibilityStateTest() { const string path = "../../../../../samples/xlsx/TestMultiSheetWithHiddenSheet.xlsx"; { - var sheetInfos = Importer.GetSheetInformations(path).ToList(); + var sheetInfos = _importer.GetSheetInformations(path).ToList(); Assert.Collection(sheetInfos, i => { @@ -257,12 +258,12 @@ public void WriteHiddenSheetTest() using var file = AutoDeletingPath.Create(); var path = file.ToString(); - var rowsWritten = Exporter.ExportXlsx(path, sheets, configuration: configuration); + var rowsWritten = MiniExcel.GetExporter().ExportXlsx(path, sheets, configuration: configuration); Assert.Equal(2, rowsWritten.Length); Assert.Equal(2, rowsWritten[0]); - var sheetInfos = Importer.GetSheetInformations(path).ToList(); + var sheetInfos = _importer.GetSheetInformations(path).ToList(); Assert.Collection(sheetInfos, i => { @@ -281,7 +282,7 @@ public void WriteHiddenSheetTest() foreach (var sheetName in sheetInfos.Select(s => s.Name)) { - var rows = Importer.QueryXlsx(path, sheetName: sheetName).ToList(); + var rows = _importer.QueryXlsx(path, sheetName: sheetName).ToList(); } } } \ No newline at end of file diff --git a/tests/MiniExcelTests/MiniExcelOpenXmlTests.cs b/tests/MiniExcelTests/MiniExcelOpenXmlTests.cs index 1dc3d713..ceea3d1f 100644 --- a/tests/MiniExcelTests/MiniExcelOpenXmlTests.cs +++ b/tests/MiniExcelTests/MiniExcelOpenXmlTests.cs @@ -7,6 +7,7 @@ using ClosedXML.Excel; using Dapper; using ExcelDataReader; +using MiniExcelLib.Core; using MiniExcelLib.Core.Attributes; using MiniExcelLib.Core.OpenXml; using MiniExcelLib.Core.OpenXml.Utils; @@ -14,8 +15,6 @@ using OfficeOpenXml; using Xunit; using Xunit.Abstractions; -using Importer = MiniExcelLib.MiniExcel.Importer; -using Exporter = MiniExcelLib.MiniExcel.Exporter; namespace MiniExcelLib.Tests; @@ -23,23 +22,26 @@ public class MiniExcelOpenXmlTests(ITestOutputHelper output) { private readonly ITestOutputHelper _output = output; + private readonly MiniExcelImporter _importer = MiniExcel.GetImporter(); + private readonly MiniExcelExporter _exporter = MiniExcel.GetExporter(); + [Fact] public void GetColumnsTest() { const string tmPath = "../../../../../samples/xlsx/TestTypeMapping.xlsx"; const string tePath = "../../../../../samples/xlsx/TestEmpty.xlsx"; { - var columns = Importer.GetXlsxColumns (tmPath); + var columns = _importer.GetXlsxColumns (tmPath); Assert.Equal(["A", "B", "C", "D", "E", "F", "G", "H"], columns); } { - var columns = Importer.GetXlsxColumns (tmPath); + var columns = _importer.GetXlsxColumns (tmPath); Assert.Equal(8, columns.Count); } { - var columns = Importer.GetXlsxColumns (tePath); + var columns = _importer.GetXlsxColumns (tePath); Assert.Empty(columns); } } @@ -59,10 +61,10 @@ public void SaveAsControlChracter() '\u0017','\u0018','\u0019','\u001A','\u001B','\u001C','\u001D','\u001E','\u001F','\u007F' ]; var input = chars.Select(s => new { Test = s.ToString() }); - Exporter.ExportXlsx(path.ToString(), input); + _exporter.ExportXlsx(path.ToString(), input); - var rows2 = Importer.QueryXlsx(path.ToString(), true).Select(s => s.Test).ToArray(); - var rows1 = Importer.QueryXlsx(path.ToString()).Select(s => s.Test).ToArray(); + var rows2 = _importer.QueryXlsx(path.ToString(), true).Select(s => s.Test).ToArray(); + var rows1 = _importer.QueryXlsx(path.ToString()).Select(s => s.Test).ToArray(); } private class SaveAsControlChracterVO @@ -90,14 +92,14 @@ private class ExcelAttributeDemo public void CustomAttributeWihoutVaildPropertiesTest() { const string path = "../../../../../samples/xlsx/TestCustomExcelColumnAttribute.xlsx"; - Assert.Throws(() => Importer.QueryXlsx(path).ToList()); + Assert.Throws(() => _importer.QueryXlsx(path).ToList()); } [Fact] public void QueryCustomAttributesTest() { const string path = "../../../../../samples/xlsx/TestCustomExcelColumnAttribute.xlsx"; - var rows = Importer.QueryXlsx(path).ToList(); + var rows = _importer.QueryXlsx(path).ToList(); Assert.Equal("Column1", rows[0].Test1); Assert.Equal("Column2", rows[0].Test2); @@ -121,8 +123,8 @@ public void SaveAsCustomAttributesTest() Test4 = "Test4", }); - Exporter.ExportXlsx(path.ToString(), input); - var rows = Importer.QueryXlsx(path.ToString(), true).ToList(); + _exporter.ExportXlsx(path.ToString(), input); + var rows = _importer.QueryXlsx(path.ToString(), true).ToList(); var first = rows[0] as IDictionary; Assert.Equal(3, rows.Count); @@ -148,7 +150,7 @@ private class CustomAttributesWihoutVaildPropertiesTestPoco public void QueryCastToIDictionary() { const string path = "../../../../../samples/xlsx/TestCenterEmptyRow/TestCenterEmptyRow.xlsx"; - foreach (IDictionary row in Importer.QueryXlsx(path)) + foreach (IDictionary row in _importer.QueryXlsx(path)) { _ = row; } @@ -159,7 +161,7 @@ public void QueryRangeToIDictionary() { const string path = "../../../../../samples/xlsx/TestCenterEmptyRow/TestCenterEmptyRow.xlsx"; // tips:Only uppercase letters are effective - var rows = Importer.QueryRangeXlsx(path, startCell: "A2", endCell: "C7") + var rows = _importer.QueryRangeXlsx(path, startCell: "A2", endCell: "C7") .Cast>() .ToList(); @@ -170,7 +172,7 @@ public void QueryRangeToIDictionary() var startCellXY = ReferenceHelper.ConvertCellToCoordinates("A2"); var endCellXY = ReferenceHelper.ConvertCellToCoordinates("C7"); - rows = Importer.QueryRangeXlsx(path, startRowIndex: startCellXY.Item2, startColumnIndex: startCellXY.Item1, endRowIndex: endCellXY.Item2, endColumnIndex: endCellXY.Item1) + rows = _importer.QueryRangeXlsx(path, startRowIndex: startCellXY.Item2, startColumnIndex: startCellXY.Item1, endRowIndex: endCellXY.Item2, endColumnIndex: endCellXY.Item1) .Cast>() .ToList(); Assert.Equal(5, rows.Count); @@ -178,14 +180,14 @@ public void QueryRangeToIDictionary() Assert.Equal(2d, rows[1]["B"]); Assert.Equal(null!, rows[2]["A"]); - rows = Importer.QueryRangeXlsx(path, startRowIndex:2, startColumnIndex: 1, endRowIndex: 3) + rows = _importer.QueryRangeXlsx(path, startRowIndex:2, startColumnIndex: 1, endRowIndex: 3) .Cast>() .ToList(); Assert.Equal(2, rows.Count); Assert.Equal(4, rows[0].Count); Assert.Equal(4d, rows[1]["D"]); - rows = Importer.QueryRangeXlsx(path, startRowIndex: 2, startColumnIndex: 1, endColumnIndex: 3) + rows = _importer.QueryRangeXlsx(path, startRowIndex: 2, startColumnIndex: 1, endColumnIndex: 3) .Cast>() .ToList(); Assert.Equal(5, rows.Count); @@ -199,7 +201,7 @@ public void CenterEmptyRowsQueryTest() const string path = "../../../../../samples/xlsx/TestCenterEmptyRow/TestCenterEmptyRow.xlsx"; using (var stream = File.OpenRead(path)) { - var rows = Importer.QueryXlsx(stream).ToList(); + var rows = _importer.QueryXlsx(stream).ToList(); Assert.Equal("a", rows[0].A); Assert.Equal("b", rows[0].B); @@ -234,7 +236,7 @@ public void CenterEmptyRowsQueryTest() using (var stream = File.OpenRead(path)) { - var rows = Importer.QueryXlsx(stream, useHeaderRow: true).ToList(); + var rows = _importer.QueryXlsx(stream, useHeaderRow: true).ToList(); Assert.Equal(1, rows[0].a); Assert.Equal(null, rows[0].b); @@ -268,7 +270,7 @@ public void TestEmptyRowsQuerySelfClosingTag() { const string path = "../../../../../samples/xlsx/TestEmptySelfClosingRow.xlsx"; using var stream = File.OpenRead(path); - var rows = Importer.QueryXlsx(stream).ToList(); + var rows = _importer.QueryXlsx(stream).ToList(); Assert.Equal(null, rows[0].A); Assert.Equal(1, rows[1].A); @@ -287,7 +289,7 @@ public void TestDynamicQueryBasic_WithoutHead() { const string path = "../../../../../samples/xlsx/TestDynamicQueryBasic_WithoutHead.xlsx"; using var stream = File.OpenRead(path); - var rows = Importer.QueryXlsx(stream).ToList(); + var rows = _importer.QueryXlsx(stream).ToList(); Assert.Equal("MiniExcel", rows[0].A); Assert.Equal(1, rows[0].B); @@ -301,7 +303,7 @@ public void TestDynamicQueryBasic_useHeaderRow() const string path = "../../../../../samples/xlsx/TestDynamicQueryBasic.xlsx"; using (var stream = File.OpenRead(path)) { - var rows = Importer.QueryXlsx(stream, useHeaderRow: true).ToList(); + var rows = _importer.QueryXlsx(stream, useHeaderRow: true).ToList(); Assert.Equal("MiniExcel", rows[0].Column1); Assert.Equal(1, rows[0].Column2); @@ -310,7 +312,7 @@ public void TestDynamicQueryBasic_useHeaderRow() } { - var rows = Importer.QueryXlsx(path, useHeaderRow: true).ToList(); + var rows = _importer.QueryXlsx(path, useHeaderRow: true).ToList(); Assert.Equal("MiniExcel", rows[0].Column1); Assert.Equal(1, rows[0].Column2); @@ -341,7 +343,7 @@ public void QueryStrongTypeMapping_Test() const string path = "../../../../../samples/xlsx/TestTypeMapping.xlsx"; using (var stream = File.OpenRead(path)) { - var rows = Importer.QueryXlsx(stream).ToList(); + var rows = _importer.QueryXlsx(stream).ToList(); Assert.Equal(100, rows.Count); Assert.Equal(Guid.Parse("78DE23D2-DCB6-BD3D-EC67-C112BBC322A2"), rows[0].ID); @@ -354,7 +356,7 @@ public void QueryStrongTypeMapping_Test() } { - var rows = Importer.QueryXlsx(path).ToList(); + var rows = _importer.QueryXlsx(path).ToList(); Assert.Equal(100, rows.Count); Assert.Equal(Guid.Parse("78DE23D2-DCB6-BD3D-EC67-C112BBC322A2"), rows[0].ID); @@ -380,7 +382,7 @@ public void AutoCheckTypeTest() { const string path = "../../../../../samples/xlsx/TestTypeMapping_AutoCheckFormat.xlsx"; using var stream = FileHelper.OpenRead(path); - var rows = Importer.QueryXlsx(stream).ToList(); + var rows = _importer.QueryXlsx(stream).ToList(); } private class ExcelUriDemo @@ -395,7 +397,7 @@ public void UriMappingTest() { const string path = "../../../../../samples/xlsx/TestUriMapping.xlsx"; using var stream = File.OpenRead(path); - var rows = Importer.QueryXlsx(stream).ToList(); + var rows = _importer.QueryXlsx(stream).ToList(); Assert.Equal("Felix", rows[1].Name); Assert.Equal(44, rows[1].Age); @@ -413,7 +415,7 @@ private class SimpleAccount public void TrimColumnNamesTest() { const string path = "../../../../../samples/xlsx/TestTrimColumnNames.xlsx"; - var rows = Importer.QueryXlsx(path).ToList(); + var rows = _importer.QueryXlsx(path).ToList(); Assert.Equal("Raymond", rows[4].Name); Assert.Equal(18, rows[4].Age); @@ -427,7 +429,7 @@ public void TestDatetimeSpanFormat_ClosedXml() const string path = "../../../../../samples/xlsx/TestDatetimeSpanFormat_ClosedXml.xlsx"; using var stream = FileHelper.OpenRead(path); - var row = Importer.QueryXlsx(stream).First(); + var row = _importer.QueryXlsx(stream).First(); var a = row.A; var b = row.B; Assert.Equal(DateTime.Parse("2021-03-20T23:39:42.3130000"), (DateTime)a); @@ -440,13 +442,13 @@ public void LargeFileQueryStrongTypeMapping_Test() const string path = "../../../../../benchmarks/MiniExcel.Benchmarks/Test1,000,000x10.xlsx"; using (var stream = File.OpenRead(path)) { - var rows = Importer.QueryXlsx(stream).Take(2).ToList(); + var rows = _importer.QueryXlsx(stream).Take(2).ToList(); Assert.Equal("HelloWorld2", rows[0].HelloWorld1); Assert.Equal("HelloWorld3", rows[1].HelloWorld1); } { - var rows = Importer.QueryXlsx(path).Take(2).ToList(); + var rows = _importer.QueryXlsx(path).Take(2).ToList(); Assert.Equal("HelloWorld2", rows[0].HelloWorld1); Assert.Equal("HelloWorld3", rows[1].HelloWorld1); @@ -466,7 +468,7 @@ public void QueryExcelDataReaderCheckTest(string path) var exceldatareaderResult = reader.AsDataSet(); using var stream = File.OpenRead(path); - var rows = Importer.QueryXlsx(stream).ToList(); + var rows = _importer.QueryXlsx(stream).ToList(); Assert.Equal(exceldatareaderResult.Tables[0].Rows.Count, rows.Count); foreach (IDictionary row in rows) @@ -496,7 +498,7 @@ public void QuerySheetWithoutRAttribute() { const string path = "../../../../../samples/xlsx/TestWihoutRAttribute.xlsx"; using var stream = File.OpenRead(path); - var rows = Importer.QueryXlsx(stream).ToList(); + var rows = _importer.QueryXlsx(stream).ToList(); var keys = (rows.First() as IDictionary)!.Keys; Assert.Equal(2, rows.Count); @@ -518,7 +520,7 @@ public void FixDimensionJustOneColumnParsingError_Test() { const string path = "../../../../../samples/xlsx/TestDimensionC3.xlsx"; using var stream = File.OpenRead(path); - var rows = Importer.QueryXlsx(stream).ToList(); + var rows = _importer.QueryXlsx(stream).ToList(); var keys = ((IDictionary)rows.First()).Keys; Assert.Equal(3, keys.Count); Assert.Equal(2, rows.Count); @@ -542,11 +544,11 @@ public void SaveAsFileWithDimensionByICollection() new() { A = "A", B = "B" }, new() { A = "A", B = "B" } ]; - Exporter.ExportXlsx(path, values); + _exporter.ExportXlsx(path, values); using (var stream = File.OpenRead(path)) { - var rows = Importer.QueryXlsx(stream, useHeaderRow: false).ToList(); + var rows = _importer.QueryXlsx(stream, useHeaderRow: false).ToList(); Assert.Equal(3, rows.Count); Assert.Equal("A", rows[0].A); Assert.Equal("A", rows[1].A); @@ -554,14 +556,14 @@ public void SaveAsFileWithDimensionByICollection() } using (var stream = File.OpenRead(path)) { - var rows = Importer.QueryXlsx(stream, useHeaderRow: true).ToList(); + var rows = _importer.QueryXlsx(stream, useHeaderRow: true).ToList(); Assert.Equal(2, rows.Count); Assert.Equal("A", rows[0].A); Assert.Equal("A", rows[1].A); } Assert.Equal("A1:B3", Helpers.GetFirstSheetDimensionRefValue(path)); - Exporter.ExportXlsx(path, values, false, overwriteFile: true); + _exporter.ExportXlsx(path, values, false, overwriteFile: true); Assert.Equal("A1:B2", Helpers.GetFirstSheetDimensionRefValue(path)); } @@ -571,20 +573,20 @@ public void SaveAsFileWithDimensionByICollection() var path = file.ToString(); List values = []; - Exporter.ExportXlsx(path, values, false); + _exporter.ExportXlsx(path, values, false); { using (var stream = File.OpenRead(path)) { - var rows = Importer.QueryXlsx(stream, useHeaderRow: false).ToList(); + var rows = _importer.QueryXlsx(stream, useHeaderRow: false).ToList(); Assert.Empty(rows); } Assert.Equal("A1:B1", Helpers.GetFirstSheetDimensionRefValue(path)); } - Exporter.ExportXlsx(path, values, overwriteFile: true); + _exporter.ExportXlsx(path, values, overwriteFile: true); { using var stream = File.OpenRead(path); - var rows = Importer.QueryXlsx(stream, useHeaderRow: false).ToList(); + var rows = _importer.QueryXlsx(stream, useHeaderRow: false).ToList(); Assert.Single(rows); } Assert.Equal("A1:B1", Helpers.GetFirstSheetDimensionRefValue(path)); @@ -599,11 +601,11 @@ public void SaveAsFileWithDimensionByICollection() new {A="A",B="B"}, new {A="A",B="B"}, }; - Exporter.ExportXlsx(path, values); + _exporter.ExportXlsx(path, values); { using (var stream = File.OpenRead(path)) { - var rows = Importer.QueryXlsx(stream, useHeaderRow: false).ToList(); + var rows = _importer.QueryXlsx(stream, useHeaderRow: false).ToList(); Assert.Equal(3, rows.Count); Assert.Equal("A", rows[0].A); Assert.Equal("A", rows[1].A); @@ -611,7 +613,7 @@ public void SaveAsFileWithDimensionByICollection() } using (var stream = File.OpenRead(path)) { - var rows = Importer.QueryXlsx(stream, useHeaderRow: true).ToList(); + var rows = _importer.QueryXlsx(stream, useHeaderRow: true).ToList(); Assert.Equal(2, rows.Count); Assert.Equal("A", rows[0].A); Assert.Equal("A", rows[1].A); @@ -619,7 +621,7 @@ public void SaveAsFileWithDimensionByICollection() } Assert.Equal("A1:B3", Helpers.GetFirstSheetDimensionRefValue(path)); - Exporter.ExportXlsx(path, values, false, overwriteFile: true); + _exporter.ExportXlsx(path, values, false, overwriteFile: true); Assert.Equal("A1:B2", Helpers.GetFirstSheetDimensionRefValue(path)); } @@ -627,7 +629,7 @@ public void SaveAsFileWithDimensionByICollection() { using var path = AutoDeletingPath.Create(); var values = new List(); - Assert.Throws(() => Exporter.ExportXlsx(path.ToString(), values)); + Assert.Throws(() => _exporter.ExportXlsx(path.ToString(), values)); } } @@ -639,15 +641,15 @@ public void SaveAsFileWithDimension() var path = file.ToString(); var table = new DataTable(); - Exporter.ExportXlsx(path, table); + _exporter.ExportXlsx(path, table); Assert.Equal("A1", Helpers.GetFirstSheetDimensionRefValue(path)); { using var stream = File.OpenRead(path); - var rows = Importer.QueryXlsx(stream).ToList(); + var rows = _importer.QueryXlsx(stream).ToList(); Assert.Single(rows); } - Exporter.ExportXlsx(path, table, printHeader: false, overwriteFile: true); + _exporter.ExportXlsx(path, table, printHeader: false, overwriteFile: true); Assert.Equal("A1", Helpers.GetFirstSheetDimensionRefValue(path)); } @@ -663,12 +665,12 @@ public void SaveAsFileWithDimension() table.Rows.Add(@"""<>+-*//}{\\n", 1234567890); table.Rows.Add("Hello World", -1234567890, false, DateTime.Now); - Exporter.ExportXlsx(path, table); + _exporter.ExportXlsx(path, table); Assert.Equal("A1:D3", Helpers.GetFirstSheetDimensionRefValue(path)); using (var stream = File.OpenRead(path)) { - var rows = Importer.QueryXlsx(stream, useHeaderRow: true).ToList(); + var rows = _importer.QueryXlsx(stream, useHeaderRow: true).ToList(); Assert.Equal(2, rows.Count); Assert.Equal(@"""<>+-*//}{\\n", rows[0].a); Assert.Equal(1234567890, rows[0].b); @@ -678,7 +680,7 @@ public void SaveAsFileWithDimension() using (var stream = File.OpenRead(path)) { - var rows = Importer.QueryXlsx(stream).ToList(); + var rows = _importer.QueryXlsx(stream).ToList(); Assert.Equal(3, rows.Count); Assert.Equal("a", rows[0].A); Assert.Equal("b", rows[0].B); @@ -686,7 +688,7 @@ public void SaveAsFileWithDimension() Assert.Equal("d", rows[0].D); } - Exporter.ExportXlsx(path, table, printHeader: false, overwriteFile: true); + _exporter.ExportXlsx(path, table, printHeader: false, overwriteFile: true); Assert.Equal("A1:D2", Helpers.GetFirstSheetDimensionRefValue(path)); } @@ -699,7 +701,7 @@ public void SaveAsFileWithDimension() table.Rows.Add("A"); table.Rows.Add("B"); - Exporter.ExportXlsx(path.ToString(), table); + _exporter.ExportXlsx(path.ToString(), table); Assert.Equal("A1:A3", Helpers.GetFirstSheetDimensionRefValue(path.ToString())); } } @@ -720,7 +722,7 @@ public void SaveAsByDataTableTest() table.Rows.Add(@"""<>+-*//}{\\n", 1234567890, true, now); table.Rows.Add("Hello World", -1234567890, false, now.Date); - Exporter.ExportXlsx(path, table, sheetName: "R&D"); + _exporter.ExportXlsx(path, table, sheetName: "R&D"); using var p = new ExcelPackage(new FileInfo(path)); var ws = p.Workbook.Worksheets.First(); @@ -745,7 +747,7 @@ public void SaveAsByDataTableTest() table.Rows.Add("MiniExcel", 1); table.Rows.Add("Github", 2); - Exporter.ExportXlsx(path.ToString(), table); + _exporter.ExportXlsx(path.ToString(), table); } } @@ -754,16 +756,16 @@ public void QueryByLINQExtensionsAvoidLargeFileOOMTest() { const string path = "../../../../../benchmarks/MiniExcel.Benchmarks/Test1,000,000x10.xlsx"; - var query1 = Importer.QueryXlsx(path).First(); + var query1 = _importer.QueryXlsx(path).First(); Assert.Equal("HelloWorld1", query1.A); using (var stream = File.OpenRead(path)) { - var query2 = Importer.QueryXlsx(stream).First(); + var query2 = _importer.QueryXlsx(stream).First(); Assert.Equal("HelloWorld1", query2.A); } - var query3 = Importer.QueryXlsx(path).Take(10); + var query3 = _importer.QueryXlsx(path).Take(10); Assert.Equal(10, query3.Count()); } @@ -774,11 +776,11 @@ public void EmptyTest() using (var connection = Db.GetConnection("Data Source=:memory:")) { var rows = connection.Query("with cte as (select 1 id,2 val) select * from cte where 1=2"); - Exporter.ExportXlsx(path.ToString(), rows); + _exporter.ExportXlsx(path.ToString(), rows); } using (var stream = File.OpenRead(path.ToString())) { - var rows = Importer.QueryXlsx(stream, useHeaderRow: true).ToList(); + var rows = _importer.QueryXlsx(stream, useHeaderRow: true).ToList(); Assert.Empty(rows); } } @@ -800,11 +802,11 @@ public void SaveAsByIEnumerableIDictionary() ["R&D"] = values, ["success!"] = values }; - Exporter.ExportXlsx(path, sheets); + _exporter.ExportXlsx(path, sheets); using (var stream = File.OpenRead(path)) { - var rows = Importer.QueryXlsx(stream, useHeaderRow: false).ToList(); + var rows = _importer.QueryXlsx(stream, useHeaderRow: false).ToList(); Assert.Equal("Column1", rows[0].A); Assert.Equal("Column2", rows[0].B); Assert.Equal("MiniExcel", rows[1].A); @@ -812,12 +814,12 @@ public void SaveAsByIEnumerableIDictionary() Assert.Equal("Github", rows[2].A); Assert.Equal(2, rows[2].B); - Assert.Equal("R&D", Importer.GetSheetNames(stream)[0]); + Assert.Equal("R&D", _importer.GetSheetNames(stream)[0]); } using (var stream = File.OpenRead(path)) { - var rows = Importer.QueryXlsx(stream, useHeaderRow: true).ToList(); + var rows = _importer.QueryXlsx(stream, useHeaderRow: true).ToList(); Assert.Equal(2, rows.Count); Assert.Equal("MiniExcel", rows[0].Column1); @@ -825,7 +827,7 @@ public void SaveAsByIEnumerableIDictionary() Assert.Equal("Github", rows[1].Column1); Assert.Equal(2, rows[1].Column2); - Assert.Equal("success!", Importer.GetSheetNames(stream)[1]); + Assert.Equal("success!", _importer.GetSheetNames(stream)[1]); } Assert.Equal("A1:B3", Helpers.GetFirstSheetDimensionRefValue(path)); @@ -837,11 +839,11 @@ public void SaveAsByIEnumerableIDictionary() new() { { 1, "MiniExcel"}, { 2, 1 } }, new() { { 1, "Github" }, { 2, 2 } }, }; - Exporter.ExportXlsx(path, values, overwriteFile: true); + _exporter.ExportXlsx(path, values, overwriteFile: true); using (var stream = File.OpenRead(path)) { - var rows = Importer.QueryXlsx(stream, useHeaderRow: false).ToList(); + var rows = _importer.QueryXlsx(stream, useHeaderRow: false).ToList(); Assert.Equal(3, rows.Count); } @@ -860,7 +862,7 @@ public void SaveAsFrozenRowsAndColumnsTest() // Test enumerable using var path = AutoDeletingPath.Create(); - Exporter.ExportXlsx( + _exporter.ExportXlsx( path.ToString(), new[] { @@ -872,7 +874,7 @@ public void SaveAsFrozenRowsAndColumnsTest() using (var stream = File.OpenRead(path.ToString())) { - var rows = Importer.QueryXlsx(stream, useHeaderRow: true).ToList(); + var rows = _importer.QueryXlsx(stream, useHeaderRow: true).ToList(); Assert.Equal("MiniExcel", rows[0].Column1); Assert.Equal(1, rows[0].Column2); @@ -892,14 +894,14 @@ public void SaveAsFrozenRowsAndColumnsTest() table.Rows.Add("Hello World", -1234567890, false, DateTime.Now.Date); using var pathTable = AutoDeletingPath.Create(); - Exporter.ExportXlsx(pathTable.ToString(), table, configuration: config); + _exporter.ExportXlsx(pathTable.ToString(), table, configuration: config); Assert.Equal("A1:D3", Helpers.GetFirstSheetDimensionRefValue(pathTable.ToString())); // data reader var reader = table.CreateDataReader(); using var pathReader = AutoDeletingPath.Create(); - Exporter.ExportXlsx(pathReader.ToString(), reader, configuration: config, overwriteFile: true); + _exporter.ExportXlsx(pathReader.ToString(), reader, configuration: config, overwriteFile: true); Assert.Equal("A1:D3", Helpers.GetFirstSheetDimensionRefValue(pathTable.ToString())); //TODO: fix datareader not writing ref dimension (also in async version) } @@ -913,14 +915,14 @@ public void SaveAsByDapperRows() using (var connection = Db.GetConnection("Data Source=:memory:")) { var rows = connection.Query("select 'MiniExcel' as Column1,1 as Column2 union all select 'Github',2"); - Exporter.ExportXlsx(path, rows); + _exporter.ExportXlsx(path, rows); } Assert.Equal("A1:B3", Helpers.GetFirstSheetDimensionRefValue(path)); using (var stream = File.OpenRead(path)) { - var rows = Importer.QueryXlsx(stream, useHeaderRow: true).ToList(); + var rows = _importer.QueryXlsx(stream, useHeaderRow: true).ToList(); Assert.Equal("MiniExcel", rows[0].Column1); Assert.Equal(1, rows[0].Column2); @@ -932,18 +934,18 @@ public void SaveAsByDapperRows() using (var connection = Db.GetConnection("Data Source=:memory:")) { var rows = connection.Query("with cte as (select 'MiniExcel' as Column1,1 as Column2 union all select 'Github',2)select * from cte where 1=2").ToList(); - Exporter.ExportXlsx(path, rows, overwriteFile: true); + _exporter.ExportXlsx(path, rows, overwriteFile: true); } using (var stream = File.OpenRead(path)) { - var rows = Importer.QueryXlsx(stream, useHeaderRow: false).ToList(); + var rows = _importer.QueryXlsx(stream, useHeaderRow: false).ToList(); Assert.Empty(rows); } using (var stream = File.OpenRead(path)) { - var rows = Importer.QueryXlsx(stream, useHeaderRow: true).ToList(); + var rows = _importer.QueryXlsx(stream, useHeaderRow: true).ToList(); Assert.Empty(rows); } @@ -953,14 +955,14 @@ public void SaveAsByDapperRows() using (var connection = Db.GetConnection("Data Source=:memory:")) { var rows = connection.Query("select 'MiniExcel' as Column1,1 as Column2 union all select 'Github',2").ToList(); - Exporter.ExportXlsx(path, rows, overwriteFile: true); + _exporter.ExportXlsx(path, rows, overwriteFile: true); } Assert.Equal("A1:B3", Helpers.GetFirstSheetDimensionRefValue(path)); using (var stream = File.OpenRead(path)) { - var rows = Importer.QueryXlsx(stream, useHeaderRow: false).ToList(); + var rows = _importer.QueryXlsx(stream, useHeaderRow: false).ToList(); Assert.Equal("Column1", rows[0].A); Assert.Equal("Column2", rows[0].B); @@ -972,7 +974,7 @@ public void SaveAsByDapperRows() using (var stream = File.OpenRead(path)) { - var rows = Importer.QueryXlsx(stream, useHeaderRow: true).ToList(); + var rows = _importer.QueryXlsx(stream, useHeaderRow: true).ToList(); Assert.Equal("MiniExcel", rows[0].Column1); Assert.Equal(1, rows[0].Column2); @@ -995,10 +997,10 @@ public void QueryByStrongTypeParameterTest() new() { Column1 = "MiniExcel", Column2 = 1 }, new() { Column1 = "Github", Column2 = 2 } ]; - Exporter.ExportXlsx(path.ToString(), values); + _exporter.ExportXlsx(path.ToString(), values); using var stream = File.OpenRead(path.ToString()); - var rows = Importer.QueryXlsx(stream, useHeaderRow: true).ToList(); + var rows = _importer.QueryXlsx(stream, useHeaderRow: true).ToList(); Assert.Equal("MiniExcel", rows[0].Column1); Assert.Equal(1, rows[0].Column2); @@ -1015,10 +1017,10 @@ public void QueryByDictionaryStringAndObjectParameterTest() new() { { "Column1", "MiniExcel" }, { "Column2", 1 } }, new() { { "Column1", "Github" }, { "Column2", 2 } } ]; - Exporter.ExportXlsx(path.ToString(), values); + _exporter.ExportXlsx(path.ToString(), values); using var stream = File.OpenRead(path.ToString()); - var rows = Importer.QueryXlsx(stream, useHeaderRow: true).ToList(); + var rows = _importer.QueryXlsx(stream, useHeaderRow: true).ToList(); Assert.Equal("MiniExcel", rows[0].Column1); Assert.Equal(1, rows[0].Column2); @@ -1045,7 +1047,7 @@ public void SQLiteInsertTest() using (var transaction = connection.BeginTransaction()) using (var stream = File.OpenRead(path)) { - var rows = Importer.QueryXlsx(stream); + var rows = _importer.QueryXlsx(stream); foreach (var row in rows) { _ = connection.Execute("insert into T (A,B) values (@A,@B)", new { row.A, row.B }, transaction: transaction); @@ -1067,7 +1069,7 @@ public void SaveAsBasicCreateTest() { using var path = AutoDeletingPath.Create(); - var rowsWritten = Exporter.ExportXlsx(path.ToString(), new[] + var rowsWritten = _exporter.ExportXlsx(path.ToString(), new[] { new { Column1 = "MiniExcel", Column2 = 1 }, new { Column1 = "Github", Column2 = 2} @@ -1078,7 +1080,7 @@ public void SaveAsBasicCreateTest() using (var stream = File.OpenRead(path.ToString())) { - var rows = Importer.QueryXlsx(stream, useHeaderRow: true).ToList(); + var rows = _importer.QueryXlsx(stream, useHeaderRow: true).ToList(); Assert.Equal("MiniExcel", rows[0].Column1); Assert.Equal(1, rows[0].Column2); @@ -1101,14 +1103,14 @@ public void SaveAsBasicStreamTest() }; using (var stream = new FileStream(path.ToString(), FileMode.CreateNew)) { - var rowsWritten = Exporter.ExportXlsx(stream, values); + var rowsWritten = _exporter.ExportXlsx(stream, values); Assert.Single(rowsWritten); Assert.Equal(2, rowsWritten[0]); } using (var stream = File.OpenRead(path.ToString())) { - var rows = Importer.QueryXlsx(stream, useHeaderRow: true).ToList(); + var rows = _importer.QueryXlsx(stream, useHeaderRow: true).ToList(); Assert.Equal("MiniExcel", rows[0].Column1); Assert.Equal(1, rows[0].Column2); @@ -1126,7 +1128,7 @@ public void SaveAsBasicStreamTest() using (var stream = new MemoryStream()) using (var fileStream = new FileStream(path.ToString(), FileMode.Create)) { - var rowsWritten = Exporter.ExportXlsx(stream, values); + var rowsWritten = _exporter.ExportXlsx(stream, values); stream.Seek(0, SeekOrigin.Begin); stream.CopyTo(fileStream); Assert.Single(rowsWritten); @@ -1135,7 +1137,7 @@ public void SaveAsBasicStreamTest() using (var stream = File.OpenRead(path.ToString())) { - var rows = Importer.QueryXlsx(stream, useHeaderRow: true).ToList(); + var rows = _importer.QueryXlsx(stream, useHeaderRow: true).ToList(); Assert.Equal("MiniExcel", rows[0].Column1); Assert.Equal(1, rows[0].Column2); @@ -1149,7 +1151,7 @@ public void SaveAsBasicStreamTest() public void SaveAsSpecialAndTypeCreateTest() { using var path = AutoDeletingPath.Create(); - var rowsWritten = Exporter.ExportXlsx(path.ToString(), new[] + var rowsWritten = _exporter.ExportXlsx(path.ToString(), new[] { new { a = @"""<>+-*//}{\\n", b = 1234567890, c = true, d = DateTime.Now }, new { a = "Hello World", b = -1234567890, c = false, d = DateTime.Now.Date } @@ -1166,7 +1168,7 @@ public void SaveAsFileEpplusCanReadTest() { var now = DateTime.Now; using var path = AutoDeletingPath.Create(); - var rowsWritten = Exporter.ExportXlsx(path.ToString(), new[] + var rowsWritten = _exporter.ExportXlsx(path.ToString(), new[] { new { a = @"""<>+-*//}{\\n", b = 1234567890, c = true, d = now}, new { a = "Hello World", b = -1234567890, c = false, d = now.Date } @@ -1193,7 +1195,7 @@ public void SavaAsClosedXmlCanReadTest() { var now = DateTime.Now; using var path = AutoDeletingPath.Create(); - var rowsWritten = Exporter.ExportXlsx(path.ToString(), new[] + var rowsWritten = _exporter.ExportXlsx(path.ToString(), new[] { new { a = @"""<>+-*//}{\\n", b = 1234567890, c = true, d = now }, new { a = "Hello World", b = -1234567890, c = false, d = now.Date } @@ -1223,7 +1225,7 @@ public void ContentTypeUriContentTypeReadCheckTest() { var now = DateTime.Now; using var path = AutoDeletingPath.Create(); - var rowsWritten = Exporter.ExportXlsx(path.ToString(), new[] + var rowsWritten = _exporter.ExportXlsx(path.ToString(), new[] { new { a = @"""<>+-*//}{\\n", b = 1234567890, c = true, d= now }, new { a = "Hello World", b = -1234567890, c = false, d = now.Date } @@ -1247,10 +1249,10 @@ public void ContentTypeUriContentTypeReadCheckTest() public void TestStirctOpenXml() { const string path = "../../../../../samples/xlsx/TestStrictOpenXml.xlsx"; - var columns = Importer.GetXlsxColumns (path); + var columns = _importer.GetXlsxColumns (path); Assert.Equal(["A", "B", "C"], columns); - var rows = Importer.QueryXlsx(path).ToList(); + var rows = _importer.QueryXlsx(path).ToList(); Assert.Equal(rows[0].A, "title1"); Assert.Equal(rows[0].B, "title2"); Assert.Equal(rows[0].C, "title3"); @@ -1265,7 +1267,7 @@ public void SharedStringCacheTest() const string path = "../../../../../benchmarks/MiniExcel.Benchmarks/Test1,000,000x10_SharingStrings.xlsx"; var ts = Stopwatch.GetTimestamp(); - _ = Importer.QueryXlsx(path, configuration: new OpenXmlConfiguration { EnableSharedStringCache = true }).First(); + _ = _importer.QueryXlsx(path, configuration: new OpenXmlConfiguration { EnableSharedStringCache = true }).First(); using var currentProcess = Process.GetCurrentProcess(); var totalBytesOfMemoryUsed = currentProcess.WorkingSet64; @@ -1279,7 +1281,7 @@ public void SharedStringNoCacheTest() const string path = "../../../../../benchmarks/MiniExcel.Benchmarks/Test1,000,000x10_SharingStrings.xlsx"; var ts = Stopwatch.GetTimestamp(); - _ = Importer.QueryXlsx(path).First(); + _ = _importer.QueryXlsx(path).First(); using var currentProcess = Process.GetCurrentProcess(); var totalBytesOfMemoryUsed = currentProcess.WorkingSet64; _output.WriteLine("totalBytesOfMemoryUsed: " + totalBytesOfMemoryUsed); @@ -1327,10 +1329,10 @@ public void DynamicColumnsConfigurationIsUsedWhenCreatingExcelUsingIDataReader() ] }; var reader = table.CreateDataReader(); - Exporter.ExportXlsx(path.ToString(), reader, configuration: configuration); + _exporter.ExportXlsx(path.ToString(), reader, configuration: configuration); using var stream = File.OpenRead(path.ToString()); - var rows = Importer.QueryXlsx(stream, useHeaderRow: true) + var rows = _importer.QueryXlsx(stream, useHeaderRow: true) .Select(x => (IDictionary)x) .ToList(); @@ -1393,10 +1395,10 @@ public void DynamicColumnsConfigurationIsUsedWhenCreatingExcelUsingDataTable() } ] }; - Exporter.ExportXlsx(path.ToString(), table, configuration: configuration); + _exporter.ExportXlsx(path.ToString(), table, configuration: configuration); using var stream = File.OpenRead(path.ToString()); - var rows = Importer.QueryXlsx(stream, useHeaderRow: true) + var rows = _importer.QueryXlsx(stream, useHeaderRow: true) .Select(x => (IDictionary)x) .Select(x => (IDictionary)x) .ToList(); @@ -1437,7 +1439,7 @@ public void InsertSheetTest() table.Rows.Add(@"""<>+-*//}{\\n", 1234567890, true, now); table.Rows.Add("Hello World", -1234567890, false, now.Date); - var rowsWritten = Exporter.InsertXlsxSheet(path, table, sheetName: "Sheet1"); + var rowsWritten = _exporter.InsertXlsxSheet(path, table, sheetName: "Sheet1"); Assert.Equal(2, rowsWritten); using var p = new ExcelPackage(new FileInfo(path)); @@ -1462,7 +1464,7 @@ public void InsertSheetTest() table.Rows.Add("MiniExcel", 1); table.Rows.Add("Github", 2); - var rowsWritten = Exporter.InsertXlsxSheet(path, table, sheetName: "Sheet2"); + var rowsWritten = _exporter.InsertXlsxSheet(path, table, sheetName: "Sheet2"); Assert.Equal(2, rowsWritten); using var p = new ExcelPackage(new FileInfo(path)); @@ -1485,7 +1487,7 @@ public void InsertSheetTest() table.Columns.Add("Column2", typeof(DateTime)); table.Rows.Add("Test", now); - var rowsWritten = Exporter.InsertXlsxSheet(path, table, sheetName: "Sheet2", printHeader: false, configuration: new OpenXmlConfiguration + var rowsWritten = _exporter.InsertXlsxSheet(path, table, sheetName: "Sheet2", printHeader: false, configuration: new OpenXmlConfiguration { FastMode = true, AutoFilter = false, @@ -1518,7 +1520,7 @@ public void InsertSheetTest() table.Rows.Add("MiniExcel", now); table.Rows.Add("Github", now); - var rowsWritten = Exporter.InsertXlsxSheet(path, table, sheetName: "Sheet3", configuration: new OpenXmlConfiguration + var rowsWritten = _exporter.InsertXlsxSheet(path, table, sheetName: "Sheet3", configuration: new OpenXmlConfiguration { FastMode = true, AutoFilter = false, @@ -1561,7 +1563,7 @@ private class DateOnlyTest [Fact] public void DateOnlySupportTest() { - var query = Importer.QueryXlsx(PathHelper.GetFile("xlsx/TestDateOnlyMapping.xlsx")).ToList(); + var query = _importer.QueryXlsx(PathHelper.GetFile("xlsx/TestDateOnlyMapping.xlsx")).ToList(); Assert.Equal(new DateOnly(2020, 9, 27), query[0].Date); Assert.Equal(new DateOnly(2020, 10, 25), query[1].Date); @@ -1576,7 +1578,7 @@ public void DateOnlySupportTest() public void SheetDimensionsTest() { var path1 = PathHelper.GetFile("xlsx/TestTypeMapping.xlsx"); - var dim1 = Importer.GetSheetDimensions(path1); + var dim1 = _importer.GetSheetDimensions(path1); Assert.Equal("A1", dim1[0].StartCell); Assert.Equal("H101", dim1[0].EndCell); Assert.Equal(101, dim1[0].Rows.Count); @@ -1587,7 +1589,7 @@ public void SheetDimensionsTest() Assert.Equal(8, dim1[0].Columns.EndIndex); var path2 = PathHelper.GetFile("xlsx/TestNoDimension.xlsx"); - var dim2 = Importer.GetSheetDimensions(path2); + var dim2 = _importer.GetSheetDimensions(path2); Assert.Equal(101, dim2[0].Rows.Count); Assert.Equal(7, dim2[0].Columns.Count); Assert.Equal(1, dim2[0].Rows.StartIndex); @@ -1600,7 +1602,7 @@ public void SheetDimensionsTest() public void SheetDimensionsTest_MultiSheet() { var path = PathHelper.GetFile("xlsx/TestMultiSheet.xlsx"); - var dim = Importer.GetSheetDimensions(path); + var dim = _importer.GetSheetDimensions(path); Assert.Equal("A1", dim[0].StartCell); Assert.Equal("D12", dim[0].EndCell); diff --git a/tests/MiniExcelTests/MiniExcelTests.csproj b/tests/MiniExcelTests/MiniExcelTests.csproj index 160fcbcd..0784e01e 100644 --- a/tests/MiniExcelTests/MiniExcelTests.csproj +++ b/tests/MiniExcelTests/MiniExcelTests.csproj @@ -32,8 +32,8 @@ - - + + diff --git a/tests/MiniExcelTests/SaveByTemplate/MiniExcelTemplateAsyncTests.cs b/tests/MiniExcelTests/SaveByTemplate/MiniExcelTemplateAsyncTests.cs index 2731ec1e..36b1ac18 100644 --- a/tests/MiniExcelTests/SaveByTemplate/MiniExcelTemplateAsyncTests.cs +++ b/tests/MiniExcelTests/SaveByTemplate/MiniExcelTemplateAsyncTests.cs @@ -1,14 +1,16 @@ using System.Data; using Dapper; +using MiniExcelLib.Core; using MiniExcelLib.Tests.Utils; -using Importer = MiniExcelLib.MiniExcel.Importer; -using Templater = MiniExcelLib.MiniExcel.Templater; using Xunit; namespace MiniExcelLib.Tests.SaveByTemplate; public class MiniExcelTemplateAsyncTests { + private readonly MiniExcelTemplater _templater = MiniExcel.GetTemplater(); + private readonly MiniExcelImporter _importer = MiniExcel.GetImporter(); + [Fact] public async Task DatatableTemptyRowTest() { @@ -31,8 +33,8 @@ public async Task DatatableTemptyRowTest() ["managers"] = managers, ["employees"] = employees }; - await Templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); - var rows = Importer.QueryXlsxAsync(path.ToString()).ToBlockingEnumerable().ToList(); + await _templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); + var rows = _importer.QueryXlsxAsync(path.ToString()).ToBlockingEnumerable().ToList(); var dimension = Helpers.GetFirstSheetDimensionRefValue(path.ToString()); Assert.Equal("A1:C5", dimension); @@ -56,8 +58,8 @@ public async Task DatatableTemptyRowTest() ["employees"] = employees }; - await Templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); - var rows = Importer.QueryXlsxAsync(path.ToString()).ToBlockingEnumerable().ToList(); + await _templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); + var rows = _importer.QueryXlsxAsync(path.ToString()).ToBlockingEnumerable().ToList(); var dimension = Helpers.GetFirstSheetDimensionRefValue(path.ToString()); Assert.Equal("A1:C5", dimension); @@ -90,8 +92,8 @@ public async Task DatatableTest() ["managers"] = managers, ["employees"] = employees }; - await Templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); - var rows = Importer.QueryXlsxAsync(path.ToString()).ToBlockingEnumerable().ToList(); + await _templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); + var rows = _importer.QueryXlsxAsync(path.ToString()).ToBlockingEnumerable().ToList(); var dimension = Helpers.GetFirstSheetDimensionRefValue(path.ToString()); Assert.Equal("A1:C9", dimension); @@ -114,7 +116,7 @@ public async Task DatatableTest() Assert.Equal("IT", rows[8].C); { - rows = Importer.QueryXlsxAsync(path.ToString(), sheetName: "Sheet2").ToBlockingEnumerable().ToList(); + rows = _importer.QueryXlsxAsync(path.ToString(), sheetName: "Sheet2").ToBlockingEnumerable().ToList(); Assert.Equal(9, rows.Count); Assert.Equal("FooCompany", rows[0].A); @@ -151,10 +153,10 @@ public async Task DapperTemplateTest() ["managers"] = connection.Query("select 'Jack' name,'HR' department union all select 'Loan','IT'"), ["employees"] = connection.Query(@"select 'Wade' name,'HR' department union all select 'Felix','HR' union all select 'Eric','IT' union all select 'Keaton','IT'") }; - await Templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); + await _templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); { - var rows = Importer.QueryXlsxAsync(path.ToString()).ToBlockingEnumerable().ToList(); + var rows = _importer.QueryXlsxAsync(path.ToString()).ToBlockingEnumerable().ToList(); Assert.Equal(9, rows.Count); @@ -179,7 +181,7 @@ public async Task DapperTemplateTest() } { - var rows = Importer.QueryXlsxAsync(path.ToString(), sheetName: "Sheet2").ToBlockingEnumerable().ToList(); + var rows = _importer.QueryXlsxAsync(path.ToString(), sheetName: "Sheet2").ToBlockingEnumerable().ToList(); Assert.Equal(9, rows.Count); Assert.Equal("FooCompany", rows[0].A); @@ -225,10 +227,10 @@ public async Task DictionaryTemplateTest() new Dictionary{["name"]="Keaton",["department"]="IT"} } }; - await Templater.ApplyXlsxTemplateAsync(path, templatePath, value); + await _templater.ApplyXlsxTemplateAsync(path, templatePath, value); { - var rows = Importer.QueryXlsx(path).ToList(); + var rows = _importer.QueryXlsx(path).ToList(); Assert.Equal(9, rows.Count); @@ -253,7 +255,7 @@ public async Task DictionaryTemplateTest() } { - var rows = Importer.QueryXlsx(path, sheetName: "Sheet2").ToList(); + var rows = _importer.QueryXlsx(path, sheetName: "Sheet2").ToList(); Assert.Equal(9, rows.Count); @@ -296,9 +298,9 @@ public async Task TestGithubProject() Projects = projects, TotalStar = projects.Sum(s => s.Star) }; - await Templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); + await _templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); - var rows = Importer.QueryXlsxAsync(path.ToString()).ToBlockingEnumerable().ToList(); + var rows = _importer.QueryXlsxAsync(path.ToString()).ToBlockingEnumerable().ToList(); Assert.Equal("ITWeiHan Github Projects", rows[0].B); Assert.Equal("Total Star : 178", rows[8].C); @@ -344,9 +346,9 @@ public async Task TestIEnumerableType() poco } }; - await Templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); + await _templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); - var rows = Importer.QueryXlsx(path.ToString()).ToList(); + var rows = _importer.QueryXlsx(path.ToString()).ToList(); Assert.Equal(poco.@string, rows[0].@string); Assert.Equal(poco.@int, rows[0].@int); Assert.Equal(poco.@double, rows[0].@double); @@ -409,9 +411,9 @@ public async Task TestTemplateTypeMapping() @bool = true, Guid = Guid.NewGuid() }; - await Templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); + await _templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); - var rows = Importer.QueryXlsx(path.ToString()).ToList(); + var rows = _importer.QueryXlsx(path.ToString()).ToList(); Assert.Equal(value.@string, rows[0].@string); Assert.Equal(value.@int, rows[0].@int); Assert.Equal(value.@double, rows[0].@double); @@ -433,7 +435,7 @@ public async Task TemplateCenterEmptyTest() { Tests = Enumerable.Range(1, 5).Select(i => new { test1 = i, test2 = i }) }; - await Templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); + await _templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); } [Fact] @@ -451,9 +453,9 @@ public async Task TemplateAsyncBasiTest() VIP = true, Points = 123 }; - await Templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); + await _templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); - var rows = Importer.QueryXlsxAsync(path.ToString()).ToBlockingEnumerable().ToList(); + var rows = _importer.QueryXlsxAsync(path.ToString()).ToBlockingEnumerable().ToList(); Assert.Equal("Jack", rows[1].A); Assert.Equal("2021-01-01 00:00:00", rows[1].B); Assert.Equal(true, rows[1].C); @@ -475,9 +477,9 @@ public async Task TemplateAsyncBasiTest() VIP = true, Points = 123 }; - await Templater.ApplyXlsxTemplateAsync(path, templateBytes, value); + await _templater.ApplyXlsxTemplateAsync(path, templateBytes, value); - var rows = (Importer.QueryXlsxAsync(path).ToBlockingEnumerable()).ToList(); + var rows = (_importer.QueryXlsxAsync(path).ToBlockingEnumerable()).ToList(); Assert.Equal("Jack", rows[1].A); Assert.Equal("2021-01-01 00:00:00", rows[1].B); Assert.Equal(true, rows[1].C); @@ -502,10 +504,10 @@ public async Task TemplateAsyncBasiTest() }; await using (var stream = File.Create(path.ToString())) { - await Templater.ApplyXlsxTemplateAsync(stream, templateBytes, value); + await _templater.ApplyXlsxTemplateAsync(stream, templateBytes, value); } - var rows = Importer.QueryXlsxAsync(path.ToString()).ToBlockingEnumerable().ToList(); + var rows = _importer.QueryXlsxAsync(path.ToString()).ToBlockingEnumerable().ToList(); Assert.Equal("Jack", rows[1].A); Assert.Equal("2021-01-01 00:00:00", rows[1].B); Assert.Equal(true, rows[1].C); @@ -527,9 +529,9 @@ public async Task TemplateAsyncBasiTest() ["VIP"] = true, ["Points"] = 123 }; - await Templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); + await _templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); - var rows = Importer.QueryXlsxAsync(path.ToString()).ToBlockingEnumerable().ToList(); + var rows = _importer.QueryXlsxAsync(path.ToString()).ToBlockingEnumerable().ToList(); Assert.Equal("Jack", rows[1].A); Assert.Equal("2021-01-01 00:00:00", rows[1].B); Assert.Equal(true, rows[1].C); @@ -561,7 +563,7 @@ public async Task TestIEnumerable() new { name = "Loan", department = "IT "} } }; - await Templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); + await _templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); var dimension = Helpers.GetFirstSheetDimensionRefValue(path.ToString()); Assert.Equal("A1:B7", dimension); @@ -583,7 +585,7 @@ public async Task TestIEnumerable() new { name = "Loan", department = "IT "} } }; - await Templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); + await _templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); var dimension = Helpers.GetFirstSheetDimensionRefValue(path.ToString()); Assert.Equal("A1:B7", dimension); @@ -608,7 +610,7 @@ public async Task TestIEnumerable() { ["employees"] = dt }; - await Templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); + await _templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); var dimension = Helpers.GetFirstSheetDimensionRefValue(path.ToString()); Assert.Equal("A1:B7", dimension); @@ -635,7 +637,7 @@ public async Task TestIEnumerableGrouped() new { name = "Loan", department = "IT" } } }; - await Templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); + await _templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); var dimension = Helpers.GetFirstSheetDimensionRefValue(path.ToString()); Assert.Equal("A1:B18", dimension); @@ -657,7 +659,7 @@ public async Task TestIEnumerableGrouped() new { name = "Loan", department = "IT "} } }; - await Templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); + await _templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); var dimension = Helpers.GetFirstSheetDimensionRefValue(path.ToString()); Assert.Equal("A1:B18", dimension); @@ -682,7 +684,7 @@ public async Task TestIEnumerableGrouped() { ["employees"] = dt }; - await Templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); + await _templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); var dimension = Helpers.GetFirstSheetDimensionRefValue(path.ToString()); Assert.Equal("A1:B18", dimension); @@ -709,7 +711,7 @@ public async Task TestIEnumerableConditional() new { name = "Loan", department = "IT "} } }; - await Templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); + await _templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); var dimension = Helpers.GetFirstSheetDimensionRefValue(path.ToString()); Assert.Equal("A1:B18", dimension); @@ -731,7 +733,7 @@ public async Task TestIEnumerableConditional() new { name = "Loan", department = "IT" } } }; - await Templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); + await _templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); var dimension = Helpers.GetFirstSheetDimensionRefValue(path.ToString()); Assert.Equal("A1:B18", dimension); @@ -756,7 +758,7 @@ public async Task TestIEnumerableConditional() { ["employees"] = dt }; - await Templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); + await _templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); var dimension = Helpers.GetFirstSheetDimensionRefValue(path.ToString()); Assert.Equal("A1:B18", dimension); @@ -787,10 +789,10 @@ public async Task TemplateTest() new { name = "Keaton", department = "IT" } } }; - await Templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); + await _templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); { - var rows = Importer.QueryXlsxAsync(path.ToString()).ToBlockingEnumerable().ToList(); + var rows = _importer.QueryXlsxAsync(path.ToString()).ToBlockingEnumerable().ToList(); Assert.Equal(9, rows.Count); Assert.Equal("FooCompany", rows[0].A); @@ -814,7 +816,7 @@ public async Task TemplateTest() } { - var rows = Importer.QueryXlsxAsync(path.ToString(), sheetName: "Sheet2").ToBlockingEnumerable().ToList(); + var rows = _importer.QueryXlsxAsync(path.ToString(), sheetName: "Sheet2").ToBlockingEnumerable().ToList(); Assert.Equal(9, rows.Count); Assert.Equal("FooCompany", rows[0].A); @@ -858,9 +860,9 @@ public async Task TemplateTest() new { name = "Keaton", department = "IT" } } }; - await Templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); + await _templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); - var rows = Importer.QueryXlsxAsync(path.ToString()).ToBlockingEnumerable().ToList(); + var rows = _importer.QueryXlsxAsync(path.ToString()).ToBlockingEnumerable().ToList(); Assert.Equal("FooCompany", rows[0].A); Assert.Equal("Jack", rows[2].B); Assert.Equal("HR", rows[2].C); @@ -900,7 +902,7 @@ await Assert.ThrowsAsync(async () => }; await cts.CancelAsync(); - await Templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value, cancellationToken: cts.Token); + await _templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value, cancellationToken: cts.Token); }); } } \ No newline at end of file diff --git a/tests/MiniExcelTests/SaveByTemplate/MiniExcelTemplateTests.cs b/tests/MiniExcelTests/SaveByTemplate/MiniExcelTemplateTests.cs index a16abc52..d242cd35 100644 --- a/tests/MiniExcelTests/SaveByTemplate/MiniExcelTemplateTests.cs +++ b/tests/MiniExcelTests/SaveByTemplate/MiniExcelTemplateTests.cs @@ -1,19 +1,21 @@ using System.Data; using System.IO.Compression; using Dapper; +using MiniExcelLib.Core; using MiniExcelLib.Core.Enums; using MiniExcelLib.Core.OpenXml.Picture; using MiniExcelLib.Tests.Utils; using OfficeOpenXml; using OfficeOpenXml.Drawing; -using Importer = MiniExcelLib.MiniExcel.Importer; -using Templater = MiniExcelLib.MiniExcel.Templater; using Xunit; namespace MiniExcelLib.Tests.SaveByTemplate; public class MiniExcelTemplateTests { + private readonly MiniExcelTemplater _templater = MiniExcel.GetTemplater(); + private readonly MiniExcelImporter _importer = MiniExcel.GetImporter(); + [Fact] public void TestImageType() { @@ -61,7 +63,7 @@ public void TestImageType() }; // Act - MiniExcel.Exporter.AddPictureXlsx(path.ToString(), pictures); + MiniExcel.GetExporter().AddPictureXlsx(path.ToString(), pictures); // Assert using var zip = ZipFile.OpenRead(path.FilePath); @@ -118,9 +120,9 @@ public void DatatableTemptyRowTest() ["managers"] = managers, ["employees"] = employees }; - Templater.ApplyXlsxTemplate(path.ToString(), templatePath, value); + _templater.ApplyXlsxTemplate(path.ToString(), templatePath, value); - var rows = Importer.QueryXlsx(path.ToString()).ToList(); + var rows = _importer.QueryXlsx(path.ToString()).ToList(); var dimension = Helpers.GetFirstSheetDimensionRefValue(path.ToString()); Assert.Equal("A1:C5", dimension); } @@ -143,9 +145,9 @@ public void DatatableTemptyRowTest() ["managers"] = managers, ["employees"] = employees }; - Templater.ApplyXlsxTemplate(path.ToString(), templatePath, value); + _templater.ApplyXlsxTemplate(path.ToString(), templatePath, value); - var rows = Importer.QueryXlsx(path.ToString()).ToList(); + var rows = _importer.QueryXlsx(path.ToString()).ToList(); var dimension = Helpers.GetFirstSheetDimensionRefValue(path.ToString()); Assert.Equal("A1:C5", dimension); } @@ -178,10 +180,10 @@ public void DatatableTest() ["managers"] = managers, ["employees"] = employees }; - Templater.ApplyXlsxTemplate(path, templatePath, value); + _templater.ApplyXlsxTemplate(path, templatePath, value); { - var rows = Importer.QueryXlsx(path).ToList(); + var rows = _importer.QueryXlsx(path).ToList(); var dimension = Helpers.GetFirstSheetDimensionRefValue(path); Assert.Equal("A1:C9", dimension); @@ -206,7 +208,7 @@ public void DatatableTest() } { - var rows = Importer.QueryXlsx(path, sheetName: "Sheet2").ToList(); + var rows = _importer.QueryXlsx(path, sheetName: "Sheet2").ToList(); Assert.Equal(9, rows.Count); Assert.Equal("FooCompany", rows[0].A); @@ -245,10 +247,10 @@ public void DapperTemplateTest() ["managers"] = connection.Query("select 'Jack' name,'HR' department union all select 'Loan','IT'"), ["employees"] = connection.Query("select 'Wade' name,'HR' department union all select 'Felix','HR' union all select 'Eric','IT' union all select 'Keaton','IT'") }; - Templater.ApplyXlsxTemplate(path, templatePath, value); + _templater.ApplyXlsxTemplate(path, templatePath, value); { - var rows = Importer.QueryXlsx(path).ToList(); + var rows = _importer.QueryXlsx(path).ToList(); Assert.Equal(9, rows.Count); Assert.Equal("FooCompany", rows[0].A); @@ -272,7 +274,7 @@ public void DapperTemplateTest() } { - var rows = Importer.QueryXlsx(path, sheetName: "Sheet2").ToList(); + var rows = _importer.QueryXlsx(path, sheetName: "Sheet2").ToList(); Assert.Equal(9, rows.Count); Assert.Equal("FooCompany", rows[0].A); @@ -320,10 +322,10 @@ public void DictionaryTemplateTest() new Dictionary { ["name"] = "Keaton", ["department"] = "IT" } } }; - Templater.ApplyXlsxTemplate(path, templatePath, value); + _templater.ApplyXlsxTemplate(path, templatePath, value); { - var rows = Importer.QueryXlsx(path).ToList(); + var rows = _importer.QueryXlsx(path).ToList(); Assert.Equal(9, rows.Count); Assert.Equal("FooCompany", rows[0].A); @@ -347,7 +349,7 @@ public void DictionaryTemplateTest() } { - var rows = Importer.QueryXlsx(path, sheetName: "Sheet2").ToList(); + var rows = _importer.QueryXlsx(path, sheetName: "Sheet2").ToList(); Assert.Equal(9, rows.Count); Assert.Equal("FooCompany", rows[0].A); @@ -397,9 +399,9 @@ public void GroupTemplateTest() new() { name = "Felix", department = "HR" } } }; - Templater.ApplyXlsxTemplate(path, templatePath, value); + _templater.ApplyXlsxTemplate(path, templatePath, value); - var rows = Importer.QueryXlsx(path).ToList(); + var rows = _importer.QueryXlsx(path).ToList(); Assert.Equal(16, rows.Count); Assert.Equal("Jack", rows[1].A); @@ -466,9 +468,9 @@ public void TestGithubProject() Projects = projects, TotalStar = projects.Sum(s => s.Star) }; - Templater.ApplyXlsxTemplate(path.ToString(), templatePath, value); + _templater.ApplyXlsxTemplate(path.ToString(), templatePath, value); - var rows = Importer.QueryXlsx(path.ToString()).ToList(); + var rows = _importer.QueryXlsx(path.ToString()).ToList(); Assert.Equal("ITWeiHan Github Projects", rows[0].B); Assert.Equal("Total Star : 178", rows[8].C); @@ -517,9 +519,9 @@ public void TestIEnumerableType() poco } }; - Templater.ApplyXlsxTemplate(path.ToString(), templatePath, value); + _templater.ApplyXlsxTemplate(path.ToString(), templatePath, value); - var rows = Importer.QueryXlsx(path.ToString()).ToList(); + var rows = _importer.QueryXlsx(path.ToString()).ToList(); Assert.Equal(poco.@string, rows[0].@string); Assert.Equal(poco.@int, rows[0].@int); Assert.Equal(poco.@double, rows[0].@double); @@ -585,9 +587,9 @@ public void TestTemplateTypeMapping() @bool = true, Guid = Guid.NewGuid() }; - Templater.ApplyXlsxTemplate(path.ToString(), templatePath, value); + _templater.ApplyXlsxTemplate(path.ToString(), templatePath, value); - var rows = Importer.QueryXlsx(path.ToString()).ToList(); + var rows = _importer.QueryXlsx(path.ToString()).ToList(); Assert.Equal(value.@string, rows[0].@string); Assert.Equal(value.@int, rows[0].@int); Assert.Equal(value.@double, rows[0].@double); @@ -610,7 +612,7 @@ public void TemplateCenterEmptyTest() { Tests = Enumerable.Range(1, 5).Select(i => new { test1 = i, test2 = i }) }; - Templater.ApplyXlsxTemplate(path.ToString(), templatePath, value); + _templater.ApplyXlsxTemplate(path.ToString(), templatePath, value); } [Fact] @@ -628,9 +630,9 @@ public void TemplateBasicTest() VIP = true, Points = 123 }; - Templater.ApplyXlsxTemplate(path.ToString(), templatePath, value); + _templater.ApplyXlsxTemplate(path.ToString(), templatePath, value); - var rows = Importer.QueryXlsx(path.ToString()).ToList(); + var rows = _importer.QueryXlsx(path.ToString()).ToList(); Assert.Equal("Jack", rows[1].A); Assert.Equal("2021-01-01 00:00:00", rows[1].B); Assert.Equal(true, rows[1].C); @@ -652,9 +654,9 @@ public void TemplateBasicTest() VIP = true, Points = 123 }; - Templater.ApplyXlsxTemplate(path.ToString(), templateBytes, value); + _templater.ApplyXlsxTemplate(path.ToString(), templateBytes, value); - var rows = Importer.QueryXlsx(path.ToString()).ToList(); + var rows = _importer.QueryXlsx(path.ToString()).ToList(); Assert.Equal("Jack", rows[1].A); Assert.Equal("2021-01-01 00:00:00", rows[1].B); Assert.Equal(true, rows[1].C); @@ -679,10 +681,10 @@ public void TemplateBasicTest() }; using (var stream = File.Create(path.ToString())) { - Templater.ApplyXlsxTemplate(stream, templateBytes, value); + _templater.ApplyXlsxTemplate(stream, templateBytes, value); } - var rows = Importer.QueryXlsx(path.ToString()).ToList(); + var rows = _importer.QueryXlsx(path.ToString()).ToList(); Assert.Equal("Jack", rows[1].A); Assert.Equal("2021-01-01 00:00:00", rows[1].B); Assert.Equal(true, rows[1].C); @@ -704,9 +706,9 @@ public void TemplateBasicTest() ["VIP"] = true, ["Points"] = 123 }; - Templater.ApplyXlsxTemplate(path.ToString(), templatePath, value); + _templater.ApplyXlsxTemplate(path.ToString(), templatePath, value); - var rows = Importer.QueryXlsx(path.ToString()).ToList(); + var rows = _importer.QueryXlsx(path.ToString()).ToList(); Assert.Equal("Jack", rows[1].A); Assert.Equal("2021-01-01 00:00:00", rows[1].B); Assert.Equal(true, rows[1].C); @@ -738,7 +740,7 @@ public void TestIEnumerable() new { name = "Loan", department = "IT" } } }; - Templater.ApplyXlsxTemplate(path.ToString(), templatePath, value); + _templater.ApplyXlsxTemplate(path.ToString(), templatePath, value); var dimension = Helpers.GetFirstSheetDimensionRefValue(path.ToString()); Assert.Equal("A1:B7", dimension); @@ -760,7 +762,7 @@ public void TestIEnumerable() new { name = "Loan", department = "IT" } } }; - Templater.ApplyXlsxTemplate(path.ToString(), templatePath, value); + _templater.ApplyXlsxTemplate(path.ToString(), templatePath, value); var dimension = Helpers.GetFirstSheetDimensionRefValue(path.ToString()); Assert.Equal("A1:B7", dimension); @@ -785,7 +787,7 @@ public void TestIEnumerable() { ["employees"] = dt }; - Templater.ApplyXlsxTemplate(path.ToString(), templatePath, value); + _templater.ApplyXlsxTemplate(path.ToString(), templatePath, value); var dimension = Helpers.GetFirstSheetDimensionRefValue(path.ToString()); Assert.Equal("A1:B7", dimension); @@ -810,7 +812,7 @@ public void TestIEnumerableWithFormulas() new { name = "Joan", department = "IT", salary = 120000 } } }; - Templater.ApplyXlsxTemplate(path.ToString(), templatePath, value); + _templater.ApplyXlsxTemplate(path.ToString(), templatePath, value); var dimension = Helpers.GetFirstSheetDimensionRefValue(path.ToString()); Assert.Equal("A1:C13", dimension); @@ -840,10 +842,10 @@ public void TemplateTest() new { name = "Keaton", department = "IT" } } }; - Templater.ApplyXlsxTemplate(path.ToString(), templatePath, value); + _templater.ApplyXlsxTemplate(path.ToString(), templatePath, value); { - var rows = Importer.QueryXlsx(path.ToString()).ToList(); + var rows = _importer.QueryXlsx(path.ToString()).ToList(); Assert.Equal(9, rows.Count); @@ -868,7 +870,7 @@ public void TemplateTest() } { - var rows = Importer.QueryXlsx(path.ToString(), sheetName: "Sheet2").ToList(); + var rows = _importer.QueryXlsx(path.ToString(), sheetName: "Sheet2").ToList(); Assert.Equal(9, rows.Count); @@ -914,9 +916,9 @@ public void TemplateTest() new { name = "Keaton", department = "IT" } } }; - Templater.ApplyXlsxTemplate(path.ToString(), templatePath, value); + _templater.ApplyXlsxTemplate(path.ToString(), templatePath, value); - var rows = Importer.QueryXlsx(path.ToString()).ToList(); + var rows = _importer.QueryXlsx(path.ToString()).ToList(); Assert.Equal("FooCompany", rows[0].A); Assert.Equal("Jack", rows[2].B); Assert.Equal("HR", rows[2].C); @@ -944,7 +946,7 @@ public void MergeSameCellsWithTagTest() const string path = "../../../../../samples/xlsx/TestMergeWithTag.xlsx"; using var mergedFilePath = AutoDeletingPath.Create(); - Templater.MergeSameCells(mergedFilePath.ToString(), path); + _templater.MergeSameCells(mergedFilePath.ToString(), path); var mergedCells = Helpers.GetFirstSheetMergedCells(mergedFilePath.ToString()); Assert.Equal("A2:A4", mergedCells[0]); @@ -958,7 +960,7 @@ public void MergeSameCellsWithLimitTagTest() const string path = "../../../../../samples/xlsx/TestMergeWithLimitTag.xlsx"; using var mergedFilePath = AutoDeletingPath.Create(); - Templater.MergeSameCells(mergedFilePath.ToString(), path); + _templater.MergeSameCells(mergedFilePath.ToString(), path); var mergedCells = Helpers.GetFirstSheetMergedCells(mergedFilePath.ToString()); Assert.Equal("A3:A4", mergedCells[0]); From f897c8bd00cb52081ef0559f3ff64fab0cf7b70d Mon Sep 17 00:00:00 2001 From: Michele Bastione Date: Fri, 4 Jul 2025 00:06:54 +0200 Subject: [PATCH 04/26] Reverting to standard .sln solution file to fix CodeQL analysis --- MiniExcel.sln | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++ MiniExcel.slnx | 32 --------------------- 2 files changed, 76 insertions(+), 32 deletions(-) create mode 100644 MiniExcel.sln delete mode 100644 MiniExcel.slnx diff --git a/MiniExcel.sln b/MiniExcel.sln new file mode 100644 index 00000000..95a86b65 --- /dev/null +++ b/MiniExcel.sln @@ -0,0 +1,76 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "benchmarks", "benchmarks", "{66320409-64EC-F7C5-3DEF-65E7510DAAD1}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MiniExcel.Benchmarks", "benchmarks\MiniExcel.Benchmarks\MiniExcel.Benchmarks.csproj", "{F7B34F04-2620-68A5-479B-776384AC0AB5}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Docs and setting", "Docs and setting", "{68829B7C-8144-536A-8B70-711E561F6F12}" + 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 + docs\core_logic_diagram.drawio = docs\core_logic_diagram.drawio + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Releases", "Releases", "{37FA14B0-CB55-46E6-AF3E-B5B7A3B4D2F3}" + 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("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{827E0CD3-B72D-47B6-A68D-7590B98EB39B}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MiniExcel.Core", "src\MiniExcel.Core\MiniExcel.Core.csproj", "{FECA5F96-177A-1184-BE19-E9E71312076F}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MiniExcel.Csv", "src\MiniExcel.Csv\MiniExcel.Csv.csproj", "{844F09C2-32E1-6F1C-3BC5-4883AD040F3D}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MiniExcel", "src\MiniExcel\MiniExcel.csproj", "{5C9C51C8-6278-8867-633F-F03FAEE2899F}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{0AB3BF05-4346-4AA6-1389-037BE0695223}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MiniExcelTests", "tests\MiniExcelTests\MiniExcelTests.csproj", "{76E89A2E-D1DF-05EC-C206-F009DE0FA0A7}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {F7B34F04-2620-68A5-479B-776384AC0AB5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F7B34F04-2620-68A5-479B-776384AC0AB5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F7B34F04-2620-68A5-479B-776384AC0AB5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F7B34F04-2620-68A5-479B-776384AC0AB5}.Release|Any CPU.Build.0 = Release|Any CPU + {FECA5F96-177A-1184-BE19-E9E71312076F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FECA5F96-177A-1184-BE19-E9E71312076F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FECA5F96-177A-1184-BE19-E9E71312076F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FECA5F96-177A-1184-BE19-E9E71312076F}.Release|Any CPU.Build.0 = Release|Any CPU + {844F09C2-32E1-6F1C-3BC5-4883AD040F3D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {844F09C2-32E1-6F1C-3BC5-4883AD040F3D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {844F09C2-32E1-6F1C-3BC5-4883AD040F3D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {844F09C2-32E1-6F1C-3BC5-4883AD040F3D}.Release|Any CPU.Build.0 = Release|Any CPU + {5C9C51C8-6278-8867-633F-F03FAEE2899F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5C9C51C8-6278-8867-633F-F03FAEE2899F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5C9C51C8-6278-8867-633F-F03FAEE2899F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5C9C51C8-6278-8867-633F-F03FAEE2899F}.Release|Any CPU.Build.0 = Release|Any CPU + {76E89A2E-D1DF-05EC-C206-F009DE0FA0A7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {76E89A2E-D1DF-05EC-C206-F009DE0FA0A7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {76E89A2E-D1DF-05EC-C206-F009DE0FA0A7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {76E89A2E-D1DF-05EC-C206-F009DE0FA0A7}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {F7B34F04-2620-68A5-479B-776384AC0AB5} = {66320409-64EC-F7C5-3DEF-65E7510DAAD1} + {FECA5F96-177A-1184-BE19-E9E71312076F} = {827E0CD3-B72D-47B6-A68D-7590B98EB39B} + {844F09C2-32E1-6F1C-3BC5-4883AD040F3D} = {827E0CD3-B72D-47B6-A68D-7590B98EB39B} + {5C9C51C8-6278-8867-633F-F03FAEE2899F} = {827E0CD3-B72D-47B6-A68D-7590B98EB39B} + {76E89A2E-D1DF-05EC-C206-F009DE0FA0A7} = {0AB3BF05-4346-4AA6-1389-037BE0695223} + EndGlobalSection +EndGlobal diff --git a/MiniExcel.slnx b/MiniExcel.slnx deleted file mode 100644 index 9a3685e4..00000000 --- a/MiniExcel.slnx +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file From e145087bd11830719f8d2298573f1c5208cad1e5 Mon Sep 17 00:00:00 2001 From: Michele Bastione Date: Sun, 6 Jul 2025 11:10:33 +0200 Subject: [PATCH 05/26] Codeql workflow fixes for new slnx solution format --- .github/workflows/codeql-analysis.yml | 10 ++-- .github/workflows/dotnet.yml | 3 +- MiniExcel.sln | 76 --------------------------- MiniExcel.slnx | 32 +++++++++++ 4 files changed, 38 insertions(+), 83 deletions(-) delete mode 100644 MiniExcel.sln create mode 100644 MiniExcel.slnx diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index a15f3d2a..25a1b9e9 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -59,8 +59,9 @@ 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 @@ -69,9 +70,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 - name: Perform CodeQL Analysis uses: github/codeql-action/analyze@v3 diff --git a/.github/workflows/dotnet.yml b/.github/workflows/dotnet.yml index a3b4eca6..bef3eae4 100644 --- a/.github/workflows/dotnet.yml +++ b/.github/workflows/dotnet.yml @@ -3,8 +3,7 @@ name: .NET on: pull_request: push: - branches: - - master + branches: [master, v1.x-maintenance] jobs: build: diff --git a/MiniExcel.sln b/MiniExcel.sln deleted file mode 100644 index 95a86b65..00000000 --- a/MiniExcel.sln +++ /dev/null @@ -1,76 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "benchmarks", "benchmarks", "{66320409-64EC-F7C5-3DEF-65E7510DAAD1}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MiniExcel.Benchmarks", "benchmarks\MiniExcel.Benchmarks\MiniExcel.Benchmarks.csproj", "{F7B34F04-2620-68A5-479B-776384AC0AB5}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Docs and setting", "Docs and setting", "{68829B7C-8144-536A-8B70-711E561F6F12}" - 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 - docs\core_logic_diagram.drawio = docs\core_logic_diagram.drawio - EndProjectSection -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Releases", "Releases", "{37FA14B0-CB55-46E6-AF3E-B5B7A3B4D2F3}" - 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("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{827E0CD3-B72D-47B6-A68D-7590B98EB39B}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MiniExcel.Core", "src\MiniExcel.Core\MiniExcel.Core.csproj", "{FECA5F96-177A-1184-BE19-E9E71312076F}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MiniExcel.Csv", "src\MiniExcel.Csv\MiniExcel.Csv.csproj", "{844F09C2-32E1-6F1C-3BC5-4883AD040F3D}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MiniExcel", "src\MiniExcel\MiniExcel.csproj", "{5C9C51C8-6278-8867-633F-F03FAEE2899F}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{0AB3BF05-4346-4AA6-1389-037BE0695223}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MiniExcelTests", "tests\MiniExcelTests\MiniExcelTests.csproj", "{76E89A2E-D1DF-05EC-C206-F009DE0FA0A7}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {F7B34F04-2620-68A5-479B-776384AC0AB5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F7B34F04-2620-68A5-479B-776384AC0AB5}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F7B34F04-2620-68A5-479B-776384AC0AB5}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F7B34F04-2620-68A5-479B-776384AC0AB5}.Release|Any CPU.Build.0 = Release|Any CPU - {FECA5F96-177A-1184-BE19-E9E71312076F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {FECA5F96-177A-1184-BE19-E9E71312076F}.Debug|Any CPU.Build.0 = Debug|Any CPU - {FECA5F96-177A-1184-BE19-E9E71312076F}.Release|Any CPU.ActiveCfg = Release|Any CPU - {FECA5F96-177A-1184-BE19-E9E71312076F}.Release|Any CPU.Build.0 = Release|Any CPU - {844F09C2-32E1-6F1C-3BC5-4883AD040F3D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {844F09C2-32E1-6F1C-3BC5-4883AD040F3D}.Debug|Any CPU.Build.0 = Debug|Any CPU - {844F09C2-32E1-6F1C-3BC5-4883AD040F3D}.Release|Any CPU.ActiveCfg = Release|Any CPU - {844F09C2-32E1-6F1C-3BC5-4883AD040F3D}.Release|Any CPU.Build.0 = Release|Any CPU - {5C9C51C8-6278-8867-633F-F03FAEE2899F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {5C9C51C8-6278-8867-633F-F03FAEE2899F}.Debug|Any CPU.Build.0 = Debug|Any CPU - {5C9C51C8-6278-8867-633F-F03FAEE2899F}.Release|Any CPU.ActiveCfg = Release|Any CPU - {5C9C51C8-6278-8867-633F-F03FAEE2899F}.Release|Any CPU.Build.0 = Release|Any CPU - {76E89A2E-D1DF-05EC-C206-F009DE0FA0A7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {76E89A2E-D1DF-05EC-C206-F009DE0FA0A7}.Debug|Any CPU.Build.0 = Debug|Any CPU - {76E89A2E-D1DF-05EC-C206-F009DE0FA0A7}.Release|Any CPU.ActiveCfg = Release|Any CPU - {76E89A2E-D1DF-05EC-C206-F009DE0FA0A7}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(NestedProjects) = preSolution - {F7B34F04-2620-68A5-479B-776384AC0AB5} = {66320409-64EC-F7C5-3DEF-65E7510DAAD1} - {FECA5F96-177A-1184-BE19-E9E71312076F} = {827E0CD3-B72D-47B6-A68D-7590B98EB39B} - {844F09C2-32E1-6F1C-3BC5-4883AD040F3D} = {827E0CD3-B72D-47B6-A68D-7590B98EB39B} - {5C9C51C8-6278-8867-633F-F03FAEE2899F} = {827E0CD3-B72D-47B6-A68D-7590B98EB39B} - {76E89A2E-D1DF-05EC-C206-F009DE0FA0A7} = {0AB3BF05-4346-4AA6-1389-037BE0695223} - EndGlobalSection -EndGlobal diff --git a/MiniExcel.slnx b/MiniExcel.slnx new file mode 100644 index 00000000..55756c68 --- /dev/null +++ b/MiniExcel.slnx @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From 98d90983634b64810e6133e3ccf5af427988ac1d Mon Sep 17 00:00:00 2001 From: Michele Bastione Date: Sun, 6 Jul 2025 12:05:12 +0200 Subject: [PATCH 06/26] Added global usings --- .../Abstractions/IMiniExcelDataReader.cs | 4 +-- .../Abstractions/IMiniExcelReader.cs | 4 +-- .../Abstractions/IMiniExcelTemplate.cs | 4 +-- .../Abstractions/IMiniExcelWriteAdapter.cs | 4 +-- .../IMiniExcelWriteAdapterAsync.cs | 4 +-- .../Abstractions/IMiniExcelWriter.cs | 4 +-- .../Attributes/MiniExcelColumnAttribute.cs | 4 +-- .../MiniExcelColumnIndexAttribute.cs | 4 +-- .../DataReader/MiniExcelDataReaderBase.cs | 5 +-- src/MiniExcel.Core/GlobalUsings.cs | 22 +++++++++++++ .../Helpers/AttributeExtension.cs | 4 +-- .../Helpers/SafeStreamWriter.cs | 5 +-- src/MiniExcel.Core/Helpers/TypeHelper.cs | 4 +-- src/MiniExcel.Core/Helpers/XmlHelper.cs | 6 +--- src/MiniExcel.Core/MiniExcelConfiguration.cs | 5 +-- src/MiniExcel.Core/MiniExcelExporter.cs | 2 -- src/MiniExcel.Core/MiniExcelImporter.cs | 7 ---- src/MiniExcel.Core/MiniExcelTemplater.cs | 2 -- .../OpenXml/Attributes/ExcelSheetAttribute.cs | 2 -- .../OpenXml/Constants/ExcelXml.cs | 6 +--- .../OpenXml/Constants/WorksheetXml.cs | 5 +-- .../OpenXml/Models/ExcelWidthCollection.cs | 2 -- src/MiniExcel.Core/OpenXml/OpenXmlReader.cs | 13 -------- src/MiniExcel.Core/OpenXml/OpenXmlStyles.cs | 4 --- .../OpenXml/OpenXmlWriter.DefaultOpenXml.cs | 10 ------ src/MiniExcel.Core/OpenXml/OpenXmlWriter.cs | 33 +++++++------------ .../OpenXml/Picture/OpenXmlPicture.cs | 2 -- .../Picture/OpenXmlPictureImplement.cs | 7 +--- .../OpenXml/Styles/SheetStyleBuildContext.cs | 11 +------ .../OpenXml/Styles/SheetStyleBuilderBase.cs | 4 +-- .../OpenXml/Styles/SheetStyleBuilderHelper.cs | 5 +-- .../OpenXml/Templates/OpenXmlTemplate.Impl.cs | 14 -------- .../Templates/OpenXmlTemplate.MergeCells.cs | 5 --- .../OpenXml/Templates/OpenXmlTemplate.cs | 10 ------ .../Templates/OpenXmlValueExtractor.cs | 5 --- .../OpenXml/Utils/CalcChainHelper.cs | 5 +-- .../OpenXml/Utils/GeneralHelper.cs | 4 +-- .../OpenXml/Utils/MiniExcelPropertyHelper.cs | 2 -- .../Utils/OpenXmlNumberFormatHelper.cs | 5 +-- .../OpenXml/Utils/ReferenceHelper.cs | 4 +-- .../OpenXml/Utils/SharedStringsDiskCache.cs | 5 +-- .../OpenXml/Utils/XmlReaderHelper.cs | 6 ---- .../OpenXml/Zip/MiniExcelZipArchive.cs | 3 -- src/MiniExcel.Core/OpenXml/Zip/OpenXmlZip.cs | 3 -- .../OpenXml/Zip/ZipPackageInfo.cs | 2 -- src/MiniExcel.Core/Properties/AssemblyInfo.cs | 4 +-- .../Reflection/CustomPropertyHelper.cs | 6 +--- src/MiniExcel.Core/Reflection/MemberGetter.cs | 1 - src/MiniExcel.Core/Reflection/MemberSetter.cs | 1 - .../Reflection/MiniExcelColumnInfo.cs | 2 -- .../Reflection/MiniExcelMapper.cs | 6 ---- .../Reflection/MiniExcelProperty.cs | 2 -- .../AsyncEnumerableWriteAdapter.cs | 7 +--- .../WriteAdapters/DataReaderWriteAdapter.cs | 6 +--- .../WriteAdapters/DataTableWriteAdapter.cs | 6 +--- .../WriteAdapters/EnumerableWriteAdapter.cs | 7 +--- .../MiniExcelDataReaderWriteAdapter.cs | 6 +--- .../MiniExcelWriteAdapterFactory.cs | 7 +--- src/MiniExcel.Csv/CsvConfiguration.cs | 3 -- src/MiniExcel.Csv/CsvReader.cs | 9 ----- src/MiniExcel.Csv/CsvWriter.cs | 10 +----- src/MiniExcel.Csv/GlobalUsings.cs | 17 ++++++++++ .../MiniExcelExtensions/Exporter.cs | 6 ---- .../MiniExcelExtensions/Importer.cs | 8 ----- tests/MiniExcelTests/GlobalUsings.cs | 21 ++++++++++++ .../MiniExcelAutoAdjustWidthTests.cs | 8 +---- tests/MiniExcelTests/MiniExcelCsvAsycTests.cs | 10 +----- tests/MiniExcelTests/MiniExcelCsvTests.cs | 11 +------ .../MiniExcelIssueAsyncTests.cs | 16 +-------- tests/MiniExcelTests/MiniExcelIssueTests.cs | 15 --------- .../MiniExcelOpenXmlAsyncTests.cs | 13 +------- .../MiniExcelOpenXmlConfigurationTest.cs | 6 ---- ...MiniExcelOpenXmlMultipleSheetAsyncTests.cs | 5 +-- .../MiniExcelOpenXmlMultipleSheetTests.cs | 6 +--- tests/MiniExcelTests/MiniExcelOpenXmlTests.cs | 15 +-------- .../InputValueExtractorTests.cs | 2 -- .../MiniExcelTemplateAsyncTests.cs | 8 +---- .../SaveByTemplate/MiniExcelTemplateTests.cs | 8 ----- tests/MiniExcelTests/Utils/Db.cs | 5 +-- tests/MiniExcelTests/Utils/EpplusLicense.cs | 2 -- tests/MiniExcelTests/Utils/Helpers.cs | 4 +-- 81 files changed, 116 insertions(+), 424 deletions(-) create mode 100644 src/MiniExcel.Core/GlobalUsings.cs create mode 100644 src/MiniExcel.Csv/GlobalUsings.cs create mode 100644 tests/MiniExcelTests/GlobalUsings.cs diff --git a/src/MiniExcel.Core/Abstractions/IMiniExcelDataReader.cs b/src/MiniExcel.Core/Abstractions/IMiniExcelDataReader.cs index c39980e8..a36aec05 100644 --- a/src/MiniExcel.Core/Abstractions/IMiniExcelDataReader.cs +++ b/src/MiniExcel.Core/Abstractions/IMiniExcelDataReader.cs @@ -1,6 +1,4 @@ -using System.Data; - -namespace MiniExcelLib.Core.Abstractions; +namespace MiniExcelLib.Core.Abstractions; public interface IMiniExcelDataReader : IDataReader #if NET8_0_OR_GREATER diff --git a/src/MiniExcel.Core/Abstractions/IMiniExcelReader.cs b/src/MiniExcel.Core/Abstractions/IMiniExcelReader.cs index 5cf07796..3760c139 100644 --- a/src/MiniExcel.Core/Abstractions/IMiniExcelReader.cs +++ b/src/MiniExcel.Core/Abstractions/IMiniExcelReader.cs @@ -1,6 +1,4 @@ -using Zomp.SyncMethodGenerator; - -namespace MiniExcelLib.Core.Abstractions; +namespace MiniExcelLib.Core.Abstractions; public partial interface IMiniExcelReader : IDisposable { diff --git a/src/MiniExcel.Core/Abstractions/IMiniExcelTemplate.cs b/src/MiniExcel.Core/Abstractions/IMiniExcelTemplate.cs index bdba22a8..4d089f07 100644 --- a/src/MiniExcel.Core/Abstractions/IMiniExcelTemplate.cs +++ b/src/MiniExcel.Core/Abstractions/IMiniExcelTemplate.cs @@ -1,6 +1,4 @@ -using Zomp.SyncMethodGenerator; - -namespace MiniExcelLib.Core.Abstractions; +namespace MiniExcelLib.Core.Abstractions; public partial interface IMiniExcelTemplate { diff --git a/src/MiniExcel.Core/Abstractions/IMiniExcelWriteAdapter.cs b/src/MiniExcel.Core/Abstractions/IMiniExcelWriteAdapter.cs index 1fb24a85..a57675ed 100644 --- a/src/MiniExcel.Core/Abstractions/IMiniExcelWriteAdapter.cs +++ b/src/MiniExcel.Core/Abstractions/IMiniExcelWriteAdapter.cs @@ -1,6 +1,4 @@ -using MiniExcelLib.Core.Reflection; - -namespace MiniExcelLib.Core.Abstractions; +namespace MiniExcelLib.Core.Abstractions; public interface IMiniExcelWriteAdapter { diff --git a/src/MiniExcel.Core/Abstractions/IMiniExcelWriteAdapterAsync.cs b/src/MiniExcel.Core/Abstractions/IMiniExcelWriteAdapterAsync.cs index 03865a63..14a9aeb9 100644 --- a/src/MiniExcel.Core/Abstractions/IMiniExcelWriteAdapterAsync.cs +++ b/src/MiniExcel.Core/Abstractions/IMiniExcelWriteAdapterAsync.cs @@ -1,6 +1,4 @@ -using MiniExcelLib.Core.Reflection; - -namespace MiniExcelLib.Core.Abstractions; +namespace MiniExcelLib.Core.Abstractions; public interface IMiniExcelWriteAdapterAsync { diff --git a/src/MiniExcel.Core/Abstractions/IMiniExcelWriter.cs b/src/MiniExcel.Core/Abstractions/IMiniExcelWriter.cs index b56c063a..b80f88dd 100644 --- a/src/MiniExcel.Core/Abstractions/IMiniExcelWriter.cs +++ b/src/MiniExcel.Core/Abstractions/IMiniExcelWriter.cs @@ -1,6 +1,4 @@ -using Zomp.SyncMethodGenerator; - -namespace MiniExcelLib.Core.Abstractions; +namespace MiniExcelLib.Core.Abstractions; public partial interface IMiniExcelWriter { diff --git a/src/MiniExcel.Core/Attributes/MiniExcelColumnAttribute.cs b/src/MiniExcel.Core/Attributes/MiniExcelColumnAttribute.cs index c7a2c287..2d6098a7 100644 --- a/src/MiniExcel.Core/Attributes/MiniExcelColumnAttribute.cs +++ b/src/MiniExcel.Core/Attributes/MiniExcelColumnAttribute.cs @@ -1,6 +1,4 @@ -using MiniExcelLib.Core.Helpers; - -namespace MiniExcelLib.Core.Attributes; +namespace MiniExcelLib.Core.Attributes; [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field)] public class MiniExcelColumnAttribute : Attribute diff --git a/src/MiniExcel.Core/Attributes/MiniExcelColumnIndexAttribute.cs b/src/MiniExcel.Core/Attributes/MiniExcelColumnIndexAttribute.cs index 73a44212..b0033b63 100644 --- a/src/MiniExcel.Core/Attributes/MiniExcelColumnIndexAttribute.cs +++ b/src/MiniExcel.Core/Attributes/MiniExcelColumnIndexAttribute.cs @@ -1,6 +1,4 @@ -using MiniExcelLib.Core.Helpers; - -namespace MiniExcelLib.Core.Attributes; +namespace MiniExcelLib.Core.Attributes; [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field)] public class MiniExcelColumnIndexAttribute : Attribute diff --git a/src/MiniExcel.Core/DataReader/MiniExcelDataReaderBase.cs b/src/MiniExcel.Core/DataReader/MiniExcelDataReaderBase.cs index 477a5630..8bc3107d 100644 --- a/src/MiniExcel.Core/DataReader/MiniExcelDataReaderBase.cs +++ b/src/MiniExcel.Core/DataReader/MiniExcelDataReaderBase.cs @@ -1,7 +1,4 @@ -using System.Data; -using MiniExcelLib.Core.Abstractions; - -namespace MiniExcelLib.Core.DataReader; +namespace MiniExcelLib.Core.DataReader; /// /// IMiniExcelDataReader Base Class diff --git a/src/MiniExcel.Core/GlobalUsings.cs b/src/MiniExcel.Core/GlobalUsings.cs new file mode 100644 index 00000000..c58f3456 --- /dev/null +++ b/src/MiniExcel.Core/GlobalUsings.cs @@ -0,0 +1,22 @@ +// Global using directives + +global using System.Collections; +global using System.Data; +global using System.Globalization; +global using System.IO.Compression; +global using System.Reflection; +global using System.Runtime.CompilerServices; +global using System.Text; +global using System.Text.RegularExpressions; +global using System.Xml; +global using MiniExcelLib.Core.Abstractions; +global using MiniExcelLib.Core.Attributes; +global using MiniExcelLib.Core.Enums; +global using MiniExcelLib.Core.Helpers; +global using MiniExcelLib.Core.OpenXml; +global using MiniExcelLib.Core.OpenXml.Constants; +global using MiniExcelLib.Core.OpenXml.Models; +global using MiniExcelLib.Core.OpenXml.Utils; +global using MiniExcelLib.Core.OpenXml.Zip; +global using MiniExcelLib.Core.Reflection; +global using Zomp.SyncMethodGenerator; \ No newline at end of file diff --git a/src/MiniExcel.Core/Helpers/AttributeExtension.cs b/src/MiniExcel.Core/Helpers/AttributeExtension.cs index 1a92907f..a8236785 100644 --- a/src/MiniExcel.Core/Helpers/AttributeExtension.cs +++ b/src/MiniExcel.Core/Helpers/AttributeExtension.cs @@ -1,6 +1,4 @@ -using System.Reflection; - -namespace MiniExcelLib.Core.Helpers; +namespace MiniExcelLib.Core.Helpers; internal static class AttributeExtension { diff --git a/src/MiniExcel.Core/Helpers/SafeStreamWriter.cs b/src/MiniExcel.Core/Helpers/SafeStreamWriter.cs index 6fe17cfa..e147263c 100644 --- a/src/MiniExcel.Core/Helpers/SafeStreamWriter.cs +++ b/src/MiniExcel.Core/Helpers/SafeStreamWriter.cs @@ -1,7 +1,4 @@ -using System.Text; -using Zomp.SyncMethodGenerator; - -namespace MiniExcelLib.Core.Helpers; +namespace MiniExcelLib.Core.Helpers; internal partial class SafeStreamWriter(Stream stream, Encoding encoding, int bufferSize) : IDisposable { diff --git a/src/MiniExcel.Core/Helpers/TypeHelper.cs b/src/MiniExcel.Core/Helpers/TypeHelper.cs index 1a5d0a7b..1ba86cbf 100644 --- a/src/MiniExcel.Core/Helpers/TypeHelper.cs +++ b/src/MiniExcel.Core/Helpers/TypeHelper.cs @@ -1,6 +1,4 @@ -using System.Data; - -namespace MiniExcelLib.Core.Helpers; +namespace MiniExcelLib.Core.Helpers; internal static class TypeHelper { diff --git a/src/MiniExcel.Core/Helpers/XmlHelper.cs b/src/MiniExcel.Core/Helpers/XmlHelper.cs index 04861224..ea12a6bf 100644 --- a/src/MiniExcel.Core/Helpers/XmlHelper.cs +++ b/src/MiniExcel.Core/Helpers/XmlHelper.cs @@ -1,8 +1,4 @@ -using System.Text; -using System.Text.RegularExpressions; -using System.Xml; - -namespace MiniExcelLib.Core.Helpers; +namespace MiniExcelLib.Core.Helpers; /// XmlEncoder MIT Copyright ©2021 from https://github.com/ClosedXML internal static partial class XmlHelper diff --git a/src/MiniExcel.Core/MiniExcelConfiguration.cs b/src/MiniExcel.Core/MiniExcelConfiguration.cs index 3cb7e7bd..2742d8d4 100644 --- a/src/MiniExcel.Core/MiniExcelConfiguration.cs +++ b/src/MiniExcel.Core/MiniExcelConfiguration.cs @@ -1,7 +1,4 @@ -using System.Globalization; -using MiniExcelLib.Core.Attributes; - -namespace MiniExcelLib.Core; +namespace MiniExcelLib.Core; public interface IMiniExcelConfiguration; diff --git a/src/MiniExcel.Core/MiniExcelExporter.cs b/src/MiniExcel.Core/MiniExcelExporter.cs index 401ee91c..9c5574de 100644 --- a/src/MiniExcel.Core/MiniExcelExporter.cs +++ b/src/MiniExcel.Core/MiniExcelExporter.cs @@ -1,6 +1,4 @@ -using MiniExcelLib.Core.OpenXml; using MiniExcelLib.Core.OpenXml.Picture; -using Zomp.SyncMethodGenerator; namespace MiniExcelLib.Core; diff --git a/src/MiniExcel.Core/MiniExcelImporter.cs b/src/MiniExcel.Core/MiniExcelImporter.cs index 98219d76..9401bd1a 100644 --- a/src/MiniExcel.Core/MiniExcelImporter.cs +++ b/src/MiniExcel.Core/MiniExcelImporter.cs @@ -1,13 +1,6 @@ -using System.Data; using System.Diagnostics.CodeAnalysis; using System.Dynamic; -using System.Runtime.CompilerServices; using MiniExcelLib.Core.DataReader; -using MiniExcelLib.Core.Helpers; -using MiniExcelLib.Core.OpenXml; -using MiniExcelLib.Core.OpenXml.Models; -using MiniExcelLib.Core.OpenXml.Zip; -using Zomp.SyncMethodGenerator; namespace MiniExcelLib.Core; diff --git a/src/MiniExcel.Core/MiniExcelTemplater.cs b/src/MiniExcel.Core/MiniExcelTemplater.cs index 1b8e295a..05fbcaa2 100644 --- a/src/MiniExcel.Core/MiniExcelTemplater.cs +++ b/src/MiniExcel.Core/MiniExcelTemplater.cs @@ -1,6 +1,4 @@ -using MiniExcelLib.Core.OpenXml; using MiniExcelLib.Core.OpenXml.Templates; -using Zomp.SyncMethodGenerator; namespace MiniExcelLib.Core; diff --git a/src/MiniExcel.Core/OpenXml/Attributes/ExcelSheetAttribute.cs b/src/MiniExcel.Core/OpenXml/Attributes/ExcelSheetAttribute.cs index fc2011f1..05ebfe54 100644 --- a/src/MiniExcel.Core/OpenXml/Attributes/ExcelSheetAttribute.cs +++ b/src/MiniExcel.Core/OpenXml/Attributes/ExcelSheetAttribute.cs @@ -1,5 +1,3 @@ -using MiniExcelLib.Core.OpenXml.Models; - namespace MiniExcelLib.Core.OpenXml.Attributes; [AttributeUsage(AttributeTargets.Class)] diff --git a/src/MiniExcel.Core/OpenXml/Constants/ExcelXml.cs b/src/MiniExcel.Core/OpenXml/Constants/ExcelXml.cs index 3ea94be3..dd59ca54 100644 --- a/src/MiniExcel.Core/OpenXml/Constants/ExcelXml.cs +++ b/src/MiniExcel.Core/OpenXml/Constants/ExcelXml.cs @@ -1,8 +1,4 @@ -using MiniExcelLib.Core.Helpers; -using MiniExcelLib.Core.OpenXml.Models; -using MiniExcelLib.Core.OpenXml.Utils; - -namespace MiniExcelLib.Core.OpenXml.Constants; +namespace MiniExcelLib.Core.OpenXml.Constants; internal static class ExcelXml { diff --git a/src/MiniExcel.Core/OpenXml/Constants/WorksheetXml.cs b/src/MiniExcel.Core/OpenXml/Constants/WorksheetXml.cs index 65f44e8b..766b956d 100644 --- a/src/MiniExcel.Core/OpenXml/Constants/WorksheetXml.cs +++ b/src/MiniExcel.Core/OpenXml/Constants/WorksheetXml.cs @@ -1,7 +1,4 @@ -using System.Globalization; -using MiniExcelLib.Core.Attributes; - -namespace MiniExcelLib.Core.OpenXml.Constants; +namespace MiniExcelLib.Core.OpenXml.Constants; internal static class WorksheetXml { diff --git a/src/MiniExcel.Core/OpenXml/Models/ExcelWidthCollection.cs b/src/MiniExcel.Core/OpenXml/Models/ExcelWidthCollection.cs index b122fc07..7ed738b4 100644 --- a/src/MiniExcel.Core/OpenXml/Models/ExcelWidthCollection.cs +++ b/src/MiniExcel.Core/OpenXml/Models/ExcelWidthCollection.cs @@ -1,5 +1,3 @@ -using MiniExcelLib.Core.Reflection; - namespace MiniExcelLib.Core.OpenXml.Models; public sealed class ExcelColumnWidth diff --git a/src/MiniExcel.Core/OpenXml/OpenXmlReader.cs b/src/MiniExcel.Core/OpenXml/OpenXmlReader.cs index 4b7775f4..b29bd38b 100644 --- a/src/MiniExcel.Core/OpenXml/OpenXmlReader.cs +++ b/src/MiniExcel.Core/OpenXml/OpenXmlReader.cs @@ -1,17 +1,4 @@ using System.Collections.ObjectModel; -using System.Globalization; -using System.IO.Compression; -using System.Runtime.CompilerServices; -using System.Xml; -using MiniExcelLib.Core.Abstractions; -using MiniExcelLib.Core.Helpers; -using MiniExcelLib.Core.OpenXml.Constants; -using MiniExcelLib.Core.OpenXml.Models; -using MiniExcelLib.Core.OpenXml.Utils; -using MiniExcelLib.Core.OpenXml.Zip; -using MiniExcelLib.Core.Reflection; -using Zomp.SyncMethodGenerator; -using XmlReaderHelper = MiniExcelLib.Core.OpenXml.Utils.XmlReaderHelper; namespace MiniExcelLib.Core.OpenXml; diff --git a/src/MiniExcel.Core/OpenXml/OpenXmlStyles.cs b/src/MiniExcel.Core/OpenXml/OpenXmlStyles.cs index fef8f51b..d29ba3e4 100644 --- a/src/MiniExcel.Core/OpenXml/OpenXmlStyles.cs +++ b/src/MiniExcel.Core/OpenXml/OpenXmlStyles.cs @@ -1,7 +1,3 @@ -using MiniExcelLib.Core.OpenXml.Constants; -using MiniExcelLib.Core.OpenXml.Utils; -using MiniExcelLib.Core.OpenXml.Zip; - namespace MiniExcelLib.Core.OpenXml; internal class OpenXmlStyles diff --git a/src/MiniExcel.Core/OpenXml/OpenXmlWriter.DefaultOpenXml.cs b/src/MiniExcel.Core/OpenXml/OpenXmlWriter.DefaultOpenXml.cs index 79422af6..f7890991 100644 --- a/src/MiniExcel.Core/OpenXml/OpenXmlWriter.DefaultOpenXml.cs +++ b/src/MiniExcel.Core/OpenXml/OpenXmlWriter.DefaultOpenXml.cs @@ -1,13 +1,3 @@ -using System.Data; -using System.Globalization; -using System.Text; -using MiniExcelLib.Core.Abstractions; -using MiniExcelLib.Core.Helpers; -using MiniExcelLib.Core.OpenXml.Constants; -using MiniExcelLib.Core.OpenXml.Models; -using MiniExcelLib.Core.OpenXml.Utils; -using MiniExcelLib.Core.OpenXml.Zip; -using MiniExcelLib.Core.Reflection; using static MiniExcelLib.Core.Helpers.ImageHelper; namespace MiniExcelLib.Core.OpenXml; diff --git a/src/MiniExcel.Core/OpenXml/OpenXmlWriter.cs b/src/MiniExcel.Core/OpenXml/OpenXmlWriter.cs index c0e96fde..41b72913 100644 --- a/src/MiniExcel.Core/OpenXml/OpenXmlWriter.cs +++ b/src/MiniExcel.Core/OpenXml/OpenXmlWriter.cs @@ -1,17 +1,6 @@ -using System.IO.Compression; -using System.Text; using System.Xml.Linq; -using MiniExcelLib.Core.Abstractions; -using MiniExcelLib.Core.Helpers; -using MiniExcelLib.Core.OpenXml.Constants; -using MiniExcelLib.Core.OpenXml.Models; using MiniExcelLib.Core.OpenXml.Styles; -using MiniExcelLib.Core.OpenXml.Utils; -using MiniExcelLib.Core.OpenXml.Zip; -using MiniExcelLib.Core.Reflection; using MiniExcelLib.Core.WriteAdapters; -using Zomp.SyncMethodGenerator; -using MiniExcelLib.Core.Helpers; namespace MiniExcelLib.Core.OpenXml; @@ -215,13 +204,13 @@ private async Task CreateSheetXmlAsync(object? values, string sheetPath, Ca } [CreateSyncVersion] - private static async Task WriteEmptySheetAsync(Helpers_SafeStreamWriter writer) + private static async Task WriteEmptySheetAsync(SafeStreamWriter writer) { await writer.WriteAsync(ExcelXml.EmptySheetXml).ConfigureAwait(false); } [CreateSyncVersion] - private static async Task WriteDimensionPlaceholderAsync(Helpers_SafeStreamWriter writer) + private static async Task WriteDimensionPlaceholderAsync(SafeStreamWriter writer) { var dimensionPlaceholderPostition = await writer.WriteAndFlushAsync(WorksheetXml.StartDimension).ConfigureAwait(false); await writer.WriteAsync(WorksheetXml.DimensionPlaceholder).ConfigureAwait(false); // end of code will be replaced @@ -230,7 +219,7 @@ private static async Task WriteDimensionPlaceholderAsync(Helpers_SafeStrea } [CreateSyncVersion] - private static async Task WriteDimensionAsync(Helpers_SafeStreamWriter writer, int maxRowIndex, int maxColumnIndex, long placeholderPosition) + private static async Task WriteDimensionAsync(SafeStreamWriter writer, int maxRowIndex, int maxColumnIndex, long placeholderPosition) { // Flush and save position so that we can get back again. var position = await writer.FlushAsync().ConfigureAwait(false); @@ -242,7 +231,7 @@ private static async Task WriteDimensionAsync(Helpers_SafeStreamWriter writer, i } [CreateSyncVersion] - private async Task WriteValuesAsync(Helpers_SafeStreamWriter writer, object values, CancellationToken cancellationToken) + private async Task WriteValuesAsync(SafeStreamWriter writer, object values, CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); @@ -375,7 +364,7 @@ private async Task WriteValuesAsync(Helpers_SafeStreamWriter writer, object } [CreateSyncVersion] - private static async Task WriteColumnWidthPlaceholdersAsync(Helpers_SafeStreamWriter writer, int count, CancellationToken cancellationToken = default) + private static async Task WriteColumnWidthPlaceholdersAsync(SafeStreamWriter writer, int count, CancellationToken cancellationToken = default) { cancellationToken.ThrowIfCancellationRequested(); @@ -385,7 +374,7 @@ private static async Task WriteColumnWidthPlaceholdersAsync(Helpers_SafeSt } [CreateSyncVersion] - private static async Task OverwriteColumnWidthPlaceholdersAsync(Helpers_SafeStreamWriter writer, long placeholderPosition, IEnumerable? columnWidths, CancellationToken cancellationToken = default) + private static async Task OverwriteColumnWidthPlaceholdersAsync(SafeStreamWriter writer, long placeholderPosition, IEnumerable? columnWidths, CancellationToken cancellationToken = default) { cancellationToken.ThrowIfCancellationRequested(); @@ -399,7 +388,7 @@ private static async Task OverwriteColumnWidthPlaceholdersAsync(Helpers_SafeStre } [CreateSyncVersion] - private static async Task WriteColumnsWidthsAsync(Helpers_SafeStreamWriter writer, IEnumerable? columnWidths, CancellationToken cancellationToken = default) + private static async Task WriteColumnsWidthsAsync(SafeStreamWriter writer, IEnumerable? columnWidths, CancellationToken cancellationToken = default) { var hasWrittenStart = false; @@ -423,7 +412,7 @@ private static async Task WriteColumnsWidthsAsync(Helpers_SafeStreamWriter write } [CreateSyncVersion] - private async Task PrintHeaderAsync(Helpers_SafeStreamWriter writer, List props, CancellationToken cancellationToken = default) + private async Task PrintHeaderAsync(SafeStreamWriter writer, List props, CancellationToken cancellationToken = default) { const int yIndex = 1; await writer.WriteAsync(WorksheetXml.StartRow(yIndex), cancellationToken).ConfigureAwait(false); @@ -447,13 +436,13 @@ private async Task PrintHeaderAsync(Helpers_SafeStreamWriter writer, List /// This code edit from https://github.com/andersnm/ExcelNumberFormat diff --git a/src/MiniExcel.Core/OpenXml/Utils/ReferenceHelper.cs b/src/MiniExcel.Core/OpenXml/Utils/ReferenceHelper.cs index 4d89e597..4cd4135f 100644 --- a/src/MiniExcel.Core/OpenXml/Utils/ReferenceHelper.cs +++ b/src/MiniExcel.Core/OpenXml/Utils/ReferenceHelper.cs @@ -1,6 +1,4 @@ -using System.Globalization; - -namespace MiniExcelLib.Core.OpenXml.Utils; +namespace MiniExcelLib.Core.OpenXml.Utils; internal static class ReferenceHelper { diff --git a/src/MiniExcel.Core/OpenXml/Utils/SharedStringsDiskCache.cs b/src/MiniExcel.Core/OpenXml/Utils/SharedStringsDiskCache.cs index b93f31af..bae9245c 100644 --- a/src/MiniExcel.Core/OpenXml/Utils/SharedStringsDiskCache.cs +++ b/src/MiniExcel.Core/OpenXml/Utils/SharedStringsDiskCache.cs @@ -1,7 +1,4 @@ -using System.Collections; -using System.Text; - -namespace MiniExcelLib.Core.OpenXml.Utils; +namespace MiniExcelLib.Core.OpenXml.Utils; internal class SharedStringsDiskCache : IDictionary, IDisposable { diff --git a/src/MiniExcel.Core/OpenXml/Utils/XmlReaderHelper.cs b/src/MiniExcel.Core/OpenXml/Utils/XmlReaderHelper.cs index 7a84b0ca..345cdbfe 100644 --- a/src/MiniExcel.Core/OpenXml/Utils/XmlReaderHelper.cs +++ b/src/MiniExcel.Core/OpenXml/Utils/XmlReaderHelper.cs @@ -1,9 +1,3 @@ -using System.Runtime.CompilerServices; -using System.Text; -using System.Xml; -using MiniExcelLib.Core.OpenXml.Constants; -using Zomp.SyncMethodGenerator; - namespace MiniExcelLib.Core.OpenXml.Utils; internal static partial class XmlReaderHelper diff --git a/src/MiniExcel.Core/OpenXml/Zip/MiniExcelZipArchive.cs b/src/MiniExcel.Core/OpenXml/Zip/MiniExcelZipArchive.cs index bc761d90..9df07bdc 100644 --- a/src/MiniExcel.Core/OpenXml/Zip/MiniExcelZipArchive.cs +++ b/src/MiniExcel.Core/OpenXml/Zip/MiniExcelZipArchive.cs @@ -1,6 +1,3 @@ -using System.IO.Compression; -using System.Text; - namespace MiniExcelLib.Core.OpenXml.Zip; public class MiniExcelZipArchive(Stream stream, ZipArchiveMode mode, bool leaveOpen, Encoding entryNameEncoding) diff --git a/src/MiniExcel.Core/OpenXml/Zip/OpenXmlZip.cs b/src/MiniExcel.Core/OpenXml/Zip/OpenXmlZip.cs index 89cc0761..abc594fd 100644 --- a/src/MiniExcel.Core/OpenXml/Zip/OpenXmlZip.cs +++ b/src/MiniExcel.Core/OpenXml/Zip/OpenXmlZip.cs @@ -1,7 +1,4 @@ using System.Collections.ObjectModel; -using System.IO.Compression; -using System.Text; -using System.Xml; namespace MiniExcelLib.Core.OpenXml.Zip; diff --git a/src/MiniExcel.Core/OpenXml/Zip/ZipPackageInfo.cs b/src/MiniExcel.Core/OpenXml/Zip/ZipPackageInfo.cs index 1f45279a..4cee1d50 100644 --- a/src/MiniExcel.Core/OpenXml/Zip/ZipPackageInfo.cs +++ b/src/MiniExcel.Core/OpenXml/Zip/ZipPackageInfo.cs @@ -1,5 +1,3 @@ -using System.IO.Compression; - namespace MiniExcelLib.Core.OpenXml.Zip; internal class ZipPackageInfo(ZipArchiveEntry zipArchiveEntry, string contentType) diff --git a/src/MiniExcel.Core/Properties/AssemblyInfo.cs b/src/MiniExcel.Core/Properties/AssemblyInfo.cs index e083c770..2ce2a434 100644 --- a/src/MiniExcel.Core/Properties/AssemblyInfo.cs +++ b/src/MiniExcel.Core/Properties/AssemblyInfo.cs @@ -1,5 +1,3 @@ -using System.Runtime.CompilerServices; - -#if PLAT_SKIP_LOCALS_INIT +#if PLAT_SKIP_LOCALS_INIT [module: System.Runtime.CompilerServices.SkipLocalsInit] #endif diff --git a/src/MiniExcel.Core/Reflection/CustomPropertyHelper.cs b/src/MiniExcel.Core/Reflection/CustomPropertyHelper.cs index 8b01aba4..04176ab1 100644 --- a/src/MiniExcel.Core/Reflection/CustomPropertyHelper.cs +++ b/src/MiniExcel.Core/Reflection/CustomPropertyHelper.cs @@ -1,8 +1,4 @@ -using System.Collections; -using System.ComponentModel; -using System.Reflection; -using MiniExcelLib.Core.Attributes; -using MiniExcelLib.Core.Helpers; +using System.ComponentModel; namespace MiniExcelLib.Core.Reflection; diff --git a/src/MiniExcel.Core/Reflection/MemberGetter.cs b/src/MiniExcel.Core/Reflection/MemberGetter.cs index 2f399e48..233fde62 100644 --- a/src/MiniExcel.Core/Reflection/MemberGetter.cs +++ b/src/MiniExcel.Core/Reflection/MemberGetter.cs @@ -1,5 +1,4 @@ using System.Linq.Expressions; -using System.Reflection; namespace MiniExcelLib.Core.Reflection; diff --git a/src/MiniExcel.Core/Reflection/MemberSetter.cs b/src/MiniExcel.Core/Reflection/MemberSetter.cs index 59b3c2d3..1e81c84c 100644 --- a/src/MiniExcel.Core/Reflection/MemberSetter.cs +++ b/src/MiniExcel.Core/Reflection/MemberSetter.cs @@ -1,5 +1,4 @@ using System.Linq.Expressions; -using System.Reflection; namespace MiniExcelLib.Core.Reflection; diff --git a/src/MiniExcel.Core/Reflection/MiniExcelColumnInfo.cs b/src/MiniExcel.Core/Reflection/MiniExcelColumnInfo.cs index 076332a7..2f3c0d23 100644 --- a/src/MiniExcel.Core/Reflection/MiniExcelColumnInfo.cs +++ b/src/MiniExcel.Core/Reflection/MiniExcelColumnInfo.cs @@ -1,5 +1,3 @@ -using MiniExcelLib.Core.Attributes; - namespace MiniExcelLib.Core.Reflection; public class MiniExcelColumnInfo diff --git a/src/MiniExcel.Core/Reflection/MiniExcelMapper.cs b/src/MiniExcel.Core/Reflection/MiniExcelMapper.cs index c687a45b..055da0c2 100644 --- a/src/MiniExcel.Core/Reflection/MiniExcelMapper.cs +++ b/src/MiniExcel.Core/Reflection/MiniExcelMapper.cs @@ -1,11 +1,5 @@ using System.ComponentModel; -using System.Globalization; -using System.Reflection; -using System.Runtime.CompilerServices; using MiniExcelLib.Core.Exceptions; -using MiniExcelLib.Core.Helpers; -using MiniExcelLib.Core.OpenXml.Utils; -using Zomp.SyncMethodGenerator; namespace MiniExcelLib.Core.Reflection; diff --git a/src/MiniExcel.Core/Reflection/MiniExcelProperty.cs b/src/MiniExcel.Core/Reflection/MiniExcelProperty.cs index c1627c82..3c2dafe7 100644 --- a/src/MiniExcel.Core/Reflection/MiniExcelProperty.cs +++ b/src/MiniExcel.Core/Reflection/MiniExcelProperty.cs @@ -1,5 +1,3 @@ -using System.Reflection; - namespace MiniExcelLib.Core.Reflection; public abstract class Member; diff --git a/src/MiniExcel.Core/WriteAdapters/AsyncEnumerableWriteAdapter.cs b/src/MiniExcel.Core/WriteAdapters/AsyncEnumerableWriteAdapter.cs index 06baca6c..a48b25ac 100644 --- a/src/MiniExcel.Core/WriteAdapters/AsyncEnumerableWriteAdapter.cs +++ b/src/MiniExcel.Core/WriteAdapters/AsyncEnumerableWriteAdapter.cs @@ -1,9 +1,4 @@ -using System.Collections; -using System.Runtime.CompilerServices; -using MiniExcelLib.Core.Abstractions; -using MiniExcelLib.Core.Reflection; - -namespace MiniExcelLib.Core.WriteAdapters; +namespace MiniExcelLib.Core.WriteAdapters; internal class AsyncEnumerableWriteAdapter(IAsyncEnumerable values, MiniExcelBaseConfiguration configuration) : IMiniExcelWriteAdapterAsync { diff --git a/src/MiniExcel.Core/WriteAdapters/DataReaderWriteAdapter.cs b/src/MiniExcel.Core/WriteAdapters/DataReaderWriteAdapter.cs index b43df4c3..a85a9273 100644 --- a/src/MiniExcel.Core/WriteAdapters/DataReaderWriteAdapter.cs +++ b/src/MiniExcel.Core/WriteAdapters/DataReaderWriteAdapter.cs @@ -1,8 +1,4 @@ -using System.Data; -using MiniExcelLib.Core.Abstractions; -using MiniExcelLib.Core.Reflection; - -namespace MiniExcelLib.Core.WriteAdapters; +namespace MiniExcelLib.Core.WriteAdapters; internal class DataReaderWriteAdapter(IDataReader reader, MiniExcelBaseConfiguration configuration) : IMiniExcelWriteAdapter { diff --git a/src/MiniExcel.Core/WriteAdapters/DataTableWriteAdapter.cs b/src/MiniExcel.Core/WriteAdapters/DataTableWriteAdapter.cs index 65d7964c..fb0bd33a 100644 --- a/src/MiniExcel.Core/WriteAdapters/DataTableWriteAdapter.cs +++ b/src/MiniExcel.Core/WriteAdapters/DataTableWriteAdapter.cs @@ -1,8 +1,4 @@ -using System.Data; -using MiniExcelLib.Core.Abstractions; -using MiniExcelLib.Core.Reflection; - -namespace MiniExcelLib.Core.WriteAdapters; +namespace MiniExcelLib.Core.WriteAdapters; internal class DataTableWriteAdapter(DataTable dataTable, MiniExcelBaseConfiguration configuration) : IMiniExcelWriteAdapter { diff --git a/src/MiniExcel.Core/WriteAdapters/EnumerableWriteAdapter.cs b/src/MiniExcel.Core/WriteAdapters/EnumerableWriteAdapter.cs index 8fa60a7e..47a7c1ef 100644 --- a/src/MiniExcel.Core/WriteAdapters/EnumerableWriteAdapter.cs +++ b/src/MiniExcel.Core/WriteAdapters/EnumerableWriteAdapter.cs @@ -1,9 +1,4 @@ -using System.Collections; -using MiniExcelLib.Core.Abstractions; -using MiniExcelLib.Core.Helpers; -using MiniExcelLib.Core.Reflection; - -namespace MiniExcelLib.Core.WriteAdapters; +namespace MiniExcelLib.Core.WriteAdapters; internal class EnumerableWriteAdapter(IEnumerable values, MiniExcelBaseConfiguration configuration) : IMiniExcelWriteAdapter { diff --git a/src/MiniExcel.Core/WriteAdapters/MiniExcelDataReaderWriteAdapter.cs b/src/MiniExcel.Core/WriteAdapters/MiniExcelDataReaderWriteAdapter.cs index 6d99071b..12e73a2e 100644 --- a/src/MiniExcel.Core/WriteAdapters/MiniExcelDataReaderWriteAdapter.cs +++ b/src/MiniExcel.Core/WriteAdapters/MiniExcelDataReaderWriteAdapter.cs @@ -1,8 +1,4 @@ -using System.Runtime.CompilerServices; -using MiniExcelLib.Core.Abstractions; -using MiniExcelLib.Core.Reflection; - -namespace MiniExcelLib.Core.WriteAdapters; +namespace MiniExcelLib.Core.WriteAdapters; internal class MiniExcelDataReaderWriteAdapter(IMiniExcelDataReader reader, MiniExcelBaseConfiguration configuration) : IMiniExcelWriteAdapterAsync { diff --git a/src/MiniExcel.Core/WriteAdapters/MiniExcelWriteAdapterFactory.cs b/src/MiniExcel.Core/WriteAdapters/MiniExcelWriteAdapterFactory.cs index 58bb9704..65552977 100644 --- a/src/MiniExcel.Core/WriteAdapters/MiniExcelWriteAdapterFactory.cs +++ b/src/MiniExcel.Core/WriteAdapters/MiniExcelWriteAdapterFactory.cs @@ -1,9 +1,4 @@ -using System.Collections; -using System.Data; -using MiniExcelLib.Core.Abstractions; -using MiniExcelLib.Core.Helpers; - -namespace MiniExcelLib.Core.WriteAdapters; +namespace MiniExcelLib.Core.WriteAdapters; public static class MiniExcelWriteAdapterFactory { diff --git a/src/MiniExcel.Csv/CsvConfiguration.cs b/src/MiniExcel.Csv/CsvConfiguration.cs index 9f82b4f4..86ec19bd 100644 --- a/src/MiniExcel.Csv/CsvConfiguration.cs +++ b/src/MiniExcel.Csv/CsvConfiguration.cs @@ -1,6 +1,3 @@ -using System.Text; -using MiniExcelLib.Core; - namespace MiniExcelLib.Csv; public class CsvConfiguration : MiniExcelBaseConfiguration diff --git a/src/MiniExcel.Csv/CsvReader.cs b/src/MiniExcel.Csv/CsvReader.cs index 6e949080..dc90893b 100644 --- a/src/MiniExcel.Csv/CsvReader.cs +++ b/src/MiniExcel.Csv/CsvReader.cs @@ -1,12 +1,3 @@ -using System.Runtime.CompilerServices; -using System.Text.RegularExpressions; -using MiniExcelLib.Core; -using MiniExcelLib.Core.Abstractions; -using MiniExcelLib.Core.Exceptions; -using MiniExcelLib.Core.Helpers; -using MiniExcelLib.Core.Reflection; -using Zomp.SyncMethodGenerator; - namespace MiniExcelLib.Csv; internal partial class CsvReader : IMiniExcelReader diff --git a/src/MiniExcel.Csv/CsvWriter.cs b/src/MiniExcel.Csv/CsvWriter.cs index 6a6bb968..aba6fa4e 100644 --- a/src/MiniExcel.Csv/CsvWriter.cs +++ b/src/MiniExcel.Csv/CsvWriter.cs @@ -1,12 +1,4 @@ -using System.Globalization; -using System.Text; -using MiniExcelLib.Core; -using MiniExcelLib.Core.Abstractions; -using MiniExcelLib.Core.Reflection; -using MiniExcelLib.Core.WriteAdapters; -using Zomp.SyncMethodGenerator; - -namespace MiniExcelLib.Csv; +namespace MiniExcelLib.Csv; internal partial class CsvWriter : IMiniExcelWriter, IDisposable { diff --git a/src/MiniExcel.Csv/GlobalUsings.cs b/src/MiniExcel.Csv/GlobalUsings.cs new file mode 100644 index 00000000..c033a44b --- /dev/null +++ b/src/MiniExcel.Csv/GlobalUsings.cs @@ -0,0 +1,17 @@ +// Global using directives + +global using System.Collections; +global using System.Data; +global using System.Dynamic; +global using System.Globalization; +global using System.Runtime.CompilerServices; +global using System.Text; +global using System.Text.RegularExpressions; +global using MiniExcelLib.Core; +global using MiniExcelLib.Core.Abstractions; +global using MiniExcelLib.Core.DataReader; +global using MiniExcelLib.Core.Exceptions; +global using MiniExcelLib.Core.Helpers; +global using MiniExcelLib.Core.Reflection; +global using MiniExcelLib.Core.WriteAdapters; +global using Zomp.SyncMethodGenerator; \ No newline at end of file diff --git a/src/MiniExcel.Csv/MiniExcelExtensions/Exporter.cs b/src/MiniExcel.Csv/MiniExcelExtensions/Exporter.cs index 8f57529d..508bb810 100644 --- a/src/MiniExcel.Csv/MiniExcelExtensions/Exporter.cs +++ b/src/MiniExcel.Csv/MiniExcelExtensions/Exporter.cs @@ -1,9 +1,3 @@ -using System.Collections; -using System.Data; -using MiniExcelLib.Core; -using MiniExcelLib.Core.Helpers; -using Zomp.SyncMethodGenerator; - namespace MiniExcelLib.Csv.MiniExcelExtensions; public static partial class Exporter diff --git a/src/MiniExcel.Csv/MiniExcelExtensions/Importer.cs b/src/MiniExcel.Csv/MiniExcelExtensions/Importer.cs index c8b667a5..f55967ad 100644 --- a/src/MiniExcel.Csv/MiniExcelExtensions/Importer.cs +++ b/src/MiniExcel.Csv/MiniExcelExtensions/Importer.cs @@ -1,11 +1,3 @@ -using System.Data; -using System.Dynamic; -using System.Runtime.CompilerServices; -using MiniExcelLib.Core; -using MiniExcelLib.Core.DataReader; -using MiniExcelLib.Core.Helpers; -using Zomp.SyncMethodGenerator; - namespace MiniExcelLib.Csv.MiniExcelExtensions; public static partial class Importer diff --git a/tests/MiniExcelTests/GlobalUsings.cs b/tests/MiniExcelTests/GlobalUsings.cs new file mode 100644 index 00000000..e7541124 --- /dev/null +++ b/tests/MiniExcelTests/GlobalUsings.cs @@ -0,0 +1,21 @@ +// Global using directives + +global using System.Data; +global using System.Data.SQLite; +global using System.Diagnostics; +global using System.Globalization; +global using System.IO.Compression; +global using System.Security.AccessControl; +global using System.Security.Principal; +global using System.Text; +global using Dapper; +global using MiniExcelLib.Core; +global using MiniExcelLib.Core.Attributes; +global using MiniExcelLib.Core.OpenXml; +global using MiniExcelLib.Core.OpenXml.Picture; +global using MiniExcelLib.Csv; +global using MiniExcelLib.Csv.MiniExcelExtensions; +global using MiniExcelLib.Tests.Utils; +global using OfficeOpenXml; +global using Xunit; +global using Xunit.Abstractions; \ No newline at end of file diff --git a/tests/MiniExcelTests/MiniExcelAutoAdjustWidthTests.cs b/tests/MiniExcelTests/MiniExcelAutoAdjustWidthTests.cs index 55eaee4a..21edc78e 100644 --- a/tests/MiniExcelTests/MiniExcelAutoAdjustWidthTests.cs +++ b/tests/MiniExcelTests/MiniExcelAutoAdjustWidthTests.cs @@ -1,12 +1,6 @@ -using System.Data; -using System.Data.SQLite; -using DocumentFormat.OpenXml.Packaging; +using DocumentFormat.OpenXml.Packaging; using DocumentFormat.OpenXml.Spreadsheet; -using MiniExcelLib.Core; -using MiniExcelLib.Core.OpenXml; using MiniExcelLib.Core.OpenXml.Models; -using MiniExcelLib.Tests.Utils; -using Xunit; namespace MiniExcelLib.Tests; diff --git a/tests/MiniExcelTests/MiniExcelCsvAsycTests.cs b/tests/MiniExcelTests/MiniExcelCsvAsycTests.cs index 4cbff294..9f8636d9 100644 --- a/tests/MiniExcelTests/MiniExcelCsvAsycTests.cs +++ b/tests/MiniExcelTests/MiniExcelCsvAsycTests.cs @@ -1,12 +1,4 @@ -using System.Data; -using System.Globalization; -using System.Text; -using MiniExcelLib.Core; -using MiniExcelLib.Csv; -using MiniExcelLib.Csv.MiniExcelExtensions; -using MiniExcelLib.Tests.Utils; -using Xunit; -using CsvReader = CsvHelper.CsvReader; +using CsvReader = CsvHelper.CsvReader; namespace MiniExcelLib.Tests; diff --git a/tests/MiniExcelTests/MiniExcelCsvTests.cs b/tests/MiniExcelTests/MiniExcelCsvTests.cs index 14eca59e..cc2f2ff1 100644 --- a/tests/MiniExcelTests/MiniExcelCsvTests.cs +++ b/tests/MiniExcelTests/MiniExcelCsvTests.cs @@ -1,14 +1,5 @@ -using System.Data; -using System.Globalization; -using System.Text; -using CsvHelper; -using MiniExcelLib.Core; -using MiniExcelLib.Core.Attributes; +using CsvHelper; using MiniExcelLib.Core.Exceptions; -using MiniExcelLib.Csv; -using MiniExcelLib.Csv.MiniExcelExtensions; -using MiniExcelLib.Tests.Utils; -using Xunit; namespace MiniExcelLib.Tests; diff --git a/tests/MiniExcelTests/MiniExcelIssueAsyncTests.cs b/tests/MiniExcelTests/MiniExcelIssueAsyncTests.cs index c537b067..08cbac45 100644 --- a/tests/MiniExcelTests/MiniExcelIssueAsyncTests.cs +++ b/tests/MiniExcelTests/MiniExcelIssueAsyncTests.cs @@ -1,18 +1,4 @@ -using System.Data; -using System.Data.SQLite; -using System.Globalization; -using System.Text; -using Dapper; -using MiniExcelLib.Core; -using MiniExcelLib.Core.Attributes; -using MiniExcelLib.Core.OpenXml; -using MiniExcelLib.Csv; -using MiniExcelLib.Csv.MiniExcelExtensions; -using MiniExcelLib.Tests.Utils; -using Newtonsoft.Json; -using OfficeOpenXml; -using Xunit; -using Xunit.Abstractions; +using Newtonsoft.Json; namespace MiniExcelLib.Tests; diff --git a/tests/MiniExcelTests/MiniExcelIssueTests.cs b/tests/MiniExcelTests/MiniExcelIssueTests.cs index 294f1eaf..07a10dc6 100644 --- a/tests/MiniExcelTests/MiniExcelIssueTests.cs +++ b/tests/MiniExcelTests/MiniExcelIssueTests.cs @@ -1,25 +1,10 @@ using System.Collections; using System.ComponentModel; -using System.Data; -using System.Data.SQLite; -using System.Globalization; -using System.Text; using System.Text.RegularExpressions; -using Dapper; -using MiniExcelLib.Core; -using MiniExcelLib.Core.Attributes; using MiniExcelLib.Core.Exceptions; -using MiniExcelLib.Core.OpenXml; -using MiniExcelLib.Core.OpenXml.Picture; using MiniExcelLib.Core.OpenXml.Utils; -using MiniExcelLib.Csv; -using MiniExcelLib.Csv.MiniExcelExtensions; -using MiniExcelLib.Tests.Utils; using Newtonsoft.Json; using NPOI.XSSF.UserModel; -using OfficeOpenXml; -using Xunit; -using Xunit.Abstractions; namespace MiniExcelLib.Tests; diff --git a/tests/MiniExcelTests/MiniExcelOpenXmlAsyncTests.cs b/tests/MiniExcelTests/MiniExcelOpenXmlAsyncTests.cs index afe81395..2c8a49bf 100644 --- a/tests/MiniExcelTests/MiniExcelOpenXmlAsyncTests.cs +++ b/tests/MiniExcelTests/MiniExcelOpenXmlAsyncTests.cs @@ -1,18 +1,7 @@ -using System.Data; -using System.Data.SQLite; -using System.Globalization; -using System.IO.Packaging; -using System.Text; +using System.IO.Packaging; using ClosedXML.Excel; -using Dapper; using ExcelDataReader; -using MiniExcelLib.Core; using MiniExcelLib.Core.Abstractions; -using MiniExcelLib.Core.Attributes; -using MiniExcelLib.Core.OpenXml; -using MiniExcelLib.Tests.Utils; -using OfficeOpenXml; -using Xunit; namespace MiniExcelLib.Tests; diff --git a/tests/MiniExcelTests/MiniExcelOpenXmlConfigurationTest.cs b/tests/MiniExcelTests/MiniExcelOpenXmlConfigurationTest.cs index 7110c973..9793e786 100644 --- a/tests/MiniExcelTests/MiniExcelOpenXmlConfigurationTest.cs +++ b/tests/MiniExcelTests/MiniExcelOpenXmlConfigurationTest.cs @@ -1,10 +1,4 @@ -using MiniExcelLib.Core; -using MiniExcelLib.Core.Attributes; using MiniExcelLib.Core.Helpers; -using MiniExcelLib.Core.OpenXml; -using MiniExcelLib.Csv.MiniExcelExtensions; -using MiniExcelLib.Tests.Utils; -using Xunit; namespace MiniExcelLib.Tests; diff --git a/tests/MiniExcelTests/MiniExcelOpenXmlMultipleSheetAsyncTests.cs b/tests/MiniExcelTests/MiniExcelOpenXmlMultipleSheetAsyncTests.cs index 7ec896cf..f0d88122 100644 --- a/tests/MiniExcelTests/MiniExcelOpenXmlMultipleSheetAsyncTests.cs +++ b/tests/MiniExcelTests/MiniExcelOpenXmlMultipleSheetAsyncTests.cs @@ -1,7 +1,4 @@ -using MiniExcelLib.Core; -using Xunit; - -namespace MiniExcelLib.Tests; +namespace MiniExcelLib.Tests; public class MiniExcelOpenXmlMultipleSheetAsyncTests { diff --git a/tests/MiniExcelTests/MiniExcelOpenXmlMultipleSheetTests.cs b/tests/MiniExcelTests/MiniExcelOpenXmlMultipleSheetTests.cs index 70faa62e..622cae51 100644 --- a/tests/MiniExcelTests/MiniExcelOpenXmlMultipleSheetTests.cs +++ b/tests/MiniExcelTests/MiniExcelOpenXmlMultipleSheetTests.cs @@ -1,9 +1,5 @@ -using MiniExcelLib.Core; -using MiniExcelLib.Core.OpenXml; -using MiniExcelLib.Core.OpenXml.Attributes; +using MiniExcelLib.Core.OpenXml.Attributes; using MiniExcelLib.Core.OpenXml.Models; -using MiniExcelLib.Tests.Utils; -using Xunit; namespace MiniExcelLib.Tests; diff --git a/tests/MiniExcelTests/MiniExcelOpenXmlTests.cs b/tests/MiniExcelTests/MiniExcelOpenXmlTests.cs index ceea3d1f..692371d8 100644 --- a/tests/MiniExcelTests/MiniExcelOpenXmlTests.cs +++ b/tests/MiniExcelTests/MiniExcelOpenXmlTests.cs @@ -1,20 +1,7 @@ -using System.Data; -using System.Data.SQLite; -using System.Diagnostics; -using System.Globalization; -using System.IO.Packaging; -using System.Text; +using System.IO.Packaging; using ClosedXML.Excel; -using Dapper; using ExcelDataReader; -using MiniExcelLib.Core; -using MiniExcelLib.Core.Attributes; -using MiniExcelLib.Core.OpenXml; using MiniExcelLib.Core.OpenXml.Utils; -using MiniExcelLib.Tests.Utils; -using OfficeOpenXml; -using Xunit; -using Xunit.Abstractions; namespace MiniExcelLib.Tests; diff --git a/tests/MiniExcelTests/SaveByTemplate/InputValueExtractorTests.cs b/tests/MiniExcelTests/SaveByTemplate/InputValueExtractorTests.cs index 54d4fe92..e5df32a9 100644 --- a/tests/MiniExcelTests/SaveByTemplate/InputValueExtractorTests.cs +++ b/tests/MiniExcelTests/SaveByTemplate/InputValueExtractorTests.cs @@ -1,6 +1,4 @@ -using System.Data; using MiniExcelLib.Core.OpenXml.Templates; -using Xunit; namespace MiniExcelLib.Tests.SaveByTemplate; diff --git a/tests/MiniExcelTests/SaveByTemplate/MiniExcelTemplateAsyncTests.cs b/tests/MiniExcelTests/SaveByTemplate/MiniExcelTemplateAsyncTests.cs index 36b1ac18..d8bffde4 100644 --- a/tests/MiniExcelTests/SaveByTemplate/MiniExcelTemplateAsyncTests.cs +++ b/tests/MiniExcelTests/SaveByTemplate/MiniExcelTemplateAsyncTests.cs @@ -1,10 +1,4 @@ -using System.Data; -using Dapper; -using MiniExcelLib.Core; -using MiniExcelLib.Tests.Utils; -using Xunit; - -namespace MiniExcelLib.Tests.SaveByTemplate; +namespace MiniExcelLib.Tests.SaveByTemplate; public class MiniExcelTemplateAsyncTests { diff --git a/tests/MiniExcelTests/SaveByTemplate/MiniExcelTemplateTests.cs b/tests/MiniExcelTests/SaveByTemplate/MiniExcelTemplateTests.cs index d242cd35..581d960d 100644 --- a/tests/MiniExcelTests/SaveByTemplate/MiniExcelTemplateTests.cs +++ b/tests/MiniExcelTests/SaveByTemplate/MiniExcelTemplateTests.cs @@ -1,13 +1,5 @@ -using System.Data; -using System.IO.Compression; -using Dapper; -using MiniExcelLib.Core; using MiniExcelLib.Core.Enums; -using MiniExcelLib.Core.OpenXml.Picture; -using MiniExcelLib.Tests.Utils; -using OfficeOpenXml; using OfficeOpenXml.Drawing; -using Xunit; namespace MiniExcelLib.Tests.SaveByTemplate; diff --git a/tests/MiniExcelTests/Utils/Db.cs b/tests/MiniExcelTests/Utils/Db.cs index 983b2339..a99ee8f6 100644 --- a/tests/MiniExcelTests/Utils/Db.cs +++ b/tests/MiniExcelTests/Utils/Db.cs @@ -1,7 +1,4 @@ -using System.Data.SQLite; -using System.Text; - -namespace MiniExcelLib.Tests.Utils; +namespace MiniExcelLib.Tests.Utils; internal static class Db { diff --git a/tests/MiniExcelTests/Utils/EpplusLicense.cs b/tests/MiniExcelTests/Utils/EpplusLicense.cs index 4b39459e..6b9f4c81 100644 --- a/tests/MiniExcelTests/Utils/EpplusLicense.cs +++ b/tests/MiniExcelTests/Utils/EpplusLicense.cs @@ -1,5 +1,3 @@ -using OfficeOpenXml; - namespace MiniExcelLib.Tests.Utils; internal static class EpplusLicence diff --git a/tests/MiniExcelTests/Utils/Helpers.cs b/tests/MiniExcelTests/Utils/Helpers.cs index f19903c4..cc9d03ca 100644 --- a/tests/MiniExcelTests/Utils/Helpers.cs +++ b/tests/MiniExcelTests/Utils/Helpers.cs @@ -1,6 +1,4 @@ -using System.IO.Compression; -using System.Text; -using System.Xml; +using System.Xml; using System.Xml.Linq; using System.Xml.XPath; From d579a6b22c6207e41ee79069ceb9cd01645a0deb Mon Sep 17 00:00:00 2001 From: Michele Bastione Date: Sun, 6 Jul 2025 21:04:10 +0200 Subject: [PATCH 07/26] Updating directory.build.props target framework after rebasing --- MiniExcel.slnx | 6 ++++++ src/Directory.Build.props | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/MiniExcel.slnx b/MiniExcel.slnx index 55756c68..a33abc26 100644 --- a/MiniExcel.slnx +++ b/MiniExcel.slnx @@ -1,7 +1,9 @@  + + @@ -16,17 +18,21 @@ + + + + \ No newline at end of file diff --git a/src/Directory.Build.props b/src/Directory.Build.props index aeea3ecb..626bbb1f 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -1,7 +1,7 @@ - netstandard2.0;net8.0;net9.0 + netstandard2.0;net8.0;net10.0 2.0.0-beta.1 enable enable From 61d9f0a922a1c08e24b88a6defb4f8e5afedb4c3 Mon Sep 17 00:00:00 2001 From: Michele Bastione Date: Sun, 6 Jul 2025 22:02:30 +0200 Subject: [PATCH 08/26] Removing facade assembly, renaming MiniExcel.Core project to MiniExcel --- MiniExcel.slnx | 7 -- .../BenchmarkSections/CreateXlsxBenchmark.cs | 1 - .../BenchmarkSections/QueryXlsxBenchmark.cs | 1 - .../TemplateXlsxBenchmark.cs | 1 - .../BenchmarkSections/XlsxAsyncBenchmark.cs | 1 - .../MiniExcel.Benchmarks.csproj | 1 - src/MiniExcel.Core/GlobalUsings.cs | 22 ---- src/MiniExcel.Core/MiniExcel.Core.csproj | 11 -- src/MiniExcel.Csv/CsvReader.cs | 6 ++ src/MiniExcel.Csv/CsvWriter.cs | 7 +- src/MiniExcel.Csv/GlobalUsings.cs | 11 +- src/MiniExcel.Csv/MiniExcel.Csv.csproj | 2 +- .../MiniExcelExtensions/Exporter.cs | 2 + .../MiniExcelExtensions/Importer.cs | 3 + .../Abstractions/IInputValueExtractor.cs | 2 +- .../Abstractions/IMiniExcelDataReader.cs | 2 +- .../Abstractions/IMiniExcelReader.cs | 2 +- .../Abstractions/IMiniExcelTemplate.cs | 2 +- .../Abstractions/IMiniExcelWriteAdapter.cs | 4 +- .../IMiniExcelWriteAdapterAsync.cs | 4 +- .../Abstractions/IMiniExcelWriter.cs | 2 +- .../Attributes/MiniExcelColumnAttribute.cs | 4 +- .../MiniExcelColumnIndexAttribute.cs | 4 +- .../MiniExcelColumnNameAttribute.cs | 2 +- .../MiniExcelColumnWidthAttribute.cs | 2 +- .../Attributes/MiniExcelFormatAttribute.cs | 2 +- .../Attributes/MiniExcelIgnoreAttribute.cs | 2 +- .../DataReader/MiniExcelAsyncDataReader.cs | 2 +- .../DataReader/MiniExcelDataReader.cs | 2 +- .../DataReader/MiniExcelDataReaderBase.cs | 4 +- .../Enums/XlsxImgType.cs | 2 +- .../MiniExcelColumnNotFoundException.cs | 2 +- .../MiniExcelInvalidCastException.cs | 2 +- src/MiniExcel/GlobalUsings.cs | 17 +++ .../Helpers/AttributeExtension.cs | 2 +- .../Helpers/ColumnHelper.cs | 2 +- .../Helpers/FileHelper.cs | 2 +- .../Helpers/ImageHelper.cs | 2 +- .../Helpers/ListHelper.cs | 2 +- .../Helpers/SafeStreamWriter.cs | 2 +- .../Helpers/StringHelper.cs | 2 +- .../Helpers/TaskHelper.cs | 2 +- .../Helpers/ThrowHelper.cs | 2 +- .../Helpers/TypeHelper.cs | 2 +- .../Helpers/XmlHelper.cs | 2 +- src/MiniExcel/MiniExcel.cs | 2 - src/MiniExcel/MiniExcel.csproj | 67 ++++++------ .../MiniExcelConfiguration.cs | 4 +- .../MiniExcelExporter.cs | 5 +- .../MiniExcelImporter.cs | 11 +- .../MiniExcelTemplater.cs | 4 +- .../OpenXml/Attributes/ExcelSheetAttribute.cs | 4 +- .../OpenXml/Constants/ExcelContentTypes.cs | 2 +- .../OpenXml/Constants/ExcelFileNames.cs | 2 +- .../OpenXml/Constants/ExcelXml.cs | 5 +- .../OpenXml/Constants/Schemas.cs | 2 +- .../OpenXml/Constants/WorksheetXml.cs | 4 +- .../OpenXml/Models/DrawingDto.cs | 2 +- .../OpenXml/Models/ExcelRange.cs | 2 +- .../OpenXml/Models/ExcelWidthCollection.cs | 4 +- .../OpenXml/Models/ExcellSheetInfo.cs | 2 +- .../OpenXml/Models/FileDto.cs | 2 +- .../OpenXml/Models/MergeCells.cs | 2 +- .../OpenXml/Models/SheetDto.cs | 2 +- .../OpenXml/Models/SheetInfo.cs | 2 +- .../OpenXml/Models/SheetRecord.cs | 2 +- .../OpenXml/OpenXmlConfiguration.cs | 4 +- .../OpenXml/OpenXmlReader.cs | 13 ++- .../OpenXml/OpenXmlStyleOptions.cs | 2 +- .../OpenXml/OpenXmlStyles.cs | 6 +- .../OpenXml/OpenXmlWriter.DefaultOpenXml.cs | 13 ++- .../OpenXml/OpenXmlWriter.cs | 17 ++- .../OpenXml/Picture/OpenXmlPicture.cs | 4 +- .../Picture/OpenXmlPictureImplement.cs | 8 +- .../Styles/DefaultSheetStyleBuilder.cs | 2 +- .../OpenXml/Styles/ISheetStyleBuilder.cs | 2 +- .../Styles/MinimalSheetStyleBuilder.cs | 2 +- .../OpenXml/Styles/SheetStyleBuildContext.cs | 7 +- .../OpenXml/Styles/SheetStyleBuildResult.cs | 2 +- .../OpenXml/Styles/SheetStyleBuilderBase.cs | 2 +- .../OpenXml/Styles/SheetStyleBuilderHelper.cs | 5 +- .../OpenXml/Styles/SheetStyleElementInfos.cs | 2 +- .../OpenXml/Templates/OpenXmlTemplate.Impl.cs | 8 +- .../Templates/OpenXmlTemplate.MergeCells.cs | 4 +- .../OpenXml/Templates/OpenXmlTemplate.cs | 8 +- .../Templates/OpenXmlValueExtractor.cs | 5 +- .../OpenXml/Utils/CalcChainHelper.cs | 2 +- .../OpenXml/Utils/DateTimeHelper.cs | 2 +- .../OpenXml/Utils/GeneralHelper.cs | 2 +- .../OpenXml/Utils/MiniExcelPropertyHelper.cs | 5 +- .../Utils/OpenXmlNumberFormatHelper.cs | 2 +- .../OpenXml/Utils/ReferenceHelper.cs | 2 +- .../OpenXml/Utils/SharedStringsDiskCache.cs | 2 +- .../OpenXml/Utils/XmlReaderHelper.cs | 4 +- .../OpenXml/Zip/MiniExcelZipArchive.cs | 2 +- .../OpenXml/Zip/OpenXmlZip.cs | 2 +- .../OpenXml/Zip/ZipPackageInfo.cs | 2 +- .../Properties/AssemblyInfo.cs | 0 .../Reflection/CustomPropertyHelper.cs | 4 +- .../Reflection/MemberGetter.cs | 2 +- .../Reflection/MemberSetter.cs | 2 +- .../Reflection/MiniExcelColumnInfo.cs | 4 +- .../Reflection/MiniExcelMapper.cs | 6 +- .../Reflection/MiniExcelProperty.cs | 2 +- .../AsyncEnumerableWriteAdapter.cs | 5 +- .../WriteAdapters/DataReaderWriteAdapter.cs | 5 +- .../WriteAdapters/DataTableWriteAdapter.cs | 5 +- .../WriteAdapters/EnumerableWriteAdapter.cs | 6 +- .../MiniExcelDataReaderWriteAdapter.cs | 5 +- .../MiniExcelWriteAdapterFactory.cs | 5 +- src/{MiniExcel.Core => MiniExcel}/icon.png | Bin .../miniexcel.publickey | Bin tests/MiniExcelTests/GlobalUsings.cs | 6 +- .../MiniExcelAutoAdjustWidthTests.cs | 2 +- tests/MiniExcelTests/MiniExcelCsvTests.cs | 3 +- .../MiniExcelIssueAsyncTests.cs | 17 +-- tests/MiniExcelTests/MiniExcelIssueTests.cs | 98 +++++++++--------- .../MiniExcelOpenXmlAsyncTests.cs | 48 +++++---- .../MiniExcelOpenXmlConfigurationTest.cs | 3 +- .../MiniExcelOpenXmlMultipleSheetTests.cs | 4 +- tests/MiniExcelTests/MiniExcelOpenXmlTests.cs | 47 +++++---- tests/MiniExcelTests/MiniExcelTests.csproj | 3 +- .../InputValueExtractorTests.cs | 2 +- .../MiniExcelTemplateAsyncTests.cs | 54 +++++----- .../SaveByTemplate/MiniExcelTemplateTests.cs | 53 +++++----- .../Utils/{Helpers.cs => SheetHelper.cs} | 5 +- 126 files changed, 465 insertions(+), 369 deletions(-) delete mode 100644 src/MiniExcel.Core/GlobalUsings.cs delete mode 100644 src/MiniExcel.Core/MiniExcel.Core.csproj rename src/{MiniExcel.Core => MiniExcel}/Abstractions/IInputValueExtractor.cs (73%) rename src/{MiniExcel.Core => MiniExcel}/Abstractions/IMiniExcelDataReader.cs (88%) rename src/{MiniExcel.Core => MiniExcel}/Abstractions/IMiniExcelReader.cs (95%) rename src/{MiniExcel.Core => MiniExcel}/Abstractions/IMiniExcelTemplate.cs (90%) rename src/{MiniExcel.Core => MiniExcel}/Abstractions/IMiniExcelWriteAdapter.cs (85%) rename src/{MiniExcel.Core => MiniExcel}/Abstractions/IMiniExcelWriteAdapterAsync.cs (75%) rename src/{MiniExcel.Core => MiniExcel}/Abstractions/IMiniExcelWriter.cs (83%) rename src/{MiniExcel.Core => MiniExcel}/Attributes/MiniExcelColumnAttribute.cs (91%) rename src/{MiniExcel.Core => MiniExcel}/Attributes/MiniExcelColumnIndexAttribute.cs (90%) rename src/{MiniExcel.Core => MiniExcel}/Attributes/MiniExcelColumnNameAttribute.cs (86%) rename src/{MiniExcel.Core => MiniExcel}/Attributes/MiniExcelColumnWidthAttribute.cs (81%) rename src/{MiniExcel.Core => MiniExcel}/Attributes/MiniExcelFormatAttribute.cs (79%) rename src/{MiniExcel.Core => MiniExcel}/Attributes/MiniExcelIgnoreAttribute.cs (80%) rename src/{MiniExcel.Core => MiniExcel}/DataReader/MiniExcelAsyncDataReader.cs (95%) rename src/{MiniExcel.Core => MiniExcel}/DataReader/MiniExcelDataReader.cs (94%) rename src/{MiniExcel.Core => MiniExcel}/DataReader/MiniExcelDataReaderBase.cs (95%) rename src/{MiniExcel.Core => MiniExcel}/Enums/XlsxImgType.cs (91%) rename src/{MiniExcel.Core => MiniExcel}/Exceptions/MiniExcelColumnNotFoundException.cs (90%) rename src/{MiniExcel.Core => MiniExcel}/Exceptions/MiniExcelInvalidCastException.cs (87%) create mode 100644 src/MiniExcel/GlobalUsings.cs rename src/{MiniExcel.Core => MiniExcel}/Helpers/AttributeExtension.cs (94%) rename src/{MiniExcel.Core => MiniExcel}/Helpers/ColumnHelper.cs (95%) rename src/{MiniExcel.Core => MiniExcel}/Helpers/FileHelper.cs (78%) rename src/{MiniExcel.Core => MiniExcel}/Helpers/ImageHelper.cs (93%) rename src/{MiniExcel.Core => MiniExcel}/Helpers/ListHelper.cs (88%) rename src/{MiniExcel.Core => MiniExcel}/Helpers/SafeStreamWriter.cs (94%) rename src/{MiniExcel.Core => MiniExcel}/Helpers/StringHelper.cs (83%) rename src/{MiniExcel.Core => MiniExcel}/Helpers/TaskHelper.cs (90%) rename src/{MiniExcel.Core => MiniExcel}/Helpers/ThrowHelper.cs (91%) rename src/{MiniExcel.Core => MiniExcel}/Helpers/TypeHelper.cs (94%) rename src/{MiniExcel.Core => MiniExcel}/Helpers/XmlHelper.cs (95%) rename src/{MiniExcel.Core => MiniExcel}/MiniExcelConfiguration.cs (87%) rename src/{MiniExcel.Core => MiniExcel}/MiniExcelExporter.cs (95%) rename src/{MiniExcel.Core => MiniExcel}/MiniExcelImporter.cs (95%) rename src/{MiniExcel.Core => MiniExcel}/MiniExcelTemplater.cs (95%) rename src/{MiniExcel.Core => MiniExcel}/OpenXml/Attributes/ExcelSheetAttribute.cs (76%) rename src/{MiniExcel.Core => MiniExcel}/OpenXml/Constants/ExcelContentTypes.cs (92%) rename src/{MiniExcel.Core => MiniExcel}/OpenXml/Constants/ExcelFileNames.cs (91%) rename src/{MiniExcel.Core => MiniExcel}/OpenXml/Constants/ExcelXml.cs (96%) rename src/{MiniExcel.Core => MiniExcel}/OpenXml/Constants/Schemas.cs (91%) rename src/{MiniExcel.Core => MiniExcel}/OpenXml/Constants/WorksheetXml.cs (96%) rename src/{MiniExcel.Core => MiniExcel}/OpenXml/Models/DrawingDto.cs (64%) rename src/{MiniExcel.Core => MiniExcel}/OpenXml/Models/ExcelRange.cs (91%) rename src/{MiniExcel.Core => MiniExcel}/OpenXml/Models/ExcelWidthCollection.cs (93%) rename src/{MiniExcel.Core => MiniExcel}/OpenXml/Models/ExcellSheetInfo.cs (88%) rename src/{MiniExcel.Core => MiniExcel}/OpenXml/Models/FileDto.cs (88%) rename src/{MiniExcel.Core => MiniExcel}/OpenXml/Models/MergeCells.cs (77%) rename src/{MiniExcel.Core => MiniExcel}/OpenXml/Models/SheetDto.cs (82%) rename src/{MiniExcel.Core => MiniExcel}/OpenXml/Models/SheetInfo.cs (91%) rename src/{MiniExcel.Core => MiniExcel}/OpenXml/Models/SheetRecord.cs (92%) rename src/{MiniExcel.Core => MiniExcel}/OpenXml/OpenXmlConfiguration.cs (92%) rename src/{MiniExcel.Core => MiniExcel}/OpenXml/OpenXmlReader.cs (96%) rename src/{MiniExcel.Core => MiniExcel}/OpenXml/OpenXmlStyleOptions.cs (66%) rename src/{MiniExcel.Core => MiniExcel}/OpenXml/OpenXmlStyles.cs (96%) rename src/{MiniExcel.Core => MiniExcel}/OpenXml/OpenXmlWriter.DefaultOpenXml.cs (94%) rename src/{MiniExcel.Core => MiniExcel}/OpenXml/OpenXmlWriter.cs (96%) rename src/{MiniExcel.Core => MiniExcel}/OpenXml/Picture/OpenXmlPicture.cs (85%) rename src/{MiniExcel.Core => MiniExcel}/OpenXml/Picture/OpenXmlPictureImplement.cs (97%) rename src/{MiniExcel.Core => MiniExcel}/OpenXml/Styles/DefaultSheetStyleBuilder.cs (98%) rename src/{MiniExcel.Core => MiniExcel}/OpenXml/Styles/ISheetStyleBuilder.cs (78%) rename src/{MiniExcel.Core => MiniExcel}/OpenXml/Styles/MinimalSheetStyleBuilder.cs (97%) rename src/{MiniExcel.Core => MiniExcel}/OpenXml/Styles/SheetStyleBuildContext.cs (96%) rename src/{MiniExcel.Core => MiniExcel}/OpenXml/Styles/SheetStyleBuildResult.cs (79%) rename src/{MiniExcel.Core => MiniExcel}/OpenXml/Styles/SheetStyleBuilderBase.cs (97%) rename src/{MiniExcel.Core => MiniExcel}/OpenXml/Styles/SheetStyleBuilderHelper.cs (83%) rename src/{MiniExcel.Core => MiniExcel}/OpenXml/Styles/SheetStyleElementInfos.cs (89%) rename src/{MiniExcel.Core => MiniExcel}/OpenXml/Templates/OpenXmlTemplate.Impl.cs (97%) rename src/{MiniExcel.Core => MiniExcel}/OpenXml/Templates/OpenXmlTemplate.MergeCells.cs (95%) rename src/{MiniExcel.Core => MiniExcel}/OpenXml/Templates/OpenXmlTemplate.cs (94%) rename src/{MiniExcel.Core => MiniExcel}/OpenXml/Templates/OpenXmlValueExtractor.cs (90%) rename src/{MiniExcel.Core => MiniExcel}/OpenXml/Utils/CalcChainHelper.cs (95%) rename src/{MiniExcel.Core => MiniExcel}/OpenXml/Utils/DateTimeHelper.cs (91%) rename src/{MiniExcel.Core => MiniExcel}/OpenXml/Utils/GeneralHelper.cs (93%) rename src/{MiniExcel.Core => MiniExcel}/OpenXml/Utils/MiniExcelPropertyHelper.cs (89%) rename src/{MiniExcel.Core => MiniExcel}/OpenXml/Utils/OpenXmlNumberFormatHelper.cs (96%) rename src/{MiniExcel.Core => MiniExcel}/OpenXml/Utils/ReferenceHelper.cs (95%) rename src/{MiniExcel.Core => MiniExcel}/OpenXml/Utils/SharedStringsDiskCache.cs (95%) rename src/{MiniExcel.Core => MiniExcel}/OpenXml/Utils/XmlReaderHelper.cs (95%) rename src/{MiniExcel.Core => MiniExcel}/OpenXml/Zip/MiniExcelZipArchive.cs (85%) rename src/{MiniExcel.Core => MiniExcel}/OpenXml/Zip/OpenXmlZip.cs (94%) rename src/{MiniExcel.Core => MiniExcel}/OpenXml/Zip/ZipPackageInfo.cs (82%) rename src/{MiniExcel.Core => MiniExcel}/Properties/AssemblyInfo.cs (100%) rename src/{MiniExcel.Core => MiniExcel}/Reflection/CustomPropertyHelper.cs (96%) rename src/{MiniExcel.Core => MiniExcel}/Reflection/MemberGetter.cs (92%) rename src/{MiniExcel.Core => MiniExcel}/Reflection/MemberSetter.cs (93%) rename src/{MiniExcel.Core => MiniExcel}/Reflection/MiniExcelColumnInfo.cs (89%) rename src/{MiniExcel.Core => MiniExcel}/Reflection/MiniExcelMapper.cs (96%) rename src/{MiniExcel.Core => MiniExcel}/Reflection/MiniExcelProperty.cs (93%) rename src/{MiniExcel.Core => MiniExcel}/WriteAdapters/AsyncEnumerableWriteAdapter.cs (93%) rename src/{MiniExcel.Core => MiniExcel}/WriteAdapters/DataReaderWriteAdapter.cs (92%) rename src/{MiniExcel.Core => MiniExcel}/WriteAdapters/DataTableWriteAdapter.cs (90%) rename src/{MiniExcel.Core => MiniExcel}/WriteAdapters/EnumerableWriteAdapter.cs (92%) rename src/{MiniExcel.Core => MiniExcel}/WriteAdapters/MiniExcelDataReaderWriteAdapter.cs (93%) rename src/{MiniExcel.Core => MiniExcel}/WriteAdapters/MiniExcelWriteAdapterFactory.cs (90%) rename src/{MiniExcel.Core => MiniExcel}/icon.png (100%) rename src/{MiniExcel.Core => MiniExcel}/miniexcel.publickey (100%) rename tests/MiniExcelTests/Utils/{Helpers.cs => SheetHelper.cs} (94%) diff --git a/MiniExcel.slnx b/MiniExcel.slnx index a33abc26..353b5425 100644 --- a/MiniExcel.slnx +++ b/MiniExcel.slnx @@ -1,9 +1,7 @@  - - @@ -18,21 +16,16 @@ - - - - - \ No newline at end of file diff --git a/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/CreateXlsxBenchmark.cs b/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/CreateXlsxBenchmark.cs index 0b425777..2d3133ba 100644 --- a/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/CreateXlsxBenchmark.cs +++ b/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/CreateXlsxBenchmark.cs @@ -5,7 +5,6 @@ using DocumentFormat.OpenXml.Packaging; using DocumentFormat.OpenXml.Spreadsheet; using MiniExcelLib.Benchmarks.Utils; -using MiniExcelLib.Core; using NPOI.XSSF.UserModel; using OfficeOpenXml; diff --git a/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/QueryXlsxBenchmark.cs b/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/QueryXlsxBenchmark.cs index e834c31a..84dcd199 100644 --- a/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/QueryXlsxBenchmark.cs +++ b/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/QueryXlsxBenchmark.cs @@ -4,7 +4,6 @@ using DocumentFormat.OpenXml.Packaging; using DocumentFormat.OpenXml.Spreadsheet; using ExcelDataReader; -using MiniExcelLib.Core; using NPOI.XSSF.UserModel; using OfficeOpenXml; diff --git a/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/TemplateXlsxBenchmark.cs b/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/TemplateXlsxBenchmark.cs index d8755933..97f26a31 100644 --- a/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/TemplateXlsxBenchmark.cs +++ b/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/TemplateXlsxBenchmark.cs @@ -1,7 +1,6 @@ using BenchmarkDotNet.Attributes; using ClosedXML.Report; using MiniExcelLib.Benchmarks.Utils; -using MiniExcelLib.Core; namespace MiniExcelLib.Benchmarks.BenchmarkSections; diff --git a/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/XlsxAsyncBenchmark.cs b/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/XlsxAsyncBenchmark.cs index ab026ef6..068ecedc 100644 --- a/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/XlsxAsyncBenchmark.cs +++ b/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/XlsxAsyncBenchmark.cs @@ -1,6 +1,5 @@ using BenchmarkDotNet.Attributes; using MiniExcelLib.Benchmarks.Utils; -using MiniExcelLib.Core; namespace MiniExcelLib.Benchmarks.BenchmarkSections; diff --git a/benchmarks/MiniExcel.Benchmarks/MiniExcel.Benchmarks.csproj b/benchmarks/MiniExcel.Benchmarks/MiniExcel.Benchmarks.csproj index eb8f5230..26f1d19a 100644 --- a/benchmarks/MiniExcel.Benchmarks/MiniExcel.Benchmarks.csproj +++ b/benchmarks/MiniExcel.Benchmarks/MiniExcel.Benchmarks.csproj @@ -35,7 +35,6 @@ - diff --git a/src/MiniExcel.Core/GlobalUsings.cs b/src/MiniExcel.Core/GlobalUsings.cs deleted file mode 100644 index c58f3456..00000000 --- a/src/MiniExcel.Core/GlobalUsings.cs +++ /dev/null @@ -1,22 +0,0 @@ -// Global using directives - -global using System.Collections; -global using System.Data; -global using System.Globalization; -global using System.IO.Compression; -global using System.Reflection; -global using System.Runtime.CompilerServices; -global using System.Text; -global using System.Text.RegularExpressions; -global using System.Xml; -global using MiniExcelLib.Core.Abstractions; -global using MiniExcelLib.Core.Attributes; -global using MiniExcelLib.Core.Enums; -global using MiniExcelLib.Core.Helpers; -global using MiniExcelLib.Core.OpenXml; -global using MiniExcelLib.Core.OpenXml.Constants; -global using MiniExcelLib.Core.OpenXml.Models; -global using MiniExcelLib.Core.OpenXml.Utils; -global using MiniExcelLib.Core.OpenXml.Zip; -global using MiniExcelLib.Core.Reflection; -global using Zomp.SyncMethodGenerator; \ No newline at end of file diff --git a/src/MiniExcel.Core/MiniExcel.Core.csproj b/src/MiniExcel.Core/MiniExcel.Core.csproj deleted file mode 100644 index 5f30fcdc..00000000 --- a/src/MiniExcel.Core/MiniExcel.Core.csproj +++ /dev/null @@ -1,11 +0,0 @@ - - - - MiniExcelLib.Core - - - - - - - diff --git a/src/MiniExcel.Csv/CsvReader.cs b/src/MiniExcel.Csv/CsvReader.cs index dc90893b..18e58d78 100644 --- a/src/MiniExcel.Csv/CsvReader.cs +++ b/src/MiniExcel.Csv/CsvReader.cs @@ -1,3 +1,9 @@ +using MiniExcelLib.Exceptions; +using MiniExcelLib.Helpers; +using MiniExcelLib.Reflection; +using IMiniExcelReader = MiniExcelLib.Abstractions.IMiniExcelReader; +using MiniExcelMapper = MiniExcelLib.Reflection.MiniExcelMapper; + namespace MiniExcelLib.Csv; internal partial class CsvReader : IMiniExcelReader diff --git a/src/MiniExcel.Csv/CsvWriter.cs b/src/MiniExcel.Csv/CsvWriter.cs index aba6fa4e..71f07fac 100644 --- a/src/MiniExcel.Csv/CsvWriter.cs +++ b/src/MiniExcel.Csv/CsvWriter.cs @@ -1,4 +1,9 @@ -namespace MiniExcelLib.Csv; +using MiniExcelLib.Abstractions; +using MiniExcelLib.Reflection; +using MiniExcelLib.WriteAdapters; +using IMiniExcelWriter = MiniExcelLib.Abstractions.IMiniExcelWriter; + +namespace MiniExcelLib.Csv; internal partial class CsvWriter : IMiniExcelWriter, IDisposable { diff --git a/src/MiniExcel.Csv/GlobalUsings.cs b/src/MiniExcel.Csv/GlobalUsings.cs index c033a44b..83f2cc2a 100644 --- a/src/MiniExcel.Csv/GlobalUsings.cs +++ b/src/MiniExcel.Csv/GlobalUsings.cs @@ -7,11 +7,8 @@ global using System.Runtime.CompilerServices; global using System.Text; global using System.Text.RegularExpressions; -global using MiniExcelLib.Core; -global using MiniExcelLib.Core.Abstractions; -global using MiniExcelLib.Core.DataReader; -global using MiniExcelLib.Core.Exceptions; -global using MiniExcelLib.Core.Helpers; -global using MiniExcelLib.Core.Reflection; -global using MiniExcelLib.Core.WriteAdapters; +global using MiniExcelLib; +global using MiniExcelLib.Abstractions; +global using MiniExcelLib.Helpers; +global using MiniExcelLib.Reflection; global using Zomp.SyncMethodGenerator; \ No newline at end of file diff --git a/src/MiniExcel.Csv/MiniExcel.Csv.csproj b/src/MiniExcel.Csv/MiniExcel.Csv.csproj index dcba1d8b..b5205d7c 100644 --- a/src/MiniExcel.Csv/MiniExcel.Csv.csproj +++ b/src/MiniExcel.Csv/MiniExcel.Csv.csproj @@ -5,7 +5,7 @@ - + diff --git a/src/MiniExcel.Csv/MiniExcelExtensions/Exporter.cs b/src/MiniExcel.Csv/MiniExcelExtensions/Exporter.cs index 508bb810..0685c7b6 100644 --- a/src/MiniExcel.Csv/MiniExcelExtensions/Exporter.cs +++ b/src/MiniExcel.Csv/MiniExcelExtensions/Exporter.cs @@ -1,3 +1,5 @@ +using MiniExcelLib.Helpers; + namespace MiniExcelLib.Csv.MiniExcelExtensions; public static partial class Exporter diff --git a/src/MiniExcel.Csv/MiniExcelExtensions/Importer.cs b/src/MiniExcel.Csv/MiniExcelExtensions/Importer.cs index f55967ad..50a76c44 100644 --- a/src/MiniExcel.Csv/MiniExcelExtensions/Importer.cs +++ b/src/MiniExcel.Csv/MiniExcelExtensions/Importer.cs @@ -1,3 +1,6 @@ +using MiniExcelLib.DataReader; +using MiniExcelLib.Helpers; + namespace MiniExcelLib.Csv.MiniExcelExtensions; public static partial class Importer diff --git a/src/MiniExcel.Core/Abstractions/IInputValueExtractor.cs b/src/MiniExcel/Abstractions/IInputValueExtractor.cs similarity index 73% rename from src/MiniExcel.Core/Abstractions/IInputValueExtractor.cs rename to src/MiniExcel/Abstractions/IInputValueExtractor.cs index f0409064..f374af28 100644 --- a/src/MiniExcel.Core/Abstractions/IInputValueExtractor.cs +++ b/src/MiniExcel/Abstractions/IInputValueExtractor.cs @@ -1,4 +1,4 @@ -namespace MiniExcelLib.Core.Abstractions; +namespace MiniExcelLib.Abstractions; public interface IInputValueExtractor { diff --git a/src/MiniExcel.Core/Abstractions/IMiniExcelDataReader.cs b/src/MiniExcel/Abstractions/IMiniExcelDataReader.cs similarity index 88% rename from src/MiniExcel.Core/Abstractions/IMiniExcelDataReader.cs rename to src/MiniExcel/Abstractions/IMiniExcelDataReader.cs index a36aec05..4ecf5c91 100644 --- a/src/MiniExcel.Core/Abstractions/IMiniExcelDataReader.cs +++ b/src/MiniExcel/Abstractions/IMiniExcelDataReader.cs @@ -1,4 +1,4 @@ -namespace MiniExcelLib.Core.Abstractions; +namespace MiniExcelLib.Abstractions; public interface IMiniExcelDataReader : IDataReader #if NET8_0_OR_GREATER diff --git a/src/MiniExcel.Core/Abstractions/IMiniExcelReader.cs b/src/MiniExcel/Abstractions/IMiniExcelReader.cs similarity index 95% rename from src/MiniExcel.Core/Abstractions/IMiniExcelReader.cs rename to src/MiniExcel/Abstractions/IMiniExcelReader.cs index 3760c139..91806f15 100644 --- a/src/MiniExcel.Core/Abstractions/IMiniExcelReader.cs +++ b/src/MiniExcel/Abstractions/IMiniExcelReader.cs @@ -1,4 +1,4 @@ -namespace MiniExcelLib.Core.Abstractions; +namespace MiniExcelLib.Abstractions; public partial interface IMiniExcelReader : IDisposable { diff --git a/src/MiniExcel.Core/Abstractions/IMiniExcelTemplate.cs b/src/MiniExcel/Abstractions/IMiniExcelTemplate.cs similarity index 90% rename from src/MiniExcel.Core/Abstractions/IMiniExcelTemplate.cs rename to src/MiniExcel/Abstractions/IMiniExcelTemplate.cs index 4d089f07..93e4d5bc 100644 --- a/src/MiniExcel.Core/Abstractions/IMiniExcelTemplate.cs +++ b/src/MiniExcel/Abstractions/IMiniExcelTemplate.cs @@ -1,4 +1,4 @@ -namespace MiniExcelLib.Core.Abstractions; +namespace MiniExcelLib.Abstractions; public partial interface IMiniExcelTemplate { diff --git a/src/MiniExcel.Core/Abstractions/IMiniExcelWriteAdapter.cs b/src/MiniExcel/Abstractions/IMiniExcelWriteAdapter.cs similarity index 85% rename from src/MiniExcel.Core/Abstractions/IMiniExcelWriteAdapter.cs rename to src/MiniExcel/Abstractions/IMiniExcelWriteAdapter.cs index a57675ed..4150e0a8 100644 --- a/src/MiniExcel.Core/Abstractions/IMiniExcelWriteAdapter.cs +++ b/src/MiniExcel/Abstractions/IMiniExcelWriteAdapter.cs @@ -1,4 +1,6 @@ -namespace MiniExcelLib.Core.Abstractions; +using MiniExcelLib.Reflection; + +namespace MiniExcelLib.Abstractions; public interface IMiniExcelWriteAdapter { diff --git a/src/MiniExcel.Core/Abstractions/IMiniExcelWriteAdapterAsync.cs b/src/MiniExcel/Abstractions/IMiniExcelWriteAdapterAsync.cs similarity index 75% rename from src/MiniExcel.Core/Abstractions/IMiniExcelWriteAdapterAsync.cs rename to src/MiniExcel/Abstractions/IMiniExcelWriteAdapterAsync.cs index 14a9aeb9..a06c1c76 100644 --- a/src/MiniExcel.Core/Abstractions/IMiniExcelWriteAdapterAsync.cs +++ b/src/MiniExcel/Abstractions/IMiniExcelWriteAdapterAsync.cs @@ -1,4 +1,6 @@ -namespace MiniExcelLib.Core.Abstractions; +using MiniExcelLib.Reflection; + +namespace MiniExcelLib.Abstractions; public interface IMiniExcelWriteAdapterAsync { diff --git a/src/MiniExcel.Core/Abstractions/IMiniExcelWriter.cs b/src/MiniExcel/Abstractions/IMiniExcelWriter.cs similarity index 83% rename from src/MiniExcel.Core/Abstractions/IMiniExcelWriter.cs rename to src/MiniExcel/Abstractions/IMiniExcelWriter.cs index b80f88dd..2f827904 100644 --- a/src/MiniExcel.Core/Abstractions/IMiniExcelWriter.cs +++ b/src/MiniExcel/Abstractions/IMiniExcelWriter.cs @@ -1,4 +1,4 @@ -namespace MiniExcelLib.Core.Abstractions; +namespace MiniExcelLib.Abstractions; public partial interface IMiniExcelWriter { diff --git a/src/MiniExcel.Core/Attributes/MiniExcelColumnAttribute.cs b/src/MiniExcel/Attributes/MiniExcelColumnAttribute.cs similarity index 91% rename from src/MiniExcel.Core/Attributes/MiniExcelColumnAttribute.cs rename to src/MiniExcel/Attributes/MiniExcelColumnAttribute.cs index 2d6098a7..27c2ace3 100644 --- a/src/MiniExcel.Core/Attributes/MiniExcelColumnAttribute.cs +++ b/src/MiniExcel/Attributes/MiniExcelColumnAttribute.cs @@ -1,4 +1,6 @@ -namespace MiniExcelLib.Core.Attributes; +using MiniExcelLib.Helpers; + +namespace MiniExcelLib.Attributes; [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field)] public class MiniExcelColumnAttribute : Attribute diff --git a/src/MiniExcel.Core/Attributes/MiniExcelColumnIndexAttribute.cs b/src/MiniExcel/Attributes/MiniExcelColumnIndexAttribute.cs similarity index 90% rename from src/MiniExcel.Core/Attributes/MiniExcelColumnIndexAttribute.cs rename to src/MiniExcel/Attributes/MiniExcelColumnIndexAttribute.cs index b0033b63..c9992568 100644 --- a/src/MiniExcel.Core/Attributes/MiniExcelColumnIndexAttribute.cs +++ b/src/MiniExcel/Attributes/MiniExcelColumnIndexAttribute.cs @@ -1,4 +1,6 @@ -namespace MiniExcelLib.Core.Attributes; +using MiniExcelLib.Helpers; + +namespace MiniExcelLib.Attributes; [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field)] public class MiniExcelColumnIndexAttribute : Attribute diff --git a/src/MiniExcel.Core/Attributes/MiniExcelColumnNameAttribute.cs b/src/MiniExcel/Attributes/MiniExcelColumnNameAttribute.cs similarity index 86% rename from src/MiniExcel.Core/Attributes/MiniExcelColumnNameAttribute.cs rename to src/MiniExcel/Attributes/MiniExcelColumnNameAttribute.cs index ce38efeb..6d46080a 100644 --- a/src/MiniExcel.Core/Attributes/MiniExcelColumnNameAttribute.cs +++ b/src/MiniExcel/Attributes/MiniExcelColumnNameAttribute.cs @@ -1,4 +1,4 @@ -namespace MiniExcelLib.Core.Attributes; +namespace MiniExcelLib.Attributes; [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field)] public class MiniExcelColumnNameAttribute(string excelColumnName, string[]? aliases = null) : Attribute diff --git a/src/MiniExcel.Core/Attributes/MiniExcelColumnWidthAttribute.cs b/src/MiniExcel/Attributes/MiniExcelColumnWidthAttribute.cs similarity index 81% rename from src/MiniExcel.Core/Attributes/MiniExcelColumnWidthAttribute.cs rename to src/MiniExcel/Attributes/MiniExcelColumnWidthAttribute.cs index 4f9a7b6e..2f75c776 100644 --- a/src/MiniExcel.Core/Attributes/MiniExcelColumnWidthAttribute.cs +++ b/src/MiniExcel/Attributes/MiniExcelColumnWidthAttribute.cs @@ -1,4 +1,4 @@ -namespace MiniExcelLib.Core.Attributes; +namespace MiniExcelLib.Attributes; [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field)] public class MiniExcelColumnWidthAttribute(double excelColumnWidth) : Attribute diff --git a/src/MiniExcel.Core/Attributes/MiniExcelFormatAttribute.cs b/src/MiniExcel/Attributes/MiniExcelFormatAttribute.cs similarity index 79% rename from src/MiniExcel.Core/Attributes/MiniExcelFormatAttribute.cs rename to src/MiniExcel/Attributes/MiniExcelFormatAttribute.cs index 6df4f1ae..49de1d2f 100644 --- a/src/MiniExcel.Core/Attributes/MiniExcelFormatAttribute.cs +++ b/src/MiniExcel/Attributes/MiniExcelFormatAttribute.cs @@ -1,4 +1,4 @@ -namespace MiniExcelLib.Core.Attributes; +namespace MiniExcelLib.Attributes; [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field)] public class MiniExcelFormatAttribute(string format) : Attribute diff --git a/src/MiniExcel.Core/Attributes/MiniExcelIgnoreAttribute.cs b/src/MiniExcel/Attributes/MiniExcelIgnoreAttribute.cs similarity index 80% rename from src/MiniExcel.Core/Attributes/MiniExcelIgnoreAttribute.cs rename to src/MiniExcel/Attributes/MiniExcelIgnoreAttribute.cs index 8b2c0692..b7303f60 100644 --- a/src/MiniExcel.Core/Attributes/MiniExcelIgnoreAttribute.cs +++ b/src/MiniExcel/Attributes/MiniExcelIgnoreAttribute.cs @@ -1,4 +1,4 @@ -namespace MiniExcelLib.Core.Attributes; +namespace MiniExcelLib.Attributes; [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field)] public class MiniExcelIgnoreAttribute(bool excelIgnore = true) : Attribute diff --git a/src/MiniExcel.Core/DataReader/MiniExcelAsyncDataReader.cs b/src/MiniExcel/DataReader/MiniExcelAsyncDataReader.cs similarity index 95% rename from src/MiniExcel.Core/DataReader/MiniExcelAsyncDataReader.cs rename to src/MiniExcel/DataReader/MiniExcelAsyncDataReader.cs index bd70ce33..ea75e5ef 100644 --- a/src/MiniExcel.Core/DataReader/MiniExcelAsyncDataReader.cs +++ b/src/MiniExcel/DataReader/MiniExcelAsyncDataReader.cs @@ -1,4 +1,4 @@ -namespace MiniExcelLib.Core.DataReader; +namespace MiniExcelLib.DataReader; // todo: this is way improvable, let's try to merge the sync and async implementations public class MiniExcelAsyncDataReader : MiniExcelDataReaderBase, IAsyncDisposable diff --git a/src/MiniExcel.Core/DataReader/MiniExcelDataReader.cs b/src/MiniExcel/DataReader/MiniExcelDataReader.cs similarity index 94% rename from src/MiniExcel.Core/DataReader/MiniExcelDataReader.cs rename to src/MiniExcel/DataReader/MiniExcelDataReader.cs index df1d14e0..c2a01277 100644 --- a/src/MiniExcel.Core/DataReader/MiniExcelDataReader.cs +++ b/src/MiniExcel/DataReader/MiniExcelDataReader.cs @@ -1,4 +1,4 @@ -namespace MiniExcelLib.Core.DataReader; +namespace MiniExcelLib.DataReader; public class MiniExcelDataReader : MiniExcelDataReaderBase { diff --git a/src/MiniExcel.Core/DataReader/MiniExcelDataReaderBase.cs b/src/MiniExcel/DataReader/MiniExcelDataReaderBase.cs similarity index 95% rename from src/MiniExcel.Core/DataReader/MiniExcelDataReaderBase.cs rename to src/MiniExcel/DataReader/MiniExcelDataReaderBase.cs index 8bc3107d..376a8749 100644 --- a/src/MiniExcel.Core/DataReader/MiniExcelDataReaderBase.cs +++ b/src/MiniExcel/DataReader/MiniExcelDataReaderBase.cs @@ -1,4 +1,6 @@ -namespace MiniExcelLib.Core.DataReader; +using MiniExcelLib.Abstractions; + +namespace MiniExcelLib.DataReader; /// /// IMiniExcelDataReader Base Class diff --git a/src/MiniExcel.Core/Enums/XlsxImgType.cs b/src/MiniExcel/Enums/XlsxImgType.cs similarity index 91% rename from src/MiniExcel.Core/Enums/XlsxImgType.cs rename to src/MiniExcel/Enums/XlsxImgType.cs index 066ff335..03c5c325 100644 --- a/src/MiniExcel.Core/Enums/XlsxImgType.cs +++ b/src/MiniExcel/Enums/XlsxImgType.cs @@ -1,4 +1,4 @@ -namespace MiniExcelLib.Core.Enums; +namespace MiniExcelLib.Enums; /// /// Excel image display mode (whether the image aligns/scales with cells). diff --git a/src/MiniExcel.Core/Exceptions/MiniExcelColumnNotFoundException.cs b/src/MiniExcel/Exceptions/MiniExcelColumnNotFoundException.cs similarity index 90% rename from src/MiniExcel.Core/Exceptions/MiniExcelColumnNotFoundException.cs rename to src/MiniExcel/Exceptions/MiniExcelColumnNotFoundException.cs index 621bfafb..dffec064 100644 --- a/src/MiniExcel.Core/Exceptions/MiniExcelColumnNotFoundException.cs +++ b/src/MiniExcel/Exceptions/MiniExcelColumnNotFoundException.cs @@ -1,4 +1,4 @@ -namespace MiniExcelLib.Core.Exceptions; +namespace MiniExcelLib.Exceptions; public class MiniExcelColumnNotFoundException( string? columnIndex, diff --git a/src/MiniExcel.Core/Exceptions/MiniExcelInvalidCastException.cs b/src/MiniExcel/Exceptions/MiniExcelInvalidCastException.cs similarity index 87% rename from src/MiniExcel.Core/Exceptions/MiniExcelInvalidCastException.cs rename to src/MiniExcel/Exceptions/MiniExcelInvalidCastException.cs index 2c883e0f..ef906a8d 100644 --- a/src/MiniExcel.Core/Exceptions/MiniExcelInvalidCastException.cs +++ b/src/MiniExcel/Exceptions/MiniExcelInvalidCastException.cs @@ -1,4 +1,4 @@ -namespace MiniExcelLib.Core.Exceptions; +namespace MiniExcelLib.Exceptions; public class MiniExcelInvalidCastException(string columnName, int row, object value, Type invalidCastType, string message) : InvalidCastException(message) diff --git a/src/MiniExcel/GlobalUsings.cs b/src/MiniExcel/GlobalUsings.cs new file mode 100644 index 00000000..824c7a69 --- /dev/null +++ b/src/MiniExcel/GlobalUsings.cs @@ -0,0 +1,17 @@ +// Global using directives + +global using System.Collections; +global using System.Data; +global using System.Globalization; +global using System.IO.Compression; +global using System.Reflection; +global using System.Runtime.CompilerServices; +global using System.Text; +global using System.Text.RegularExpressions; +global using System.Xml; +global using MiniExcelLib.Abstractions; +global using MiniExcelLib.Helpers; +global using MiniExcelLib.OpenXml; +global using MiniExcelLib.OpenXml.Utils; +global using MiniExcelLib.Reflection; +global using Zomp.SyncMethodGenerator; \ No newline at end of file diff --git a/src/MiniExcel.Core/Helpers/AttributeExtension.cs b/src/MiniExcel/Helpers/AttributeExtension.cs similarity index 94% rename from src/MiniExcel.Core/Helpers/AttributeExtension.cs rename to src/MiniExcel/Helpers/AttributeExtension.cs index a8236785..61484a7f 100644 --- a/src/MiniExcel.Core/Helpers/AttributeExtension.cs +++ b/src/MiniExcel/Helpers/AttributeExtension.cs @@ -1,4 +1,4 @@ -namespace MiniExcelLib.Core.Helpers; +namespace MiniExcelLib.Helpers; internal static class AttributeExtension { diff --git a/src/MiniExcel.Core/Helpers/ColumnHelper.cs b/src/MiniExcel/Helpers/ColumnHelper.cs similarity index 95% rename from src/MiniExcel.Core/Helpers/ColumnHelper.cs rename to src/MiniExcel/Helpers/ColumnHelper.cs index b5d9ccba..7e23be0a 100644 --- a/src/MiniExcel.Core/Helpers/ColumnHelper.cs +++ b/src/MiniExcel/Helpers/ColumnHelper.cs @@ -1,6 +1,6 @@ using System.Collections.Concurrent; -namespace MiniExcelLib.Core.Helpers; +namespace MiniExcelLib.Helpers; // For Row/Column Index public static class ColumnHelper diff --git a/src/MiniExcel.Core/Helpers/FileHelper.cs b/src/MiniExcel/Helpers/FileHelper.cs similarity index 78% rename from src/MiniExcel.Core/Helpers/FileHelper.cs rename to src/MiniExcel/Helpers/FileHelper.cs index dbd1180c..a11518de 100644 --- a/src/MiniExcel.Core/Helpers/FileHelper.cs +++ b/src/MiniExcel/Helpers/FileHelper.cs @@ -1,4 +1,4 @@ -namespace MiniExcelLib.Core.Helpers; +namespace MiniExcelLib.Helpers; public static class FileHelper { diff --git a/src/MiniExcel.Core/Helpers/ImageHelper.cs b/src/MiniExcel/Helpers/ImageHelper.cs similarity index 93% rename from src/MiniExcel.Core/Helpers/ImageHelper.cs rename to src/MiniExcel/Helpers/ImageHelper.cs index 97013e66..1350b2c4 100644 --- a/src/MiniExcel.Core/Helpers/ImageHelper.cs +++ b/src/MiniExcel/Helpers/ImageHelper.cs @@ -1,4 +1,4 @@ -namespace MiniExcelLib.Core.Helpers; +namespace MiniExcelLib.Helpers; internal static class ImageHelper { diff --git a/src/MiniExcel.Core/Helpers/ListHelper.cs b/src/MiniExcel/Helpers/ListHelper.cs similarity index 88% rename from src/MiniExcel.Core/Helpers/ListHelper.cs rename to src/MiniExcel/Helpers/ListHelper.cs index e6cc173b..3d89a84a 100644 --- a/src/MiniExcel.Core/Helpers/ListHelper.cs +++ b/src/MiniExcel/Helpers/ListHelper.cs @@ -1,4 +1,4 @@ -namespace MiniExcelLib.Core.Helpers; +namespace MiniExcelLib.Helpers; internal static class ListHelper { diff --git a/src/MiniExcel.Core/Helpers/SafeStreamWriter.cs b/src/MiniExcel/Helpers/SafeStreamWriter.cs similarity index 94% rename from src/MiniExcel.Core/Helpers/SafeStreamWriter.cs rename to src/MiniExcel/Helpers/SafeStreamWriter.cs index e147263c..4a88409e 100644 --- a/src/MiniExcel.Core/Helpers/SafeStreamWriter.cs +++ b/src/MiniExcel/Helpers/SafeStreamWriter.cs @@ -1,4 +1,4 @@ -namespace MiniExcelLib.Core.Helpers; +namespace MiniExcelLib.Helpers; internal partial class SafeStreamWriter(Stream stream, Encoding encoding, int bufferSize) : IDisposable { diff --git a/src/MiniExcel.Core/Helpers/StringHelper.cs b/src/MiniExcel/Helpers/StringHelper.cs similarity index 83% rename from src/MiniExcel.Core/Helpers/StringHelper.cs rename to src/MiniExcel/Helpers/StringHelper.cs index 94ff906b..9d5d7aae 100644 --- a/src/MiniExcel.Core/Helpers/StringHelper.cs +++ b/src/MiniExcel/Helpers/StringHelper.cs @@ -1,4 +1,4 @@ -namespace MiniExcelLib.Core.Helpers; +namespace MiniExcelLib.Helpers; internal static class StringHelper { diff --git a/src/MiniExcel.Core/Helpers/TaskHelper.cs b/src/MiniExcel/Helpers/TaskHelper.cs similarity index 90% rename from src/MiniExcel.Core/Helpers/TaskHelper.cs rename to src/MiniExcel/Helpers/TaskHelper.cs index 909e5691..258e77ec 100644 --- a/src/MiniExcel.Core/Helpers/TaskHelper.cs +++ b/src/MiniExcel/Helpers/TaskHelper.cs @@ -1,4 +1,4 @@ -namespace MiniExcelLib.Core.Helpers; +namespace MiniExcelLib.Helpers; internal static class TaskHelper { diff --git a/src/MiniExcel.Core/Helpers/ThrowHelper.cs b/src/MiniExcel/Helpers/ThrowHelper.cs similarity index 91% rename from src/MiniExcel.Core/Helpers/ThrowHelper.cs rename to src/MiniExcel/Helpers/ThrowHelper.cs index 892e0645..46b43097 100644 --- a/src/MiniExcel.Core/Helpers/ThrowHelper.cs +++ b/src/MiniExcel/Helpers/ThrowHelper.cs @@ -1,4 +1,4 @@ -namespace MiniExcelLib.Core.Helpers; +namespace MiniExcelLib.Helpers; internal static class ThrowHelper { diff --git a/src/MiniExcel.Core/Helpers/TypeHelper.cs b/src/MiniExcel/Helpers/TypeHelper.cs similarity index 94% rename from src/MiniExcel.Core/Helpers/TypeHelper.cs rename to src/MiniExcel/Helpers/TypeHelper.cs index 1ba86cbf..e6150393 100644 --- a/src/MiniExcel.Core/Helpers/TypeHelper.cs +++ b/src/MiniExcel/Helpers/TypeHelper.cs @@ -1,4 +1,4 @@ -namespace MiniExcelLib.Core.Helpers; +namespace MiniExcelLib.Helpers; internal static class TypeHelper { diff --git a/src/MiniExcel.Core/Helpers/XmlHelper.cs b/src/MiniExcel/Helpers/XmlHelper.cs similarity index 95% rename from src/MiniExcel.Core/Helpers/XmlHelper.cs rename to src/MiniExcel/Helpers/XmlHelper.cs index ea12a6bf..b362e420 100644 --- a/src/MiniExcel.Core/Helpers/XmlHelper.cs +++ b/src/MiniExcel/Helpers/XmlHelper.cs @@ -1,4 +1,4 @@ -namespace MiniExcelLib.Core.Helpers; +namespace MiniExcelLib.Helpers; /// XmlEncoder MIT Copyright ©2021 from https://github.com/ClosedXML internal static partial class XmlHelper diff --git a/src/MiniExcel/MiniExcel.cs b/src/MiniExcel/MiniExcel.cs index 1367bcd8..666c7814 100644 --- a/src/MiniExcel/MiniExcel.cs +++ b/src/MiniExcel/MiniExcel.cs @@ -1,5 +1,3 @@ -using MiniExcelLib.Core; - namespace MiniExcelLib; public static class MiniExcel diff --git a/src/MiniExcel/MiniExcel.csproj b/src/MiniExcel/MiniExcel.csproj index 11b6187c..67a2f5dd 100644 --- a/src/MiniExcel/MiniExcel.csproj +++ b/src/MiniExcel/MiniExcel.csproj @@ -1,39 +1,38 @@  - - MiniExcelLib - + + MiniExcelLib + - - MiniExcel - MiniExcel - Mini-Software - excel;xlsx;csv;micro-helper;mini;openxml;helper; - Fast, Low-Memory, Easy Excel .NET processing tool for importing, exporting and templating spreadsheets - Github : https://github.com/mini-software/MiniExcel - Gitee : https://gitee.com/dotnetchina/MiniExcel - Issues : https://github.com/mini-software/MiniExcel/issues - Todo : https://github.com/mini-software/MiniExcel/projects/1?fullscreen=true - Wei Lin, Michele Bastione, PING-HSIU SHIH, Amos(izanhzh), eynarhaji, Mini-Software team - MiniExcel - Wei Lin, 2021 onwards - en - https://raw.githubusercontent.com/mini-software/MiniExcel/master/LICENSE - Apache-2.0 - https://github.com/mini-software/MiniExcel - https://github.com/mini-software/MiniExcel - Github - icon.png - Please Check [Release Notes](https://github.com/mini-software/MiniExcel/tree/master/docs) - true - true - snupkg - README.md - - - - - - + + MiniExcel + MiniExcel + Mini-Software + excel;xlsx;csv;micro-helper;mini;openxml;helper; + Fast, Low-Memory, Easy Excel .NET processing tool for importing, exporting and templating spreadsheets + Github : https://github.com/mini-software/MiniExcel + Gitee : https://gitee.com/dotnetchina/MiniExcel + Issues : https://github.com/mini-software/MiniExcel/issues + Todo : https://github.com/mini-software/MiniExcel/projects/1?fullscreen=true + Wei Lin, Michele Bastione, PING-HSIU SHIH, Amos(izanhzh), eynarhaji, Mini-Software team + MiniExcel + Wei Lin, 2021 onwards + en + https://raw.githubusercontent.com/mini-software/MiniExcel/master/LICENSE + Apache-2.0 + https://github.com/mini-software/MiniExcel + https://github.com/mini-software/MiniExcel + Github + icon.png + Please Check [Release Notes](https://github.com/mini-software/MiniExcel/tree/master/docs) + true + true + snupkg + README.md + + + + + diff --git a/src/MiniExcel.Core/MiniExcelConfiguration.cs b/src/MiniExcel/MiniExcelConfiguration.cs similarity index 87% rename from src/MiniExcel.Core/MiniExcelConfiguration.cs rename to src/MiniExcel/MiniExcelConfiguration.cs index 2742d8d4..60e2ee70 100644 --- a/src/MiniExcel.Core/MiniExcelConfiguration.cs +++ b/src/MiniExcel/MiniExcelConfiguration.cs @@ -1,4 +1,6 @@ -namespace MiniExcelLib.Core; +using MiniExcelLib.Attributes; + +namespace MiniExcelLib; public interface IMiniExcelConfiguration; diff --git a/src/MiniExcel.Core/MiniExcelExporter.cs b/src/MiniExcel/MiniExcelExporter.cs similarity index 95% rename from src/MiniExcel.Core/MiniExcelExporter.cs rename to src/MiniExcel/MiniExcelExporter.cs index 9c5574de..3272e2c3 100644 --- a/src/MiniExcel.Core/MiniExcelExporter.cs +++ b/src/MiniExcel/MiniExcelExporter.cs @@ -1,6 +1,7 @@ -using MiniExcelLib.Core.OpenXml.Picture; +using MiniExcelLib.OpenXml.Picture; +using OpenXmlWriter = MiniExcelLib.OpenXml.OpenXmlWriter; -namespace MiniExcelLib.Core; +namespace MiniExcelLib; public sealed partial class MiniExcelExporter { diff --git a/src/MiniExcel.Core/MiniExcelImporter.cs b/src/MiniExcel/MiniExcelImporter.cs similarity index 95% rename from src/MiniExcel.Core/MiniExcelImporter.cs rename to src/MiniExcel/MiniExcelImporter.cs index 9401bd1a..d1763270 100644 --- a/src/MiniExcel.Core/MiniExcelImporter.cs +++ b/src/MiniExcel/MiniExcelImporter.cs @@ -1,8 +1,11 @@ using System.Diagnostics.CodeAnalysis; using System.Dynamic; -using MiniExcelLib.Core.DataReader; +using MiniExcelLib.DataReader; +using MiniExcelLib.OpenXml.Models; +using MiniExcelLib.OpenXml.Zip; +using OpenXmlReader = MiniExcelLib.OpenXml.OpenXmlReader; -namespace MiniExcelLib.Core; +namespace MiniExcelLib; public sealed partial class MiniExcelImporter { @@ -280,7 +283,7 @@ public MiniExcelDataReader GetXlsxDataReader(string path, bool useHeaderRow = fa string? sheetName = null, string startCell = "A1", OpenXmlConfiguration? configuration = null) { var stream = FileHelper.OpenSharedRead(path); - var values = QueryXlsx(stream, useHeaderRow, sheetName, startCell, configuration).Cast>(); + var values = Enumerable.Cast>(QueryXlsx(stream, useHeaderRow, sheetName, startCell, configuration)); return MiniExcelDataReader.Create(stream, values); } @@ -288,7 +291,7 @@ public MiniExcelDataReader GetXlsxDataReader(string path, bool useHeaderRow = fa public MiniExcelDataReader GetXlsxDataReader(Stream stream, bool useHeaderRow = false, string? sheetName = null, string startCell = "A1", OpenXmlConfiguration? configuration = null) { - var values = QueryXlsx(stream, useHeaderRow, sheetName, startCell, configuration).Cast>(); + var values = Enumerable.Cast>(QueryXlsx(stream, useHeaderRow, sheetName, startCell, configuration)); return MiniExcelDataReader.Create(stream, values); } diff --git a/src/MiniExcel.Core/MiniExcelTemplater.cs b/src/MiniExcel/MiniExcelTemplater.cs similarity index 95% rename from src/MiniExcel.Core/MiniExcelTemplater.cs rename to src/MiniExcel/MiniExcelTemplater.cs index 05fbcaa2..f353a3ab 100644 --- a/src/MiniExcel.Core/MiniExcelTemplater.cs +++ b/src/MiniExcel/MiniExcelTemplater.cs @@ -1,6 +1,6 @@ -using MiniExcelLib.Core.OpenXml.Templates; +using MiniExcelLib.OpenXml.Templates; -namespace MiniExcelLib.Core; +namespace MiniExcelLib; public sealed partial class MiniExcelTemplater { diff --git a/src/MiniExcel.Core/OpenXml/Attributes/ExcelSheetAttribute.cs b/src/MiniExcel/OpenXml/Attributes/ExcelSheetAttribute.cs similarity index 76% rename from src/MiniExcel.Core/OpenXml/Attributes/ExcelSheetAttribute.cs rename to src/MiniExcel/OpenXml/Attributes/ExcelSheetAttribute.cs index 05ebfe54..1d2f921e 100644 --- a/src/MiniExcel.Core/OpenXml/Attributes/ExcelSheetAttribute.cs +++ b/src/MiniExcel/OpenXml/Attributes/ExcelSheetAttribute.cs @@ -1,4 +1,6 @@ -namespace MiniExcelLib.Core.OpenXml.Attributes; +using MiniExcelLib.OpenXml.Models; + +namespace MiniExcelLib.OpenXml.Attributes; [AttributeUsage(AttributeTargets.Class)] public class ExcelSheetAttribute : Attribute diff --git a/src/MiniExcel.Core/OpenXml/Constants/ExcelContentTypes.cs b/src/MiniExcel/OpenXml/Constants/ExcelContentTypes.cs similarity index 92% rename from src/MiniExcel.Core/OpenXml/Constants/ExcelContentTypes.cs rename to src/MiniExcel/OpenXml/Constants/ExcelContentTypes.cs index 6ef0fe98..dcef2d61 100644 --- a/src/MiniExcel.Core/OpenXml/Constants/ExcelContentTypes.cs +++ b/src/MiniExcel/OpenXml/Constants/ExcelContentTypes.cs @@ -1,4 +1,4 @@ -namespace MiniExcelLib.Core.OpenXml.Constants; +namespace MiniExcelLib.OpenXml.Constants; internal static class ExcelContentTypes { diff --git a/src/MiniExcel.Core/OpenXml/Constants/ExcelFileNames.cs b/src/MiniExcel/OpenXml/Constants/ExcelFileNames.cs similarity index 91% rename from src/MiniExcel.Core/OpenXml/Constants/ExcelFileNames.cs rename to src/MiniExcel/OpenXml/Constants/ExcelFileNames.cs index 0f7a6f26..1ea810f6 100644 --- a/src/MiniExcel.Core/OpenXml/Constants/ExcelFileNames.cs +++ b/src/MiniExcel/OpenXml/Constants/ExcelFileNames.cs @@ -1,4 +1,4 @@ -namespace MiniExcelLib.Core.OpenXml.Constants; +namespace MiniExcelLib.OpenXml.Constants; internal static class ExcelFileNames { diff --git a/src/MiniExcel.Core/OpenXml/Constants/ExcelXml.cs b/src/MiniExcel/OpenXml/Constants/ExcelXml.cs similarity index 96% rename from src/MiniExcel.Core/OpenXml/Constants/ExcelXml.cs rename to src/MiniExcel/OpenXml/Constants/ExcelXml.cs index dd59ca54..7a6d9c91 100644 --- a/src/MiniExcel.Core/OpenXml/Constants/ExcelXml.cs +++ b/src/MiniExcel/OpenXml/Constants/ExcelXml.cs @@ -1,4 +1,7 @@ -namespace MiniExcelLib.Core.OpenXml.Constants; +using MiniExcelLib.Helpers; +using MiniExcelLib.OpenXml.Models; + +namespace MiniExcelLib.OpenXml.Constants; internal static class ExcelXml { diff --git a/src/MiniExcel.Core/OpenXml/Constants/Schemas.cs b/src/MiniExcel/OpenXml/Constants/Schemas.cs similarity index 91% rename from src/MiniExcel.Core/OpenXml/Constants/Schemas.cs rename to src/MiniExcel/OpenXml/Constants/Schemas.cs index 8af3ea62..72c2e08f 100644 --- a/src/MiniExcel.Core/OpenXml/Constants/Schemas.cs +++ b/src/MiniExcel/OpenXml/Constants/Schemas.cs @@ -1,4 +1,4 @@ -namespace MiniExcelLib.Core.OpenXml.Constants; +namespace MiniExcelLib.OpenXml.Constants; internal static class Schemas { diff --git a/src/MiniExcel.Core/OpenXml/Constants/WorksheetXml.cs b/src/MiniExcel/OpenXml/Constants/WorksheetXml.cs similarity index 96% rename from src/MiniExcel.Core/OpenXml/Constants/WorksheetXml.cs rename to src/MiniExcel/OpenXml/Constants/WorksheetXml.cs index 766b956d..e1738572 100644 --- a/src/MiniExcel.Core/OpenXml/Constants/WorksheetXml.cs +++ b/src/MiniExcel/OpenXml/Constants/WorksheetXml.cs @@ -1,4 +1,6 @@ -namespace MiniExcelLib.Core.OpenXml.Constants; +using MiniExcelLib.Attributes; + +namespace MiniExcelLib.OpenXml.Constants; internal static class WorksheetXml { diff --git a/src/MiniExcel.Core/OpenXml/Models/DrawingDto.cs b/src/MiniExcel/OpenXml/Models/DrawingDto.cs similarity index 64% rename from src/MiniExcel.Core/OpenXml/Models/DrawingDto.cs rename to src/MiniExcel/OpenXml/Models/DrawingDto.cs index 3a8ba087..43ddbcf4 100644 --- a/src/MiniExcel.Core/OpenXml/Models/DrawingDto.cs +++ b/src/MiniExcel/OpenXml/Models/DrawingDto.cs @@ -1,4 +1,4 @@ -namespace MiniExcelLib.Core.OpenXml.Models; +namespace MiniExcelLib.OpenXml.Models; internal class DrawingDto { diff --git a/src/MiniExcel.Core/OpenXml/Models/ExcelRange.cs b/src/MiniExcel/OpenXml/Models/ExcelRange.cs similarity index 91% rename from src/MiniExcel.Core/OpenXml/Models/ExcelRange.cs rename to src/MiniExcel/OpenXml/Models/ExcelRange.cs index b541c7c8..bea1fd20 100644 --- a/src/MiniExcel.Core/OpenXml/Models/ExcelRange.cs +++ b/src/MiniExcel/OpenXml/Models/ExcelRange.cs @@ -1,4 +1,4 @@ -namespace MiniExcelLib.Core.OpenXml.Models; +namespace MiniExcelLib.OpenXml.Models; public class ExcelRangeElement { diff --git a/src/MiniExcel.Core/OpenXml/Models/ExcelWidthCollection.cs b/src/MiniExcel/OpenXml/Models/ExcelWidthCollection.cs similarity index 93% rename from src/MiniExcel.Core/OpenXml/Models/ExcelWidthCollection.cs rename to src/MiniExcel/OpenXml/Models/ExcelWidthCollection.cs index 7ed738b4..31bdbc7f 100644 --- a/src/MiniExcel.Core/OpenXml/Models/ExcelWidthCollection.cs +++ b/src/MiniExcel/OpenXml/Models/ExcelWidthCollection.cs @@ -1,4 +1,6 @@ -namespace MiniExcelLib.Core.OpenXml.Models; +using MiniExcelLib.Reflection; + +namespace MiniExcelLib.OpenXml.Models; public sealed class ExcelColumnWidth { diff --git a/src/MiniExcel.Core/OpenXml/Models/ExcellSheetInfo.cs b/src/MiniExcel/OpenXml/Models/ExcellSheetInfo.cs similarity index 88% rename from src/MiniExcel.Core/OpenXml/Models/ExcellSheetInfo.cs rename to src/MiniExcel/OpenXml/Models/ExcellSheetInfo.cs index 79cd8869..57cb3efd 100644 --- a/src/MiniExcel.Core/OpenXml/Models/ExcellSheetInfo.cs +++ b/src/MiniExcel/OpenXml/Models/ExcellSheetInfo.cs @@ -1,4 +1,4 @@ -namespace MiniExcelLib.Core.OpenXml.Models; +namespace MiniExcelLib.OpenXml.Models; internal class ExcellSheetInfo { diff --git a/src/MiniExcel.Core/OpenXml/Models/FileDto.cs b/src/MiniExcel/OpenXml/Models/FileDto.cs similarity index 88% rename from src/MiniExcel.Core/OpenXml/Models/FileDto.cs rename to src/MiniExcel/OpenXml/Models/FileDto.cs index 6a6ddc4a..8bb581f5 100644 --- a/src/MiniExcel.Core/OpenXml/Models/FileDto.cs +++ b/src/MiniExcel/OpenXml/Models/FileDto.cs @@ -1,4 +1,4 @@ -namespace MiniExcelLib.Core.OpenXml.Models; +namespace MiniExcelLib.OpenXml.Models; internal class FileDto { diff --git a/src/MiniExcel.Core/OpenXml/Models/MergeCells.cs b/src/MiniExcel/OpenXml/Models/MergeCells.cs similarity index 77% rename from src/MiniExcel.Core/OpenXml/Models/MergeCells.cs rename to src/MiniExcel/OpenXml/Models/MergeCells.cs index a8c41919..b5b4ba3b 100644 --- a/src/MiniExcel.Core/OpenXml/Models/MergeCells.cs +++ b/src/MiniExcel/OpenXml/Models/MergeCells.cs @@ -1,4 +1,4 @@ -namespace MiniExcelLib.Core.OpenXml.Models; +namespace MiniExcelLib.OpenXml.Models; internal class MergeCells { diff --git a/src/MiniExcel.Core/OpenXml/Models/SheetDto.cs b/src/MiniExcel/OpenXml/Models/SheetDto.cs similarity index 82% rename from src/MiniExcel.Core/OpenXml/Models/SheetDto.cs rename to src/MiniExcel/OpenXml/Models/SheetDto.cs index c18cb0ea..1bea641f 100644 --- a/src/MiniExcel.Core/OpenXml/Models/SheetDto.cs +++ b/src/MiniExcel/OpenXml/Models/SheetDto.cs @@ -1,4 +1,4 @@ -namespace MiniExcelLib.Core.OpenXml.Models; +namespace MiniExcelLib.OpenXml.Models; internal class SheetDto { diff --git a/src/MiniExcel.Core/OpenXml/Models/SheetInfo.cs b/src/MiniExcel/OpenXml/Models/SheetInfo.cs similarity index 91% rename from src/MiniExcel.Core/OpenXml/Models/SheetInfo.cs rename to src/MiniExcel/OpenXml/Models/SheetInfo.cs index 5bea92b2..ac063d16 100644 --- a/src/MiniExcel.Core/OpenXml/Models/SheetInfo.cs +++ b/src/MiniExcel/OpenXml/Models/SheetInfo.cs @@ -1,4 +1,4 @@ -namespace MiniExcelLib.Core.OpenXml.Models; +namespace MiniExcelLib.OpenXml.Models; public class SheetInfo(uint id, uint index, string name, SheetState sheetState, bool active) { diff --git a/src/MiniExcel.Core/OpenXml/Models/SheetRecord.cs b/src/MiniExcel/OpenXml/Models/SheetRecord.cs similarity index 92% rename from src/MiniExcel.Core/OpenXml/Models/SheetRecord.cs rename to src/MiniExcel/OpenXml/Models/SheetRecord.cs index 2bc57d71..57747254 100644 --- a/src/MiniExcel.Core/OpenXml/Models/SheetRecord.cs +++ b/src/MiniExcel/OpenXml/Models/SheetRecord.cs @@ -1,4 +1,4 @@ -namespace MiniExcelLib.Core.OpenXml.Models; +namespace MiniExcelLib.OpenXml.Models; internal sealed class SheetRecord(string name, string state, uint id, string rid, bool active) { diff --git a/src/MiniExcel.Core/OpenXml/OpenXmlConfiguration.cs b/src/MiniExcel/OpenXml/OpenXmlConfiguration.cs similarity index 92% rename from src/MiniExcel.Core/OpenXml/OpenXmlConfiguration.cs rename to src/MiniExcel/OpenXml/OpenXmlConfiguration.cs index 32e3f1cb..03e6c93d 100644 --- a/src/MiniExcel.Core/OpenXml/OpenXmlConfiguration.cs +++ b/src/MiniExcel/OpenXml/OpenXmlConfiguration.cs @@ -1,6 +1,6 @@ -using MiniExcelLib.Core.OpenXml.Attributes; +using MiniExcelLib.OpenXml.Attributes; -namespace MiniExcelLib.Core.OpenXml; +namespace MiniExcelLib.OpenXml; public class OpenXmlConfiguration : MiniExcelBaseConfiguration { diff --git a/src/MiniExcel.Core/OpenXml/OpenXmlReader.cs b/src/MiniExcel/OpenXml/OpenXmlReader.cs similarity index 96% rename from src/MiniExcel.Core/OpenXml/OpenXmlReader.cs rename to src/MiniExcel/OpenXml/OpenXmlReader.cs index b29bd38b..136a1423 100644 --- a/src/MiniExcel.Core/OpenXml/OpenXmlReader.cs +++ b/src/MiniExcel/OpenXml/OpenXmlReader.cs @@ -1,6 +1,15 @@ using System.Collections.ObjectModel; - -namespace MiniExcelLib.Core.OpenXml; +using MiniExcelLib.Helpers; +using MiniExcelLib.OpenXml.Constants; +using MiniExcelLib.OpenXml.Models; +using MiniExcelLib.OpenXml.Utils; +using MiniExcelLib.OpenXml.Zip; +using MiniExcelLib.Reflection; +using IMiniExcelReader = MiniExcelLib.Abstractions.IMiniExcelReader; +using MiniExcelMapper = MiniExcelLib.Reflection.MiniExcelMapper; +using XmlReaderHelper = MiniExcelLib.OpenXml.Utils.XmlReaderHelper; + +namespace MiniExcelLib.OpenXml; internal partial class OpenXmlReader : IMiniExcelReader { diff --git a/src/MiniExcel.Core/OpenXml/OpenXmlStyleOptions.cs b/src/MiniExcel/OpenXml/OpenXmlStyleOptions.cs similarity index 66% rename from src/MiniExcel.Core/OpenXml/OpenXmlStyleOptions.cs rename to src/MiniExcel/OpenXml/OpenXmlStyleOptions.cs index 2791cbae..67c6bb76 100644 --- a/src/MiniExcel.Core/OpenXml/OpenXmlStyleOptions.cs +++ b/src/MiniExcel/OpenXml/OpenXmlStyleOptions.cs @@ -1,4 +1,4 @@ -namespace MiniExcelLib.Core.OpenXml; +namespace MiniExcelLib.OpenXml; public class OpenXmlStyleOptions { diff --git a/src/MiniExcel.Core/OpenXml/OpenXmlStyles.cs b/src/MiniExcel/OpenXml/OpenXmlStyles.cs similarity index 96% rename from src/MiniExcel.Core/OpenXml/OpenXmlStyles.cs rename to src/MiniExcel/OpenXml/OpenXmlStyles.cs index d29ba3e4..17efd141 100644 --- a/src/MiniExcel.Core/OpenXml/OpenXmlStyles.cs +++ b/src/MiniExcel/OpenXml/OpenXmlStyles.cs @@ -1,4 +1,8 @@ -namespace MiniExcelLib.Core.OpenXml; +using MiniExcelLib.OpenXml.Constants; +using MiniExcelLib.OpenXml.Utils; +using MiniExcelLib.OpenXml.Zip; + +namespace MiniExcelLib.OpenXml; internal class OpenXmlStyles { diff --git a/src/MiniExcel.Core/OpenXml/OpenXmlWriter.DefaultOpenXml.cs b/src/MiniExcel/OpenXml/OpenXmlWriter.DefaultOpenXml.cs similarity index 94% rename from src/MiniExcel.Core/OpenXml/OpenXmlWriter.DefaultOpenXml.cs rename to src/MiniExcel/OpenXml/OpenXmlWriter.DefaultOpenXml.cs index f7890991..2469fd26 100644 --- a/src/MiniExcel.Core/OpenXml/OpenXmlWriter.DefaultOpenXml.cs +++ b/src/MiniExcel/OpenXml/OpenXmlWriter.DefaultOpenXml.cs @@ -1,6 +1,13 @@ -using static MiniExcelLib.Core.Helpers.ImageHelper; - -namespace MiniExcelLib.Core.OpenXml; +using MiniExcelLib.Helpers; +using MiniExcelLib.OpenXml.Constants; +using MiniExcelLib.OpenXml.Models; +using MiniExcelLib.OpenXml.Utils; +using MiniExcelLib.OpenXml.Zip; +using MiniExcelLib.Reflection; +using static MiniExcelLib.Helpers.ImageHelper; +using IMiniExcelWriter = MiniExcelLib.Abstractions.IMiniExcelWriter; + +namespace MiniExcelLib.OpenXml; internal partial class OpenXmlWriter : IMiniExcelWriter { diff --git a/src/MiniExcel.Core/OpenXml/OpenXmlWriter.cs b/src/MiniExcel/OpenXml/OpenXmlWriter.cs similarity index 96% rename from src/MiniExcel.Core/OpenXml/OpenXmlWriter.cs rename to src/MiniExcel/OpenXml/OpenXmlWriter.cs index 41b72913..36518e2a 100644 --- a/src/MiniExcel.Core/OpenXml/OpenXmlWriter.cs +++ b/src/MiniExcel/OpenXml/OpenXmlWriter.cs @@ -1,8 +1,17 @@ using System.Xml.Linq; -using MiniExcelLib.Core.OpenXml.Styles; -using MiniExcelLib.Core.WriteAdapters; - -namespace MiniExcelLib.Core.OpenXml; +using MiniExcelLib.Abstractions; +using MiniExcelLib.Helpers; +using MiniExcelLib.OpenXml.Constants; +using MiniExcelLib.OpenXml.Models; +using MiniExcelLib.OpenXml.Styles; +using MiniExcelLib.OpenXml.Utils; +using MiniExcelLib.OpenXml.Zip; +using MiniExcelLib.Reflection; +using MiniExcelLib.WriteAdapters; +using IMiniExcelWriter = MiniExcelLib.Abstractions.IMiniExcelWriter; +using SafeStreamWriter = MiniExcelLib.Helpers.SafeStreamWriter; + +namespace MiniExcelLib.OpenXml; internal partial class OpenXmlWriter : IMiniExcelWriter { diff --git a/src/MiniExcel.Core/OpenXml/Picture/OpenXmlPicture.cs b/src/MiniExcel/OpenXml/Picture/OpenXmlPicture.cs similarity index 85% rename from src/MiniExcel.Core/OpenXml/Picture/OpenXmlPicture.cs rename to src/MiniExcel/OpenXml/Picture/OpenXmlPicture.cs index e80537b9..be9a1be0 100644 --- a/src/MiniExcel.Core/OpenXml/Picture/OpenXmlPicture.cs +++ b/src/MiniExcel/OpenXml/Picture/OpenXmlPicture.cs @@ -1,6 +1,8 @@ using System.Drawing; +using MiniExcelLib.Enums; +using MiniExcelLib.OpenXml.Utils; -namespace MiniExcelLib.Core.OpenXml.Picture; +namespace MiniExcelLib.OpenXml.Picture; public class MiniExcelPicture { diff --git a/src/MiniExcel.Core/OpenXml/Picture/OpenXmlPictureImplement.cs b/src/MiniExcel/OpenXml/Picture/OpenXmlPictureImplement.cs similarity index 97% rename from src/MiniExcel.Core/OpenXml/Picture/OpenXmlPictureImplement.cs rename to src/MiniExcel/OpenXml/Picture/OpenXmlPictureImplement.cs index 23e6af4e..750e5214 100644 --- a/src/MiniExcel.Core/OpenXml/Picture/OpenXmlPictureImplement.cs +++ b/src/MiniExcel/OpenXml/Picture/OpenXmlPictureImplement.cs @@ -1,8 +1,8 @@ -using System; -using System.Drawing; -using System.IO; +using System.Drawing; +using MiniExcelLib.Enums; +using MiniExcelLib.OpenXml.Zip; -namespace MiniExcelLib.Core.OpenXml.Picture; +namespace MiniExcelLib.OpenXml.Picture; internal static partial class MiniExcelPictureImplement { diff --git a/src/MiniExcel.Core/OpenXml/Styles/DefaultSheetStyleBuilder.cs b/src/MiniExcel/OpenXml/Styles/DefaultSheetStyleBuilder.cs similarity index 98% rename from src/MiniExcel.Core/OpenXml/Styles/DefaultSheetStyleBuilder.cs rename to src/MiniExcel/OpenXml/Styles/DefaultSheetStyleBuilder.cs index 32add149..95d9919d 100644 --- a/src/MiniExcel.Core/OpenXml/Styles/DefaultSheetStyleBuilder.cs +++ b/src/MiniExcel/OpenXml/Styles/DefaultSheetStyleBuilder.cs @@ -1,4 +1,4 @@ -namespace MiniExcelLib.Core.OpenXml.Styles; +namespace MiniExcelLib.OpenXml.Styles; internal partial class DefaultSheetStyleBuilder : SheetStyleBuilderBase { diff --git a/src/MiniExcel.Core/OpenXml/Styles/ISheetStyleBuilder.cs b/src/MiniExcel/OpenXml/Styles/ISheetStyleBuilder.cs similarity index 78% rename from src/MiniExcel.Core/OpenXml/Styles/ISheetStyleBuilder.cs rename to src/MiniExcel/OpenXml/Styles/ISheetStyleBuilder.cs index 41fd473c..95668293 100644 --- a/src/MiniExcel.Core/OpenXml/Styles/ISheetStyleBuilder.cs +++ b/src/MiniExcel/OpenXml/Styles/ISheetStyleBuilder.cs @@ -1,4 +1,4 @@ -namespace MiniExcelLib.Core.OpenXml.Styles; +namespace MiniExcelLib.OpenXml.Styles; internal partial interface ISheetStyleBuilder { diff --git a/src/MiniExcel.Core/OpenXml/Styles/MinimalSheetStyleBuilder.cs b/src/MiniExcel/OpenXml/Styles/MinimalSheetStyleBuilder.cs similarity index 97% rename from src/MiniExcel.Core/OpenXml/Styles/MinimalSheetStyleBuilder.cs rename to src/MiniExcel/OpenXml/Styles/MinimalSheetStyleBuilder.cs index 90b7214f..80b6f9e9 100644 --- a/src/MiniExcel.Core/OpenXml/Styles/MinimalSheetStyleBuilder.cs +++ b/src/MiniExcel/OpenXml/Styles/MinimalSheetStyleBuilder.cs @@ -1,4 +1,4 @@ -namespace MiniExcelLib.Core.OpenXml.Styles; +namespace MiniExcelLib.OpenXml.Styles; internal partial class MinimalSheetStyleBuilder : SheetStyleBuilderBase { diff --git a/src/MiniExcel.Core/OpenXml/Styles/SheetStyleBuildContext.cs b/src/MiniExcel/OpenXml/Styles/SheetStyleBuildContext.cs similarity index 96% rename from src/MiniExcel.Core/OpenXml/Styles/SheetStyleBuildContext.cs rename to src/MiniExcel/OpenXml/Styles/SheetStyleBuildContext.cs index ed0e0c47..dd69d939 100644 --- a/src/MiniExcel.Core/OpenXml/Styles/SheetStyleBuildContext.cs +++ b/src/MiniExcel/OpenXml/Styles/SheetStyleBuildContext.cs @@ -1,4 +1,9 @@ -namespace MiniExcelLib.Core.OpenXml.Styles; +using MiniExcelLib.Attributes; +using MiniExcelLib.Helpers; +using MiniExcelLib.OpenXml.Constants; +using MiniExcelLib.OpenXml.Zip; + +namespace MiniExcelLib.OpenXml.Styles; internal class SheetStyleBuildContext : IDisposable { diff --git a/src/MiniExcel.Core/OpenXml/Styles/SheetStyleBuildResult.cs b/src/MiniExcel/OpenXml/Styles/SheetStyleBuildResult.cs similarity index 79% rename from src/MiniExcel.Core/OpenXml/Styles/SheetStyleBuildResult.cs rename to src/MiniExcel/OpenXml/Styles/SheetStyleBuildResult.cs index 027e46bc..93f83131 100644 --- a/src/MiniExcel.Core/OpenXml/Styles/SheetStyleBuildResult.cs +++ b/src/MiniExcel/OpenXml/Styles/SheetStyleBuildResult.cs @@ -1,4 +1,4 @@ -namespace MiniExcelLib.Core.OpenXml.Styles; +namespace MiniExcelLib.OpenXml.Styles; internal class SheetStyleBuildResult { diff --git a/src/MiniExcel.Core/OpenXml/Styles/SheetStyleBuilderBase.cs b/src/MiniExcel/OpenXml/Styles/SheetStyleBuilderBase.cs similarity index 97% rename from src/MiniExcel.Core/OpenXml/Styles/SheetStyleBuilderBase.cs rename to src/MiniExcel/OpenXml/Styles/SheetStyleBuilderBase.cs index db173351..a21d4902 100644 --- a/src/MiniExcel.Core/OpenXml/Styles/SheetStyleBuilderBase.cs +++ b/src/MiniExcel/OpenXml/Styles/SheetStyleBuilderBase.cs @@ -1,4 +1,4 @@ -namespace MiniExcelLib.Core.OpenXml.Styles; +namespace MiniExcelLib.OpenXml.Styles; internal abstract partial class SheetStyleBuilderBase : ISheetStyleBuilder { diff --git a/src/MiniExcel.Core/OpenXml/Styles/SheetStyleBuilderHelper.cs b/src/MiniExcel/OpenXml/Styles/SheetStyleBuilderHelper.cs similarity index 83% rename from src/MiniExcel.Core/OpenXml/Styles/SheetStyleBuilderHelper.cs rename to src/MiniExcel/OpenXml/Styles/SheetStyleBuilderHelper.cs index 70eb617a..0cd19199 100644 --- a/src/MiniExcel.Core/OpenXml/Styles/SheetStyleBuilderHelper.cs +++ b/src/MiniExcel/OpenXml/Styles/SheetStyleBuilderHelper.cs @@ -1,4 +1,7 @@ -namespace MiniExcelLib.Core.OpenXml.Styles; +using MiniExcelLib.Attributes; +using MiniExcelLib.OpenXml.Utils; + +namespace MiniExcelLib.OpenXml.Styles; public static class SheetStyleBuilderHelper { diff --git a/src/MiniExcel.Core/OpenXml/Styles/SheetStyleElementInfos.cs b/src/MiniExcel/OpenXml/Styles/SheetStyleElementInfos.cs similarity index 89% rename from src/MiniExcel.Core/OpenXml/Styles/SheetStyleElementInfos.cs rename to src/MiniExcel/OpenXml/Styles/SheetStyleElementInfos.cs index 3ab807e8..db6bc188 100644 --- a/src/MiniExcel.Core/OpenXml/Styles/SheetStyleElementInfos.cs +++ b/src/MiniExcel/OpenXml/Styles/SheetStyleElementInfos.cs @@ -1,4 +1,4 @@ -namespace MiniExcelLib.Core.OpenXml.Styles; +namespace MiniExcelLib.OpenXml.Styles; public class SheetStyleElementInfos { diff --git a/src/MiniExcel.Core/OpenXml/Templates/OpenXmlTemplate.Impl.cs b/src/MiniExcel/OpenXml/Templates/OpenXmlTemplate.Impl.cs similarity index 97% rename from src/MiniExcel.Core/OpenXml/Templates/OpenXmlTemplate.Impl.cs rename to src/MiniExcel/OpenXml/Templates/OpenXmlTemplate.Impl.cs index 014667c3..fca26946 100644 --- a/src/MiniExcel.Core/OpenXml/Templates/OpenXmlTemplate.Impl.cs +++ b/src/MiniExcel/OpenXml/Templates/OpenXmlTemplate.Impl.cs @@ -1,4 +1,10 @@ -namespace MiniExcelLib.Core.OpenXml.Templates; +using MiniExcelLib.Attributes; +using MiniExcelLib.Helpers; +using MiniExcelLib.OpenXml.Constants; +using MiniExcelLib.OpenXml.Utils; +using MiniExcelLib.Reflection; + +namespace MiniExcelLib.OpenXml.Templates; #region Utils internal class XRowInfo diff --git a/src/MiniExcel.Core/OpenXml/Templates/OpenXmlTemplate.MergeCells.cs b/src/MiniExcel/OpenXml/Templates/OpenXmlTemplate.MergeCells.cs similarity index 95% rename from src/MiniExcel.Core/OpenXml/Templates/OpenXmlTemplate.MergeCells.cs rename to src/MiniExcel/OpenXml/Templates/OpenXmlTemplate.MergeCells.cs index 8bc304f3..7147bc4c 100644 --- a/src/MiniExcel.Core/OpenXml/Templates/OpenXmlTemplate.MergeCells.cs +++ b/src/MiniExcel/OpenXml/Templates/OpenXmlTemplate.MergeCells.cs @@ -1,4 +1,6 @@ -namespace MiniExcelLib.Core.OpenXml.Templates; +using MiniExcelLib.OpenXml.Zip; + +namespace MiniExcelLib.OpenXml.Templates; internal partial class OpenXmlTemplate { diff --git a/src/MiniExcel.Core/OpenXml/Templates/OpenXmlTemplate.cs b/src/MiniExcel/OpenXml/Templates/OpenXmlTemplate.cs similarity index 94% rename from src/MiniExcel.Core/OpenXml/Templates/OpenXmlTemplate.cs rename to src/MiniExcel/OpenXml/Templates/OpenXmlTemplate.cs index ace62bfc..91cc6197 100644 --- a/src/MiniExcel.Core/OpenXml/Templates/OpenXmlTemplate.cs +++ b/src/MiniExcel/OpenXml/Templates/OpenXmlTemplate.cs @@ -1,4 +1,10 @@ -namespace MiniExcelLib.Core.OpenXml.Templates; +using MiniExcelLib.Abstractions; +using MiniExcelLib.OpenXml.Constants; +using MiniExcelLib.OpenXml.Zip; +using CalcChainHelper = MiniExcelLib.OpenXml.Utils.CalcChainHelper; +using IMiniExcelTemplate = MiniExcelLib.Abstractions.IMiniExcelTemplate; + +namespace MiniExcelLib.OpenXml.Templates; internal partial class OpenXmlTemplate : IMiniExcelTemplate { diff --git a/src/MiniExcel.Core/OpenXml/Templates/OpenXmlValueExtractor.cs b/src/MiniExcel/OpenXml/Templates/OpenXmlValueExtractor.cs similarity index 90% rename from src/MiniExcel.Core/OpenXml/Templates/OpenXmlValueExtractor.cs rename to src/MiniExcel/OpenXml/Templates/OpenXmlValueExtractor.cs index c2df7ce1..ec08055f 100644 --- a/src/MiniExcel.Core/OpenXml/Templates/OpenXmlValueExtractor.cs +++ b/src/MiniExcel/OpenXml/Templates/OpenXmlValueExtractor.cs @@ -1,4 +1,7 @@ -namespace MiniExcelLib.Core.OpenXml.Templates; +using MiniExcelLib.Abstractions; +using MiniExcelLib.Helpers; + +namespace MiniExcelLib.OpenXml.Templates; public class OpenXmlValueExtractor : IInputValueExtractor { diff --git a/src/MiniExcel.Core/OpenXml/Utils/CalcChainHelper.cs b/src/MiniExcel/OpenXml/Utils/CalcChainHelper.cs similarity index 95% rename from src/MiniExcel.Core/OpenXml/Utils/CalcChainHelper.cs rename to src/MiniExcel/OpenXml/Utils/CalcChainHelper.cs index c2bae0ce..9c1f6107 100644 --- a/src/MiniExcel.Core/OpenXml/Utils/CalcChainHelper.cs +++ b/src/MiniExcel/OpenXml/Utils/CalcChainHelper.cs @@ -1,4 +1,4 @@ -namespace MiniExcelLib.Core.OpenXml.Utils; +namespace MiniExcelLib.OpenXml.Utils; internal static partial class CalcChainHelper { diff --git a/src/MiniExcel.Core/OpenXml/Utils/DateTimeHelper.cs b/src/MiniExcel/OpenXml/Utils/DateTimeHelper.cs similarity index 91% rename from src/MiniExcel.Core/OpenXml/Utils/DateTimeHelper.cs rename to src/MiniExcel/OpenXml/Utils/DateTimeHelper.cs index dac80e70..31c5d945 100644 --- a/src/MiniExcel.Core/OpenXml/Utils/DateTimeHelper.cs +++ b/src/MiniExcel/OpenXml/Utils/DateTimeHelper.cs @@ -1,4 +1,4 @@ -namespace MiniExcelLib.Core.OpenXml.Utils; +namespace MiniExcelLib.OpenXml.Utils; public static class DateTimeHelper { diff --git a/src/MiniExcel.Core/OpenXml/Utils/GeneralHelper.cs b/src/MiniExcel/OpenXml/Utils/GeneralHelper.cs similarity index 93% rename from src/MiniExcel.Core/OpenXml/Utils/GeneralHelper.cs rename to src/MiniExcel/OpenXml/Utils/GeneralHelper.cs index 1f19995a..cbed85d7 100644 --- a/src/MiniExcel.Core/OpenXml/Utils/GeneralHelper.cs +++ b/src/MiniExcel/OpenXml/Utils/GeneralHelper.cs @@ -1,4 +1,4 @@ -namespace MiniExcelLib.Core.OpenXml.Utils; +namespace MiniExcelLib.OpenXml.Utils; internal static class GeneralHelper { diff --git a/src/MiniExcel.Core/OpenXml/Utils/MiniExcelPropertyHelper.cs b/src/MiniExcel/OpenXml/Utils/MiniExcelPropertyHelper.cs similarity index 89% rename from src/MiniExcel.Core/OpenXml/Utils/MiniExcelPropertyHelper.cs rename to src/MiniExcel/OpenXml/Utils/MiniExcelPropertyHelper.cs index 79d51396..2f7e8e20 100644 --- a/src/MiniExcel.Core/OpenXml/Utils/MiniExcelPropertyHelper.cs +++ b/src/MiniExcel/OpenXml/Utils/MiniExcelPropertyHelper.cs @@ -1,6 +1,7 @@ -using MiniExcelLib.Core.OpenXml.Attributes; +using MiniExcelLib.OpenXml.Attributes; +using MiniExcelLib.OpenXml.Models; -namespace MiniExcelLib.Core.OpenXml.Utils; +namespace MiniExcelLib.OpenXml.Utils; internal static class ExcelPropertyHelper { diff --git a/src/MiniExcel.Core/OpenXml/Utils/OpenXmlNumberFormatHelper.cs b/src/MiniExcel/OpenXml/Utils/OpenXmlNumberFormatHelper.cs similarity index 96% rename from src/MiniExcel.Core/OpenXml/Utils/OpenXmlNumberFormatHelper.cs rename to src/MiniExcel/OpenXml/Utils/OpenXmlNumberFormatHelper.cs index 813067bc..fceae1ab 100644 --- a/src/MiniExcel.Core/OpenXml/Utils/OpenXmlNumberFormatHelper.cs +++ b/src/MiniExcel/OpenXml/Utils/OpenXmlNumberFormatHelper.cs @@ -1,4 +1,4 @@ -namespace MiniExcelLib.Core.OpenXml.Utils; +namespace MiniExcelLib.OpenXml.Utils; /// /// This code edit from https://github.com/andersnm/ExcelNumberFormat diff --git a/src/MiniExcel.Core/OpenXml/Utils/ReferenceHelper.cs b/src/MiniExcel/OpenXml/Utils/ReferenceHelper.cs similarity index 95% rename from src/MiniExcel.Core/OpenXml/Utils/ReferenceHelper.cs rename to src/MiniExcel/OpenXml/Utils/ReferenceHelper.cs index 4cd4135f..d19c7d09 100644 --- a/src/MiniExcel.Core/OpenXml/Utils/ReferenceHelper.cs +++ b/src/MiniExcel/OpenXml/Utils/ReferenceHelper.cs @@ -1,4 +1,4 @@ -namespace MiniExcelLib.Core.OpenXml.Utils; +namespace MiniExcelLib.OpenXml.Utils; internal static class ReferenceHelper { diff --git a/src/MiniExcel.Core/OpenXml/Utils/SharedStringsDiskCache.cs b/src/MiniExcel/OpenXml/Utils/SharedStringsDiskCache.cs similarity index 95% rename from src/MiniExcel.Core/OpenXml/Utils/SharedStringsDiskCache.cs rename to src/MiniExcel/OpenXml/Utils/SharedStringsDiskCache.cs index bae9245c..5a8eaf0a 100644 --- a/src/MiniExcel.Core/OpenXml/Utils/SharedStringsDiskCache.cs +++ b/src/MiniExcel/OpenXml/Utils/SharedStringsDiskCache.cs @@ -1,4 +1,4 @@ -namespace MiniExcelLib.Core.OpenXml.Utils; +namespace MiniExcelLib.OpenXml.Utils; internal class SharedStringsDiskCache : IDictionary, IDisposable { diff --git a/src/MiniExcel.Core/OpenXml/Utils/XmlReaderHelper.cs b/src/MiniExcel/OpenXml/Utils/XmlReaderHelper.cs similarity index 95% rename from src/MiniExcel.Core/OpenXml/Utils/XmlReaderHelper.cs rename to src/MiniExcel/OpenXml/Utils/XmlReaderHelper.cs index 345cdbfe..b3c735ca 100644 --- a/src/MiniExcel.Core/OpenXml/Utils/XmlReaderHelper.cs +++ b/src/MiniExcel/OpenXml/Utils/XmlReaderHelper.cs @@ -1,4 +1,6 @@ -namespace MiniExcelLib.Core.OpenXml.Utils; +using MiniExcelLib.OpenXml.Constants; + +namespace MiniExcelLib.OpenXml.Utils; internal static partial class XmlReaderHelper { diff --git a/src/MiniExcel.Core/OpenXml/Zip/MiniExcelZipArchive.cs b/src/MiniExcel/OpenXml/Zip/MiniExcelZipArchive.cs similarity index 85% rename from src/MiniExcel.Core/OpenXml/Zip/MiniExcelZipArchive.cs rename to src/MiniExcel/OpenXml/Zip/MiniExcelZipArchive.cs index 9df07bdc..069e49d7 100644 --- a/src/MiniExcel.Core/OpenXml/Zip/MiniExcelZipArchive.cs +++ b/src/MiniExcel/OpenXml/Zip/MiniExcelZipArchive.cs @@ -1,4 +1,4 @@ -namespace MiniExcelLib.Core.OpenXml.Zip; +namespace MiniExcelLib.OpenXml.Zip; public class MiniExcelZipArchive(Stream stream, ZipArchiveMode mode, bool leaveOpen, Encoding entryNameEncoding) : ZipArchive(stream, mode, leaveOpen, entryNameEncoding) diff --git a/src/MiniExcel.Core/OpenXml/Zip/OpenXmlZip.cs b/src/MiniExcel/OpenXml/Zip/OpenXmlZip.cs similarity index 94% rename from src/MiniExcel.Core/OpenXml/Zip/OpenXmlZip.cs rename to src/MiniExcel/OpenXml/Zip/OpenXmlZip.cs index abc594fd..b85daad3 100644 --- a/src/MiniExcel.Core/OpenXml/Zip/OpenXmlZip.cs +++ b/src/MiniExcel/OpenXml/Zip/OpenXmlZip.cs @@ -1,6 +1,6 @@ using System.Collections.ObjectModel; -namespace MiniExcelLib.Core.OpenXml.Zip; +namespace MiniExcelLib.OpenXml.Zip; /// Copy & modified by ExcelDataReader ZipWorker @MIT License internal class OpenXmlZip : IDisposable diff --git a/src/MiniExcel.Core/OpenXml/Zip/ZipPackageInfo.cs b/src/MiniExcel/OpenXml/Zip/ZipPackageInfo.cs similarity index 82% rename from src/MiniExcel.Core/OpenXml/Zip/ZipPackageInfo.cs rename to src/MiniExcel/OpenXml/Zip/ZipPackageInfo.cs index 4cee1d50..f8ca652a 100644 --- a/src/MiniExcel.Core/OpenXml/Zip/ZipPackageInfo.cs +++ b/src/MiniExcel/OpenXml/Zip/ZipPackageInfo.cs @@ -1,4 +1,4 @@ -namespace MiniExcelLib.Core.OpenXml.Zip; +namespace MiniExcelLib.OpenXml.Zip; internal class ZipPackageInfo(ZipArchiveEntry zipArchiveEntry, string contentType) { diff --git a/src/MiniExcel.Core/Properties/AssemblyInfo.cs b/src/MiniExcel/Properties/AssemblyInfo.cs similarity index 100% rename from src/MiniExcel.Core/Properties/AssemblyInfo.cs rename to src/MiniExcel/Properties/AssemblyInfo.cs diff --git a/src/MiniExcel.Core/Reflection/CustomPropertyHelper.cs b/src/MiniExcel/Reflection/CustomPropertyHelper.cs similarity index 96% rename from src/MiniExcel.Core/Reflection/CustomPropertyHelper.cs rename to src/MiniExcel/Reflection/CustomPropertyHelper.cs index 04176ab1..27976df2 100644 --- a/src/MiniExcel.Core/Reflection/CustomPropertyHelper.cs +++ b/src/MiniExcel/Reflection/CustomPropertyHelper.cs @@ -1,6 +1,8 @@ using System.ComponentModel; +using MiniExcelLib.Attributes; +using MiniExcelLib.Helpers; -namespace MiniExcelLib.Core.Reflection; +namespace MiniExcelLib.Reflection; public static class CustomPropertyHelper { diff --git a/src/MiniExcel.Core/Reflection/MemberGetter.cs b/src/MiniExcel/Reflection/MemberGetter.cs similarity index 92% rename from src/MiniExcel.Core/Reflection/MemberGetter.cs rename to src/MiniExcel/Reflection/MemberGetter.cs index 233fde62..2b8cbc8e 100644 --- a/src/MiniExcel.Core/Reflection/MemberGetter.cs +++ b/src/MiniExcel/Reflection/MemberGetter.cs @@ -1,6 +1,6 @@ using System.Linq.Expressions; -namespace MiniExcelLib.Core.Reflection; +namespace MiniExcelLib.Reflection; public class MemberGetter(PropertyInfo property) { diff --git a/src/MiniExcel.Core/Reflection/MemberSetter.cs b/src/MiniExcel/Reflection/MemberSetter.cs similarity index 93% rename from src/MiniExcel.Core/Reflection/MemberSetter.cs rename to src/MiniExcel/Reflection/MemberSetter.cs index 1e81c84c..6073ec63 100644 --- a/src/MiniExcel.Core/Reflection/MemberSetter.cs +++ b/src/MiniExcel/Reflection/MemberSetter.cs @@ -1,6 +1,6 @@ using System.Linq.Expressions; -namespace MiniExcelLib.Core.Reflection; +namespace MiniExcelLib.Reflection; public class MemberSetter { diff --git a/src/MiniExcel.Core/Reflection/MiniExcelColumnInfo.cs b/src/MiniExcel/Reflection/MiniExcelColumnInfo.cs similarity index 89% rename from src/MiniExcel.Core/Reflection/MiniExcelColumnInfo.cs rename to src/MiniExcel/Reflection/MiniExcelColumnInfo.cs index 2f3c0d23..c3feeaad 100644 --- a/src/MiniExcel.Core/Reflection/MiniExcelColumnInfo.cs +++ b/src/MiniExcel/Reflection/MiniExcelColumnInfo.cs @@ -1,4 +1,6 @@ -namespace MiniExcelLib.Core.Reflection; +using MiniExcelLib.Attributes; + +namespace MiniExcelLib.Reflection; public class MiniExcelColumnInfo { diff --git a/src/MiniExcel.Core/Reflection/MiniExcelMapper.cs b/src/MiniExcel/Reflection/MiniExcelMapper.cs similarity index 96% rename from src/MiniExcel.Core/Reflection/MiniExcelMapper.cs rename to src/MiniExcel/Reflection/MiniExcelMapper.cs index 055da0c2..cca41a6d 100644 --- a/src/MiniExcel.Core/Reflection/MiniExcelMapper.cs +++ b/src/MiniExcel/Reflection/MiniExcelMapper.cs @@ -1,7 +1,9 @@ using System.ComponentModel; -using MiniExcelLib.Core.Exceptions; +using MiniExcelLib.Exceptions; +using MiniExcelLib.Helpers; +using MiniExcelLib.OpenXml.Utils; -namespace MiniExcelLib.Core.Reflection; +namespace MiniExcelLib.Reflection; public static partial class MiniExcelMapper { diff --git a/src/MiniExcel.Core/Reflection/MiniExcelProperty.cs b/src/MiniExcel/Reflection/MiniExcelProperty.cs similarity index 93% rename from src/MiniExcel.Core/Reflection/MiniExcelProperty.cs rename to src/MiniExcel/Reflection/MiniExcelProperty.cs index 3c2dafe7..ee0e58fe 100644 --- a/src/MiniExcel.Core/Reflection/MiniExcelProperty.cs +++ b/src/MiniExcel/Reflection/MiniExcelProperty.cs @@ -1,4 +1,4 @@ -namespace MiniExcelLib.Core.Reflection; +namespace MiniExcelLib.Reflection; public abstract class Member; diff --git a/src/MiniExcel.Core/WriteAdapters/AsyncEnumerableWriteAdapter.cs b/src/MiniExcel/WriteAdapters/AsyncEnumerableWriteAdapter.cs similarity index 93% rename from src/MiniExcel.Core/WriteAdapters/AsyncEnumerableWriteAdapter.cs rename to src/MiniExcel/WriteAdapters/AsyncEnumerableWriteAdapter.cs index a48b25ac..3940b3a0 100644 --- a/src/MiniExcel.Core/WriteAdapters/AsyncEnumerableWriteAdapter.cs +++ b/src/MiniExcel/WriteAdapters/AsyncEnumerableWriteAdapter.cs @@ -1,4 +1,7 @@ -namespace MiniExcelLib.Core.WriteAdapters; +using MiniExcelLib.Abstractions; +using MiniExcelLib.Reflection; + +namespace MiniExcelLib.WriteAdapters; internal class AsyncEnumerableWriteAdapter(IAsyncEnumerable values, MiniExcelBaseConfiguration configuration) : IMiniExcelWriteAdapterAsync { diff --git a/src/MiniExcel.Core/WriteAdapters/DataReaderWriteAdapter.cs b/src/MiniExcel/WriteAdapters/DataReaderWriteAdapter.cs similarity index 92% rename from src/MiniExcel.Core/WriteAdapters/DataReaderWriteAdapter.cs rename to src/MiniExcel/WriteAdapters/DataReaderWriteAdapter.cs index a85a9273..edad6f44 100644 --- a/src/MiniExcel.Core/WriteAdapters/DataReaderWriteAdapter.cs +++ b/src/MiniExcel/WriteAdapters/DataReaderWriteAdapter.cs @@ -1,4 +1,7 @@ -namespace MiniExcelLib.Core.WriteAdapters; +using MiniExcelLib.Abstractions; +using MiniExcelLib.Reflection; + +namespace MiniExcelLib.WriteAdapters; internal class DataReaderWriteAdapter(IDataReader reader, MiniExcelBaseConfiguration configuration) : IMiniExcelWriteAdapter { diff --git a/src/MiniExcel.Core/WriteAdapters/DataTableWriteAdapter.cs b/src/MiniExcel/WriteAdapters/DataTableWriteAdapter.cs similarity index 90% rename from src/MiniExcel.Core/WriteAdapters/DataTableWriteAdapter.cs rename to src/MiniExcel/WriteAdapters/DataTableWriteAdapter.cs index fb0bd33a..1e3cbe59 100644 --- a/src/MiniExcel.Core/WriteAdapters/DataTableWriteAdapter.cs +++ b/src/MiniExcel/WriteAdapters/DataTableWriteAdapter.cs @@ -1,4 +1,7 @@ -namespace MiniExcelLib.Core.WriteAdapters; +using MiniExcelLib.Abstractions; +using MiniExcelLib.Reflection; + +namespace MiniExcelLib.WriteAdapters; internal class DataTableWriteAdapter(DataTable dataTable, MiniExcelBaseConfiguration configuration) : IMiniExcelWriteAdapter { diff --git a/src/MiniExcel.Core/WriteAdapters/EnumerableWriteAdapter.cs b/src/MiniExcel/WriteAdapters/EnumerableWriteAdapter.cs similarity index 92% rename from src/MiniExcel.Core/WriteAdapters/EnumerableWriteAdapter.cs rename to src/MiniExcel/WriteAdapters/EnumerableWriteAdapter.cs index 47a7c1ef..cd5dd25b 100644 --- a/src/MiniExcel.Core/WriteAdapters/EnumerableWriteAdapter.cs +++ b/src/MiniExcel/WriteAdapters/EnumerableWriteAdapter.cs @@ -1,4 +1,8 @@ -namespace MiniExcelLib.Core.WriteAdapters; +using MiniExcelLib.Abstractions; +using MiniExcelLib.Helpers; +using MiniExcelLib.Reflection; + +namespace MiniExcelLib.WriteAdapters; internal class EnumerableWriteAdapter(IEnumerable values, MiniExcelBaseConfiguration configuration) : IMiniExcelWriteAdapter { diff --git a/src/MiniExcel.Core/WriteAdapters/MiniExcelDataReaderWriteAdapter.cs b/src/MiniExcel/WriteAdapters/MiniExcelDataReaderWriteAdapter.cs similarity index 93% rename from src/MiniExcel.Core/WriteAdapters/MiniExcelDataReaderWriteAdapter.cs rename to src/MiniExcel/WriteAdapters/MiniExcelDataReaderWriteAdapter.cs index 12e73a2e..15a5871f 100644 --- a/src/MiniExcel.Core/WriteAdapters/MiniExcelDataReaderWriteAdapter.cs +++ b/src/MiniExcel/WriteAdapters/MiniExcelDataReaderWriteAdapter.cs @@ -1,4 +1,7 @@ -namespace MiniExcelLib.Core.WriteAdapters; +using MiniExcelLib.Abstractions; +using MiniExcelLib.Reflection; + +namespace MiniExcelLib.WriteAdapters; internal class MiniExcelDataReaderWriteAdapter(IMiniExcelDataReader reader, MiniExcelBaseConfiguration configuration) : IMiniExcelWriteAdapterAsync { diff --git a/src/MiniExcel.Core/WriteAdapters/MiniExcelWriteAdapterFactory.cs b/src/MiniExcel/WriteAdapters/MiniExcelWriteAdapterFactory.cs similarity index 90% rename from src/MiniExcel.Core/WriteAdapters/MiniExcelWriteAdapterFactory.cs rename to src/MiniExcel/WriteAdapters/MiniExcelWriteAdapterFactory.cs index 65552977..cf765e2e 100644 --- a/src/MiniExcel.Core/WriteAdapters/MiniExcelWriteAdapterFactory.cs +++ b/src/MiniExcel/WriteAdapters/MiniExcelWriteAdapterFactory.cs @@ -1,4 +1,7 @@ -namespace MiniExcelLib.Core.WriteAdapters; +using MiniExcelLib.Abstractions; +using MiniExcelLib.Helpers; + +namespace MiniExcelLib.WriteAdapters; public static class MiniExcelWriteAdapterFactory { diff --git a/src/MiniExcel.Core/icon.png b/src/MiniExcel/icon.png similarity index 100% rename from src/MiniExcel.Core/icon.png rename to src/MiniExcel/icon.png diff --git a/src/MiniExcel.Core/miniexcel.publickey b/src/MiniExcel/miniexcel.publickey similarity index 100% rename from src/MiniExcel.Core/miniexcel.publickey rename to src/MiniExcel/miniexcel.publickey diff --git a/tests/MiniExcelTests/GlobalUsings.cs b/tests/MiniExcelTests/GlobalUsings.cs index e7541124..b11f8d10 100644 --- a/tests/MiniExcelTests/GlobalUsings.cs +++ b/tests/MiniExcelTests/GlobalUsings.cs @@ -9,10 +9,8 @@ global using System.Security.Principal; global using System.Text; global using Dapper; -global using MiniExcelLib.Core; -global using MiniExcelLib.Core.Attributes; -global using MiniExcelLib.Core.OpenXml; -global using MiniExcelLib.Core.OpenXml.Picture; +global using MiniExcelLib; +global using MiniExcelLib.OpenXml; global using MiniExcelLib.Csv; global using MiniExcelLib.Csv.MiniExcelExtensions; global using MiniExcelLib.Tests.Utils; diff --git a/tests/MiniExcelTests/MiniExcelAutoAdjustWidthTests.cs b/tests/MiniExcelTests/MiniExcelAutoAdjustWidthTests.cs index 21edc78e..45506ec2 100644 --- a/tests/MiniExcelTests/MiniExcelAutoAdjustWidthTests.cs +++ b/tests/MiniExcelTests/MiniExcelAutoAdjustWidthTests.cs @@ -1,6 +1,6 @@ using DocumentFormat.OpenXml.Packaging; using DocumentFormat.OpenXml.Spreadsheet; -using MiniExcelLib.Core.OpenXml.Models; +using MiniExcelLib.OpenXml.Models; namespace MiniExcelLib.Tests; diff --git a/tests/MiniExcelTests/MiniExcelCsvTests.cs b/tests/MiniExcelTests/MiniExcelCsvTests.cs index cc2f2ff1..c04d9f55 100644 --- a/tests/MiniExcelTests/MiniExcelCsvTests.cs +++ b/tests/MiniExcelTests/MiniExcelCsvTests.cs @@ -1,5 +1,6 @@ using CsvHelper; -using MiniExcelLib.Core.Exceptions; +using MiniExcelLib.Attributes; +using MiniExcelLib.Exceptions; namespace MiniExcelLib.Tests; diff --git a/tests/MiniExcelTests/MiniExcelIssueAsyncTests.cs b/tests/MiniExcelTests/MiniExcelIssueAsyncTests.cs index 08cbac45..3e485ecf 100644 --- a/tests/MiniExcelTests/MiniExcelIssueAsyncTests.cs +++ b/tests/MiniExcelTests/MiniExcelIssueAsyncTests.cs @@ -1,4 +1,5 @@ -using Newtonsoft.Json; +using MiniExcelLib.Attributes; +using Newtonsoft.Json; namespace MiniExcelLib.Tests; @@ -648,7 +649,7 @@ public async Task Issue226() using var path = AutoDeletingPath.Create(); var templatePath = PathHelper.GetFile("xlsx/TestIssue226.xlsx"); await _templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, new { employees = new[] { new { name = "123" }, new { name = "123" } } }); - Assert.Equal("A1:A3", Helpers.GetFirstSheetDimensionRefValue(path.ToString())); + Assert.Equal("A1:A3", SheetHelper.GetFirstSheetDimensionRefValue(path.ToString())); } /// @@ -1078,7 +1079,7 @@ public async Task Issue207() Assert.Equal("項目4", rows[15].A); Assert.Equal("[]內容1,[]內容2,[]內容3,[]內容4,[]內容5", rows[15].B); - var demension = Helpers.GetFirstSheetDimensionRefValue(path); + var demension = SheetHelper.GetFirstSheetDimensionRefValue(path); Assert.Equal("A1:C16", demension); } @@ -1111,7 +1112,7 @@ public async Task Issue207() Assert.Equal("項目4", rows[9].A); Assert.Equal("[]內容1,[]內容2,[]內容3,[]內容4,[]內容5", rows[9].C); - var demension = Helpers.GetFirstSheetDimensionRefValue(path); + var demension = SheetHelper.GetFirstSheetDimensionRefValue(path); Assert.Equal("A1:E15", demension); } } @@ -1157,7 +1158,7 @@ public async Task Issue206() }; await _templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); - var dimension = Helpers.GetFirstSheetDimensionRefValue(path.ToString()); + var dimension = SheetHelper.GetFirstSheetDimensionRefValue(path.ToString()); Assert.Equal("A1:B2", dimension); } @@ -1173,7 +1174,7 @@ public async Task Issue206() var value = new Dictionary { ["employees"] = dt }; await _templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); - var dimension = Helpers.GetFirstSheetDimensionRefValue(path.ToString()); + var dimension = SheetHelper.GetFirstSheetDimensionRefValue(path.ToString()); Assert.Equal("A1:B2", dimension); } } @@ -1231,7 +1232,7 @@ public async Task Issue193() Assert.Equal("Keaton", rows[8].B); Assert.Equal("IT", rows[8].C); - var demension = Helpers.GetFirstSheetDimensionRefValue(path); + var demension = SheetHelper.GetFirstSheetDimensionRefValue(path); Assert.Equal("A1:C9", demension); //TODO:row can't contain xmlns @@ -1282,7 +1283,7 @@ public async Task Issue193() Assert.Equal("Keaton", rows[8].B); Assert.Equal("IT", rows[8].C); - var demension = Helpers.GetFirstSheetDimensionRefValue(path); + var demension = SheetHelper.GetFirstSheetDimensionRefValue(path); Assert.Equal("A1:C9", demension); } } diff --git a/tests/MiniExcelTests/MiniExcelIssueTests.cs b/tests/MiniExcelTests/MiniExcelIssueTests.cs index 07a10dc6..4e1db9ff 100644 --- a/tests/MiniExcelTests/MiniExcelIssueTests.cs +++ b/tests/MiniExcelTests/MiniExcelIssueTests.cs @@ -1,8 +1,10 @@ using System.Collections; using System.ComponentModel; using System.Text.RegularExpressions; -using MiniExcelLib.Core.Exceptions; -using MiniExcelLib.Core.OpenXml.Utils; +using MiniExcelLib.Attributes; +using MiniExcelLib.Exceptions; +using MiniExcelLib.OpenXml.Picture; +using MiniExcelLib.OpenXml.Utils; using Newtonsoft.Json; using NPOI.XSSF.UserModel; @@ -232,7 +234,7 @@ public void TestIssue_DataReaderSupportDimension() using var reader = table.CreateDataReader(); var config = new OpenXmlConfiguration { FastMode = true }; _exporter.ExportXlsx(path.ToString(), reader, configuration: config); - var xml = Helpers.GetZipFileContent(path.ToString(), "xl/worksheets/sheet1.xml"); + var xml = SheetHelper.GetZipFileContent(path.ToString(), "xl/worksheets/sheet1.xml"); Assert.Contains("", xml); Assert.Contains("", xml); @@ -273,7 +275,7 @@ public void TestIssue405() var value = new[] { new { id = 1, name = "test" } }; _exporter.ExportXlsx(path.ToString(), value); - var xml = Helpers.GetZipFileContent(path.ToString(), "xl/sharedStrings.xml"); + var xml = SheetHelper.GetZipFileContent(path.ToString(), "xl/sharedStrings.xml"); Assert.StartsWith("").Count; } { @@ -445,7 +447,7 @@ public void TestIssue352() using var path = AutoDeletingPath.Create(); var reader = table.CreateDataReader(); _exporter.ExportXlsx(path.ToString(), reader, false); - var xml = Helpers.GetZipFileContent(path.ToString(), "xl/worksheets/sheet1.xml"); + var xml = SheetHelper.GetZipFileContent(path.ToString(), "xl/worksheets/sheet1.xml"); var cnt = Regex.Matches(xml, "").Count; } { @@ -456,7 +458,7 @@ public void TestIssue352() using var path = AutoDeletingPath.Create(); var reader = table.CreateDataReader(); _exporter.ExportXlsx(path.ToString(), reader); - var xml = Helpers.GetZipFileContent(path.ToString(), "xl/worksheets/sheet1.xml"); + var xml = SheetHelper.GetZipFileContent(path.ToString(), "xl/worksheets/sheet1.xml"); var cnt = Regex.Matches(xml, "").Count; } } @@ -481,7 +483,7 @@ public void TestIssue401(bool autoFilter, int count) var config = new OpenXmlConfiguration { AutoFilter = autoFilter }; _exporter.ExportXlsx(path.ToString(), reader, configuration: config); - var xml = Helpers.GetZipFileContent(path.ToString(), "xl/worksheets/sheet1.xml"); + var xml = SheetHelper.GetZipFileContent(path.ToString(), "xl/worksheets/sheet1.xml"); var cnt = Regex.Matches(xml, "").Count; Assert.Equal(count, cnt); } @@ -498,7 +500,7 @@ public void TestIssue401(bool autoFilter, int count) var config = new OpenXmlConfiguration { AutoFilter = autoFilter }; _exporter.ExportXlsx(path.ToString(), reader, false, configuration: config); - var xml = Helpers.GetZipFileContent(path.ToString(), "xl/worksheets/sheet1.xml"); + var xml = SheetHelper.GetZipFileContent(path.ToString(), "xl/worksheets/sheet1.xml"); var cnt = Regex.Matches(xml, "").Count; Assert.Equal(count, cnt); } @@ -513,7 +515,7 @@ public void TestIssue401(bool autoFilter, int count) var config = new OpenXmlConfiguration { AutoFilter = autoFilter }; _exporter.ExportXlsx(path.ToString(), reader, configuration: config); - var xml = Helpers.GetZipFileContent(path.ToString(), "xl/worksheets/sheet1.xml"); + var xml = SheetHelper.GetZipFileContent(path.ToString(), "xl/worksheets/sheet1.xml"); var cnt = Regex.Matches(xml, "").Count; Assert.Equal(count, cnt); } @@ -541,7 +543,7 @@ UNION ALL _exporter.ExportXlsx(path.ToString(), reader, configuration: config); } - var xml = Helpers.GetZipFileContent(path.ToString(), "xl/worksheets/sheet1.xml"); + var xml = SheetHelper.GetZipFileContent(path.ToString(), "xl/worksheets/sheet1.xml"); var cnt = Regex.Matches(xml, "autoFilter").Count; Assert.Equal(count, cnt); } @@ -583,7 +585,7 @@ UNION ALL _exporter.ExportXlsx(path.ToString(), reader, configuration: config); } - var xml = Helpers.GetZipFileContent(path.ToString(), "xl/worksheets/sheet1.xml"); + var xml = SheetHelper.GetZipFileContent(path.ToString(), "xl/worksheets/sheet1.xml"); var cnt = Regex.Matches(xml, "autoFilter").Count; Assert.Equal(count, cnt); } @@ -1138,7 +1140,7 @@ public void TestIssue325() }; _exporter.ExportXlsx(path.ToString(), value); - var xml = Helpers.GetZipFileContent(path.ToString(), "xl/worksheets/_rels/sheet2.xml.rels"); + var xml = SheetHelper.GetZipFileContent(path.ToString(), "xl/worksheets/_rels/sheet2.xml.rels"); var cnt = Regex.Matches(xml, "Id=\"drawing2\"").Count; Assert.True(cnt == 1); } @@ -1306,11 +1308,11 @@ public void TestIssue304() }; _exporter.ExportXlsx(path, value); - Assert.Contains("/xl/media/", Helpers.GetZipFileContent(path, "xl/drawings/_rels/drawing1.xml.rels")); - Assert.Contains("ext cx=\"609600\" cy=\"190500\"", Helpers.GetZipFileContent(path, "xl/drawings/drawing1.xml")); - Assert.Contains("/xl/drawings/drawing1.xml", Helpers.GetZipFileContent(path, "[Content_Types].xml")); - Assert.Contains("drawing r:id=", Helpers.GetZipFileContent(path, "xl/worksheets/sheet1.xml")); - Assert.Contains("../drawings/drawing1.xml", Helpers.GetZipFileContent(path, "xl/worksheets/_rels/sheet1.xml.rels")); + Assert.Contains("/xl/media/", SheetHelper.GetZipFileContent(path, "xl/drawings/_rels/drawing1.xml.rels")); + Assert.Contains("ext cx=\"609600\" cy=\"190500\"", SheetHelper.GetZipFileContent(path, "xl/drawings/drawing1.xml")); + Assert.Contains("/xl/drawings/drawing1.xml", SheetHelper.GetZipFileContent(path, "[Content_Types].xml")); + Assert.Contains("drawing r:id=", SheetHelper.GetZipFileContent(path, "xl/worksheets/sheet1.xml")); + Assert.Contains("../drawings/drawing1.xml", SheetHelper.GetZipFileContent(path, "xl/worksheets/_rels/sheet1.xml.rels")); } /// @@ -1346,21 +1348,21 @@ public void TestIssue294() using var path = AutoDeletingPath.Create(); var value = new[] { new { Name = " Jack" } }; _exporter.ExportXlsx(path.ToString(), value); - var sheetXml = Helpers.GetZipFileContent(path.ToString(), "xl/worksheets/sheet1.xml"); + var sheetXml = SheetHelper.GetZipFileContent(path.ToString(), "xl/worksheets/sheet1.xml"); Assert.Contains("xml:space=\"preserve\"", sheetXml); } { using var path = AutoDeletingPath.Create(); var value = new[] { new { Name = "Ja ck" } }; _exporter.ExportXlsx(path.ToString(), value); - var sheetXml = Helpers.GetZipFileContent(path.ToString(), "xl/worksheets/sheet1.xml"); + var sheetXml = SheetHelper.GetZipFileContent(path.ToString(), "xl/worksheets/sheet1.xml"); Assert.DoesNotContain("xml:space=\"preserve\"", sheetXml); } { using var path = AutoDeletingPath.Create(); var value = new[] { new { Name = "Jack " } }; _exporter.ExportXlsx(path.ToString(), value); - var sheetXml = Helpers.GetZipFileContent(path.ToString(), "xl/worksheets/sheet1.xml"); + var sheetXml = SheetHelper.GetZipFileContent(path.ToString(), "xl/worksheets/sheet1.xml"); Assert.Contains("xml:space=\"preserve\"", sheetXml); } } @@ -1395,7 +1397,7 @@ public void TestIssueI4DQUN() }; _templater.ApplyXlsxTemplate(path.ToString(), templatePath, value); - var sheetXml = Helpers.GetZipFileContent(path.ToString(), "xl/worksheets/sheet1.xml"); + var sheetXml = SheetHelper.GetZipFileContent(path.ToString(), "xl/worksheets/sheet1.xml"); Assert.Contains("Hello & World < , > , \" , '", sheetXml); Assert.Contains("Hello & Value < , > , \" , '", sheetXml); } @@ -1411,7 +1413,7 @@ public void TestIssue190() var value = new TestIssue190Dto[] { }; _exporter.ExportXlsx(path.ToString(), value, configuration: new OpenXmlConfiguration { AutoFilter = false }); - var sheetXml = Helpers.GetZipFileContent(path.ToString(), "xl/worksheets/sheet1.xml"); + var sheetXml = SheetHelper.GetZipFileContent(path.ToString(), "xl/worksheets/sheet1.xml"); Assert.DoesNotContain("", sheetXml); } { @@ -1419,7 +1421,7 @@ public void TestIssue190() var value = new TestIssue190Dto[] { }; _exporter.ExportXlsx(path.ToString(), value); - var sheetXml = Helpers.GetZipFileContent(path.ToString(), "xl/worksheets/sheet1.xml"); + var sheetXml = SheetHelper.GetZipFileContent(path.ToString(), "xl/worksheets/sheet1.xml"); Assert.Contains("", sheetXml); } { @@ -1431,7 +1433,7 @@ public void TestIssue190() ]; _exporter.ExportXlsx(path.ToString(), value); - var sheetXml = Helpers.GetZipFileContent(path.ToString(), "xl/worksheets/sheet1.xml"); + var sheetXml = SheetHelper.GetZipFileContent(path.ToString(), "xl/worksheets/sheet1.xml"); Assert.Contains("", sheetXml); } } @@ -1628,7 +1630,7 @@ public void TestIssues133() Assert.Equal("Id", rows[0].A); Assert.Equal("Name", rows[0].B); Assert.Single(rows); - Assert.Equal("A1:B1", Helpers.GetFirstSheetDimensionRefValue(path.ToString())); + Assert.Equal("A1:B1", SheetHelper.GetFirstSheetDimensionRefValue(path.ToString())); } { @@ -1641,7 +1643,7 @@ public void TestIssues133() Assert.Equal("Id", rows[0].A); Assert.Equal("Name", rows[0].B); Assert.Single(rows); - Assert.Equal("A1:B1", Helpers.GetFirstSheetDimensionRefValue(path.ToString())); + Assert.Equal("A1:B1", SheetHelper.GetFirstSheetDimensionRefValue(path.ToString())); } } @@ -1662,7 +1664,7 @@ public void TestIssueI45TF5_2() var path = PathHelper.GetTempPath(); _exporter.ExportXlsx(path, value); //System.Xml.XmlException : '<' is an unexpected token. The expected token is ';'. - Helpers.GetZipFileContent(path, "xl/worksheets/sheet1.xml"); //check illegal format or not + SheetHelper.GetZipFileContent(path, "xl/worksheets/sheet1.xml"); //check illegal format or not } { @@ -1672,7 +1674,7 @@ public void TestIssueI45TF5_2() var path = PathHelper.GetTempPath(); _exporter.ExportXlsx(path, dt); //System.Xml.XmlException : '<' is an unexpected token. The expected token is ';'. - Helpers.GetZipFileContent(path, "xl/worksheets/sheet1.xml"); //check illegal format or not + SheetHelper.GetZipFileContent(path, "xl/worksheets/sheet1.xml"); //check illegal format or not } } @@ -1681,7 +1683,7 @@ public void TestIssueI45TF5() { using var path = AutoDeletingPath.Create(); _exporter.ExportXlsx(path.ToString(), new[] { new { C1 = "1&2;3,4", C2 = "1&2;3,4" } }); - var sheet1Xml = Helpers.GetZipFileContent(path.ToString(), "xl/worksheets/sheet1.xml"); + var sheet1Xml = SheetHelper.GetZipFileContent(path.ToString(), "xl/worksheets/sheet1.xml"); Assert.DoesNotContain("", sheet1Xml); } @@ -2414,7 +2416,7 @@ public void Issue226() using var path = AutoDeletingPath.Create(); var templatePath = PathHelper.GetFile("xlsx/TestIssue226.xlsx"); _templater.ApplyXlsxTemplate(path.ToString(), templatePath, new { employees = new[] { new { name = "123" }, new { name = "123" } } }); - Assert.Equal("A1:A3", Helpers.GetFirstSheetDimensionRefValue(path.ToString())); + Assert.Equal("A1:A3", SheetHelper.GetFirstSheetDimensionRefValue(path.ToString())); } /// @@ -2797,7 +2799,7 @@ public void Issue207() Assert.Equal("項目4", rows[15].A); Assert.Equal("[]內容1,[]內容2,[]內容3,[]內容4,[]內容5", rows[15].B); - var dimension = Helpers.GetFirstSheetDimensionRefValue(path); + var dimension = SheetHelper.GetFirstSheetDimensionRefValue(path); Assert.Equal("A1:C16", dimension); } @@ -2827,7 +2829,7 @@ public void Issue207() Assert.Equal("[]內容1,[]內容2,[]內容3,[]內容4,[]內容5", rows[6].C); Assert.Equal("項目4", rows[9].A); Assert.Equal("[]內容1,[]內容2,[]內容3,[]內容4,[]內容5", rows[9].C); - var dimension = Helpers.GetFirstSheetDimensionRefValue(path); + var dimension = SheetHelper.GetFirstSheetDimensionRefValue(path); Assert.Equal("A1:E15", dimension); } } @@ -2882,7 +2884,7 @@ public void Issue206() }; _templater.ApplyXlsxTemplate(path.ToString(), templatePath, value); - var dimension = Helpers.GetFirstSheetDimensionRefValue(path.ToString()); + var dimension = SheetHelper.GetFirstSheetDimensionRefValue(path.ToString()); Assert.Equal("A1:B2", dimension); } @@ -2898,7 +2900,7 @@ public void Issue206() var value = new Dictionary { ["employees"] = dt }; _templater.ApplyXlsxTemplate(path.ToString(), templatePath, value); - var dimension = Helpers.GetFirstSheetDimensionRefValue(path.ToString()); + var dimension = SheetHelper.GetFirstSheetDimensionRefValue(path.ToString()); Assert.Equal("A1:B2", dimension); } } @@ -2955,7 +2957,7 @@ public void Issue193() Assert.Equal("Keaton", rows[8].B); Assert.Equal("IT", rows[8].C); - var dimension = Helpers.GetFirstSheetDimensionRefValue(path); + var dimension = SheetHelper.GetFirstSheetDimensionRefValue(path); Assert.Equal("A1:C9", dimension); /*TODO:row can't contain xmlns*/ @@ -3002,7 +3004,7 @@ public void Issue193() Assert.Equal("Keaton", rows[8].B); Assert.Equal("IT", rows[8].C); - var dimension = Helpers.GetFirstSheetDimensionRefValue(path.ToString()); + var dimension = SheetHelper.GetFirstSheetDimensionRefValue(path.ToString()); Assert.Equal("A1:C9", dimension); } } @@ -3561,17 +3563,17 @@ public void IssueI50VD5() _exporter.ExportXlsx(path, sheets); { - Assert.Contains("/xl/media/", Helpers.GetZipFileContent(path, "xl/drawings/_rels/drawing1.xml.rels")); - Assert.Contains("ext cx=\"609600\" cy=\"190500\"", Helpers.GetZipFileContent(path, "xl/drawings/drawing1.xml")); - Assert.Contains("/xl/drawings/drawing1.xml", Helpers.GetZipFileContent(path, "[Content_Types].xml")); - Assert.Contains("drawing r:id=\"drawing1\"", Helpers.GetZipFileContent(path, "xl/worksheets/sheet1.xml")); - Assert.Contains("../drawings/drawing1.xml", Helpers.GetZipFileContent(path, "xl/worksheets/_rels/sheet1.xml.rels")); + Assert.Contains("/xl/media/", SheetHelper.GetZipFileContent(path, "xl/drawings/_rels/drawing1.xml.rels")); + Assert.Contains("ext cx=\"609600\" cy=\"190500\"", SheetHelper.GetZipFileContent(path, "xl/drawings/drawing1.xml")); + Assert.Contains("/xl/drawings/drawing1.xml", SheetHelper.GetZipFileContent(path, "[Content_Types].xml")); + Assert.Contains("drawing r:id=\"drawing1\"", SheetHelper.GetZipFileContent(path, "xl/worksheets/sheet1.xml")); + Assert.Contains("../drawings/drawing1.xml", SheetHelper.GetZipFileContent(path, "xl/worksheets/_rels/sheet1.xml.rels")); - Assert.Contains("/xl/media/", Helpers.GetZipFileContent(path, "xl/drawings/_rels/drawing2.xml.rels")); - Assert.Contains("ext cx=\"609600\" cy=\"190500\"", Helpers.GetZipFileContent(path, "xl/drawings/drawing2.xml")); - Assert.Contains("/xl/drawings/drawing1.xml", Helpers.GetZipFileContent(path, "[Content_Types].xml")); - Assert.Contains("drawing r:id=\"drawing2\"", Helpers.GetZipFileContent(path, "xl/worksheets/sheet2.xml")); - Assert.Contains("../drawings/drawing2.xml", Helpers.GetZipFileContent(path, "xl/worksheets/_rels/sheet2.xml.rels")); + Assert.Contains("/xl/media/", SheetHelper.GetZipFileContent(path, "xl/drawings/_rels/drawing2.xml.rels")); + Assert.Contains("ext cx=\"609600\" cy=\"190500\"", SheetHelper.GetZipFileContent(path, "xl/drawings/drawing2.xml")); + Assert.Contains("/xl/drawings/drawing1.xml", SheetHelper.GetZipFileContent(path, "[Content_Types].xml")); + Assert.Contains("drawing r:id=\"drawing2\"", SheetHelper.GetZipFileContent(path, "xl/worksheets/sheet2.xml")); + Assert.Contains("../drawings/drawing2.xml", SheetHelper.GetZipFileContent(path, "xl/worksheets/_rels/sheet2.xml.rels")); } } @@ -4358,7 +4360,7 @@ public void TestIssue789() }; _exporter.ExportXlsx(path, value); - var xml = Helpers.GetZipFileContent(path.ToString(), "xl/worksheets/sheet1.xml"); + var xml = SheetHelper.GetZipFileContent(path.ToString(), "xl/worksheets/sheet1.xml"); Assert.Contains("", xml); } diff --git a/tests/MiniExcelTests/MiniExcelOpenXmlAsyncTests.cs b/tests/MiniExcelTests/MiniExcelOpenXmlAsyncTests.cs index 2c8a49bf..1ab72482 100644 --- a/tests/MiniExcelTests/MiniExcelOpenXmlAsyncTests.cs +++ b/tests/MiniExcelTests/MiniExcelOpenXmlAsyncTests.cs @@ -1,7 +1,9 @@ using System.IO.Packaging; using ClosedXML.Excel; using ExcelDataReader; -using MiniExcelLib.Core.Abstractions; +using MiniExcelLib.Abstractions; +using MiniExcelLib.Attributes; +using MiniExcelLib.OpenXml; namespace MiniExcelLib.Tests; @@ -414,7 +416,7 @@ public async Task QueryExcelDataReaderCheckTest(string path) var rowIndex = rows.IndexOf(row); foreach (var (key, value) in row) { - var eV = exceldatareaderResult.Tables[0].Rows[rowIndex][Helpers.GetColumnIndex(key)]; + var eV = exceldatareaderResult.Tables[0].Rows[rowIndex][SheetHelper.GetColumnIndex(key)]; var v = value ?? DBNull.Value; Assert.Equal(eV, v); } @@ -496,12 +498,12 @@ public async Task SaveAsFileWithDimensionByICollection() Assert.Equal("A", rows[1]["A"]); } - Assert.Equal("A1:B3", Helpers.GetFirstSheetDimensionRefValue(path)); + Assert.Equal("A1:B3", SheetHelper.GetFirstSheetDimensionRefValue(path)); } using var newPath = AutoDeletingPath.Create(); await _exporter.ExportXlsxAsync(newPath.ToString(), values, false); - Assert.Equal("A1:B2", Helpers.GetFirstSheetDimensionRefValue(newPath.ToString())); + Assert.Equal("A1:B2", SheetHelper.GetFirstSheetDimensionRefValue(newPath.ToString())); } //List empty @@ -518,7 +520,7 @@ public async Task SaveAsFileWithDimensionByICollection() Assert.Empty(rows); } - Assert.Equal("A1:B1", Helpers.GetFirstSheetDimensionRefValue(path)); + Assert.Equal("A1:B1", SheetHelper.GetFirstSheetDimensionRefValue(path)); } using (var file = AutoDeletingPath.Create()) @@ -531,7 +533,7 @@ public async Task SaveAsFileWithDimensionByICollection() var rows = d.ToList(); Assert.Single(rows); } - Assert.Equal("A1:B1", Helpers.GetFirstSheetDimensionRefValue(path)); + Assert.Equal("A1:B1", SheetHelper.GetFirstSheetDimensionRefValue(path)); } } @@ -567,13 +569,13 @@ public async Task SaveAsFileWithDimensionByICollection() Assert.Equal("A", rows[1]["A"]); } - Assert.Equal("A1:B3", Helpers.GetFirstSheetDimensionRefValue(path)); + Assert.Equal("A1:B3", SheetHelper.GetFirstSheetDimensionRefValue(path)); } using (var path = AutoDeletingPath.Create()) { await _exporter.ExportXlsxAsync(path.ToString(), values, false); - Assert.Equal("A1:B2", Helpers.GetFirstSheetDimensionRefValue(path.ToString())); + Assert.Equal("A1:B2", SheetHelper.GetFirstSheetDimensionRefValue(path.ToString())); } } @@ -594,7 +596,7 @@ public async Task SaveAsFileWithDimension() using var table = new DataTable(); await _exporter.ExportXlsxAsync(path, table); - Assert.Equal("A1", Helpers.GetFirstSheetDimensionRefValue(path)); + Assert.Equal("A1", SheetHelper.GetFirstSheetDimensionRefValue(path)); { await using var stream = File.OpenRead(path); var d = _importer.QueryXlsxAsync(stream).ToBlockingEnumerable(); @@ -602,7 +604,7 @@ public async Task SaveAsFileWithDimension() Assert.Single(rows); } await _exporter.ExportXlsxAsync(path, table, printHeader: false, overwriteFile: true); - Assert.Equal("A1", Helpers.GetFirstSheetDimensionRefValue(path)); + Assert.Equal("A1", SheetHelper.GetFirstSheetDimensionRefValue(path)); } { using var file = AutoDeletingPath.Create(); @@ -617,7 +619,7 @@ public async Task SaveAsFileWithDimension() table.Rows.Add("Hello World", -1234567890, false, DateTime.Now); await _exporter.ExportXlsxAsync(path, table); - Assert.Equal("A1:D3", Helpers.GetFirstSheetDimensionRefValue(path)); + Assert.Equal("A1:D3", SheetHelper.GetFirstSheetDimensionRefValue(path)); await using (var stream = File.OpenRead(path)) { @@ -642,7 +644,7 @@ public async Task SaveAsFileWithDimension() } await _exporter.ExportXlsxAsync(path, table, printHeader: false, overwriteFile: true); - Assert.Equal("A1:D2", Helpers.GetFirstSheetDimensionRefValue(path)); + Assert.Equal("A1:D2", SheetHelper.GetFirstSheetDimensionRefValue(path)); } { @@ -653,7 +655,7 @@ public async Task SaveAsFileWithDimension() table.Rows.Add("B"); await _exporter.ExportXlsxAsync(path.ToString(), table); - Assert.Equal("A1:A3", Helpers.GetFirstSheetDimensionRefValue(path.ToString())); + Assert.Equal("A1:A3", SheetHelper.GetFirstSheetDimensionRefValue(path.ToString())); } } @@ -780,7 +782,7 @@ public async Task SaveAsByIEnumerableIDictionary() Assert.Equal(2d, rows[1]["Column2"]); } - Assert.Equal("A1:B3", Helpers.GetFirstSheetDimensionRefValue(path)); + Assert.Equal("A1:B3", SheetHelper.GetFirstSheetDimensionRefValue(path)); } { @@ -800,7 +802,7 @@ public async Task SaveAsByIEnumerableIDictionary() var rows = d.ToList(); Assert.Equal(3, rows.Count); } - Assert.Equal("A1:B3", Helpers.GetFirstSheetDimensionRefValue(path)); + Assert.Equal("A1:B3", SheetHelper.GetFirstSheetDimensionRefValue(path)); } } @@ -838,7 +840,7 @@ public async Task SaveAsByIEnumerableIDictionaryWithDynamicConfiguration() Assert.Equal("Github", rows[1].Values.ElementAt(0)); Assert.Equal(2d, rows[1].Values.ElementAt(1)); } - Assert.Equal("A1:B3", Helpers.GetFirstSheetDimensionRefValue(path)); + Assert.Equal("A1:B3", SheetHelper.GetFirstSheetDimensionRefValue(path)); } @@ -874,7 +876,7 @@ await _exporter.ExportXlsxAsync( Assert.Equal("Github", rows[1].Column1); Assert.Equal(2, rows[1].Column2); } - Assert.Equal("A1:B3", Helpers.GetFirstSheetDimensionRefValue(path)); + Assert.Equal("A1:B3", SheetHelper.GetFirstSheetDimensionRefValue(path)); // test table var table = new DataTable(); @@ -887,13 +889,13 @@ await _exporter.ExportXlsxAsync( using var pathTable = AutoDeletingPath.Create(); await _exporter.ExportXlsxAsync(pathTable.ToString(), table, configuration: config); - Assert.Equal("A1:D3", Helpers.GetFirstSheetDimensionRefValue(pathTable.ToString())); + Assert.Equal("A1:D3", SheetHelper.GetFirstSheetDimensionRefValue(pathTable.ToString())); // data reader await using var reader = table.CreateDataReader(); using var pathReader = AutoDeletingPath.Create(); await _exporter.ExportXlsxAsync(pathReader.ToString(), reader, configuration: config); - Assert.Equal("A1:D3", Helpers.GetFirstSheetDimensionRefValue(pathTable.ToString())); + Assert.Equal("A1:D3", SheetHelper.GetFirstSheetDimensionRefValue(pathTable.ToString())); } [Fact] @@ -908,7 +910,7 @@ public async Task SaveAsByDapperRows() var rows = await connection.QueryAsync("select 'MiniExcel' as Column1,1 as Column2 union all select 'Github',2"); await _exporter.ExportXlsxAsync(path, rows); } - Assert.Equal("A1:B3", Helpers.GetFirstSheetDimensionRefValue(path)); + Assert.Equal("A1:B3", SheetHelper.GetFirstSheetDimensionRefValue(path)); await using (var stream = File.OpenRead(path)) { @@ -937,7 +939,7 @@ public async Task SaveAsByDapperRows() var rows = _importer.QueryXlsxAsync(stream, useHeaderRow: true).ToBlockingEnumerable().ToList(); Assert.Empty(rows); } - Assert.Equal("A1", Helpers.GetFirstSheetDimensionRefValue(path)); + Assert.Equal("A1", SheetHelper.GetFirstSheetDimensionRefValue(path)); // ToList await using (var connection = Db.GetConnection("Data Source=:memory:")) @@ -945,7 +947,7 @@ public async Task SaveAsByDapperRows() var rows = (await connection.QueryAsync("select 'MiniExcel' as Column1,1 as Column2 union all select 'Github',2")).ToList(); await _exporter.ExportXlsxAsync(path, rows, overwriteFile: true); } - Assert.Equal("A1:B3", Helpers.GetFirstSheetDimensionRefValue(path)); + Assert.Equal("A1:B3", SheetHelper.GetFirstSheetDimensionRefValue(path)); await using (var stream = File.OpenRead(path)) { @@ -1075,7 +1077,7 @@ await _exporter.ExportXlsxAsync(path, new[] Assert.Equal("Github", rows[1]["Column1"]); Assert.Equal(2d, rows[1]["Column2"]); } - Assert.Equal("A1:B3", Helpers.GetFirstSheetDimensionRefValue(path)); + Assert.Equal("A1:B3", SheetHelper.GetFirstSheetDimensionRefValue(path)); } [Fact] diff --git a/tests/MiniExcelTests/MiniExcelOpenXmlConfigurationTest.cs b/tests/MiniExcelTests/MiniExcelOpenXmlConfigurationTest.cs index 9793e786..a6203ad6 100644 --- a/tests/MiniExcelTests/MiniExcelOpenXmlConfigurationTest.cs +++ b/tests/MiniExcelTests/MiniExcelOpenXmlConfigurationTest.cs @@ -1,4 +1,5 @@ -using MiniExcelLib.Core.Helpers; +using MiniExcelLib.Attributes; +using MiniExcelLib.Helpers; namespace MiniExcelLib.Tests; diff --git a/tests/MiniExcelTests/MiniExcelOpenXmlMultipleSheetTests.cs b/tests/MiniExcelTests/MiniExcelOpenXmlMultipleSheetTests.cs index 622cae51..8aa6ea3e 100644 --- a/tests/MiniExcelTests/MiniExcelOpenXmlMultipleSheetTests.cs +++ b/tests/MiniExcelTests/MiniExcelOpenXmlMultipleSheetTests.cs @@ -1,5 +1,5 @@ -using MiniExcelLib.Core.OpenXml.Attributes; -using MiniExcelLib.Core.OpenXml.Models; +using MiniExcelLib.OpenXml.Attributes; +using MiniExcelLib.OpenXml.Models; namespace MiniExcelLib.Tests; diff --git a/tests/MiniExcelTests/MiniExcelOpenXmlTests.cs b/tests/MiniExcelTests/MiniExcelOpenXmlTests.cs index 692371d8..2cc5ece4 100644 --- a/tests/MiniExcelTests/MiniExcelOpenXmlTests.cs +++ b/tests/MiniExcelTests/MiniExcelOpenXmlTests.cs @@ -1,7 +1,8 @@ using System.IO.Packaging; using ClosedXML.Excel; using ExcelDataReader; -using MiniExcelLib.Core.OpenXml.Utils; +using MiniExcelLib.Attributes; +using MiniExcelLib.OpenXml.Utils; namespace MiniExcelLib.Tests; @@ -463,7 +464,7 @@ public void QueryExcelDataReaderCheckTest(string path) var rowIndex = rows.IndexOf(row); foreach (var (key, value) in row) { - var eV = exceldatareaderResult.Tables[0].Rows[rowIndex][Helpers.GetColumnIndex(key)]; + var eV = exceldatareaderResult.Tables[0].Rows[rowIndex][SheetHelper.GetColumnIndex(key)]; var v = value ?? DBNull.Value; Assert.Equal(eV, v); } @@ -548,10 +549,10 @@ public void SaveAsFileWithDimensionByICollection() Assert.Equal("A", rows[0].A); Assert.Equal("A", rows[1].A); } - Assert.Equal("A1:B3", Helpers.GetFirstSheetDimensionRefValue(path)); + Assert.Equal("A1:B3", SheetHelper.GetFirstSheetDimensionRefValue(path)); _exporter.ExportXlsx(path, values, false, overwriteFile: true); - Assert.Equal("A1:B2", Helpers.GetFirstSheetDimensionRefValue(path)); + Assert.Equal("A1:B2", SheetHelper.GetFirstSheetDimensionRefValue(path)); } //List empty @@ -567,16 +568,16 @@ public void SaveAsFileWithDimensionByICollection() var rows = _importer.QueryXlsx(stream, useHeaderRow: false).ToList(); Assert.Empty(rows); } - Assert.Equal("A1:B1", Helpers.GetFirstSheetDimensionRefValue(path)); + Assert.Equal("A1:B1", SheetHelper.GetFirstSheetDimensionRefValue(path)); } - _exporter.ExportXlsx(path, values, overwriteFile: true); + _exporter.ExportXlsx(path, values, overwriteFile: true); { using var stream = File.OpenRead(path); var rows = _importer.QueryXlsx(stream, useHeaderRow: false).ToList(); Assert.Single(rows); } - Assert.Equal("A1:B1", Helpers.GetFirstSheetDimensionRefValue(path)); + Assert.Equal("A1:B1", SheetHelper.GetFirstSheetDimensionRefValue(path)); } //Array @@ -606,10 +607,10 @@ public void SaveAsFileWithDimensionByICollection() Assert.Equal("A", rows[1].A); } } - Assert.Equal("A1:B3", Helpers.GetFirstSheetDimensionRefValue(path)); + Assert.Equal("A1:B3", SheetHelper.GetFirstSheetDimensionRefValue(path)); _exporter.ExportXlsx(path, values, false, overwriteFile: true); - Assert.Equal("A1:B2", Helpers.GetFirstSheetDimensionRefValue(path)); + Assert.Equal("A1:B2", SheetHelper.GetFirstSheetDimensionRefValue(path)); } // without properties @@ -629,7 +630,7 @@ public void SaveAsFileWithDimension() var table = new DataTable(); _exporter.ExportXlsx(path, table); - Assert.Equal("A1", Helpers.GetFirstSheetDimensionRefValue(path)); + Assert.Equal("A1", SheetHelper.GetFirstSheetDimensionRefValue(path)); { using var stream = File.OpenRead(path); var rows = _importer.QueryXlsx(stream).ToList(); @@ -637,7 +638,7 @@ public void SaveAsFileWithDimension() } _exporter.ExportXlsx(path, table, printHeader: false, overwriteFile: true); - Assert.Equal("A1", Helpers.GetFirstSheetDimensionRefValue(path)); + Assert.Equal("A1", SheetHelper.GetFirstSheetDimensionRefValue(path)); } { @@ -653,7 +654,7 @@ public void SaveAsFileWithDimension() table.Rows.Add("Hello World", -1234567890, false, DateTime.Now); _exporter.ExportXlsx(path, table); - Assert.Equal("A1:D3", Helpers.GetFirstSheetDimensionRefValue(path)); + Assert.Equal("A1:D3", SheetHelper.GetFirstSheetDimensionRefValue(path)); using (var stream = File.OpenRead(path)) { @@ -676,7 +677,7 @@ public void SaveAsFileWithDimension() } _exporter.ExportXlsx(path, table, printHeader: false, overwriteFile: true); - Assert.Equal("A1:D2", Helpers.GetFirstSheetDimensionRefValue(path)); + Assert.Equal("A1:D2", SheetHelper.GetFirstSheetDimensionRefValue(path)); } //TODO:StartCell @@ -689,7 +690,7 @@ public void SaveAsFileWithDimension() table.Rows.Add("B"); _exporter.ExportXlsx(path.ToString(), table); - Assert.Equal("A1:A3", Helpers.GetFirstSheetDimensionRefValue(path.ToString())); + Assert.Equal("A1:A3", SheetHelper.GetFirstSheetDimensionRefValue(path.ToString())); } } @@ -817,7 +818,7 @@ public void SaveAsByIEnumerableIDictionary() Assert.Equal("success!", _importer.GetSheetNames(stream)[1]); } - Assert.Equal("A1:B3", Helpers.GetFirstSheetDimensionRefValue(path)); + Assert.Equal("A1:B3", SheetHelper.GetFirstSheetDimensionRefValue(path)); } { @@ -834,7 +835,7 @@ public void SaveAsByIEnumerableIDictionary() Assert.Equal(3, rows.Count); } - Assert.Equal("A1:B3", Helpers.GetFirstSheetDimensionRefValue(path)); + Assert.Equal("A1:B3", SheetHelper.GetFirstSheetDimensionRefValue(path)); } } @@ -869,7 +870,7 @@ public void SaveAsFrozenRowsAndColumnsTest() Assert.Equal(2, rows[1].Column2); } - Assert.Equal("A1:B3", Helpers.GetFirstSheetDimensionRefValue(path.ToString())); + Assert.Equal("A1:B3", SheetHelper.GetFirstSheetDimensionRefValue(path.ToString())); // test table var table = new DataTable(); @@ -882,14 +883,14 @@ public void SaveAsFrozenRowsAndColumnsTest() using var pathTable = AutoDeletingPath.Create(); _exporter.ExportXlsx(pathTable.ToString(), table, configuration: config); - Assert.Equal("A1:D3", Helpers.GetFirstSheetDimensionRefValue(pathTable.ToString())); + Assert.Equal("A1:D3", SheetHelper.GetFirstSheetDimensionRefValue(pathTable.ToString())); // data reader var reader = table.CreateDataReader(); using var pathReader = AutoDeletingPath.Create(); _exporter.ExportXlsx(pathReader.ToString(), reader, configuration: config, overwriteFile: true); - Assert.Equal("A1:D3", Helpers.GetFirstSheetDimensionRefValue(pathTable.ToString())); //TODO: fix datareader not writing ref dimension (also in async version) + Assert.Equal("A1:D3", SheetHelper.GetFirstSheetDimensionRefValue(pathTable.ToString())); //TODO: fix datareader not writing ref dimension (also in async version) } [Fact] @@ -905,7 +906,7 @@ public void SaveAsByDapperRows() _exporter.ExportXlsx(path, rows); } - Assert.Equal("A1:B3", Helpers.GetFirstSheetDimensionRefValue(path)); + Assert.Equal("A1:B3", SheetHelper.GetFirstSheetDimensionRefValue(path)); using (var stream = File.OpenRead(path)) { @@ -936,7 +937,7 @@ public void SaveAsByDapperRows() Assert.Empty(rows); } - Assert.Equal("A1", Helpers.GetFirstSheetDimensionRefValue(path)); + Assert.Equal("A1", SheetHelper.GetFirstSheetDimensionRefValue(path)); // ToList using (var connection = Db.GetConnection("Data Source=:memory:")) @@ -945,7 +946,7 @@ public void SaveAsByDapperRows() _exporter.ExportXlsx(path, rows, overwriteFile: true); } - Assert.Equal("A1:B3", Helpers.GetFirstSheetDimensionRefValue(path)); + Assert.Equal("A1:B3", SheetHelper.GetFirstSheetDimensionRefValue(path)); using (var stream = File.OpenRead(path)) { @@ -1075,7 +1076,7 @@ public void SaveAsBasicCreateTest() Assert.Equal(2, rows[1].Column2); } - Assert.Equal("A1:B3", Helpers.GetFirstSheetDimensionRefValue(path.ToString())); + Assert.Equal("A1:B3", SheetHelper.GetFirstSheetDimensionRefValue(path.ToString())); } [Fact] diff --git a/tests/MiniExcelTests/MiniExcelTests.csproj b/tests/MiniExcelTests/MiniExcelTests.csproj index 0784e01e..5c33a678 100644 --- a/tests/MiniExcelTests/MiniExcelTests.csproj +++ b/tests/MiniExcelTests/MiniExcelTests.csproj @@ -32,9 +32,8 @@ - - + diff --git a/tests/MiniExcelTests/SaveByTemplate/InputValueExtractorTests.cs b/tests/MiniExcelTests/SaveByTemplate/InputValueExtractorTests.cs index e5df32a9..72c4d81d 100644 --- a/tests/MiniExcelTests/SaveByTemplate/InputValueExtractorTests.cs +++ b/tests/MiniExcelTests/SaveByTemplate/InputValueExtractorTests.cs @@ -1,4 +1,4 @@ -using MiniExcelLib.Core.OpenXml.Templates; +using MiniExcelLib.OpenXml.Templates; namespace MiniExcelLib.Tests.SaveByTemplate; diff --git a/tests/MiniExcelTests/SaveByTemplate/MiniExcelTemplateAsyncTests.cs b/tests/MiniExcelTests/SaveByTemplate/MiniExcelTemplateAsyncTests.cs index d8bffde4..e12100e6 100644 --- a/tests/MiniExcelTests/SaveByTemplate/MiniExcelTemplateAsyncTests.cs +++ b/tests/MiniExcelTests/SaveByTemplate/MiniExcelTemplateAsyncTests.cs @@ -30,7 +30,7 @@ public async Task DatatableTemptyRowTest() await _templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); var rows = _importer.QueryXlsxAsync(path.ToString()).ToBlockingEnumerable().ToList(); - var dimension = Helpers.GetFirstSheetDimensionRefValue(path.ToString()); + var dimension = SheetHelper.GetFirstSheetDimensionRefValue(path.ToString()); Assert.Equal("A1:C5", dimension); } { @@ -55,7 +55,7 @@ public async Task DatatableTemptyRowTest() await _templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); var rows = _importer.QueryXlsxAsync(path.ToString()).ToBlockingEnumerable().ToList(); - var dimension = Helpers.GetFirstSheetDimensionRefValue(path.ToString()); + var dimension = SheetHelper.GetFirstSheetDimensionRefValue(path.ToString()); Assert.Equal("A1:C5", dimension); } } @@ -89,7 +89,7 @@ public async Task DatatableTest() await _templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); var rows = _importer.QueryXlsxAsync(path.ToString()).ToBlockingEnumerable().ToList(); - var dimension = Helpers.GetFirstSheetDimensionRefValue(path.ToString()); + var dimension = SheetHelper.GetFirstSheetDimensionRefValue(path.ToString()); Assert.Equal("A1:C9", dimension); Assert.Equal(9, rows.Count); @@ -129,7 +129,7 @@ public async Task DatatableTest() Assert.Equal("Keaton", rows[8].B); Assert.Equal("IT", rows[8].C); - dimension = Helpers.GetFirstSheetDimensionRefValue(path.ToString()); + dimension = SheetHelper.GetFirstSheetDimensionRefValue(path.ToString()); Assert.Equal("A1:C9", dimension); } } @@ -170,7 +170,7 @@ public async Task DapperTemplateTest() Assert.Equal("Keaton", rows[8].B); Assert.Equal("IT", rows[8].C); - var dimension = Helpers.GetFirstSheetDimensionRefValue(path.ToString()); + var dimension = SheetHelper.GetFirstSheetDimensionRefValue(path.ToString()); Assert.Equal("A1:C9", dimension); } @@ -194,7 +194,7 @@ public async Task DapperTemplateTest() Assert.Equal("Keaton", rows[8].B); Assert.Equal("IT", rows[8].C); - var dimension = Helpers.GetFirstSheetDimensionRefValue(path.ToString()); + var dimension = SheetHelper.GetFirstSheetDimensionRefValue(path.ToString()); Assert.Equal("A1:C9", dimension); } } @@ -244,7 +244,7 @@ public async Task DictionaryTemplateTest() Assert.Equal("Keaton", rows[8].B); Assert.Equal("IT", rows[8].C); - var dimension = Helpers.GetFirstSheetDimensionRefValue(path); + var dimension = SheetHelper.GetFirstSheetDimensionRefValue(path); Assert.Equal("A1:C9", dimension); } @@ -269,7 +269,7 @@ public async Task DictionaryTemplateTest() Assert.Equal("Keaton", rows[8].B); Assert.Equal("IT", rows[8].C); - var dimension = Helpers.GetFirstSheetDimensionRefValue(path); + var dimension = SheetHelper.GetFirstSheetDimensionRefValue(path); Assert.Equal("A1:C9", dimension); } } @@ -298,7 +298,7 @@ public async Task TestGithubProject() Assert.Equal("ITWeiHan Github Projects", rows[0].B); Assert.Equal("Total Star : 178", rows[8].C); - var dimension = Helpers.GetFirstSheetDimensionRefValue(path.ToString()); + var dimension = SheetHelper.GetFirstSheetDimensionRefValue(path.ToString()); Assert.Equal("A1:D9", dimension); } @@ -384,7 +384,7 @@ public async Task TestIEnumerableType() Assert.Equal(poco.datetime, rows[4].datetime); Assert.Equal(poco.Guid, rows[4].Guid); - var dimension = Helpers.GetFirstSheetDimensionRefValue(path.ToString()); + var dimension = SheetHelper.GetFirstSheetDimensionRefValue(path.ToString()); Assert.Equal("A1:G6", dimension); } } @@ -416,7 +416,7 @@ public async Task TestTemplateTypeMapping() Assert.Equal(value.datetime, rows[0].datetime); Assert.Equal(value.Guid, rows[0].Guid); - var dimension = Helpers.GetFirstSheetDimensionRefValue(path.ToString()); + var dimension = SheetHelper.GetFirstSheetDimensionRefValue(path.ToString()); Assert.Equal("A1:G2", dimension); } @@ -456,7 +456,7 @@ public async Task TemplateAsyncBasiTest() Assert.Equal(123, rows[1].D); Assert.Equal("Jack has 123 points", rows[1].E); - var dimension = Helpers.GetFirstSheetDimensionRefValue(path.ToString()); + var dimension = SheetHelper.GetFirstSheetDimensionRefValue(path.ToString()); Assert.Equal("A1:E2", dimension); } @@ -480,7 +480,7 @@ public async Task TemplateAsyncBasiTest() Assert.Equal(123, rows[1].D); Assert.Equal("Jack has 123 points", rows[1].E); - var dimension = Helpers.GetFirstSheetDimensionRefValue(path); + var dimension = SheetHelper.GetFirstSheetDimensionRefValue(path); Assert.Equal("A1:E2", dimension); } @@ -508,7 +508,7 @@ public async Task TemplateAsyncBasiTest() Assert.Equal(123, rows[1].D); Assert.Equal("Jack has 123 points", rows[1].E); - var dimension = Helpers.GetFirstSheetDimensionRefValue(path.ToString()); + var dimension = SheetHelper.GetFirstSheetDimensionRefValue(path.ToString()); Assert.Equal("A1:E2", dimension); } @@ -532,7 +532,7 @@ public async Task TemplateAsyncBasiTest() Assert.Equal(123, rows[1].D); Assert.Equal("Jack has 123 points", rows[1].E); - var dimension = Helpers.GetFirstSheetDimensionRefValue(path.ToString()); + var dimension = SheetHelper.GetFirstSheetDimensionRefValue(path.ToString()); Assert.Equal("A1:E2", dimension); } } @@ -559,7 +559,7 @@ public async Task TestIEnumerable() }; await _templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); - var dimension = Helpers.GetFirstSheetDimensionRefValue(path.ToString()); + var dimension = SheetHelper.GetFirstSheetDimensionRefValue(path.ToString()); Assert.Equal("A1:B7", dimension); } @@ -581,7 +581,7 @@ public async Task TestIEnumerable() }; await _templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); - var dimension = Helpers.GetFirstSheetDimensionRefValue(path.ToString()); + var dimension = SheetHelper.GetFirstSheetDimensionRefValue(path.ToString()); Assert.Equal("A1:B7", dimension); } @@ -606,7 +606,7 @@ public async Task TestIEnumerable() }; await _templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); - var dimension = Helpers.GetFirstSheetDimensionRefValue(path.ToString()); + var dimension = SheetHelper.GetFirstSheetDimensionRefValue(path.ToString()); Assert.Equal("A1:B7", dimension); } } @@ -633,7 +633,7 @@ public async Task TestIEnumerableGrouped() }; await _templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); - var dimension = Helpers.GetFirstSheetDimensionRefValue(path.ToString()); + var dimension = SheetHelper.GetFirstSheetDimensionRefValue(path.ToString()); Assert.Equal("A1:B18", dimension); } @@ -655,7 +655,7 @@ public async Task TestIEnumerableGrouped() }; await _templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); - var dimension = Helpers.GetFirstSheetDimensionRefValue(path.ToString()); + var dimension = SheetHelper.GetFirstSheetDimensionRefValue(path.ToString()); Assert.Equal("A1:B18", dimension); } @@ -680,7 +680,7 @@ public async Task TestIEnumerableGrouped() }; await _templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); - var dimension = Helpers.GetFirstSheetDimensionRefValue(path.ToString()); + var dimension = SheetHelper.GetFirstSheetDimensionRefValue(path.ToString()); Assert.Equal("A1:B18", dimension); } } @@ -707,7 +707,7 @@ public async Task TestIEnumerableConditional() }; await _templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); - var dimension = Helpers.GetFirstSheetDimensionRefValue(path.ToString()); + var dimension = SheetHelper.GetFirstSheetDimensionRefValue(path.ToString()); Assert.Equal("A1:B18", dimension); } @@ -729,7 +729,7 @@ public async Task TestIEnumerableConditional() }; await _templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); - var dimension = Helpers.GetFirstSheetDimensionRefValue(path.ToString()); + var dimension = SheetHelper.GetFirstSheetDimensionRefValue(path.ToString()); Assert.Equal("A1:B18", dimension); } @@ -754,7 +754,7 @@ public async Task TestIEnumerableConditional() }; await _templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); - var dimension = Helpers.GetFirstSheetDimensionRefValue(path.ToString()); + var dimension = SheetHelper.GetFirstSheetDimensionRefValue(path.ToString()); Assert.Equal("A1:B18", dimension); } } @@ -805,7 +805,7 @@ public async Task TemplateTest() Assert.Equal("Keaton", rows[8].B); Assert.Equal("IT", rows[8].C); - var dimension = Helpers.GetFirstSheetDimensionRefValue(path.ToString()); + var dimension = SheetHelper.GetFirstSheetDimensionRefValue(path.ToString()); Assert.Equal("A1:C9", dimension); } @@ -829,7 +829,7 @@ public async Task TemplateTest() Assert.Equal("Keaton", rows[8].B); Assert.Equal("IT", rows[8].C); - var dimension = Helpers.GetFirstSheetDimensionRefValue(path.ToString()); + var dimension = SheetHelper.GetFirstSheetDimensionRefValue(path.ToString()); Assert.Equal("A1:C9", dimension); } } @@ -873,7 +873,7 @@ public async Task TemplateTest() Assert.Equal("Keaton", rows[8].B); Assert.Equal("IT", rows[8].C); - var dimension = Helpers.GetFirstSheetDimensionRefValue(path.ToString()); + var dimension = SheetHelper.GetFirstSheetDimensionRefValue(path.ToString()); Assert.Equal("A1:C9", dimension); } } diff --git a/tests/MiniExcelTests/SaveByTemplate/MiniExcelTemplateTests.cs b/tests/MiniExcelTests/SaveByTemplate/MiniExcelTemplateTests.cs index 581d960d..6358ff75 100644 --- a/tests/MiniExcelTests/SaveByTemplate/MiniExcelTemplateTests.cs +++ b/tests/MiniExcelTests/SaveByTemplate/MiniExcelTemplateTests.cs @@ -1,4 +1,5 @@ -using MiniExcelLib.Core.Enums; +using MiniExcelLib.Enums; +using MiniExcelLib.OpenXml.Picture; using OfficeOpenXml.Drawing; namespace MiniExcelLib.Tests.SaveByTemplate; @@ -115,7 +116,7 @@ public void DatatableTemptyRowTest() _templater.ApplyXlsxTemplate(path.ToString(), templatePath, value); var rows = _importer.QueryXlsx(path.ToString()).ToList(); - var dimension = Helpers.GetFirstSheetDimensionRefValue(path.ToString()); + var dimension = SheetHelper.GetFirstSheetDimensionRefValue(path.ToString()); Assert.Equal("A1:C5", dimension); } { @@ -140,7 +141,7 @@ public void DatatableTemptyRowTest() _templater.ApplyXlsxTemplate(path.ToString(), templatePath, value); var rows = _importer.QueryXlsx(path.ToString()).ToList(); - var dimension = Helpers.GetFirstSheetDimensionRefValue(path.ToString()); + var dimension = SheetHelper.GetFirstSheetDimensionRefValue(path.ToString()); Assert.Equal("A1:C5", dimension); } } @@ -177,7 +178,7 @@ public void DatatableTest() { var rows = _importer.QueryXlsx(path).ToList(); - var dimension = Helpers.GetFirstSheetDimensionRefValue(path); + var dimension = SheetHelper.GetFirstSheetDimensionRefValue(path); Assert.Equal("A1:C9", dimension); Assert.Equal(9, rows.Count); @@ -219,7 +220,7 @@ public void DatatableTest() Assert.Equal("Keaton", rows[8].B); Assert.Equal("IT", rows[8].C); - var dimension = Helpers.GetFirstSheetDimensionRefValue(path); + var dimension = SheetHelper.GetFirstSheetDimensionRefValue(path); Assert.Equal("A1:C9", dimension); } } @@ -261,7 +262,7 @@ public void DapperTemplateTest() Assert.Equal("Keaton", rows[8].B); Assert.Equal("IT", rows[8].C); - var dimension = Helpers.GetFirstSheetDimensionRefValue(path); + var dimension = SheetHelper.GetFirstSheetDimensionRefValue(path); Assert.Equal("A1:C9", dimension); } @@ -285,7 +286,7 @@ public void DapperTemplateTest() Assert.Equal("Keaton", rows[8].B); Assert.Equal("IT", rows[8].C); - var dimension = Helpers.GetFirstSheetDimensionRefValue(path); + var dimension = SheetHelper.GetFirstSheetDimensionRefValue(path); Assert.Equal("A1:C9", dimension); } } @@ -336,7 +337,7 @@ public void DictionaryTemplateTest() Assert.Equal("Keaton", rows[8].B); Assert.Equal("IT", rows[8].C); - var dimension = Helpers.GetFirstSheetDimensionRefValue(path); + var dimension = SheetHelper.GetFirstSheetDimensionRefValue(path); Assert.Equal("A1:C9", dimension); } @@ -360,7 +361,7 @@ public void DictionaryTemplateTest() Assert.Equal("Keaton", rows[8].B); Assert.Equal("IT", rows[8].C); - var dimension = Helpers.GetFirstSheetDimensionRefValue(path); + var dimension = SheetHelper.GetFirstSheetDimensionRefValue(path); Assert.Equal("A1:C9", dimension); } } @@ -420,7 +421,7 @@ public void GroupTemplateTest() Assert.Equal("Felix", rows[12].A); Assert.Equal("HR", rows[12].B); - var dimension = Helpers.GetFirstSheetDimensionRefValue(path); + var dimension = SheetHelper.GetFirstSheetDimensionRefValue(path); Assert.Equal("A1:B20", dimension); } @@ -466,7 +467,7 @@ public void TestGithubProject() Assert.Equal("ITWeiHan Github Projects", rows[0].B); Assert.Equal("Total Star : 178", rows[8].C); - var dimension = Helpers.GetFirstSheetDimensionRefValue(path.ToString()); + var dimension = SheetHelper.GetFirstSheetDimensionRefValue(path.ToString()); Assert.Equal("A1:D9", dimension); } @@ -556,7 +557,7 @@ public void TestIEnumerableType() Assert.Equal(poco.datetime, rows[4].datetime); Assert.Equal(poco.Guid, rows[4].Guid); - var dimension = Helpers.GetFirstSheetDimensionRefValue(path.ToString()); + var dimension = SheetHelper.GetFirstSheetDimensionRefValue(path.ToString()); Assert.Equal("A1:G6", dimension); } } @@ -590,7 +591,7 @@ public void TestTemplateTypeMapping() Assert.Equal(value.datetime, rows[0].datetime); Assert.Equal(value.Guid, rows[0].Guid); - var dimension = Helpers.GetFirstSheetDimensionRefValue(path.ToString()); + var dimension = SheetHelper.GetFirstSheetDimensionRefValue(path.ToString()); Assert.Equal("A1:G2", dimension); } } @@ -631,7 +632,7 @@ public void TemplateBasicTest() Assert.Equal(123, rows[1].D); Assert.Equal("Jack has 123 points", rows[1].E); - var dimension = Helpers.GetFirstSheetDimensionRefValue(path.ToString()); + var dimension = SheetHelper.GetFirstSheetDimensionRefValue(path.ToString()); Assert.Equal("A1:E2", dimension); } @@ -655,7 +656,7 @@ public void TemplateBasicTest() Assert.Equal(123, rows[1].D); Assert.Equal("Jack has 123 points", rows[1].E); - var dimension = Helpers.GetFirstSheetDimensionRefValue(path.ToString()); + var dimension = SheetHelper.GetFirstSheetDimensionRefValue(path.ToString()); Assert.Equal("A1:E2", dimension); } @@ -683,7 +684,7 @@ public void TemplateBasicTest() Assert.Equal(123, rows[1].D); Assert.Equal("Jack has 123 points", rows[1].E); - var dimension = Helpers.GetFirstSheetDimensionRefValue(path.ToString()); + var dimension = SheetHelper.GetFirstSheetDimensionRefValue(path.ToString()); Assert.Equal("A1:E2", dimension); } @@ -707,7 +708,7 @@ public void TemplateBasicTest() Assert.Equal(123, rows[1].D); Assert.Equal("Jack has 123 points", rows[1].E); - var dimension = Helpers.GetFirstSheetDimensionRefValue(path.ToString()); + var dimension = SheetHelper.GetFirstSheetDimensionRefValue(path.ToString()); Assert.Equal("A1:E2", dimension); } } @@ -734,7 +735,7 @@ public void TestIEnumerable() }; _templater.ApplyXlsxTemplate(path.ToString(), templatePath, value); - var dimension = Helpers.GetFirstSheetDimensionRefValue(path.ToString()); + var dimension = SheetHelper.GetFirstSheetDimensionRefValue(path.ToString()); Assert.Equal("A1:B7", dimension); } @@ -756,7 +757,7 @@ public void TestIEnumerable() }; _templater.ApplyXlsxTemplate(path.ToString(), templatePath, value); - var dimension = Helpers.GetFirstSheetDimensionRefValue(path.ToString()); + var dimension = SheetHelper.GetFirstSheetDimensionRefValue(path.ToString()); Assert.Equal("A1:B7", dimension); } @@ -781,7 +782,7 @@ public void TestIEnumerable() }; _templater.ApplyXlsxTemplate(path.ToString(), templatePath, value); - var dimension = Helpers.GetFirstSheetDimensionRefValue(path.ToString()); + var dimension = SheetHelper.GetFirstSheetDimensionRefValue(path.ToString()); Assert.Equal("A1:B7", dimension); } } @@ -806,7 +807,7 @@ public void TestIEnumerableWithFormulas() }; _templater.ApplyXlsxTemplate(path.ToString(), templatePath, value); - var dimension = Helpers.GetFirstSheetDimensionRefValue(path.ToString()); + var dimension = SheetHelper.GetFirstSheetDimensionRefValue(path.ToString()); Assert.Equal("A1:C13", dimension); } @@ -857,7 +858,7 @@ public void TemplateTest() Assert.Equal("Keaton", rows[8].B); Assert.Equal("IT", rows[8].C); - var dimension = Helpers.GetFirstSheetDimensionRefValue(path.ToString()); + var dimension = SheetHelper.GetFirstSheetDimensionRefValue(path.ToString()); Assert.Equal("A1:C9", dimension); } @@ -882,7 +883,7 @@ public void TemplateTest() Assert.Equal("Keaton", rows[8].B); Assert.Equal("IT", rows[8].C); - var dimension = Helpers.GetFirstSheetDimensionRefValue(path.ToString()); + var dimension = SheetHelper.GetFirstSheetDimensionRefValue(path.ToString()); Assert.Equal("A1:C9", dimension); } } @@ -927,7 +928,7 @@ public void TemplateTest() Assert.Equal("Keaton", rows[8].B); Assert.Equal("IT", rows[8].C); - var dimension = Helpers.GetFirstSheetDimensionRefValue(path.ToString()); + var dimension = SheetHelper.GetFirstSheetDimensionRefValue(path.ToString()); Assert.Equal("A1:C9", dimension); } } @@ -939,7 +940,7 @@ public void MergeSameCellsWithTagTest() using var mergedFilePath = AutoDeletingPath.Create(); _templater.MergeSameCells(mergedFilePath.ToString(), path); - var mergedCells = Helpers.GetFirstSheetMergedCells(mergedFilePath.ToString()); + var mergedCells = SheetHelper.GetFirstSheetMergedCells(mergedFilePath.ToString()); Assert.Equal("A2:A4", mergedCells[0]); Assert.Equal("C3:C4", mergedCells[1]); @@ -953,7 +954,7 @@ public void MergeSameCellsWithLimitTagTest() using var mergedFilePath = AutoDeletingPath.Create(); _templater.MergeSameCells(mergedFilePath.ToString(), path); - var mergedCells = Helpers.GetFirstSheetMergedCells(mergedFilePath.ToString()); + var mergedCells = SheetHelper.GetFirstSheetMergedCells(mergedFilePath.ToString()); Assert.Equal("A3:A4", mergedCells[0]); Assert.Equal("C3:C6", mergedCells[1]); diff --git a/tests/MiniExcelTests/Utils/Helpers.cs b/tests/MiniExcelTests/Utils/SheetHelper.cs similarity index 94% rename from tests/MiniExcelTests/Utils/Helpers.cs rename to tests/MiniExcelTests/Utils/SheetHelper.cs index cc9d03ca..2dbed612 100644 --- a/tests/MiniExcelTests/Utils/Helpers.cs +++ b/tests/MiniExcelTests/Utils/SheetHelper.cs @@ -4,7 +4,7 @@ namespace MiniExcelLib.Tests.Utils; -internal static class Helpers +internal static class SheetHelper { private const int GeneralColumnIndex = 255; private const int MaxColumnIndex = 16383; @@ -16,7 +16,6 @@ internal static class Helpers private static readonly Dictionary AlphabetMappingInt = Enumerable .Range(0, MaxColumnIndex) .ToDictionary(IntToLetters, i => i); - public static string GetAlphabetColumnName(int columnIndex) { @@ -108,7 +107,7 @@ internal static Dictionary GetFirstSheetMergedCells(string path) using var sheetStream = sheet.Open(); var doc = new XmlDocument(); doc.Load(sheetStream); - var mergeCells = doc.SelectSingleNode($"/x:worksheet/x:mergeCells", ns)?.Cast().ToList(); + var mergeCells = doc.SelectSingleNode("/x:worksheet/x:mergeCells", ns)?.Cast().ToList(); if (mergeCells is { Count: > 0 }) { From 08adb71d00f4f5da4d8ffeb6c0866324bc06df0c Mon Sep 17 00:00:00 2001 From: Michele Bastione Date: Mon, 7 Jul 2025 23:04:29 +0200 Subject: [PATCH 09/26] Added some more global usings --- src/MiniExcel.Csv/CsvReader.cs | 6 ----- src/MiniExcel.Csv/CsvWriter.cs | 7 +----- src/MiniExcel.Csv/GlobalUsings.cs | 2 ++ .../MiniExcelExtensions/Exporter.cs | 2 -- .../MiniExcelExtensions/Importer.cs | 1 - .../Abstractions/IMiniExcelWriteAdapter.cs | 4 +--- .../IMiniExcelWriteAdapterAsync.cs | 4 +--- .../Attributes/MiniExcelColumnAttribute.cs | 4 +--- .../MiniExcelColumnIndexAttribute.cs | 4 +--- .../DataReader/MiniExcelAsyncDataReader.cs | 2 +- .../DataReader/MiniExcelDataReaderBase.cs | 4 +--- src/MiniExcel/GlobalUsings.cs | 1 + src/MiniExcel/MiniExcelConfiguration.cs | 4 +--- src/MiniExcel/MiniExcelExporter.cs | 1 - src/MiniExcel/MiniExcelImporter.cs | 1 - src/MiniExcel/OpenXml/Constants/ExcelXml.cs | 3 +-- .../OpenXml/Constants/WorksheetXml.cs | 4 +--- .../OpenXml/Models/ExcelWidthCollection.cs | 2 -- src/MiniExcel/OpenXml/OpenXmlReader.cs | 3 --- src/MiniExcel/OpenXml/OpenXmlStyles.cs | 1 - .../OpenXml/OpenXmlWriter.DefaultOpenXml.cs | 3 --- src/MiniExcel/OpenXml/OpenXmlWriter.cs | 4 ---- .../OpenXml/Picture/OpenXmlPicture.cs | 1 - .../OpenXml/Styles/SheetStyleBuildContext.cs | 4 +--- .../OpenXml/Styles/SheetStyleBuilderHelper.cs | 5 +---- .../OpenXml/Templates/OpenXmlTemplate.Impl.cs | 22 ++++++++----------- .../OpenXml/Templates/OpenXmlTemplate.cs | 3 --- .../Templates/OpenXmlValueExtractor.cs | 3 --- .../Reflection/CustomPropertyHelper.cs | 2 -- .../Reflection/MiniExcelColumnInfo.cs | 2 -- src/MiniExcel/Reflection/MiniExcelMapper.cs | 2 -- .../AsyncEnumerableWriteAdapter.cs | 5 +---- .../WriteAdapters/DataReaderWriteAdapter.cs | 5 +---- .../WriteAdapters/DataTableWriteAdapter.cs | 5 +---- .../WriteAdapters/EnumerableWriteAdapter.cs | 6 +---- .../MiniExcelDataReaderWriteAdapter.cs | 5 +---- .../MiniExcelWriteAdapterFactory.cs | 5 +---- tests/MiniExcelTests/MiniExcelIssueTests.cs | 4 ++-- tests/MiniExcelTests/Utils/SheetHelper.cs | 12 +++++----- 39 files changed, 38 insertions(+), 120 deletions(-) diff --git a/src/MiniExcel.Csv/CsvReader.cs b/src/MiniExcel.Csv/CsvReader.cs index 18e58d78..dc90893b 100644 --- a/src/MiniExcel.Csv/CsvReader.cs +++ b/src/MiniExcel.Csv/CsvReader.cs @@ -1,9 +1,3 @@ -using MiniExcelLib.Exceptions; -using MiniExcelLib.Helpers; -using MiniExcelLib.Reflection; -using IMiniExcelReader = MiniExcelLib.Abstractions.IMiniExcelReader; -using MiniExcelMapper = MiniExcelLib.Reflection.MiniExcelMapper; - namespace MiniExcelLib.Csv; internal partial class CsvReader : IMiniExcelReader diff --git a/src/MiniExcel.Csv/CsvWriter.cs b/src/MiniExcel.Csv/CsvWriter.cs index 71f07fac..aba6fa4e 100644 --- a/src/MiniExcel.Csv/CsvWriter.cs +++ b/src/MiniExcel.Csv/CsvWriter.cs @@ -1,9 +1,4 @@ -using MiniExcelLib.Abstractions; -using MiniExcelLib.Reflection; -using MiniExcelLib.WriteAdapters; -using IMiniExcelWriter = MiniExcelLib.Abstractions.IMiniExcelWriter; - -namespace MiniExcelLib.Csv; +namespace MiniExcelLib.Csv; internal partial class CsvWriter : IMiniExcelWriter, IDisposable { diff --git a/src/MiniExcel.Csv/GlobalUsings.cs b/src/MiniExcel.Csv/GlobalUsings.cs index 83f2cc2a..79ef9c06 100644 --- a/src/MiniExcel.Csv/GlobalUsings.cs +++ b/src/MiniExcel.Csv/GlobalUsings.cs @@ -9,6 +9,8 @@ global using System.Text.RegularExpressions; global using MiniExcelLib; global using MiniExcelLib.Abstractions; +global using MiniExcelLib.Exceptions; global using MiniExcelLib.Helpers; global using MiniExcelLib.Reflection; +global using MiniExcelLib.WriteAdapters; global using Zomp.SyncMethodGenerator; \ No newline at end of file diff --git a/src/MiniExcel.Csv/MiniExcelExtensions/Exporter.cs b/src/MiniExcel.Csv/MiniExcelExtensions/Exporter.cs index 0685c7b6..508bb810 100644 --- a/src/MiniExcel.Csv/MiniExcelExtensions/Exporter.cs +++ b/src/MiniExcel.Csv/MiniExcelExtensions/Exporter.cs @@ -1,5 +1,3 @@ -using MiniExcelLib.Helpers; - namespace MiniExcelLib.Csv.MiniExcelExtensions; public static partial class Exporter diff --git a/src/MiniExcel.Csv/MiniExcelExtensions/Importer.cs b/src/MiniExcel.Csv/MiniExcelExtensions/Importer.cs index 50a76c44..0b89677b 100644 --- a/src/MiniExcel.Csv/MiniExcelExtensions/Importer.cs +++ b/src/MiniExcel.Csv/MiniExcelExtensions/Importer.cs @@ -1,5 +1,4 @@ using MiniExcelLib.DataReader; -using MiniExcelLib.Helpers; namespace MiniExcelLib.Csv.MiniExcelExtensions; diff --git a/src/MiniExcel/Abstractions/IMiniExcelWriteAdapter.cs b/src/MiniExcel/Abstractions/IMiniExcelWriteAdapter.cs index 4150e0a8..c4da1031 100644 --- a/src/MiniExcel/Abstractions/IMiniExcelWriteAdapter.cs +++ b/src/MiniExcel/Abstractions/IMiniExcelWriteAdapter.cs @@ -1,6 +1,4 @@ -using MiniExcelLib.Reflection; - -namespace MiniExcelLib.Abstractions; +namespace MiniExcelLib.Abstractions; public interface IMiniExcelWriteAdapter { diff --git a/src/MiniExcel/Abstractions/IMiniExcelWriteAdapterAsync.cs b/src/MiniExcel/Abstractions/IMiniExcelWriteAdapterAsync.cs index a06c1c76..21804018 100644 --- a/src/MiniExcel/Abstractions/IMiniExcelWriteAdapterAsync.cs +++ b/src/MiniExcel/Abstractions/IMiniExcelWriteAdapterAsync.cs @@ -1,6 +1,4 @@ -using MiniExcelLib.Reflection; - -namespace MiniExcelLib.Abstractions; +namespace MiniExcelLib.Abstractions; public interface IMiniExcelWriteAdapterAsync { diff --git a/src/MiniExcel/Attributes/MiniExcelColumnAttribute.cs b/src/MiniExcel/Attributes/MiniExcelColumnAttribute.cs index 27c2ace3..340d26ea 100644 --- a/src/MiniExcel/Attributes/MiniExcelColumnAttribute.cs +++ b/src/MiniExcel/Attributes/MiniExcelColumnAttribute.cs @@ -1,6 +1,4 @@ -using MiniExcelLib.Helpers; - -namespace MiniExcelLib.Attributes; +namespace MiniExcelLib.Attributes; [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field)] public class MiniExcelColumnAttribute : Attribute diff --git a/src/MiniExcel/Attributes/MiniExcelColumnIndexAttribute.cs b/src/MiniExcel/Attributes/MiniExcelColumnIndexAttribute.cs index c9992568..ff90f9be 100644 --- a/src/MiniExcel/Attributes/MiniExcelColumnIndexAttribute.cs +++ b/src/MiniExcel/Attributes/MiniExcelColumnIndexAttribute.cs @@ -1,6 +1,4 @@ -using MiniExcelLib.Helpers; - -namespace MiniExcelLib.Attributes; +namespace MiniExcelLib.Attributes; [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field)] public class MiniExcelColumnIndexAttribute : Attribute diff --git a/src/MiniExcel/DataReader/MiniExcelAsyncDataReader.cs b/src/MiniExcel/DataReader/MiniExcelAsyncDataReader.cs index ea75e5ef..fa1a275e 100644 --- a/src/MiniExcel/DataReader/MiniExcelAsyncDataReader.cs +++ b/src/MiniExcel/DataReader/MiniExcelAsyncDataReader.cs @@ -1,6 +1,6 @@ namespace MiniExcelLib.DataReader; -// todo: this is way improvable, let's try to merge the sync and async implementations +// todo: this is way improvable, ideally the sync and async implementations into a single datareader public class MiniExcelAsyncDataReader : MiniExcelDataReaderBase, IAsyncDisposable { private readonly IAsyncEnumerator> _source; diff --git a/src/MiniExcel/DataReader/MiniExcelDataReaderBase.cs b/src/MiniExcel/DataReader/MiniExcelDataReaderBase.cs index 376a8749..9ed4fdbd 100644 --- a/src/MiniExcel/DataReader/MiniExcelDataReaderBase.cs +++ b/src/MiniExcel/DataReader/MiniExcelDataReaderBase.cs @@ -1,6 +1,4 @@ -using MiniExcelLib.Abstractions; - -namespace MiniExcelLib.DataReader; +namespace MiniExcelLib.DataReader; /// /// IMiniExcelDataReader Base Class diff --git a/src/MiniExcel/GlobalUsings.cs b/src/MiniExcel/GlobalUsings.cs index 824c7a69..c38200dc 100644 --- a/src/MiniExcel/GlobalUsings.cs +++ b/src/MiniExcel/GlobalUsings.cs @@ -10,6 +10,7 @@ global using System.Text.RegularExpressions; global using System.Xml; global using MiniExcelLib.Abstractions; +global using MiniExcelLib.Attributes; global using MiniExcelLib.Helpers; global using MiniExcelLib.OpenXml; global using MiniExcelLib.OpenXml.Utils; diff --git a/src/MiniExcel/MiniExcelConfiguration.cs b/src/MiniExcel/MiniExcelConfiguration.cs index 60e2ee70..85ab2bf9 100644 --- a/src/MiniExcel/MiniExcelConfiguration.cs +++ b/src/MiniExcel/MiniExcelConfiguration.cs @@ -1,6 +1,4 @@ -using MiniExcelLib.Attributes; - -namespace MiniExcelLib; +namespace MiniExcelLib; public interface IMiniExcelConfiguration; diff --git a/src/MiniExcel/MiniExcelExporter.cs b/src/MiniExcel/MiniExcelExporter.cs index 3272e2c3..118cef2c 100644 --- a/src/MiniExcel/MiniExcelExporter.cs +++ b/src/MiniExcel/MiniExcelExporter.cs @@ -1,5 +1,4 @@ using MiniExcelLib.OpenXml.Picture; -using OpenXmlWriter = MiniExcelLib.OpenXml.OpenXmlWriter; namespace MiniExcelLib; diff --git a/src/MiniExcel/MiniExcelImporter.cs b/src/MiniExcel/MiniExcelImporter.cs index d1763270..44e057ad 100644 --- a/src/MiniExcel/MiniExcelImporter.cs +++ b/src/MiniExcel/MiniExcelImporter.cs @@ -3,7 +3,6 @@ using MiniExcelLib.DataReader; using MiniExcelLib.OpenXml.Models; using MiniExcelLib.OpenXml.Zip; -using OpenXmlReader = MiniExcelLib.OpenXml.OpenXmlReader; namespace MiniExcelLib; diff --git a/src/MiniExcel/OpenXml/Constants/ExcelXml.cs b/src/MiniExcel/OpenXml/Constants/ExcelXml.cs index 7a6d9c91..87e87cb1 100644 --- a/src/MiniExcel/OpenXml/Constants/ExcelXml.cs +++ b/src/MiniExcel/OpenXml/Constants/ExcelXml.cs @@ -1,5 +1,4 @@ -using MiniExcelLib.Helpers; -using MiniExcelLib.OpenXml.Models; +using MiniExcelLib.OpenXml.Models; namespace MiniExcelLib.OpenXml.Constants; diff --git a/src/MiniExcel/OpenXml/Constants/WorksheetXml.cs b/src/MiniExcel/OpenXml/Constants/WorksheetXml.cs index e1738572..ef5f8532 100644 --- a/src/MiniExcel/OpenXml/Constants/WorksheetXml.cs +++ b/src/MiniExcel/OpenXml/Constants/WorksheetXml.cs @@ -1,6 +1,4 @@ -using MiniExcelLib.Attributes; - -namespace MiniExcelLib.OpenXml.Constants; +namespace MiniExcelLib.OpenXml.Constants; internal static class WorksheetXml { diff --git a/src/MiniExcel/OpenXml/Models/ExcelWidthCollection.cs b/src/MiniExcel/OpenXml/Models/ExcelWidthCollection.cs index 31bdbc7f..e1ac0d38 100644 --- a/src/MiniExcel/OpenXml/Models/ExcelWidthCollection.cs +++ b/src/MiniExcel/OpenXml/Models/ExcelWidthCollection.cs @@ -1,5 +1,3 @@ -using MiniExcelLib.Reflection; - namespace MiniExcelLib.OpenXml.Models; public sealed class ExcelColumnWidth diff --git a/src/MiniExcel/OpenXml/OpenXmlReader.cs b/src/MiniExcel/OpenXml/OpenXmlReader.cs index 136a1423..e174de62 100644 --- a/src/MiniExcel/OpenXml/OpenXmlReader.cs +++ b/src/MiniExcel/OpenXml/OpenXmlReader.cs @@ -1,10 +1,7 @@ using System.Collections.ObjectModel; -using MiniExcelLib.Helpers; using MiniExcelLib.OpenXml.Constants; using MiniExcelLib.OpenXml.Models; -using MiniExcelLib.OpenXml.Utils; using MiniExcelLib.OpenXml.Zip; -using MiniExcelLib.Reflection; using IMiniExcelReader = MiniExcelLib.Abstractions.IMiniExcelReader; using MiniExcelMapper = MiniExcelLib.Reflection.MiniExcelMapper; using XmlReaderHelper = MiniExcelLib.OpenXml.Utils.XmlReaderHelper; diff --git a/src/MiniExcel/OpenXml/OpenXmlStyles.cs b/src/MiniExcel/OpenXml/OpenXmlStyles.cs index 17efd141..29b21960 100644 --- a/src/MiniExcel/OpenXml/OpenXmlStyles.cs +++ b/src/MiniExcel/OpenXml/OpenXmlStyles.cs @@ -1,5 +1,4 @@ using MiniExcelLib.OpenXml.Constants; -using MiniExcelLib.OpenXml.Utils; using MiniExcelLib.OpenXml.Zip; namespace MiniExcelLib.OpenXml; diff --git a/src/MiniExcel/OpenXml/OpenXmlWriter.DefaultOpenXml.cs b/src/MiniExcel/OpenXml/OpenXmlWriter.DefaultOpenXml.cs index 2469fd26..db5ff468 100644 --- a/src/MiniExcel/OpenXml/OpenXmlWriter.DefaultOpenXml.cs +++ b/src/MiniExcel/OpenXml/OpenXmlWriter.DefaultOpenXml.cs @@ -1,9 +1,6 @@ -using MiniExcelLib.Helpers; using MiniExcelLib.OpenXml.Constants; using MiniExcelLib.OpenXml.Models; -using MiniExcelLib.OpenXml.Utils; using MiniExcelLib.OpenXml.Zip; -using MiniExcelLib.Reflection; using static MiniExcelLib.Helpers.ImageHelper; using IMiniExcelWriter = MiniExcelLib.Abstractions.IMiniExcelWriter; diff --git a/src/MiniExcel/OpenXml/OpenXmlWriter.cs b/src/MiniExcel/OpenXml/OpenXmlWriter.cs index 36518e2a..67736f82 100644 --- a/src/MiniExcel/OpenXml/OpenXmlWriter.cs +++ b/src/MiniExcel/OpenXml/OpenXmlWriter.cs @@ -1,12 +1,8 @@ using System.Xml.Linq; -using MiniExcelLib.Abstractions; -using MiniExcelLib.Helpers; using MiniExcelLib.OpenXml.Constants; using MiniExcelLib.OpenXml.Models; using MiniExcelLib.OpenXml.Styles; -using MiniExcelLib.OpenXml.Utils; using MiniExcelLib.OpenXml.Zip; -using MiniExcelLib.Reflection; using MiniExcelLib.WriteAdapters; using IMiniExcelWriter = MiniExcelLib.Abstractions.IMiniExcelWriter; using SafeStreamWriter = MiniExcelLib.Helpers.SafeStreamWriter; diff --git a/src/MiniExcel/OpenXml/Picture/OpenXmlPicture.cs b/src/MiniExcel/OpenXml/Picture/OpenXmlPicture.cs index be9a1be0..ef692395 100644 --- a/src/MiniExcel/OpenXml/Picture/OpenXmlPicture.cs +++ b/src/MiniExcel/OpenXml/Picture/OpenXmlPicture.cs @@ -1,6 +1,5 @@ using System.Drawing; using MiniExcelLib.Enums; -using MiniExcelLib.OpenXml.Utils; namespace MiniExcelLib.OpenXml.Picture; diff --git a/src/MiniExcel/OpenXml/Styles/SheetStyleBuildContext.cs b/src/MiniExcel/OpenXml/Styles/SheetStyleBuildContext.cs index dd69d939..5dae01e6 100644 --- a/src/MiniExcel/OpenXml/Styles/SheetStyleBuildContext.cs +++ b/src/MiniExcel/OpenXml/Styles/SheetStyleBuildContext.cs @@ -1,6 +1,4 @@ -using MiniExcelLib.Attributes; -using MiniExcelLib.Helpers; -using MiniExcelLib.OpenXml.Constants; +using MiniExcelLib.OpenXml.Constants; using MiniExcelLib.OpenXml.Zip; namespace MiniExcelLib.OpenXml.Styles; diff --git a/src/MiniExcel/OpenXml/Styles/SheetStyleBuilderHelper.cs b/src/MiniExcel/OpenXml/Styles/SheetStyleBuilderHelper.cs index 0cd19199..7b8e9d7a 100644 --- a/src/MiniExcel/OpenXml/Styles/SheetStyleBuilderHelper.cs +++ b/src/MiniExcel/OpenXml/Styles/SheetStyleBuilderHelper.cs @@ -1,7 +1,4 @@ -using MiniExcelLib.Attributes; -using MiniExcelLib.OpenXml.Utils; - -namespace MiniExcelLib.OpenXml.Styles; +namespace MiniExcelLib.OpenXml.Styles; public static class SheetStyleBuilderHelper { diff --git a/src/MiniExcel/OpenXml/Templates/OpenXmlTemplate.Impl.cs b/src/MiniExcel/OpenXml/Templates/OpenXmlTemplate.Impl.cs index fca26946..712e7f15 100644 --- a/src/MiniExcel/OpenXml/Templates/OpenXmlTemplate.Impl.cs +++ b/src/MiniExcel/OpenXml/Templates/OpenXmlTemplate.Impl.cs @@ -1,8 +1,4 @@ -using MiniExcelLib.Attributes; -using MiniExcelLib.Helpers; using MiniExcelLib.OpenXml.Constants; -using MiniExcelLib.OpenXml.Utils; -using MiniExcelLib.Reflection; namespace MiniExcelLib.OpenXml.Templates; @@ -135,19 +131,19 @@ internal partial class OpenXmlTemplate private List _newXMergeCellInfos; #if NET7_0_OR_GREATER - [GeneratedRegex("([A-Z]+)([0-9]+)")] private static partial Regex CellRegexImpl(); - private static readonly Regex CellRegex = CellRegexImpl(); - [GeneratedRegex(@"\{\{(.*?)\}\}")] private static partial Regex TemplateRegexImpl(); - private static readonly Regex TemplateRegex = TemplateRegexImpl(); - [GeneratedRegex(@".*?\{\{.*?\}\}.*?")] private static partial Regex NonTemplateRegexImpl(); - private static readonly Regex NonTemplateRegex = NonTemplateRegexImpl(); + [GeneratedRegex("([A-Z]+)([0-9]+)")] private static partial Regex CellRegexImpl(); + private static readonly Regex CellRegex = CellRegexImpl(); + [GeneratedRegex(@"\{\{(.*?)\}\}")] private static partial Regex TemplateRegexImpl(); + private static readonly Regex TemplateRegex = TemplateRegexImpl(); + [GeneratedRegex(@".*?\{\{.*?\}\}.*?")] private static partial Regex NonTemplateRegexImpl(); + private static readonly Regex NonTemplateRegex = NonTemplateRegexImpl(); #else private static readonly Regex CellRegex = new("([A-Z]+)([0-9]+)", RegexOptions.Compiled); private static readonly Regex TemplateRegex = new(@"\{\{(.*?)\}\}", RegexOptions.Compiled); private static readonly Regex NonTemplateRegex = new(@".*?\{\{.*?\}\}.*?", RegexOptions.Compiled); #endif - [Zomp.SyncMethodGenerator.CreateSyncVersion] + [CreateSyncVersion] private async Task GenerateSheetXmlImplByUpdateModeAsync(ZipArchiveEntry sheetZipEntry, Stream stream, Stream sheetStream, IDictionary inputMaps, IDictionary sharedStrings, bool mergeCells = false, CancellationToken cancellationToken = default) { var doc = new XmlDocument(); @@ -271,7 +267,7 @@ private static IEnumerable ParseConditionalFormatRanges( } } - [Zomp.SyncMethodGenerator.CreateSyncVersion] + [CreateSyncVersion] private async Task WriteSheetXmlAsync(Stream outputFileStream, XmlDocument doc, XmlNode sheetData, bool mergeCells = false, CancellationToken cancellationToken = default) { //Q.Why so complex? @@ -586,7 +582,7 @@ class GenerateCellValuesContext } //todo: refactor in a way that needs less parameters - [Zomp.SyncMethodGenerator.CreateSyncVersion] + [CreateSyncVersion] private async Task GenerateCellValuesAsync(GenerateCellValuesContext generateCellValuesContext, string endPrefix, StreamWriter writer, StringBuilder rowXml, int mergeRowCount, bool isHeaderRow, XRowInfo rowInfo, XmlElement row, int groupingRowDiff, diff --git a/src/MiniExcel/OpenXml/Templates/OpenXmlTemplate.cs b/src/MiniExcel/OpenXml/Templates/OpenXmlTemplate.cs index 91cc6197..16600d73 100644 --- a/src/MiniExcel/OpenXml/Templates/OpenXmlTemplate.cs +++ b/src/MiniExcel/OpenXml/Templates/OpenXmlTemplate.cs @@ -1,8 +1,5 @@ -using MiniExcelLib.Abstractions; using MiniExcelLib.OpenXml.Constants; using MiniExcelLib.OpenXml.Zip; -using CalcChainHelper = MiniExcelLib.OpenXml.Utils.CalcChainHelper; -using IMiniExcelTemplate = MiniExcelLib.Abstractions.IMiniExcelTemplate; namespace MiniExcelLib.OpenXml.Templates; diff --git a/src/MiniExcel/OpenXml/Templates/OpenXmlValueExtractor.cs b/src/MiniExcel/OpenXml/Templates/OpenXmlValueExtractor.cs index ec08055f..eb9ceacd 100644 --- a/src/MiniExcel/OpenXml/Templates/OpenXmlValueExtractor.cs +++ b/src/MiniExcel/OpenXml/Templates/OpenXmlValueExtractor.cs @@ -1,6 +1,3 @@ -using MiniExcelLib.Abstractions; -using MiniExcelLib.Helpers; - namespace MiniExcelLib.OpenXml.Templates; public class OpenXmlValueExtractor : IInputValueExtractor diff --git a/src/MiniExcel/Reflection/CustomPropertyHelper.cs b/src/MiniExcel/Reflection/CustomPropertyHelper.cs index 27976df2..46874459 100644 --- a/src/MiniExcel/Reflection/CustomPropertyHelper.cs +++ b/src/MiniExcel/Reflection/CustomPropertyHelper.cs @@ -1,6 +1,4 @@ using System.ComponentModel; -using MiniExcelLib.Attributes; -using MiniExcelLib.Helpers; namespace MiniExcelLib.Reflection; diff --git a/src/MiniExcel/Reflection/MiniExcelColumnInfo.cs b/src/MiniExcel/Reflection/MiniExcelColumnInfo.cs index c3feeaad..b0ebf98d 100644 --- a/src/MiniExcel/Reflection/MiniExcelColumnInfo.cs +++ b/src/MiniExcel/Reflection/MiniExcelColumnInfo.cs @@ -1,5 +1,3 @@ -using MiniExcelLib.Attributes; - namespace MiniExcelLib.Reflection; public class MiniExcelColumnInfo diff --git a/src/MiniExcel/Reflection/MiniExcelMapper.cs b/src/MiniExcel/Reflection/MiniExcelMapper.cs index cca41a6d..09c27e24 100644 --- a/src/MiniExcel/Reflection/MiniExcelMapper.cs +++ b/src/MiniExcel/Reflection/MiniExcelMapper.cs @@ -1,7 +1,5 @@ using System.ComponentModel; using MiniExcelLib.Exceptions; -using MiniExcelLib.Helpers; -using MiniExcelLib.OpenXml.Utils; namespace MiniExcelLib.Reflection; diff --git a/src/MiniExcel/WriteAdapters/AsyncEnumerableWriteAdapter.cs b/src/MiniExcel/WriteAdapters/AsyncEnumerableWriteAdapter.cs index 3940b3a0..ae348ca2 100644 --- a/src/MiniExcel/WriteAdapters/AsyncEnumerableWriteAdapter.cs +++ b/src/MiniExcel/WriteAdapters/AsyncEnumerableWriteAdapter.cs @@ -1,7 +1,4 @@ -using MiniExcelLib.Abstractions; -using MiniExcelLib.Reflection; - -namespace MiniExcelLib.WriteAdapters; +namespace MiniExcelLib.WriteAdapters; internal class AsyncEnumerableWriteAdapter(IAsyncEnumerable values, MiniExcelBaseConfiguration configuration) : IMiniExcelWriteAdapterAsync { diff --git a/src/MiniExcel/WriteAdapters/DataReaderWriteAdapter.cs b/src/MiniExcel/WriteAdapters/DataReaderWriteAdapter.cs index edad6f44..9d247f95 100644 --- a/src/MiniExcel/WriteAdapters/DataReaderWriteAdapter.cs +++ b/src/MiniExcel/WriteAdapters/DataReaderWriteAdapter.cs @@ -1,7 +1,4 @@ -using MiniExcelLib.Abstractions; -using MiniExcelLib.Reflection; - -namespace MiniExcelLib.WriteAdapters; +namespace MiniExcelLib.WriteAdapters; internal class DataReaderWriteAdapter(IDataReader reader, MiniExcelBaseConfiguration configuration) : IMiniExcelWriteAdapter { diff --git a/src/MiniExcel/WriteAdapters/DataTableWriteAdapter.cs b/src/MiniExcel/WriteAdapters/DataTableWriteAdapter.cs index 1e3cbe59..1d607843 100644 --- a/src/MiniExcel/WriteAdapters/DataTableWriteAdapter.cs +++ b/src/MiniExcel/WriteAdapters/DataTableWriteAdapter.cs @@ -1,7 +1,4 @@ -using MiniExcelLib.Abstractions; -using MiniExcelLib.Reflection; - -namespace MiniExcelLib.WriteAdapters; +namespace MiniExcelLib.WriteAdapters; internal class DataTableWriteAdapter(DataTable dataTable, MiniExcelBaseConfiguration configuration) : IMiniExcelWriteAdapter { diff --git a/src/MiniExcel/WriteAdapters/EnumerableWriteAdapter.cs b/src/MiniExcel/WriteAdapters/EnumerableWriteAdapter.cs index cd5dd25b..582e8299 100644 --- a/src/MiniExcel/WriteAdapters/EnumerableWriteAdapter.cs +++ b/src/MiniExcel/WriteAdapters/EnumerableWriteAdapter.cs @@ -1,8 +1,4 @@ -using MiniExcelLib.Abstractions; -using MiniExcelLib.Helpers; -using MiniExcelLib.Reflection; - -namespace MiniExcelLib.WriteAdapters; +namespace MiniExcelLib.WriteAdapters; internal class EnumerableWriteAdapter(IEnumerable values, MiniExcelBaseConfiguration configuration) : IMiniExcelWriteAdapter { diff --git a/src/MiniExcel/WriteAdapters/MiniExcelDataReaderWriteAdapter.cs b/src/MiniExcel/WriteAdapters/MiniExcelDataReaderWriteAdapter.cs index 15a5871f..0d02afc5 100644 --- a/src/MiniExcel/WriteAdapters/MiniExcelDataReaderWriteAdapter.cs +++ b/src/MiniExcel/WriteAdapters/MiniExcelDataReaderWriteAdapter.cs @@ -1,7 +1,4 @@ -using MiniExcelLib.Abstractions; -using MiniExcelLib.Reflection; - -namespace MiniExcelLib.WriteAdapters; +namespace MiniExcelLib.WriteAdapters; internal class MiniExcelDataReaderWriteAdapter(IMiniExcelDataReader reader, MiniExcelBaseConfiguration configuration) : IMiniExcelWriteAdapterAsync { diff --git a/src/MiniExcel/WriteAdapters/MiniExcelWriteAdapterFactory.cs b/src/MiniExcel/WriteAdapters/MiniExcelWriteAdapterFactory.cs index cf765e2e..07ceb2d8 100644 --- a/src/MiniExcel/WriteAdapters/MiniExcelWriteAdapterFactory.cs +++ b/src/MiniExcel/WriteAdapters/MiniExcelWriteAdapterFactory.cs @@ -1,7 +1,4 @@ -using MiniExcelLib.Abstractions; -using MiniExcelLib.Helpers; - -namespace MiniExcelLib.WriteAdapters; +namespace MiniExcelLib.WriteAdapters; public static class MiniExcelWriteAdapterFactory { diff --git a/tests/MiniExcelTests/MiniExcelIssueTests.cs b/tests/MiniExcelTests/MiniExcelIssueTests.cs index 4e1db9ff..db8ad4dc 100644 --- a/tests/MiniExcelTests/MiniExcelIssueTests.cs +++ b/tests/MiniExcelTests/MiniExcelIssueTests.cs @@ -540,7 +540,7 @@ UNION ALL """; using var reader = command.ExecuteReader(); - _exporter.ExportXlsx(path.ToString(), reader, configuration: config); + _exporter.ExportXlsx(path.ToString(), reader, configuration: config); } var xml = SheetHelper.GetZipFileContent(path.ToString(), "xl/worksheets/sheet1.xml"); @@ -582,7 +582,7 @@ UNION ALL using var command = new SQLiteCommand("select * from T", connection); connection.Open(); using var reader = command.ExecuteReader(); - _exporter.ExportXlsx(path.ToString(), reader, configuration: config); + _exporter.ExportXlsx(path.ToString(), reader, configuration: config); } var xml = SheetHelper.GetZipFileContent(path.ToString(), "xl/worksheets/sheet1.xml"); diff --git a/tests/MiniExcelTests/Utils/SheetHelper.cs b/tests/MiniExcelTests/Utils/SheetHelper.cs index 2dbed612..740179ad 100644 --- a/tests/MiniExcelTests/Utils/SheetHelper.cs +++ b/tests/MiniExcelTests/Utils/SheetHelper.cs @@ -80,9 +80,9 @@ internal static string GetZipFileContent(string zipPath, string filePath) using var stream = File.OpenRead(path); using var archive = new ZipArchive(stream, ZipArchiveMode.Read, false, Encoding.UTF8); - var sheet = archive.Entries - .Single(w => w.FullName.StartsWith("xl/worksheets/sheet1", StringComparison.OrdinalIgnoreCase) || - w.FullName.StartsWith("/xl/worksheets/sheet1", StringComparison.OrdinalIgnoreCase)); + var sheet = archive.Entries.Single(w => + w.FullName.StartsWith("xl/worksheets/sheet1", StringComparison.OrdinalIgnoreCase) || + w.FullName.StartsWith("/xl/worksheets/sheet1", StringComparison.OrdinalIgnoreCase)); using var sheetStream = sheet.Open(); var doc = XDocument.Load(sheetStream); @@ -100,9 +100,9 @@ internal static Dictionary GetFirstSheetMergedCells(string path) using var stream = File.OpenRead(path); using var archive = new ZipArchive(stream, ZipArchiveMode.Read, false, Encoding.UTF8); - var sheet = archive.Entries - .Single(w => w.FullName.StartsWith("xl/worksheets/sheet1", StringComparison.OrdinalIgnoreCase) || - w.FullName.StartsWith("/xl/worksheets/sheet1", StringComparison.OrdinalIgnoreCase)); + var sheet = archive.Entries.Single(w => + w.FullName.StartsWith("xl/worksheets/sheet1", StringComparison.OrdinalIgnoreCase) || + w.FullName.StartsWith("/xl/worksheets/sheet1", StringComparison.OrdinalIgnoreCase)); using var sheetStream = sheet.Open(); var doc = new XmlDocument(); From 2dcf442d1a9001cbba1fd6125b844a4489f41fd0 Mon Sep 17 00:00:00 2001 From: Victor Irzak Date: Wed, 9 Jul 2025 14:51:01 -0400 Subject: [PATCH 10/26] Separate CSV test cases --- MiniExcel.slnx | 12 +- src/MiniExcel.Csv/MiniExcel.Csv.csproj | 7 +- tests/MiniExcel.Csv.Tests/AsyncIssueTests.cs | 276 ++++++ tests/MiniExcel.Csv.Tests/IssueTests.cs | 854 ++++++++++++++++++ .../MiniExcel.Csv.Tests.csproj | 46 + .../MiniExcelCsvAsycTests.cs | 4 +- .../MiniExcelCsvTests.cs | 6 +- .../MiniExcel.Tests.Common.csproj | 15 + .../Utils/AutoDeletingPath.cs | 2 +- .../Utils/Db.cs | 11 +- .../Utils/PathHelper.cs | 4 +- tests/MiniExcelTests/GlobalUsings.cs | 2 - .../MiniExcelAutoAdjustWidthTests.cs | 1 + .../MiniExcelIssueAsyncTests.cs | 251 +---- tests/MiniExcelTests/MiniExcelIssueTests.cs | 845 +---------------- .../MiniExcelOpenXmlAsyncTests.cs | 1 + .../MiniExcelOpenXmlConfigurationTest.cs | 1 + .../MiniExcelOpenXmlMultipleSheetTests.cs | 1 + tests/MiniExcelTests/MiniExcelOpenXmlTests.cs | 1 + tests/MiniExcelTests/MiniExcelTests.csproj | 5 +- .../MiniExcelTemplateAsyncTests.cs | 4 +- .../SaveByTemplate/MiniExcelTemplateTests.cs | 1 + 22 files changed, 1232 insertions(+), 1118 deletions(-) create mode 100644 tests/MiniExcel.Csv.Tests/AsyncIssueTests.cs create mode 100644 tests/MiniExcel.Csv.Tests/IssueTests.cs create mode 100644 tests/MiniExcel.Csv.Tests/MiniExcel.Csv.Tests.csproj rename tests/{MiniExcelTests => MiniExcel.Csv.Tests}/MiniExcelCsvAsycTests.cs (96%) rename tests/{MiniExcelTests => MiniExcel.Csv.Tests}/MiniExcelCsvTests.cs (96%) create mode 100644 tests/MiniExcel.Tests.Common/MiniExcel.Tests.Common.csproj rename tests/{MiniExcelTests => MiniExcel.Tests.Common}/Utils/AutoDeletingPath.cs (91%) rename tests/{MiniExcelTests => MiniExcel.Tests.Common}/Utils/Db.cs (78%) rename tests/{MiniExcelTests => MiniExcel.Tests.Common}/Utils/PathHelper.cs (87%) diff --git a/MiniExcel.slnx b/MiniExcel.slnx index 353b5425..54d1620b 100644 --- a/MiniExcel.slnx +++ b/MiniExcel.slnx @@ -1,6 +1,6 @@ - + - + @@ -22,10 +22,12 @@ - - + + - + + + \ No newline at end of file diff --git a/src/MiniExcel.Csv/MiniExcel.Csv.csproj b/src/MiniExcel.Csv/MiniExcel.Csv.csproj index b5205d7c..547249d3 100644 --- a/src/MiniExcel.Csv/MiniExcel.Csv.csproj +++ b/src/MiniExcel.Csv/MiniExcel.Csv.csproj @@ -1,4 +1,4 @@ - + MiniExcelLib.Csv @@ -7,5 +7,8 @@ - + + + + diff --git a/tests/MiniExcel.Csv.Tests/AsyncIssueTests.cs b/tests/MiniExcel.Csv.Tests/AsyncIssueTests.cs new file mode 100644 index 00000000..060c2498 --- /dev/null +++ b/tests/MiniExcel.Csv.Tests/AsyncIssueTests.cs @@ -0,0 +1,276 @@ +using MiniExcelLib.Tests.Common.Utils; + +namespace MiniExcel.Csv.Tests; + +public class AsyncIssueTests +{ + private readonly MiniExcelExporter _exporter = MiniExcelLib.MiniExcel.GetExporter(); + private readonly MiniExcelImporter _importer = MiniExcelLib.MiniExcel.GetImporter(); + + /// + /// Csv SaveAs by datareader with encoding default show messy code #253 + /// + [Fact] + public async Task Issue253() + { + { + var value = new[] { new { col1 = "世界你好" } }; + using var path = AutoDeletingPath.Create(ExcelType.Csv); + + await _exporter.ExportCsvAsync(path.ToString(), value); + const string expected = + """ + col1 + 世界你好 + + """; + + Assert.Equal(expected, await File.ReadAllTextAsync(path.ToString())); + } + + { + Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); + var value = new[] { new { col1 = "世界你好" } }; + using var path = AutoDeletingPath.Create(ExcelType.Csv); + + var config = new CsvConfiguration + { + StreamWriterFunc = stream => new StreamWriter(stream, Encoding.GetEncoding("gb2312")) + }; + + await _exporter.ExportCsvAsync(path.ToString(), value, configuration: config); + const string expected = + """ + col1 + ������� + + """; + + Assert.Equal(expected, await File.ReadAllTextAsync(path.ToString())); + } + + await using var cn = Db.GetConnection(); + + { + var value = await cn.ExecuteReaderAsync("select '世界你好' col1"); + using var path = AutoDeletingPath.Create(ExcelType.Csv); + await _exporter.ExportCsvAsync(path.ToString(), value); + const string expected = + """ + col1 + 世界你好 + + """; + + Assert.Equal(expected, await File.ReadAllTextAsync(path.ToString())); + } + } + + /// + /// [CSV SaveAs support datareader · Issue #251 · mini-software/MiniExcel](https://github.com/mini-software/MiniExcel/issues/251) + /// + [Fact] + public async Task Issue251() + { + await using var cn = Db.GetConnection(); + var reader = await cn.ExecuteReaderAsync(@"select '""<>+-*//}{\\n' a,1234567890 b union all select 'Hello World',-1234567890"); + + using var path = AutoDeletingPath.Create(ExcelType.Csv); + var rowsWritten = await _exporter.ExportCsvAsync(path.ToString(), reader); + + Assert.Single(rowsWritten); + Assert.Equal(2, rowsWritten[0]); + + const string expected = + """" + a,b + """<>+-*//}{\\n",1234567890 + "Hello World",-1234567890 + + """"; + + Assert.Equal(expected, await File.ReadAllTextAsync(path.ToString())); + } + + private class Issue89VO + { + public WorkState State { get; set; } + + public enum WorkState + { + OnDuty, + Leave, + Fired + } + } + + /// + /// Support Enum Mapping + /// https://github.com/mini-software/MiniExcel/issues/89 + /// + [Fact] + public async Task Issue89() + { + //csv + { + const string text = + """ + State + OnDuty + Fired + Leave + """; + await using var stream = new MemoryStream(); + await using var writer = new StreamWriter(stream); + + await writer.WriteAsync(text); + await writer.FlushAsync(); + + stream.Position = 0; + var q = _importer.QueryCsvAsync(stream).ToBlockingEnumerable(); + var rows = q.ToList(); + + Assert.Equal(Issue89VO.WorkState.OnDuty, rows[0].State); + Assert.Equal(Issue89VO.WorkState.Fired, rows[1].State); + Assert.Equal(Issue89VO.WorkState.Leave, rows[2].State); + + var outputPath = PathHelper.GetTempPath("xlsx"); + var rowsWritten = await _exporter.ExportXlsxAsync(outputPath, rows); + Assert.Single(rowsWritten); + Assert.Equal(3, rowsWritten[0]); + + var q2 = _importer.QueryXlsxAsync(outputPath).ToBlockingEnumerable(); + var rows2 = q2.ToList(); + Assert.Equal(Issue89VO.WorkState.OnDuty, rows2[0].State); + Assert.Equal(Issue89VO.WorkState.Fired, rows2[1].State); + Assert.Equal(Issue89VO.WorkState.Leave, rows2[2].State); + } + + //xlsx + { + var path = PathHelper.GetFile("xlsx/TestIssue89.xlsx"); + var q = _importer.QueryXlsxAsync(path).ToBlockingEnumerable(); + var rows = q.ToList(); + Assert.Equal(Issue89VO.WorkState.OnDuty, rows[0].State); + Assert.Equal(Issue89VO.WorkState.Fired, rows[1].State); + Assert.Equal(Issue89VO.WorkState.Leave, rows[2].State); + + var outputPath = PathHelper.GetTempPath(); + var rowsWritten = await _exporter.ExportXlsxAsync(outputPath, rows); + Assert.Single(rowsWritten); + Assert.Equal(3, rowsWritten[0]); + + var q1 = _importer.QueryXlsxAsync(outputPath).ToBlockingEnumerable(); + var rows2 = q1.ToList(); + Assert.Equal(Issue89VO.WorkState.OnDuty, rows2[0].State); + Assert.Equal(Issue89VO.WorkState.Fired, rows2[1].State); + Assert.Equal(Issue89VO.WorkState.Leave, rows2[2].State); + } + } + + private class Issue142VoDuplicateColumnName + { + [MiniExcelColumnIndex("A")] + public int MyProperty1 { get; set; } + [MiniExcelColumnIndex("A")] + public int MyProperty2 { get; set; } + + public int MyProperty3 { get; set; } + [MiniExcelColumnIndex("B")] + public int MyProperty4 { get; set; } + } + + [Fact] + public async Task Issue142() + { + { + using var file = AutoDeletingPath.Create(); + var path = file.ToString(); + await _exporter.ExportXlsxAsync(path, new[] { new Issue142VO { MyProperty1 = "MyProperty1", MyProperty2 = "MyProperty2", MyProperty3 = "MyProperty3", MyProperty4 = "MyProperty4", MyProperty5 = "MyProperty5", MyProperty6 = "MyProperty6", MyProperty7 = "MyProperty7" } }); + + { + var q = _importer.QueryXlsxAsync(path).ToBlockingEnumerable(); + var rows = q.ToList(); + Assert.Equal("MyProperty4", rows[0].A); + Assert.Equal("CustomColumnName", rows[0].B); //note + 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.Equal("MyProperty3", rows[0].G); + + Assert.Equal("MyProperty4", rows[0].A); + Assert.Equal("CustomColumnName", rows[0].B); //note + 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.Equal("MyProperty3", rows[0].G); + } + + { + var q = _importer.QueryXlsxAsync(path).ToBlockingEnumerable(); + var rows = q.ToList(); + + Assert.Equal("MyProperty4", rows[0].MyProperty4); + Assert.Equal("MyProperty1", rows[0].MyProperty1); //note + Assert.Equal("MyProperty5", rows[0].MyProperty5); + Assert.Equal("MyProperty2", rows[0].MyProperty2); + Assert.Equal("MyProperty6", rows[0].MyProperty6); + Assert.Null(rows[0].MyProperty7); + Assert.Equal("MyProperty3", rows[0].MyProperty3); + } + } + + { + using var file = AutoDeletingPath.Create(ExcelType.Csv); + var path = file.ToString(); + await _exporter.ExportCsvAsync(path, new[] { new Issue142VO { MyProperty1 = "MyProperty1", MyProperty2 = "MyProperty2", MyProperty3 = "MyProperty3", MyProperty4 = "MyProperty4", MyProperty5 = "MyProperty5", MyProperty6 = "MyProperty6", MyProperty7 = "MyProperty7" } }); + const string expected = + """ + MyProperty4,CustomColumnName,MyProperty5,MyProperty2,MyProperty6,,MyProperty3 + MyProperty4,MyProperty1,MyProperty5,MyProperty2,MyProperty6,,MyProperty3 + + """; + Assert.Equal(expected, await File.ReadAllTextAsync(path)); + + { + var q = _importer.QueryCsvAsync(path).ToBlockingEnumerable(); + var rows = q.ToList(); + + Assert.Equal("MyProperty4", rows[0].MyProperty4); + Assert.Equal("MyProperty1", rows[0].MyProperty1); + Assert.Equal("MyProperty5", rows[0].MyProperty5); + Assert.Equal("MyProperty2", rows[0].MyProperty2); + Assert.Equal("MyProperty6", rows[0].MyProperty6); + Assert.Null(rows[0].MyProperty7); + Assert.Equal("MyProperty3", rows[0].MyProperty3); + } + } + + { + using var path = AutoDeletingPath.Create(); + Issue142VoDuplicateColumnName[] input = [new() { MyProperty1 = 0, MyProperty2 = 0, MyProperty3 = 0, MyProperty4 = 0 }]; + Assert.Throws(() => _exporter.ExportXlsx(path.ToString(), input)); + } + } + + #region Duplicated + private class Issue142VO + { + [MiniExcelColumnName("CustomColumnName")] + public string MyProperty1 { get; set; } //index = 1 + [MiniExcelIgnore] + public string MyProperty7 { get; set; } //index = null + public string MyProperty2 { get; set; } //index = 3 + [MiniExcelColumnIndex(6)] + public string MyProperty3 { get; set; } //index = 6 + [MiniExcelColumnIndex("A")] // equal column index 0 + public string MyProperty4 { get; set; } + [MiniExcelColumnIndex(2)] + public string MyProperty5 { get; set; } //index = 2 + public string MyProperty6 { get; set; } //index = 4 + } + #endregion + +} diff --git a/tests/MiniExcel.Csv.Tests/IssueTests.cs b/tests/MiniExcel.Csv.Tests/IssueTests.cs new file mode 100644 index 00000000..96d3544d --- /dev/null +++ b/tests/MiniExcel.Csv.Tests/IssueTests.cs @@ -0,0 +1,854 @@ +using MiniExcelLib.Tests.Common.Utils; + +namespace MiniExcel.Csv.Tests; + +public class IssueTests +{ + private readonly MiniExcelImporter _importer = MiniExcelLib.MiniExcel.GetImporter(); + private readonly MiniExcelExporter _exporter = MiniExcelLib.MiniExcel.GetExporter(); + + [Fact] + public void TestPR10() + { + var path = PathHelper.GetFile("csv/TestIssue142.csv"); + var config = new CsvConfiguration + { + SplitFn = row => Regex.Split(row, "[\t,](?=(?:[^\"]|\"[^\"]*\")*$)") + .Select(s => Regex.Replace(s.Replace("\"\"", "\""), "^\"|\"$", "")) + .ToArray() + }; + var rows = _importer.QueryCsv(path, configuration: config).ToList(); + } + + /// + /// https://gitee.com/dotnetchina/MiniExcel/issues/I4X92G + /// + [Fact] + public void TestIssueI4X92G() + { + using var file = AutoDeletingPath.Create(ExcelType.Csv); + var path = file.ToString(); + + { + var value = new[] + { + new { ID = 1, Name = "Jack", InDate = new DateTime(2021,01,03)}, + new { ID = 2, Name = "Henry", InDate = new DateTime(2020,05,03)} + }; + _exporter.ExportCsv(path, value); + var content = File.ReadAllText(path); + Assert.Equal( + """ + ID,Name,InDate + 1,Jack,"2021-01-03 00:00:00" + 2,Henry,"2020-05-03 00:00:00" + + """, + content); + } + { + var value = new { ID = 3, Name = "Mike", InDate = new DateTime(2021, 04, 23) }; + var rowsWritten = _exporter.AppendToCsv(path, value); + Assert.Equal(1, rowsWritten); + + var content = File.ReadAllText(path); + Assert.Equal( + """ + ID,Name,InDate + 1,Jack,"2021-01-03 00:00:00" + 2,Henry,"2020-05-03 00:00:00" + 3,Mike,"2021-04-23 00:00:00" + + """, + content); + } + { + var value = new[] + { + new { ID=4,Name ="Frank",InDate=new DateTime(2021,06,07)}, + new { ID=5,Name ="Gloria",InDate=new DateTime(2022,05,03)}, + }; + var rowsWritten = _exporter.AppendToCsv(path, value); + Assert.Equal(2, rowsWritten); + + var content = File.ReadAllText(path); + Assert.Equal( + """ + ID,Name,InDate + 1,Jack,"2021-01-03 00:00:00" + 2,Henry,"2020-05-03 00:00:00" + 3,Mike,"2021-04-23 00:00:00" + 4,Frank,"2021-06-07 00:00:00" + 5,Gloria,"2022-05-03 00:00:00" + + """, + content); + } + } + + private class TestIssue316Dto + { + public decimal Amount { get; set; } + public DateTime CreateTime { get; set; } + } + + /// + /// Using stream.SaveAs will close the Stream automatically when Specifying excelType + /// https://gitee.com/dotnetchina/MiniExcel/issues/I57WMM + /// + [Fact] + public void TestIssueI57WMM() + { + Dictionary[] sheets = [new() { ["ID"] = "0001", ["Name"] = "Jack" }]; + using var stream = new MemoryStream(); + + var config = new CsvConfiguration { StreamWriterFunc = x => new StreamWriter(x, Encoding.Default, leaveOpen: true) }; + _exporter.ExportCsv(stream, sheets, configuration: config); + stream.Seek(0, SeekOrigin.Begin); + + // convert stream to string + using var reader = new StreamReader(stream); + var text = reader.ReadToEnd(); + + Assert.Equal("ID,Name\r\n0001,Jack\r\n", text); + } + + [Fact] + public async Task TestIssue338() + { + Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); + { + var path = PathHelper.GetFile("csv/TestIssue338.csv"); + var row = _importer.QueryCsvAsync(path).ToBlockingEnumerable().FirstOrDefault(); + Assert.Equal("���IJ�������", row!.A); + } + { + var path = PathHelper.GetFile("csv/TestIssue338.csv"); + var config = new CsvConfiguration + { + StreamReaderFunc = stream => new StreamReader(stream, Encoding.GetEncoding("gb2312")) + }; + var row = _importer.QueryCsvAsync(path, configuration: config).ToBlockingEnumerable().FirstOrDefault(); + Assert.Equal("中文测试内容", row!.A); + } + { + var path = PathHelper.GetFile("csv/TestIssue338.csv"); + var config = new CsvConfiguration + { + StreamReaderFunc = stream => new StreamReader(stream, Encoding.GetEncoding("gb2312")) + }; + await using (var stream = new FileStream(path, FileMode.Open, FileAccess.Read)) + { + var row = _importer.QueryCsvAsync(stream, configuration: config).ToBlockingEnumerable().FirstOrDefault(); + Assert.Equal("中文测试内容", row!.A); + } + } + } + + [Fact] + public void TestIssueI4WDA9() + { + using var path = AutoDeletingPath.Create(ExcelType.Csv); + var value = new DataTable(); + { + value.Columns.Add("\"name\""); + value.Rows.Add("\"Jack\""); + } + + _exporter.ExportCsv(path.ToString(), value); + Assert.Equal("\"\"\"name\"\"\"\r\n\"\"\"Jack\"\"\"\r\n", File.ReadAllText(path.ToString())); + } + + [Fact] + public void TestIssue316() + { + // XLSX + { + using var file = AutoDeletingPath.Create(); + var path = file.ToString(); + var value = new[] + { + new{ Amount=123_456.789M, CreateTime=DateTime.Parse("2018-01-31",CultureInfo.InvariantCulture)} + }; + var config = new OpenXmlConfiguration + { + Culture = new CultureInfo("fr-FR"), + }; + _exporter.ExportXlsx(path, value, configuration: config); + + //Datetime error + Assert.Throws(() => + { + var conf = new OpenXmlConfiguration + { + Culture = new CultureInfo("en-US"), + }; + _ = _importer.QueryXlsx(path, configuration: conf).ToList(); + }); + + // dynamic + var rows = _importer.QueryXlsx(path, true).ToList(); + Assert.Equal("123456,789", rows[0].Amount); + Assert.Equal("31/01/2018 00:00:00", rows[0].CreateTime); + } + + // type + { + using var file = AutoDeletingPath.Create(); + var path = file.ToString(); + var value = new[] + { + new { Amount = 123_456.789M, CreateTime = new DateTime(2018, 5, 12) } + }; + { + var config = new OpenXmlConfiguration + { + Culture = new CultureInfo("fr-FR"), + }; + _exporter.ExportXlsx(path, value, configuration: config); + } + + { + var rows = _importer.QueryXlsx(path, true).ToList(); + Assert.Equal("123456,789", rows[0].Amount); + Assert.Equal("12/05/2018 00:00:00", rows[0].CreateTime); + } + + { + var config = new OpenXmlConfiguration + { + Culture = new CultureInfo("en-US"), + }; + var rows = _importer.QueryXlsx(path, configuration: config).ToList(); + + Assert.Equal("2018-12-05 00:00:00", rows[0].CreateTime.ToString("yyyy-MM-dd HH:mm:ss")); + Assert.Equal(123456789m, rows[0].Amount); + } + + { + var config = new OpenXmlConfiguration + { + Culture = new CultureInfo("fr-FR"), + }; + var rows = _importer.QueryXlsx(path, configuration: config).ToList(); + + Assert.Equal("2018-05-12 00:00:00", rows[0].CreateTime.ToString("yyyy-MM-dd HH:mm:ss")); + Assert.Equal(123456.789m, rows[0].Amount); + } + } + + // CSV + { + using var file = AutoDeletingPath.Create(ExcelType.Csv); + var path = file.ToString(); + var value = new[] + { + new { Amount = 123_456.789M, CreateTime = new DateTime(2018, 1, 31) } + }; + + var config = new CsvConfiguration + { + Culture = new CultureInfo("fr-FR"), + }; + _exporter.ExportCsv(path, value, configuration: config); + + //Datetime error + Assert.Throws(() => + { + var conf = new CsvConfiguration + { + Culture = new CultureInfo("en-US") + }; + _ = _importer.QueryCsv(path, configuration: conf).ToList(); + }); + + // dynamic + var rows = _importer.QueryCsv(path, true).ToList(); + Assert.Equal("123456,789", rows[0].Amount); + Assert.Equal("31/01/2018 00:00:00", rows[0].CreateTime); + } + + // type + { + using var file = AutoDeletingPath.Create(ExcelType.Csv); + var path = file.ToString(); + + var value = new[] + { + new{ Amount=123_456.789M, CreateTime=DateTime.Parse("2018-05-12", CultureInfo.InvariantCulture)} + }; + { + var config = new CsvConfiguration + { + Culture = new CultureInfo("fr-FR"), + }; + _exporter.ExportCsv(path, value, configuration: config); + } + + { + var rows = _importer.QueryCsv(path, true).ToList(); + Assert.Equal("123456,789", rows[0].Amount); + Assert.Equal("12/05/2018 00:00:00", rows[0].CreateTime); + } + + { + var config = new CsvConfiguration + { + Culture = new CultureInfo("en-US"), + }; + var rows = _importer.QueryCsv(path, configuration: config).ToList(); + + Assert.Equal("2018-12-05 00:00:00", rows[0].CreateTime.ToString("yyyy-MM-dd HH:mm:ss")); + Assert.Equal(123456789m, rows[0].Amount); + } + + { + var config = new CsvConfiguration + { + Culture = new CultureInfo("fr-FR"), + }; + var rows = _importer.QueryCsv(path, configuration: config).ToList(); + + Assert.Equal("2018-05-12 00:00:00", rows[0].CreateTime.ToString("yyyy-MM-dd HH:mm:ss")); + Assert.Equal(123456.789m, rows[0].Amount); + } + } + } + + /// + /// Column '' does not belong to table when csv convert to datatable #298 + /// https://github.com/mini-software/MiniExcel/issues/298 + /// + [Fact] + public void TestIssue298() + { + var path = PathHelper.GetFile("/csv/TestIssue298.csv"); +#pragma warning disable CS0618 // Type or member is obsolete + var dt = _importer.QueryCsvAsDataTable(path); +#pragma warning restore CS0618 + Assert.Equal(["ID", "Name", "Age"], dt.Columns.Cast().Select(x => x.ColumnName)); + } + /// + /// [According to the XLSX to CSV example, there will be data loss if there is no header. · Issue #292 · mini-software/MiniExcel](https://github.com/mini-software/MiniExcel/issues/292) + /// + [Fact] + public void TestIssue292() + { + { + var xlsxPath = PathHelper.GetFile("/xlsx/TestIssue292.xlsx"); + using var csvPath = AutoDeletingPath.Create(ExcelType.Csv); + _exporter.ConvertXlsxToCsv(xlsxPath, csvPath.ToString(), false); + + var actualCotent = File.ReadAllText(csvPath.ToString()); + Assert.Equal( + """ + Name,Age,Name,Age + Jack,22,Mike,25 + Henry,44,Jerry,44 + + """, + actualCotent); + } + + { + var csvPath = PathHelper.GetFile("/csv/TestIssue292.csv"); + using var path = AutoDeletingPath.Create(); + _exporter.ConvertCsvToXlsx(csvPath, path.ToString()); + + var rows = _importer.QueryXlsx(path.ToString()).ToList(); + Assert.Equal(3, rows.Count); + Assert.Equal("Name", rows[0].A); + Assert.Equal("Age", rows[0].B); + Assert.Equal("Name", rows[0].C); + Assert.Equal("Age", rows[0].D); + Assert.Equal("Jack", rows[1].A); + Assert.Equal("22", rows[1].B); + Assert.Equal("Mike", rows[1].C); + Assert.Equal("25", rows[1].D); + } + } + + /// + /// [Csv Query then SaveAs will throw "Stream was not readable." exception · Issue #293 · mini-software/MiniExcel](https://github.com/mini-software/MiniExcel/issues/293) + /// + [Fact] + public void TestIssue293() + { + var path = PathHelper.GetFile("/csv/Test5x2.csv"); + using var tempPath = AutoDeletingPath.Create(); + using var csv = File.OpenRead(path); + var value = _importer.QueryCsv(csv, useHeaderRow: false); + _exporter.ExportXlsx(tempPath.ToString(), value, printHeader: false); + } + + /// + /// Csv not support QueryAsDataTable #279 https://github.com/mini-software/MiniExcel/issues/279 + /// + [Fact] + public void TestIssue279() + { + var path = PathHelper.GetFile("/csv/TestHeader.csv"); +#pragma warning disable CS0618 // Type or member is obsolete + using var dt = _importer.QueryCsvAsDataTable(path); +#pragma warning restore CS0618 + Assert.Equal("A1", dt.Rows[0]["Column1"]); + Assert.Equal("A2", dt.Rows[1]["Column1"]); + Assert.Equal("B1", dt.Rows[0]["Column2"]); + Assert.Equal("B2", dt.Rows[1]["Column2"]); + } + + /// + /// [Convert csv to xlsx · Issue #261 · mini-software/MiniExcel](https://github.com/mini-software/MiniExcel/issues/261) + /// + [Fact] + public void TestIssue261() + { + var csvPath = PathHelper.GetFile("csv/TestCsvToXlsx.csv"); + using var path = AutoDeletingPath.Create(); + + _exporter.ConvertCsvToXlsx(csvPath, path.FilePath); + var rows = _importer.QueryXlsx(path.ToString()).ToList(); + + Assert.Equal("Name", rows[0].A); + Assert.Equal("Jack", rows[1].A); + Assert.Equal("Neo", rows[2].A); + Assert.Null(rows[3].A); + Assert.Null(rows[4].A); + Assert.Equal("Age", rows[0].B); + Assert.Equal("34", rows[1].B); + Assert.Equal("26", rows[2].B); + Assert.Null(rows[3].B); + Assert.Null(rows[4].B); + } + + /// + /// Csv SaveAs by datareader with encoding default show messy code #253 + /// + [Fact] + public void Issue253() + { + { + var value = new[] { new { col1 = "世界你好" } }; + using var path = AutoDeletingPath.Create(ExcelType.Csv); + _exporter.ExportCsv(path.ToString(), value); + const string expected = + """ + col1 + 世界你好 + + """; + Assert.Equal(expected, File.ReadAllText(path.ToString())); + } + + { + Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); + var value = new[] { new { col1 = "世界你好" } }; + using var path = AutoDeletingPath.Create(ExcelType.Csv); + var config = new CsvConfiguration + { + StreamWriterFunc = stream => new StreamWriter(stream, Encoding.GetEncoding("gb2312")) + }; + _exporter.ExportCsv(path.ToString(), value, configuration: config); + const string expected = + """ + col1 + ������� + + """; + Assert.Equal(expected, File.ReadAllText(path.ToString())); + } + + using var cn = Db.GetConnection(); + + { + var value = cn.ExecuteReader("select '世界你好' col1"); + using var path = AutoDeletingPath.Create(ExcelType.Csv); + _exporter.ExportCsv(path.ToString(), value); + const string expected = + """ + col1 + 世界你好 + + """; + Assert.Equal(expected, File.ReadAllText(path.ToString())); + } + } + + /// + /// [CSV SaveAs support datareader · Issue #251 · mini-software/MiniExcel](https://github.com/mini-software/MiniExcel/issues/251) + /// + [Fact] + public void Issue251() + { + using var cn = Db.GetConnection(); + using var reader = cn.ExecuteReader(@"select '""<>+-*//}{\\n' a,1234567890 b union all select 'Hello World',-1234567890"); + using var path = AutoDeletingPath.Create(ExcelType.Csv); + _exporter.ExportCsv(path.ToString(), reader); + const string expected = + """" + a,b + """<>+-*//}{\\n",1234567890 + "Hello World",-1234567890 + + """"; + + Assert.Equal(expected, File.ReadAllText(path.ToString())); + } + + public class Issue89VO + { + public WorkState State { get; set; } + + public enum WorkState + { + OnDuty, + Leave, + Fired + } + } + + /// + /// Support Enum Mapping + /// https://github.com/mini-software/MiniExcel/issues/89 + /// + [Fact] + public void Issue89() + { + //csv + { + const string text = + """ + State + OnDuty + Fired + Leave + """; + + using var stream = new MemoryStream(); + using var writer = new StreamWriter(stream); + + writer.Write(text); + writer.Flush(); + stream.Position = 0; + var rows = _importer.QueryCsv(stream, useHeaderRow: true).ToList(); + + Assert.Equal(nameof(Issue89VO.WorkState.OnDuty), rows[0].State); + Assert.Equal(nameof(Issue89VO.WorkState.Fired), rows[1].State); + Assert.Equal(nameof(Issue89VO.WorkState.Leave), rows[2].State); + + using var path = AutoDeletingPath.Create(ExcelType.Csv); + _exporter.ExportCsv(path.ToString(), rows); + var rows2 = _importer.QueryCsv(path.ToString()).ToList(); + + Assert.Equal(Issue89VO.WorkState.OnDuty, rows2[0].State); + Assert.Equal(Issue89VO.WorkState.Fired, rows2[1].State); + Assert.Equal(Issue89VO.WorkState.Leave, rows2[2].State); + } + + //xlsx + { + var path = PathHelper.GetFile("xlsx/TestIssue89.xlsx"); + var rows = _importer.QueryXlsx(path).ToList(); + + Assert.Equal(Issue89VO.WorkState.OnDuty, rows[0].State); + Assert.Equal(Issue89VO.WorkState.Fired, rows[1].State); + Assert.Equal(Issue89VO.WorkState.Leave, rows[2].State); + + using var xlsxPath = AutoDeletingPath.Create(); + _exporter.ExportXlsx(xlsxPath.ToString(), rows); + var rows2 = _importer.QueryXlsx(xlsxPath.ToString()).ToList(); + + Assert.Equal(Issue89VO.WorkState.OnDuty, rows2[0].State); + Assert.Equal(Issue89VO.WorkState.Fired, rows2[1].State); + Assert.Equal(Issue89VO.WorkState.Leave, rows2[2].State); + } + } + + private class Issue142VoDuplicateColumnName + { + [MiniExcelColumnIndex("A")] + public int MyProperty1 { get; set; } + [MiniExcelColumnIndex("A")] + public int MyProperty2 { get; set; } + + public int MyProperty3 { get; set; } + [MiniExcelColumnIndex("B")] + public int MyProperty4 { get; set; } + } + + private class Issue142VO + { + [MiniExcelColumnName("CustomColumnName")] + public string MyProperty1 { get; set; } //index = 1 + [MiniExcelIgnore] + public string MyProperty7 { get; set; } //index = null + public string MyProperty2 { get; set; } //index = 3 + [MiniExcelColumnIndex(6)] + public string MyProperty3 { get; set; } //index = 6 + [MiniExcelColumnIndex("A")] // equal column index 0 + public string MyProperty4 { get; set; } + [MiniExcelColumnIndex(2)] + public string MyProperty5 { get; set; } //index = 2 + public string MyProperty6 { get; set; } //index = 4 + } + + [Fact] + public void Issue142() + { + { + using var file = AutoDeletingPath.Create(); + var path = file.ToString(); + Issue142VO[] values = + [ + new() + { + MyProperty1 = "MyProperty1", MyProperty2 = "MyProperty2", MyProperty3 = "MyProperty3", + MyProperty4 = "MyProperty4", MyProperty5 = "MyProperty5", MyProperty6 = "MyProperty6", + MyProperty7 = "MyProperty7" + } + ]; + var rowsWritten = _exporter.ExportXlsx(path, values); + Assert.Single(rowsWritten); + Assert.Equal(1, rowsWritten[0]); + + { + var rows = _importer.QueryXlsx(path).ToList(); + + Assert.Equal("MyProperty4", rows[0].A); + Assert.Equal("CustomColumnName", rows[0].B); + 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.Equal("MyProperty3", rows[0].G); + + Assert.Equal("MyProperty4", rows[0].A); + Assert.Equal("CustomColumnName", rows[0].B); + 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.Equal("MyProperty3", rows[0].G); + } + + { + var rows = _importer.QueryXlsx(path).ToList(); + + Assert.Equal("MyProperty4", rows[0].MyProperty4); + Assert.Equal("MyProperty1", rows[0].MyProperty1); + Assert.Equal("MyProperty5", rows[0].MyProperty5); + Assert.Equal("MyProperty2", rows[0].MyProperty2); + Assert.Equal("MyProperty6", rows[0].MyProperty6); + Assert.Null(rows[0].MyProperty7); + Assert.Equal("MyProperty3", rows[0].MyProperty3); + } + } + + { + using var file = AutoDeletingPath.Create(ExcelType.Csv); + var path = file.ToString(); + Issue142VO[] values = + [ + new() + { + MyProperty1 = "MyProperty1", MyProperty2 = "MyProperty2", MyProperty3 = "MyProperty3", + MyProperty4 = "MyProperty4", MyProperty5 = "MyProperty5", MyProperty6 = "MyProperty6", + MyProperty7 = "MyProperty7" + } + ]; + var rowsWritten = _exporter.ExportCsv(path, values); + Assert.Single(rowsWritten); + Assert.Equal(1, rowsWritten[0]); + + const string expected = + """ + MyProperty4,CustomColumnName,MyProperty5,MyProperty2,MyProperty6,,MyProperty3 + MyProperty4,MyProperty1,MyProperty5,MyProperty2,MyProperty6,,MyProperty3 + + """; + + Assert.Equal(expected, File.ReadAllText(path)); + + { + var rows = _importer.QueryCsv(path).ToList(); + + Assert.Equal("MyProperty4", rows[0].MyProperty4); + Assert.Equal("MyProperty1", rows[0].MyProperty1); + Assert.Equal("MyProperty5", rows[0].MyProperty5); + Assert.Equal("MyProperty2", rows[0].MyProperty2); + Assert.Equal("MyProperty6", rows[0].MyProperty6); + Assert.Null(rows[0].MyProperty7); + Assert.Equal("MyProperty3", rows[0].MyProperty3); + } + } + + { + using var path = AutoDeletingPath.Create(ExcelType.Csv); + Issue142VoDuplicateColumnName[] input = + [ + new() { MyProperty1 = 0, MyProperty2 = 0, MyProperty3 = 0, MyProperty4 = 0 } + ]; + Assert.Throws(() => _exporter.ExportCsv(path.ToString(), input)); + } + } + + [Fact] + public void Issue142_Query() + { + const string path = "../../../../../samples/xlsx/TestIssue142.xlsx"; + const string csvPath = "../../../../../samples/csv/TestIssue142.csv"; + { + var rows = _importer.QueryXlsx(path).ToList(); + Assert.Equal(0, rows[0].MyProperty1); + } + + Assert.Throws(() => _importer.QueryXlsx(path).ToList()); + + var rowsXlsx = _importer.QueryXlsx(path).ToList(); + Assert.Equal("CustomColumnName", rowsXlsx[0].MyProperty1); + Assert.Null(rowsXlsx[0].MyProperty7); + Assert.Equal("MyProperty2", rowsXlsx[0].MyProperty2); + Assert.Equal("MyProperty103", rowsXlsx[0].MyProperty3); + Assert.Equal("MyProperty100", rowsXlsx[0].MyProperty4); + Assert.Equal("MyProperty102", rowsXlsx[0].MyProperty5); + Assert.Equal("MyProperty6", rowsXlsx[0].MyProperty6); + + var rowsCsv = _importer.QueryCsv(csvPath).ToList(); + Assert.Equal("CustomColumnName", rowsCsv[0].MyProperty1); + Assert.Null(rowsCsv[0].MyProperty7); + Assert.Equal("MyProperty2", rowsCsv[0].MyProperty2); + Assert.Equal("MyProperty103", rowsCsv[0].MyProperty3); + Assert.Equal("MyProperty100", rowsCsv[0].MyProperty4); + Assert.Equal("MyProperty102", rowsCsv[0].MyProperty5); + Assert.Equal("MyProperty6", rowsCsv[0].MyProperty6); + } + + private class Issue142VoOverIndex + { + [MiniExcelColumnIndex("Z")] + public int MyProperty1 { get; set; } + } + + private class Issue142VoExcelColumnNameNotFound + { + [MiniExcelColumnIndex("B")] + public int MyProperty1 { get; set; } + } + + private class Issue507V01 + { + public string A { get; set; } + public DateTime B { get; set; } + public string C { get; set; } + public int D { get; set; } + } + + + [Fact] + public void Issue507_1() + { + //Problem with multi-line when using Query func + //https://github.com/mini-software/MiniExcel/issues/507 + + var path = Path.Combine(Path.GetTempPath(), string.Concat(nameof(IssueTests), "_", nameof(Issue507_1), ".csv")); + var values = new Issue507V01[] + { + new() { A = "Github", B = DateTime.Parse("2021-01-01"), C = "abcd", D = 123 }, + new() { A = "Microsoft \nTest 1", B = DateTime.Parse("2021-02-01"), C = "efgh", D = 123 }, + new() { A = "Microsoft \rTest 2", B = DateTime.Parse("2021-02-01"), C = "ab\nc\nd", D = 123 }, + new() { A = "Microsoft\"\" \r\nTest\n3", B = DateTime.Parse("2021-02-01"), C = "a\"\"\nb\n\nc", D = 123 }, + }; + + var config = new CsvConfiguration + { + //AlwaysQuote = true, + ReadLineBreaksWithinQuotes = true, + }; + + // create + using (var stream = File.Create(path)) + { + _exporter.ExportCsv(stream, values, configuration: config); + } + + // read + var getRowsInfo = _importer.QueryCsv(path, configuration: config).ToArray(); + + Assert.Equal(values.Length, getRowsInfo.Length); + + Assert.Equal("Github", getRowsInfo[0].A); + Assert.Equal("abcd", getRowsInfo[0].C); + + Assert.Equal($"Microsoft {config.NewLine}Test 1", getRowsInfo[1].A); + Assert.Equal("efgh", getRowsInfo[1].C); + + Assert.Equal($"Microsoft {config.NewLine}Test 2", getRowsInfo[2].A); + Assert.Equal($"ab{config.NewLine}c{config.NewLine}d", getRowsInfo[2].C); + + Assert.Equal($"""Microsoft"" {config.NewLine}Test{config.NewLine}3""", getRowsInfo[3].A); + Assert.Equal($"""a""{config.NewLine}b{config.NewLine}{config.NewLine}c""", getRowsInfo[3].C); + + File.Delete(path); + } + + private class Issue507V02 + { + public DateTime B { get; set; } + public int D { get; set; } + } + + [Fact] + public void Issue507_2() + { + //Problem with multi-line when using Query func + //https://github.com/mini-software/MiniExcel/issues/507 + + var path = Path.Combine(Path.GetTempPath(), string.Concat(nameof(IssueTests), "_", nameof(Issue507_2), ".csv")); + var values = new Issue507V02[] + { + new() { B = DateTime.Parse("2021-01-01"), D = 123 }, + new() { B = DateTime.Parse("2021-02-01"), D = 123 }, + new() { B = DateTime.Parse("2021-02-01"), D = 123 }, + new() { B = DateTime.Parse("2021-02-01"), D = 123 }, + }; + + var config = new CsvConfiguration + { + //AlwaysQuote = true, + ReadLineBreaksWithinQuotes = true, + }; + + // create + using (var stream = File.Create(path)) + { + _exporter.ExportCsv(stream, values, true, config); + } + + // read + var getRowsInfo = _importer.QueryCsv(path, configuration: config).ToArray(); + Assert.Equal(values.Length, getRowsInfo.Length); + + File.Delete(path); + } + + [Fact] + public void Issue507_3_MismatchedQuoteCsv() + { + //Problem with multi-line when using Query func + //https://github.com/mini-software/MiniExcel/issues/507 + + var config = new CsvConfiguration + { + //AlwaysQuote = true, + ReadLineBreaksWithinQuotes = true, + }; + + // create + using var stream = new MemoryStream(Encoding.UTF8.GetBytes("A,B,C\n\"r1a: no end quote,r1b,r1c")); + + // read + var getRowsInfo = _importer.QueryCsv(stream, configuration: config).ToArray(); + Assert.Equal(2, getRowsInfo.Length); + } + +} diff --git a/tests/MiniExcel.Csv.Tests/MiniExcel.Csv.Tests.csproj b/tests/MiniExcel.Csv.Tests/MiniExcel.Csv.Tests.csproj new file mode 100644 index 00000000..c698b4c4 --- /dev/null +++ b/tests/MiniExcel.Csv.Tests/MiniExcel.Csv.Tests.csproj @@ -0,0 +1,46 @@ + + + + net8.0 + enable + enable + $(NoWarn);IDE0017;IDE0034;IDE0037;IDE0039;IDE0042;IDE0044;IDE0051;IDE0052;IDE0059;IDE0060;IDE0063;IDE1006;xUnit1004;CA1806;CA1816;CA1822;CA1825;CA1849;CA2000;CA2007;CA2208 + + false + true + true + ..\..\src\miniexcel.snk + MiniExcelLib.Csv.Tests + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/MiniExcelTests/MiniExcelCsvAsycTests.cs b/tests/MiniExcel.Csv.Tests/MiniExcelCsvAsycTests.cs similarity index 96% rename from tests/MiniExcelTests/MiniExcelCsvAsycTests.cs rename to tests/MiniExcel.Csv.Tests/MiniExcelCsvAsycTests.cs index 9f8636d9..3d0df48c 100644 --- a/tests/MiniExcelTests/MiniExcelCsvAsycTests.cs +++ b/tests/MiniExcel.Csv.Tests/MiniExcelCsvAsycTests.cs @@ -1,4 +1,6 @@ -using CsvReader = CsvHelper.CsvReader; +using MiniExcelLib.Tests.Common.Utils; +using System.Text; +using CsvReader = CsvHelper.CsvReader; namespace MiniExcelLib.Tests; diff --git a/tests/MiniExcelTests/MiniExcelCsvTests.cs b/tests/MiniExcel.Csv.Tests/MiniExcelCsvTests.cs similarity index 96% rename from tests/MiniExcelTests/MiniExcelCsvTests.cs rename to tests/MiniExcel.Csv.Tests/MiniExcelCsvTests.cs index c04d9f55..13ec806a 100644 --- a/tests/MiniExcelTests/MiniExcelCsvTests.cs +++ b/tests/MiniExcel.Csv.Tests/MiniExcelCsvTests.cs @@ -1,6 +1,6 @@ -using CsvHelper; -using MiniExcelLib.Attributes; -using MiniExcelLib.Exceptions; +using MiniExcelLib.Tests.Common.Utils; +using CsvReader = CsvHelper.CsvReader; +using CsvWriter = CsvHelper.CsvWriter; namespace MiniExcelLib.Tests; diff --git a/tests/MiniExcel.Tests.Common/MiniExcel.Tests.Common.csproj b/tests/MiniExcel.Tests.Common/MiniExcel.Tests.Common.csproj new file mode 100644 index 00000000..5b371db1 --- /dev/null +++ b/tests/MiniExcel.Tests.Common/MiniExcel.Tests.Common.csproj @@ -0,0 +1,15 @@ + + + + net8.0 + enable + enable + MiniExcelLib.Tests.Common + + + + + + + + diff --git a/tests/MiniExcelTests/Utils/AutoDeletingPath.cs b/tests/MiniExcel.Tests.Common/Utils/AutoDeletingPath.cs similarity index 91% rename from tests/MiniExcelTests/Utils/AutoDeletingPath.cs rename to tests/MiniExcel.Tests.Common/Utils/AutoDeletingPath.cs index b2e0dded..860e2d4b 100644 --- a/tests/MiniExcelTests/Utils/AutoDeletingPath.cs +++ b/tests/MiniExcel.Tests.Common/Utils/AutoDeletingPath.cs @@ -1,4 +1,4 @@ -namespace MiniExcelLib.Tests.Utils; +namespace MiniExcelLib.Tests.Common.Utils; public class AutoDeletingPath : IDisposable { diff --git a/tests/MiniExcelTests/Utils/Db.cs b/tests/MiniExcel.Tests.Common/Utils/Db.cs similarity index 78% rename from tests/MiniExcelTests/Utils/Db.cs rename to tests/MiniExcel.Tests.Common/Utils/Db.cs index a99ee8f6..95402519 100644 --- a/tests/MiniExcelTests/Utils/Db.cs +++ b/tests/MiniExcel.Tests.Common/Utils/Db.cs @@ -1,10 +1,13 @@ -namespace MiniExcelLib.Tests.Utils; +using System.Data.SQLite; +using System.Text; -internal static class Db +namespace MiniExcelLib.Tests.Common.Utils; + +public static class Db { - internal static SQLiteConnection GetConnection(string connectionString = "Data Source=:memory:") => new(connectionString); + public static SQLiteConnection GetConnection(string connectionString = "Data Source=:memory:") => new(connectionString); - internal static string GenerateDummyQuery(List> data) + public static string GenerateDummyQuery(List> data) { if (data is null or []) throw new ArgumentException("The data list cannot be null or empty."); diff --git a/tests/MiniExcelTests/Utils/PathHelper.cs b/tests/MiniExcel.Tests.Common/Utils/PathHelper.cs similarity index 87% rename from tests/MiniExcelTests/Utils/PathHelper.cs rename to tests/MiniExcel.Tests.Common/Utils/PathHelper.cs index 1edb6401..cba011ad 100644 --- a/tests/MiniExcelTests/Utils/PathHelper.cs +++ b/tests/MiniExcel.Tests.Common/Utils/PathHelper.cs @@ -1,6 +1,6 @@ -namespace MiniExcelLib.Tests.Utils; +namespace MiniExcelLib.Tests.Common.Utils; -internal static class PathHelper +public static class PathHelper { public static string GetFile(string fileName) => $"../../../../../samples/{fileName}"; diff --git a/tests/MiniExcelTests/GlobalUsings.cs b/tests/MiniExcelTests/GlobalUsings.cs index b11f8d10..08979c70 100644 --- a/tests/MiniExcelTests/GlobalUsings.cs +++ b/tests/MiniExcelTests/GlobalUsings.cs @@ -11,8 +11,6 @@ global using Dapper; global using MiniExcelLib; global using MiniExcelLib.OpenXml; -global using MiniExcelLib.Csv; -global using MiniExcelLib.Csv.MiniExcelExtensions; global using MiniExcelLib.Tests.Utils; global using OfficeOpenXml; global using Xunit; diff --git a/tests/MiniExcelTests/MiniExcelAutoAdjustWidthTests.cs b/tests/MiniExcelTests/MiniExcelAutoAdjustWidthTests.cs index 45506ec2..369f9b62 100644 --- a/tests/MiniExcelTests/MiniExcelAutoAdjustWidthTests.cs +++ b/tests/MiniExcelTests/MiniExcelAutoAdjustWidthTests.cs @@ -1,5 +1,6 @@ using DocumentFormat.OpenXml.Packaging; using DocumentFormat.OpenXml.Spreadsheet; +using MiniExcelLib.Tests.Common.Utils; using MiniExcelLib.OpenXml.Models; namespace MiniExcelLib.Tests; diff --git a/tests/MiniExcelTests/MiniExcelIssueAsyncTests.cs b/tests/MiniExcelTests/MiniExcelIssueAsyncTests.cs index 3e485ecf..6af8ce90 100644 --- a/tests/MiniExcelTests/MiniExcelIssueAsyncTests.cs +++ b/tests/MiniExcelTests/MiniExcelIssueAsyncTests.cs @@ -1,4 +1,5 @@ -using MiniExcelLib.Attributes; +using MiniExcelLib.Tests.Common.Utils; +using MiniExcelLib.Attributes; using Newtonsoft.Json; namespace MiniExcelLib.Tests; @@ -84,91 +85,6 @@ public async Task Issue256() } - /// - /// Csv SaveAs by datareader with encoding default show messy code #253 - /// - [Fact] - public async Task Issue253() - { - { - var value = new[] { new { col1 = "世界你好" } }; - using var path = AutoDeletingPath.Create(ExcelType.Csv); - - await _exporter.ExportCsvAsync(path.ToString(), value); - const string expected = - """ - col1 - 世界你好 - - """; - - Assert.Equal(expected, await File.ReadAllTextAsync(path.ToString())); - } - - { - Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); - var value = new[] { new { col1 = "世界你好" } }; - using var path = AutoDeletingPath.Create(ExcelType.Csv); - - var config = new CsvConfiguration - { - StreamWriterFunc = stream => new StreamWriter(stream, Encoding.GetEncoding("gb2312")) - }; - - await _exporter.ExportCsvAsync(path.ToString(), value, configuration: config); - const string expected = - """ - col1 - ������� - - """; - - Assert.Equal(expected, await File.ReadAllTextAsync(path.ToString())); - } - - await using var cn = Db.GetConnection(); - - { - var value = await cn.ExecuteReaderAsync("select '世界你好' col1"); - using var path = AutoDeletingPath.Create(ExcelType.Csv); - await _exporter.ExportCsvAsync(path.ToString(), value); - const string expected = - """ - col1 - 世界你好 - - """; - - Assert.Equal(expected, await File.ReadAllTextAsync(path.ToString())); - } - } - - /// - /// [CSV SaveAs support datareader · Issue #251 · mini-software/MiniExcel](https://github.com/mini-software/MiniExcel/issues/251) - /// - [Fact] - public async Task Issue251() - { - await using var cn = Db.GetConnection(); - var reader = await cn.ExecuteReaderAsync(@"select '""<>+-*//}{\\n' a,1234567890 b union all select 'Hello World',-1234567890"); - - using var path = AutoDeletingPath.Create(ExcelType.Csv); - var rowsWritten = await _exporter.ExportCsvAsync(path.ToString(), reader); - - Assert.Single(rowsWritten); - Assert.Equal(2, rowsWritten[0]); - - const string expected = - """" - a,b - """<>+-*//}{\\n",1234567890 - "Hello World",-1234567890 - - """"; - - Assert.Equal(expected, await File.ReadAllTextAsync(path.ToString())); - } - /// /// No error exception throw when reading xls file #242 /// @@ -899,82 +815,6 @@ public async Task Issue215() Assert.Equal("test2", rows[1]["V"]); } - /// - /// Support Enum Mapping - /// https://github.com/mini-software/MiniExcel/issues/89 - /// - [Fact] - public async Task Issue89() - { - //csv - { - const string text = - """ - State - OnDuty - Fired - Leave - """; - await using var stream = new MemoryStream(); - await using var writer = new StreamWriter(stream); - - await writer.WriteAsync(text); - await writer.FlushAsync(); - - stream.Position = 0; - var q = _importer.QueryCsvAsync(stream).ToBlockingEnumerable(); - var rows = q.ToList(); - - Assert.Equal(Issue89VO.WorkState.OnDuty, rows[0].State); - Assert.Equal(Issue89VO.WorkState.Fired, rows[1].State); - Assert.Equal(Issue89VO.WorkState.Leave, rows[2].State); - - var outputPath = PathHelper.GetTempPath("xlsx"); - var rowsWritten = await _exporter.ExportXlsxAsync(outputPath, rows); - Assert.Single(rowsWritten); - Assert.Equal(3, rowsWritten[0]); - - var q2 = _importer.QueryXlsxAsync(outputPath).ToBlockingEnumerable(); - var rows2 = q2.ToList(); - Assert.Equal(Issue89VO.WorkState.OnDuty, rows2[0].State); - Assert.Equal(Issue89VO.WorkState.Fired, rows2[1].State); - Assert.Equal(Issue89VO.WorkState.Leave, rows2[2].State); - } - - //xlsx - { - var path = PathHelper.GetFile("xlsx/TestIssue89.xlsx"); - var q = _importer.QueryXlsxAsync(path).ToBlockingEnumerable(); - var rows = q.ToList(); - Assert.Equal(Issue89VO.WorkState.OnDuty, rows[0].State); - Assert.Equal(Issue89VO.WorkState.Fired, rows[1].State); - Assert.Equal(Issue89VO.WorkState.Leave, rows[2].State); - - var outputPath = PathHelper.GetTempPath(); - var rowsWritten = await _exporter.ExportXlsxAsync(outputPath, rows); - Assert.Single(rowsWritten); - Assert.Equal(3, rowsWritten[0]); - - var q1 = _importer.QueryXlsxAsync(outputPath).ToBlockingEnumerable(); - var rows2 = q1.ToList(); - Assert.Equal(Issue89VO.WorkState.OnDuty, rows2[0].State); - Assert.Equal(Issue89VO.WorkState.Fired, rows2[1].State); - Assert.Equal(Issue89VO.WorkState.Leave, rows2[2].State); - } - } - - private class Issue89VO - { - public WorkState State { get; set; } - - public enum WorkState - { - OnDuty, - Leave, - Fired - } - } - /// /// DataTable recommended to use Caption for column name first, then use columname /// https://github.com/mini-software/MiniExcel/issues/217 @@ -1288,81 +1128,6 @@ public async Task Issue193() } } - [Fact] - public async Task Issue142() - { - { - using var file = AutoDeletingPath.Create(); - var path = file.ToString(); - await _exporter.ExportXlsxAsync(path, new[] { new Issue142VO { MyProperty1 = "MyProperty1", MyProperty2 = "MyProperty2", MyProperty3 = "MyProperty3", MyProperty4 = "MyProperty4", MyProperty5 = "MyProperty5", MyProperty6 = "MyProperty6", MyProperty7 = "MyProperty7" } }); - - { - var q = _importer.QueryXlsxAsync(path).ToBlockingEnumerable(); - var rows = q.ToList(); - Assert.Equal("MyProperty4", rows[0].A); - Assert.Equal("CustomColumnName", rows[0].B); //note - 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.Equal("MyProperty3", rows[0].G); - - Assert.Equal("MyProperty4", rows[0].A); - Assert.Equal("CustomColumnName", rows[0].B); //note - 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.Equal("MyProperty3", rows[0].G); - } - - { - var q = _importer.QueryXlsxAsync(path).ToBlockingEnumerable(); - var rows = q.ToList(); - - Assert.Equal("MyProperty4", rows[0].MyProperty4); - Assert.Equal("MyProperty1", rows[0].MyProperty1); //note - Assert.Equal("MyProperty5", rows[0].MyProperty5); - Assert.Equal("MyProperty2", rows[0].MyProperty2); - Assert.Equal("MyProperty6", rows[0].MyProperty6); - Assert.Null(rows[0].MyProperty7); - Assert.Equal("MyProperty3", rows[0].MyProperty3); - } - } - - { - using var file = AutoDeletingPath.Create(ExcelType.Csv); - var path = file.ToString(); - await _exporter.ExportCsvAsync(path, new [] { new Issue142VO { MyProperty1 = "MyProperty1", MyProperty2 = "MyProperty2", MyProperty3 = "MyProperty3", MyProperty4 = "MyProperty4", MyProperty5 = "MyProperty5", MyProperty6 = "MyProperty6", MyProperty7 = "MyProperty7" } }); - const string expected = - """ - MyProperty4,CustomColumnName,MyProperty5,MyProperty2,MyProperty6,,MyProperty3 - MyProperty4,MyProperty1,MyProperty5,MyProperty2,MyProperty6,,MyProperty3 - - """; - Assert.Equal(expected, await File.ReadAllTextAsync(path)); - - { - var q = _importer.QueryCsvAsync(path).ToBlockingEnumerable(); - var rows = q.ToList(); - - Assert.Equal("MyProperty4", rows[0].MyProperty4); - Assert.Equal("MyProperty1", rows[0].MyProperty1); - Assert.Equal("MyProperty5", rows[0].MyProperty5); - Assert.Equal("MyProperty2", rows[0].MyProperty2); - Assert.Equal("MyProperty6", rows[0].MyProperty6); - Assert.Null(rows[0].MyProperty7); - Assert.Equal("MyProperty3", rows[0].MyProperty3); - } - } - - { - using var path = AutoDeletingPath.Create(); - Issue142VoDuplicateColumnName[] input = [ new() { MyProperty1 = 0, MyProperty2 = 0, MyProperty3 = 0, MyProperty4 = 0 } ]; - Assert.Throws(() => _exporter.ExportXlsx(path.ToString(), input)); - } - } - [Fact] public async Task Issue142_Query() { @@ -1421,18 +1186,6 @@ private class Issue142VO public string MyProperty6 { get; set; } //index = 4 } - private class Issue142VoDuplicateColumnName - { - [MiniExcelColumnIndex("A")] - public int MyProperty1 { get; set; } - [MiniExcelColumnIndex("A")] - public int MyProperty2 { get; set; } - - public int MyProperty3 { get; set; } - [MiniExcelColumnIndex("B")] - public int MyProperty4 { get; set; } - } - private class Issue142VoOverIndex { [MiniExcelColumnIndex("Z")] diff --git a/tests/MiniExcelTests/MiniExcelIssueTests.cs b/tests/MiniExcelTests/MiniExcelIssueTests.cs index db8ad4dc..d2591113 100644 --- a/tests/MiniExcelTests/MiniExcelIssueTests.cs +++ b/tests/MiniExcelTests/MiniExcelIssueTests.cs @@ -1,6 +1,7 @@ using System.Collections; using System.ComponentModel; using System.Text.RegularExpressions; +using MiniExcelLib.Tests.Common.Utils; using MiniExcelLib.Attributes; using MiniExcelLib.Exceptions; using MiniExcelLib.OpenXml.Picture; @@ -86,19 +87,6 @@ public void TestIssue553() Assert.Equal(rows[4].A, 3); } - [Fact] - public void TestPR10() - { - var path = PathHelper.GetFile("csv/TestIssue142.csv"); - var config = new CsvConfiguration - { - SplitFn = row => Regex.Split(row, "[\t,](?=(?:[^\"]|\"[^\"]*\")*$)") - .Select(s => Regex.Replace(s.Replace("\"\"", "\""), "^\"|\"$", "")) - .ToArray() - }; - var rows = _importer.QueryCsv(path, configuration: config).ToList(); - } - [Fact] public void TestIssue289() { @@ -131,73 +119,6 @@ private enum DescriptionEnum [Description("Super Administrator")] V3 } - /// - /// https://gitee.com/dotnetchina/MiniExcel/issues/I4X92G - /// - [Fact] - public void TestIssueI4X92G() - { - using var file = AutoDeletingPath.Create(ExcelType.Csv); - var path = file.ToString(); - - { - var value = new[] - { - new { ID = 1, Name = "Jack", InDate = new DateTime(2021,01,03)}, - new { ID = 2, Name = "Henry", InDate = new DateTime(2020,05,03)} - }; - _exporter.ExportCsv(path, value); - var content = File.ReadAllText(path); - Assert.Equal( - """ - ID,Name,InDate - 1,Jack,"2021-01-03 00:00:00" - 2,Henry,"2020-05-03 00:00:00" - - """, - content); - } - { - var value = new { ID = 3, Name = "Mike", InDate = new DateTime(2021, 04, 23) }; - var rowsWritten = _exporter.AppendToCsv(path, value); - Assert.Equal(1, rowsWritten); - - var content = File.ReadAllText(path); - Assert.Equal( - """ - ID,Name,InDate - 1,Jack,"2021-01-03 00:00:00" - 2,Henry,"2020-05-03 00:00:00" - 3,Mike,"2021-04-23 00:00:00" - - """, - content); - } - { - var value = new[] - { - new { ID=4,Name ="Frank",InDate=new DateTime(2021,06,07)}, - new { ID=5,Name ="Gloria",InDate=new DateTime(2022,05,03)}, - }; - var rowsWritten = _exporter.AppendToCsv(path, value); - Assert.Equal(2, rowsWritten); - - var content = File.ReadAllText(path); - Assert.Equal( - """ - ID,Name,InDate - 1,Jack,"2021-01-03 00:00:00" - 2,Henry,"2020-05-03 00:00:00" - 3,Mike,"2021-04-23 00:00:00" - 4,Frank,"2021-06-07 00:00:00" - 5,Gloria,"2022-05-03 00:00:00" - - """, - content); - } - } - - /// /// Exception : MiniExcelLibs.Core.Exceptions.ExcelInvalidCastException: 'ColumnName : Date, CellRow : 2, Value : 2021-01-31 10:03:00 +08:00, it can't cast to DateTimeOffset type.' /// @@ -279,27 +200,6 @@ public void TestIssue405() Assert.StartsWith(" - /// Using stream.SaveAs will close the Stream automatically when Specifying excelType - /// https://gitee.com/dotnetchina/MiniExcel/issues/I57WMM - /// - [Fact] - public void TestIssueI57WMM() - { - Dictionary[] sheets = [new() { ["ID"] = "0001", ["Name"] = "Jack" }]; - using var stream = new MemoryStream(); - - var config = new CsvConfiguration { StreamWriterFunc = x => new StreamWriter(x, Encoding.Default, leaveOpen: true)}; - _exporter.ExportCsv(stream, sheets, configuration: config); - stream.Seek(0, SeekOrigin.Begin); - - // convert stream to string - using var reader = new StreamReader(stream); - var text = reader.ReadToEnd(); - - Assert.Equal("ID,Name\r\n0001,Jack\r\n", text); - } - [Fact] public void TestIssue370() { @@ -704,37 +604,6 @@ private class TestIssueI4YCLQ_2Dto public string 值8 { get; set; } } - [Fact] - public async Task TestIssue338() - { - Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); - { - var path = PathHelper.GetFile("csv/TestIssue338.csv"); - var row = _importer.QueryCsvAsync(path).ToBlockingEnumerable().FirstOrDefault(); - Assert.Equal("���IJ�������", row!.A); - } - { - var path = PathHelper.GetFile("csv/TestIssue338.csv"); - var config = new CsvConfiguration - { - StreamReaderFunc = stream => new StreamReader(stream, Encoding.GetEncoding("gb2312")) - }; - var row = _importer.QueryCsvAsync(path, configuration: config).ToBlockingEnumerable().FirstOrDefault(); - Assert.Equal("中文测试内容", row!.A); - } - { - var path = PathHelper.GetFile("csv/TestIssue338.csv"); - var config = new CsvConfiguration - { - StreamReaderFunc = stream => new StreamReader(stream, Encoding.GetEncoding("gb2312")) - }; - await using (var stream = new FileStream(path, FileMode.Open, FileAccess.Read)) - { - var row = _importer.QueryCsvAsync(stream, configuration: config).ToBlockingEnumerable().FirstOrDefault(); - Assert.Equal("中文测试内容", row!.A); - } - } - } [Fact] public void TestIssueI4WM67() @@ -788,20 +657,6 @@ public void TestIssueI4WXFB() } } - [Fact] - public void TestIssueI4WDA9() - { - using var path = AutoDeletingPath.Create(ExcelType.Csv); - var value = new DataTable(); - { - value.Columns.Add("\"name\""); - value.Rows.Add("\"Jack\""); - } - - _exporter.ExportCsv(path.ToString(), value); - Assert.Equal("\"\"\"name\"\"\"\r\n\"\"\"Jack\"\"\"\r\n", File.ReadAllText(path.ToString())); - } - [Fact] public void TestIssue331_2() { @@ -964,168 +819,6 @@ public void TestIssue327() Assert.Equal("Hello MiniExcel", Encoding.UTF8.GetString(rows[2].file)); } - [Fact] - public void TestIssue316() - { - // XLSX - { - using var file = AutoDeletingPath.Create(); - var path = file.ToString(); - var value = new[] - { - new{ Amount=123_456.789M, CreateTime=DateTime.Parse("2018-01-31",CultureInfo.InvariantCulture)} - }; - var config = new OpenXmlConfiguration - { - Culture = new CultureInfo("fr-FR"), - }; - _exporter.ExportXlsx(path, value, configuration: config); - - //Datetime error - Assert.Throws(() => - { - var conf = new OpenXmlConfiguration - { - Culture = new CultureInfo("en-US"), - }; - _ = _importer.QueryXlsx(path, configuration: conf).ToList(); - }); - - // dynamic - var rows = _importer.QueryXlsx(path, true).ToList(); - Assert.Equal("123456,789", rows[0].Amount); - Assert.Equal("31/01/2018 00:00:00", rows[0].CreateTime); - } - - // type - { - using var file = AutoDeletingPath.Create(); - var path = file.ToString(); - var value = new[] - { - new { Amount = 123_456.789M, CreateTime = new DateTime(2018, 5, 12) } - }; - { - var config = new OpenXmlConfiguration - { - Culture = new CultureInfo("fr-FR"), - }; - _exporter.ExportXlsx(path, value, configuration: config); - } - - { - var rows = _importer.QueryXlsx(path, true).ToList(); - Assert.Equal("123456,789", rows[0].Amount); - Assert.Equal("12/05/2018 00:00:00", rows[0].CreateTime); - } - - { - var config = new OpenXmlConfiguration - { - Culture = new CultureInfo("en-US"), - }; - var rows = _importer.QueryXlsx(path, configuration: config).ToList(); - - Assert.Equal("2018-12-05 00:00:00", rows[0].CreateTime.ToString("yyyy-MM-dd HH:mm:ss")); - Assert.Equal(123456789m, rows[0].Amount); - } - - { - var config = new OpenXmlConfiguration - { - Culture = new CultureInfo("fr-FR"), - }; - var rows = _importer.QueryXlsx(path, configuration: config).ToList(); - - Assert.Equal("2018-05-12 00:00:00", rows[0].CreateTime.ToString("yyyy-MM-dd HH:mm:ss")); - Assert.Equal(123456.789m, rows[0].Amount); - } - } - - // CSV - { - using var file = AutoDeletingPath.Create(ExcelType.Csv); - var path = file.ToString(); - var value = new[] - { - new { Amount = 123_456.789M, CreateTime = new DateTime(2018, 1, 31) } - }; - - var config = new CsvConfiguration - { - Culture = new CultureInfo("fr-FR"), - }; - _exporter.ExportCsv(path, value, configuration: config); - - //Datetime error - Assert.Throws(() => - { - var conf = new CsvConfiguration - { - Culture = new CultureInfo("en-US") - }; - _ = _importer.QueryCsv(path, configuration: conf).ToList(); - }); - - // dynamic - var rows = _importer.QueryCsv(path, true).ToList(); - Assert.Equal("123456,789", rows[0].Amount); - Assert.Equal("31/01/2018 00:00:00", rows[0].CreateTime); - } - - // type - { - using var file = AutoDeletingPath.Create(ExcelType.Csv); - var path = file.ToString(); - - var value = new[] - { - new{ Amount=123_456.789M, CreateTime=DateTime.Parse("2018-05-12", CultureInfo.InvariantCulture)} - }; - { - var config = new CsvConfiguration - { - Culture = new CultureInfo("fr-FR"), - }; - _exporter.ExportCsv(path, value, configuration: config); - } - - { - var rows = _importer.QueryCsv(path, true).ToList(); - Assert.Equal("123456,789", rows[0].Amount); - Assert.Equal("12/05/2018 00:00:00", rows[0].CreateTime); - } - - { - var config = new CsvConfiguration - { - Culture = new CultureInfo("en-US"), - }; - var rows = _importer.QueryCsv(path, configuration: config).ToList(); - - Assert.Equal("2018-12-05 00:00:00", rows[0].CreateTime.ToString("yyyy-MM-dd HH:mm:ss")); - Assert.Equal(123456789m, rows[0].Amount); - } - - { - var config = new CsvConfiguration - { - Culture = new CultureInfo("fr-FR"), - }; - var rows = _importer.QueryCsv(path, configuration: config).ToList(); - - Assert.Equal("2018-05-12 00:00:00", rows[0].CreateTime.ToString("yyyy-MM-dd HH:mm:ss")); - Assert.Equal(123456.789m, rows[0].Amount); - } - } - } - - private class TestIssue316Dto - { - public decimal Amount { get; set; } - public DateTime CreateTime { get; set; } - } - /// /// https://github.com/mini-software/MiniExcel/issues/325 /// @@ -1367,19 +1060,6 @@ public void TestIssue294() } } - /// - /// Column '' does not belong to table when csv convert to datatable #298 - /// https://github.com/mini-software/MiniExcel/issues/298 - /// - [Fact] - public void TestIssue298() - { - var path = PathHelper.GetFile("/csv/TestIssue298.csv"); -#pragma warning disable CS0618 // Type or member is obsolete - var dt = _importer.QueryCsvAsDataTable(path); -#pragma warning restore CS0618 - Assert.Equal(["ID", "Name", "Age"], dt.Columns.Cast().Select(x => x.ColumnName)); - } /// /// SaveAsByTemplate if there is & in the cell value, it will be & @@ -1445,58 +1125,6 @@ private class TestIssue190Dto public int Age { get; set; } } - /// - /// [According to the XLSX to CSV example, there will be data loss if there is no header. · Issue #292 · mini-software/MiniExcel](https://github.com/mini-software/MiniExcel/issues/292) - /// - [Fact] - public void TestIssue292() - { - { - var xlsxPath = PathHelper.GetFile("/xlsx/TestIssue292.xlsx"); - using var csvPath = AutoDeletingPath.Create(ExcelType.Csv); - _exporter.ConvertXlsxToCsv(xlsxPath, csvPath.ToString(), false); - - var actualCotent = File.ReadAllText(csvPath.ToString()); - Assert.Equal( - """ - Name,Age,Name,Age - Jack,22,Mike,25 - Henry,44,Jerry,44 - - """, - actualCotent); - } - - { - var csvPath = PathHelper.GetFile("/csv/TestIssue292.csv"); - using var path = AutoDeletingPath.Create(); - _exporter.ConvertCsvToXlsx(csvPath, path.ToString()); - - var rows = _importer.QueryXlsx(path.ToString()).ToList(); - Assert.Equal(3, rows.Count); - Assert.Equal("Name", rows[0].A); - Assert.Equal("Age", rows[0].B); - Assert.Equal("Name", rows[0].C); - Assert.Equal("Age", rows[0].D); - Assert.Equal("Jack", rows[1].A); - Assert.Equal("22", rows[1].B); - Assert.Equal("Mike", rows[1].C); - Assert.Equal("25", rows[1].D); - } - } - - /// - /// [Csv Query then SaveAs will throw "Stream was not readable." exception · Issue #293 · mini-software/MiniExcel](https://github.com/mini-software/MiniExcel/issues/293) - /// - [Fact] - public void TestIssue293() - { - var path = PathHelper.GetFile("/csv/Test5x2.csv"); - using var tempPath = AutoDeletingPath.Create(); - using var csv = File.OpenRead(path); - var value = _importer.QueryCsv(csv, useHeaderRow: false); - _exporter.ExportXlsx(tempPath.ToString(), value, printHeader: false); - } [Fact] public void TestIssueI49RYZ() @@ -1710,22 +1338,6 @@ private class TestIssue280Dto public string Name { get; set; } } - /// - /// Csv not support QueryAsDataTable #279 https://github.com/mini-software/MiniExcel/issues/279 - /// - [Fact] - public void TestIssue279() - { - var path = PathHelper.GetFile("/csv/TestHeader.csv"); -#pragma warning disable CS0618 // Type or member is obsolete - using var dt = _importer.QueryCsvAsDataTable(path); -#pragma warning restore CS0618 - Assert.Equal("A1", dt.Rows[0]["Column1"]); - Assert.Equal("A2", dt.Rows[1]["Column1"]); - Assert.Equal("B1", dt.Rows[0]["Column2"]); - Assert.Equal("B2", dt.Rows[1]["Column2"]); - } - /// /// Custom excel zip can't read and show Number of entries expected in End Of Central Directory does not correspond to number of entries in Central Directory. #272 /// @@ -1816,30 +1428,6 @@ private class IssueI3X2ZLDTO public DateTime Col2 { get; set; } } - /// - /// [Convert csv to xlsx · Issue #261 · mini-software/MiniExcel](https://github.com/mini-software/MiniExcel/issues/261) - /// - [Fact] - public void TestIssue261() - { - var csvPath = PathHelper.GetFile("csv/TestCsvToXlsx.csv"); - using var path = AutoDeletingPath.Create(); - - _exporter.ConvertCsvToXlsx(csvPath, path.FilePath); - var rows = _importer.QueryXlsx(path.ToString()).ToList(); - - Assert.Equal("Name", rows[0].A); - Assert.Equal("Jack", rows[1].A); - Assert.Equal("Neo", rows[2].A); - Assert.Null(rows[3].A); - Assert.Null(rows[4].A); - Assert.Equal("Age", rows[0].B); - Assert.Equal("34", rows[1].B); - Assert.Equal("26", rows[2].B); - Assert.Null(rows[3].B); - Assert.Null(rows[4].B); - } - /// /// [SaveAsByTemplate support DateTime custom format · Issue #255 · mini-software/MiniExcel] /// (https://github.com/mini-software/MiniExcel/issues/255) @@ -1898,81 +1486,6 @@ public void Issue256() Assert.Equal(new DateTime(2004, 4, 16), rows[1].B); } - - /// - /// Csv SaveAs by datareader with encoding default show messy code #253 - /// - [Fact] - public void Issue253() - { - { - var value = new[] { new { col1 = "世界你好" } }; - using var path = AutoDeletingPath.Create(ExcelType.Csv); - _exporter.ExportCsv(path.ToString(), value); - const string expected = - """ - col1 - 世界你好 - - """; - Assert.Equal(expected, File.ReadAllText(path.ToString())); - } - - { - Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); - var value = new[] { new { col1 = "世界你好" } }; - using var path = AutoDeletingPath.Create(ExcelType.Csv); - var config = new CsvConfiguration - { - StreamWriterFunc = stream => new StreamWriter(stream, Encoding.GetEncoding("gb2312")) - }; - _exporter.ExportCsv(path.ToString(), value, configuration: config); - const string expected = - """ - col1 - ������� - - """; - Assert.Equal(expected, File.ReadAllText(path.ToString())); - } - - using var cn = Db.GetConnection(); - - { - var value = cn.ExecuteReader("select '世界你好' col1"); - using var path = AutoDeletingPath.Create(ExcelType.Csv); - _exporter.ExportCsv(path.ToString(), value); - const string expected = - """ - col1 - 世界你好 - - """; - Assert.Equal(expected, File.ReadAllText(path.ToString())); - } - } - - /// - /// [CSV SaveAs support datareader · Issue #251 · mini-software/MiniExcel](https://github.com/mini-software/MiniExcel/issues/251) - /// - [Fact] - public void Issue251() - { - using var cn = Db.GetConnection(); - using var reader = cn.ExecuteReader(@"select '""<>+-*//}{\\n' a,1234567890 b union all select 'Hello World',-1234567890"); - using var path = AutoDeletingPath.Create(ExcelType.Csv); - _exporter.ExportCsv(path.ToString(), reader); - const string expected = - """" - a,b - """<>+-*//}{\\n",1234567890 - "Hello World",-1234567890 - - """"; - - Assert.Equal(expected, File.ReadAllText(path.ToString())); - } - /// /// No error exception throw when reading xls file #242 /// @@ -2633,75 +2146,6 @@ public void Issue215() Assert.Equal("test2", rows[1].V); } - /// - /// Support Enum Mapping - /// https://github.com/mini-software/MiniExcel/issues/89 - /// - [Fact] - public void Issue89() - { - //csv - { - const string text = - """ - State - OnDuty - Fired - Leave - """; - - using var stream = new MemoryStream(); - using var writer = new StreamWriter(stream); - - writer.Write(text); - writer.Flush(); - stream.Position = 0; - var rows = _importer.QueryCsv(stream, useHeaderRow: true).ToList(); - - Assert.Equal(nameof(Issue89VO.WorkState.OnDuty), rows[0].State); - Assert.Equal(nameof(Issue89VO.WorkState.Fired), rows[1].State); - Assert.Equal(nameof(Issue89VO.WorkState.Leave), rows[2].State); - - using var path = AutoDeletingPath.Create(ExcelType.Csv); - _exporter.ExportCsv(path.ToString(), rows); - var rows2 = _importer.QueryCsv(path.ToString()).ToList(); - - Assert.Equal(Issue89VO.WorkState.OnDuty, rows2[0].State); - Assert.Equal(Issue89VO.WorkState.Fired, rows2[1].State); - Assert.Equal(Issue89VO.WorkState.Leave, rows2[2].State); - } - - //xlsx - { - var path = PathHelper.GetFile("xlsx/TestIssue89.xlsx"); - var rows = _importer.QueryXlsx(path).ToList(); - - Assert.Equal(Issue89VO.WorkState.OnDuty, rows[0].State); - Assert.Equal(Issue89VO.WorkState.Fired, rows[1].State); - Assert.Equal(Issue89VO.WorkState.Leave, rows[2].State); - - using var xlsxPath = AutoDeletingPath.Create(); - _exporter.ExportXlsx(xlsxPath.ToString(), rows); - var rows2 = _importer.QueryXlsx(xlsxPath.ToString()).ToList(); - - Assert.Equal(Issue89VO.WorkState.OnDuty, rows2[0].State); - Assert.Equal(Issue89VO.WorkState.Fired, rows2[1].State); - Assert.Equal(Issue89VO.WorkState.Leave, rows2[2].State); - } - } - - public class Issue89VO - { - public WorkState State { get; set; } - - public enum WorkState - { - OnDuty, - Leave, - Fired - } - } - /// /// DataTable recommended to use Caption for column name first, then use columname /// https://github.com/mini-software/MiniExcel/issues/217 @@ -3009,177 +2453,6 @@ public void Issue193() } } - [Fact] - public void Issue142() - { - { - using var file = AutoDeletingPath.Create(); - var path = file.ToString(); - Issue142VO[] values = - [ - new() - { - MyProperty1 = "MyProperty1", MyProperty2 = "MyProperty2", MyProperty3 = "MyProperty3", - MyProperty4 = "MyProperty4", MyProperty5 = "MyProperty5", MyProperty6 = "MyProperty6", - MyProperty7 = "MyProperty7" - } - ]; - var rowsWritten = _exporter.ExportXlsx(path, values); - Assert.Single(rowsWritten); - Assert.Equal(1, rowsWritten[0]); - - { - var rows = _importer.QueryXlsx(path).ToList(); - - Assert.Equal("MyProperty4", rows[0].A); - Assert.Equal("CustomColumnName", rows[0].B); - 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.Equal("MyProperty3", rows[0].G); - - Assert.Equal("MyProperty4", rows[0].A); - Assert.Equal("CustomColumnName", rows[0].B); - 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.Equal("MyProperty3", rows[0].G); - } - - { - var rows = _importer.QueryXlsx(path).ToList(); - - Assert.Equal("MyProperty4", rows[0].MyProperty4); - Assert.Equal("MyProperty1", rows[0].MyProperty1); - Assert.Equal("MyProperty5", rows[0].MyProperty5); - Assert.Equal("MyProperty2", rows[0].MyProperty2); - Assert.Equal("MyProperty6", rows[0].MyProperty6); - Assert.Null(rows[0].MyProperty7); - Assert.Equal("MyProperty3", rows[0].MyProperty3); - } - } - - { - using var file = AutoDeletingPath.Create(ExcelType.Csv); - var path = file.ToString(); - Issue142VO[] values = - [ - new() - { - MyProperty1 = "MyProperty1", MyProperty2 = "MyProperty2", MyProperty3 = "MyProperty3", - MyProperty4 = "MyProperty4", MyProperty5 = "MyProperty5", MyProperty6 = "MyProperty6", - MyProperty7 = "MyProperty7" - } - ]; - var rowsWritten = _exporter.ExportCsv(path, values); - Assert.Single(rowsWritten); - Assert.Equal(1, rowsWritten[0]); - - const string expected = - """ - MyProperty4,CustomColumnName,MyProperty5,MyProperty2,MyProperty6,,MyProperty3 - MyProperty4,MyProperty1,MyProperty5,MyProperty2,MyProperty6,,MyProperty3 - - """; - - Assert.Equal(expected, File.ReadAllText(path)); - - { - var rows = _importer.QueryCsv(path).ToList(); - - Assert.Equal("MyProperty4", rows[0].MyProperty4); - Assert.Equal("MyProperty1", rows[0].MyProperty1); - Assert.Equal("MyProperty5", rows[0].MyProperty5); - Assert.Equal("MyProperty2", rows[0].MyProperty2); - Assert.Equal("MyProperty6", rows[0].MyProperty6); - Assert.Null(rows[0].MyProperty7); - Assert.Equal("MyProperty3", rows[0].MyProperty3); - } - } - - { - using var path = AutoDeletingPath.Create(ExcelType.Csv); - Issue142VoDuplicateColumnName[] input = - [ - new() { MyProperty1 = 0, MyProperty2 = 0, MyProperty3 = 0, MyProperty4 = 0 } - ]; - Assert.Throws(() => _exporter.ExportCsv(path.ToString(), input)); - } - } - - [Fact] - public void Issue142_Query() - { - const string path = "../../../../../samples/xlsx/TestIssue142.xlsx"; - const string csvPath = "../../../../../samples/csv/TestIssue142.csv"; - { - var rows = _importer.QueryXlsx(path).ToList(); - Assert.Equal(0, rows[0].MyProperty1); - } - - Assert.Throws(() => _importer.QueryXlsx(path).ToList()); - - var rowsXlsx = _importer.QueryXlsx(path).ToList(); - Assert.Equal("CustomColumnName", rowsXlsx[0].MyProperty1); - Assert.Null(rowsXlsx[0].MyProperty7); - Assert.Equal("MyProperty2", rowsXlsx[0].MyProperty2); - Assert.Equal("MyProperty103", rowsXlsx[0].MyProperty3); - Assert.Equal("MyProperty100", rowsXlsx[0].MyProperty4); - Assert.Equal("MyProperty102", rowsXlsx[0].MyProperty5); - Assert.Equal("MyProperty6", rowsXlsx[0].MyProperty6); - - var rowsCsv = _importer.QueryCsv(csvPath).ToList(); - Assert.Equal("CustomColumnName", rowsCsv[0].MyProperty1); - Assert.Null(rowsCsv[0].MyProperty7); - Assert.Equal("MyProperty2", rowsCsv[0].MyProperty2); - Assert.Equal("MyProperty103", rowsCsv[0].MyProperty3); - Assert.Equal("MyProperty100", rowsCsv[0].MyProperty4); - Assert.Equal("MyProperty102", rowsCsv[0].MyProperty5); - Assert.Equal("MyProperty6", rowsCsv[0].MyProperty6); - } - - private class Issue142VO - { - [MiniExcelColumnName("CustomColumnName")] - public string MyProperty1 { get; set; } //index = 1 - [MiniExcelIgnore] - public string MyProperty7 { get; set; } //index = null - public string MyProperty2 { get; set; } //index = 3 - [MiniExcelColumnIndex(6)] - public string MyProperty3 { get; set; } //index = 6 - [MiniExcelColumnIndex("A")] // equal column index 0 - public string MyProperty4 { get; set; } - [MiniExcelColumnIndex(2)] - public string MyProperty5 { get; set; } //index = 2 - public string MyProperty6 { get; set; } //index = 4 - } - - private class Issue142VoDuplicateColumnName - { - [MiniExcelColumnIndex("A")] - public int MyProperty1 { get; set; } - [MiniExcelColumnIndex("A")] - public int MyProperty2 { get; set; } - - public int MyProperty3 { get; set; } - [MiniExcelColumnIndex("B")] - public int MyProperty4 { get; set; } - } - - private class Issue142VoOverIndex - { - [MiniExcelColumnIndex("Z")] - public int MyProperty1 { get; set; } - } - - private class Issue142VoExcelColumnNameNotFound - { - [MiniExcelColumnIndex("B")] - public int MyProperty1 { get; set; } - } - /// /// https://github.com/mini-software/MiniExcel/issues/150 /// @@ -3751,122 +3024,6 @@ public void Issue_542() Assert.Equal("Wade", resultWithFirstRow[0].Name); } - private class Issue507V01 - { - public string A { get; set; } - public DateTime B { get; set; } - public string C { get; set; } - public int D { get; set; } - } - - private class Issue507V02 - { - public DateTime B { get; set; } - public int D { get; set; } - } - - [Fact] - public void Issue507_1() - { - //Problem with multi-line when using Query func - //https://github.com/mini-software/MiniExcel/issues/507 - - var path = Path.Combine(Path.GetTempPath(), string.Concat(nameof(MiniExcelIssueTests), "_", nameof(Issue507_1), ".csv")); - var values = new Issue507V01[] - { - new() { A = "Github", B = DateTime.Parse("2021-01-01"), C = "abcd", D = 123 }, - new() { A = "Microsoft \nTest 1", B = DateTime.Parse("2021-02-01"), C = "efgh", D = 123 }, - new() { A = "Microsoft \rTest 2", B = DateTime.Parse("2021-02-01"), C = "ab\nc\nd", D = 123 }, - new() { A = "Microsoft\"\" \r\nTest\n3", B = DateTime.Parse("2021-02-01"), C = "a\"\"\nb\n\nc", D = 123 }, - }; - - var config = new CsvConfiguration - { - //AlwaysQuote = true, - ReadLineBreaksWithinQuotes = true, - }; - - // create - using (var stream = File.Create(path)) - { - _exporter.ExportCsv(stream, values, configuration: config); - } - - // read - var getRowsInfo = _importer.QueryCsv(path, configuration: config).ToArray(); - - Assert.Equal(values.Length, getRowsInfo.Length); - - Assert.Equal("Github", getRowsInfo[0].A); - Assert.Equal("abcd", getRowsInfo[0].C); - - Assert.Equal($"Microsoft {config.NewLine}Test 1", getRowsInfo[1].A); - Assert.Equal("efgh", getRowsInfo[1].C); - - Assert.Equal($"Microsoft {config.NewLine}Test 2", getRowsInfo[2].A); - Assert.Equal($"ab{config.NewLine}c{config.NewLine}d", getRowsInfo[2].C); - - Assert.Equal($"""Microsoft"" {config.NewLine}Test{config.NewLine}3""", getRowsInfo[3].A); - Assert.Equal($"""a""{config.NewLine}b{config.NewLine}{config.NewLine}c""", getRowsInfo[3].C); - - File.Delete(path); - } - - [Fact] - public void Issue507_2() - { - //Problem with multi-line when using Query func - //https://github.com/mini-software/MiniExcel/issues/507 - - var path = Path.Combine(Path.GetTempPath(), string.Concat(nameof(MiniExcelIssueTests), "_", nameof(Issue507_2), ".csv")); - var values = new Issue507V02[] - { - new() { B = DateTime.Parse("2021-01-01"), D = 123 }, - new() { B = DateTime.Parse("2021-02-01"), D = 123 }, - new() { B = DateTime.Parse("2021-02-01"), D = 123 }, - new() { B = DateTime.Parse("2021-02-01"), D = 123 }, - }; - - var config = new CsvConfiguration - { - //AlwaysQuote = true, - ReadLineBreaksWithinQuotes = true, - }; - - // create - using (var stream = File.Create(path)) - { - _exporter.ExportCsv(stream, values, true, config); - } - - // read - var getRowsInfo = _importer.QueryCsv(path, configuration: config).ToArray(); - Assert.Equal(values.Length, getRowsInfo.Length); - - File.Delete(path); - } - - [Fact] - public void Issue507_3_MismatchedQuoteCsv() - { - //Problem with multi-line when using Query func - //https://github.com/mini-software/MiniExcel/issues/507 - - var config = new CsvConfiguration - { - //AlwaysQuote = true, - ReadLineBreaksWithinQuotes = true, - }; - - // create - using var stream = new MemoryStream(Encoding.UTF8.GetBytes("A,B,C\n\"r1a: no end quote,r1b,r1c")); - - // read - var getRowsInfo = _importer.QueryCsv(stream, configuration: config).ToArray(); - Assert.Equal(2, getRowsInfo.Length); - } - - [Fact] public void Issue606_1() { diff --git a/tests/MiniExcelTests/MiniExcelOpenXmlAsyncTests.cs b/tests/MiniExcelTests/MiniExcelOpenXmlAsyncTests.cs index 1ab72482..fa606e9c 100644 --- a/tests/MiniExcelTests/MiniExcelOpenXmlAsyncTests.cs +++ b/tests/MiniExcelTests/MiniExcelOpenXmlAsyncTests.cs @@ -1,6 +1,7 @@ using System.IO.Packaging; using ClosedXML.Excel; using ExcelDataReader; +using MiniExcelLib.Tests.Common.Utils; using MiniExcelLib.Abstractions; using MiniExcelLib.Attributes; using MiniExcelLib.OpenXml; diff --git a/tests/MiniExcelTests/MiniExcelOpenXmlConfigurationTest.cs b/tests/MiniExcelTests/MiniExcelOpenXmlConfigurationTest.cs index a6203ad6..cbde33b4 100644 --- a/tests/MiniExcelTests/MiniExcelOpenXmlConfigurationTest.cs +++ b/tests/MiniExcelTests/MiniExcelOpenXmlConfigurationTest.cs @@ -1,3 +1,4 @@ +using MiniExcelLib.Tests.Common.Utils; using MiniExcelLib.Attributes; using MiniExcelLib.Helpers; diff --git a/tests/MiniExcelTests/MiniExcelOpenXmlMultipleSheetTests.cs b/tests/MiniExcelTests/MiniExcelOpenXmlMultipleSheetTests.cs index 8aa6ea3e..cf5d7d83 100644 --- a/tests/MiniExcelTests/MiniExcelOpenXmlMultipleSheetTests.cs +++ b/tests/MiniExcelTests/MiniExcelOpenXmlMultipleSheetTests.cs @@ -1,5 +1,6 @@ using MiniExcelLib.OpenXml.Attributes; using MiniExcelLib.OpenXml.Models; +using MiniExcelLib.Tests.Common.Utils; namespace MiniExcelLib.Tests; diff --git a/tests/MiniExcelTests/MiniExcelOpenXmlTests.cs b/tests/MiniExcelTests/MiniExcelOpenXmlTests.cs index 2cc5ece4..ccea2714 100644 --- a/tests/MiniExcelTests/MiniExcelOpenXmlTests.cs +++ b/tests/MiniExcelTests/MiniExcelOpenXmlTests.cs @@ -1,6 +1,7 @@ using System.IO.Packaging; using ClosedXML.Excel; using ExcelDataReader; +using MiniExcelLib.Tests.Common.Utils; using MiniExcelLib.Attributes; using MiniExcelLib.OpenXml.Utils; diff --git a/tests/MiniExcelTests/MiniExcelTests.csproj b/tests/MiniExcelTests/MiniExcelTests.csproj index 5c33a678..23524f27 100644 --- a/tests/MiniExcelTests/MiniExcelTests.csproj +++ b/tests/MiniExcelTests/MiniExcelTests.csproj @@ -14,14 +14,11 @@ - - - @@ -33,7 +30,7 @@ - + diff --git a/tests/MiniExcelTests/SaveByTemplate/MiniExcelTemplateAsyncTests.cs b/tests/MiniExcelTests/SaveByTemplate/MiniExcelTemplateAsyncTests.cs index e12100e6..42873f93 100644 --- a/tests/MiniExcelTests/SaveByTemplate/MiniExcelTemplateAsyncTests.cs +++ b/tests/MiniExcelTests/SaveByTemplate/MiniExcelTemplateAsyncTests.cs @@ -1,4 +1,6 @@ -namespace MiniExcelLib.Tests.SaveByTemplate; +using MiniExcelLib.Tests.Common.Utils; + +namespace MiniExcelLib.Tests.SaveByTemplate; public class MiniExcelTemplateAsyncTests { diff --git a/tests/MiniExcelTests/SaveByTemplate/MiniExcelTemplateTests.cs b/tests/MiniExcelTests/SaveByTemplate/MiniExcelTemplateTests.cs index 6358ff75..cd528b7d 100644 --- a/tests/MiniExcelTests/SaveByTemplate/MiniExcelTemplateTests.cs +++ b/tests/MiniExcelTests/SaveByTemplate/MiniExcelTemplateTests.cs @@ -1,3 +1,4 @@ +using MiniExcelLib.Tests.Common.Utils; using MiniExcelLib.Enums; using MiniExcelLib.OpenXml.Picture; using OfficeOpenXml.Drawing; From 74dd1aa7cb0ae9b3a478417f063c80a5f5eb529c Mon Sep 17 00:00:00 2001 From: Michele Bastione Date: Wed, 9 Jul 2025 22:01:26 +0200 Subject: [PATCH 11/26] Changing MiniExcelTests project name to MiniExcel.Tests --- .gitignore | 2 +- MiniExcel.slnx | 6 ++-- tests/MiniExcel.Tests.AspNetCore/Program.cs | 30 ++++++++++++------- .../GlobalUsings.cs | 0 .../MiniExcel.Tests.csproj} | 0 .../MiniExcelAutoAdjustWidthTests.cs | 0 .../MiniExcelIssueAsyncTests.cs | 0 .../MiniExcelIssueTests.cs | 0 .../MiniExcelOpenXmlAsyncTests.cs | 0 .../MiniExcelOpenXmlConfigurationTest.cs | 0 ...MiniExcelOpenXmlMultipleSheetAsyncTests.cs | 0 .../MiniExcelOpenXmlMultipleSheetTests.cs | 0 .../MiniExcelOpenXmlTests.cs | 0 .../InputValueExtractorTests.cs | 0 .../MiniExcelTemplateAsyncTests.cs | 0 .../SaveByTemplate/MiniExcelTemplateTests.cs | 0 .../Utils/EpplusLicense.cs | 0 .../Utils/FileHelper.cs | 0 .../Utils/SheetHelper.cs | 0 19 files changed, 23 insertions(+), 15 deletions(-) rename tests/{MiniExcelTests => MiniExcel.Tests}/GlobalUsings.cs (100%) rename tests/{MiniExcelTests/MiniExcelTests.csproj => MiniExcel.Tests/MiniExcel.Tests.csproj} (100%) rename tests/{MiniExcelTests => MiniExcel.Tests}/MiniExcelAutoAdjustWidthTests.cs (100%) rename tests/{MiniExcelTests => MiniExcel.Tests}/MiniExcelIssueAsyncTests.cs (100%) rename tests/{MiniExcelTests => MiniExcel.Tests}/MiniExcelIssueTests.cs (100%) rename tests/{MiniExcelTests => MiniExcel.Tests}/MiniExcelOpenXmlAsyncTests.cs (100%) rename tests/{MiniExcelTests => MiniExcel.Tests}/MiniExcelOpenXmlConfigurationTest.cs (100%) rename tests/{MiniExcelTests => MiniExcel.Tests}/MiniExcelOpenXmlMultipleSheetAsyncTests.cs (100%) rename tests/{MiniExcelTests => MiniExcel.Tests}/MiniExcelOpenXmlMultipleSheetTests.cs (100%) rename tests/{MiniExcelTests => MiniExcel.Tests}/MiniExcelOpenXmlTests.cs (100%) rename tests/{MiniExcelTests => MiniExcel.Tests}/SaveByTemplate/InputValueExtractorTests.cs (100%) rename tests/{MiniExcelTests => MiniExcel.Tests}/SaveByTemplate/MiniExcelTemplateAsyncTests.cs (100%) rename tests/{MiniExcelTests => MiniExcel.Tests}/SaveByTemplate/MiniExcelTemplateTests.cs (100%) rename tests/{MiniExcelTests => MiniExcel.Tests}/Utils/EpplusLicense.cs (100%) rename tests/{MiniExcelTests => MiniExcel.Tests}/Utils/FileHelper.cs (100%) rename tests/{MiniExcelTests => MiniExcel.Tests}/Utils/SheetHelper.cs (100%) diff --git a/.gitignore b/.gitignore index c79821f5..5f5f7fd7 100644 --- a/.gitignore +++ b/.gitignore @@ -401,5 +401,5 @@ FodyWeavers.xsd /BenchmarkDotNet.Artifacts /tests/MiniExcel.Tests.AspNetMvc/packages /TestTemplate -/tests/MiniExcelTests/TemplateOptimization +/tests/MiniExcel.Tests/TemplateOptimization /samples/xlsx/Test_EnableWriteFilePath.xlsx \ No newline at end of file diff --git a/MiniExcel.slnx b/MiniExcel.slnx index 54d1620b..a7f45977 100644 --- a/MiniExcel.slnx +++ b/MiniExcel.slnx @@ -26,8 +26,8 @@ - - - + + + \ No newline at end of file diff --git a/tests/MiniExcel.Tests.AspNetCore/Program.cs b/tests/MiniExcel.Tests.AspNetCore/Program.cs index 40e5271c..e2a88dd2 100644 --- a/tests/MiniExcel.Tests.AspNetCore/Program.cs +++ b/tests/MiniExcel.Tests.AspNetCore/Program.cs @@ -7,7 +7,7 @@ using System.Collections.Generic; using System.IO; using System.Net; -using MiniExcelLibs; +using MiniExcelLib; using Microsoft.AspNetCore.Http; using System.Text.Json.Serialization; using Newtonsoft.Json; @@ -43,16 +43,24 @@ public IActionResult Index() { ContentType = "text/html", StatusCode = (int)HttpStatusCode.OK, - Content = @" -DownloadExcel
-DownloadExcelFromTemplatePath
-DownloadExcelFromTemplateBytes
-

Upload Excel

-
-
- -
-" + Content = + """ + + + DownloadExcel
+ DownloadExcelFromTemplatePath
+ DownloadExcelFromTemplateBytes
+ +

Upload Excel

+ +
+
+ + +
+ + + """ }; } diff --git a/tests/MiniExcelTests/GlobalUsings.cs b/tests/MiniExcel.Tests/GlobalUsings.cs similarity index 100% rename from tests/MiniExcelTests/GlobalUsings.cs rename to tests/MiniExcel.Tests/GlobalUsings.cs diff --git a/tests/MiniExcelTests/MiniExcelTests.csproj b/tests/MiniExcel.Tests/MiniExcel.Tests.csproj similarity index 100% rename from tests/MiniExcelTests/MiniExcelTests.csproj rename to tests/MiniExcel.Tests/MiniExcel.Tests.csproj diff --git a/tests/MiniExcelTests/MiniExcelAutoAdjustWidthTests.cs b/tests/MiniExcel.Tests/MiniExcelAutoAdjustWidthTests.cs similarity index 100% rename from tests/MiniExcelTests/MiniExcelAutoAdjustWidthTests.cs rename to tests/MiniExcel.Tests/MiniExcelAutoAdjustWidthTests.cs diff --git a/tests/MiniExcelTests/MiniExcelIssueAsyncTests.cs b/tests/MiniExcel.Tests/MiniExcelIssueAsyncTests.cs similarity index 100% rename from tests/MiniExcelTests/MiniExcelIssueAsyncTests.cs rename to tests/MiniExcel.Tests/MiniExcelIssueAsyncTests.cs diff --git a/tests/MiniExcelTests/MiniExcelIssueTests.cs b/tests/MiniExcel.Tests/MiniExcelIssueTests.cs similarity index 100% rename from tests/MiniExcelTests/MiniExcelIssueTests.cs rename to tests/MiniExcel.Tests/MiniExcelIssueTests.cs diff --git a/tests/MiniExcelTests/MiniExcelOpenXmlAsyncTests.cs b/tests/MiniExcel.Tests/MiniExcelOpenXmlAsyncTests.cs similarity index 100% rename from tests/MiniExcelTests/MiniExcelOpenXmlAsyncTests.cs rename to tests/MiniExcel.Tests/MiniExcelOpenXmlAsyncTests.cs diff --git a/tests/MiniExcelTests/MiniExcelOpenXmlConfigurationTest.cs b/tests/MiniExcel.Tests/MiniExcelOpenXmlConfigurationTest.cs similarity index 100% rename from tests/MiniExcelTests/MiniExcelOpenXmlConfigurationTest.cs rename to tests/MiniExcel.Tests/MiniExcelOpenXmlConfigurationTest.cs diff --git a/tests/MiniExcelTests/MiniExcelOpenXmlMultipleSheetAsyncTests.cs b/tests/MiniExcel.Tests/MiniExcelOpenXmlMultipleSheetAsyncTests.cs similarity index 100% rename from tests/MiniExcelTests/MiniExcelOpenXmlMultipleSheetAsyncTests.cs rename to tests/MiniExcel.Tests/MiniExcelOpenXmlMultipleSheetAsyncTests.cs diff --git a/tests/MiniExcelTests/MiniExcelOpenXmlMultipleSheetTests.cs b/tests/MiniExcel.Tests/MiniExcelOpenXmlMultipleSheetTests.cs similarity index 100% rename from tests/MiniExcelTests/MiniExcelOpenXmlMultipleSheetTests.cs rename to tests/MiniExcel.Tests/MiniExcelOpenXmlMultipleSheetTests.cs diff --git a/tests/MiniExcelTests/MiniExcelOpenXmlTests.cs b/tests/MiniExcel.Tests/MiniExcelOpenXmlTests.cs similarity index 100% rename from tests/MiniExcelTests/MiniExcelOpenXmlTests.cs rename to tests/MiniExcel.Tests/MiniExcelOpenXmlTests.cs diff --git a/tests/MiniExcelTests/SaveByTemplate/InputValueExtractorTests.cs b/tests/MiniExcel.Tests/SaveByTemplate/InputValueExtractorTests.cs similarity index 100% rename from tests/MiniExcelTests/SaveByTemplate/InputValueExtractorTests.cs rename to tests/MiniExcel.Tests/SaveByTemplate/InputValueExtractorTests.cs diff --git a/tests/MiniExcelTests/SaveByTemplate/MiniExcelTemplateAsyncTests.cs b/tests/MiniExcel.Tests/SaveByTemplate/MiniExcelTemplateAsyncTests.cs similarity index 100% rename from tests/MiniExcelTests/SaveByTemplate/MiniExcelTemplateAsyncTests.cs rename to tests/MiniExcel.Tests/SaveByTemplate/MiniExcelTemplateAsyncTests.cs diff --git a/tests/MiniExcelTests/SaveByTemplate/MiniExcelTemplateTests.cs b/tests/MiniExcel.Tests/SaveByTemplate/MiniExcelTemplateTests.cs similarity index 100% rename from tests/MiniExcelTests/SaveByTemplate/MiniExcelTemplateTests.cs rename to tests/MiniExcel.Tests/SaveByTemplate/MiniExcelTemplateTests.cs diff --git a/tests/MiniExcelTests/Utils/EpplusLicense.cs b/tests/MiniExcel.Tests/Utils/EpplusLicense.cs similarity index 100% rename from tests/MiniExcelTests/Utils/EpplusLicense.cs rename to tests/MiniExcel.Tests/Utils/EpplusLicense.cs diff --git a/tests/MiniExcelTests/Utils/FileHelper.cs b/tests/MiniExcel.Tests/Utils/FileHelper.cs similarity index 100% rename from tests/MiniExcelTests/Utils/FileHelper.cs rename to tests/MiniExcel.Tests/Utils/FileHelper.cs diff --git a/tests/MiniExcelTests/Utils/SheetHelper.cs b/tests/MiniExcel.Tests/Utils/SheetHelper.cs similarity index 100% rename from tests/MiniExcelTests/Utils/SheetHelper.cs rename to tests/MiniExcel.Tests/Utils/SheetHelper.cs From 36b98c02558706957428f13084da3d61eba5eee2 Mon Sep 17 00:00:00 2001 From: Michele Bastione Date: Wed, 9 Jul 2025 22:11:25 +0200 Subject: [PATCH 12/26] Fixing commit mistake --- src/MiniExcel/MiniExcel.csproj | 2 +- .../MiniExcel.Tests.AspNetCore.csproj | 41 ++++++++++--------- 2 files changed, 22 insertions(+), 21 deletions(-) diff --git a/src/MiniExcel/MiniExcel.csproj b/src/MiniExcel/MiniExcel.csproj index 67a2f5dd..017b5239 100644 --- a/src/MiniExcel/MiniExcel.csproj +++ b/src/MiniExcel/MiniExcel.csproj @@ -32,7 +32,7 @@ - +
diff --git a/tests/MiniExcel.Tests.AspNetCore/MiniExcel.Tests.AspNetCore.csproj b/tests/MiniExcel.Tests.AspNetCore/MiniExcel.Tests.AspNetCore.csproj index 2575d01a..b6e23ffb 100644 --- a/tests/MiniExcel.Tests.AspNetCore/MiniExcel.Tests.AspNetCore.csproj +++ b/tests/MiniExcel.Tests.AspNetCore/MiniExcel.Tests.AspNetCore.csproj @@ -1,28 +1,29 @@ - - netcoreapp3.1 - + + net8.0 + enable + - - - - - - + + + + + + - - - + + + - - - + + + - - - PreserveNewest - - + + + PreserveNewest + + From 36055d1f475f6706a616cecaba358c70ff838d15 Mon Sep 17 00:00:00 2001 From: Michele Bastione Date: Wed, 9 Jul 2025 23:44:16 +0200 Subject: [PATCH 13/26] Adjusted csv test namespaces --- tests/MiniExcel.Csv.Tests/AsyncIssueTests.cs | 8 +++----- tests/MiniExcel.Csv.Tests/IssueTests.cs | 8 +++----- .../MiniExcel.Csv.Tests/MiniExcelCsvAsycTests.cs | 14 +++++--------- tests/MiniExcel.Csv.Tests/MiniExcelCsvTests.cs | 16 ++++++---------- 4 files changed, 17 insertions(+), 29 deletions(-) diff --git a/tests/MiniExcel.Csv.Tests/AsyncIssueTests.cs b/tests/MiniExcel.Csv.Tests/AsyncIssueTests.cs index 060c2498..f7618feb 100644 --- a/tests/MiniExcel.Csv.Tests/AsyncIssueTests.cs +++ b/tests/MiniExcel.Csv.Tests/AsyncIssueTests.cs @@ -1,11 +1,9 @@ -using MiniExcelLib.Tests.Common.Utils; - -namespace MiniExcel.Csv.Tests; +namespace MiniExcelLib.Csv.Tests; public class AsyncIssueTests { - private readonly MiniExcelExporter _exporter = MiniExcelLib.MiniExcel.GetExporter(); - private readonly MiniExcelImporter _importer = MiniExcelLib.MiniExcel.GetImporter(); + private readonly MiniExcelExporter _exporter = MiniExcel.GetExporter(); + private readonly MiniExcelImporter _importer = MiniExcel.GetImporter(); /// /// Csv SaveAs by datareader with encoding default show messy code #253 diff --git a/tests/MiniExcel.Csv.Tests/IssueTests.cs b/tests/MiniExcel.Csv.Tests/IssueTests.cs index 96d3544d..ab09736b 100644 --- a/tests/MiniExcel.Csv.Tests/IssueTests.cs +++ b/tests/MiniExcel.Csv.Tests/IssueTests.cs @@ -1,11 +1,9 @@ -using MiniExcelLib.Tests.Common.Utils; - -namespace MiniExcel.Csv.Tests; +namespace MiniExcelLib.Csv.Tests; public class IssueTests { - private readonly MiniExcelImporter _importer = MiniExcelLib.MiniExcel.GetImporter(); - private readonly MiniExcelExporter _exporter = MiniExcelLib.MiniExcel.GetExporter(); + private readonly MiniExcelImporter _importer = MiniExcel.GetImporter(); + private readonly MiniExcelExporter _exporter = MiniExcel.GetExporter(); [Fact] public void TestPR10() diff --git a/tests/MiniExcel.Csv.Tests/MiniExcelCsvAsycTests.cs b/tests/MiniExcel.Csv.Tests/MiniExcelCsvAsycTests.cs index 3d0df48c..e66d4daa 100644 --- a/tests/MiniExcel.Csv.Tests/MiniExcelCsvAsycTests.cs +++ b/tests/MiniExcel.Csv.Tests/MiniExcelCsvAsycTests.cs @@ -1,8 +1,4 @@ -using MiniExcelLib.Tests.Common.Utils; -using System.Text; -using CsvReader = CsvHelper.CsvReader; - -namespace MiniExcelLib.Tests; +namespace MiniExcelLib.Csv.Tests; public class MiniExcelCsvAsycTests { @@ -107,7 +103,7 @@ public async Task SaveAsByDictionary() Assert.Equal(2, rowsWritten[0]); using var reader = new StreamReader(path); - using var csv = new CsvReader(reader, CultureInfo.InvariantCulture); + using var csv = new global::CsvHelper.CsvReader(reader, CultureInfo.InvariantCulture); var records = csv.GetRecords().ToList(); Assert.Equal(@"""<>+-*//}{\\n", records[0].a); @@ -148,7 +144,7 @@ public async Task SaveAsByDictionary() Assert.Equal(2, rowsWritten[0]); using var reader = new StreamReader(path); - using var csv = new CsvReader(reader, CultureInfo.InvariantCulture); + using var csv = new global::CsvHelper.CsvReader(reader, CultureInfo.InvariantCulture); var records = csv.GetRecords().ToList(); var row1 = records[0] as IDictionary; @@ -193,7 +189,7 @@ public async Task SaveAsByDataTableTest() Assert.Equal(2, rowsWritten[0]); using var reader = new StreamReader(path2); - using var csv = new CsvReader(reader, CultureInfo.InvariantCulture); + using var csv = new global::CsvHelper.CsvReader(reader, CultureInfo.InvariantCulture); var records = csv.GetRecords().ToList(); Assert.Equal(@"""<>+-*//}{\\n", records[0].a); @@ -236,7 +232,7 @@ public async Task CsvExcelTypeTest() Assert.Equal("Test2", rows1[1].B); using var reader = new StreamReader(path); - using var csv = new CsvReader(reader, CultureInfo.InvariantCulture); + using var csv = new global::CsvHelper.CsvReader(reader, CultureInfo.InvariantCulture); var rows2 = csv.GetRecords().ToList(); Assert.Equal("Test1", rows2[0].A); diff --git a/tests/MiniExcel.Csv.Tests/MiniExcelCsvTests.cs b/tests/MiniExcel.Csv.Tests/MiniExcelCsvTests.cs index 13ec806a..bc5b00a0 100644 --- a/tests/MiniExcel.Csv.Tests/MiniExcelCsvTests.cs +++ b/tests/MiniExcel.Csv.Tests/MiniExcelCsvTests.cs @@ -1,8 +1,4 @@ -using MiniExcelLib.Tests.Common.Utils; -using CsvReader = CsvHelper.CsvReader; -using CsvWriter = CsvHelper.CsvWriter; - -namespace MiniExcelLib.Tests; +namespace MiniExcelLib.Csv.Tests; public class MiniExcelCsvTests { @@ -197,7 +193,7 @@ public void SaveAsByDictionary() Assert.Equal(2, rowsWritten[0]); using var reader = new StreamReader(path.ToString()); - using var csv = new CsvReader(reader, CultureInfo.InvariantCulture); + using var csv = new global::CsvHelper.CsvReader(reader, CultureInfo.InvariantCulture); var records = csv.GetRecords().ToList(); Assert.Equal(@"""<>+-*//}{\\n", records[0].a); @@ -233,7 +229,7 @@ public void SaveAsByDictionary() _exporter.ExportCsv(path.ToString(), values); using (var reader = new StreamReader(path.ToString())) - using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture)) + using (var csv = new global::CsvHelper.CsvReader(reader, CultureInfo.InvariantCulture)) { var records = csv.GetRecords().ToList(); { @@ -284,7 +280,7 @@ public void SaveAsByDataTableTest() Assert.Equal(2, rowsWritten[0]); using (var reader = new StreamReader(path.ToString())) - using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture)) + using (var csv = new global::CsvHelper.CsvReader(reader, CultureInfo.InvariantCulture)) { var records = csv.GetRecords().ToList(); Assert.Equal(@"""<>+-*//}{\\n", records[0].a); @@ -335,7 +331,7 @@ public void CsvExcelTypeTest() Assert.Equal("Test2", rows[1].B); using var reader = new StreamReader(path); - using var csv = new CsvReader(reader, CultureInfo.InvariantCulture); + using var csv = new global::CsvHelper.CsvReader(reader, CultureInfo.InvariantCulture); var records = csv.GetRecords().ToList(); Assert.Equal("Test1", records[0].A); Assert.Equal("Test2", records[0].B); @@ -481,7 +477,7 @@ private static string Generate(string value) var path = file.ToString(); using (var writer = new StreamWriter(path)) - using (var csv = new CsvWriter(writer, CultureInfo.InvariantCulture)) + using (var csv = new global::CsvHelper.CsvWriter(writer, CultureInfo.InvariantCulture)) { var records = Enumerable.Range(1, 1).Select(_ => new { v1 = value, v2 = value }); csv.WriteRecords(records); From ab8127b6e8d21f22078129767c4165522455c082 Mon Sep 17 00:00:00 2001 From: Michele Bastione Date: Sun, 13 Jul 2025 01:45:06 +0200 Subject: [PATCH 14/26] Introduced extensible providers for exporter, importer and templater --- ...sxBenchmark.cs => CreateExcelBenchmark.cs} | 8 +- ...lsxBenchmark.cs => QueryExcelBenchmark.cs} | 10 +- ...Benchmark.cs => TemplateExcelBenchmark.cs} | 6 +- .../BenchmarkSections/XlsxAsyncBenchmark.cs | 10 +- benchmarks/MiniExcel.Benchmarks/Program.cs | 12 +- src/MiniExcel.Csv/CsvExporter.cs | 89 ++++ .../Importer.cs => CsvImporter.cs} | 46 +- src/MiniExcel.Csv/GlobalUsings.cs | 1 - .../MiniExcelExtensions/Exporter.cs | 85 ---- src/MiniExcel.Csv/ProviderExtensions.cs | 7 + src/MiniExcel/MiniExcel.cs | 6 +- ...iniExcelExporter.cs => OpenXmlExporter.cs} | 20 +- ...iniExcelImporter.cs => OpenXmlImporter.cs} | 52 +-- ...iExcelTemplater.cs => OpenXmlTemplater.cs} | 4 +- src/MiniExcel/Providers.cs | 16 + tests/MiniExcel.Csv.Tests/AsyncIssueTests.cs | 38 +- tests/MiniExcel.Csv.Tests/IssueTests.cs | 121 ++--- .../MiniExcel.Csv.Tests.csproj | 1 - .../MiniExcelCsvAsycTests.cs | 4 +- .../MiniExcel.Csv.Tests/MiniExcelCsvTests.cs | 6 +- tests/MiniExcel.Tests/GlobalUsings.cs | 17 - tests/MiniExcel.Tests/MiniExcel.Tests.csproj | 17 + .../MiniExcelAutoAdjustWidthTests.cs | 18 +- .../MiniExcelIssueAsyncTests.cs | 184 ++++---- tests/MiniExcel.Tests/MiniExcelIssueTests.cs | 434 +++++++++--------- .../MiniExcelOpenXmlAsyncTests.cs | 232 +++++----- .../MiniExcelOpenXmlConfigurationTest.cs | 9 +- ...MiniExcelOpenXmlMultipleSheetAsyncTests.cs | 28 +- .../MiniExcelOpenXmlMultipleSheetTests.cs | 52 +-- .../MiniExcel.Tests/MiniExcelOpenXmlTests.cs | 216 ++++----- .../MiniExcelTemplateAsyncTests.cs | 40 +- .../SaveByTemplate/MiniExcelTemplateTests.cs | 45 +- 32 files changed, 932 insertions(+), 902 deletions(-) rename benchmarks/MiniExcel.Benchmarks/BenchmarkSections/{CreateXlsxBenchmark.cs => CreateExcelBenchmark.cs} (92%) rename benchmarks/MiniExcel.Benchmarks/BenchmarkSections/{QueryXlsxBenchmark.cs => QueryExcelBenchmark.cs} (92%) rename benchmarks/MiniExcel.Benchmarks/BenchmarkSections/{TemplateXlsxBenchmark.cs => TemplateExcelBenchmark.cs} (88%) create mode 100644 src/MiniExcel.Csv/CsvExporter.cs rename src/MiniExcel.Csv/{MiniExcelExtensions/Importer.cs => CsvImporter.cs} (67%) delete mode 100644 src/MiniExcel.Csv/MiniExcelExtensions/Exporter.cs create mode 100644 src/MiniExcel.Csv/ProviderExtensions.cs rename src/MiniExcel/{MiniExcelExporter.cs => OpenXmlExporter.cs} (62%) rename src/MiniExcel/{MiniExcelImporter.cs => OpenXmlImporter.cs} (79%) rename src/MiniExcel/{MiniExcelTemplater.cs => OpenXmlTemplater.cs} (93%) create mode 100644 src/MiniExcel/Providers.cs delete mode 100644 tests/MiniExcel.Tests/GlobalUsings.cs diff --git a/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/CreateXlsxBenchmark.cs b/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/CreateExcelBenchmark.cs similarity index 92% rename from benchmarks/MiniExcel.Benchmarks/BenchmarkSections/CreateXlsxBenchmark.cs rename to benchmarks/MiniExcel.Benchmarks/BenchmarkSections/CreateExcelBenchmark.cs index 2d3133ba..56227298 100644 --- a/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/CreateXlsxBenchmark.cs +++ b/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/CreateExcelBenchmark.cs @@ -10,23 +10,23 @@ namespace MiniExcelLib.Benchmarks.BenchmarkSections; -public class CreateXlsxBenchmark : BenchmarkBase +public class CreateExcelBenchmark : BenchmarkBase { - private MiniExcelExporter _exporter; + private OpenXmlExporter _exporter; [GlobalSetup] public void SetUp() { ExcelPackage.LicenseContext = LicenseContext.NonCommercial; Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); - _exporter = new MiniExcelExporter(); + _exporter = new OpenXmlExporter(); } [Benchmark(Description = "MiniExcel Create Xlsx")] public void MiniExcelCreateTest() { using var path = AutoDeletingPath.Create(); - _exporter.ExportXlsx(path.FilePath, GetValue()); + _exporter.ExportExcel(path.FilePath, GetValue()); } [Benchmark(Description = "ClosedXml Create Xlsx")] diff --git a/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/QueryXlsxBenchmark.cs b/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/QueryExcelBenchmark.cs similarity index 92% rename from benchmarks/MiniExcel.Benchmarks/BenchmarkSections/QueryXlsxBenchmark.cs rename to benchmarks/MiniExcel.Benchmarks/BenchmarkSections/QueryExcelBenchmark.cs index 84dcd199..c22f5e69 100644 --- a/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/QueryXlsxBenchmark.cs +++ b/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/QueryExcelBenchmark.cs @@ -9,28 +9,28 @@ namespace MiniExcelLib.Benchmarks.BenchmarkSections; -public class QueryXlsxBenchmark : BenchmarkBase +public class QueryExcelBenchmark : BenchmarkBase { - private MiniExcelImporter _importer; + private OpenXmlImporter _importer; [GlobalSetup] public void SetUp() { ExcelPackage.LicenseContext = LicenseContext.NonCommercial; Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); - _importer = new MiniExcelImporter(); + _importer = new OpenXmlImporter(); } [Benchmark(Description = "MiniExcel QueryFirst")] public void MiniExcel_QueryFirst_Test() { - _ = _importer.QueryXlsx(FilePath).First(); + _ = _importer.QueryExcel(FilePath).First(); } [Benchmark(Description = "MiniExcel Query")] public void MiniExcel_Query() { - foreach (var _ in _importer.QueryXlsx(FilePath)) { } + foreach (var _ in _importer.QueryExcel(FilePath)) { } } [Benchmark(Description = "ExcelDataReader QueryFirst")] diff --git a/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/TemplateXlsxBenchmark.cs b/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/TemplateExcelBenchmark.cs similarity index 88% rename from benchmarks/MiniExcel.Benchmarks/BenchmarkSections/TemplateXlsxBenchmark.cs rename to benchmarks/MiniExcel.Benchmarks/BenchmarkSections/TemplateExcelBenchmark.cs index 97f26a31..27918fea 100644 --- a/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/TemplateXlsxBenchmark.cs +++ b/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/TemplateExcelBenchmark.cs @@ -4,14 +4,14 @@ namespace MiniExcelLib.Benchmarks.BenchmarkSections; -public class TemplateXlsxBenchmark : BenchmarkBase +public class TemplateExcelBenchmark : BenchmarkBase { - private MiniExcelTemplater _templater; + private OpenXmlTemplater _templater; [GlobalSetup] public void Setup() { - _templater = new MiniExcelTemplater(); + _templater = new OpenXmlTemplater(); } [Benchmark(Description = "MiniExcel Template Generate")] diff --git a/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/XlsxAsyncBenchmark.cs b/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/XlsxAsyncBenchmark.cs index 068ecedc..29b53702 100644 --- a/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/XlsxAsyncBenchmark.cs +++ b/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/XlsxAsyncBenchmark.cs @@ -5,14 +5,14 @@ namespace MiniExcelLib.Benchmarks.BenchmarkSections; public class XlsxAsyncBenchmark : BenchmarkBase { - private MiniExcelExporter _exporter; - private MiniExcelTemplater _templater; + private OpenXmlExporter _exporter; + private OpenXmlTemplater _templater; [GlobalSetup] public void Setup() { - _exporter = new MiniExcelExporter(); - _templater = new MiniExcelTemplater(); + _exporter = new OpenXmlExporter(); + _templater = new OpenXmlTemplater(); } [Benchmark(Description = "MiniExcel Create Xlsx Async")] @@ -21,7 +21,7 @@ public async Task MiniExcelCreateAsyncTest() using var path = AutoDeletingPath.Create(); await using var stream = File.Create(path.FilePath); - await _exporter.ExportXlsxAsync(stream, GetValue()); + await _exporter.ExportExcelAsync(stream, GetValue()); } [Benchmark(Description = "MiniExcel Generate Template Async")] diff --git a/benchmarks/MiniExcel.Benchmarks/Program.cs b/benchmarks/MiniExcel.Benchmarks/Program.cs index 256d928b..8dddb5e7 100644 --- a/benchmarks/MiniExcel.Benchmarks/Program.cs +++ b/benchmarks/MiniExcel.Benchmarks/Program.cs @@ -7,9 +7,9 @@ var section = Environment.GetEnvironmentVariable("BenchmarkSection"); var benchmark = section?.ToLowerInvariant().Trim() switch { - "query" => typeof(QueryXlsxBenchmark), - "create" => typeof(CreateXlsxBenchmark), - "template" => typeof(TemplateXlsxBenchmark), + "query" => typeof(QueryExcelBenchmark), + "create" => typeof(CreateExcelBenchmark), + "template" => typeof(TemplateExcelBenchmark), _ => throw new ArgumentException($"Benchmark section {section} does not exist") }; @@ -20,9 +20,9 @@ BenchmarkSwitcher .FromTypes( [ - typeof(QueryXlsxBenchmark), - typeof(CreateXlsxBenchmark), - typeof(TemplateXlsxBenchmark) + typeof(QueryExcelBenchmark), + typeof(CreateExcelBenchmark), + typeof(TemplateExcelBenchmark) ]) .Run(args, BenchmarkConfig.Default); } \ No newline at end of file diff --git a/src/MiniExcel.Csv/CsvExporter.cs b/src/MiniExcel.Csv/CsvExporter.cs new file mode 100644 index 00000000..92c6c45c --- /dev/null +++ b/src/MiniExcel.Csv/CsvExporter.cs @@ -0,0 +1,89 @@ +namespace MiniExcelLib.Csv; + +public partial class CsvExporter +{ + #region Append / Export + + [CreateSyncVersion] + public async Task AppendToCsvAsync(string path, object value, bool printHeader = true, + CsvConfiguration? configuration = null, CancellationToken cancellationToken = default) + { + if (!File.Exists(path)) + { + var rowsWritten = await ExportCsvAsync(path, value, printHeader, false, configuration, cancellationToken: cancellationToken).ConfigureAwait(false); + return rowsWritten.FirstOrDefault(); + } + + using var stream = new FileStream(path, FileMode.Append, FileAccess.Write, FileShare.Read, 4096, FileOptions.SequentialScan); + return await AppendToCsvAsync(stream, value, configuration, cancellationToken).ConfigureAwait(false); + } + + [CreateSyncVersion] + public async Task AppendToCsvAsync(Stream stream, object value, CsvConfiguration? configuration = null, CancellationToken cancellationToken = default) + { + stream.Seek(0, SeekOrigin.End); + + var newValue = value is IEnumerable or IDataReader ? value : new[] { value }; + + using var writer = new CsvWriter(stream, newValue, false, configuration); + return await writer.InsertAsync(false, cancellationToken).ConfigureAwait(false); + } + + [CreateSyncVersion] + public async Task ExportCsvAsync(string path, object value, bool printHeader = true, bool overwriteFile = false, + CsvConfiguration? configuration = null, CancellationToken cancellationToken = default) + { + using var stream = overwriteFile ? File.Create(path) : new FileStream(path, FileMode.CreateNew); + return await ExportCsvAsync(stream, value, printHeader, configuration, cancellationToken).ConfigureAwait(false); + } + + [CreateSyncVersion] + public async Task ExportCsvAsync(Stream stream, object value, bool printHeader = true, + CsvConfiguration? configuration = null, CancellationToken cancellationToken = default) + { + using var writer = new CsvWriter(stream, value, printHeader, configuration); + return await writer.SaveAsAsync(cancellationToken).ConfigureAwait(false); + } + + #endregion + + #region Convert + + [CreateSyncVersion] + public async Task ConvertCsvToXlsxAsync(Stream csv, Stream xlsx, bool csvHasHeader = false, CancellationToken cancellationToken = default) + { + var value = new CsvImporter(). + QueryCsvAsync(csv, useHeaderRow: csvHasHeader, cancellationToken: cancellationToken); + + await new OpenXmlExporter() + .ExportExcelAsync(xlsx, value, printHeader: csvHasHeader, cancellationToken: cancellationToken) + .ConfigureAwait(false); + } + + [CreateSyncVersion] + public async Task ConvertCsvToXlsxAsync(string csvPath, string xlsx, bool csvHasHeader = false, CancellationToken cancellationToken = default) + { + using var csvStream = FileHelper.OpenSharedRead(csvPath); + using var xlsxStream = new FileStream(xlsx, FileMode.CreateNew); + + await ConvertCsvToXlsxAsync(csvStream, xlsxStream, csvHasHeader, cancellationToken).ConfigureAwait(false); + } + + [CreateSyncVersion] + public async Task ConvertXlsxToCsvAsync(string xlsx, string csvPath, bool xlsxHasHeader = true, CancellationToken cancellationToken = default) + { + using var xlsxStream = FileHelper.OpenSharedRead(xlsx); + using var csvStream = new FileStream(csvPath, FileMode.CreateNew); + + await ConvertXlsxToCsvAsync(xlsxStream, csvStream, xlsxHasHeader, cancellationToken).ConfigureAwait(false); + } + + [CreateSyncVersion] + public async Task ConvertXlsxToCsvAsync(Stream xlsx, Stream csv, bool xlsxHasHeader = true, CancellationToken cancellationToken = default) + { + var value = new OpenXmlImporter().QueryExcelAsync(xlsx, useHeaderRow: xlsxHasHeader, cancellationToken: cancellationToken).ConfigureAwait(false); + await ExportCsvAsync(csv, value, printHeader: xlsxHasHeader, cancellationToken: cancellationToken).ConfigureAwait(false); + } + + #endregion +} \ No newline at end of file diff --git a/src/MiniExcel.Csv/MiniExcelExtensions/Importer.cs b/src/MiniExcel.Csv/CsvImporter.cs similarity index 67% rename from src/MiniExcel.Csv/MiniExcelExtensions/Importer.cs rename to src/MiniExcel.Csv/CsvImporter.cs index 0b89677b..4c8482de 100644 --- a/src/MiniExcel.Csv/MiniExcelExtensions/Importer.cs +++ b/src/MiniExcel.Csv/CsvImporter.cs @@ -1,19 +1,19 @@ using MiniExcelLib.DataReader; -namespace MiniExcelLib.Csv.MiniExcelExtensions; +namespace MiniExcelLib.Csv; -public static partial class Importer +public partial class CsvImporter { #region Query [CreateSyncVersion] - public static async IAsyncEnumerable QueryCsvAsync(this MiniExcelImporter me, string path, CsvConfiguration? configuration = null, + public async IAsyncEnumerable QueryCsvAsync(string path, CsvConfiguration? configuration = null, bool treatHeaderAsData = false, [EnumeratorCancellation] CancellationToken cancellationToken = default) where T : class, new() { using var stream = FileHelper.OpenSharedRead(path); - var query = QueryCsvAsync(me, stream, treatHeaderAsData, configuration, cancellationToken); + var query = QueryCsvAsync(stream, treatHeaderAsData, configuration, cancellationToken); //Foreach yield return twice reason : https://stackoverflow.com/questions/66791982/ienumerable-extract-code-lazy-loading-show-stream-was-not-readable await foreach (var item in query.ConfigureAwait(false)) @@ -21,7 +21,7 @@ public static async IAsyncEnumerable QueryCsvAsync(this MiniExcelImporter } [CreateSyncVersion] - public static async IAsyncEnumerable QueryCsvAsync(this MiniExcelImporter me, Stream stream, bool treatHeaderAsData = false, + public async IAsyncEnumerable QueryCsvAsync(Stream stream, bool treatHeaderAsData = false, CsvConfiguration? configuration = null, [EnumeratorCancellation] CancellationToken cancellationToken = default) where T : class, new() @@ -32,17 +32,17 @@ public static async IAsyncEnumerable QueryCsvAsync(this MiniExcelImporter } [CreateSyncVersion] - public static async IAsyncEnumerable QueryCsvAsync(this MiniExcelImporter me, string path, bool useHeaderRow = false, + public async IAsyncEnumerable QueryCsvAsync(string path, bool useHeaderRow = false, CsvConfiguration? configuration = null, [EnumeratorCancellation] CancellationToken cancellationToken = default) { using var stream = FileHelper.OpenSharedRead(path); - await foreach (var item in QueryCsvAsync(me, stream, useHeaderRow, configuration, cancellationToken).ConfigureAwait(false)) + await foreach (var item in QueryCsvAsync(stream, useHeaderRow, configuration, cancellationToken).ConfigureAwait(false)) yield return item; } [CreateSyncVersion] - public static async IAsyncEnumerable QueryCsvAsync(this MiniExcelImporter me, Stream stream, bool useHeaderRow = false, + public async IAsyncEnumerable QueryCsvAsync(Stream stream, bool useHeaderRow = false, CsvConfiguration? configuration = null, [EnumeratorCancellation] CancellationToken cancellationToken = default) { @@ -61,18 +61,18 @@ public static async IAsyncEnumerable QueryCsvAsync(this MiniExcelImport /// QueryAsDataTable is not recommended, because it'll load all data into memory. /// [CreateSyncVersion] - public static async Task QueryCsvAsDataTableAsync(this MiniExcelImporter me, string path, bool useHeaderRow = true, + public async Task QueryCsvAsDataTableAsync(string path, bool useHeaderRow = true, CsvConfiguration? configuration = null, CancellationToken cancellationToken = default) { using var stream = FileHelper.OpenSharedRead(path); - return await QueryCsvAsDataTableAsync(me, stream, useHeaderRow, configuration, cancellationToken).ConfigureAwait(false); + return await QueryCsvAsDataTableAsync(stream, useHeaderRow, configuration, cancellationToken).ConfigureAwait(false); } /// /// QueryAsDataTable is not recommended, because it'll load all data into memory. /// [CreateSyncVersion] - public static async Task QueryCsvAsDataTableAsync(this MiniExcelImporter me, Stream stream, bool useHeaderRow = true, + public async Task QueryCsvAsDataTableAsync(Stream stream, bool useHeaderRow = true, CsvConfiguration? configuration = null, CancellationToken cancellationToken = default) { var dt = new DataTable(); @@ -126,19 +126,19 @@ public static async Task QueryCsvAsDataTableAsync(this MiniExcelImpor #region Info [CreateSyncVersion] - public static async Task> GetCsvColumnsAsync(this MiniExcelImporter me, string path, bool useHeaderRow = false, + public async Task> GetCsvColumnsAsync(string path, bool useHeaderRow = false, CsvConfiguration? configuration = null, CancellationToken cancellationToken = default) { using var stream = FileHelper.OpenSharedRead(path); - return await GetCsvColumnsAsync(me, stream, useHeaderRow, configuration, cancellationToken).ConfigureAwait(false); + return await GetCsvColumnsAsync(stream, useHeaderRow, configuration, cancellationToken).ConfigureAwait(false); } [CreateSyncVersion] - public static async Task> GetCsvColumnsAsync(this MiniExcelImporter me, Stream stream, bool useHeaderRow = false, + public async Task> GetCsvColumnsAsync(Stream stream, bool useHeaderRow = false, CsvConfiguration? configuration = null, CancellationToken cancellationToken = default) { #pragma warning disable CA2007 // Consider calling ConfigureAwait on the awaited task - await using var enumerator = QueryCsvAsync(me, stream, useHeaderRow, configuration, cancellationToken).GetAsyncEnumerator(cancellationToken); + await using var enumerator = QueryCsvAsync(stream, useHeaderRow, configuration, cancellationToken).GetAsyncEnumerator(cancellationToken); #pragma warning restore CA2007 // Consider calling ConfigureAwait on the awaited task _ = enumerator.ConfigureAwait(false); @@ -154,35 +154,35 @@ public static async Task> GetCsvColumnsAsync(this MiniExcelI #region DataReader - public static MiniExcelDataReader GetCsvDataReader(this MiniExcelImporter me, string path, bool useHeaderRow = false, CsvConfiguration? configuration = null) + public MiniExcelDataReader GetCsvDataReader(string path, bool useHeaderRow = false, CsvConfiguration? configuration = null) { var stream = FileHelper.OpenSharedRead(path); - var values = QueryCsv(me, stream, useHeaderRow, configuration).Cast>(); + var values = QueryCsv(stream, useHeaderRow, configuration).Cast>(); return MiniExcelDataReader.Create(stream, values); } - public static MiniExcelDataReader GetCsvDataReader(this MiniExcelImporter me, Stream stream, bool useHeaderRow = false, CsvConfiguration? configuration = null) + public MiniExcelDataReader GetCsvDataReader(Stream stream, bool useHeaderRow = false, CsvConfiguration? configuration = null) { - var values = QueryCsv(me, stream, useHeaderRow, configuration).Cast>(); + var values = QueryCsv(stream, useHeaderRow, configuration).Cast>(); return MiniExcelDataReader.Create(stream, values); } - public static async Task GetAsyncCsvDataReader(this MiniExcelImporter me, string path, bool useHeaderRow = false, + public async Task GetAsyncCsvDataReader(string path, bool useHeaderRow = false, string? sheetName = null, string startCell = "A1", CsvConfiguration? configuration = null, CancellationToken cancellationToken = default) { var stream = FileHelper.OpenSharedRead(path); - var values = QueryCsvAsync(me, stream, useHeaderRow, configuration, cancellationToken); + var values = QueryCsvAsync(stream, useHeaderRow, configuration, cancellationToken); return await MiniExcelAsyncDataReader.CreateAsync(stream, CastAsync(values, cancellationToken)).ConfigureAwait(false); } - public static async Task GetAsyncCsvDataReader(this MiniExcelImporter me, Stream stream, bool useHeaderRow = false, + public async Task GetAsyncCsvDataReader(Stream stream, bool useHeaderRow = false, string? sheetName = null, string startCell = "A1", CsvConfiguration? configuration = null, CancellationToken cancellationToken = default) { - var values = QueryCsvAsync(me, stream, useHeaderRow, configuration, cancellationToken); + var values = QueryCsvAsync(stream, useHeaderRow, configuration, cancellationToken); return await MiniExcelAsyncDataReader.CreateAsync(stream, CastAsync(values, cancellationToken)).ConfigureAwait(false); } diff --git a/src/MiniExcel.Csv/GlobalUsings.cs b/src/MiniExcel.Csv/GlobalUsings.cs index 79ef9c06..6498278a 100644 --- a/src/MiniExcel.Csv/GlobalUsings.cs +++ b/src/MiniExcel.Csv/GlobalUsings.cs @@ -7,7 +7,6 @@ global using System.Runtime.CompilerServices; global using System.Text; global using System.Text.RegularExpressions; -global using MiniExcelLib; global using MiniExcelLib.Abstractions; global using MiniExcelLib.Exceptions; global using MiniExcelLib.Helpers; diff --git a/src/MiniExcel.Csv/MiniExcelExtensions/Exporter.cs b/src/MiniExcel.Csv/MiniExcelExtensions/Exporter.cs deleted file mode 100644 index 508bb810..00000000 --- a/src/MiniExcel.Csv/MiniExcelExtensions/Exporter.cs +++ /dev/null @@ -1,85 +0,0 @@ -namespace MiniExcelLib.Csv.MiniExcelExtensions; - -public static partial class Exporter -{ - #region Append / Export - - [CreateSyncVersion] - public static async Task AppendToCsvAsync(this MiniExcelExporter me, string path, object value, bool printHeader = true, - CsvConfiguration? configuration = null, CancellationToken cancellationToken = default) - { - if (!File.Exists(path)) - { - var rowsWritten = await ExportCsvAsync(me, path, value, printHeader, false, configuration, cancellationToken: cancellationToken).ConfigureAwait(false); - return rowsWritten.FirstOrDefault(); - } - - using var stream = new FileStream(path, FileMode.Append, FileAccess.Write, FileShare.Read, 4096, FileOptions.SequentialScan); - return await me.AppendToCsvAsync(stream, value, configuration, cancellationToken).ConfigureAwait(false); - } - - [CreateSyncVersion] - public static async Task AppendToCsvAsync(this MiniExcelExporter me, Stream stream, object value, CsvConfiguration? configuration = null, CancellationToken cancellationToken = default) - { - stream.Seek(0, SeekOrigin.End); - - var newValue = value is IEnumerable or IDataReader ? value : new[] { value }; - - using var writer = new CsvWriter(stream, newValue, false, configuration); - return await writer.InsertAsync(false, cancellationToken).ConfigureAwait(false); - } - - [CreateSyncVersion] - public static async Task ExportCsvAsync(this MiniExcelExporter me, string path, object value, bool printHeader = true, bool overwriteFile = false, - CsvConfiguration? configuration = null, CancellationToken cancellationToken = default) - { - using var stream = overwriteFile ? File.Create(path) : new FileStream(path, FileMode.CreateNew); - return await ExportCsvAsync(me, stream, value, printHeader, configuration, cancellationToken).ConfigureAwait(false); - } - - [CreateSyncVersion] - public static async Task ExportCsvAsync(this MiniExcelExporter me, Stream stream, object value, bool printHeader = true, - CsvConfiguration? configuration = null, CancellationToken cancellationToken = default) - { - using var writer = new CsvWriter(stream, value, printHeader, configuration); - return await writer.SaveAsAsync(cancellationToken).ConfigureAwait(false); - } - - #endregion - - #region Convert - - [CreateSyncVersion] - public static async Task ConvertCsvToXlsxAsync(this MiniExcelExporter me, Stream csv, Stream xlsx, bool csvHasHeader = false, CancellationToken cancellationToken = default) - { - var value = new MiniExcelImporter().QueryCsvAsync(csv, useHeaderRow: csvHasHeader, cancellationToken: cancellationToken); - await me.ExportXlsxAsync(xlsx, value, printHeader: csvHasHeader, cancellationToken: cancellationToken).ConfigureAwait(false); - } - - [CreateSyncVersion] - public static async Task ConvertCsvToXlsxAsync(this MiniExcelExporter me, string csvPath, string xlsx, bool csvHasHeader = false, CancellationToken cancellationToken = default) - { - using var csvStream = FileHelper.OpenSharedRead(csvPath); - using var xlsxStream = new FileStream(xlsx, FileMode.CreateNew); - - await me.ConvertCsvToXlsxAsync(csvStream, xlsxStream, csvHasHeader, cancellationToken).ConfigureAwait(false); - } - - [CreateSyncVersion] - public static async Task ConvertXlsxToCsvAsync(this MiniExcelExporter me, string xlsx, string csvPath, bool xlsxHasHeader = true, CancellationToken cancellationToken = default) - { - using var xlsxStream = FileHelper.OpenSharedRead(xlsx); - using var csvStream = new FileStream(csvPath, FileMode.CreateNew); - - await me.ConvertXlsxToCsvAsync(xlsxStream, csvStream, xlsxHasHeader, cancellationToken).ConfigureAwait(false); - } - - [CreateSyncVersion] - public static async Task ConvertXlsxToCsvAsync(this MiniExcelExporter me, Stream xlsx, Stream csv, bool xlsxHasHeader = true, CancellationToken cancellationToken = default) - { - var value = new MiniExcelImporter().QueryXlsxAsync(xlsx, useHeaderRow: xlsxHasHeader, cancellationToken: cancellationToken).ConfigureAwait(false); - await me.ExportCsvAsync(csv, value, printHeader: xlsxHasHeader, cancellationToken: cancellationToken).ConfigureAwait(false); - } - - #endregion -} \ No newline at end of file diff --git a/src/MiniExcel.Csv/ProviderExtensions.cs b/src/MiniExcel.Csv/ProviderExtensions.cs new file mode 100644 index 00000000..7f6491e3 --- /dev/null +++ b/src/MiniExcel.Csv/ProviderExtensions.cs @@ -0,0 +1,7 @@ +namespace MiniExcelLib.Csv; + +public static class ProviderExtensions +{ + public static CsvExporter GetCsvExporter(this MiniExcelExporterProvider exporterProvider) => new(); + public static CsvImporter GetCsvImporter(this MiniExcelImporterProvider importerProvider) => new(); +} \ No newline at end of file diff --git a/src/MiniExcel/MiniExcel.cs b/src/MiniExcel/MiniExcel.cs index 666c7814..f0719586 100644 --- a/src/MiniExcel/MiniExcel.cs +++ b/src/MiniExcel/MiniExcel.cs @@ -2,7 +2,7 @@ namespace MiniExcelLib; public static class MiniExcel { - public static MiniExcelExporter GetExporter() => new(); - public static MiniExcelImporter GetImporter() => new(); - public static MiniExcelTemplater GetTemplater() => new(); + public static MiniExcelExporterProvider GetExporterProvider() => new(); + public static MiniExcelImporterProvider GetImporterProvider() => new(); + public static MiniExcelTemplaterProvider GetTemplaterProvider() => new(); } \ No newline at end of file diff --git a/src/MiniExcel/MiniExcelExporter.cs b/src/MiniExcel/OpenXmlExporter.cs similarity index 62% rename from src/MiniExcel/MiniExcelExporter.cs rename to src/MiniExcel/OpenXmlExporter.cs index 118cef2c..b6632e92 100644 --- a/src/MiniExcel/MiniExcelExporter.cs +++ b/src/MiniExcel/OpenXmlExporter.cs @@ -2,39 +2,39 @@ namespace MiniExcelLib; -public sealed partial class MiniExcelExporter +public sealed partial class OpenXmlExporter { [CreateSyncVersion] - public async Task AddPictureXlsxAsync(string path, CancellationToken cancellationToken = default, params MiniExcelPicture[] images) + public async Task AddExcelPictureAsync(string path, CancellationToken cancellationToken = default, params MiniExcelPicture[] images) { using var stream = File.Open(path, FileMode.OpenOrCreate); await MiniExcelPictureImplement.AddPictureAsync(stream, cancellationToken, images).ConfigureAwait(false); } [CreateSyncVersion] - public async Task AddPictureXlsxAsync(Stream excelStream, CancellationToken cancellationToken = default, params MiniExcelPicture[] images) + public async Task AddExcelPictureAsync(Stream excelStream, CancellationToken cancellationToken = default, params MiniExcelPicture[] images) { await MiniExcelPictureImplement.AddPictureAsync(excelStream, cancellationToken, images).ConfigureAwait(false); } [CreateSyncVersion] - public async Task InsertXlsxSheetAsync(string path, object value, string? sheetName = "Sheet1", bool printHeader = true, bool overwriteSheet = false, OpenXmlConfiguration? configuration = null, CancellationToken cancellationToken = default) + public async Task InsertExcelSheetAsync(string path, object value, string? sheetName = "Sheet1", bool printHeader = true, bool overwriteSheet = false, OpenXmlConfiguration? configuration = null, CancellationToken cancellationToken = default) { if (Path.GetExtension(path).Equals(".xlsm", StringComparison.InvariantCultureIgnoreCase)) throw new NotSupportedException("MiniExcel's Insert does not support the .xlsm format"); if (!File.Exists(path)) { - var rowsWritten = await ExportXlsxAsync(path, value, printHeader, sheetName, configuration: configuration, cancellationToken: cancellationToken).ConfigureAwait(false); + var rowsWritten = await ExportExcelAsync(path, value, printHeader, sheetName, configuration: configuration, cancellationToken: cancellationToken).ConfigureAwait(false); return rowsWritten.FirstOrDefault(); } using var stream = new FileStream(path, FileMode.Open, FileAccess.ReadWrite, FileShare.Read, 4096, FileOptions.SequentialScan); - return await InsertXlsxSheetAsync(stream, value, sheetName, printHeader, overwriteSheet, configuration, cancellationToken).ConfigureAwait(false); + return await InsertExcelSheetAsync(stream, value, sheetName, printHeader, overwriteSheet, configuration, cancellationToken).ConfigureAwait(false); } [CreateSyncVersion] - public async Task InsertXlsxSheetAsync(Stream stream, object value, string? sheetName = "Sheet1", + public async Task InsertExcelSheetAsync(Stream stream, object value, string? sheetName = "Sheet1", bool printHeader = true, bool overwriteSheet = false, OpenXmlConfiguration? configuration = null, CancellationToken cancellationToken = default) { @@ -49,7 +49,7 @@ public async Task InsertXlsxSheetAsync(Stream stream, object value, string? } [CreateSyncVersion] - public async Task ExportXlsxAsync(string path, object value, bool printHeader = true, + public async Task ExportExcelAsync(string path, object value, bool printHeader = true, string? sheetName = "Sheet1", bool overwriteFile = false, OpenXmlConfiguration? configuration = null, CancellationToken cancellationToken = default) { @@ -57,11 +57,11 @@ public async Task ExportXlsxAsync(string path, object value, bool printHe throw new NotSupportedException("MiniExcel's SaveAs does not support the .xlsm format"); using var stream = overwriteFile ? File.Create(path) : new FileStream(path, FileMode.CreateNew); - return await ExportXlsxAsync(stream, value, printHeader, sheetName, configuration, cancellationToken).ConfigureAwait(false); + return await ExportExcelAsync(stream, value, printHeader, sheetName, configuration, cancellationToken).ConfigureAwait(false); } [CreateSyncVersion] - public async Task ExportXlsxAsync(Stream stream, object value, bool printHeader = true, string? sheetName = "Sheet1", + public async Task ExportExcelAsync(Stream stream, object value, bool printHeader = true, string? sheetName = "Sheet1", OpenXmlConfiguration? configuration = null, CancellationToken cancellationToken = default) { var writer = await OpenXmlWriter diff --git a/src/MiniExcel/MiniExcelImporter.cs b/src/MiniExcel/OpenXmlImporter.cs similarity index 79% rename from src/MiniExcel/MiniExcelImporter.cs rename to src/MiniExcel/OpenXmlImporter.cs index 44e057ad..e6cf0731 100644 --- a/src/MiniExcel/MiniExcelImporter.cs +++ b/src/MiniExcel/OpenXmlImporter.cs @@ -6,18 +6,18 @@ namespace MiniExcelLib; -public sealed partial class MiniExcelImporter +public sealed partial class OpenXmlImporter { #region Query [CreateSyncVersion] - public async IAsyncEnumerable QueryXlsxAsync(string path, string? sheetName = null, + public async IAsyncEnumerable QueryExcelAsync(string path, string? sheetName = null, string startCell = "A1", bool treatHeaderAsData = false, OpenXmlConfiguration? configuration = null, [EnumeratorCancellation] CancellationToken cancellationToken = default) where T : class, new() { using var stream = FileHelper.OpenSharedRead(path); - var query = QueryXlsxAsync(stream, sheetName, startCell, treatHeaderAsData, configuration, cancellationToken); + var query = QueryExcelAsync(stream, sheetName, startCell, treatHeaderAsData, configuration, cancellationToken); //Foreach yield return twice reason : https://stackoverflow.com/questions/66791982/ienumerable-extract-code-lazy-loading-show-stream-was-not-readable await foreach (var item in query.ConfigureAwait(false)) @@ -26,7 +26,7 @@ public async IAsyncEnumerable QueryXlsxAsync(string path, string? sheetNam [CreateSyncVersion] [SuppressMessage("Reliability", "CA2007:Do not directly await a Task")] - public async IAsyncEnumerable QueryXlsxAsync(Stream stream, string? sheetName = null, + public async IAsyncEnumerable QueryExcelAsync(Stream stream, string? sheetName = null, string startCell = "A1", bool treatHeaderAsData = false, OpenXmlConfiguration? configuration = null, [EnumeratorCancellation] CancellationToken cancellationToken = default) where T : class, new() { @@ -36,18 +36,18 @@ public async IAsyncEnumerable QueryXlsxAsync(Stream stream, string? sheetN } [CreateSyncVersion] - public async IAsyncEnumerable QueryXlsxAsync(string path, bool useHeaderRow = false, + public async IAsyncEnumerable QueryExcelAsync(string path, bool useHeaderRow = false, string? sheetName = null, string startCell = "A1", OpenXmlConfiguration? configuration = null, [EnumeratorCancellation] CancellationToken cancellationToken = default) { using var stream = FileHelper.OpenSharedRead(path); - await foreach (var item in QueryXlsxAsync(stream, useHeaderRow, sheetName, startCell, configuration, cancellationToken).ConfigureAwait(false)) + await foreach (var item in QueryExcelAsync(stream, useHeaderRow, sheetName, startCell, configuration, cancellationToken).ConfigureAwait(false)) yield return item; } [CreateSyncVersion] [SuppressMessage("Reliability", "CA2007:Do not directly await a Task")] - public async IAsyncEnumerable QueryXlsxAsync(Stream stream, bool useHeaderRow = false, + public async IAsyncEnumerable QueryExcelAsync(Stream stream, bool useHeaderRow = false, string? sheetName = null, string startCell = "A1", OpenXmlConfiguration? configuration = null, [EnumeratorCancellation] CancellationToken cancellationToken = default) { @@ -69,18 +69,18 @@ public async IAsyncEnumerable QueryXlsxAsync(Stream stream, bool useHea ///
/// [CreateSyncVersion] - public async IAsyncEnumerable QueryRangeXlsxAsync(string path, bool useHeaderRow = false, + public async IAsyncEnumerable QueryExcelRangeAsync(string path, bool useHeaderRow = false, string? sheetName = null, string startCell = "A1", string endCell = "", OpenXmlConfiguration? configuration = null, [EnumeratorCancellation] CancellationToken cancellationToken = default) { using var stream = FileHelper.OpenSharedRead(path); - await foreach (var item in QueryRangeXlsxAsync(stream, useHeaderRow, sheetName, startCell, endCell, configuration, cancellationToken).ConfigureAwait(false)) + await foreach (var item in QueryExcelRangeAsync(stream, useHeaderRow, sheetName, startCell, endCell, configuration, cancellationToken).ConfigureAwait(false)) yield return item; } [CreateSyncVersion] [SuppressMessage("Reliability", "CA2007:Do not directly await a Task")] - public async IAsyncEnumerable QueryRangeXlsxAsync(Stream stream, bool useHeaderRow = false, + public async IAsyncEnumerable QueryExcelRangeAsync(Stream stream, bool useHeaderRow = false, string? sheetName = null, string startCell = "A1", string endCell = "", OpenXmlConfiguration? configuration = null, [EnumeratorCancellation] CancellationToken cancellationToken = default) { @@ -90,19 +90,19 @@ public async IAsyncEnumerable QueryRangeXlsxAsync(Stream stream, bool u } [CreateSyncVersion] - public async IAsyncEnumerable QueryRangeXlsxAsync(string path, bool useHeaderRow = false, + public async IAsyncEnumerable QueryExcelRangeAsync(string path, bool useHeaderRow = false, string? sheetName = null, int startRowIndex = 1, int startColumnIndex = 1, int? endRowIndex = null, int? endColumnIndex = null, OpenXmlConfiguration? configuration = null, [EnumeratorCancellation] CancellationToken cancellationToken = default) { using var stream = FileHelper.OpenSharedRead(path); - await foreach (var item in QueryRangeXlsxAsync(stream, useHeaderRow, sheetName, startRowIndex, startColumnIndex, endRowIndex, endColumnIndex, configuration, cancellationToken).ConfigureAwait(false)) + await foreach (var item in QueryExcelRangeAsync(stream, useHeaderRow, sheetName, startRowIndex, startColumnIndex, endRowIndex, endColumnIndex, configuration, cancellationToken).ConfigureAwait(false)) yield return item; } [CreateSyncVersion] [SuppressMessage("Reliability", "CA2007:Do not directly await a Task")] - public async IAsyncEnumerable QueryRangeXlsxAsync(Stream stream, bool useHeaderRow = false, + public async IAsyncEnumerable QueryExcelRangeAsync(Stream stream, bool useHeaderRow = false, string? sheetName = null, int startRowIndex = 1, int startColumnIndex = 1, int? endRowIndex = null, int? endColumnIndex = null, OpenXmlConfiguration? configuration = null, [EnumeratorCancellation] CancellationToken cancellationToken = default) @@ -120,19 +120,19 @@ public async IAsyncEnumerable QueryRangeXlsxAsync(Stream stream, bool u /// QueryAsDataTable is not recommended, because it'll load all data into memory. ///
[CreateSyncVersion] - public async Task QueryXlsxAsDataTableAsync(string path, bool useHeaderRow = true, + public async Task QueryExcelAsDataTableAsync(string path, bool useHeaderRow = true, string? sheetName = null, string startCell = "A1", OpenXmlConfiguration? configuration = null, CancellationToken cancellationToken = default) { using var stream = FileHelper.OpenSharedRead(path); - return await QueryXlsxAsDataTableAsync(stream, useHeaderRow, sheetName, startCell, configuration, cancellationToken).ConfigureAwait(false); + return await QueryExcelAsDataTableAsync(stream, useHeaderRow, sheetName, startCell, configuration, cancellationToken).ConfigureAwait(false); } /// /// QueryAsDataTable is not recommended, because it'll load all data into memory. /// [CreateSyncVersion] - public async Task QueryXlsxAsDataTableAsync(Stream stream, bool useHeaderRow = true, + public async Task QueryExcelAsDataTableAsync(Stream stream, bool useHeaderRow = true, string? sheetName = null, string startCell = "A1", OpenXmlConfiguration? configuration = null, CancellationToken cancellationToken = default) { @@ -248,21 +248,21 @@ public async Task> GetSheetDimensionsAsync(Stream stream, Canc } [CreateSyncVersion] - public async Task> GetXlsxColumnsAsync(string path, bool useHeaderRow = false, + public async Task> GetExcelColumnsAsync(string path, bool useHeaderRow = false, string? sheetName = null, string startCell = "A1", OpenXmlConfiguration? configuration = null, CancellationToken cancellationToken = default) { using var stream = FileHelper.OpenSharedRead(path); - return await GetXlsxColumnsAsync(stream, useHeaderRow, sheetName, startCell, configuration, cancellationToken).ConfigureAwait(false); + return await GetExcelColumnsAsync(stream, useHeaderRow, sheetName, startCell, configuration, cancellationToken).ConfigureAwait(false); } [CreateSyncVersion] - public async Task> GetXlsxColumnsAsync(Stream stream, bool useHeaderRow = false, + public async Task> GetExcelColumnsAsync(Stream stream, bool useHeaderRow = false, string? sheetName = null, string startCell = "A1", OpenXmlConfiguration? configuration = null, CancellationToken cancellationToken = default) { #pragma warning disable CA2007 // Consider calling ConfigureAwait on the awaited task - await using var enumerator = QueryXlsxAsync(stream, useHeaderRow, sheetName, startCell, configuration, cancellationToken).GetAsyncEnumerator(cancellationToken); + await using var enumerator = QueryExcelAsync(stream, useHeaderRow, sheetName, startCell, configuration, cancellationToken).GetAsyncEnumerator(cancellationToken); #pragma warning restore CA2007 // Consider calling ConfigureAwait on the awaited task _ = enumerator.ConfigureAwait(false); @@ -278,19 +278,19 @@ public async Task> GetXlsxColumnsAsync(Stream stream, bool u #region DataReader - public MiniExcelDataReader GetXlsxDataReader(string path, bool useHeaderRow = false, + public MiniExcelDataReader GetExcelDataReader(string path, bool useHeaderRow = false, string? sheetName = null, string startCell = "A1", OpenXmlConfiguration? configuration = null) { var stream = FileHelper.OpenSharedRead(path); - var values = Enumerable.Cast>(QueryXlsx(stream, useHeaderRow, sheetName, startCell, configuration)); + var values = QueryExcel(stream, useHeaderRow, sheetName, startCell, configuration).Cast>(); return MiniExcelDataReader.Create(stream, values); } - public MiniExcelDataReader GetXlsxDataReader(Stream stream, bool useHeaderRow = false, + public MiniExcelDataReader GetExcelDataReader(Stream stream, bool useHeaderRow = false, string? sheetName = null, string startCell = "A1", OpenXmlConfiguration? configuration = null) { - var values = Enumerable.Cast>(QueryXlsx(stream, useHeaderRow, sheetName, startCell, configuration)); + var values = QueryExcel(stream, useHeaderRow, sheetName, startCell, configuration).Cast>(); return MiniExcelDataReader.Create(stream, values); } @@ -299,7 +299,7 @@ public async Task GetAsyncXlsxDataReader(string path, CancellationToken cancellationToken = default) { var stream = FileHelper.OpenSharedRead(path); - var values = QueryXlsxAsync(stream, useHeaderRow, sheetName, startCell, configuration, cancellationToken); + var values = QueryExcelAsync(stream, useHeaderRow, sheetName, startCell, configuration, cancellationToken); return await MiniExcelAsyncDataReader.CreateAsync(stream, CastAsync(values, cancellationToken)).ConfigureAwait(false); } @@ -308,7 +308,7 @@ public async Task GetAsyncXlsxDataReader(Stream stream string? sheetName = null, string startCell = "A1", OpenXmlConfiguration? configuration = null, CancellationToken cancellationToken = default) { - var values = QueryXlsxAsync(stream, useHeaderRow, sheetName, startCell, configuration, cancellationToken); + var values = QueryExcelAsync(stream, useHeaderRow, sheetName, startCell, configuration, cancellationToken); return await MiniExcelAsyncDataReader.CreateAsync(stream, CastAsync(values, cancellationToken)).ConfigureAwait(false); } diff --git a/src/MiniExcel/MiniExcelTemplater.cs b/src/MiniExcel/OpenXmlTemplater.cs similarity index 93% rename from src/MiniExcel/MiniExcelTemplater.cs rename to src/MiniExcel/OpenXmlTemplater.cs index f353a3ab..a258b342 100644 --- a/src/MiniExcel/MiniExcelTemplater.cs +++ b/src/MiniExcel/OpenXmlTemplater.cs @@ -2,7 +2,7 @@ namespace MiniExcelLib; -public sealed partial class MiniExcelTemplater +public sealed partial class OpenXmlTemplater { [CreateSyncVersion] public async Task ApplyXlsxTemplateAsync(string path, string templatePath, object value, @@ -63,7 +63,7 @@ public async Task MergeSameCellsAsync(Stream stream, byte[] file, } - private OpenXmlTemplate GetOpenXmlTemplate(Stream stream, OpenXmlConfiguration? configuration) + private static OpenXmlTemplate GetOpenXmlTemplate(Stream stream, OpenXmlConfiguration? configuration) { var valueExtractor = new OpenXmlValueExtractor(); return new OpenXmlTemplate(stream, configuration, valueExtractor); diff --git a/src/MiniExcel/Providers.cs b/src/MiniExcel/Providers.cs new file mode 100644 index 00000000..ba1e0034 --- /dev/null +++ b/src/MiniExcel/Providers.cs @@ -0,0 +1,16 @@ +namespace MiniExcelLib; + +public sealed class MiniExcelImporterProvider +{ + public OpenXmlImporter GetExcelImporter() => new(); +} + +public sealed class MiniExcelExporterProvider +{ + public OpenXmlExporter GetExcelExporter() => new(); +} + +public sealed class MiniExcelTemplaterProvider +{ + public OpenXmlTemplater GetExcelTemplater() => new(); +} diff --git a/tests/MiniExcel.Csv.Tests/AsyncIssueTests.cs b/tests/MiniExcel.Csv.Tests/AsyncIssueTests.cs index f7618feb..c9b0266f 100644 --- a/tests/MiniExcel.Csv.Tests/AsyncIssueTests.cs +++ b/tests/MiniExcel.Csv.Tests/AsyncIssueTests.cs @@ -2,9 +2,11 @@ public class AsyncIssueTests { - private readonly MiniExcelExporter _exporter = MiniExcel.GetExporter(); - private readonly MiniExcelImporter _importer = MiniExcel.GetImporter(); + private readonly CsvExporter _csvExporter = MiniExcel.GetExporterProvider().GetCsvExporter(); + private readonly CsvImporter _csvImporter = MiniExcel.GetImporterProvider().GetCsvImporter(); + private readonly OpenXmlExporter _openXmlExporter = MiniExcel.GetExporterProvider().GetExcelExporter(); + private readonly OpenXmlImporter _openXmlImporter = MiniExcel.GetImporterProvider().GetExcelImporter(); /// /// Csv SaveAs by datareader with encoding default show messy code #253 /// @@ -15,7 +17,7 @@ public async Task Issue253() var value = new[] { new { col1 = "世界你好" } }; using var path = AutoDeletingPath.Create(ExcelType.Csv); - await _exporter.ExportCsvAsync(path.ToString(), value); + await _csvExporter.ExportCsvAsync(path.ToString(), value); const string expected = """ col1 @@ -36,7 +38,7 @@ public async Task Issue253() StreamWriterFunc = stream => new StreamWriter(stream, Encoding.GetEncoding("gb2312")) }; - await _exporter.ExportCsvAsync(path.ToString(), value, configuration: config); + await _csvExporter.ExportCsvAsync(path.ToString(), value, configuration: config); const string expected = """ col1 @@ -52,7 +54,7 @@ public async Task Issue253() { var value = await cn.ExecuteReaderAsync("select '世界你好' col1"); using var path = AutoDeletingPath.Create(ExcelType.Csv); - await _exporter.ExportCsvAsync(path.ToString(), value); + await _csvExporter.ExportCsvAsync(path.ToString(), value); const string expected = """ col1 @@ -74,7 +76,7 @@ public async Task Issue251() var reader = await cn.ExecuteReaderAsync(@"select '""<>+-*//}{\\n' a,1234567890 b union all select 'Hello World',-1234567890"); using var path = AutoDeletingPath.Create(ExcelType.Csv); - var rowsWritten = await _exporter.ExportCsvAsync(path.ToString(), reader); + var rowsWritten = await _csvExporter.ExportCsvAsync(path.ToString(), reader); Assert.Single(rowsWritten); Assert.Equal(2, rowsWritten[0]); @@ -125,7 +127,7 @@ public async Task Issue89() await writer.FlushAsync(); stream.Position = 0; - var q = _importer.QueryCsvAsync(stream).ToBlockingEnumerable(); + var q = _csvImporter.QueryCsvAsync(stream).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal(Issue89VO.WorkState.OnDuty, rows[0].State); @@ -133,11 +135,11 @@ public async Task Issue89() Assert.Equal(Issue89VO.WorkState.Leave, rows[2].State); var outputPath = PathHelper.GetTempPath("xlsx"); - var rowsWritten = await _exporter.ExportXlsxAsync(outputPath, rows); + var rowsWritten = await _openXmlExporter.ExportExcelAsync(outputPath, rows); Assert.Single(rowsWritten); Assert.Equal(3, rowsWritten[0]); - var q2 = _importer.QueryXlsxAsync(outputPath).ToBlockingEnumerable(); + var q2 = _openXmlImporter.QueryExcelAsync(outputPath).ToBlockingEnumerable(); var rows2 = q2.ToList(); Assert.Equal(Issue89VO.WorkState.OnDuty, rows2[0].State); Assert.Equal(Issue89VO.WorkState.Fired, rows2[1].State); @@ -147,18 +149,18 @@ public async Task Issue89() //xlsx { var path = PathHelper.GetFile("xlsx/TestIssue89.xlsx"); - var q = _importer.QueryXlsxAsync(path).ToBlockingEnumerable(); + var q = _openXmlImporter.QueryExcelAsync(path).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal(Issue89VO.WorkState.OnDuty, rows[0].State); Assert.Equal(Issue89VO.WorkState.Fired, rows[1].State); Assert.Equal(Issue89VO.WorkState.Leave, rows[2].State); var outputPath = PathHelper.GetTempPath(); - var rowsWritten = await _exporter.ExportXlsxAsync(outputPath, rows); + var rowsWritten = await _openXmlExporter.ExportExcelAsync(outputPath, rows); Assert.Single(rowsWritten); Assert.Equal(3, rowsWritten[0]); - var q1 = _importer.QueryXlsxAsync(outputPath).ToBlockingEnumerable(); + var q1 = _openXmlImporter.QueryExcelAsync(outputPath).ToBlockingEnumerable(); var rows2 = q1.ToList(); Assert.Equal(Issue89VO.WorkState.OnDuty, rows2[0].State); Assert.Equal(Issue89VO.WorkState.Fired, rows2[1].State); @@ -184,10 +186,10 @@ public async Task Issue142() { using var file = AutoDeletingPath.Create(); var path = file.ToString(); - await _exporter.ExportXlsxAsync(path, new[] { new Issue142VO { MyProperty1 = "MyProperty1", MyProperty2 = "MyProperty2", MyProperty3 = "MyProperty3", MyProperty4 = "MyProperty4", MyProperty5 = "MyProperty5", MyProperty6 = "MyProperty6", MyProperty7 = "MyProperty7" } }); + await _openXmlExporter.ExportExcelAsync(path, new[] { new Issue142VO { MyProperty1 = "MyProperty1", MyProperty2 = "MyProperty2", MyProperty3 = "MyProperty3", MyProperty4 = "MyProperty4", MyProperty5 = "MyProperty5", MyProperty6 = "MyProperty6", MyProperty7 = "MyProperty7" } }); { - var q = _importer.QueryXlsxAsync(path).ToBlockingEnumerable(); + var q = _openXmlImporter.QueryExcelAsync(path).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal("MyProperty4", rows[0].A); Assert.Equal("CustomColumnName", rows[0].B); //note @@ -207,7 +209,7 @@ public async Task Issue142() } { - var q = _importer.QueryXlsxAsync(path).ToBlockingEnumerable(); + var q = _openXmlImporter.QueryExcelAsync(path).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal("MyProperty4", rows[0].MyProperty4); @@ -223,7 +225,7 @@ public async Task Issue142() { using var file = AutoDeletingPath.Create(ExcelType.Csv); var path = file.ToString(); - await _exporter.ExportCsvAsync(path, new[] { new Issue142VO { MyProperty1 = "MyProperty1", MyProperty2 = "MyProperty2", MyProperty3 = "MyProperty3", MyProperty4 = "MyProperty4", MyProperty5 = "MyProperty5", MyProperty6 = "MyProperty6", MyProperty7 = "MyProperty7" } }); + await _csvExporter.ExportCsvAsync(path, new[] { new Issue142VO { MyProperty1 = "MyProperty1", MyProperty2 = "MyProperty2", MyProperty3 = "MyProperty3", MyProperty4 = "MyProperty4", MyProperty5 = "MyProperty5", MyProperty6 = "MyProperty6", MyProperty7 = "MyProperty7" } }); const string expected = """ MyProperty4,CustomColumnName,MyProperty5,MyProperty2,MyProperty6,,MyProperty3 @@ -233,7 +235,7 @@ public async Task Issue142() Assert.Equal(expected, await File.ReadAllTextAsync(path)); { - var q = _importer.QueryCsvAsync(path).ToBlockingEnumerable(); + var q = _csvImporter.QueryCsvAsync(path).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal("MyProperty4", rows[0].MyProperty4); @@ -249,7 +251,7 @@ public async Task Issue142() { using var path = AutoDeletingPath.Create(); Issue142VoDuplicateColumnName[] input = [new() { MyProperty1 = 0, MyProperty2 = 0, MyProperty3 = 0, MyProperty4 = 0 }]; - Assert.Throws(() => _exporter.ExportXlsx(path.ToString(), input)); + Assert.Throws(() => _openXmlExporter.ExportExcel(path.ToString(), input)); } } diff --git a/tests/MiniExcel.Csv.Tests/IssueTests.cs b/tests/MiniExcel.Csv.Tests/IssueTests.cs index ab09736b..0643c37e 100644 --- a/tests/MiniExcel.Csv.Tests/IssueTests.cs +++ b/tests/MiniExcel.Csv.Tests/IssueTests.cs @@ -2,8 +2,11 @@ public class IssueTests { - private readonly MiniExcelImporter _importer = MiniExcel.GetImporter(); - private readonly MiniExcelExporter _exporter = MiniExcel.GetExporter(); + private readonly CsvExporter _csvExporter = MiniExcel.GetExporterProvider().GetCsvExporter(); + private readonly CsvImporter _csvImporter = MiniExcel.GetImporterProvider().GetCsvImporter(); + + private readonly OpenXmlExporter _openXmlExporter = MiniExcel.GetExporterProvider().GetExcelExporter(); + private readonly OpenXmlImporter _openXmlImporter = MiniExcel.GetImporterProvider().GetExcelImporter(); [Fact] public void TestPR10() @@ -15,7 +18,7 @@ public void TestPR10() .Select(s => Regex.Replace(s.Replace("\"\"", "\""), "^\"|\"$", "")) .ToArray() }; - var rows = _importer.QueryCsv(path, configuration: config).ToList(); + var rows = _csvImporter.QueryCsv(path, configuration: config).ToList(); } /// @@ -33,7 +36,7 @@ public void TestIssueI4X92G() new { ID = 1, Name = "Jack", InDate = new DateTime(2021,01,03)}, new { ID = 2, Name = "Henry", InDate = new DateTime(2020,05,03)} }; - _exporter.ExportCsv(path, value); + _csvExporter.ExportCsv(path, value); var content = File.ReadAllText(path); Assert.Equal( """ @@ -46,7 +49,7 @@ public void TestIssueI4X92G() } { var value = new { ID = 3, Name = "Mike", InDate = new DateTime(2021, 04, 23) }; - var rowsWritten = _exporter.AppendToCsv(path, value); + var rowsWritten = _csvExporter.AppendToCsv(path, value); Assert.Equal(1, rowsWritten); var content = File.ReadAllText(path); @@ -66,7 +69,7 @@ public void TestIssueI4X92G() new { ID=4,Name ="Frank",InDate=new DateTime(2021,06,07)}, new { ID=5,Name ="Gloria",InDate=new DateTime(2022,05,03)}, }; - var rowsWritten = _exporter.AppendToCsv(path, value); + var rowsWritten = _csvExporter.AppendToCsv(path, value); Assert.Equal(2, rowsWritten); var content = File.ReadAllText(path); @@ -101,7 +104,7 @@ public void TestIssueI57WMM() using var stream = new MemoryStream(); var config = new CsvConfiguration { StreamWriterFunc = x => new StreamWriter(x, Encoding.Default, leaveOpen: true) }; - _exporter.ExportCsv(stream, sheets, configuration: config); + _csvExporter.ExportCsv(stream, sheets, configuration: config); stream.Seek(0, SeekOrigin.Begin); // convert stream to string @@ -117,7 +120,7 @@ public async Task TestIssue338() Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); { var path = PathHelper.GetFile("csv/TestIssue338.csv"); - var row = _importer.QueryCsvAsync(path).ToBlockingEnumerable().FirstOrDefault(); + var row = _csvImporter.QueryCsvAsync(path).ToBlockingEnumerable().FirstOrDefault(); Assert.Equal("���IJ�������", row!.A); } { @@ -126,7 +129,7 @@ public async Task TestIssue338() { StreamReaderFunc = stream => new StreamReader(stream, Encoding.GetEncoding("gb2312")) }; - var row = _importer.QueryCsvAsync(path, configuration: config).ToBlockingEnumerable().FirstOrDefault(); + var row = _csvImporter.QueryCsvAsync(path, configuration: config).ToBlockingEnumerable().FirstOrDefault(); Assert.Equal("中文测试内容", row!.A); } { @@ -137,7 +140,7 @@ public async Task TestIssue338() }; await using (var stream = new FileStream(path, FileMode.Open, FileAccess.Read)) { - var row = _importer.QueryCsvAsync(stream, configuration: config).ToBlockingEnumerable().FirstOrDefault(); + var row = _csvImporter.QueryCsvAsync(stream, configuration: config).ToBlockingEnumerable().FirstOrDefault(); Assert.Equal("中文测试内容", row!.A); } } @@ -153,7 +156,7 @@ public void TestIssueI4WDA9() value.Rows.Add("\"Jack\""); } - _exporter.ExportCsv(path.ToString(), value); + _csvExporter.ExportCsv(path.ToString(), value); Assert.Equal("\"\"\"name\"\"\"\r\n\"\"\"Jack\"\"\"\r\n", File.ReadAllText(path.ToString())); } @@ -172,7 +175,7 @@ public void TestIssue316() { Culture = new CultureInfo("fr-FR"), }; - _exporter.ExportXlsx(path, value, configuration: config); + _openXmlExporter.ExportExcel(path, value, configuration: config); //Datetime error Assert.Throws(() => @@ -181,11 +184,11 @@ public void TestIssue316() { Culture = new CultureInfo("en-US"), }; - _ = _importer.QueryXlsx(path, configuration: conf).ToList(); + _ = _openXmlImporter.QueryExcel(path, configuration: conf).ToList(); }); // dynamic - var rows = _importer.QueryXlsx(path, true).ToList(); + var rows = _openXmlImporter.QueryExcel(path, true).ToList(); Assert.Equal("123456,789", rows[0].Amount); Assert.Equal("31/01/2018 00:00:00", rows[0].CreateTime); } @@ -203,11 +206,11 @@ public void TestIssue316() { Culture = new CultureInfo("fr-FR"), }; - _exporter.ExportXlsx(path, value, configuration: config); + _openXmlExporter.ExportExcel(path, value, configuration: config); } { - var rows = _importer.QueryXlsx(path, true).ToList(); + var rows = _openXmlImporter.QueryExcel(path, true).ToList(); Assert.Equal("123456,789", rows[0].Amount); Assert.Equal("12/05/2018 00:00:00", rows[0].CreateTime); } @@ -217,7 +220,7 @@ public void TestIssue316() { Culture = new CultureInfo("en-US"), }; - var rows = _importer.QueryXlsx(path, configuration: config).ToList(); + var rows = _openXmlImporter.QueryExcel(path, configuration: config).ToList(); Assert.Equal("2018-12-05 00:00:00", rows[0].CreateTime.ToString("yyyy-MM-dd HH:mm:ss")); Assert.Equal(123456789m, rows[0].Amount); @@ -228,7 +231,7 @@ public void TestIssue316() { Culture = new CultureInfo("fr-FR"), }; - var rows = _importer.QueryXlsx(path, configuration: config).ToList(); + var rows = _openXmlImporter.QueryExcel(path, configuration: config).ToList(); Assert.Equal("2018-05-12 00:00:00", rows[0].CreateTime.ToString("yyyy-MM-dd HH:mm:ss")); Assert.Equal(123456.789m, rows[0].Amount); @@ -248,7 +251,7 @@ public void TestIssue316() { Culture = new CultureInfo("fr-FR"), }; - _exporter.ExportCsv(path, value, configuration: config); + _csvExporter.ExportCsv(path, value, configuration: config); //Datetime error Assert.Throws(() => @@ -257,11 +260,11 @@ public void TestIssue316() { Culture = new CultureInfo("en-US") }; - _ = _importer.QueryCsv(path, configuration: conf).ToList(); + _ = _csvImporter.QueryCsv(path, configuration: conf).ToList(); }); // dynamic - var rows = _importer.QueryCsv(path, true).ToList(); + var rows = _csvImporter.QueryCsv(path, true).ToList(); Assert.Equal("123456,789", rows[0].Amount); Assert.Equal("31/01/2018 00:00:00", rows[0].CreateTime); } @@ -280,11 +283,11 @@ public void TestIssue316() { Culture = new CultureInfo("fr-FR"), }; - _exporter.ExportCsv(path, value, configuration: config); + _csvExporter.ExportCsv(path, value, configuration: config); } { - var rows = _importer.QueryCsv(path, true).ToList(); + var rows = _csvImporter.QueryCsv(path, true).ToList(); Assert.Equal("123456,789", rows[0].Amount); Assert.Equal("12/05/2018 00:00:00", rows[0].CreateTime); } @@ -294,7 +297,7 @@ public void TestIssue316() { Culture = new CultureInfo("en-US"), }; - var rows = _importer.QueryCsv(path, configuration: config).ToList(); + var rows = _csvImporter.QueryCsv(path, configuration: config).ToList(); Assert.Equal("2018-12-05 00:00:00", rows[0].CreateTime.ToString("yyyy-MM-dd HH:mm:ss")); Assert.Equal(123456789m, rows[0].Amount); @@ -305,7 +308,7 @@ public void TestIssue316() { Culture = new CultureInfo("fr-FR"), }; - var rows = _importer.QueryCsv(path, configuration: config).ToList(); + var rows = _csvImporter.QueryCsv(path, configuration: config).ToList(); Assert.Equal("2018-05-12 00:00:00", rows[0].CreateTime.ToString("yyyy-MM-dd HH:mm:ss")); Assert.Equal(123456.789m, rows[0].Amount); @@ -322,7 +325,7 @@ public void TestIssue298() { var path = PathHelper.GetFile("/csv/TestIssue298.csv"); #pragma warning disable CS0618 // Type or member is obsolete - var dt = _importer.QueryCsvAsDataTable(path); + var dt = _csvImporter.QueryCsvAsDataTable(path); #pragma warning restore CS0618 Assert.Equal(["ID", "Name", "Age"], dt.Columns.Cast().Select(x => x.ColumnName)); } @@ -335,7 +338,7 @@ public void TestIssue292() { var xlsxPath = PathHelper.GetFile("/xlsx/TestIssue292.xlsx"); using var csvPath = AutoDeletingPath.Create(ExcelType.Csv); - _exporter.ConvertXlsxToCsv(xlsxPath, csvPath.ToString(), false); + _csvExporter.ConvertXlsxToCsv(xlsxPath, csvPath.ToString(), false); var actualCotent = File.ReadAllText(csvPath.ToString()); Assert.Equal( @@ -351,9 +354,9 @@ public void TestIssue292() { var csvPath = PathHelper.GetFile("/csv/TestIssue292.csv"); using var path = AutoDeletingPath.Create(); - _exporter.ConvertCsvToXlsx(csvPath, path.ToString()); + _csvExporter.ConvertCsvToXlsx(csvPath, path.ToString()); - var rows = _importer.QueryXlsx(path.ToString()).ToList(); + var rows = _openXmlImporter.QueryExcel(path.ToString()).ToList(); Assert.Equal(3, rows.Count); Assert.Equal("Name", rows[0].A); Assert.Equal("Age", rows[0].B); @@ -375,8 +378,8 @@ public void TestIssue293() var path = PathHelper.GetFile("/csv/Test5x2.csv"); using var tempPath = AutoDeletingPath.Create(); using var csv = File.OpenRead(path); - var value = _importer.QueryCsv(csv, useHeaderRow: false); - _exporter.ExportXlsx(tempPath.ToString(), value, printHeader: false); + var value = _csvImporter.QueryCsv(csv, useHeaderRow: false); + _openXmlExporter.ExportExcel(tempPath.ToString(), value, printHeader: false); } /// @@ -387,7 +390,7 @@ public void TestIssue279() { var path = PathHelper.GetFile("/csv/TestHeader.csv"); #pragma warning disable CS0618 // Type or member is obsolete - using var dt = _importer.QueryCsvAsDataTable(path); + using var dt = _csvImporter.QueryCsvAsDataTable(path); #pragma warning restore CS0618 Assert.Equal("A1", dt.Rows[0]["Column1"]); Assert.Equal("A2", dt.Rows[1]["Column1"]); @@ -404,8 +407,8 @@ public void TestIssue261() var csvPath = PathHelper.GetFile("csv/TestCsvToXlsx.csv"); using var path = AutoDeletingPath.Create(); - _exporter.ConvertCsvToXlsx(csvPath, path.FilePath); - var rows = _importer.QueryXlsx(path.ToString()).ToList(); + _csvExporter.ConvertCsvToXlsx(csvPath, path.FilePath); + var rows = _openXmlImporter.QueryExcel(path.ToString()).ToList(); Assert.Equal("Name", rows[0].A); Assert.Equal("Jack", rows[1].A); @@ -428,7 +431,7 @@ public void Issue253() { var value = new[] { new { col1 = "世界你好" } }; using var path = AutoDeletingPath.Create(ExcelType.Csv); - _exporter.ExportCsv(path.ToString(), value); + _csvExporter.ExportCsv(path.ToString(), value); const string expected = """ col1 @@ -446,7 +449,7 @@ public void Issue253() { StreamWriterFunc = stream => new StreamWriter(stream, Encoding.GetEncoding("gb2312")) }; - _exporter.ExportCsv(path.ToString(), value, configuration: config); + _csvExporter.ExportCsv(path.ToString(), value, configuration: config); const string expected = """ col1 @@ -461,7 +464,7 @@ public void Issue253() { var value = cn.ExecuteReader("select '世界你好' col1"); using var path = AutoDeletingPath.Create(ExcelType.Csv); - _exporter.ExportCsv(path.ToString(), value); + _csvExporter.ExportCsv(path.ToString(), value); const string expected = """ col1 @@ -481,7 +484,7 @@ public void Issue251() using var cn = Db.GetConnection(); using var reader = cn.ExecuteReader(@"select '""<>+-*//}{\\n' a,1234567890 b union all select 'Hello World',-1234567890"); using var path = AutoDeletingPath.Create(ExcelType.Csv); - _exporter.ExportCsv(path.ToString(), reader); + _csvExporter.ExportCsv(path.ToString(), reader); const string expected = """" a,b @@ -528,15 +531,15 @@ public void Issue89() writer.Write(text); writer.Flush(); stream.Position = 0; - var rows = _importer.QueryCsv(stream, useHeaderRow: true).ToList(); + var rows = _csvImporter.QueryCsv(stream, useHeaderRow: true).ToList(); Assert.Equal(nameof(Issue89VO.WorkState.OnDuty), rows[0].State); Assert.Equal(nameof(Issue89VO.WorkState.Fired), rows[1].State); Assert.Equal(nameof(Issue89VO.WorkState.Leave), rows[2].State); using var path = AutoDeletingPath.Create(ExcelType.Csv); - _exporter.ExportCsv(path.ToString(), rows); - var rows2 = _importer.QueryCsv(path.ToString()).ToList(); + _csvExporter.ExportCsv(path.ToString(), rows); + var rows2 = _csvImporter.QueryCsv(path.ToString()).ToList(); Assert.Equal(Issue89VO.WorkState.OnDuty, rows2[0].State); Assert.Equal(Issue89VO.WorkState.Fired, rows2[1].State); @@ -546,15 +549,15 @@ public void Issue89() //xlsx { var path = PathHelper.GetFile("xlsx/TestIssue89.xlsx"); - var rows = _importer.QueryXlsx(path).ToList(); + var rows = _openXmlImporter.QueryExcel(path).ToList(); Assert.Equal(Issue89VO.WorkState.OnDuty, rows[0].State); Assert.Equal(Issue89VO.WorkState.Fired, rows[1].State); Assert.Equal(Issue89VO.WorkState.Leave, rows[2].State); using var xlsxPath = AutoDeletingPath.Create(); - _exporter.ExportXlsx(xlsxPath.ToString(), rows); - var rows2 = _importer.QueryXlsx(xlsxPath.ToString()).ToList(); + _openXmlExporter.ExportExcel(xlsxPath.ToString(), rows); + var rows2 = _openXmlImporter.QueryExcel(xlsxPath.ToString()).ToList(); Assert.Equal(Issue89VO.WorkState.OnDuty, rows2[0].State); Assert.Equal(Issue89VO.WorkState.Fired, rows2[1].State); @@ -605,12 +608,12 @@ public void Issue142() MyProperty7 = "MyProperty7" } ]; - var rowsWritten = _exporter.ExportXlsx(path, values); + var rowsWritten = _openXmlExporter.ExportExcel(path, values); Assert.Single(rowsWritten); Assert.Equal(1, rowsWritten[0]); { - var rows = _importer.QueryXlsx(path).ToList(); + var rows = _openXmlImporter.QueryExcel(path).ToList(); Assert.Equal("MyProperty4", rows[0].A); Assert.Equal("CustomColumnName", rows[0].B); @@ -630,7 +633,7 @@ public void Issue142() } { - var rows = _importer.QueryXlsx(path).ToList(); + var rows = _openXmlImporter.QueryExcel(path).ToList(); Assert.Equal("MyProperty4", rows[0].MyProperty4); Assert.Equal("MyProperty1", rows[0].MyProperty1); @@ -654,7 +657,7 @@ public void Issue142() MyProperty7 = "MyProperty7" } ]; - var rowsWritten = _exporter.ExportCsv(path, values); + var rowsWritten = _csvExporter.ExportCsv(path, values); Assert.Single(rowsWritten); Assert.Equal(1, rowsWritten[0]); @@ -668,7 +671,7 @@ public void Issue142() Assert.Equal(expected, File.ReadAllText(path)); { - var rows = _importer.QueryCsv(path).ToList(); + var rows = _csvImporter.QueryCsv(path).ToList(); Assert.Equal("MyProperty4", rows[0].MyProperty4); Assert.Equal("MyProperty1", rows[0].MyProperty1); @@ -686,7 +689,7 @@ public void Issue142() [ new() { MyProperty1 = 0, MyProperty2 = 0, MyProperty3 = 0, MyProperty4 = 0 } ]; - Assert.Throws(() => _exporter.ExportCsv(path.ToString(), input)); + Assert.Throws(() => _csvExporter.ExportCsv(path.ToString(), input)); } } @@ -696,13 +699,13 @@ public void Issue142_Query() const string path = "../../../../../samples/xlsx/TestIssue142.xlsx"; const string csvPath = "../../../../../samples/csv/TestIssue142.csv"; { - var rows = _importer.QueryXlsx(path).ToList(); + var rows = _openXmlImporter.QueryExcel(path).ToList(); Assert.Equal(0, rows[0].MyProperty1); } - Assert.Throws(() => _importer.QueryXlsx(path).ToList()); + Assert.Throws(() => _openXmlImporter.QueryExcel(path).ToList()); - var rowsXlsx = _importer.QueryXlsx(path).ToList(); + var rowsXlsx = _openXmlImporter.QueryExcel(path).ToList(); Assert.Equal("CustomColumnName", rowsXlsx[0].MyProperty1); Assert.Null(rowsXlsx[0].MyProperty7); Assert.Equal("MyProperty2", rowsXlsx[0].MyProperty2); @@ -711,7 +714,7 @@ public void Issue142_Query() Assert.Equal("MyProperty102", rowsXlsx[0].MyProperty5); Assert.Equal("MyProperty6", rowsXlsx[0].MyProperty6); - var rowsCsv = _importer.QueryCsv(csvPath).ToList(); + var rowsCsv = _csvImporter.QueryCsv(csvPath).ToList(); Assert.Equal("CustomColumnName", rowsCsv[0].MyProperty1); Assert.Null(rowsCsv[0].MyProperty7); Assert.Equal("MyProperty2", rowsCsv[0].MyProperty2); @@ -766,11 +769,11 @@ public void Issue507_1() // create using (var stream = File.Create(path)) { - _exporter.ExportCsv(stream, values, configuration: config); + _csvExporter.ExportCsv(stream, values, configuration: config); } // read - var getRowsInfo = _importer.QueryCsv(path, configuration: config).ToArray(); + var getRowsInfo = _csvImporter.QueryCsv(path, configuration: config).ToArray(); Assert.Equal(values.Length, getRowsInfo.Length); @@ -819,11 +822,11 @@ public void Issue507_2() // create using (var stream = File.Create(path)) { - _exporter.ExportCsv(stream, values, true, config); + _csvExporter.ExportCsv(stream, values, true, config); } // read - var getRowsInfo = _importer.QueryCsv(path, configuration: config).ToArray(); + var getRowsInfo = _csvImporter.QueryCsv(path, configuration: config).ToArray(); Assert.Equal(values.Length, getRowsInfo.Length); File.Delete(path); @@ -845,7 +848,7 @@ public void Issue507_3_MismatchedQuoteCsv() using var stream = new MemoryStream(Encoding.UTF8.GetBytes("A,B,C\n\"r1a: no end quote,r1b,r1c")); // read - var getRowsInfo = _importer.QueryCsv(stream, configuration: config).ToArray(); + var getRowsInfo = _csvImporter.QueryCsv(stream, configuration: config).ToArray(); Assert.Equal(2, getRowsInfo.Length); } diff --git a/tests/MiniExcel.Csv.Tests/MiniExcel.Csv.Tests.csproj b/tests/MiniExcel.Csv.Tests/MiniExcel.Csv.Tests.csproj index c698b4c4..3c2fb510 100644 --- a/tests/MiniExcel.Csv.Tests/MiniExcel.Csv.Tests.csproj +++ b/tests/MiniExcel.Csv.Tests/MiniExcel.Csv.Tests.csproj @@ -30,7 +30,6 @@ - diff --git a/tests/MiniExcel.Csv.Tests/MiniExcelCsvAsycTests.cs b/tests/MiniExcel.Csv.Tests/MiniExcelCsvAsycTests.cs index e66d4daa..17730e01 100644 --- a/tests/MiniExcel.Csv.Tests/MiniExcelCsvAsycTests.cs +++ b/tests/MiniExcel.Csv.Tests/MiniExcelCsvAsycTests.cs @@ -2,8 +2,8 @@ public class MiniExcelCsvAsycTests { - private readonly MiniExcelImporter _importer = MiniExcel.GetImporter(); - private readonly MiniExcelExporter _exporter = MiniExcel.GetExporter(); + private readonly CsvExporter _exporter = MiniExcel.GetExporterProvider().GetCsvExporter(); + private readonly CsvImporter _importer = MiniExcel.GetImporterProvider().GetCsvImporter(); [Fact] public async Task Gb2312_Encoding_Read_Test() diff --git a/tests/MiniExcel.Csv.Tests/MiniExcelCsvTests.cs b/tests/MiniExcel.Csv.Tests/MiniExcelCsvTests.cs index bc5b00a0..16d50a3e 100644 --- a/tests/MiniExcel.Csv.Tests/MiniExcelCsvTests.cs +++ b/tests/MiniExcel.Csv.Tests/MiniExcelCsvTests.cs @@ -2,8 +2,8 @@ public class MiniExcelCsvTests { - private readonly MiniExcelImporter _importer = MiniExcel.GetImporter(); - private readonly MiniExcelExporter _exporter = MiniExcel.GetExporter(); + private readonly CsvExporter _exporter = MiniExcel.GetExporterProvider().GetCsvExporter(); + private readonly CsvImporter _importer = MiniExcel.GetImporterProvider().GetCsvImporter(); [Fact] public void gb2312_Encoding_Read_Test() @@ -495,7 +495,7 @@ private static string MiniExcelGenerateCsv(string value) using (var stream = File.Create(path)) { IEnumerable records = [new { v1 = value, v2 = value }]; - var rowsWritten = MiniExcel.GetExporter().ExportCsv(stream, records); + var rowsWritten = MiniExcel.GetExporterProvider().GetCsvExporter().ExportCsv(stream, records); Assert.Equal(1, rowsWritten[0]); } diff --git a/tests/MiniExcel.Tests/GlobalUsings.cs b/tests/MiniExcel.Tests/GlobalUsings.cs deleted file mode 100644 index 08979c70..00000000 --- a/tests/MiniExcel.Tests/GlobalUsings.cs +++ /dev/null @@ -1,17 +0,0 @@ -// Global using directives - -global using System.Data; -global using System.Data.SQLite; -global using System.Diagnostics; -global using System.Globalization; -global using System.IO.Compression; -global using System.Security.AccessControl; -global using System.Security.Principal; -global using System.Text; -global using Dapper; -global using MiniExcelLib; -global using MiniExcelLib.OpenXml; -global using MiniExcelLib.Tests.Utils; -global using OfficeOpenXml; -global using Xunit; -global using Xunit.Abstractions; \ No newline at end of file diff --git a/tests/MiniExcel.Tests/MiniExcel.Tests.csproj b/tests/MiniExcel.Tests/MiniExcel.Tests.csproj index 23524f27..48e4964b 100644 --- a/tests/MiniExcel.Tests/MiniExcel.Tests.csproj +++ b/tests/MiniExcel.Tests/MiniExcel.Tests.csproj @@ -33,6 +33,23 @@ + + + + + + + + + + + + + + + + + miniexcel.snk diff --git a/tests/MiniExcel.Tests/MiniExcelAutoAdjustWidthTests.cs b/tests/MiniExcel.Tests/MiniExcelAutoAdjustWidthTests.cs index 369f9b62..7e92fde0 100644 --- a/tests/MiniExcel.Tests/MiniExcelAutoAdjustWidthTests.cs +++ b/tests/MiniExcel.Tests/MiniExcelAutoAdjustWidthTests.cs @@ -7,7 +7,7 @@ namespace MiniExcelLib.Tests; public class MiniExcelAutoAdjustWidthTests { - private readonly MiniExcelExporter _exporter = MiniExcel.GetExporter(); + private readonly OpenXmlExporter _exporter = MiniExcel.GetExporterProvider().GetExcelExporter(); [Fact] public async Task AutoAdjustWidthThrowsExceptionWithoutFastMode_Async() @@ -15,7 +15,7 @@ public async Task AutoAdjustWidthThrowsExceptionWithoutFastMode_Async() using var file = AutoDeletingPath.Create(); var path = file.ToString(); - await Assert.ThrowsAsync(() => _exporter.ExportXlsxAsync(path, AutoAdjustTestParameters.GetDictionaryTestData(), configuration: new OpenXmlConfiguration + await Assert.ThrowsAsync(() => _exporter.ExportExcelAsync(path, AutoAdjustTestParameters.GetDictionaryTestData(), configuration: new OpenXmlConfiguration { EnableAutoWidth = true, })); @@ -27,7 +27,7 @@ public void AutoAdjustWidthThrowsExceptionWithoutFastMode() using var file = AutoDeletingPath.Create(); var path = file.ToString(); - Assert.Throws(() => _exporter.ExportXlsx(path, AutoAdjustTestParameters.GetDictionaryTestData(), configuration: new OpenXmlConfiguration + Assert.Throws(() => _exporter.ExportExcel(path, AutoAdjustTestParameters.GetDictionaryTestData(), configuration: new OpenXmlConfiguration { EnableAutoWidth = true, })); @@ -40,7 +40,7 @@ public async Task AutoAdjustWidthEnumerable_Async() var path = file.ToString(); var configuration = AutoAdjustTestParameters.GetConfiguration(); - await _exporter.ExportXlsxAsync(path, AutoAdjustTestParameters.GetDictionaryTestData(), configuration: configuration); + await _exporter.ExportExcelAsync(path, AutoAdjustTestParameters.GetDictionaryTestData(), configuration: configuration); AssertExpectedWidth(path, configuration); } @@ -52,7 +52,7 @@ public void AutoAdjustWidthEnumerable() var path = file.ToString(); var configuration = AutoAdjustTestParameters.GetConfiguration(); - _exporter.ExportXlsx(path, AutoAdjustTestParameters.GetDictionaryTestData(), configuration: configuration); + _exporter.ExportExcel(path, AutoAdjustTestParameters.GetDictionaryTestData(), configuration: configuration); AssertExpectedWidth(path, configuration); } @@ -70,7 +70,7 @@ public async Task AutoAdjustWidthDataReader_Async() await using var command = new SQLiteCommand(Db.GenerateDummyQuery(AutoAdjustTestParameters.GetDictionaryTestData()), connection); connection.Open(); await using var reader = command.ExecuteReader(); - await _exporter.ExportXlsxAsync(path, reader, configuration: configuration); + await _exporter.ExportExcelAsync(path, reader, configuration: configuration); } AssertExpectedWidth(path, configuration); @@ -89,7 +89,7 @@ public void AutoAdjustWidthDataReader() using var command = new SQLiteCommand(Db.GenerateDummyQuery(AutoAdjustTestParameters.GetDictionaryTestData()), connection); connection.Open(); using var reader = command.ExecuteReader(); - _exporter.ExportXlsx(path, reader, configuration: configuration); + _exporter.ExportExcel(path, reader, configuration: configuration); } AssertExpectedWidth(path, configuration); @@ -114,7 +114,7 @@ public async Task AutoAdjustWidthDataTable_Async() } var configuration = AutoAdjustTestParameters.GetConfiguration(); - await _exporter.ExportXlsxAsync(path, table, configuration: configuration); + await _exporter.ExportExcelAsync(path, table, configuration: configuration); AssertExpectedWidth(path, configuration); } @@ -137,7 +137,7 @@ public void AutoAdjustWidthDataTable() } var configuration = AutoAdjustTestParameters.GetConfiguration(); - _exporter.ExportXlsx(path, table, configuration: configuration); + _exporter.ExportExcel(path, table, configuration: configuration); AssertExpectedWidth(path, configuration); } diff --git a/tests/MiniExcel.Tests/MiniExcelIssueAsyncTests.cs b/tests/MiniExcel.Tests/MiniExcelIssueAsyncTests.cs index 6af8ce90..bed14119 100644 --- a/tests/MiniExcel.Tests/MiniExcelIssueAsyncTests.cs +++ b/tests/MiniExcel.Tests/MiniExcelIssueAsyncTests.cs @@ -8,9 +8,9 @@ public class MiniExcelIssueAsyncTests(ITestOutputHelper output) { private readonly ITestOutputHelper _output = output; - private readonly MiniExcelImporter _importer = MiniExcel.GetImporter(); - private readonly MiniExcelExporter _exporter = MiniExcel.GetExporter(); - private readonly MiniExcelTemplater _templater = MiniExcel.GetTemplater(); + private readonly OpenXmlImporter _importer = MiniExcel.GetImporterProvider().GetExcelImporter(); + private readonly OpenXmlExporter _exporter = MiniExcel.GetExporterProvider().GetExcelExporter(); + private readonly OpenXmlTemplater _templater = MiniExcel.GetTemplaterProvider().GetExcelTemplater(); /// /// [SaveAsByTemplate support DateTime custom format · Issue #255 · mini-software/MiniExcel] @@ -32,7 +32,7 @@ public async Task Issue255() }; await _templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); - var q = _importer.QueryXlsxAsync(path.ToString()).ToBlockingEnumerable(); + var q = _importer.QueryExcelAsync(path.ToString()).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal("2021", rows[1].A.ToString()); @@ -49,11 +49,11 @@ public async Task Issue255() Time2 = new DateTime(2021, 01, 01) } }; - var rowsWritten = await _exporter.ExportXlsxAsync(path.ToString(), value); + var rowsWritten = await _exporter.ExportExcelAsync(path.ToString(), value); Assert.Single(rowsWritten); Assert.Equal(1, rowsWritten[0]); - var q = _importer.QueryXlsxAsync(path.ToString()).ToBlockingEnumerable(); + var q = _importer.QueryExcelAsync(path.ToString()).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal("2021", rows[1].A.ToString()); Assert.Equal("2021", rows[1].B.ToString()); @@ -77,7 +77,7 @@ private class Issue255DTO public async Task Issue256() { var path = PathHelper.GetFile("xlsx/TestIssue256.xlsx"); - var q = _importer.QueryXlsxAsync(path, false).ToBlockingEnumerable(); + var q = _importer.QueryExcelAsync(path, false).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal(new DateTime(2003, 4, 16), rows[1].A); @@ -92,10 +92,10 @@ public async Task Issue256() public async Task Issue242() { var path = PathHelper.GetFile("xls/TestIssue242.xls"); - Assert.Throws(() => _ = _importer.QueryXlsxAsync(path).ToBlockingEnumerable().ToList()); + Assert.Throws(() => _ = _importer.QueryExcelAsync(path).ToBlockingEnumerable().ToList()); await using var stream = File.OpenRead(path); - Assert.Throws(() => _ = _importer.QueryXlsxAsync(stream).ToBlockingEnumerable().ToList()); + Assert.Throws(() => _ = _importer.QueryExcelAsync(stream).ToBlockingEnumerable().ToList()); } /// @@ -111,11 +111,11 @@ public async Task Issue243() new { Name ="Henry",Age=36,InDate=new DateTime(2020,05,03)}, }; - var rowsWritten = await _exporter.ExportXlsxAsync(path.ToString(), value); + var rowsWritten = await _exporter.ExportExcelAsync(path.ToString(), value); Assert.Single(rowsWritten); Assert.Equal(2, rowsWritten[0]); - var q = _importer.QueryXlsxAsync(path.ToString()).ToBlockingEnumerable(); + var q = _importer.QueryExcelAsync(path.ToString()).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal("Jack", rows[0].Name); @@ -150,13 +150,13 @@ public async Task Issue241() { using var file = AutoDeletingPath.Create(ExcelType.Csv); var path = file.ToString(); - var rowsWritten = await _exporter.ExportXlsxAsync(path, value); + var rowsWritten = await _exporter.ExportExcelAsync(path, value); Assert.Single(rowsWritten); Assert.Equal(2, rowsWritten[0]); { - var q = _importer.QueryXlsxAsync(path, true).ToBlockingEnumerable(); + var q = _importer.QueryExcelAsync(path, true).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal(rows[0].InDate, "01 04, 2021"); @@ -164,7 +164,7 @@ public async Task Issue241() } { - var q = _importer.QueryXlsxAsync(path).ToBlockingEnumerable(); + var q = _importer.QueryExcelAsync(path).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal(rows[0].InDate, new DateTime(2021, 01, 04)); @@ -176,13 +176,13 @@ public async Task Issue241() { using var file = AutoDeletingPath.Create(); var path = file.ToString(); - var rowsWritten = await _exporter.ExportXlsxAsync(path, value); + var rowsWritten = await _exporter.ExportExcelAsync(path, value); Assert.Single(rowsWritten); Assert.Equal(2, rowsWritten[0]); { - var q = _importer.QueryXlsxAsync(path, true).ToBlockingEnumerable(); + var q = _importer.QueryExcelAsync(path, true).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal(rows[0].InDate, "01 04, 2021"); @@ -190,7 +190,7 @@ public async Task Issue241() } { - var q = _importer.QueryXlsxAsync(path).ToBlockingEnumerable(); + var q = _importer.QueryExcelAsync(path).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal(rows[0].InDate, new DateTime(2021, 01, 04)); @@ -221,7 +221,7 @@ public async Task Issue132() new { Name ="Henry", Age=36, InDate=new DateTime(2020,05,03)}, }; - await _exporter.ExportXlsxAsync(path.ToString(), value); + await _exporter.ExportExcelAsync(path.ToString(), value); } { @@ -235,7 +235,7 @@ public async Task Issue132() { TableStyles = TableStyles.None }; - var rowsWritten = await _exporter.ExportXlsxAsync(path.ToString(), value, configuration: config); + var rowsWritten = await _exporter.ExportExcelAsync(path.ToString(), value, configuration: config); Assert.Single(rowsWritten); Assert.Equal(2, rowsWritten[0]); @@ -250,7 +250,7 @@ public async Task Issue132() new { Name ="Henry", Age=36,InDate=new DateTime(2020,05,03)}, }) ); - var rowsWritten = await _exporter.ExportXlsxAsync(path.ToString(), value); + var rowsWritten = await _exporter.ExportExcelAsync(path.ToString(), value); Assert.Single(rowsWritten); Assert.Equal(2, rowsWritten[0]); @@ -275,7 +275,7 @@ public async Task Issue235() department.TableName = "department"; sheets.Tables.Add(department); - var rowsWritten = await _exporter.ExportXlsxAsync(path, sheets); + var rowsWritten = await _exporter.ExportExcelAsync(path, sheets); Assert.Equal(2, rowsWritten.Length); Assert.Equal(2, rowsWritten[0]); @@ -284,7 +284,7 @@ public async Task Issue235() Assert.Equal("department", sheetNames[1]); { - var q = _importer.QueryXlsxAsync(path, true, sheetName: "users").ToBlockingEnumerable(); + var q = _importer.QueryExcelAsync(path, true, sheetName: "users").ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal("Jack", rows[0].Name); Assert.Equal(25, rows[0].Age); @@ -292,7 +292,7 @@ public async Task Issue235() Assert.Equal(44, rows[1].Age); } { - var q = _importer.QueryXlsxAsync(path, true, sheetName: "department").ToBlockingEnumerable(); + var q = _importer.QueryExcelAsync(path, true, sheetName: "department").ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal("01", rows[0].ID); Assert.Equal("HR", rows[0].Name); @@ -310,7 +310,7 @@ public async Task Issue233() var path = PathHelper.GetFile("xlsx/TestIssue233.xlsx"); - var dt = await _importer.QueryXlsxAsDataTableAsync(path); + var dt = await _importer.QueryExcelAsDataTableAsync(path); var rows = dt.Rows; @@ -332,9 +332,9 @@ public async Task Issue237() new{ id="\"\"1,2,3\"\""}, new{ id="1,2,3"}, }; - await _exporter.ExportXlsxAsync(path.ToString(), value); + await _exporter.ExportExcelAsync(path.ToString(), value); - var q = _importer.QueryXlsxAsync(path.ToString(), true).ToBlockingEnumerable(); + var q = _importer.QueryExcelAsync(path.ToString(), true).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal("\"\"1,2,3\"\"", rows[0].id); @@ -365,7 +365,7 @@ public async Task Issue234() ["users"] = users, ["department"] = department }; - var rowsWritten = await _exporter.ExportXlsxAsync(path, sheets); + var rowsWritten = await _exporter.ExportExcelAsync(path, sheets); Assert.Equal(2, rowsWritten.Length); Assert.Equal(2, rowsWritten[0]); @@ -376,7 +376,7 @@ public async Task Issue234() Assert.Equal("department", sheetNames[1]); { - var q = _importer.QueryXlsxAsync(path, true, sheetName: "users").ToBlockingEnumerable(); + var q = _importer.QueryExcelAsync(path, true, sheetName: "users").ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal("Jack", rows[0].Name); @@ -385,7 +385,7 @@ public async Task Issue234() Assert.Equal(44, rows[1].Age); } { - var q = _importer.QueryXlsxAsync(path, true, sheetName: "department").ToBlockingEnumerable(); + var q = _importer.QueryExcelAsync(path, true, sheetName: "department").ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal("01", rows[0].ID); @@ -444,12 +444,12 @@ public async Task Issue230() await using (var reader = await cmd3.ExecuteReaderAsync(CommandBehavior.CloseConnection)) { using var path = AutoDeletingPath.Create(); - var rowsWritten = await _exporter.ExportXlsxAsync(path.ToString(), reader, printHeader: true); + var rowsWritten = await _exporter.ExportExcelAsync(path.ToString(), reader, printHeader: true); Assert.Single(rowsWritten); Assert.Equal(2, rowsWritten[0]); - var q = _importer.QueryXlsxAsync(path.ToString(), true).ToBlockingEnumerable(); + var q = _importer.QueryExcelAsync(path.ToString(), true).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal(1, rows[0].id); @@ -466,7 +466,7 @@ public async Task Issue229() { var path = PathHelper.GetFile("xlsx/TestIssue229.xlsx"); - var dt = await _importer.QueryXlsxAsDataTableAsync(path); + var dt = await _importer.QueryExcelAsDataTableAsync(path); foreach (DataColumn column in dt.Columns) { @@ -488,7 +488,7 @@ public Task Issue122() }; var path1 = PathHelper.GetFile("xlsx/TestIssue122.xlsx"); - var rows1 = _importer.QueryXlsxAsync(path1, useHeaderRow: true, configuration: config).ToBlockingEnumerable().ToList(); + var rows1 = _importer.QueryExcelAsync(path1, useHeaderRow: true, configuration: config).ToBlockingEnumerable().ToList(); Assert.Equal("HR", rows1[0].Department); Assert.Equal("HR", rows1[1].Department); @@ -498,7 +498,7 @@ public Task Issue122() Assert.Equal("IT", rows1[5].Department); var path2 = PathHelper.GetFile("xlsx/TestIssue122_2.xlsx"); - var rows2 = _importer.QueryXlsxAsync(path2, useHeaderRow: true, configuration: config).ToBlockingEnumerable().ToList(); + var rows2 = _importer.QueryExcelAsync(path2, useHeaderRow: true, configuration: config).ToBlockingEnumerable().ToList(); Assert.Equal("V1", rows2[2].Test1); Assert.Equal("V2", rows2[5].Test2); @@ -519,14 +519,14 @@ public async Task Issue227() { { var path = PathHelper.GetTempPath("xlsm"); - Assert.Throws(() => _exporter.ExportXlsx(path, new[] { new { V = "A1" }, new { V = "A2" } })); + Assert.Throws(() => _exporter.ExportExcel(path, new[] { new { V = "A1" }, new { V = "A2" } })); File.Delete(path); } { var path = PathHelper.GetFile("xlsx/TestIssue227.xlsm"); { - var q = _importer.QueryXlsxAsync(path).ToBlockingEnumerable(); + var q = _importer.QueryExcelAsync(path).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal(100, rows.Count); @@ -540,7 +540,7 @@ public async Task Issue227() } { await using var stream = File.OpenRead(path); - var q = _importer.QueryXlsxAsync(stream).ToBlockingEnumerable(); + var q = _importer.QueryExcelAsync(stream).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal(100, rows.Count); @@ -582,12 +582,12 @@ public async Task Issue223() new() { { "A", Guid.NewGuid() }, { "B", "HelloWorld" } } ]; using var path = AutoDeletingPath.Create(); - var rowsWritten = await _exporter.ExportXlsxAsync(path.ToString(), value); + var rowsWritten = await _exporter.ExportExcelAsync(path.ToString(), value); Assert.Single(rowsWritten); Assert.Equal(3, rowsWritten[0]); - var dt = await _importer.QueryXlsxAsDataTableAsync(path.ToString()); + var dt = await _importer.QueryExcelAsDataTableAsync(path.ToString()); #pragma warning restore CS0618 var columns = dt.Columns; Assert.Equal(typeof(object), columns[0].DataType); @@ -605,7 +605,7 @@ public async Task Issue223() public async Task Issue222() { var path = PathHelper.GetFile("xlsx/TestIssue222.xlsx"); - var q = _importer.QueryXlsxAsync(path).ToBlockingEnumerable(); + var q = _importer.QueryExcelAsync(path).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal(typeof(DateTime), rows[1].A.GetType()); Assert.Equal(new DateTime(2021, 4, 29), rows[1].A); @@ -620,7 +620,7 @@ public async Task Issue147() { { var path = PathHelper.GetFile("xlsx/TestIssue147.xlsx"); - var q = _importer.QueryXlsxAsync(path, useHeaderRow: false, startCell: "C3", sheetName: "Sheet1").ToBlockingEnumerable(); + var q = _importer.QueryExcelAsync(path, useHeaderRow: false, startCell: "C3", sheetName: "Sheet1").ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal(["C", "D", "E"], (rows[0] as IDictionary)?.Keys); @@ -636,13 +636,13 @@ public async Task Issue147() } Assert.Equal(11, rows.Count); - var columns = await _importer.GetXlsxColumnsAsync(path, startCell: "C3"); + var columns = await _importer.GetExcelColumnsAsync(path, startCell: "C3"); Assert.Equal(["C", "D", "E"], columns); } { var path = PathHelper.GetFile("xlsx/TestIssue147.xlsx"); - var q = _importer.QueryXlsxAsync(path, useHeaderRow: true, startCell: "C3", sheetName: "Sheet1").ToBlockingEnumerable(); + var q = _importer.QueryExcelAsync(path, useHeaderRow: true, startCell: "C3", sheetName: "Sheet1").ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal(["Column1", "Column2", "Column3"], (rows[0] as IDictionary)?.Keys); @@ -657,7 +657,7 @@ public async Task Issue147() } Assert.Equal(10, rows.Count); - var columns = await _importer.GetXlsxColumnsAsync(path, useHeaderRow: true, startCell: "C3"); + var columns = await _importer.GetExcelColumnsAsync(path, useHeaderRow: true, startCell: "C3"); Assert.Equal(["Column1", "Column2", "Column3"], columns); } } @@ -677,11 +677,11 @@ public async Task Issue211() await using var connection = new SQLiteConnection(connectionString); using var reader = await connection.ExecuteReaderAsync("select 1 Test1,2 Test2 union all select 3 , 4 union all select 5 ,6"); - var rowsWritten = await _exporter.ExportXlsxAsync(path.ToString(), reader); + var rowsWritten = await _exporter.ExportExcelAsync(path.ToString(), reader); Assert.Single(rowsWritten); Assert.Equal(3, rowsWritten[0]); - var q = _importer.QueryXlsxAsync(path.ToString(), true).ToBlockingEnumerable(); + var q = _importer.QueryExcelAsync(path.ToString(), true).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal(1.0, rows[0].Test1); Assert.Equal(2.0, rows[0].Test2); @@ -704,11 +704,11 @@ public async Task EmptyDataReaderIssue() await using var connection2 = new SQLiteConnection(connectionString); using var reader = await connection2.ExecuteReaderAsync("SELECT * FROM test"); - var rowsWritten = await _exporter.ExportXlsxAsync(path.ToString(), reader); + var rowsWritten = await _exporter.ExportExcelAsync(path.ToString(), reader); Assert.Single(rowsWritten); Assert.Equal(0, rowsWritten[0]); - var q = _importer.QueryXlsxAsync(path.ToString(), true).ToBlockingEnumerable(); + var q = _importer.QueryExcelAsync(path.ToString(), true).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Empty(rows); } @@ -721,12 +721,12 @@ public async Task Issue216() { using var path = AutoDeletingPath.Create(); var value = new[] { new { Test1 = "1", Test2 = 2 }, new { Test1 = "3", Test2 = 4 } }; - var rowsWritten = await _exporter.ExportXlsxAsync(path.ToString(), value); + var rowsWritten = await _exporter.ExportExcelAsync(path.ToString(), value); Assert.Single(rowsWritten); Assert.Equal(2, rowsWritten[0]); { - var table = await _importer.QueryXlsxAsDataTableAsync(path.ToString()); + var table = await _importer.QueryExcelAsDataTableAsync(path.ToString()); Assert.Equal("Test1", table.Columns[0].ColumnName); Assert.Equal("Test2", table.Columns[1].ColumnName); Assert.Equal("1", table.Rows[0]["Test1"]); @@ -736,7 +736,7 @@ public async Task Issue216() } { - var dt = await _importer.QueryXlsxAsDataTableAsync(path.ToString(), false); + var dt = await _importer.QueryExcelAsDataTableAsync(path.ToString(), false); Assert.Equal("Test1", dt.Rows[0]["A"]); Assert.Equal("Test2", dt.Rows[0]["B"]); Assert.Equal("1", dt.Rows[1]["A"]); @@ -756,9 +756,9 @@ public async Task IssueI3OSKV() { using var path = AutoDeletingPath.Create(); var value = new[] { new { Test = "12345678901234567890" } }; - await _exporter.ExportXlsxAsync(path.ToString(), value); + await _exporter.ExportExcelAsync(path.ToString(), value); - var q = _importer.QueryXlsxAsync(path.ToString(), true).ToBlockingEnumerable(); + var q = _importer.QueryExcelAsync(path.ToString(), true).ToBlockingEnumerable(); var A2 = q.First().Test; Assert.Equal("12345678901234567890", A2); } @@ -766,9 +766,9 @@ public async Task IssueI3OSKV() { using var path = AutoDeletingPath.Create(); var value = new[] { new { Test = 123456.789 } }; - await _exporter.ExportXlsxAsync(path.ToString(), value); + await _exporter.ExportExcelAsync(path.ToString(), value); - var q = _importer.QueryXlsxAsync(path.ToString(), true).ToBlockingEnumerable(); + var q = _importer.QueryExcelAsync(path.ToString(), true).ToBlockingEnumerable(); var A2 = q.First().Test; Assert.Equal(123456.789, A2); } @@ -782,7 +782,7 @@ public async Task IssueI3OSKV() public async Task Issue220() { var path = PathHelper.GetFile("xlsx/TestIssue220.xlsx"); - var rows = _importer.QueryXlsxAsync(path, useHeaderRow: true).ToBlockingEnumerable(); + var rows = _importer.QueryExcelAsync(path, useHeaderRow: true).ToBlockingEnumerable(); var result = rows .GroupBy(s => s.PRT_ID) .Select(g => new @@ -806,9 +806,9 @@ public async Task Issue220() public async Task Issue215() { await using var stream = new MemoryStream(); - await _exporter.ExportXlsxAsync(stream, new[] { new { V = "test1" }, new { V = "test2" } }); + await _exporter.ExportExcelAsync(stream, new[] { new { V = "test1" }, new { V = "test2" } }); - var q = _importer.QueryXlsxAsync(stream, true).ToBlockingEnumerable().Cast>(); + var q = _importer.QueryExcelAsync(stream, true).ToBlockingEnumerable().Cast>(); var rows = q.ToList(); Assert.Equal("test1", rows[0]["V"]); @@ -832,11 +832,11 @@ public async Task Issue217() // openxml { using var path = AutoDeletingPath.Create(); - var rowsWritten = await _exporter.ExportXlsxAsync(path.ToString(), table); + var rowsWritten = await _exporter.ExportExcelAsync(path.ToString(), table); Assert.Single(rowsWritten); Assert.Equal(2, rowsWritten[0]); - var q = _importer.QueryXlsxAsync(path.ToString()).ToBlockingEnumerable(); + var q = _importer.QueryExcelAsync(path.ToString()).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal("Name", rows[0].B); Assert.Equal("Limit", rows[0].C); @@ -845,9 +845,9 @@ public async Task Issue217() // csv { using var path = AutoDeletingPath.Create(ExcelType.Csv); - await _exporter.ExportXlsxAsync(path.ToString(), table); + await _exporter.ExportExcelAsync(path.ToString(), table); - var q = _importer.QueryXlsxAsync(path.ToString()).ToBlockingEnumerable(); + var q = _importer.QueryExcelAsync(path.ToString()).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal("Name", rows[0].B); Assert.Equal("Limit", rows[0].C); @@ -864,7 +864,7 @@ public async Task Issue212() const string sheetName = "Demo"; using var path = AutoDeletingPath.Create(); - await _exporter.ExportXlsxAsync(path.ToString(), new[] { new { x = 1, y = 2 } }, sheetName: sheetName); + await _exporter.ExportExcelAsync(path.ToString(), new[] { new { x = 1, y = 2 } }, sheetName: sheetName); var actualSheetName = _importer.GetSheetNames(path.ToString()).ToList()[0]; Assert.Equal(sheetName, actualSheetName); @@ -894,7 +894,7 @@ public async Task Issue207() }; await _templater.ApplyXlsxTemplateAsync(path, templatePath, value); - var q = _importer.QueryXlsxAsync(path).ToBlockingEnumerable(); + var q = _importer.QueryExcelAsync(path).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal("項目1", rows[0].A); @@ -941,7 +941,7 @@ public async Task Issue207() await _templater.ApplyXlsxTemplateAsync(path, templatePath, value); - var q = _importer.QueryXlsxAsync(path).ToBlockingEnumerable(); + var q = _importer.QueryExcelAsync(path).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal("項目1", rows[0].A); Assert.Equal("[]內容1,[]內容2,[]內容3,[]內容4,[]內容5", rows[0].C); @@ -971,7 +971,7 @@ public async Task Issue87() }; await using var stream = File.OpenRead(templatePath); - var q = _importer.QueryXlsxAsync(templatePath).ToBlockingEnumerable(); + var q = _importer.QueryExcelAsync(templatePath).ToBlockingEnumerable(); var rows = q.ToList(); await _templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); @@ -1052,7 +1052,7 @@ public async Task Issue193() foreach (var sheetName in _importer.GetSheetNames(path)) { - var q = _importer.QueryXlsxAsync(path, sheetName: sheetName).ToBlockingEnumerable(); + var q = _importer.QueryExcelAsync(path, sheetName: sheetName).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal(9, rows.Count); @@ -1105,7 +1105,7 @@ public async Task Issue193() }; await _templater.ApplyXlsxTemplateAsync(path, templatePath, value); - var q = _importer.QueryXlsxAsync(path).ToBlockingEnumerable(); + var q = _importer.QueryExcelAsync(path).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal("FooCompany", rows[0].A); Assert.Equal("Jack", rows[2].B); @@ -1134,19 +1134,19 @@ public async Task Issue142_Query() const string path = "../../../../../samples/xlsx/TestIssue142.xlsx"; const string pathCsv = "../../../../../samples/xlsx/TestIssue142.csv"; { - var rows = _importer.QueryXlsxAsync(path).ToBlockingEnumerable().ToList(); + var rows = _importer.QueryExcelAsync(path).ToBlockingEnumerable().ToList(); Assert.Equal(0, rows[0].MyProperty1); } { await Assert.ThrowsAsync(async () => { - var q = _importer.QueryXlsxAsync(path).ToBlockingEnumerable().ToList(); + var q = _importer.QueryExcelAsync(path).ToBlockingEnumerable().ToList(); }); } { - var q = _importer.QueryXlsxAsync(path).ToBlockingEnumerable(); + var q = _importer.QueryExcelAsync(path).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal("CustomColumnName", rows[0].MyProperty1); Assert.Null(rows[0].MyProperty7); @@ -1158,7 +1158,7 @@ await Assert.ThrowsAsync(async () => } { - var q = _importer.QueryXlsxAsync(path).ToBlockingEnumerable(); + var q = _importer.QueryExcelAsync(path).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal("CustomColumnName", rows[0].MyProperty1); Assert.Null(rows[0].MyProperty7); @@ -1206,19 +1206,19 @@ public async Task Issue150() { var path = PathHelper.GetTempFilePath(); - await Assert.ThrowsAnyAsync(async () => await _exporter.ExportXlsxAsync(path, new[] { 1, 2 })); + await Assert.ThrowsAnyAsync(async () => await _exporter.ExportExcelAsync(path, new[] { 1, 2 })); File.Delete(path); - await Assert.ThrowsAnyAsync(async () => await _exporter.ExportXlsxAsync(path, new[] { "1", "2" })); + await Assert.ThrowsAnyAsync(async () => await _exporter.ExportExcelAsync(path, new[] { "1", "2" })); File.Delete(path); - await Assert.ThrowsAnyAsync(async () => await _exporter.ExportXlsxAsync(path, new[] { '1', '2' })); + await Assert.ThrowsAnyAsync(async () => await _exporter.ExportExcelAsync(path, new[] { '1', '2' })); File.Delete(path); - await Assert.ThrowsAnyAsync(async () => await _exporter.ExportXlsxAsync(path, new[] { DateTime.Now })); + await Assert.ThrowsAnyAsync(async () => await _exporter.ExportExcelAsync(path, new[] { DateTime.Now })); File.Delete(path); - await Assert.ThrowsAnyAsync(async () => await _exporter.ExportXlsxAsync(path, new[] { Guid.NewGuid() })); + await Assert.ThrowsAnyAsync(async () => await _exporter.ExportExcelAsync(path, new[] { Guid.NewGuid() })); File.Delete(path); } @@ -1283,11 +1283,11 @@ public async Task Issue157() } ] """); - var rowsWritten = await _exporter.ExportXlsxAsync(path, input); + var rowsWritten = await _exporter.ExportExcelAsync(path, input); Assert.Single(rowsWritten); Assert.Equal(5, rowsWritten[0]); - var q = _importer.QueryXlsxAsync(path, sheetName: "Sheet1").ToBlockingEnumerable(); + var q = _importer.QueryExcelAsync(path, sheetName: "Sheet1").ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal(6, rows.Count); Assert.Equal("Sheet1", _importer.GetSheetNames(path).First()); @@ -1300,7 +1300,7 @@ public async Task Issue157() { const string path = "../../../../../samples/xlsx/TestIssue157.xlsx"; { - var q = _importer.QueryXlsxAsync(path, sheetName: "Sheet1").ToBlockingEnumerable(); + var q = _importer.QueryExcelAsync(path, sheetName: "Sheet1").ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal(6, rows.Count); Assert.Equal("Sheet1", _importer.GetSheetNames(path).First()); @@ -1313,7 +1313,7 @@ public async Task Issue157() } { - var q = _importer.QueryXlsxAsync(path, sheetName: "Sheet1").ToBlockingEnumerable(); + var q = _importer.QueryExcelAsync(path, sheetName: "Sheet1").ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal(5, rows.Count); @@ -1347,7 +1347,7 @@ public async Task Issue149() { const string path = "../../../../../samples/xlsx/TestIssue149.xlsx"; - var q = _importer.QueryXlsxAsync(path).ToBlockingEnumerable(); + var q = _importer.QueryExcelAsync(path).ToBlockingEnumerable(); var rows = q.Select(s => (string)s.A).ToList(); for (int i = 0; i < chars.Length; i++) @@ -1364,9 +1364,9 @@ public async Task Issue149() var path = file.ToString(); var input = chars.Select(s => new { Test = s.ToString() }); - await _exporter.ExportXlsxAsync(path, input); + await _exporter.ExportExcelAsync(path, input); - var q = _importer.QueryXlsxAsync(path, true).ToBlockingEnumerable(); + var q = _importer.QueryExcelAsync(path, true).ToBlockingEnumerable(); var rows = q.Select(s => (string)s.Test).ToList(); for (int i = 0; i < chars.Length; i++) @@ -1384,9 +1384,9 @@ public async Task Issue149() var path = file.ToString(); var input = chars.Select(s => new { Test = s.ToString() }); - await _exporter.ExportXlsxAsync(path, input); + await _exporter.ExportExcelAsync(path, input); - var q = _importer.QueryXlsxAsync(path).ToBlockingEnumerable(); + var q = _importer.QueryExcelAsync(path).ToBlockingEnumerable(); var rows = q.Select(s => s.Test).ToList(); for (int i = 0; i < chars.Length; i++) @@ -1412,7 +1412,7 @@ private class Issue149VO public async Task Issue153() { const string path = "../../../../../samples/xlsx/TestIssue153.xlsx"; - var q = _importer.QueryXlsxAsync(path, true).ToBlockingEnumerable(); + var q = _importer.QueryExcelAsync(path, true).ToBlockingEnumerable(); var rows = q.First() as IDictionary; Assert.Equal( @@ -1431,7 +1431,7 @@ public async Task Issue137() var path = "../../../../../samples/xlsx/TestIssue137.xlsx"; { - var q = _importer.QueryXlsxAsync(path).ToBlockingEnumerable(); + var q = _importer.QueryExcelAsync(path).ToBlockingEnumerable(); var rows = q.ToList(); var first = rows[0] as IDictionary; // https://user-images.githubusercontent.com/12729184/113266322-ba06e400-9307-11eb-9521-d36abfda75cc.png Assert.Equal(["A", "B", "C", "D", "E", "F", "G", "H"], first?.Keys.ToArray()); @@ -1467,7 +1467,7 @@ public async Task Issue137() // dynamic query with head { - var q = _importer.QueryXlsxAsync(path, true).ToBlockingEnumerable(); + var q = _importer.QueryExcelAsync(path, true).ToBlockingEnumerable(); var rows = q.ToList(); var first = rows[0] as IDictionary; // https://user-images.githubusercontent.com/12729184/113266322-ba06e400-9307-11eb-9521-d36abfda75cc.png Assert.Equal(["比例", "商品", "滿倉口數", "0", "1為港幣 0為台幣"], first?.Keys.ToArray()); @@ -1489,7 +1489,7 @@ public async Task Issue137() } { - var q = _importer.QueryXlsxAsync(path).ToBlockingEnumerable(); + var q = _importer.QueryExcelAsync(path).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal(10, rows.Count); @@ -1523,7 +1523,7 @@ public async Task Issue138() { const string path = "../../../../../samples/xlsx/TestIssue138.xlsx"; { - var q = _importer.QueryXlsxAsync(path, true).ToBlockingEnumerable(); + var q = _importer.QueryExcelAsync(path, true).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal(6, rows.Count); @@ -1549,7 +1549,7 @@ public async Task Issue138() } { - var q = _importer.QueryXlsxAsync(path).ToBlockingEnumerable(); + var q = _importer.QueryExcelAsync(path).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal(6, rows.Count); Assert.Equal(new DateTime(2021, 3, 1), rows[0].Date); diff --git a/tests/MiniExcel.Tests/MiniExcelIssueTests.cs b/tests/MiniExcel.Tests/MiniExcelIssueTests.cs index d2591113..d0646c37 100644 --- a/tests/MiniExcel.Tests/MiniExcelIssueTests.cs +++ b/tests/MiniExcel.Tests/MiniExcelIssueTests.cs @@ -15,9 +15,9 @@ public class MiniExcelIssueTests(ITestOutputHelper output) { private readonly ITestOutputHelper _output = output; - private readonly MiniExcelImporter _importer = MiniExcel.GetImporter(); - private readonly MiniExcelExporter _exporter = MiniExcel.GetExporter(); - private readonly MiniExcelTemplater _templater = MiniExcel.GetTemplater(); + private readonly OpenXmlImporter _importer = MiniExcel.GetImporterProvider().GetExcelImporter(); + private readonly OpenXmlExporter _exporter = MiniExcel.GetExporterProvider().GetExcelExporter(); + private readonly OpenXmlTemplater _templater = MiniExcel.GetTemplaterProvider().GetExcelTemplater(); /// /// https://github.com/mini-software/MiniExcel/issues/549 @@ -33,8 +33,8 @@ public void TestIssue549() using var file = AutoDeletingPath.Create(); var path = file.ToString(); - _exporter.ExportXlsx(path, data); - var rows = _importer.QueryXlsx(path, true).ToList(); + _exporter.ExportExcel(path, data); + var rows = _importer.QueryExcel(path, true).ToList(); { using var stream = new FileStream(path, FileMode.Open, FileAccess.Read); using var workbook = new XSSFWorkbook(stream); @@ -81,7 +81,7 @@ public void TestIssue553() }; _templater.ApplyXlsxTemplate(path.ToString(), templatePath, data); - var rows = _importer.QueryXlsx(path.ToString()).ToList(); + var rows = _importer.QueryExcel(path.ToString()).ToList(); Assert.Equal(rows[2].A, 1); Assert.Equal(rows[3].A, 2); Assert.Equal(rows[4].A, 3); @@ -97,9 +97,9 @@ public void TestIssue289() new() { Name="0002", UserType=DescriptionEnum.V2 }, new() { Name="0003", UserType=DescriptionEnum.V3 } ]; - _exporter.ExportXlsx(path.ToString(), value); + _exporter.ExportExcel(path.ToString(), value); - var rows = _importer.QueryXlsx(path.ToString()).ToList(); + var rows = _importer.QueryExcel(path.ToString()).ToList(); Assert.Equal(DescriptionEnum.V1, rows[0].UserType); Assert.Equal(DescriptionEnum.V2, rows[1].UserType); @@ -130,8 +130,8 @@ public void TestIssue430() { new TestIssue430Dto{ Date=DateTimeOffset.Parse("2021-01-31 10:03:00 +05:00")} }; - _exporter.ExportXlsx(path.ToString(), value); - var rows = _importer.QueryXlsx(path.ToString()).ToArray(); + _exporter.ExportExcel(path.ToString(), value); + var rows = _importer.QueryExcel(path.ToString()).ToArray(); Assert.Equal("2021-01-31 10:03:00 +05:00", rows[0].Date.ToString("yyyy-MM-dd HH:mm:ss zzz")); } @@ -154,7 +154,7 @@ public void TestIssue_DataReaderSupportDimension() using var path = AutoDeletingPath.Create(); using var reader = table.CreateDataReader(); var config = new OpenXmlConfiguration { FastMode = true }; - _exporter.ExportXlsx(path.ToString(), reader, configuration: config); + _exporter.ExportExcel(path.ToString(), reader, configuration: config); var xml = SheetHelper.GetZipFileContent(path.ToString(), "xl/worksheets/sheet1.xml"); Assert.Contains("", xml); @@ -179,7 +179,7 @@ public void TestIssue413() }; var templatePath = PathHelper.GetFile("xlsx/TestIssue413.xlsx"); _templater.ApplyXlsxTemplate(path.ToString(), templatePath, value); - var rows = _importer.QueryXlsx(path.ToString()).ToList(); + var rows = _importer.QueryExcel(path.ToString()).ToList(); Assert.Equal("2022-12-25 00:00:00", rows[1].B); Assert.Equal("2022-09-23 00:00:00", rows[2].B); @@ -194,7 +194,7 @@ public void TestIssue405() { using var path = AutoDeletingPath.Create(); var value = new[] { new { id = 1, name = "test" } }; - _exporter.ExportXlsx(path.ToString(), value); + _exporter.ExportExcel(path.ToString(), value); var xml = SheetHelper.GetZipFileContent(path.ToString(), "xl/sharedStrings.xml"); Assert.StartsWith(">>(json); - _exporter.ExportXlsx(path.ToString(), value, configuration: config); + _exporter.ExportExcel(path.ToString(), value, configuration: config); - var rows = _importer.QueryXlsx(path.ToString()).ToList(); + var rows = _importer.QueryExcel(path.ToString()).ToList(); Assert.Equal("createdate", rows[0].A); Assert.Equal(new DateTime(2022, 04, 12), rows[1].A); Assert.Equal("name", rows[0].B); @@ -252,9 +252,9 @@ public void TestIssue369() }; using var path = AutoDeletingPath.Create(); var value = new[] { new { id = 1, name = "Jack", createdate = new DateTime(2022, 04, 12), point = 123.456 } }; - _exporter.ExportXlsx(path.ToString(), value, configuration: config); + _exporter.ExportExcel(path.ToString(), value, configuration: config); - var rows = _importer.QueryXlsx(path.ToString()).ToList(); + var rows = _importer.QueryExcel(path.ToString()).ToList(); Assert.Equal("createdate", rows[0].A); Assert.Equal(new DateTime(2022, 04, 12), rows[1].A); Assert.Equal("name", rows[0].B); @@ -268,9 +268,9 @@ public void TestIssueI4ZYUU() { using var path = AutoDeletingPath.Create(); TestIssueI4ZYUUDto[] value = [new() { MyProperty = "1", MyProperty2 = new DateTime(2022, 10, 15) }]; - _exporter.ExportXlsx(path.ToString(), value); + _exporter.ExportExcel(path.ToString(), value); - var rows = _importer.QueryXlsx(path.ToString()).ToList(); + var rows = _importer.QueryExcel(path.ToString()).ToList(); Assert.Equal("2022-10", rows[1].B); using var workbook = new ClosedXML.Excel.XLWorkbook(path.ToString()); @@ -296,7 +296,7 @@ public void TestIssue360() var sheets = _importer.GetSheetNames(path); foreach (var sheetName in sheets) { - var dt = _importer.QueryXlsxAsDataTable(path, useHeaderRow: true, sheetName: sheetName, configuration: config); + var dt = _importer.QueryExcelAsDataTable(path, useHeaderRow: true, sheetName: sheetName, configuration: config); } } @@ -333,7 +333,7 @@ public void TestIssue352() using var path = AutoDeletingPath.Create(); var reader = table.CreateDataReader(); - _exporter.ExportXlsx(path.ToString(), reader); + _exporter.ExportExcel(path.ToString(), reader); var xml = SheetHelper.GetZipFileContent(path.ToString(), "xl/worksheets/sheet1.xml"); var cnt = Regex.Matches(xml, "").Count; } @@ -346,7 +346,7 @@ public void TestIssue352() using var path = AutoDeletingPath.Create(); var reader = table.CreateDataReader(); - _exporter.ExportXlsx(path.ToString(), reader, false); + _exporter.ExportExcel(path.ToString(), reader, false); var xml = SheetHelper.GetZipFileContent(path.ToString(), "xl/worksheets/sheet1.xml"); var cnt = Regex.Matches(xml, "").Count; } @@ -357,7 +357,7 @@ public void TestIssue352() using var path = AutoDeletingPath.Create(); var reader = table.CreateDataReader(); - _exporter.ExportXlsx(path.ToString(), reader); + _exporter.ExportExcel(path.ToString(), reader); var xml = SheetHelper.GetZipFileContent(path.ToString(), "xl/worksheets/sheet1.xml"); var cnt = Regex.Matches(xml, "").Count; } @@ -381,7 +381,7 @@ public void TestIssue401(bool autoFilter, int count) var reader = table.CreateDataReader(); using var path = AutoDeletingPath.Create(); var config = new OpenXmlConfiguration { AutoFilter = autoFilter }; - _exporter.ExportXlsx(path.ToString(), reader, configuration: config); + _exporter.ExportExcel(path.ToString(), reader, configuration: config); var xml = SheetHelper.GetZipFileContent(path.ToString(), "xl/worksheets/sheet1.xml"); var cnt = Regex.Matches(xml, "").Count; @@ -398,7 +398,7 @@ public void TestIssue401(bool autoFilter, int count) var reader = table.CreateDataReader(); using var path = AutoDeletingPath.Create(); var config = new OpenXmlConfiguration { AutoFilter = autoFilter }; - _exporter.ExportXlsx(path.ToString(), reader, false, configuration: config); + _exporter.ExportExcel(path.ToString(), reader, false, configuration: config); var xml = SheetHelper.GetZipFileContent(path.ToString(), "xl/worksheets/sheet1.xml"); var cnt = Regex.Matches(xml, "").Count; @@ -413,7 +413,7 @@ public void TestIssue401(bool autoFilter, int count) var reader = table.CreateDataReader(); using var path = AutoDeletingPath.Create(); var config = new OpenXmlConfiguration { AutoFilter = autoFilter }; - _exporter.ExportXlsx(path.ToString(), reader, configuration: config); + _exporter.ExportExcel(path.ToString(), reader, configuration: config); var xml = SheetHelper.GetZipFileContent(path.ToString(), "xl/worksheets/sheet1.xml"); var cnt = Regex.Matches(xml, "").Count; @@ -440,7 +440,7 @@ UNION ALL """; using var reader = command.ExecuteReader(); - _exporter.ExportXlsx(path.ToString(), reader, configuration: config); + _exporter.ExportExcel(path.ToString(), reader, configuration: config); } var xml = SheetHelper.GetZipFileContent(path.ToString(), "xl/worksheets/sheet1.xml"); @@ -464,7 +464,7 @@ UNION ALL using (var transaction = connection.BeginTransaction()) using (var stream = File.OpenRead(xlsxPath)) { - var rows = _importer.QueryXlsx(stream); + var rows = _importer.QueryExcel(stream); foreach (var row in rows) connection.Execute( "insert into T (A,B) values (@A,@B)", @@ -482,7 +482,7 @@ UNION ALL using var command = new SQLiteCommand("select * from T", connection); connection.Open(); using var reader = command.ExecuteReader(); - _exporter.ExportXlsx(path.ToString(), reader, configuration: config); + _exporter.ExportExcel(path.ToString(), reader, configuration: config); } var xml = SheetHelper.GetZipFileContent(path.ToString(), "xl/worksheets/sheet1.xml"); @@ -498,12 +498,12 @@ public async Task TestIssue307() var path = file.ToString(); var value = new[] { new { id = 1, name = "Jack" } }; - await _exporter.ExportXlsxAsync(path, value); - Assert.Throws(() => _exporter.ExportXlsx(path, value)); + await _exporter.ExportExcelAsync(path, value); + Assert.Throws(() => _exporter.ExportExcel(path, value)); - await _exporter.ExportXlsxAsync(path, value, overwriteFile: true); - await Assert.ThrowsAsync(async () => await _exporter.ExportXlsxAsync(path, value)); - await _exporter.ExportXlsxAsync(path, value, overwriteFile: true); + await _exporter.ExportExcelAsync(path, value, overwriteFile: true); + await Assert.ThrowsAsync(async () => await _exporter.ExportExcelAsync(path, value)); + await _exporter.ExportExcelAsync(path, value, overwriteFile: true); } [Fact] @@ -511,8 +511,8 @@ public void TestIssue310() { using var path = AutoDeletingPath.Create(); var value = new[] { new TestIssue310Dto { V1 = null }, new TestIssue310Dto { V1 = 2 } }; - _exporter.ExportXlsx(path.ToString(), value); - var rows = _importer.QueryXlsx(path.ToString()).ToList(); + _exporter.ExportExcel(path.ToString(), value); + var rows = _importer.QueryExcel(path.ToString()).ToList(); } [Fact] @@ -524,8 +524,8 @@ public void TestIssue310Fix497() new TestIssue310Dto { V1 = null }, new TestIssue310Dto { V1 = 2 } }; - _exporter.ExportXlsx(path.ToString(), value, configuration: new OpenXmlConfiguration { EnableWriteNullValueCell = false }); - var rows = _importer.QueryXlsx(path.ToString()).ToList(); + _exporter.ExportExcel(path.ToString(), value, configuration: new OpenXmlConfiguration { EnableWriteNullValueCell = false }); + var rows = _importer.QueryExcel(path.ToString()).ToList(); } private class TestIssue310Dto @@ -551,9 +551,9 @@ public void TestIssue343() table.Rows.Add(date, date); } var reader = table.CreateDataReader(); - _exporter.ExportXlsx(path.ToString(), reader); + _exporter.ExportExcel(path.ToString(), reader); - var rows = _importer.QueryXlsx(path.ToString(), true).ToArray(); + var rows = _importer.QueryExcel(path.ToString(), true).ToArray(); Assert.Equal(date, rows[0].time1); Assert.Equal(date, rows[0].time2); } @@ -564,7 +564,7 @@ public void TestIssueI4YCLQ_2() var c = GeneralHelper.ConvertColumnName(1); var c2 = GeneralHelper.ConvertColumnName(3); var path = PathHelper.GetFile("xlsx/TestIssueI4YCLQ_2.xlsx"); - var rows = _importer.QueryXlsx(path, startCell: "B2").ToList(); + var rows = _importer.QueryExcel(path, startCell: "B2").ToList(); Assert.Null(rows[0].站点编码); Assert.Equal("N1", rows[0].站址名称); @@ -615,7 +615,7 @@ public void TestIssueI4WM67() ["users"] = Array.Empty() }; _templater.ApplyXlsxTemplate(path.ToString(), templatePath, value); - var rows = _importer.QueryXlsx(path.ToString()).ToList(); + var rows = _importer.QueryExcel(path.ToString()).ToList(); Assert.Single(rows); } @@ -678,7 +678,7 @@ public void TestIssue331_2() }); using var path = AutoDeletingPath.Create(); - _exporter.ExportXlsx(path.ToString(), data, configuration: config); + _exporter.ExportExcel(path.ToString(), data, configuration: config); CultureInfo.CurrentCulture = CultureInfo.GetCultureInfo(cln); } @@ -697,9 +697,9 @@ public void TestIssue331() }); using var path = AutoDeletingPath.Create(); - _exporter.ExportXlsx(path.ToString(), data); + _exporter.ExportExcel(path.ToString(), data); - var rows = _importer.QueryXlsx(path.ToString(), startCell: "A2").ToArray(); + var rows = _importer.QueryExcel(path.ToString(), startCell: "A2").ToArray(); Assert.Equal(1.5, rows[2].B); Assert.Equal(1.5, rows[2].C); @@ -721,16 +721,16 @@ public void TestIssueI4TXGT() var path = file.ToString(); var value = new[] { new TestIssueI4TXGTDto { ID = 1, Name = "Apple", Spc = "X", Up = 6999 } }; - _exporter.ExportXlsx(path, value); + _exporter.ExportExcel(path, value); { - var rows = _importer.QueryXlsx(path).ToList(); + var rows = _importer.QueryExcel(path).ToList(); Assert.Equal("ID", rows[0].A); Assert.Equal("Name", rows[0].B); Assert.Equal("Specification", rows[0].C); Assert.Equal("Unit Price", rows[0].D); } { - var rows = _importer.QueryXlsx(path).ToList(); + var rows = _importer.QueryExcel(path).ToList(); Assert.Equal(1, rows[0].ID); Assert.Equal("Apple", rows[0].Name); Assert.Equal("X", rows[0].Spc); @@ -769,10 +769,10 @@ public void TestIssue328() file = File.ReadAllBytes(PathHelper.GetFile("other/TestIssue327.txt")) }, }; - _exporter.ExportXlsx(path.ToString(), value); + _exporter.ExportExcel(path.ToString(), value); var rowIndx = 0; - using var reader = _importer.GetXlsxDataReader(path.ToString(), true); + using var reader = _importer.GetExcelDataReader(path.ToString(), true); Assert.Equal("id", reader.GetName(0)); Assert.Equal("name", reader.GetName(1)); @@ -809,8 +809,8 @@ public void TestIssue327() new { id = 2, file = File.ReadAllBytes(PathHelper.GetFile("other/TestIssue327.txt")) }, new { id = 3, file = File.ReadAllBytes(PathHelper.GetFile("other/TestIssue327.html")) }, }; - _exporter.ExportXlsx(path.ToString(), value); - var rows = _importer.QueryXlsx(path.ToString(), true).ToList(); + _exporter.ExportExcel(path.ToString(), value); + var rows = _importer.QueryExcel(path.ToString(), true).ToList(); Assert.Equal(value[0].file, rows[0].file); Assert.Equal(value[1].file, rows[1].file); @@ -831,7 +831,7 @@ public void TestIssue325() { "sheet1",new[]{ new { id = 1, date = DateTime.Parse("2022-01-01") } }}, { "sheet2",new[]{ new { id = 2, date = DateTime.Parse("2022-01-01") } }}, }; - _exporter.ExportXlsx(path.ToString(), value); + _exporter.ExportExcel(path.ToString(), value); var xml = SheetHelper.GetZipFileContent(path.ToString(), "xl/worksheets/_rels/sheet2.xml.rels"); var cnt = Regex.Matches(xml, "Id=\"drawing2\"").Count; @@ -853,9 +853,9 @@ public void TestIssueI49RZH() new TestIssueI49RZHDto{ dd = DateTimeOffset.Parse("2022-01-22")}, new TestIssueI49RZHDto{ dd = null} }; - _exporter.ExportXlsx(path.ToString(), value); + _exporter.ExportExcel(path.ToString(), value); - var rows = _importer.QueryXlsx(path.ToString()).ToList(); + var rows = _importer.QueryExcel(path.ToString()).ToList(); Assert.Equal("2022-01-22", rows[1].A); } @@ -867,9 +867,9 @@ public void TestIssueI49RZH() new TestIssueI49RZHDto{ dd = DateTimeOffset.Parse("2022-01-22")}, new TestIssueI49RZHDto{ dd = null} }; - _exporter.ExportXlsx(path.ToString(), value); + _exporter.ExportExcel(path.ToString(), value); - var rows = _importer.QueryXlsx(path.ToString()).ToList(); + var rows = _importer.QueryExcel(path.ToString()).ToList(); Assert.Equal("2022-01-22", rows[1].A); } } @@ -894,9 +894,9 @@ public void TestIssue312() new() { Value = 12345.6789}, new() { Value = null} ]; - _exporter.ExportXlsx(path.ToString(), value); + _exporter.ExportExcel(path.ToString(), value); - var rows = _importer.QueryXlsx(path.ToString()).ToList(); + var rows = _importer.QueryExcel(path.ToString()).ToList(); Assert.Equal("12,345.68", rows[1].A); } @@ -908,9 +908,9 @@ public void TestIssue312() new() { Value = 12345.6789}, new() { Value = null} ]; - _exporter.ExportXlsx(path.ToString(), value); + _exporter.ExportExcel(path.ToString(), value); - var rows = _importer.QueryXlsx(path.ToString()).ToList(); + var rows = _importer.QueryExcel(path.ToString()).ToList(); Assert.Equal("12,345.68", rows[1].A); } } @@ -931,7 +931,7 @@ public void TestIssue209() try { var path = PathHelper.GetFile("xlsx/TestIssue309.xlsx"); - var rows = _importer.QueryXlsx(path).ToList(); + var rows = _importer.QueryExcel(path).ToList(); } catch (MiniExcelInvalidCastException ex) { @@ -962,13 +962,13 @@ public void TestIssue318() { new { Name="github", Image=imageByte}, }; - _exporter.ExportXlsx(path.ToString(), value); + _exporter.ExportExcel(path.ToString(), value); // import to byte[] { const string expectedBase64 = "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAIAAAD9b0jDAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAEXRFWHRTb2Z0d2FyZQBTbmlwYXN0ZV0Xzt0AAALNSURBVEiJ7ZVLTBNBGMdndrfdIofy0ERbCgcFeYRuCy2JGOPNRA9qeIZS6YEEogQj0YMmGOqDSATxQaLRxKtRID4SgjGelUBpaQvGZ7kpII8aWtjd2dkdDxsJoS1pIh6M/k+z8833m/3+8+0OJISArRa15cT/0D8CZTYPe32+Zy+GxjzjMzOzAACDYafdZquqOG7hzJtkwUQthRC6cavv0eN+QRTBujUQQp1OV1dbffZMq1arTRaqKIok4eZTrSNjHqIo6gIIIQBgbQwpal+Z/f7dPo2GoaiNHtJut3vjPhBe7+kdfvW61Mq1nGyaX1xYjkRzsk2Z6Rm8IOTvzWs73SLwwqjHK4jCgf3lcV6VxGgiECji7AXm0gvtHYQQnue/zy8ghCRJWlxaWuV5Qsilq9cKzLYiiz04ORVLiHP6A4NPRQlhjLWsVpZlnU63Y3umRqNhGCYjPV3HsrIsMwyDsYQQejIwGEuIA/WMT1AAaDSahnoHTdPKL1vXPKVp2umoZVkWAOj1+ZOCzs7NKYTo9XqjYRcAgKIo9ZRUu9VxltGYZTQAAL5+m0kKijEmAPCrqyJCcRuOECKI4lL4ByEEYykpaE62iQIgurLi9wchhLIsry8fYwwh9PomwuEwACDbZEoKauHMgKJSU1PbOy6Hpqdpml5fPsMwn7+EOru6IYQAghKrJSloTVUFURSX02G3lRw+WulqbA4EJ9XQh4+f2s6dr65zhkLTEEIKwtqaylhCnG/fauFO1Nfde/Bw6Hm/0WiYevc+LU2vhlK2pQwNvwQAsCwrYexyOrji4lhCnOaXZRljXONoOHTk2Ju3I/5AcC3EC0JZ+cE9Bea8IqursUkUker4BsWBqpIk6aL7Sm4htzvfvByJqJORaDS3kMsvLuns6kYIJcpNCFU17pvouXlHEET1URDEnt7bo2OezbMS/vp+R3/PdfKPQ38Ccg0E/CDcpY8AAAAASUVORK5CYII="; - var rows = _importer.QueryXlsx(path.ToString(), true).ToList(); + var rows = _importer.QueryExcel(path.ToString(), true).ToList(); var actulBase64 = Convert.ToBase64String((byte[])rows[0].Image); Assert.Equal(expectedBase64, actulBase64); } @@ -976,7 +976,7 @@ public void TestIssue318() // import to base64 string { var config = new OpenXmlConfiguration { EnableConvertByteArray = false }; - var rows = _importer.QueryXlsx(path.ToString(), true, configuration: config).ToList(); + var rows = _importer.QueryExcel(path.ToString(), true, configuration: config).ToList(); var image = (string)rows[0].Image; Assert.StartsWith("@@@fileid@@@,xl/media/", image); } @@ -999,7 +999,7 @@ public void TestIssue304() new { Name="reddit", Image=File.ReadAllBytes(PathHelper.GetFile("images/reddit_logo.png"))}, new { Name="statck_overflow", Image=File.ReadAllBytes(PathHelper.GetFile("images/statck_overflow_logo.png"))}, }; - _exporter.ExportXlsx(path, value); + _exporter.ExportExcel(path, value); Assert.Contains("/xl/media/", SheetHelper.GetZipFileContent(path, "xl/drawings/_rels/drawing1.xml.rels")); Assert.Contains("ext cx=\"609600\" cy=\"190500\"", SheetHelper.GetZipFileContent(path, "xl/drawings/drawing1.xml")); @@ -1025,7 +1025,7 @@ public void TestIssueI4HL54() }; _templater.ApplyXlsxTemplate(path.ToString(), templatePath, value); - var rows = _importer.QueryXlsx(path.ToString(), true).ToList(); + var rows = _importer.QueryExcel(path.ToString(), true).ToList(); Assert.Equal("Hello World1", rows[0].Text); Assert.Equal("Hello World2", rows[1].Text); } @@ -1040,21 +1040,21 @@ public void TestIssue294() { using var path = AutoDeletingPath.Create(); var value = new[] { new { Name = " Jack" } }; - _exporter.ExportXlsx(path.ToString(), value); + _exporter.ExportExcel(path.ToString(), value); var sheetXml = SheetHelper.GetZipFileContent(path.ToString(), "xl/worksheets/sheet1.xml"); Assert.Contains("xml:space=\"preserve\"", sheetXml); } { using var path = AutoDeletingPath.Create(); var value = new[] { new { Name = "Ja ck" } }; - _exporter.ExportXlsx(path.ToString(), value); + _exporter.ExportExcel(path.ToString(), value); var sheetXml = SheetHelper.GetZipFileContent(path.ToString(), "xl/worksheets/sheet1.xml"); Assert.DoesNotContain("xml:space=\"preserve\"", sheetXml); } { using var path = AutoDeletingPath.Create(); var value = new[] { new { Name = "Jack " } }; - _exporter.ExportXlsx(path.ToString(), value); + _exporter.ExportExcel(path.ToString(), value); var sheetXml = SheetHelper.GetZipFileContent(path.ToString(), "xl/worksheets/sheet1.xml"); Assert.Contains("xml:space=\"preserve\"", sheetXml); } @@ -1091,7 +1091,7 @@ public void TestIssue190() { using var path = AutoDeletingPath.Create(); var value = new TestIssue190Dto[] { }; - _exporter.ExportXlsx(path.ToString(), value, configuration: new OpenXmlConfiguration { AutoFilter = false }); + _exporter.ExportExcel(path.ToString(), value, configuration: new OpenXmlConfiguration { AutoFilter = false }); var sheetXml = SheetHelper.GetZipFileContent(path.ToString(), "xl/worksheets/sheet1.xml"); Assert.DoesNotContain("", sheetXml); @@ -1099,7 +1099,7 @@ public void TestIssue190() { using var path = AutoDeletingPath.Create(); var value = new TestIssue190Dto[] { }; - _exporter.ExportXlsx(path.ToString(), value); + _exporter.ExportExcel(path.ToString(), value); var sheetXml = SheetHelper.GetZipFileContent(path.ToString(), "xl/worksheets/sheet1.xml"); Assert.Contains("", sheetXml); @@ -1111,7 +1111,7 @@ public void TestIssue190() new() { ID = 1, Name = "Jack", Age = 32 }, new() { ID = 2, Name = "Lisa", Age = 45 } ]; - _exporter.ExportXlsx(path.ToString(), value); + _exporter.ExportExcel(path.ToString(), value); var sheetXml = SheetHelper.GetZipFileContent(path.ToString(), "xl/worksheets/sheet1.xml"); Assert.Contains("", sheetXml); @@ -1137,8 +1137,8 @@ public void TestIssueI49RYZ() new() { Name="Lisa", UserType=null } ]; using var path = AutoDeletingPath.Create(); - _exporter.ExportXlsx(path.ToString(), values); - var rows = _importer.QueryXlsx(path.ToString(), true).ToList(); + _exporter.ExportExcel(path.ToString(), values); + var rows = _importer.QueryExcel(path.ToString(), true).ToList(); Assert.Equal("GeneralUser", rows[0].UserType); Assert.Equal("SuperAdministrator", rows[1].UserType); Assert.Equal("GeneralAdministrator", rows[2].UserType); @@ -1154,8 +1154,8 @@ public void TestIssue286() new() { E = TestIssue286Enum.VIP2 } ]; using var path = AutoDeletingPath.Create(); - _exporter.ExportXlsx(path.ToString(), values); - var rows = _importer.QueryXlsx(path.ToString(), true).ToList(); + _exporter.ExportExcel(path.ToString(), values); + var rows = _importer.QueryExcel(path.ToString(), true).ToList(); Assert.Equal("VIP1", rows[0].E); Assert.Equal("VIP2", rows[1].E); @@ -1196,7 +1196,7 @@ public void TestIssue283() { "sheet01", cn.ExecuteReader("select 'v1' col1") }, { "sheet02", cn.ExecuteReader("select 'v2' col1") } }; - var rows = _exporter.ExportXlsx(path.ToString(), sheets); + var rows = _exporter.ExportExcel(path.ToString(), sheets); Assert.Equal(2, rows.Length); } @@ -1212,25 +1212,25 @@ public void TestIssueI40QA5() { { var path = PathHelper.GetFile("/xlsx/TestIssueI40QA5_1.xlsx"); - var rows = _importer.QueryXlsx(path).ToList(); + var rows = _importer.QueryExcel(path).ToList(); Assert.Equal("E001", rows[0].Empno); Assert.Equal("E002", rows[1].Empno); } { var path = PathHelper.GetFile("/xlsx/TestIssueI40QA5_2.xlsx"); - var rows = _importer.QueryXlsx(path).ToList(); + var rows = _importer.QueryExcel(path).ToList(); Assert.Equal("E001", rows[0].Empno); Assert.Equal("E002", rows[1].Empno); } { var path = PathHelper.GetFile("/xlsx/TestIssueI40QA5_3.xlsx"); - var rows = _importer.QueryXlsx(path).ToList(); + var rows = _importer.QueryExcel(path).ToList(); Assert.Equal("E001", rows[0].Empno); Assert.Equal("E002", rows[1].Empno); } { var path = PathHelper.GetFile("/xlsx/TestIssueI40QA5_4.xlsx"); - var rows = _importer.QueryXlsx(path).ToList(); + var rows = _importer.QueryExcel(path).ToList(); Assert.Null(rows[0].Empno); Assert.Null(rows[1].Empno); } @@ -1252,8 +1252,8 @@ public void TestIssues133() var value = new DataTable(); value.Columns.Add("Id"); value.Columns.Add("Name"); - _exporter.ExportXlsx(path.ToString(), value); - var rows = _importer.QueryXlsx(path.ToString()).ToList(); + _exporter.ExportExcel(path.ToString(), value); + var rows = _importer.QueryExcel(path.ToString()).ToList(); Assert.Equal("Id", rows[0].A); Assert.Equal("Name", rows[0].B); @@ -1265,8 +1265,8 @@ public void TestIssues133() using var path = AutoDeletingPath.Create(); var value = Array.Empty(); - _exporter.ExportXlsx(path.ToString(), value); - var rows = _importer.QueryXlsx(path.ToString()).ToList(); + _exporter.ExportExcel(path.ToString(), value); + var rows = _importer.QueryExcel(path.ToString()).ToList(); Assert.Equal("Id", rows[0].A); Assert.Equal("Name", rows[0].B); @@ -1290,7 +1290,7 @@ public void TestIssueI45TF5_2() { var value = new[] { new Dictionary { { "Col1&Col2", "V1&V2" } } }; var path = PathHelper.GetTempPath(); - _exporter.ExportXlsx(path, value); + _exporter.ExportExcel(path, value); //System.Xml.XmlException : '<' is an unexpected token. The expected token is ';'. SheetHelper.GetZipFileContent(path, "xl/worksheets/sheet1.xml"); //check illegal format or not } @@ -1300,7 +1300,7 @@ public void TestIssueI45TF5_2() dt.Columns.Add("Col1&Col2"); dt.Rows.Add("V1&V2"); var path = PathHelper.GetTempPath(); - _exporter.ExportXlsx(path, dt); + _exporter.ExportExcel(path, dt); //System.Xml.XmlException : '<' is an unexpected token. The expected token is ';'. SheetHelper.GetZipFileContent(path, "xl/worksheets/sheet1.xml"); //check illegal format or not } @@ -1310,7 +1310,7 @@ public void TestIssueI45TF5_2() public void TestIssueI45TF5() { using var path = AutoDeletingPath.Create(); - _exporter.ExportXlsx(path.ToString(), new[] { new { C1 = "1&2;3,4", C2 = "1&2;3,4" } }); + _exporter.ExportExcel(path.ToString(), new[] { new { C1 = "1&2;3,4", C2 = "1&2;3,4" } }); var sheet1Xml = SheetHelper.GetZipFileContent(path.ToString(), "xl/worksheets/sheet1.xml"); Assert.DoesNotContain("", sheet1Xml); } @@ -1327,7 +1327,7 @@ public void TestIssue280() new() { ID = 2, Name = "Mike" } ]; using var path = AutoDeletingPath.Create(); - _exporter.ExportXlsx(path.ToString(), value); + _exporter.ExportExcel(path.ToString(), value); } private class TestIssue280Dto @@ -1345,7 +1345,7 @@ private class TestIssue280Dto public void TestIssue272() { var path = PathHelper.GetFile("/xlsx/TestIssue272.xlsx"); - Assert.Throws(() => _importer.QueryXlsx(path).ToList()); + Assert.Throws(() => _importer.QueryExcel(path).ToList()); } /// @@ -1355,7 +1355,7 @@ public void TestIssue272() public void TestIssue267() { var path = PathHelper.GetFile("/xlsx/TestIssue267.xlsx"); - var row = _importer.QueryXlsx(path).SingleOrDefault(); + var row = _importer.QueryExcel(path).SingleOrDefault(); Assert.Equal(10618, row!.A); Assert.Equal("2021-02-23", row.B); Assert.Equal(43.199999999999996, row.C); @@ -1398,7 +1398,7 @@ public void TestIssueI3X2ZL() try { var path = PathHelper.GetFile("xlsx/TestIssueI3X2ZL_datetime_error.xlsx"); - var rows = _importer.QueryXlsx(path, startCell: "B3").ToList(); + var rows = _importer.QueryExcel(path, startCell: "B3").ToList(); } catch (InvalidCastException ex) { @@ -1411,7 +1411,7 @@ public void TestIssueI3X2ZL() try { var path = PathHelper.GetFile("xlsx/TestIssueI3X2ZL_int_error.xlsx"); - var rows = _importer.QueryXlsx(path).ToList(); + var rows = _importer.QueryExcel(path).ToList(); } catch (InvalidCastException ex) { @@ -1447,7 +1447,7 @@ public void Issue255() } }; _templater.ApplyXlsxTemplate(path.ToString(), templatePath, value); - var rows = _importer.QueryXlsx(path.ToString()).ToList(); + var rows = _importer.QueryExcel(path.ToString()).ToList(); Assert.Equal("2021", rows[1].A.ToString()); Assert.Equal("2021", rows[1].B.ToString()); } @@ -1458,8 +1458,8 @@ public void Issue255() { new Issue255DTO { Time = new DateTime(2021, 01, 01) } }; - _exporter.ExportXlsx(path.ToString(), value); - var rows = _importer.QueryXlsx(path.ToString()).ToList(); + _exporter.ExportExcel(path.ToString(), value); + var rows = _importer.QueryExcel(path.ToString()).ToList(); Assert.Equal("2021", rows[1].A.ToString()); } } @@ -1481,7 +1481,7 @@ private class Issue255DTO public void Issue256() { var path = PathHelper.GetFile("xlsx/TestIssue256.xlsx"); - var rows = _importer.QueryXlsx(path, false).ToList(); + var rows = _importer.QueryExcel(path, false).ToList(); Assert.Equal(new DateTime(2003, 4, 16), rows[1].A); Assert.Equal(new DateTime(2004, 4, 16), rows[1].B); } @@ -1493,10 +1493,10 @@ public void Issue256() public void Issue242() { var path = PathHelper.GetFile("xls/TestIssue242.xls"); - Assert.Throws(() => _importer.QueryXlsx(path).ToList()); + Assert.Throws(() => _importer.QueryExcel(path).ToList()); using var stream = File.OpenRead(path); - Assert.Throws(() => _importer.QueryXlsx(stream).ToList()); + Assert.Throws(() => _importer.QueryExcel(stream).ToList()); } /// @@ -1511,9 +1511,9 @@ public void Issue243() new { Name = "Jack", Age = 25, InDate = new DateTime(2021,01,03) }, new { Name = "Henry", Age = 36, InDate = new DateTime(2020,05,03) }, }; - _exporter.ExportXlsx(path.ToString(), value); + _exporter.ExportExcel(path.ToString(), value); - var rows = _importer.QueryXlsx(path.ToString()).ToList(); + var rows = _importer.QueryExcel(path.ToString()).ToList(); Assert.Equal("Jack", rows[0].Name); Assert.Equal(25, rows[0].Age); Assert.Equal(new DateTime(2021, 01, 03), rows[0].InDate); @@ -1546,16 +1546,16 @@ public void Issue241() // csv { using var path = AutoDeletingPath.Create(ExcelType.Csv); - _exporter.ExportXlsx(path.ToString(), value); + _exporter.ExportExcel(path.ToString(), value); { - var rows = _importer.QueryXlsx(path.ToString(), true).ToList(); + var rows = _importer.QueryExcel(path.ToString(), true).ToList(); Assert.Equal(rows[0].InDate, "01 04, 2021"); Assert.Equal(rows[1].InDate, "04 05, 2020"); } { - var rows = _importer.QueryXlsx(path.ToString()).ToList(); + var rows = _importer.QueryExcel(path.ToString()).ToList(); Assert.Equal(rows[0].InDate, new DateTime(2021, 01, 04)); Assert.Equal(rows[1].InDate, new DateTime(2020, 04, 05)); } @@ -1564,16 +1564,16 @@ public void Issue241() // xlsx { using var path = AutoDeletingPath.Create(); - _exporter.ExportXlsx(path.ToString(), value); + _exporter.ExportExcel(path.ToString(), value); { - var rows = _importer.QueryXlsx(path.ToString(), true).ToList(); + var rows = _importer.QueryExcel(path.ToString(), true).ToList(); Assert.Equal(rows[0].InDate, "01 04, 2021"); Assert.Equal(rows[1].InDate, "04 05, 2020"); } { - var rows = _importer.QueryXlsx(path.ToString()).ToList(); + var rows = _importer.QueryExcel(path.ToString()).ToList(); Assert.Equal(rows[0].InDate, new DateTime(2021, 01, 04)); Assert.Equal(rows[1].InDate, new DateTime(2020, 04, 05)); } @@ -1601,7 +1601,7 @@ public void Issue132() new { name = "Henry", Age = 36, InDate = new DateTime(2020,05,03)}, }; - _exporter.ExportXlsx(path.ToString(), value); + _exporter.ExportExcel(path.ToString(), value); } { @@ -1615,7 +1615,7 @@ public void Issue132() { TableStyles = TableStyles.None }; - _exporter.ExportXlsx(path.ToString(), value, configuration: config); + _exporter.ExportExcel(path.ToString(), value, configuration: config); } { @@ -1627,7 +1627,7 @@ public void Issue132() new { name = "Henry", Age = 36, InDate = new DateTime(2020,05,03)}, }) ); - _exporter.ExportXlsx(path.ToString(), value); + _exporter.ExportExcel(path.ToString(), value); } } @@ -1657,7 +1657,7 @@ public void Issue235() dataSet.Tables.Add(users); dataSet.Tables.Add(department); - var rowsWritten = _exporter.ExportXlsx(path.ToString(), dataSet); + var rowsWritten = _exporter.ExportExcel(path.ToString(), dataSet); Assert.Equal(2, rowsWritten.Length); Assert.Equal(2, rowsWritten[0]); @@ -1666,14 +1666,14 @@ public void Issue235() Assert.Equal("department", sheetNames[1]); { - var rows = _importer.QueryXlsx(path.ToString(), true, sheetName: "users").ToList(); + var rows = _importer.QueryExcel(path.ToString(), true, sheetName: "users").ToList(); Assert.Equal("Jack", rows[0].Name); Assert.Equal(25, rows[0].Age); Assert.Equal("Mike", rows[1].Name); Assert.Equal(44, rows[1].Age); } { - var rows = _importer.QueryXlsx(path.ToString(), true, sheetName: "department").ToList(); + var rows = _importer.QueryExcel(path.ToString(), true, sheetName: "department").ToList(); Assert.Equal("01", rows[0].ID); Assert.Equal("HR", rows[0].Name); Assert.Equal("02", rows[1].ID); @@ -1689,7 +1689,7 @@ public void Issue233() { var path = PathHelper.GetFile("xlsx/TestIssue233.xlsx"); #pragma warning disable CS0618 // Type or member is obsolete - var dt = _importer.QueryXlsxAsDataTable(path); + var dt = _importer.QueryExcelAsDataTable(path); #pragma warning restore CS0618 var rows = dt.Rows; @@ -1710,9 +1710,9 @@ public void Issue237() new{ id="1,2,3"}, }; using var path = AutoDeletingPath.Create(ExcelType.Csv); - _exporter.ExportXlsx(path.ToString(), value); + _exporter.ExportExcel(path.ToString(), value); - var rows = _importer.QueryXlsx(path.ToString(), true).ToList(); + var rows = _importer.QueryExcel(path.ToString(), true).ToList(); Assert.Equal("\"\"1,2,3\"\"", rows[0].id); Assert.Equal("1,2,3", rows[1].id); @@ -1742,21 +1742,21 @@ public void Issue234() ["users"] = users, ["department"] = department }; - _exporter.ExportXlsx(path, sheets); + _exporter.ExportExcel(path, sheets); var sheetNames = _importer.GetSheetNames(path); Assert.Equal("users", sheetNames[0]); Assert.Equal("department", sheetNames[1]); { - var rows = _importer.QueryXlsx(path, true, sheetName: "users").ToList(); + var rows = _importer.QueryExcel(path, true, sheetName: "users").ToList(); Assert.Equal("Jack", rows[0].Name); Assert.Equal(25, rows[0].Age); Assert.Equal("Mike", rows[1].Name); Assert.Equal(44, rows[1].Age); } { - var rows = _importer.QueryXlsx(path, true, sheetName: "department").ToList(); + var rows = _importer.QueryExcel(path, true, sheetName: "department").ToList(); Assert.Equal("01", rows[0].ID); Assert.Equal("HR", rows[0].Name); Assert.Equal("02", rows[1].ID); @@ -1811,8 +1811,8 @@ public void Issue230() using (var reader = cmd3.ExecuteReader(CommandBehavior.CloseConnection)) { using var path = AutoDeletingPath.Create(); - _exporter.ExportXlsx(path.ToString(), reader, printHeader: true); - var rows = _importer.QueryXlsx(path.ToString(), true).ToList(); + _exporter.ExportExcel(path.ToString(), reader, printHeader: true); + var rows = _importer.QueryExcel(path.ToString(), true).ToList(); Assert.Equal(1, rows[0].id); Assert.Equal(2, rows[1].id); } @@ -1827,7 +1827,7 @@ public void Issue229() { var path = PathHelper.GetFile("xlsx/TestIssue229.xlsx"); #pragma warning disable CS0618 // Type or member is obsolete - using var dt = _importer.QueryXlsxAsDataTable(path); + using var dt = _importer.QueryExcelAsDataTable(path); #pragma warning restore CS0618 foreach (DataColumn column in dt.Columns) { @@ -1850,7 +1850,7 @@ public void Issue122() { var path = PathHelper.GetFile("xlsx/TestIssue122.xlsx"); { - var rows = _importer.QueryXlsx(path, useHeaderRow: true, configuration: config).ToList(); + var rows = _importer.QueryExcel(path, useHeaderRow: true, configuration: config).ToList(); Assert.Equal("HR", rows[0].Department); Assert.Equal("HR", rows[1].Department); Assert.Equal("HR", rows[2].Department); @@ -1863,7 +1863,7 @@ public void Issue122() { var path = PathHelper.GetFile("xlsx/TestIssue122_2.xlsx"); { - var rows = _importer.QueryXlsx(path, useHeaderRow: true, configuration: config).ToList(); + var rows = _importer.QueryExcel(path, useHeaderRow: true, configuration: config).ToList(); Assert.Equal("V1", rows[2].Test1); Assert.Equal("V2", rows[5].Test2); Assert.Equal("V3", rows[1].Test3); @@ -1883,14 +1883,14 @@ public void Issue227() { { var path = PathHelper.GetTempPath("xlsm"); - Assert.Throws(() => _exporter.ExportXlsx(path, new[] { new { V = "A1" }, new { V = "A2" } })); + Assert.Throws(() => _exporter.ExportExcel(path, new[] { new { V = "A1" }, new { V = "A2" } })); File.Delete(path); } { var path = PathHelper.GetFile("xlsx/TestIssue227.xlsm"); { - var rows = _importer.QueryXlsx(path).ToList(); + var rows = _importer.QueryExcel(path).ToList(); Assert.Equal(100, rows.Count); Assert.Equal(Guid.Parse("78DE23D2-DCB6-BD3D-EC67-C112BBC322A2"), rows[0].ID); @@ -1903,7 +1903,7 @@ public void Issue227() } { using var stream = File.OpenRead(path); - var rows = _importer.QueryXlsx(stream).ToList(); + var rows = _importer.QueryExcel(stream).ToList(); Assert.Equal(100, rows.Count); Assert.Equal(Guid.Parse("78DE23D2-DCB6-BD3D-EC67-C112BBC322A2"), rows[0].ID); @@ -1946,10 +1946,10 @@ public void Issue223() new() { { "A", Guid.NewGuid() }, { "B", "HelloWorld" } } ]; using var path = AutoDeletingPath.Create(); - _exporter.ExportXlsx(path.ToString(), value); + _exporter.ExportExcel(path.ToString(), value); #pragma warning disable CS0618 // Type or member is obsolete - using var dt = _importer.QueryXlsxAsDataTable(path.ToString()); + using var dt = _importer.QueryExcelAsDataTable(path.ToString()); #pragma warning restore CS0618 var columns = dt.Columns; Assert.Equal(typeof(object), columns[0].DataType); @@ -1967,7 +1967,7 @@ public void Issue223() public void Issue222() { var path = PathHelper.GetFile("xlsx/TestIssue222.xlsx"); - var rows = _importer.QueryXlsx(path).ToList(); + var rows = _importer.QueryExcel(path).ToList(); Assert.Equal(typeof(DateTime), rows[1].A.GetType()); Assert.Equal(new DateTime(2021, 4, 29), rows[1].A); } @@ -1981,7 +1981,7 @@ public void Issue147() { { var path = PathHelper.GetFile("xlsx/TestIssue147.xlsx"); - var rows = _importer.QueryXlsx(path, useHeaderRow: false, startCell: "C3", sheetName: "Sheet1").ToList(); + var rows = _importer.QueryExcel(path, useHeaderRow: false, startCell: "C3", sheetName: "Sheet1").ToList(); Assert.Equal(["C", "D", "E"], (rows[0] as IDictionary)?.Keys); Assert.Equal(["Column1", "Column2", "Column3"], new[] { rows[0].C as string, rows[0].D as string, rows[0].E as string }); @@ -1995,13 +1995,13 @@ public void Issue147() Assert.Equal(11, rows.Count); - var columns = _importer.GetXlsxColumns(path, startCell: "C3"); + var columns = _importer.GetExcelColumns(path, startCell: "C3"); Assert.Equal(["C", "D", "E"], columns); } { var path = PathHelper.GetFile("xlsx/TestIssue147.xlsx"); - var rows = _importer.QueryXlsx(path, useHeaderRow: true, startCell: "C3", sheetName: "Sheet1").ToList(); + var rows = _importer.QueryExcel(path, useHeaderRow: true, startCell: "C3", sheetName: "Sheet1").ToList(); Assert.Equal(["Column1", "Column2", "Column3"], (rows[0] as IDictionary)?.Keys); Assert.Equal(["C4", "D4", "E4"], new[] { rows[0].Column1 as string, rows[0].Column2 as string, rows[0].Column3 as string }); @@ -2013,7 +2013,7 @@ public void Issue147() Assert.Equal(10, rows.Count); - var columns = _importer.GetXlsxColumns(path, useHeaderRow: true, startCell: "C3"); + var columns = _importer.GetExcelColumns(path, useHeaderRow: true, startCell: "C3"); Assert.Equal(["Column1", "Column2", "Column3"], columns); } } @@ -2032,8 +2032,8 @@ public void Issue211() using var connection = new SQLiteConnection(connectionString); var reader = connection.ExecuteReader(@"select 1 Test1,2 Test2 union all select 3 , 4 union all select 5 ,6"); - _exporter.ExportXlsx(path.ToString(), reader); - var rows = _importer.QueryXlsx(path.ToString(), true).ToList(); + _exporter.ExportExcel(path.ToString(), reader); + var rows = _importer.QueryExcel(path.ToString(), true).ToList(); Assert.Equal(1.0, rows[0].Test1); Assert.Equal(2.0, rows[0].Test2); @@ -2053,11 +2053,11 @@ public void Issue216() new { Test1 = "1", Test2 = 2 }, new { Test1 = "3", Test2 = 4 } }; - _exporter.ExportXlsx(path.ToString(), value); + _exporter.ExportExcel(path.ToString(), value); { #pragma warning disable CS0618 // Type or member is obsolete - using var table = _importer.QueryXlsxAsDataTable(path.ToString()); + using var table = _importer.QueryExcelAsDataTable(path.ToString()); #pragma warning restore CS0618 Assert.Equal("Test1", table.Columns[0].ColumnName); Assert.Equal("Test2", table.Columns[1].ColumnName); @@ -2069,7 +2069,7 @@ public void Issue216() { #pragma warning disable CS0618 // Type or member is obsolete - using var dt = _importer.QueryXlsxAsDataTable(path.ToString(), false); + using var dt = _importer.QueryExcelAsDataTable(path.ToString(), false); #pragma warning restore CS0618 Assert.Equal("Test1", dt.Rows[0]["A"]); Assert.Equal("Test2", dt.Rows[0]["B"]); @@ -2090,18 +2090,18 @@ public void IssueI3OSKV() { using var path = AutoDeletingPath.Create(); var value = new[] { new { Test = "12345678901234567890" } }; - _exporter.ExportXlsx(path.ToString(), value); + _exporter.ExportExcel(path.ToString(), value); - var A2 = _importer.QueryXlsx(path.ToString(), true).First().Test; + var A2 = _importer.QueryExcel(path.ToString(), true).First().Test; Assert.Equal("12345678901234567890", A2); } { using var path = AutoDeletingPath.Create(); var value = new[] { new { Test = 123456.789 } }; - _exporter.ExportXlsx(path.ToString(), value); + _exporter.ExportExcel(path.ToString(), value); - var A2 = _importer.QueryXlsx(path.ToString(), true).First().Test; + var A2 = _importer.QueryExcel(path.ToString(), true).First().Test; Assert.Equal(123456.789, A2); } } @@ -2115,7 +2115,7 @@ public void IssueI3OSKV() public void Issue220() { var path = PathHelper.GetFile("xlsx/TestIssue220.xlsx"); - var rows = _importer.QueryXlsx(path, useHeaderRow: true); + var rows = _importer.QueryExcel(path, useHeaderRow: true); var result = rows .GroupBy(s => s.PRT_ID) .Select(g => new @@ -2139,8 +2139,8 @@ public void Issue220() public void Issue215() { using var stream = new MemoryStream(); - _exporter.ExportXlsx(stream, new[] { new { V = "test1" }, new { V = "test2" } }); - var rows = _importer.QueryXlsx(stream, true).ToList(); + _exporter.ExportExcel(stream, new[] { new { V = "test1" }, new { V = "test2" } }); + var rows = _importer.QueryExcel(stream, true).ToList(); Assert.Equal("test1", rows[0].V); Assert.Equal("test2", rows[1].V); @@ -2163,9 +2163,9 @@ public void Issue217() // openxml { using var path = AutoDeletingPath.Create(); - _exporter.ExportXlsx(path.ToString(), table); + _exporter.ExportExcel(path.ToString(), table); - var rows = _importer.QueryXlsx(path.ToString()).ToList(); + var rows = _importer.QueryExcel(path.ToString()).ToList(); Assert.Equal("Name", rows[0].B); Assert.Equal("Limit", rows[0].C); } @@ -2173,16 +2173,16 @@ public void Issue217() // csv { using var path = AutoDeletingPath.Create(ExcelType.Csv); - _exporter.ExportXlsx(path.ToString(), table); + _exporter.ExportExcel(path.ToString(), table); - var rows = _importer.QueryXlsx(path.ToString()).ToList(); + var rows = _importer.QueryExcel(path.ToString()).ToList(); Assert.Equal("Name", rows[0].B); Assert.Equal("Limit", rows[0].C); } } /// - /// _ _exporter.ExportXlsx(path, table,sheetName:“Name”) ,the actual sheetName is Sheet1 + /// _ _exporter.ExportExcel(path, table,sheetName:“Name”) ,the actual sheetName is Sheet1 /// https://github.com/mini-software/MiniExcel/issues/212 /// [Fact] @@ -2190,7 +2190,7 @@ public void Issue212() { const string sheetName = "Demo"; using var path = AutoDeletingPath.Create(); - _exporter.ExportXlsx(path.ToString(), new[] { new { x = 1, y = 2 } }, sheetName: sheetName); + _exporter.ExportExcel(path.ToString(), new[] { new { x = 1, y = 2 } }, sheetName: sheetName); var actualSheetName = _importer.GetSheetNames(path.ToString()).ToList()[0]; Assert.Equal(sheetName, actualSheetName); @@ -2219,7 +2219,7 @@ public void Issue207() }; _templater.ApplyXlsxTemplate(path, tempaltePath, value); - var rows = _importer.QueryXlsx(path).ToList(); + var rows = _importer.QueryExcel(path).ToList(); Assert.Equal("項目1", rows[0].A); Assert.Equal("[]內容1,[]內容2,[]內容3,[]內容4,[]內容5", rows[0].B); @@ -2263,7 +2263,7 @@ public void Issue207() }; _templater.ApplyXlsxTemplate(path, tempaltePath, value); - var rows = _importer.QueryXlsx(path).ToList(); + var rows = _importer.QueryExcel(path).ToList(); Assert.Equal("項目1", rows[0].A); Assert.Equal("[]內容1,[]內容2,[]內容3,[]內容4,[]內容5", rows[0].C); @@ -2291,7 +2291,7 @@ public void Issue87() Tests = Enumerable.Range(1, 5).Select((_, i) => new { test1 = i, test2 = i }) }; - var rows = _importer.QueryXlsx(templatePath).ToList(); + var rows = _importer.QueryExcel(templatePath).ToList(); _templater.ApplyXlsxTemplate(path.ToString(), templatePath, value); } @@ -2302,7 +2302,7 @@ public void Issue87() public void Issue208() { const string path = "../../../../../samples/xlsx/TestIssue208.xlsx"; - var columns = _importer.GetXlsxColumns(path).ToList(); + var columns = _importer.GetExcelColumns(path).ToList(); Assert.Equal(16384, columns.Count); Assert.Equal("XFD", columns[16383]); } @@ -2382,7 +2382,7 @@ public void Issue193() foreach (var sheetName in _importer.GetSheetNames(path)) { - var rows = _importer.QueryXlsx(path, sheetName: sheetName).ToList(); + var rows = _importer.QueryExcel(path, sheetName: sheetName).ToList(); Assert.Equal(9, rows.Count); Assert.Equal("FooCompany", rows[0].A); @@ -2430,7 +2430,7 @@ public void Issue193() } }; _templater.ApplyXlsxTemplate(path.ToString(), templatePath, value); - var rows = _importer.QueryXlsx(path.ToString()).ToList(); + var rows = _importer.QueryExcel(path.ToString()).ToList(); Assert.Equal("FooCompany", rows[0].A); Assert.Equal("Jack", rows[2].B); @@ -2461,19 +2461,19 @@ public void Issue150() { var path = Path.Combine(Path.GetTempPath(), $"{Guid.NewGuid()}.xlsx"); - Assert.Throws(() => _exporter.ExportXlsx(path, new[] { 1, 2 })); + Assert.Throws(() => _exporter.ExportExcel(path, new[] { 1, 2 })); File.Delete(path); - Assert.Throws(() => _exporter.ExportXlsx(path, new[] { "1", "2" })); + Assert.Throws(() => _exporter.ExportExcel(path, new[] { "1", "2" })); File.Delete(path); - Assert.Throws(() => _exporter.ExportXlsx(path, new[] { '1', '2' })); + Assert.Throws(() => _exporter.ExportExcel(path, new[] { '1', '2' })); File.Delete(path); - Assert.Throws(() => _exporter.ExportXlsx(path, new[] { DateTime.Now })); + Assert.Throws(() => _exporter.ExportExcel(path, new[] { DateTime.Now })); File.Delete(path); - Assert.Throws(() => _exporter.ExportXlsx(path, new[] { Guid.NewGuid() })); + Assert.Throws(() => _exporter.ExportExcel(path, new[] { Guid.NewGuid() })); File.Delete(path); } @@ -2523,9 +2523,9 @@ public void Issue157() } ] """); - _exporter.ExportXlsx(path, input); + _exporter.ExportExcel(path, input); - var rows = _importer.QueryXlsx(path, sheetName: "Sheet1").ToList(); + var rows = _importer.QueryExcel(path, sheetName: "Sheet1").ToList(); Assert.Equal(6, rows.Count); Assert.Equal("Sheet1", _importer.GetSheetNames(path).First()); @@ -2538,7 +2538,7 @@ public void Issue157() const string path = "../../../../../samples/xlsx/TestIssue157.xlsx"; { - var rows = _importer.QueryXlsx(path, sheetName: "Sheet1").ToList(); + var rows = _importer.QueryExcel(path, sheetName: "Sheet1").ToList(); Assert.Equal(6, rows.Count); Assert.Equal("Sheet1", _importer.GetSheetNames(path).First()); } @@ -2550,7 +2550,7 @@ public void Issue157() } { - var rows = _importer.QueryXlsx(path, sheetName: "Sheet1").ToList(); + var rows = _importer.QueryExcel(path, sheetName: "Sheet1").ToList(); Assert.Equal(5, rows.Count); Assert.Equal(Guid.Parse("78DE23D2-DCB6-BD3D-EC67-C112BBC322A2"), rows[0].ID); @@ -2583,7 +2583,7 @@ public void Issue149() { const string path = "../../../../../samples/xlsx/TestIssue149.xlsx"; - var rows = _importer.QueryXlsx(path).Select(s => (string)s.A).ToList(); + var rows = _importer.QueryExcel(path).Select(s => (string)s.A).ToList(); for (int i = 0; i < chars.Length; i++) { //output.WriteLine($"{i} , {chars[i]} , {rows[i]}"); @@ -2597,9 +2597,9 @@ public void Issue149() { using var path = AutoDeletingPath.Create(); var input = chars.Select(s => new { Test = s.ToString() }); - _exporter.ExportXlsx(path.ToString(), input); + _exporter.ExportExcel(path.ToString(), input); - var rows = _importer.QueryXlsx(path.ToString(), true).Select(s => (string)s.Test).ToList(); + var rows = _importer.QueryExcel(path.ToString(), true).Select(s => (string)s.Test).ToList(); for (int i = 0; i < chars.Length; i++) { _output.WriteLine($"{i}, {chars[i]}, {rows[i]}"); @@ -2613,9 +2613,9 @@ public void Issue149() { using var path = AutoDeletingPath.Create(); var input = chars.Select(s => new { Test = s.ToString() }); - _exporter.ExportXlsx(path.ToString(), input); + _exporter.ExportExcel(path.ToString(), input); - var rows = _importer.QueryXlsx(path.ToString()).Select(s => s.Test).ToList(); + var rows = _importer.QueryExcel(path.ToString()).Select(s => s.Test).ToList(); for (int i = 0; i < chars.Length; i++) { _output.WriteLine($"{i}, {chars[i]}, {rows[i]}"); @@ -2639,7 +2639,7 @@ private class Issue149VO public void Issue153() { const string path = "../../../../../samples/xlsx/TestIssue153.xlsx"; - var rows = _importer.QueryXlsx(path, true).First() as IDictionary; + var rows = _importer.QueryExcel(path, true).First() as IDictionary; Assert.Equal( [ "序号", "代号", "新代号", "名称", "XXX", "部门名称", "单位", "ERP工时 (小时)A", "工时(秒) A/3600", "标准人工工时(秒)", @@ -2656,7 +2656,7 @@ public void Issue137() const string path = "../../../../../samples/xlsx/TestIssue137.xlsx"; { - var rows = _importer.QueryXlsx(path).ToList(); + var rows = _importer.QueryExcel(path).ToList(); var first = rows[0] as IDictionary; // https://user-images.githubusercontent.com/12729184/113266322-ba06e400-9307-11eb-9521-d36abfda75cc.png Assert.Equal(["A", "B", "C", "D", "E", "F", "G", "H"], first?.Keys.ToArray()); Assert.Equal(11, rows.Count); @@ -2690,7 +2690,7 @@ public void Issue137() // dynamic query with head { - var rows = _importer.QueryXlsx(path, true).ToList(); + var rows = _importer.QueryExcel(path, true).ToList(); var first = rows[0] as IDictionary; //![image](https://user-images.githubusercontent.com/12729184/113266322-ba06e400-9307-11eb-9521-d36abfda75cc.png) Assert.Equal(["比例", "商品", "滿倉口數", "0", "1為港幣 0為台幣"], first?.Keys.ToArray()); Assert.Equal(10, rows.Count); @@ -2710,7 +2710,7 @@ public void Issue137() } { - var rows = _importer.QueryXlsx(path).ToList(); + var rows = _importer.QueryExcel(path).ToList(); Assert.Equal(10, rows.Count); { var row = rows[0]; @@ -2742,7 +2742,7 @@ public void Issue138() { const string path = "../../../../../samples/xlsx/TestIssue138.xlsx"; { - var rows = _importer.QueryXlsx(path, true).ToList(); + var rows = _importer.QueryExcel(path, true).ToList(); Assert.Equal(6, rows.Count); foreach (var index in new[] { 0, 2, 5 }) @@ -2767,7 +2767,7 @@ public void Issue138() } { - var rows = _importer.QueryXlsx(path).ToList(); + var rows = _importer.QueryExcel(path).ToList(); Assert.Equal(6, rows.Count); Assert.Equal(new DateTime(2021, 3, 1), rows[0].Date); @@ -2833,7 +2833,7 @@ public void IssueI50VD5() ["A"] = list1, ["B"] = list2, }; - _exporter.ExportXlsx(path, sheets); + _exporter.ExportExcel(path, sheets); { Assert.Contains("/xl/media/", SheetHelper.GetZipFileContent(path, "xl/drawings/_rels/drawing1.xml.rels")); @@ -2876,7 +2876,7 @@ public void Issue422() var enumerableWithCount = new Issue422Enumerable(items); using var path = AutoDeletingPath.Create(); - _exporter.ExportXlsx(path.ToString(), enumerableWithCount); + _exporter.ExportExcel(path.ToString(), enumerableWithCount); Assert.Equal(1, enumerableWithCount.GetEnumeratorCount); } @@ -2920,7 +2920,7 @@ public void Issue527() using var path = AutoDeletingPath.Create(); _templater.ApplyXlsxTemplate(path.FilePath, template, value); - var rows = _importer.QueryXlsx(path.FilePath).ToList(); + var rows = _importer.QueryExcel(path.FilePath).ToList(); Assert.Equal("General User", rows[1].B); Assert.Equal("General Administrator", rows[2].B); } @@ -2954,9 +2954,9 @@ WITH test('Id', 'Name') AS ( using var reader = cmd.ExecuteReader(); using var path = AutoDeletingPath.Create(); - _exporter.ExportXlsx(path.FilePath, reader, configuration: excelconfig, overwriteFile: true); + _exporter.ExportExcel(path.FilePath, reader, configuration: excelconfig, overwriteFile: true); - var rows = _importer.QueryXlsx(path.FilePath).ToList(); + var rows = _importer.QueryExcel(path.FilePath).ToList(); Assert.All(rows, x => Assert.Single(x)); Assert.Equal("Name", rows[0].A); } @@ -2993,13 +2993,13 @@ public void Issue585() { const string path = "../../../../../samples/xlsx/TestIssue585.xlsx"; - var items1 = _importer.QueryXlsx(path); + var items1 = _importer.QueryExcel(path); Assert.Equal(2, items1.Count()); - var items2 = _importer.QueryXlsx(path); + var items2 = _importer.QueryExcel(path); Assert.Equal(2, items2.Count()); - var items3 = _importer.QueryXlsx(path); + var items3 = _importer.QueryExcel(path); Assert.Equal(2, items3.Count()); } @@ -3014,8 +3014,8 @@ public void Issue_542() { const string path = "../../../../../samples/xlsx/TestIssue542.xlsx"; - var resultWithoutFirstRow = _importer.QueryXlsx(path).ToList(); - var resultWithFirstRow = _importer.QueryXlsx(path, treatHeaderAsData: true).ToList(); + var resultWithoutFirstRow = _importer.QueryExcel(path).ToList(); + var resultWithFirstRow = _importer.QueryExcel(path, treatHeaderAsData: true).ToList(); Assert.Equal(15, resultWithoutFirstRow.Count); Assert.Equal(16, resultWithFirstRow.Count); @@ -3088,7 +3088,7 @@ public void TestIssue627() using var path = AutoDeletingPath.Create(); var value = new[] { new { long2 = "1550432695793487872" } }; - var rowsWritten = _exporter.ExportXlsx(path.ToString(), value, configuration: config); + var rowsWritten = _exporter.ExportExcel(path.ToString(), value, configuration: config); Assert.Single(rowsWritten); Assert.Equal(1, rowsWritten[0]); @@ -3124,7 +3124,7 @@ public void Issue632_1() string.Concat(nameof(MiniExcelIssueTests), "_", nameof(Issue632_1), ".xlsx") ); - _exporter.ExportXlsx(path, values, configuration: config, overwriteFile: true); + _exporter.ExportExcel(path, values, configuration: config, overwriteFile: true); File.Delete(path); } @@ -3149,7 +3149,7 @@ static IEnumerable GetTestData() using var memoryStream = new MemoryStream(); var testData = GetTestData(); - var rowsWritten = _exporter.ExportXlsx(memoryStream, testData, configuration: new OpenXmlConfiguration + var rowsWritten = _exporter.ExportExcel(memoryStream, testData, configuration: new OpenXmlConfiguration { FastMode = true }); @@ -3158,7 +3158,7 @@ static IEnumerable GetTestData() memoryStream.Position = 0; - var queryData = _importer.QueryXlsx(memoryStream).ToList(); + var queryData = _importer.QueryExcel(memoryStream).ToList(); Assert.Equal(testData.Count(), queryData.Count); @@ -3187,14 +3187,14 @@ static IEnumerable GetTestData() using var memoryStream = new MemoryStream(); var testData = GetTestData(); - await _exporter.ExportXlsxAsync(memoryStream, testData, configuration: new OpenXmlConfiguration + await _exporter.ExportExcelAsync(memoryStream, testData, configuration: new OpenXmlConfiguration { FastMode = true, }); memoryStream.Position = 0; - var queryData = _importer.QueryXlsxAsync(memoryStream).ToBlockingEnumerable().ToList(); + var queryData = _importer.QueryExcelAsync(memoryStream).ToBlockingEnumerable().ToList(); Assert.Equal(testData.Count(), queryData.Count); @@ -3212,10 +3212,10 @@ public void Issue_686() { var path = PathHelper.GetFile("xlsx/TestIssue686.xlsx"); Assert.Throws(() => - _importer.QueryRangeXlsx(path, useHeaderRow: false, startCell: "ZZFF10", endCell: "ZZFF11").First()); + _importer.QueryExcelRange(path, useHeaderRow: false, startCell: "ZZFF10", endCell: "ZZFF11").First()); Assert.Throws(() => - _importer.QueryRangeXlsx(path, useHeaderRow: false, startCell: "ZZFF@@10", endCell: "ZZFF@@11").First()); + _importer.QueryExcelRange(path, useHeaderRow: false, startCell: "ZZFF@@10", endCell: "ZZFF@@11").First()); } [Fact] @@ -3225,9 +3225,9 @@ public void Test_Issue_693_SaveSheetWithLongName() using var path2 = AutoDeletingPath.Create(); List> data = [new() { ["First"] = 1, ["Second"] = 2 }]; - Assert.Throws(() => _exporter.ExportXlsx(path1.ToString(), data, sheetName: "Some Really Looooooooooong Sheet Name")); - _exporter.ExportXlsx(path2.ToString(), new List>()); - Assert.Throws(() => _exporter.InsertXlsxSheet(path2.ToString(), data, sheetName: "Some Other Very Looooooong Sheet Name")); + Assert.Throws(() => _exporter.ExportExcel(path1.ToString(), data, sheetName: "Some Really Looooooooooong Sheet Name")); + _exporter.ExportExcel(path2.ToString(), new List>()); + Assert.Throws(() => _exporter.InsertExcelSheet(path2.ToString(), data, sheetName: "Some Other Very Looooooong Sheet Name")); } private class Issue697 @@ -3241,8 +3241,8 @@ private class Issue697 public void Test_Issue_697_EmptyRowsStronglyTypedQuery() { const string path = "../../../../../samples/xlsx/TestIssue697.xlsx"; - var rowsIgnoreEmpty = _importer.QueryXlsx(path, configuration: new OpenXmlConfiguration { IgnoreEmptyRows = true }).ToList(); - var rowsCountEmpty = _importer.QueryXlsx(path).ToList(); + var rowsIgnoreEmpty = _importer.QueryExcel(path, configuration: new OpenXmlConfiguration { IgnoreEmptyRows = true }).ToList(); + var rowsCountEmpty = _importer.QueryExcel(path).ToList(); Assert.Equal(4, rowsIgnoreEmpty.Count); Assert.Equal(5, rowsCountEmpty.Count); } @@ -3252,13 +3252,13 @@ public void Issue_710() { var values = new[] { new { Column1 = "MiniExcel", Column2 = 1, Column3 = "Test" } }; using var memoryStream = new MemoryStream(); - _exporter.ExportXlsx(memoryStream, values, configuration: new OpenXmlConfiguration + _exporter.ExportExcel(memoryStream, values, configuration: new OpenXmlConfiguration { FastMode = true }); memoryStream.Position = 0; - using var dataReader = _importer.GetXlsxDataReader(memoryStream, useHeaderRow: false); + using var dataReader = _importer.GetExcelDataReader(memoryStream, useHeaderRow: false); dataReader.Read(); for (int i = 0; i < dataReader.FieldCount; i++) @@ -3300,7 +3300,7 @@ public void TestIssue750() }; _templater.ApplyXlsxTemplate(path.ToString(), templatePath, data); - var rows = _importer.QueryXlsx(path.ToString()) + var rows = _importer.QueryExcel(path.ToString()) .Skip(1453) .Take(2) .ToList(); @@ -3359,7 +3359,7 @@ public void TestIssue751() public void TestIssue763() { var path = PathHelper.GetFile("xlsx/TestIssue763.xlsx"); - var rows = _importer.QueryRangeXlsx(path, startCell: "A3", endCell: "J3").ToArray(); + var rows = _importer.QueryExcelRange(path, startCell: "A3", endCell: "J3").ToArray(); Assert.Equal("A3", rows[0].A); Assert.Equal(null, rows[0].J); } @@ -3389,7 +3389,7 @@ public void TestIssue768() }; _templater.ApplyXlsxTemplate(path.ToString(), templatePath, data); - var rows = _importer.QueryXlsx(path.ToString(), startCell: "A16").ToList(); + var rows = _importer.QueryExcel(path.ToString(), startCell: "A16").ToList(); Assert.Equal(list[0].value1.ToString(), rows[0].A.ToString()); Assert.Equal(list[1].value1.ToString(), rows[1].A.ToString()); @@ -3424,7 +3424,7 @@ public void TestIssue186() } ]; - _exporter.AddPictureXlsx(path.FilePath, images); + _exporter.AddExcelPicture(path.FilePath, images); } /// @@ -3453,7 +3453,7 @@ public void TestIssue771() }; _templater.ApplyXlsxTemplate(path.FilePath, template, value); - var rows = _importer.QueryXlsx(path.FilePath).ToList(); + var rows = _importer.QueryExcel(path.FilePath).ToList(); Assert.Equal("2025-1", rows[2].B); Assert.Equal(null, rows[3].B); @@ -3471,7 +3471,7 @@ public void TestIssue771() public void TestIssue772() { var path = PathHelper.GetFile("xlsx/TestIssue772.xlsx"); - var rows = _importer.QueryXlsx(path, sheetName: "Supply plan(daily)", startCell: "A1") + var rows = _importer.QueryExcel(path, sheetName: "Supply plan(daily)", startCell: "A1") .Cast>() .ToArray(); @@ -3496,7 +3496,7 @@ public void TestIssue773() using var path = AutoDeletingPath.Create(); _templater.ApplyXlsxTemplate(path.FilePath, templatePath, fill); - var rows = _importer.QueryXlsx(path.FilePath).ToList(); + var rows = _importer.QueryExcel(path.FilePath).ToList(); Assert.Equal("H1", rows[4].AF); Assert.Equal("c3", rows[6].AA); @@ -3515,7 +3515,7 @@ public void TestIssue789() new Dictionary { {"no","2"} }, new Dictionary { {"no","3"} }, }; - _exporter.ExportXlsx(path, value); + _exporter.ExportExcel(path, value); var xml = SheetHelper.GetZipFileContent(path.ToString(), "xl/worksheets/sheet1.xml"); @@ -3560,7 +3560,7 @@ public void TestIssue814() } ]; - _exporter.AddPictureXlsx(path.FilePath, images); + _exporter.AddExcelPicture(path.FilePath, images); using var package = new ExcelPackage(new FileInfo(path.FilePath)); @@ -3613,7 +3613,7 @@ public void TestIssue815() } ]; - _exporter.AddPictureXlsx(path.FilePath, images); + _exporter.AddExcelPicture(path.FilePath, images); using (var package = new ExcelPackage(new FileInfo(path.FilePath))) { @@ -3672,7 +3672,7 @@ public void TestIssue816() } ]; - _exporter.AddPictureXlsx(path.FilePath, images); + _exporter.AddExcelPicture(path.FilePath, images); using var package = new ExcelPackage(new FileInfo(path.FilePath)); @@ -3724,7 +3724,7 @@ public void TestIssue816() } ]; - _exporter.AddPictureXlsx(path.FilePath, images); + _exporter.AddExcelPicture(path.FilePath, images); using var package = new ExcelPackage(new FileInfo(path.FilePath)); // Check picture in the first sheet (C3) @@ -3773,7 +3773,7 @@ public void TestIssue816() public void TestIssue809() { var path = PathHelper.GetFile("xlsx/TestIssue809.xlsx"); - var rows = _importer.QueryXlsx(path).ToList(); + var rows = _importer.QueryExcel(path).ToList(); Assert.Equal(3, rows.Count); Assert.Equal(null, rows[0].A); diff --git a/tests/MiniExcel.Tests/MiniExcelOpenXmlAsyncTests.cs b/tests/MiniExcel.Tests/MiniExcelOpenXmlAsyncTests.cs index fa606e9c..52597f41 100644 --- a/tests/MiniExcel.Tests/MiniExcelOpenXmlAsyncTests.cs +++ b/tests/MiniExcel.Tests/MiniExcelOpenXmlAsyncTests.cs @@ -10,9 +10,9 @@ namespace MiniExcelLib.Tests; public class MiniExcelOpenXmlAsyncTests { - private readonly MiniExcelImporter _importer = MiniExcel.GetImporter(); - private readonly MiniExcelExporter _exporter = MiniExcel.GetExporter(); - + private readonly OpenXmlImporter _importer = MiniExcel.GetImporterProvider().GetExcelImporter(); + private readonly OpenXmlExporter _exporter = MiniExcel.GetExporterProvider().GetExcelExporter(); + [Fact] public async Task SaveAsControlChracter() { @@ -30,10 +30,10 @@ public async Task SaveAsControlChracter() '\u0017','\u0018','\u0019','\u001A','\u001B','\u001C','\u001D','\u001E','\u001F','\u007F' ]; var input = chars.Select(s => new { Test = s.ToString() }); - await _exporter.ExportXlsxAsync(path, input); + await _exporter.ExportExcelAsync(path, input); - var rows2 = _importer.QueryXlsxAsync(path, true).ToBlockingEnumerable().ToArray(); - var rows1 = _importer.QueryXlsxAsync(path).ToBlockingEnumerable().ToArray(); + var rows2 = _importer.QueryExcelAsync(path, true).ToBlockingEnumerable().ToArray(); + var rows1 = _importer.QueryExcelAsync(path).ToBlockingEnumerable().ToArray(); } private class SaveAsControlChracterVO @@ -79,7 +79,7 @@ public async Task CustomAttributeWihoutVaildPropertiesTest() const string path = "../../../../../samples/xlsx/TestCustomExcelColumnAttribute.xlsx"; await Assert.ThrowsAsync(async () => { - _ = _importer.QueryXlsxAsync(path).ToBlockingEnumerable().ToList(); + _ = _importer.QueryExcelAsync(path).ToBlockingEnumerable().ToList(); }); } @@ -87,7 +87,7 @@ await Assert.ThrowsAsync(async () => public async Task QueryCustomAttributesTest() { const string path = "../../../../../samples/xlsx/TestCustomExcelColumnAttribute.xlsx"; - var rows = _importer.QueryXlsxAsync(path).ToBlockingEnumerable().ToList(); + var rows = _importer.QueryExcelAsync(path).ToBlockingEnumerable().ToList(); Assert.Equal("Column1", rows[0].Test1); Assert.Equal("Column2", rows[0].Test2); @@ -102,7 +102,7 @@ public async Task QueryCustomAttributesTest() public async Task QueryCustomAttributes2Test() { const string path = "../../../../../samples/xlsx/TestCustomExcelColumnAttribute.xlsx"; - var rows = _importer.QueryXlsxAsync(path).ToBlockingEnumerable().ToList(); + var rows = _importer.QueryExcelAsync(path).ToBlockingEnumerable().ToList(); Assert.Equal("Column1", rows[0].Test1); Assert.Equal("Column2", rows[0].Test2); @@ -126,8 +126,8 @@ public async Task SaveAsCustomAttributesTest() Test4 = "Test4", }); - await _exporter.ExportXlsxAsync(path.ToString(), input); - var d = _importer.QueryXlsxAsync(path.ToString(), true).ToBlockingEnumerable(); + await _exporter.ExportExcelAsync(path.ToString(), input); + var d = _importer.QueryExcelAsync(path.ToString(), true).ToBlockingEnumerable(); var rows = d.ToList(); var first = rows[0] as IDictionary; @@ -153,8 +153,8 @@ public async Task SaveAsCustomAttributes2Test() Test4 = "Test4", }); - await _exporter.ExportXlsxAsync(path.ToString(), input); - var d = _importer.QueryXlsxAsync(path.ToString(), true).ToBlockingEnumerable(); + await _exporter.ExportExcelAsync(path.ToString(), input); + var d = _importer.QueryExcelAsync(path.ToString(), true).ToBlockingEnumerable(); var rows = d.ToList(); var first = rows[0] as IDictionary; @@ -179,7 +179,7 @@ private class CustomAttributesWihoutVaildPropertiesTestPoco public async Task QueryCastToIDictionary() { const string path = "../../../../../samples/xlsx/TestCenterEmptyRow/TestCenterEmptyRow.xlsx"; - foreach (IDictionary row in _importer.QueryXlsxAsync(path).ToBlockingEnumerable()) + foreach (IDictionary row in _importer.QueryExcelAsync(path).ToBlockingEnumerable()) { _ = row; } @@ -191,7 +191,7 @@ public async Task CenterEmptyRowsQueryTest() const string path = "../../../../../samples/xlsx/TestCenterEmptyRow/TestCenterEmptyRow.xlsx"; await using (var stream = File.OpenRead(path)) { - var d = _importer.QueryXlsxAsync(stream).ToBlockingEnumerable().Cast>(); + var d = _importer.QueryExcelAsync(stream).ToBlockingEnumerable().Cast>(); var rows = d.ToList(); Assert.Equal("a", rows[0]["A"]); Assert.Equal("b", rows[0]["B"]); @@ -227,7 +227,7 @@ public async Task CenterEmptyRowsQueryTest() await using (var stream = File.OpenRead(path)) { - var d = _importer.QueryXlsxAsync(stream, useHeaderRow: true).ToBlockingEnumerable().Cast>(); + var d = _importer.QueryExcelAsync(stream, useHeaderRow: true).ToBlockingEnumerable().Cast>(); var rows = d.ToList(); Assert.Equal(1d, rows[0]["a"]); Assert.Null(rows[0]["b"]); @@ -261,7 +261,7 @@ public async Task TestDynamicQueryBasic_WithoutHead() { const string path = "../../../../../samples/xlsx/TestDynamicQueryBasic_WithoutHead.xlsx"; await using var stream = File.OpenRead(path); - var d = _importer.QueryXlsxAsync(stream).ToBlockingEnumerable().Cast>(); + var d = _importer.QueryExcelAsync(stream).ToBlockingEnumerable().Cast>(); var rows = d.ToList(); Assert.Equal("MiniExcel", rows[0]["A"]); @@ -276,7 +276,7 @@ public async Task TestDynamicQueryBasic_useHeaderRow() const string path = "../../../../../samples/xlsx/TestDynamicQueryBasic.xlsx"; await using (var stream = File.OpenRead(path)) { - var d = _importer.QueryXlsxAsync(stream, useHeaderRow: true).ToBlockingEnumerable().Cast>(); + var d = _importer.QueryExcelAsync(stream, useHeaderRow: true).ToBlockingEnumerable().Cast>(); var rows = d.ToList(); Assert.Equal("MiniExcel", rows[0]["Column1"]); Assert.Equal(1d, rows[0]["Column2"]); @@ -285,7 +285,7 @@ public async Task TestDynamicQueryBasic_useHeaderRow() } { - var d = _importer.QueryXlsxAsync(path, useHeaderRow: true).ToBlockingEnumerable(); + var d = _importer.QueryExcelAsync(path, useHeaderRow: true).ToBlockingEnumerable(); var rows = d.ToList(); Assert.Equal("MiniExcel", rows[0].Column1); Assert.Equal(1d, rows[0].Column2); @@ -316,7 +316,7 @@ public async Task QueryStrongTypeMapping_Test() const string path = "../../../../../samples/xlsx/TestTypeMapping.xlsx"; await using (var stream = File.OpenRead(path)) { - var d = _importer.QueryXlsxAsync(stream); + var d = _importer.QueryExcelAsync(stream); var rows = d.ToBlockingEnumerable().ToList(); Assert.Equal(100, rows.Count); @@ -330,16 +330,16 @@ public async Task QueryStrongTypeMapping_Test() } { - var rows = _importer.QueryXlsx(path).ToList(); + var rows = _importer.QueryExcel(path, useHeaderRow: true).ToList(); Assert.Equal(100, rows.Count); - Assert.Equal(Guid.Parse("78DE23D2-DCB6-BD3D-EC67-C112BBC322A2"), rows[0].ID); + Assert.Equal("78DE23D2-DCB6-BD3D-EC67-C112BBC322A2", rows[0].ID); Assert.Equal("Wade", rows[0].Name); - Assert.Equal(DateTime.ParseExact("27/09/2020", "dd/MM/yyyy", CultureInfo.InvariantCulture), rows[0].BoD); + Assert.Equal("27/09/2020", rows[0].BoD); Assert.Equal(36, rows[0].Age); - Assert.False(rows[0].VIP); - Assert.Equal(5019.12m, rows[0].Points); - Assert.Equal(1, rows[0].IgnoredProperty); + Assert.Equal(bool.FalseString, rows[0].VIP); + Assert.Equal(5019.12d, rows[0].Points); + Assert.Null(rows[0].IgnoredProperty); } } @@ -357,7 +357,7 @@ public async Task AutoCheckTypeTest() { const string path = "../../../../../samples/xlsx/TestTypeMapping_AutoCheckFormat.xlsx"; await using var stream = FileHelper.OpenRead(path); - _ = _importer.QueryXlsxAsync(stream).ToBlockingEnumerable().ToList(); + _ = _importer.QueryExcelAsync(stream).ToBlockingEnumerable().ToList(); } [Fact] @@ -366,7 +366,7 @@ public async Task TestDatetimeSpanFormat_ClosedXml() const string path = "../../../../../samples/xlsx/TestDatetimeSpanFormat_ClosedXml.xlsx"; await using var stream = FileHelper.OpenRead(path); - var d = _importer.QueryXlsxAsync(stream).ToBlockingEnumerable().Cast>(); + var d = _importer.QueryExcelAsync(stream).ToBlockingEnumerable().Cast>(); var row = d.First(); var a = row["A"]; var b = row["B"]; @@ -381,13 +381,13 @@ public async Task LargeFileQueryStrongTypeMapping_Test() const string path = "../../../../../benchmarks/MiniExcel.Benchmarks/Test1,000,000x10.xlsx"; await using (var stream = File.OpenRead(path)) { - var d = _importer.QueryXlsxAsync(stream).ToBlockingEnumerable(); + var d = _importer.QueryExcelAsync(stream).ToBlockingEnumerable(); var rows = d.Take(2).ToList(); Assert.Equal("HelloWorld2", rows[0].HelloWorld1); Assert.Equal("HelloWorld3", rows[1].HelloWorld1); } { - var d = _importer.QueryXlsxAsync(path).ToBlockingEnumerable(); + var d = _importer.QueryExcelAsync(path).ToBlockingEnumerable(); var rows = d.Take(2).ToList(); Assert.Equal("HelloWorld2", rows[0].HelloWorld1); Assert.Equal("HelloWorld3", rows[1].HelloWorld1); @@ -408,7 +408,7 @@ public async Task QueryExcelDataReaderCheckTest(string path) var exceldatareaderResult = reader.AsDataSet(); await using var stream = File.OpenRead(path); - var d = _importer.QueryXlsxAsync(stream).ToBlockingEnumerable(); + var d = _importer.QueryExcelAsync(stream).ToBlockingEnumerable(); var rows = d.ToList(); Assert.Equal(exceldatareaderResult.Tables[0].Rows.Count, rows.Count); @@ -430,7 +430,7 @@ public async Task QuerySheetWithoutRAttribute() const string path = "../../../../../samples/xlsx/TestWihoutRAttribute.xlsx"; await using var stream = File.OpenRead(path); - var d = _importer.QueryXlsxAsync(stream).ToBlockingEnumerable().Cast>(); + var d = _importer.QueryExcelAsync(stream).ToBlockingEnumerable().Cast>(); var rows = d.ToList(); var keys = rows.First().Keys; @@ -453,7 +453,7 @@ public async Task FixDimensionJustOneColumnParsingError_Test() { const string path = "../../../../../samples/xlsx/TestDimensionC3.xlsx"; await using var stream = File.OpenRead(path); - var d = _importer.QueryXlsxAsync(stream).ToBlockingEnumerable(); + var d = _importer.QueryExcelAsync(stream).ToBlockingEnumerable(); var rows = d.ToList(); var keys = (rows.First() as IDictionary)?.Keys; Assert.Equal(3, keys?.Count); @@ -479,10 +479,10 @@ public async Task SaveAsFileWithDimensionByICollection() using (var file = AutoDeletingPath.Create()) { var path = file.ToString(); - await _exporter.ExportXlsxAsync(path, values); + await _exporter.ExportExcelAsync(path, values); await using (var stream = File.OpenRead(path)) { - var d = _importer.QueryXlsxAsync(stream, useHeaderRow: false).ToBlockingEnumerable().Cast>(); + var d = _importer.QueryExcelAsync(stream, useHeaderRow: false).ToBlockingEnumerable().Cast>(); var rows = d.ToList(); Assert.Equal(3, rows.Count); Assert.Equal("A", rows[0]["A"]); @@ -492,7 +492,7 @@ public async Task SaveAsFileWithDimensionByICollection() await using (var stream = File.OpenRead(path)) { - var d = _importer.QueryXlsxAsync(stream, useHeaderRow: true).ToBlockingEnumerable().Cast>(); + var d = _importer.QueryExcelAsync(stream, useHeaderRow: true).ToBlockingEnumerable().Cast>(); var rows = d.ToList(); Assert.Equal(2, rows.Count); Assert.Equal("A", rows[0]["A"]); @@ -503,7 +503,7 @@ public async Task SaveAsFileWithDimensionByICollection() } using var newPath = AutoDeletingPath.Create(); - await _exporter.ExportXlsxAsync(newPath.ToString(), values, false); + await _exporter.ExportExcelAsync(newPath.ToString(), values, false); Assert.Equal("A1:B2", SheetHelper.GetFirstSheetDimensionRefValue(newPath.ToString())); } @@ -513,10 +513,10 @@ public async Task SaveAsFileWithDimensionByICollection() using (var file = AutoDeletingPath.Create()) { var path = file.ToString(); - await _exporter.ExportXlsxAsync(path, values, false); + await _exporter.ExportExcelAsync(path, values, false); await using (var stream = File.OpenRead(path)) { - var d = _importer.QueryXlsxAsync(stream, useHeaderRow: false).ToBlockingEnumerable(); + var d = _importer.QueryExcelAsync(stream, useHeaderRow: false).ToBlockingEnumerable(); var rows = d.ToList(); Assert.Empty(rows); } @@ -527,10 +527,10 @@ public async Task SaveAsFileWithDimensionByICollection() using (var file = AutoDeletingPath.Create()) { var path = file.ToString(); - await _exporter.ExportXlsxAsync(path, values); + await _exporter.ExportExcelAsync(path, values); { await using var stream = File.OpenRead(path); - var d = _importer.QueryXlsxAsync(stream, useHeaderRow: false).ToBlockingEnumerable(); + var d = _importer.QueryExcelAsync(stream, useHeaderRow: false).ToBlockingEnumerable(); var rows = d.ToList(); Assert.Single(rows); } @@ -549,11 +549,11 @@ public async Task SaveAsFileWithDimensionByICollection() using (var file = AutoDeletingPath.Create()) { var path = file.ToString(); - await _exporter.ExportXlsxAsync(path, values); + await _exporter.ExportExcelAsync(path, values); await using (var stream = File.OpenRead(path)) { - var d = _importer.QueryXlsxAsync(stream, useHeaderRow: false).ToBlockingEnumerable().Cast>(); + var d = _importer.QueryExcelAsync(stream, useHeaderRow: false).ToBlockingEnumerable().Cast>(); var rows = d.ToList(); Assert.Equal(3, rows.Count); Assert.Equal("A", rows[0]["A"]); @@ -563,7 +563,7 @@ public async Task SaveAsFileWithDimensionByICollection() await using (var stream = File.OpenRead(path)) { - var d = _importer.QueryXlsxAsync(stream, useHeaderRow: true).ToBlockingEnumerable().Cast>(); + var d = _importer.QueryExcelAsync(stream, useHeaderRow: true).ToBlockingEnumerable().Cast>(); var rows = d.ToList(); Assert.Equal(2, rows.Count); Assert.Equal("A", rows[0]["A"]); @@ -575,7 +575,7 @@ public async Task SaveAsFileWithDimensionByICollection() using (var path = AutoDeletingPath.Create()) { - await _exporter.ExportXlsxAsync(path.ToString(), values, false); + await _exporter.ExportExcelAsync(path.ToString(), values, false); Assert.Equal("A1:B2", SheetHelper.GetFirstSheetDimensionRefValue(path.ToString())); } } @@ -584,7 +584,7 @@ public async Task SaveAsFileWithDimensionByICollection() { using var path = AutoDeletingPath.Create(); var values = new List(); - await Assert.ThrowsAsync(() => _exporter.ExportXlsxAsync(path.ToString(), values)); + await Assert.ThrowsAsync(() => _exporter.ExportExcelAsync(path.ToString(), values)); } } @@ -596,15 +596,15 @@ public async Task SaveAsFileWithDimension() var path = file.ToString(); using var table = new DataTable(); - await _exporter.ExportXlsxAsync(path, table); + await _exporter.ExportExcelAsync(path, table); Assert.Equal("A1", SheetHelper.GetFirstSheetDimensionRefValue(path)); { await using var stream = File.OpenRead(path); - var d = _importer.QueryXlsxAsync(stream).ToBlockingEnumerable(); + var d = _importer.QueryExcelAsync(stream).ToBlockingEnumerable(); var rows = d.ToList(); Assert.Single(rows); } - await _exporter.ExportXlsxAsync(path, table, printHeader: false, overwriteFile: true); + await _exporter.ExportExcelAsync(path, table, printHeader: false, overwriteFile: true); Assert.Equal("A1", SheetHelper.GetFirstSheetDimensionRefValue(path)); } { @@ -619,12 +619,12 @@ public async Task SaveAsFileWithDimension() table.Rows.Add(@"""<>+-*//}{\\n", 1234567890); table.Rows.Add("Hello World", -1234567890, false, DateTime.Now); - await _exporter.ExportXlsxAsync(path, table); + await _exporter.ExportExcelAsync(path, table); Assert.Equal("A1:D3", SheetHelper.GetFirstSheetDimensionRefValue(path)); await using (var stream = File.OpenRead(path)) { - var d = _importer.QueryXlsxAsync(stream, useHeaderRow: true).ToBlockingEnumerable().Cast>(); + var d = _importer.QueryExcelAsync(stream, useHeaderRow: true).ToBlockingEnumerable().Cast>(); var rows = d.ToList(); Assert.Equal(2, rows.Count); Assert.Equal(@"""<>+-*//}{\\n", rows[0]["a"]); @@ -635,7 +635,7 @@ public async Task SaveAsFileWithDimension() await using (var stream = File.OpenRead(path)) { - var d = _importer.QueryXlsxAsync(stream).ToBlockingEnumerable().Cast>(); + var d = _importer.QueryExcelAsync(stream).ToBlockingEnumerable().Cast>(); var rows = d.ToList(); Assert.Equal(3, rows.Count); Assert.Equal("a", rows[0]["A"]); @@ -644,7 +644,7 @@ public async Task SaveAsFileWithDimension() Assert.Equal("d", rows[0]["D"]); } - await _exporter.ExportXlsxAsync(path, table, printHeader: false, overwriteFile: true); + await _exporter.ExportExcelAsync(path, table, printHeader: false, overwriteFile: true); Assert.Equal("A1:D2", SheetHelper.GetFirstSheetDimensionRefValue(path)); } @@ -655,7 +655,7 @@ public async Task SaveAsFileWithDimension() table.Rows.Add("A"); table.Rows.Add("B"); - await _exporter.ExportXlsxAsync(path.ToString(), table); + await _exporter.ExportExcelAsync(path.ToString(), table); Assert.Equal("A1:A3", SheetHelper.GetFirstSheetDimensionRefValue(path.ToString())); } } @@ -677,7 +677,7 @@ public async Task SaveAsByDataTableTest() table.Rows.Add(@"""<>+-*//}{\\n", 1234567890, true, now); table.Rows.Add("Hello World", -1234567890, false, now.Date); - await _exporter.ExportXlsxAsync(path, table); + await _exporter.ExportExcelAsync(path, table); using var p = new ExcelPackage(new FileInfo(path)); var ws = p.Workbook.Worksheets.First(); @@ -700,7 +700,7 @@ public async Task SaveAsByDataTableTest() table.Rows.Add("MiniExcel", 1); table.Rows.Add("Github", 2); - await _exporter.ExportXlsxAsync(path.ToString(), table); + await _exporter.ExportExcelAsync(path.ToString(), table); } } @@ -710,19 +710,19 @@ public async Task QueryByLINQExtensionsVoidTaskLargeFileOOMTest() const string path = "../../../../../benchmarks/MiniExcel.Benchmarks/Test1,000,000x10.xlsx"; { - var row = _importer.QueryXlsxAsync(path).ToBlockingEnumerable().First(); + var row = _importer.QueryExcelAsync(path).ToBlockingEnumerable().First(); Assert.Equal("HelloWorld1", row.A); } await using (var stream = File.OpenRead(path)) { - var d = _importer.QueryXlsxAsync(stream).ToBlockingEnumerable().Cast>(); + var d = _importer.QueryExcelAsync(stream).ToBlockingEnumerable().Cast>(); var row = d.First(); Assert.Equal("HelloWorld1", row["A"]); } { - var d = _importer.QueryXlsxAsync(path).ToBlockingEnumerable().Cast>(); + var d = _importer.QueryExcelAsync(path).ToBlockingEnumerable().Cast>(); var rows = d.Take(10); Assert.Equal(10, rows.Count()); } @@ -736,12 +736,12 @@ public async Task EmptyTest() await using (var connection = Db.GetConnection("Data Source=:memory:")) { var rows = await connection.QueryAsync("with cte as (select 1 id,2 val) select * from cte where 1=2"); - await _exporter.ExportXlsxAsync(path.ToString(), rows); + await _exporter.ExportExcelAsync(path.ToString(), rows); } await using (var stream = File.OpenRead(path.ToString())) { - var row = _importer.QueryXlsxAsync(stream, useHeaderRow: true).ToBlockingEnumerable(); + var row = _importer.QueryExcelAsync(stream, useHeaderRow: true).ToBlockingEnumerable(); Assert.Empty(row); } } @@ -758,11 +758,11 @@ public async Task SaveAsByIEnumerableIDictionary() new() { { "Column1", "MiniExcel" }, { "Column2", 1 } }, new() { { "Column1", "Github" }, { "Column2", 2 } } ]; - await _exporter.ExportXlsxAsync(path, values); + await _exporter.ExportExcelAsync(path, values); await using (var stream = File.OpenRead(path)) { - var d = _importer.QueryXlsxAsync(stream, useHeaderRow: false).ToBlockingEnumerable().Cast>(); + var d = _importer.QueryExcelAsync(stream, useHeaderRow: false).ToBlockingEnumerable().Cast>(); var rows = d.ToList(); Assert.Equal("Column1", rows[0]["A"]); Assert.Equal("Column2", rows[0]["B"]); @@ -774,7 +774,7 @@ public async Task SaveAsByIEnumerableIDictionary() await using (var stream = File.OpenRead(path)) { - var d = _importer.QueryXlsxAsync(stream, useHeaderRow: true).ToBlockingEnumerable().Cast>(); + var d = _importer.QueryExcelAsync(stream, useHeaderRow: true).ToBlockingEnumerable().Cast>(); var rows = d.ToList(); Assert.Equal(2, rows.Count); Assert.Equal("MiniExcel", rows[0]["Column1"]); @@ -795,11 +795,11 @@ public async Task SaveAsByIEnumerableIDictionary() new() { { 1, "MiniExcel" }, { 2, 1 } }, new() { { 1, "Github" }, { 2, 2 } } ]; - await _exporter.ExportXlsxAsync(path, values); + await _exporter.ExportExcelAsync(path, values); await using (var stream = File.OpenRead(path)) { - var d = _importer.QueryXlsxAsync(stream, useHeaderRow: false).ToBlockingEnumerable(); + var d = _importer.QueryExcelAsync(stream, useHeaderRow: false).ToBlockingEnumerable(); var rows = d.ToList(); Assert.Equal(3, rows.Count); } @@ -827,11 +827,11 @@ public async Task SaveAsByIEnumerableIDictionaryWithDynamicConfiguration() new() { { "Column1", "MiniExcel" }, { "Column2", 1 } }, new() { { "Column1", "Github" }, { "Column2", 2 } } ]; - await _exporter.ExportXlsxAsync(path, values, configuration: config); + await _exporter.ExportExcelAsync(path, values, configuration: config); await using (var stream = File.OpenRead(path)) { - var d = _importer.QueryXlsxAsync(stream, useHeaderRow: true).ToBlockingEnumerable().Cast>(); + var d = _importer.QueryExcelAsync(stream, useHeaderRow: true).ToBlockingEnumerable().Cast>(); var rows = d.ToList(); Assert.Equal(2, rows.Count); Assert.Equal("Name Column", rows[0].Keys.ElementAt(0)); @@ -858,7 +858,7 @@ public async Task SaveAsFrozenRowsAndColumnsTest() using var file = AutoDeletingPath.Create(); var path = file.ToString(); - await _exporter.ExportXlsxAsync( + await _exporter.ExportExcelAsync( path, new[] { @@ -870,7 +870,7 @@ await _exporter.ExportXlsxAsync( await using (var stream = File.OpenRead(path)) { - var rows = _importer.QueryXlsxAsync(stream, useHeaderRow: true).ToBlockingEnumerable().ToList(); + var rows = _importer.QueryExcelAsync(stream, useHeaderRow: true).ToBlockingEnumerable().ToList(); Assert.Equal("MiniExcel", rows[0].Column1); Assert.Equal(1, rows[0].Column2); @@ -889,13 +889,13 @@ await _exporter.ExportXlsxAsync( table.Rows.Add("Hello World", -1234567890, false, DateTime.Now.Date); using var pathTable = AutoDeletingPath.Create(); - await _exporter.ExportXlsxAsync(pathTable.ToString(), table, configuration: config); + await _exporter.ExportExcelAsync(pathTable.ToString(), table, configuration: config); Assert.Equal("A1:D3", SheetHelper.GetFirstSheetDimensionRefValue(pathTable.ToString())); // data reader await using var reader = table.CreateDataReader(); using var pathReader = AutoDeletingPath.Create(); - await _exporter.ExportXlsxAsync(pathReader.ToString(), reader, configuration: config); + await _exporter.ExportExcelAsync(pathReader.ToString(), reader, configuration: config); Assert.Equal("A1:D3", SheetHelper.GetFirstSheetDimensionRefValue(pathTable.ToString())); } @@ -909,13 +909,13 @@ public async Task SaveAsByDapperRows() await using (var connection = Db.GetConnection("Data Source=:memory:")) { var rows = await connection.QueryAsync("select 'MiniExcel' as Column1,1 as Column2 union all select 'Github',2"); - await _exporter.ExportXlsxAsync(path, rows); + await _exporter.ExportExcelAsync(path, rows); } Assert.Equal("A1:B3", SheetHelper.GetFirstSheetDimensionRefValue(path)); await using (var stream = File.OpenRead(path)) { - var rows = _importer.QueryXlsxAsync(stream, useHeaderRow: true).ToBlockingEnumerable().Cast>().ToList(); + var rows = _importer.QueryExcelAsync(stream, useHeaderRow: true).ToBlockingEnumerable().Cast>().ToList(); Assert.Equal("MiniExcel", rows[0]["Column1"]); Assert.Equal(1d, rows[0]["Column2"]); Assert.Equal("Github", rows[1]["Column1"]); @@ -926,18 +926,18 @@ public async Task SaveAsByDapperRows() await using (var connection = Db.GetConnection("Data Source=:memory:")) { var rows = (await connection.QueryAsync("with cte as (select 'MiniExcel' as Column1,1 as Column2 union all select 'Github',2)select * from cte where 1=2")).ToList(); - await _exporter.ExportXlsxAsync(path, rows, overwriteFile: true); + await _exporter.ExportExcelAsync(path, rows, overwriteFile: true); } await using (var stream = File.OpenRead(path)) { - var rows = _importer.QueryXlsxAsync(stream, useHeaderRow: false).ToBlockingEnumerable().ToList(); + var rows = _importer.QueryExcelAsync(stream, useHeaderRow: false).ToBlockingEnumerable().ToList(); Assert.Empty(rows); } await using (var stream = File.OpenRead(path)) { - var rows = _importer.QueryXlsxAsync(stream, useHeaderRow: true).ToBlockingEnumerable().ToList(); + var rows = _importer.QueryExcelAsync(stream, useHeaderRow: true).ToBlockingEnumerable().ToList(); Assert.Empty(rows); } Assert.Equal("A1", SheetHelper.GetFirstSheetDimensionRefValue(path)); @@ -946,13 +946,13 @@ public async Task SaveAsByDapperRows() await using (var connection = Db.GetConnection("Data Source=:memory:")) { var rows = (await connection.QueryAsync("select 'MiniExcel' as Column1,1 as Column2 union all select 'Github',2")).ToList(); - await _exporter.ExportXlsxAsync(path, rows, overwriteFile: true); + await _exporter.ExportExcelAsync(path, rows, overwriteFile: true); } Assert.Equal("A1:B3", SheetHelper.GetFirstSheetDimensionRefValue(path)); await using (var stream = File.OpenRead(path)) { - var rows = _importer.QueryXlsxAsync(stream, useHeaderRow: false).ToBlockingEnumerable().Cast>().ToList(); + var rows = _importer.QueryExcelAsync(stream, useHeaderRow: false).ToBlockingEnumerable().Cast>().ToList(); Assert.Equal("Column1", rows[0]["A"]); Assert.Equal("Column2", rows[0]["B"]); Assert.Equal("MiniExcel", rows[1]["A"]); @@ -963,7 +963,7 @@ public async Task SaveAsByDapperRows() await using (var stream = File.OpenRead(path)) { - var rows = _importer.QueryXlsxAsync(stream, useHeaderRow: true).ToBlockingEnumerable().Cast>().ToList(); + var rows = _importer.QueryExcelAsync(stream, useHeaderRow: true).ToBlockingEnumerable().Cast>().ToList(); Assert.Equal("MiniExcel", rows[0]["Column1"]); Assert.Equal(1d, rows[0]["Column2"]); Assert.Equal("Github", rows[1]["Column1"]); @@ -987,10 +987,10 @@ public async Task QueryByStrongTypeParameterTest() new() { Column1 = "MiniExcel", Column2 = 1 }, new() { Column1 = "Github", Column2 = 2 } ]; - await _exporter.ExportXlsxAsync(path, values); + await _exporter.ExportExcelAsync(path, values); await using var stream = File.OpenRead(path); - var rows = _importer.QueryXlsxAsync(stream, useHeaderRow: true).ToBlockingEnumerable().Cast>().ToList(); + var rows = _importer.QueryExcelAsync(stream, useHeaderRow: true).ToBlockingEnumerable().Cast>().ToList(); Assert.Equal("MiniExcel", rows[0]["Column1"]); Assert.Equal(1d, rows[0]["Column2"]); @@ -1008,10 +1008,10 @@ public async Task QueryByDictionaryStringAndObjectParameterTest() new() { { "Column1", "MiniExcel" }, { "Column2", 1 } }, new() { { "Column1", "Github" }, { "Column2", 2 } } ]; - await _exporter.ExportXlsxAsync(path, values); + await _exporter.ExportExcelAsync(path, values); await using var stream = File.OpenRead(path); - var rows = _importer.QueryXlsxAsync(stream, useHeaderRow: true).ToBlockingEnumerable().Cast>().ToList(); + var rows = _importer.QueryExcelAsync(stream, useHeaderRow: true).ToBlockingEnumerable().Cast>().ToList(); Assert.Equal("MiniExcel", rows[0]["Column1"]); Assert.Equal(1d, rows[0]["Column2"]); @@ -1038,7 +1038,7 @@ public async Task SQLiteInsertTest() await using (var transaction = connection.BeginTransaction()) await using (var stream = File.OpenRead(path)) { - var rows = _importer.QueryXlsxAsync(stream).ToBlockingEnumerable().Cast>(); + var rows = _importer.QueryExcelAsync(stream).ToBlockingEnumerable().Cast>(); foreach (var row in rows) await connection.ExecuteAsync( "insert into T (A,B) values (@A,@B)", @@ -1063,7 +1063,7 @@ public async Task SaveAsBasicCreateTest() using var file = AutoDeletingPath.Create(); var path = file.ToString(); - await _exporter.ExportXlsxAsync(path, new[] + await _exporter.ExportExcelAsync(path, new[] { new { Column1 = "MiniExcel", Column2 = 1 }, new { Column1 = "Github", Column2 = 2} @@ -1071,7 +1071,7 @@ await _exporter.ExportXlsxAsync(path, new[] await using (var stream = File.OpenRead(path)) { - var d = _importer.QueryXlsxAsync(stream, useHeaderRow: true).ToBlockingEnumerable().Cast>(); + var d = _importer.QueryExcelAsync(stream, useHeaderRow: true).ToBlockingEnumerable().Cast>(); var rows = d.ToList(); Assert.Equal("MiniExcel", rows[0]["Column1"]); Assert.Equal(1d, rows[0]["Column2"]); @@ -1095,12 +1095,12 @@ public async Task SaveAsBasicStreamTest() }; await using (var stream = new FileStream(path, FileMode.CreateNew)) { - await _exporter.ExportXlsxAsync(stream, values); + await _exporter.ExportExcelAsync(stream, values); } await using (var stream = File.OpenRead(path)) { - var rows = _importer.QueryXlsxAsync(stream, useHeaderRow: true).ToBlockingEnumerable().Cast>().ToList(); + var rows = _importer.QueryExcelAsync(stream, useHeaderRow: true).ToBlockingEnumerable().Cast>().ToList(); Assert.Equal("MiniExcel", rows[0]["Column1"]); Assert.Equal(1d, rows[0]["Column2"]); Assert.Equal("Github", rows[1]["Column1"]); @@ -1118,14 +1118,14 @@ public async Task SaveAsBasicStreamTest() await using (var stream = new MemoryStream()) await using (var fileStream = new FileStream(path, FileMode.Create)) { - await _exporter.ExportXlsxAsync(stream, values); + await _exporter.ExportExcelAsync(stream, values); stream.Seek(0, SeekOrigin.Begin); await stream.CopyToAsync(fileStream); } await using (var stream = File.OpenRead(path)) { - var rows = _importer.QueryXlsxAsync(stream, useHeaderRow: true).ToBlockingEnumerable().Cast>().ToList(); + var rows = _importer.QueryExcelAsync(stream, useHeaderRow: true).ToBlockingEnumerable().Cast>().ToList(); Assert.Equal("MiniExcel", rows[0]["Column1"]); Assert.Equal(1d, rows[0]["Column2"]); Assert.Equal("Github", rows[1]["Column1"]); @@ -1138,7 +1138,7 @@ public async Task SaveAsBasicStreamTest() public async Task SaveAsSpecialAndTypeCreateTest() { using var path = AutoDeletingPath.Create(); - await _exporter.ExportXlsxAsync(path.ToString(), new[] + await _exporter.ExportExcelAsync(path.ToString(), new[] { new { a = @"""<>+-*//}{\\n", b = 1234567890, c = true, d = DateTime.Now }, new { a = "Hello World", b = -1234567890, c = false, d = DateTime.Now.Date} @@ -1153,7 +1153,7 @@ public async Task SaveAsFileEpplusCanReadTest() using var path = AutoDeletingPath.Create(); var now = DateTime.Now; - await _exporter.ExportXlsxAsync(path.ToString(), new[] + await _exporter.ExportExcelAsync(path.ToString(), new[] { new { a = @"""<>+-*//}{\\n", b = 1234567890, c = true, d = now}, new { a = "Hello World", b = -1234567890, c = false, d = now.Date} @@ -1179,7 +1179,7 @@ public async Task SavaAsClosedXmlCanReadTest() var now = DateTime.Now; using var path = AutoDeletingPath.Create(); - await _exporter.ExportXlsxAsync(path.ToString(), new[] + await _exporter.ExportExcelAsync(path.ToString(), new[] { new { a = @"""<>+-*//}{\\n", b = 1234567890, c = true, d = now}, new { a = "Hello World", b = -1234567890, c = false, d = now.Date} @@ -1204,7 +1204,7 @@ public async Task ContentTypeUriContentTypeReadCheckTest() var now = DateTime.Now; using var path = AutoDeletingPath.Create(); - await _exporter.ExportXlsxAsync(path.ToString(), new[] + await _exporter.ExportExcelAsync(path.ToString(), new[] { new { a = @"""<>+-*//}{\\n", b = 1234567890, c = true, d = now}, new { a = "Hello World", b = -1234567890, c = false, d = now.Date} @@ -1232,7 +1232,7 @@ await Assert.ThrowsAsync(async () => await cts.CancelAsync(); await using var stream = FileHelper.OpenRead(path); - var rows = _importer.QueryXlsxAsync(stream, cancellationToken: cts.Token).ToBlockingEnumerable(cts.Token).ToList(); + var rows = _importer.QueryExcelAsync(stream, cancellationToken: cts.Token).ToBlockingEnumerable(cts.Token).ToList(); }); } @@ -1252,7 +1252,7 @@ await Assert.ThrowsAsync(async () => }); await using var stream = FileHelper.OpenRead(path); - var d = _importer.QueryXlsxAsync(stream, cancellationToken: cts.Token).ToBlockingEnumerable(cts.Token); + var d = _importer.QueryExcelAsync(stream, cancellationToken: cts.Token).ToBlockingEnumerable(cts.Token); await cancelTask; _ = d.ToList(); }); @@ -1300,10 +1300,10 @@ public async Task DynamicColumnsConfigurationIsUsedWhenCreatingExcelUsingIDataRe ] }; await using var reader = table.CreateDataReader(); - await _exporter.ExportXlsxAsync(path.ToString(), reader, configuration: configuration); + await _exporter.ExportExcelAsync(path.ToString(), reader, configuration: configuration); await using var stream = File.OpenRead(path.ToString()); - var rows = _importer.QueryXlsxAsync(stream, useHeaderRow: true).ToBlockingEnumerable() + var rows = _importer.QueryExcelAsync(stream, useHeaderRow: true).ToBlockingEnumerable() .Cast>() .ToList(); @@ -1366,10 +1366,10 @@ public async Task DynamicColumnsConfigurationIsUsedWhenCreatingExcelUsingDataTab } ] }; - await _exporter.ExportXlsxAsync(path.ToString(), table, configuration: configuration); + await _exporter.ExportExcelAsync(path.ToString(), table, configuration: configuration); await using var stream = File.OpenRead(path.ToString()); - var rows = _importer.QueryXlsxAsync(stream, useHeaderRow: true).ToBlockingEnumerable() + var rows = _importer.QueryExcelAsync(stream, useHeaderRow: true).ToBlockingEnumerable() .Cast>() .ToList(); @@ -1402,13 +1402,13 @@ public async Task SaveAsByMiniExcelDataReader() new() { Column1= "MiniExcel" ,Column2 = 1 }, new() { Column1 = "Github", Column2 = 2 } }; - await _exporter.ExportXlsxAsync(path1.ToString(), values); + await _exporter.ExportExcelAsync(path1.ToString(), values); - await using (IMiniExcelDataReader? reader = _importer.GetXlsxDataReader(path1.ToString(), true)) + await using (IMiniExcelDataReader? reader = _importer.GetExcelDataReader(path1.ToString(), true)) { using var path2 = AutoDeletingPath.Create(); - await _exporter.ExportXlsxAsync(path2.ToString(), reader); - var results = _importer.QueryXlsxAsync(path2.ToString()).ToBlockingEnumerable().ToList(); + await _exporter.ExportExcelAsync(path2.ToString(), reader); + var results = _importer.QueryExcelAsync(path2.ToString()).ToBlockingEnumerable().ToList(); Assert.True(results.Count == 2); Assert.True(results.First().Column1 == "MiniExcel"); @@ -1434,7 +1434,7 @@ public async Task InsertSheetTest() table.Rows.Add(@"""<>+-*//}{\\n", 1234567890, true, now); table.Rows.Add("Hello World", -1234567890, false, now.Date); - await _exporter.InsertXlsxSheetAsync(path, table, sheetName: "Sheet1"); + await _exporter.InsertExcelSheetAsync(path, table, sheetName: "Sheet1"); using var p = new ExcelPackage(new FileInfo(path)); var sheet1 = p.Workbook.Worksheets[0]; @@ -1457,7 +1457,7 @@ public async Task InsertSheetTest() table.Rows.Add("MiniExcel", 1); table.Rows.Add("Github", 2); - await _exporter.InsertXlsxSheetAsync(path, table, sheetName: "Sheet2"); + await _exporter.InsertExcelSheetAsync(path, table, sheetName: "Sheet2"); using var p = new ExcelPackage(new FileInfo(path)); var sheet2 = p.Workbook.Worksheets[1]; @@ -1478,7 +1478,7 @@ public async Task InsertSheetTest() table.Columns.Add("Column2", typeof(DateTime)); table.Rows.Add("Test", now); - await _exporter.InsertXlsxSheetAsync(path, table, sheetName: "Sheet2", printHeader: false, configuration: new OpenXmlConfiguration + await _exporter.InsertExcelSheetAsync(path, table, sheetName: "Sheet2", printHeader: false, configuration: new OpenXmlConfiguration { FastMode = true, AutoFilter = false, @@ -1509,7 +1509,7 @@ public async Task InsertSheetTest() table.Rows.Add("MiniExcel", now); table.Rows.Add("Github", now); - await _exporter.InsertXlsxSheetAsync(path, table, sheetName: "Sheet3", configuration: new OpenXmlConfiguration + await _exporter.InsertExcelSheetAsync(path, table, sheetName: "Sheet3", configuration: new OpenXmlConfiguration { FastMode = true, AutoFilter = false, @@ -1555,13 +1555,13 @@ static async IAsyncEnumerable GetValues() } #pragma warning restore CS1998 - await _exporter.ExportXlsxAsync(path.ToString(), GetValues()); - var results = _importer.QueryXlsx(path.ToString()).ToList(); + await _exporter.ExportExcelAsync(path.ToString(), GetValues()); + var results = _importer.QueryExcel(path.ToString(), useHeaderRow: true).ToList(); - Assert.True(results.Count == 2); - Assert.True(results.First().Column1 == "MiniExcel"); - Assert.True(results.First().Column2 == 1); - Assert.True(results.Last().Column1 == "Github"); - Assert.True(results.Last().Column2 == 2); + Assert.Equal(2, results.Count); + Assert.Equal("MiniExcel", results[0].Column1); + Assert.Equal(1, results[0].Column2); + Assert.Equal("Github", results[^1].Column1); + Assert.Equal(2, results[^1].Column2); } } \ No newline at end of file diff --git a/tests/MiniExcel.Tests/MiniExcelOpenXmlConfigurationTest.cs b/tests/MiniExcel.Tests/MiniExcelOpenXmlConfigurationTest.cs index cbde33b4..7c0583a9 100644 --- a/tests/MiniExcel.Tests/MiniExcelOpenXmlConfigurationTest.cs +++ b/tests/MiniExcel.Tests/MiniExcelOpenXmlConfigurationTest.cs @@ -6,9 +6,8 @@ namespace MiniExcelLib.Tests; public class MiniExcelOpenXmlConfigurationTest { - private readonly MiniExcelImporter _importer = MiniExcel.GetImporter(); - private readonly MiniExcelExporter _exporter = MiniExcel.GetExporter(); - + private readonly OpenXmlImporter _importer = MiniExcel.GetImporterProvider().GetExcelImporter(); + private readonly OpenXmlExporter _exporter = MiniExcel.GetExporterProvider().GetExcelExporter(); [Fact] public async Task EnableWriteFilePathTest() { @@ -24,10 +23,10 @@ public async Task EnableWriteFilePathTest() ]; var path = PathHelper.GetFile("xlsx/Test_EnableWriteFilePath.xlsx"); - await _exporter.ExportXlsxAsync(path, value, configuration: new OpenXmlConfiguration { EnableWriteFilePath = false }, overwriteFile: true); + await _exporter.ExportExcelAsync(path, value, configuration: new OpenXmlConfiguration { EnableWriteFilePath = false }, overwriteFile: true); Assert.True(File.Exists(path)); - var rows = await _importer.QueryXlsxAsync(path).CreateListAsync(); + var rows = await _importer.QueryExcelAsync(path).CreateListAsync(); Assert.True(rows.All(x => x.Img is null or [])); } diff --git a/tests/MiniExcel.Tests/MiniExcelOpenXmlMultipleSheetAsyncTests.cs b/tests/MiniExcel.Tests/MiniExcelOpenXmlMultipleSheetAsyncTests.cs index f0d88122..b66b716c 100644 --- a/tests/MiniExcel.Tests/MiniExcelOpenXmlMultipleSheetAsyncTests.cs +++ b/tests/MiniExcel.Tests/MiniExcelOpenXmlMultipleSheetAsyncTests.cs @@ -2,28 +2,28 @@ public class MiniExcelOpenXmlMultipleSheetAsyncTests { - private readonly MiniExcelImporter _importer = MiniExcel.GetImporter(); + private readonly OpenXmlImporter _importer = MiniExcel.GetImporterProvider().GetExcelImporter(); [Fact] public async Task SpecifySheetNameQueryTest() { const string path = "../../../../../samples/xlsx/TestMultiSheet.xlsx"; { - var q = _importer.QueryXlsxAsync(path, sheetName: "Sheet3").ToBlockingEnumerable(); + var q = _importer.QueryExcelAsync(path, sheetName: "Sheet3").ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal(5, rows.Count); Assert.Equal(3, rows[0].A); Assert.Equal(3, rows[0].B); } { - var q = _importer.QueryXlsxAsync(path, sheetName: "Sheet2").ToBlockingEnumerable(); + var q = _importer.QueryExcelAsync(path, sheetName: "Sheet2").ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal(12, rows.Count); Assert.Equal(1, rows[0].A); Assert.Equal(1, rows[0].B); } { - var q = _importer.QueryXlsxAsync(path, sheetName: "Sheet1").ToBlockingEnumerable(); + var q = _importer.QueryExcelAsync(path, sheetName: "Sheet1").ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal(12, rows.Count); Assert.Equal(2, rows[0].A); @@ -32,7 +32,7 @@ public async Task SpecifySheetNameQueryTest() { await Assert.ThrowsAsync(() => { - _ = _importer.QueryXlsxAsync(path, sheetName: "xxxx").ToBlockingEnumerable().ToList(); + _ = _importer.QueryExcelAsync(path, sheetName: "xxxx").ToBlockingEnumerable().ToList(); return Task.CompletedTask; }); } @@ -40,25 +40,25 @@ await Assert.ThrowsAsync(() => await using var stream = File.OpenRead(path); { - var rows = _importer.QueryXlsxAsync(stream, sheetName: "Sheet3").ToBlockingEnumerable().Cast>().ToList(); + var rows = _importer.QueryExcelAsync(stream, sheetName: "Sheet3").ToBlockingEnumerable().Cast>().ToList(); Assert.Equal(5, rows.Count); Assert.Equal(3d, rows[0]["A"]); Assert.Equal(3d, rows[0]["B"]); } { - var rows = _importer.QueryXlsxAsync(stream, sheetName: "Sheet2").ToBlockingEnumerable().Cast>().ToList(); + var rows = _importer.QueryExcelAsync(stream, sheetName: "Sheet2").ToBlockingEnumerable().Cast>().ToList(); Assert.Equal(12, rows.Count); Assert.Equal(1d, rows[0]["A"]); Assert.Equal(1d, rows[0]["B"]); } { - var rows = _importer.QueryXlsxAsync(stream, sheetName: "Sheet1").ToBlockingEnumerable().Cast>().ToList(); + var rows = _importer.QueryExcelAsync(stream, sheetName: "Sheet1").ToBlockingEnumerable().Cast>().ToList(); Assert.Equal(12, rows.Count); Assert.Equal(2d, rows[0]["A"]); Assert.Equal(2d, rows[0]["B"]); } { - var rows = _importer.QueryXlsxAsync(stream, sheetName: "Sheet1").ToBlockingEnumerable().Cast>().ToList(); + var rows = _importer.QueryExcelAsync(stream, sheetName: "Sheet1").ToBlockingEnumerable().Cast>().ToList(); Assert.Equal(12, rows.Count); Assert.Equal(2d, rows[0]["A"]); Assert.Equal(2d, rows[0]["B"]); @@ -70,9 +70,9 @@ public async Task MultiSheetsQueryBasicTest() { const string path = "../../../../../samples/xlsx/TestMultiSheet.xlsx"; await using var stream = File.OpenRead(path); - _ = _importer.QueryXlsxAsync(stream, sheetName: "Sheet1").ToBlockingEnumerable(); - _ = _importer.QueryXlsxAsync(stream, sheetName: "Sheet2").ToBlockingEnumerable(); - _ = _importer.QueryXlsxAsync(stream, sheetName: "Sheet3").ToBlockingEnumerable(); + _ = _importer.QueryExcelAsync(stream, sheetName: "Sheet1").ToBlockingEnumerable(); + _ = _importer.QueryExcelAsync(stream, sheetName: "Sheet2").ToBlockingEnumerable(); + _ = _importer.QueryExcelAsync(stream, sheetName: "Sheet3").ToBlockingEnumerable(); } [Fact] @@ -83,7 +83,7 @@ public async Task MultiSheetsQueryTest() var sheetNames = (await _importer.GetSheetNamesAsync(path)).ToList(); foreach (var sheetName in sheetNames) { - _ = _importer.QueryXlsxAsync(path, sheetName: sheetName).ToBlockingEnumerable(); + _ = _importer.QueryExcelAsync(path, sheetName: sheetName).ToBlockingEnumerable(); } Assert.Equal(new[] { "Sheet1", "Sheet2", "Sheet3" }, sheetNames); } @@ -94,7 +94,7 @@ public async Task MultiSheetsQueryTest() Assert.Equal(new[] { "Sheet1", "Sheet2", "Sheet3" }, sheetNames); foreach (var sheetName in sheetNames) { - _ = _importer.QueryXlsxAsync(stream, sheetName: sheetName).ToBlockingEnumerable().ToList(); + _ = _importer.QueryExcelAsync(stream, sheetName: sheetName).ToBlockingEnumerable().ToList(); } } } diff --git a/tests/MiniExcel.Tests/MiniExcelOpenXmlMultipleSheetTests.cs b/tests/MiniExcel.Tests/MiniExcelOpenXmlMultipleSheetTests.cs index cf5d7d83..7beafcbd 100644 --- a/tests/MiniExcel.Tests/MiniExcelOpenXmlMultipleSheetTests.cs +++ b/tests/MiniExcel.Tests/MiniExcelOpenXmlMultipleSheetTests.cs @@ -6,54 +6,54 @@ namespace MiniExcelLib.Tests; public class MiniExcelOpenXmlMultipleSheetTests { - private readonly MiniExcelImporter _importer = MiniExcel.GetImporter(); + private readonly OpenXmlImporter _importer = MiniExcel.GetImporterProvider().GetExcelImporter(); [Fact] public void SpecifySheetNameQueryTest() { const string path = "../../../../../samples/xlsx/TestMultiSheet.xlsx"; { - var rows = _importer.QueryXlsx(path, sheetName: "Sheet3").ToList(); + var rows = _importer.QueryExcel(path, sheetName: "Sheet3").ToList(); Assert.Equal(5, rows.Count); Assert.Equal(3, rows[0].A); Assert.Equal(3, rows[0].B); } { - var rows = _importer.QueryXlsx(path, sheetName: "Sheet2").ToList(); + var rows = _importer.QueryExcel(path, sheetName: "Sheet2").ToList(); Assert.Equal(12, rows.Count); Assert.Equal(1, rows[0].A); Assert.Equal(1, rows[0].B); } { - var rows = _importer.QueryXlsx(path, sheetName: "Sheet1").ToList(); + var rows = _importer.QueryExcel(path, sheetName: "Sheet1").ToList(); Assert.Equal(12, rows.Count); Assert.Equal(2, rows[0].A); Assert.Equal(2, rows[0].B); } - Assert.Throws(() => _importer.QueryXlsx(path, sheetName: "xxxx").ToList()); + Assert.Throws(() => _importer.QueryExcel(path, sheetName: "xxxx").ToList()); using var stream = File.OpenRead(path); { - var rows = _importer.QueryXlsx(stream, sheetName: "Sheet3").ToList(); + var rows = _importer.QueryExcel(stream, sheetName: "Sheet3").ToList(); Assert.Equal(5, rows.Count); Assert.Equal(3, rows[0].A); Assert.Equal(3, rows[0].B); } { - var rows = _importer.QueryXlsx(stream, sheetName: "Sheet2").ToList(); + var rows = _importer.QueryExcel(stream, sheetName: "Sheet2").ToList(); Assert.Equal(12, rows.Count); Assert.Equal(1, rows[0].A); Assert.Equal(1, rows[0].B); } { - var rows = _importer.QueryXlsx(stream, sheetName: "Sheet1").ToList(); + var rows = _importer.QueryExcel(stream, sheetName: "Sheet1").ToList(); Assert.Equal(12, rows.Count); Assert.Equal(2, rows[0].A); Assert.Equal(2, rows[0].B); } { - var rows = _importer.QueryXlsx(stream, sheetName: "Sheet1").ToList(); + var rows = _importer.QueryExcel(stream, sheetName: "Sheet1").ToList(); Assert.Equal(12, rows.Count); Assert.Equal(2, rows[0].A); Assert.Equal(2, rows[0].B); @@ -66,9 +66,9 @@ public void MultiSheetsQueryBasicTest() const string path = "../../../../../samples/xlsx/TestMultiSheet.xlsx"; using var stream = File.OpenRead(path); - _ = _importer.QueryXlsx(stream, sheetName: "Sheet1"); - _ = _importer.QueryXlsx(stream, sheetName: "Sheet2"); - _ = _importer.QueryXlsx(stream, sheetName: "Sheet3"); + _ = _importer.QueryExcel(stream, sheetName: "Sheet1"); + _ = _importer.QueryExcel(stream, sheetName: "Sheet2"); + _ = _importer.QueryExcel(stream, sheetName: "Sheet3"); } [Fact] @@ -79,7 +79,7 @@ public void MultiSheetsQueryTest() var sheetNames = _importer.GetSheetNames(path).ToList(); foreach (var sheetName in sheetNames) { - var rows = _importer.QueryXlsx(path, sheetName: sheetName).ToList(); + var rows = _importer.QueryExcel(path, sheetName: sheetName).ToList(); } Assert.Equal(new[] { "Sheet1", "Sheet2", "Sheet3" }, sheetNames); @@ -92,7 +92,7 @@ public void MultiSheetsQueryTest() foreach (var sheetName in sheetNames) { - var rows = _importer.QueryXlsx(stream, sheetName: sheetName).ToList(); + var rows = _importer.QueryExcel(stream, sheetName: sheetName).ToList(); } } } @@ -117,21 +117,21 @@ public void ExcelSheetAttributeIsUsedWhenReadExcel() const string path = "../../../../../samples/xlsx/TestDynamicSheet.xlsx"; using (var stream = File.OpenRead(path)) { - var users = _importer.QueryXlsx(stream).ToList(); + var users = _importer.QueryExcel(stream).ToList(); Assert.Equal(2, users.Count); Assert.Equal("Jack", users[0].Name); - var departments = _importer.QueryXlsx(stream).ToList(); + var departments = _importer.QueryExcel(stream).ToList(); Assert.Equal(2, departments.Count); Assert.Equal("HR", departments[0].Name); } { - var users = _importer.QueryXlsx(path).ToList(); + var users = _importer.QueryExcel(path).ToList(); Assert.Equal(2, users.Count); Assert.Equal("Jack", users[0].Name); - var departments = _importer.QueryXlsx(path).ToList(); + var departments = _importer.QueryExcel(path).ToList(); Assert.Equal(2, departments.Count); Assert.Equal("HR", departments[0].Name); } @@ -153,34 +153,34 @@ public void DynamicSheetConfigurationIsUsedWhenReadExcel() using (var stream = File.OpenRead(path)) { // take first sheet as default - var users = _importer.QueryXlsx(stream, configuration: configuration, useHeaderRow: true).ToList(); + var users = _importer.QueryExcel(stream, configuration: configuration, useHeaderRow: true).ToList(); Assert.Equal(2, users.Count); Assert.Equal("Jack", users[0].Name); // take second sheet by sheet name - var departments = _importer.QueryXlsx(stream, sheetName: "Departments", configuration: configuration, useHeaderRow: true).ToList(); + var departments = _importer.QueryExcel(stream, sheetName: "Departments", configuration: configuration, useHeaderRow: true).ToList(); Assert.Equal(2, departments.Count); Assert.Equal("HR", departments[0].Name); // take second sheet by sheet key - departments = _importer.QueryXlsx(stream, sheetName: "departmentSheet", configuration: configuration, useHeaderRow: true).ToList(); + departments = _importer.QueryExcel(stream, sheetName: "departmentSheet", configuration: configuration, useHeaderRow: true).ToList(); Assert.Equal(2, departments.Count); Assert.Equal("HR", departments[0].Name); } { // take first sheet as default - var users = _importer.QueryXlsx(path, configuration: configuration, useHeaderRow: true).ToList(); + var users = _importer.QueryExcel(path, configuration: configuration, useHeaderRow: true).ToList(); Assert.Equal(2, users.Count); Assert.Equal("Jack", users[0].Name); // take second sheet by sheet name - var departments = _importer.QueryXlsx(path, sheetName: "Departments", configuration: configuration, useHeaderRow: true).ToList(); + var departments = _importer.QueryExcel(path, sheetName: "Departments", configuration: configuration, useHeaderRow: true).ToList(); Assert.Equal(2, departments.Count); Assert.Equal("HR", departments[0].Name); // take second sheet by sheet key - departments = _importer.QueryXlsx(path, sheetName: "departmentSheet", configuration: configuration, useHeaderRow: true).ToList(); + departments = _importer.QueryExcel(path, sheetName: "departmentSheet", configuration: configuration, useHeaderRow: true).ToList(); Assert.Equal(2, departments.Count); Assert.Equal("HR", departments[0].Name); } @@ -255,7 +255,7 @@ public void WriteHiddenSheetTest() using var file = AutoDeletingPath.Create(); var path = file.ToString(); - var rowsWritten = MiniExcel.GetExporter().ExportXlsx(path, sheets, configuration: configuration); + var rowsWritten = MiniExcel.GetExporterProvider().GetExcelExporter().ExportExcel(path, sheets, configuration: configuration); Assert.Equal(2, rowsWritten.Length); Assert.Equal(2, rowsWritten[0]); @@ -279,7 +279,7 @@ public void WriteHiddenSheetTest() foreach (var sheetName in sheetInfos.Select(s => s.Name)) { - var rows = _importer.QueryXlsx(path, sheetName: sheetName).ToList(); + var rows = _importer.QueryExcel(path, sheetName: sheetName).ToList(); } } } \ No newline at end of file diff --git a/tests/MiniExcel.Tests/MiniExcelOpenXmlTests.cs b/tests/MiniExcel.Tests/MiniExcelOpenXmlTests.cs index ccea2714..b338d20a 100644 --- a/tests/MiniExcel.Tests/MiniExcelOpenXmlTests.cs +++ b/tests/MiniExcel.Tests/MiniExcelOpenXmlTests.cs @@ -11,26 +11,26 @@ public class MiniExcelOpenXmlTests(ITestOutputHelper output) { private readonly ITestOutputHelper _output = output; - private readonly MiniExcelImporter _importer = MiniExcel.GetImporter(); - private readonly MiniExcelExporter _exporter = MiniExcel.GetExporter(); - + private readonly OpenXmlImporter _importer = MiniExcel.GetImporterProvider().GetExcelImporter(); + private readonly OpenXmlExporter _exporter = MiniExcel.GetExporterProvider().GetExcelExporter(); + [Fact] public void GetColumnsTest() { const string tmPath = "../../../../../samples/xlsx/TestTypeMapping.xlsx"; const string tePath = "../../../../../samples/xlsx/TestEmpty.xlsx"; { - var columns = _importer.GetXlsxColumns (tmPath); + var columns = _importer.GetExcelColumns (tmPath); Assert.Equal(["A", "B", "C", "D", "E", "F", "G", "H"], columns); } { - var columns = _importer.GetXlsxColumns (tmPath); + var columns = _importer.GetExcelColumns (tmPath); Assert.Equal(8, columns.Count); } { - var columns = _importer.GetXlsxColumns (tePath); + var columns = _importer.GetExcelColumns (tePath); Assert.Empty(columns); } } @@ -50,10 +50,10 @@ public void SaveAsControlChracter() '\u0017','\u0018','\u0019','\u001A','\u001B','\u001C','\u001D','\u001E','\u001F','\u007F' ]; var input = chars.Select(s => new { Test = s.ToString() }); - _exporter.ExportXlsx(path.ToString(), input); + _exporter.ExportExcel(path.ToString(), input); - var rows2 = _importer.QueryXlsx(path.ToString(), true).Select(s => s.Test).ToArray(); - var rows1 = _importer.QueryXlsx(path.ToString()).Select(s => s.Test).ToArray(); + var rows2 = _importer.QueryExcel(path.ToString(), true).Select(s => s.Test).ToArray(); + var rows1 = _importer.QueryExcel(path.ToString()).Select(s => s.Test).ToArray(); } private class SaveAsControlChracterVO @@ -81,14 +81,14 @@ private class ExcelAttributeDemo public void CustomAttributeWihoutVaildPropertiesTest() { const string path = "../../../../../samples/xlsx/TestCustomExcelColumnAttribute.xlsx"; - Assert.Throws(() => _importer.QueryXlsx(path).ToList()); + Assert.Throws(() => _importer.QueryExcel(path).ToList()); } [Fact] public void QueryCustomAttributesTest() { const string path = "../../../../../samples/xlsx/TestCustomExcelColumnAttribute.xlsx"; - var rows = _importer.QueryXlsx(path).ToList(); + var rows = _importer.QueryExcel(path).ToList(); Assert.Equal("Column1", rows[0].Test1); Assert.Equal("Column2", rows[0].Test2); @@ -112,8 +112,8 @@ public void SaveAsCustomAttributesTest() Test4 = "Test4", }); - _exporter.ExportXlsx(path.ToString(), input); - var rows = _importer.QueryXlsx(path.ToString(), true).ToList(); + _exporter.ExportExcel(path.ToString(), input); + var rows = _importer.QueryExcel(path.ToString(), true).ToList(); var first = rows[0] as IDictionary; Assert.Equal(3, rows.Count); @@ -139,7 +139,7 @@ private class CustomAttributesWihoutVaildPropertiesTestPoco public void QueryCastToIDictionary() { const string path = "../../../../../samples/xlsx/TestCenterEmptyRow/TestCenterEmptyRow.xlsx"; - foreach (IDictionary row in _importer.QueryXlsx(path)) + foreach (IDictionary row in _importer.QueryExcel(path)) { _ = row; } @@ -150,7 +150,7 @@ public void QueryRangeToIDictionary() { const string path = "../../../../../samples/xlsx/TestCenterEmptyRow/TestCenterEmptyRow.xlsx"; // tips:Only uppercase letters are effective - var rows = _importer.QueryRangeXlsx(path, startCell: "A2", endCell: "C7") + var rows = _importer.QueryExcelRange(path, startCell: "A2", endCell: "C7") .Cast>() .ToList(); @@ -161,7 +161,7 @@ public void QueryRangeToIDictionary() var startCellXY = ReferenceHelper.ConvertCellToCoordinates("A2"); var endCellXY = ReferenceHelper.ConvertCellToCoordinates("C7"); - rows = _importer.QueryRangeXlsx(path, startRowIndex: startCellXY.Item2, startColumnIndex: startCellXY.Item1, endRowIndex: endCellXY.Item2, endColumnIndex: endCellXY.Item1) + rows = _importer.QueryExcelRange(path, startRowIndex: startCellXY.Item2, startColumnIndex: startCellXY.Item1, endRowIndex: endCellXY.Item2, endColumnIndex: endCellXY.Item1) .Cast>() .ToList(); Assert.Equal(5, rows.Count); @@ -169,14 +169,14 @@ public void QueryRangeToIDictionary() Assert.Equal(2d, rows[1]["B"]); Assert.Equal(null!, rows[2]["A"]); - rows = _importer.QueryRangeXlsx(path, startRowIndex:2, startColumnIndex: 1, endRowIndex: 3) + rows = _importer.QueryExcelRange(path, startRowIndex:2, startColumnIndex: 1, endRowIndex: 3) .Cast>() .ToList(); Assert.Equal(2, rows.Count); Assert.Equal(4, rows[0].Count); Assert.Equal(4d, rows[1]["D"]); - rows = _importer.QueryRangeXlsx(path, startRowIndex: 2, startColumnIndex: 1, endColumnIndex: 3) + rows = _importer.QueryExcelRange(path, startRowIndex: 2, startColumnIndex: 1, endColumnIndex: 3) .Cast>() .ToList(); Assert.Equal(5, rows.Count); @@ -190,7 +190,7 @@ public void CenterEmptyRowsQueryTest() const string path = "../../../../../samples/xlsx/TestCenterEmptyRow/TestCenterEmptyRow.xlsx"; using (var stream = File.OpenRead(path)) { - var rows = _importer.QueryXlsx(stream).ToList(); + var rows = _importer.QueryExcel(stream).ToList(); Assert.Equal("a", rows[0].A); Assert.Equal("b", rows[0].B); @@ -225,7 +225,7 @@ public void CenterEmptyRowsQueryTest() using (var stream = File.OpenRead(path)) { - var rows = _importer.QueryXlsx(stream, useHeaderRow: true).ToList(); + var rows = _importer.QueryExcel(stream, useHeaderRow: true).ToList(); Assert.Equal(1, rows[0].a); Assert.Equal(null, rows[0].b); @@ -259,7 +259,7 @@ public void TestEmptyRowsQuerySelfClosingTag() { const string path = "../../../../../samples/xlsx/TestEmptySelfClosingRow.xlsx"; using var stream = File.OpenRead(path); - var rows = _importer.QueryXlsx(stream).ToList(); + var rows = _importer.QueryExcel(stream).ToList(); Assert.Equal(null, rows[0].A); Assert.Equal(1, rows[1].A); @@ -278,7 +278,7 @@ public void TestDynamicQueryBasic_WithoutHead() { const string path = "../../../../../samples/xlsx/TestDynamicQueryBasic_WithoutHead.xlsx"; using var stream = File.OpenRead(path); - var rows = _importer.QueryXlsx(stream).ToList(); + var rows = _importer.QueryExcel(stream).ToList(); Assert.Equal("MiniExcel", rows[0].A); Assert.Equal(1, rows[0].B); @@ -292,7 +292,7 @@ public void TestDynamicQueryBasic_useHeaderRow() const string path = "../../../../../samples/xlsx/TestDynamicQueryBasic.xlsx"; using (var stream = File.OpenRead(path)) { - var rows = _importer.QueryXlsx(stream, useHeaderRow: true).ToList(); + var rows = _importer.QueryExcel(stream, useHeaderRow: true).ToList(); Assert.Equal("MiniExcel", rows[0].Column1); Assert.Equal(1, rows[0].Column2); @@ -301,7 +301,7 @@ public void TestDynamicQueryBasic_useHeaderRow() } { - var rows = _importer.QueryXlsx(path, useHeaderRow: true).ToList(); + var rows = _importer.QueryExcel(path, useHeaderRow: true).ToList(); Assert.Equal("MiniExcel", rows[0].Column1); Assert.Equal(1, rows[0].Column2); @@ -332,7 +332,7 @@ public void QueryStrongTypeMapping_Test() const string path = "../../../../../samples/xlsx/TestTypeMapping.xlsx"; using (var stream = File.OpenRead(path)) { - var rows = _importer.QueryXlsx(stream).ToList(); + var rows = _importer.QueryExcel(stream).ToList(); Assert.Equal(100, rows.Count); Assert.Equal(Guid.Parse("78DE23D2-DCB6-BD3D-EC67-C112BBC322A2"), rows[0].ID); @@ -345,7 +345,7 @@ public void QueryStrongTypeMapping_Test() } { - var rows = _importer.QueryXlsx(path).ToList(); + var rows = _importer.QueryExcel(path).ToList(); Assert.Equal(100, rows.Count); Assert.Equal(Guid.Parse("78DE23D2-DCB6-BD3D-EC67-C112BBC322A2"), rows[0].ID); @@ -371,7 +371,7 @@ public void AutoCheckTypeTest() { const string path = "../../../../../samples/xlsx/TestTypeMapping_AutoCheckFormat.xlsx"; using var stream = FileHelper.OpenRead(path); - var rows = _importer.QueryXlsx(stream).ToList(); + var rows = _importer.QueryExcel(stream).ToList(); } private class ExcelUriDemo @@ -386,7 +386,7 @@ public void UriMappingTest() { const string path = "../../../../../samples/xlsx/TestUriMapping.xlsx"; using var stream = File.OpenRead(path); - var rows = _importer.QueryXlsx(stream).ToList(); + var rows = _importer.QueryExcel(stream).ToList(); Assert.Equal("Felix", rows[1].Name); Assert.Equal(44, rows[1].Age); @@ -404,7 +404,7 @@ private class SimpleAccount public void TrimColumnNamesTest() { const string path = "../../../../../samples/xlsx/TestTrimColumnNames.xlsx"; - var rows = _importer.QueryXlsx(path).ToList(); + var rows = _importer.QueryExcel(path).ToList(); Assert.Equal("Raymond", rows[4].Name); Assert.Equal(18, rows[4].Age); @@ -418,7 +418,7 @@ public void TestDatetimeSpanFormat_ClosedXml() const string path = "../../../../../samples/xlsx/TestDatetimeSpanFormat_ClosedXml.xlsx"; using var stream = FileHelper.OpenRead(path); - var row = _importer.QueryXlsx(stream).First(); + var row = _importer.QueryExcel(stream).First(); var a = row.A; var b = row.B; Assert.Equal(DateTime.Parse("2021-03-20T23:39:42.3130000"), (DateTime)a); @@ -431,13 +431,13 @@ public void LargeFileQueryStrongTypeMapping_Test() const string path = "../../../../../benchmarks/MiniExcel.Benchmarks/Test1,000,000x10.xlsx"; using (var stream = File.OpenRead(path)) { - var rows = _importer.QueryXlsx(stream).Take(2).ToList(); + var rows = _importer.QueryExcel(stream).Take(2).ToList(); Assert.Equal("HelloWorld2", rows[0].HelloWorld1); Assert.Equal("HelloWorld3", rows[1].HelloWorld1); } { - var rows = _importer.QueryXlsx(path).Take(2).ToList(); + var rows = _importer.QueryExcel(path).Take(2).ToList(); Assert.Equal("HelloWorld2", rows[0].HelloWorld1); Assert.Equal("HelloWorld3", rows[1].HelloWorld1); @@ -457,7 +457,7 @@ public void QueryExcelDataReaderCheckTest(string path) var exceldatareaderResult = reader.AsDataSet(); using var stream = File.OpenRead(path); - var rows = _importer.QueryXlsx(stream).ToList(); + var rows = _importer.QueryExcel(stream).ToList(); Assert.Equal(exceldatareaderResult.Tables[0].Rows.Count, rows.Count); foreach (IDictionary row in rows) @@ -487,7 +487,7 @@ public void QuerySheetWithoutRAttribute() { const string path = "../../../../../samples/xlsx/TestWihoutRAttribute.xlsx"; using var stream = File.OpenRead(path); - var rows = _importer.QueryXlsx(stream).ToList(); + var rows = _importer.QueryExcel(stream).ToList(); var keys = (rows.First() as IDictionary)!.Keys; Assert.Equal(2, rows.Count); @@ -509,7 +509,7 @@ public void FixDimensionJustOneColumnParsingError_Test() { const string path = "../../../../../samples/xlsx/TestDimensionC3.xlsx"; using var stream = File.OpenRead(path); - var rows = _importer.QueryXlsx(stream).ToList(); + var rows = _importer.QueryExcel(stream).ToList(); var keys = ((IDictionary)rows.First()).Keys; Assert.Equal(3, keys.Count); Assert.Equal(2, rows.Count); @@ -533,11 +533,11 @@ public void SaveAsFileWithDimensionByICollection() new() { A = "A", B = "B" }, new() { A = "A", B = "B" } ]; - _exporter.ExportXlsx(path, values); + _exporter.ExportExcel(path, values); using (var stream = File.OpenRead(path)) { - var rows = _importer.QueryXlsx(stream, useHeaderRow: false).ToList(); + var rows = _importer.QueryExcel(stream, useHeaderRow: false).ToList(); Assert.Equal(3, rows.Count); Assert.Equal("A", rows[0].A); Assert.Equal("A", rows[1].A); @@ -545,14 +545,14 @@ public void SaveAsFileWithDimensionByICollection() } using (var stream = File.OpenRead(path)) { - var rows = _importer.QueryXlsx(stream, useHeaderRow: true).ToList(); + var rows = _importer.QueryExcel(stream, useHeaderRow: true).ToList(); Assert.Equal(2, rows.Count); Assert.Equal("A", rows[0].A); Assert.Equal("A", rows[1].A); } Assert.Equal("A1:B3", SheetHelper.GetFirstSheetDimensionRefValue(path)); - _exporter.ExportXlsx(path, values, false, overwriteFile: true); + _exporter.ExportExcel(path, values, false, overwriteFile: true); Assert.Equal("A1:B2", SheetHelper.GetFirstSheetDimensionRefValue(path)); } @@ -562,20 +562,20 @@ public void SaveAsFileWithDimensionByICollection() var path = file.ToString(); List values = []; - _exporter.ExportXlsx(path, values, false); + _exporter.ExportExcel(path, values, false); { using (var stream = File.OpenRead(path)) { - var rows = _importer.QueryXlsx(stream, useHeaderRow: false).ToList(); + var rows = _importer.QueryExcel(stream, useHeaderRow: false).ToList(); Assert.Empty(rows); } Assert.Equal("A1:B1", SheetHelper.GetFirstSheetDimensionRefValue(path)); } - _exporter.ExportXlsx(path, values, overwriteFile: true); + _exporter.ExportExcel(path, values, overwriteFile: true); { using var stream = File.OpenRead(path); - var rows = _importer.QueryXlsx(stream, useHeaderRow: false).ToList(); + var rows = _importer.QueryExcel(stream, useHeaderRow: false).ToList(); Assert.Single(rows); } Assert.Equal("A1:B1", SheetHelper.GetFirstSheetDimensionRefValue(path)); @@ -590,11 +590,11 @@ public void SaveAsFileWithDimensionByICollection() new {A="A",B="B"}, new {A="A",B="B"}, }; - _exporter.ExportXlsx(path, values); + _exporter.ExportExcel(path, values); { using (var stream = File.OpenRead(path)) { - var rows = _importer.QueryXlsx(stream, useHeaderRow: false).ToList(); + var rows = _importer.QueryExcel(stream, useHeaderRow: false).ToList(); Assert.Equal(3, rows.Count); Assert.Equal("A", rows[0].A); Assert.Equal("A", rows[1].A); @@ -602,7 +602,7 @@ public void SaveAsFileWithDimensionByICollection() } using (var stream = File.OpenRead(path)) { - var rows = _importer.QueryXlsx(stream, useHeaderRow: true).ToList(); + var rows = _importer.QueryExcel(stream, useHeaderRow: true).ToList(); Assert.Equal(2, rows.Count); Assert.Equal("A", rows[0].A); Assert.Equal("A", rows[1].A); @@ -610,7 +610,7 @@ public void SaveAsFileWithDimensionByICollection() } Assert.Equal("A1:B3", SheetHelper.GetFirstSheetDimensionRefValue(path)); - _exporter.ExportXlsx(path, values, false, overwriteFile: true); + _exporter.ExportExcel(path, values, false, overwriteFile: true); Assert.Equal("A1:B2", SheetHelper.GetFirstSheetDimensionRefValue(path)); } @@ -618,7 +618,7 @@ public void SaveAsFileWithDimensionByICollection() { using var path = AutoDeletingPath.Create(); var values = new List(); - Assert.Throws(() => _exporter.ExportXlsx(path.ToString(), values)); + Assert.Throws(() => _exporter.ExportExcel(path.ToString(), values)); } } @@ -630,15 +630,15 @@ public void SaveAsFileWithDimension() var path = file.ToString(); var table = new DataTable(); - _exporter.ExportXlsx(path, table); + _exporter.ExportExcel(path, table); Assert.Equal("A1", SheetHelper.GetFirstSheetDimensionRefValue(path)); { using var stream = File.OpenRead(path); - var rows = _importer.QueryXlsx(stream).ToList(); + var rows = _importer.QueryExcel(stream).ToList(); Assert.Single(rows); } - _exporter.ExportXlsx(path, table, printHeader: false, overwriteFile: true); + _exporter.ExportExcel(path, table, printHeader: false, overwriteFile: true); Assert.Equal("A1", SheetHelper.GetFirstSheetDimensionRefValue(path)); } @@ -654,12 +654,12 @@ public void SaveAsFileWithDimension() table.Rows.Add(@"""<>+-*//}{\\n", 1234567890); table.Rows.Add("Hello World", -1234567890, false, DateTime.Now); - _exporter.ExportXlsx(path, table); + _exporter.ExportExcel(path, table); Assert.Equal("A1:D3", SheetHelper.GetFirstSheetDimensionRefValue(path)); using (var stream = File.OpenRead(path)) { - var rows = _importer.QueryXlsx(stream, useHeaderRow: true).ToList(); + var rows = _importer.QueryExcel(stream, useHeaderRow: true).ToList(); Assert.Equal(2, rows.Count); Assert.Equal(@"""<>+-*//}{\\n", rows[0].a); Assert.Equal(1234567890, rows[0].b); @@ -669,7 +669,7 @@ public void SaveAsFileWithDimension() using (var stream = File.OpenRead(path)) { - var rows = _importer.QueryXlsx(stream).ToList(); + var rows = _importer.QueryExcel(stream).ToList(); Assert.Equal(3, rows.Count); Assert.Equal("a", rows[0].A); Assert.Equal("b", rows[0].B); @@ -677,7 +677,7 @@ public void SaveAsFileWithDimension() Assert.Equal("d", rows[0].D); } - _exporter.ExportXlsx(path, table, printHeader: false, overwriteFile: true); + _exporter.ExportExcel(path, table, printHeader: false, overwriteFile: true); Assert.Equal("A1:D2", SheetHelper.GetFirstSheetDimensionRefValue(path)); } @@ -690,7 +690,7 @@ public void SaveAsFileWithDimension() table.Rows.Add("A"); table.Rows.Add("B"); - _exporter.ExportXlsx(path.ToString(), table); + _exporter.ExportExcel(path.ToString(), table); Assert.Equal("A1:A3", SheetHelper.GetFirstSheetDimensionRefValue(path.ToString())); } } @@ -711,7 +711,7 @@ public void SaveAsByDataTableTest() table.Rows.Add(@"""<>+-*//}{\\n", 1234567890, true, now); table.Rows.Add("Hello World", -1234567890, false, now.Date); - _exporter.ExportXlsx(path, table, sheetName: "R&D"); + _exporter.ExportExcel(path, table, sheetName: "R&D"); using var p = new ExcelPackage(new FileInfo(path)); var ws = p.Workbook.Worksheets.First(); @@ -736,7 +736,7 @@ public void SaveAsByDataTableTest() table.Rows.Add("MiniExcel", 1); table.Rows.Add("Github", 2); - _exporter.ExportXlsx(path.ToString(), table); + _exporter.ExportExcel(path.ToString(), table); } } @@ -745,16 +745,16 @@ public void QueryByLINQExtensionsAvoidLargeFileOOMTest() { const string path = "../../../../../benchmarks/MiniExcel.Benchmarks/Test1,000,000x10.xlsx"; - var query1 = _importer.QueryXlsx(path).First(); + var query1 = _importer.QueryExcel(path).First(); Assert.Equal("HelloWorld1", query1.A); using (var stream = File.OpenRead(path)) { - var query2 = _importer.QueryXlsx(stream).First(); + var query2 = _importer.QueryExcel(stream).First(); Assert.Equal("HelloWorld1", query2.A); } - var query3 = _importer.QueryXlsx(path).Take(10); + var query3 = _importer.QueryExcel(path).Take(10); Assert.Equal(10, query3.Count()); } @@ -765,11 +765,11 @@ public void EmptyTest() using (var connection = Db.GetConnection("Data Source=:memory:")) { var rows = connection.Query("with cte as (select 1 id,2 val) select * from cte where 1=2"); - _exporter.ExportXlsx(path.ToString(), rows); + _exporter.ExportExcel(path.ToString(), rows); } using (var stream = File.OpenRead(path.ToString())) { - var rows = _importer.QueryXlsx(stream, useHeaderRow: true).ToList(); + var rows = _importer.QueryExcel(stream, useHeaderRow: true).ToList(); Assert.Empty(rows); } } @@ -791,11 +791,11 @@ public void SaveAsByIEnumerableIDictionary() ["R&D"] = values, ["success!"] = values }; - _exporter.ExportXlsx(path, sheets); + _exporter.ExportExcel(path, sheets); using (var stream = File.OpenRead(path)) { - var rows = _importer.QueryXlsx(stream, useHeaderRow: false).ToList(); + var rows = _importer.QueryExcel(stream, useHeaderRow: false).ToList(); Assert.Equal("Column1", rows[0].A); Assert.Equal("Column2", rows[0].B); Assert.Equal("MiniExcel", rows[1].A); @@ -808,7 +808,7 @@ public void SaveAsByIEnumerableIDictionary() using (var stream = File.OpenRead(path)) { - var rows = _importer.QueryXlsx(stream, useHeaderRow: true).ToList(); + var rows = _importer.QueryExcel(stream, useHeaderRow: true).ToList(); Assert.Equal(2, rows.Count); Assert.Equal("MiniExcel", rows[0].Column1); @@ -828,11 +828,11 @@ public void SaveAsByIEnumerableIDictionary() new() { { 1, "MiniExcel"}, { 2, 1 } }, new() { { 1, "Github" }, { 2, 2 } }, }; - _exporter.ExportXlsx(path, values, overwriteFile: true); + _exporter.ExportExcel(path, values, overwriteFile: true); using (var stream = File.OpenRead(path)) { - var rows = _importer.QueryXlsx(stream, useHeaderRow: false).ToList(); + var rows = _importer.QueryExcel(stream, useHeaderRow: false).ToList(); Assert.Equal(3, rows.Count); } @@ -851,7 +851,7 @@ public void SaveAsFrozenRowsAndColumnsTest() // Test enumerable using var path = AutoDeletingPath.Create(); - _exporter.ExportXlsx( + _exporter.ExportExcel( path.ToString(), new[] { @@ -863,7 +863,7 @@ public void SaveAsFrozenRowsAndColumnsTest() using (var stream = File.OpenRead(path.ToString())) { - var rows = _importer.QueryXlsx(stream, useHeaderRow: true).ToList(); + var rows = _importer.QueryExcel(stream, useHeaderRow: true).ToList(); Assert.Equal("MiniExcel", rows[0].Column1); Assert.Equal(1, rows[0].Column2); @@ -883,14 +883,14 @@ public void SaveAsFrozenRowsAndColumnsTest() table.Rows.Add("Hello World", -1234567890, false, DateTime.Now.Date); using var pathTable = AutoDeletingPath.Create(); - _exporter.ExportXlsx(pathTable.ToString(), table, configuration: config); + _exporter.ExportExcel(pathTable.ToString(), table, configuration: config); Assert.Equal("A1:D3", SheetHelper.GetFirstSheetDimensionRefValue(pathTable.ToString())); // data reader var reader = table.CreateDataReader(); using var pathReader = AutoDeletingPath.Create(); - _exporter.ExportXlsx(pathReader.ToString(), reader, configuration: config, overwriteFile: true); + _exporter.ExportExcel(pathReader.ToString(), reader, configuration: config, overwriteFile: true); Assert.Equal("A1:D3", SheetHelper.GetFirstSheetDimensionRefValue(pathTable.ToString())); //TODO: fix datareader not writing ref dimension (also in async version) } @@ -904,14 +904,14 @@ public void SaveAsByDapperRows() using (var connection = Db.GetConnection("Data Source=:memory:")) { var rows = connection.Query("select 'MiniExcel' as Column1,1 as Column2 union all select 'Github',2"); - _exporter.ExportXlsx(path, rows); + _exporter.ExportExcel(path, rows); } Assert.Equal("A1:B3", SheetHelper.GetFirstSheetDimensionRefValue(path)); using (var stream = File.OpenRead(path)) { - var rows = _importer.QueryXlsx(stream, useHeaderRow: true).ToList(); + var rows = _importer.QueryExcel(stream, useHeaderRow: true).ToList(); Assert.Equal("MiniExcel", rows[0].Column1); Assert.Equal(1, rows[0].Column2); @@ -923,18 +923,18 @@ public void SaveAsByDapperRows() using (var connection = Db.GetConnection("Data Source=:memory:")) { var rows = connection.Query("with cte as (select 'MiniExcel' as Column1,1 as Column2 union all select 'Github',2)select * from cte where 1=2").ToList(); - _exporter.ExportXlsx(path, rows, overwriteFile: true); + _exporter.ExportExcel(path, rows, overwriteFile: true); } using (var stream = File.OpenRead(path)) { - var rows = _importer.QueryXlsx(stream, useHeaderRow: false).ToList(); + var rows = _importer.QueryExcel(stream, useHeaderRow: false).ToList(); Assert.Empty(rows); } using (var stream = File.OpenRead(path)) { - var rows = _importer.QueryXlsx(stream, useHeaderRow: true).ToList(); + var rows = _importer.QueryExcel(stream, useHeaderRow: true).ToList(); Assert.Empty(rows); } @@ -944,14 +944,14 @@ public void SaveAsByDapperRows() using (var connection = Db.GetConnection("Data Source=:memory:")) { var rows = connection.Query("select 'MiniExcel' as Column1,1 as Column2 union all select 'Github',2").ToList(); - _exporter.ExportXlsx(path, rows, overwriteFile: true); + _exporter.ExportExcel(path, rows, overwriteFile: true); } Assert.Equal("A1:B3", SheetHelper.GetFirstSheetDimensionRefValue(path)); using (var stream = File.OpenRead(path)) { - var rows = _importer.QueryXlsx(stream, useHeaderRow: false).ToList(); + var rows = _importer.QueryExcel(stream, useHeaderRow: false).ToList(); Assert.Equal("Column1", rows[0].A); Assert.Equal("Column2", rows[0].B); @@ -963,7 +963,7 @@ public void SaveAsByDapperRows() using (var stream = File.OpenRead(path)) { - var rows = _importer.QueryXlsx(stream, useHeaderRow: true).ToList(); + var rows = _importer.QueryExcel(stream, useHeaderRow: true).ToList(); Assert.Equal("MiniExcel", rows[0].Column1); Assert.Equal(1, rows[0].Column2); @@ -986,10 +986,10 @@ public void QueryByStrongTypeParameterTest() new() { Column1 = "MiniExcel", Column2 = 1 }, new() { Column1 = "Github", Column2 = 2 } ]; - _exporter.ExportXlsx(path.ToString(), values); + _exporter.ExportExcel(path.ToString(), values); using var stream = File.OpenRead(path.ToString()); - var rows = _importer.QueryXlsx(stream, useHeaderRow: true).ToList(); + var rows = _importer.QueryExcel(stream, useHeaderRow: true).ToList(); Assert.Equal("MiniExcel", rows[0].Column1); Assert.Equal(1, rows[0].Column2); @@ -1006,10 +1006,10 @@ public void QueryByDictionaryStringAndObjectParameterTest() new() { { "Column1", "MiniExcel" }, { "Column2", 1 } }, new() { { "Column1", "Github" }, { "Column2", 2 } } ]; - _exporter.ExportXlsx(path.ToString(), values); + _exporter.ExportExcel(path.ToString(), values); using var stream = File.OpenRead(path.ToString()); - var rows = _importer.QueryXlsx(stream, useHeaderRow: true).ToList(); + var rows = _importer.QueryExcel(stream, useHeaderRow: true).ToList(); Assert.Equal("MiniExcel", rows[0].Column1); Assert.Equal(1, rows[0].Column2); @@ -1036,7 +1036,7 @@ public void SQLiteInsertTest() using (var transaction = connection.BeginTransaction()) using (var stream = File.OpenRead(path)) { - var rows = _importer.QueryXlsx(stream); + var rows = _importer.QueryExcel(stream); foreach (var row in rows) { _ = connection.Execute("insert into T (A,B) values (@A,@B)", new { row.A, row.B }, transaction: transaction); @@ -1058,7 +1058,7 @@ public void SaveAsBasicCreateTest() { using var path = AutoDeletingPath.Create(); - var rowsWritten = _exporter.ExportXlsx(path.ToString(), new[] + var rowsWritten = _exporter.ExportExcel(path.ToString(), new[] { new { Column1 = "MiniExcel", Column2 = 1 }, new { Column1 = "Github", Column2 = 2} @@ -1069,7 +1069,7 @@ public void SaveAsBasicCreateTest() using (var stream = File.OpenRead(path.ToString())) { - var rows = _importer.QueryXlsx(stream, useHeaderRow: true).ToList(); + var rows = _importer.QueryExcel(stream, useHeaderRow: true).ToList(); Assert.Equal("MiniExcel", rows[0].Column1); Assert.Equal(1, rows[0].Column2); @@ -1092,14 +1092,14 @@ public void SaveAsBasicStreamTest() }; using (var stream = new FileStream(path.ToString(), FileMode.CreateNew)) { - var rowsWritten = _exporter.ExportXlsx(stream, values); + var rowsWritten = _exporter.ExportExcel(stream, values); Assert.Single(rowsWritten); Assert.Equal(2, rowsWritten[0]); } using (var stream = File.OpenRead(path.ToString())) { - var rows = _importer.QueryXlsx(stream, useHeaderRow: true).ToList(); + var rows = _importer.QueryExcel(stream, useHeaderRow: true).ToList(); Assert.Equal("MiniExcel", rows[0].Column1); Assert.Equal(1, rows[0].Column2); @@ -1117,7 +1117,7 @@ public void SaveAsBasicStreamTest() using (var stream = new MemoryStream()) using (var fileStream = new FileStream(path.ToString(), FileMode.Create)) { - var rowsWritten = _exporter.ExportXlsx(stream, values); + var rowsWritten = _exporter.ExportExcel(stream, values); stream.Seek(0, SeekOrigin.Begin); stream.CopyTo(fileStream); Assert.Single(rowsWritten); @@ -1126,7 +1126,7 @@ public void SaveAsBasicStreamTest() using (var stream = File.OpenRead(path.ToString())) { - var rows = _importer.QueryXlsx(stream, useHeaderRow: true).ToList(); + var rows = _importer.QueryExcel(stream, useHeaderRow: true).ToList(); Assert.Equal("MiniExcel", rows[0].Column1); Assert.Equal(1, rows[0].Column2); @@ -1140,7 +1140,7 @@ public void SaveAsBasicStreamTest() public void SaveAsSpecialAndTypeCreateTest() { using var path = AutoDeletingPath.Create(); - var rowsWritten = _exporter.ExportXlsx(path.ToString(), new[] + var rowsWritten = _exporter.ExportExcel(path.ToString(), new[] { new { a = @"""<>+-*//}{\\n", b = 1234567890, c = true, d = DateTime.Now }, new { a = "Hello World", b = -1234567890, c = false, d = DateTime.Now.Date } @@ -1157,7 +1157,7 @@ public void SaveAsFileEpplusCanReadTest() { var now = DateTime.Now; using var path = AutoDeletingPath.Create(); - var rowsWritten = _exporter.ExportXlsx(path.ToString(), new[] + var rowsWritten = _exporter.ExportExcel(path.ToString(), new[] { new { a = @"""<>+-*//}{\\n", b = 1234567890, c = true, d = now}, new { a = "Hello World", b = -1234567890, c = false, d = now.Date } @@ -1184,7 +1184,7 @@ public void SavaAsClosedXmlCanReadTest() { var now = DateTime.Now; using var path = AutoDeletingPath.Create(); - var rowsWritten = _exporter.ExportXlsx(path.ToString(), new[] + var rowsWritten = _exporter.ExportExcel(path.ToString(), new[] { new { a = @"""<>+-*//}{\\n", b = 1234567890, c = true, d = now }, new { a = "Hello World", b = -1234567890, c = false, d = now.Date } @@ -1214,7 +1214,7 @@ public void ContentTypeUriContentTypeReadCheckTest() { var now = DateTime.Now; using var path = AutoDeletingPath.Create(); - var rowsWritten = _exporter.ExportXlsx(path.ToString(), new[] + var rowsWritten = _exporter.ExportExcel(path.ToString(), new[] { new { a = @"""<>+-*//}{\\n", b = 1234567890, c = true, d= now }, new { a = "Hello World", b = -1234567890, c = false, d = now.Date } @@ -1238,10 +1238,10 @@ public void ContentTypeUriContentTypeReadCheckTest() public void TestStirctOpenXml() { const string path = "../../../../../samples/xlsx/TestStrictOpenXml.xlsx"; - var columns = _importer.GetXlsxColumns (path); + var columns = _importer.GetExcelColumns (path); Assert.Equal(["A", "B", "C"], columns); - var rows = _importer.QueryXlsx(path).ToList(); + var rows = _importer.QueryExcel(path).ToList(); Assert.Equal(rows[0].A, "title1"); Assert.Equal(rows[0].B, "title2"); Assert.Equal(rows[0].C, "title3"); @@ -1256,7 +1256,7 @@ public void SharedStringCacheTest() const string path = "../../../../../benchmarks/MiniExcel.Benchmarks/Test1,000,000x10_SharingStrings.xlsx"; var ts = Stopwatch.GetTimestamp(); - _ = _importer.QueryXlsx(path, configuration: new OpenXmlConfiguration { EnableSharedStringCache = true }).First(); + _ = _importer.QueryExcel(path, configuration: new OpenXmlConfiguration { EnableSharedStringCache = true }).First(); using var currentProcess = Process.GetCurrentProcess(); var totalBytesOfMemoryUsed = currentProcess.WorkingSet64; @@ -1270,7 +1270,7 @@ public void SharedStringNoCacheTest() const string path = "../../../../../benchmarks/MiniExcel.Benchmarks/Test1,000,000x10_SharingStrings.xlsx"; var ts = Stopwatch.GetTimestamp(); - _ = _importer.QueryXlsx(path).First(); + _ = _importer.QueryExcel(path).First(); using var currentProcess = Process.GetCurrentProcess(); var totalBytesOfMemoryUsed = currentProcess.WorkingSet64; _output.WriteLine("totalBytesOfMemoryUsed: " + totalBytesOfMemoryUsed); @@ -1318,10 +1318,10 @@ public void DynamicColumnsConfigurationIsUsedWhenCreatingExcelUsingIDataReader() ] }; var reader = table.CreateDataReader(); - _exporter.ExportXlsx(path.ToString(), reader, configuration: configuration); + _exporter.ExportExcel(path.ToString(), reader, configuration: configuration); using var stream = File.OpenRead(path.ToString()); - var rows = _importer.QueryXlsx(stream, useHeaderRow: true) + var rows = _importer.QueryExcel(stream, useHeaderRow: true) .Select(x => (IDictionary)x) .ToList(); @@ -1384,10 +1384,10 @@ public void DynamicColumnsConfigurationIsUsedWhenCreatingExcelUsingDataTable() } ] }; - _exporter.ExportXlsx(path.ToString(), table, configuration: configuration); + _exporter.ExportExcel(path.ToString(), table, configuration: configuration); using var stream = File.OpenRead(path.ToString()); - var rows = _importer.QueryXlsx(stream, useHeaderRow: true) + var rows = _importer.QueryExcel(stream, useHeaderRow: true) .Select(x => (IDictionary)x) .Select(x => (IDictionary)x) .ToList(); @@ -1428,7 +1428,7 @@ public void InsertSheetTest() table.Rows.Add(@"""<>+-*//}{\\n", 1234567890, true, now); table.Rows.Add("Hello World", -1234567890, false, now.Date); - var rowsWritten = _exporter.InsertXlsxSheet(path, table, sheetName: "Sheet1"); + var rowsWritten = _exporter.InsertExcelSheet(path, table, sheetName: "Sheet1"); Assert.Equal(2, rowsWritten); using var p = new ExcelPackage(new FileInfo(path)); @@ -1453,7 +1453,7 @@ public void InsertSheetTest() table.Rows.Add("MiniExcel", 1); table.Rows.Add("Github", 2); - var rowsWritten = _exporter.InsertXlsxSheet(path, table, sheetName: "Sheet2"); + var rowsWritten = _exporter.InsertExcelSheet(path, table, sheetName: "Sheet2"); Assert.Equal(2, rowsWritten); using var p = new ExcelPackage(new FileInfo(path)); @@ -1476,7 +1476,7 @@ public void InsertSheetTest() table.Columns.Add("Column2", typeof(DateTime)); table.Rows.Add("Test", now); - var rowsWritten = _exporter.InsertXlsxSheet(path, table, sheetName: "Sheet2", printHeader: false, configuration: new OpenXmlConfiguration + var rowsWritten = _exporter.InsertExcelSheet(path, table, sheetName: "Sheet2", printHeader: false, configuration: new OpenXmlConfiguration { FastMode = true, AutoFilter = false, @@ -1509,7 +1509,7 @@ public void InsertSheetTest() table.Rows.Add("MiniExcel", now); table.Rows.Add("Github", now); - var rowsWritten = _exporter.InsertXlsxSheet(path, table, sheetName: "Sheet3", configuration: new OpenXmlConfiguration + var rowsWritten = _exporter.InsertExcelSheet(path, table, sheetName: "Sheet3", configuration: new OpenXmlConfiguration { FastMode = true, AutoFilter = false, @@ -1552,7 +1552,7 @@ private class DateOnlyTest [Fact] public void DateOnlySupportTest() { - var query = _importer.QueryXlsx(PathHelper.GetFile("xlsx/TestDateOnlyMapping.xlsx")).ToList(); + var query = _importer.QueryExcel(PathHelper.GetFile("xlsx/TestDateOnlyMapping.xlsx")).ToList(); Assert.Equal(new DateOnly(2020, 9, 27), query[0].Date); Assert.Equal(new DateOnly(2020, 10, 25), query[1].Date); diff --git a/tests/MiniExcel.Tests/SaveByTemplate/MiniExcelTemplateAsyncTests.cs b/tests/MiniExcel.Tests/SaveByTemplate/MiniExcelTemplateAsyncTests.cs index 42873f93..fd396948 100644 --- a/tests/MiniExcel.Tests/SaveByTemplate/MiniExcelTemplateAsyncTests.cs +++ b/tests/MiniExcel.Tests/SaveByTemplate/MiniExcelTemplateAsyncTests.cs @@ -4,8 +4,8 @@ namespace MiniExcelLib.Tests.SaveByTemplate; public class MiniExcelTemplateAsyncTests { - private readonly MiniExcelTemplater _templater = MiniExcel.GetTemplater(); - private readonly MiniExcelImporter _importer = MiniExcel.GetImporter(); + private readonly OpenXmlImporter _importer = MiniExcel.GetImporterProvider().GetExcelImporter(); + private readonly OpenXmlTemplater _templater = MiniExcel.GetTemplaterProvider().GetExcelTemplater(); [Fact] public async Task DatatableTemptyRowTest() @@ -30,7 +30,7 @@ public async Task DatatableTemptyRowTest() ["employees"] = employees }; await _templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); - var rows = _importer.QueryXlsxAsync(path.ToString()).ToBlockingEnumerable().ToList(); + var rows = _importer.QueryExcelAsync(path.ToString()).ToBlockingEnumerable().ToList(); var dimension = SheetHelper.GetFirstSheetDimensionRefValue(path.ToString()); Assert.Equal("A1:C5", dimension); @@ -55,7 +55,7 @@ public async Task DatatableTemptyRowTest() }; await _templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); - var rows = _importer.QueryXlsxAsync(path.ToString()).ToBlockingEnumerable().ToList(); + var rows = _importer.QueryExcelAsync(path.ToString()).ToBlockingEnumerable().ToList(); var dimension = SheetHelper.GetFirstSheetDimensionRefValue(path.ToString()); Assert.Equal("A1:C5", dimension); @@ -89,7 +89,7 @@ public async Task DatatableTest() ["employees"] = employees }; await _templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); - var rows = _importer.QueryXlsxAsync(path.ToString()).ToBlockingEnumerable().ToList(); + var rows = _importer.QueryExcelAsync(path.ToString()).ToBlockingEnumerable().ToList(); var dimension = SheetHelper.GetFirstSheetDimensionRefValue(path.ToString()); Assert.Equal("A1:C9", dimension); @@ -112,7 +112,7 @@ public async Task DatatableTest() Assert.Equal("IT", rows[8].C); { - rows = _importer.QueryXlsxAsync(path.ToString(), sheetName: "Sheet2").ToBlockingEnumerable().ToList(); + rows = _importer.QueryExcelAsync(path.ToString(), sheetName: "Sheet2").ToBlockingEnumerable().ToList(); Assert.Equal(9, rows.Count); Assert.Equal("FooCompany", rows[0].A); @@ -152,7 +152,7 @@ public async Task DapperTemplateTest() await _templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); { - var rows = _importer.QueryXlsxAsync(path.ToString()).ToBlockingEnumerable().ToList(); + var rows = _importer.QueryExcelAsync(path.ToString()).ToBlockingEnumerable().ToList(); Assert.Equal(9, rows.Count); @@ -177,7 +177,7 @@ public async Task DapperTemplateTest() } { - var rows = _importer.QueryXlsxAsync(path.ToString(), sheetName: "Sheet2").ToBlockingEnumerable().ToList(); + var rows = _importer.QueryExcelAsync(path.ToString(), sheetName: "Sheet2").ToBlockingEnumerable().ToList(); Assert.Equal(9, rows.Count); Assert.Equal("FooCompany", rows[0].A); @@ -226,7 +226,7 @@ public async Task DictionaryTemplateTest() await _templater.ApplyXlsxTemplateAsync(path, templatePath, value); { - var rows = _importer.QueryXlsx(path).ToList(); + var rows = _importer.QueryExcel(path).ToList(); Assert.Equal(9, rows.Count); @@ -251,7 +251,7 @@ public async Task DictionaryTemplateTest() } { - var rows = _importer.QueryXlsx(path, sheetName: "Sheet2").ToList(); + var rows = _importer.QueryExcel(path, sheetName: "Sheet2").ToList(); Assert.Equal(9, rows.Count); @@ -296,7 +296,7 @@ public async Task TestGithubProject() }; await _templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); - var rows = _importer.QueryXlsxAsync(path.ToString()).ToBlockingEnumerable().ToList(); + var rows = _importer.QueryExcelAsync(path.ToString()).ToBlockingEnumerable().ToList(); Assert.Equal("ITWeiHan Github Projects", rows[0].B); Assert.Equal("Total Star : 178", rows[8].C); @@ -344,7 +344,7 @@ public async Task TestIEnumerableType() }; await _templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); - var rows = _importer.QueryXlsx(path.ToString()).ToList(); + var rows = _importer.QueryExcel(path.ToString()).ToList(); Assert.Equal(poco.@string, rows[0].@string); Assert.Equal(poco.@int, rows[0].@int); Assert.Equal(poco.@double, rows[0].@double); @@ -409,7 +409,7 @@ public async Task TestTemplateTypeMapping() }; await _templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); - var rows = _importer.QueryXlsx(path.ToString()).ToList(); + var rows = _importer.QueryExcel(path.ToString()).ToList(); Assert.Equal(value.@string, rows[0].@string); Assert.Equal(value.@int, rows[0].@int); Assert.Equal(value.@double, rows[0].@double); @@ -451,7 +451,7 @@ public async Task TemplateAsyncBasiTest() }; await _templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); - var rows = _importer.QueryXlsxAsync(path.ToString()).ToBlockingEnumerable().ToList(); + var rows = _importer.QueryExcelAsync(path.ToString()).ToBlockingEnumerable().ToList(); Assert.Equal("Jack", rows[1].A); Assert.Equal("2021-01-01 00:00:00", rows[1].B); Assert.Equal(true, rows[1].C); @@ -475,7 +475,7 @@ public async Task TemplateAsyncBasiTest() }; await _templater.ApplyXlsxTemplateAsync(path, templateBytes, value); - var rows = (_importer.QueryXlsxAsync(path).ToBlockingEnumerable()).ToList(); + var rows = (_importer.QueryExcelAsync(path).ToBlockingEnumerable()).ToList(); Assert.Equal("Jack", rows[1].A); Assert.Equal("2021-01-01 00:00:00", rows[1].B); Assert.Equal(true, rows[1].C); @@ -503,7 +503,7 @@ public async Task TemplateAsyncBasiTest() await _templater.ApplyXlsxTemplateAsync(stream, templateBytes, value); } - var rows = _importer.QueryXlsxAsync(path.ToString()).ToBlockingEnumerable().ToList(); + var rows = _importer.QueryExcelAsync(path.ToString()).ToBlockingEnumerable().ToList(); Assert.Equal("Jack", rows[1].A); Assert.Equal("2021-01-01 00:00:00", rows[1].B); Assert.Equal(true, rows[1].C); @@ -527,7 +527,7 @@ public async Task TemplateAsyncBasiTest() }; await _templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); - var rows = _importer.QueryXlsxAsync(path.ToString()).ToBlockingEnumerable().ToList(); + var rows = _importer.QueryExcelAsync(path.ToString()).ToBlockingEnumerable().ToList(); Assert.Equal("Jack", rows[1].A); Assert.Equal("2021-01-01 00:00:00", rows[1].B); Assert.Equal(true, rows[1].C); @@ -788,7 +788,7 @@ public async Task TemplateTest() await _templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); { - var rows = _importer.QueryXlsxAsync(path.ToString()).ToBlockingEnumerable().ToList(); + var rows = _importer.QueryExcelAsync(path.ToString()).ToBlockingEnumerable().ToList(); Assert.Equal(9, rows.Count); Assert.Equal("FooCompany", rows[0].A); @@ -812,7 +812,7 @@ public async Task TemplateTest() } { - var rows = _importer.QueryXlsxAsync(path.ToString(), sheetName: "Sheet2").ToBlockingEnumerable().ToList(); + var rows = _importer.QueryExcelAsync(path.ToString(), sheetName: "Sheet2").ToBlockingEnumerable().ToList(); Assert.Equal(9, rows.Count); Assert.Equal("FooCompany", rows[0].A); @@ -858,7 +858,7 @@ public async Task TemplateTest() }; await _templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); - var rows = _importer.QueryXlsxAsync(path.ToString()).ToBlockingEnumerable().ToList(); + var rows = _importer.QueryExcelAsync(path.ToString()).ToBlockingEnumerable().ToList(); Assert.Equal("FooCompany", rows[0].A); Assert.Equal("Jack", rows[2].B); Assert.Equal("HR", rows[2].C); diff --git a/tests/MiniExcel.Tests/SaveByTemplate/MiniExcelTemplateTests.cs b/tests/MiniExcel.Tests/SaveByTemplate/MiniExcelTemplateTests.cs index cd528b7d..dec49d9a 100644 --- a/tests/MiniExcel.Tests/SaveByTemplate/MiniExcelTemplateTests.cs +++ b/tests/MiniExcel.Tests/SaveByTemplate/MiniExcelTemplateTests.cs @@ -7,8 +7,9 @@ namespace MiniExcelLib.Tests.SaveByTemplate; public class MiniExcelTemplateTests { - private readonly MiniExcelTemplater _templater = MiniExcel.GetTemplater(); - private readonly MiniExcelImporter _importer = MiniExcel.GetImporter(); + private readonly OpenXmlImporter _importer = MiniExcel.GetImporterProvider().GetExcelImporter(); + private readonly OpenXmlExporter _exporter = MiniExcel.GetExporterProvider().GetExcelExporter(); + private readonly OpenXmlTemplater _templater = MiniExcel.GetTemplaterProvider().GetExcelTemplater(); [Fact] public void TestImageType() @@ -57,7 +58,7 @@ public void TestImageType() }; // Act - MiniExcel.GetExporter().AddPictureXlsx(path.ToString(), pictures); + _exporter.AddExcelPicture(path.ToString(), pictures); // Assert using var zip = ZipFile.OpenRead(path.FilePath); @@ -116,7 +117,7 @@ public void DatatableTemptyRowTest() }; _templater.ApplyXlsxTemplate(path.ToString(), templatePath, value); - var rows = _importer.QueryXlsx(path.ToString()).ToList(); + var rows = _importer.QueryExcel(path.ToString()).ToList(); var dimension = SheetHelper.GetFirstSheetDimensionRefValue(path.ToString()); Assert.Equal("A1:C5", dimension); } @@ -141,7 +142,7 @@ public void DatatableTemptyRowTest() }; _templater.ApplyXlsxTemplate(path.ToString(), templatePath, value); - var rows = _importer.QueryXlsx(path.ToString()).ToList(); + var rows = _importer.QueryExcel(path.ToString()).ToList(); var dimension = SheetHelper.GetFirstSheetDimensionRefValue(path.ToString()); Assert.Equal("A1:C5", dimension); } @@ -177,7 +178,7 @@ public void DatatableTest() _templater.ApplyXlsxTemplate(path, templatePath, value); { - var rows = _importer.QueryXlsx(path).ToList(); + var rows = _importer.QueryExcel(path).ToList(); var dimension = SheetHelper.GetFirstSheetDimensionRefValue(path); Assert.Equal("A1:C9", dimension); @@ -202,7 +203,7 @@ public void DatatableTest() } { - var rows = _importer.QueryXlsx(path, sheetName: "Sheet2").ToList(); + var rows = _importer.QueryExcel(path, sheetName: "Sheet2").ToList(); Assert.Equal(9, rows.Count); Assert.Equal("FooCompany", rows[0].A); @@ -244,7 +245,7 @@ public void DapperTemplateTest() _templater.ApplyXlsxTemplate(path, templatePath, value); { - var rows = _importer.QueryXlsx(path).ToList(); + var rows = _importer.QueryExcel(path).ToList(); Assert.Equal(9, rows.Count); Assert.Equal("FooCompany", rows[0].A); @@ -268,7 +269,7 @@ public void DapperTemplateTest() } { - var rows = _importer.QueryXlsx(path, sheetName: "Sheet2").ToList(); + var rows = _importer.QueryExcel(path, sheetName: "Sheet2").ToList(); Assert.Equal(9, rows.Count); Assert.Equal("FooCompany", rows[0].A); @@ -319,7 +320,7 @@ public void DictionaryTemplateTest() _templater.ApplyXlsxTemplate(path, templatePath, value); { - var rows = _importer.QueryXlsx(path).ToList(); + var rows = _importer.QueryExcel(path).ToList(); Assert.Equal(9, rows.Count); Assert.Equal("FooCompany", rows[0].A); @@ -343,7 +344,7 @@ public void DictionaryTemplateTest() } { - var rows = _importer.QueryXlsx(path, sheetName: "Sheet2").ToList(); + var rows = _importer.QueryExcel(path, sheetName: "Sheet2").ToList(); Assert.Equal(9, rows.Count); Assert.Equal("FooCompany", rows[0].A); @@ -395,7 +396,7 @@ public void GroupTemplateTest() }; _templater.ApplyXlsxTemplate(path, templatePath, value); - var rows = _importer.QueryXlsx(path).ToList(); + var rows = _importer.QueryExcel(path).ToList(); Assert.Equal(16, rows.Count); Assert.Equal("Jack", rows[1].A); @@ -464,7 +465,7 @@ public void TestGithubProject() }; _templater.ApplyXlsxTemplate(path.ToString(), templatePath, value); - var rows = _importer.QueryXlsx(path.ToString()).ToList(); + var rows = _importer.QueryExcel(path.ToString()).ToList(); Assert.Equal("ITWeiHan Github Projects", rows[0].B); Assert.Equal("Total Star : 178", rows[8].C); @@ -515,7 +516,7 @@ public void TestIEnumerableType() }; _templater.ApplyXlsxTemplate(path.ToString(), templatePath, value); - var rows = _importer.QueryXlsx(path.ToString()).ToList(); + var rows = _importer.QueryExcel(path.ToString()).ToList(); Assert.Equal(poco.@string, rows[0].@string); Assert.Equal(poco.@int, rows[0].@int); Assert.Equal(poco.@double, rows[0].@double); @@ -583,7 +584,7 @@ public void TestTemplateTypeMapping() }; _templater.ApplyXlsxTemplate(path.ToString(), templatePath, value); - var rows = _importer.QueryXlsx(path.ToString()).ToList(); + var rows = _importer.QueryExcel(path.ToString()).ToList(); Assert.Equal(value.@string, rows[0].@string); Assert.Equal(value.@int, rows[0].@int); Assert.Equal(value.@double, rows[0].@double); @@ -626,7 +627,7 @@ public void TemplateBasicTest() }; _templater.ApplyXlsxTemplate(path.ToString(), templatePath, value); - var rows = _importer.QueryXlsx(path.ToString()).ToList(); + var rows = _importer.QueryExcel(path.ToString()).ToList(); Assert.Equal("Jack", rows[1].A); Assert.Equal("2021-01-01 00:00:00", rows[1].B); Assert.Equal(true, rows[1].C); @@ -650,7 +651,7 @@ public void TemplateBasicTest() }; _templater.ApplyXlsxTemplate(path.ToString(), templateBytes, value); - var rows = _importer.QueryXlsx(path.ToString()).ToList(); + var rows = _importer.QueryExcel(path.ToString()).ToList(); Assert.Equal("Jack", rows[1].A); Assert.Equal("2021-01-01 00:00:00", rows[1].B); Assert.Equal(true, rows[1].C); @@ -678,7 +679,7 @@ public void TemplateBasicTest() _templater.ApplyXlsxTemplate(stream, templateBytes, value); } - var rows = _importer.QueryXlsx(path.ToString()).ToList(); + var rows = _importer.QueryExcel(path.ToString()).ToList(); Assert.Equal("Jack", rows[1].A); Assert.Equal("2021-01-01 00:00:00", rows[1].B); Assert.Equal(true, rows[1].C); @@ -702,7 +703,7 @@ public void TemplateBasicTest() }; _templater.ApplyXlsxTemplate(path.ToString(), templatePath, value); - var rows = _importer.QueryXlsx(path.ToString()).ToList(); + var rows = _importer.QueryExcel(path.ToString()).ToList(); Assert.Equal("Jack", rows[1].A); Assert.Equal("2021-01-01 00:00:00", rows[1].B); Assert.Equal(true, rows[1].C); @@ -839,7 +840,7 @@ public void TemplateTest() _templater.ApplyXlsxTemplate(path.ToString(), templatePath, value); { - var rows = _importer.QueryXlsx(path.ToString()).ToList(); + var rows = _importer.QueryExcel(path.ToString()).ToList(); Assert.Equal(9, rows.Count); @@ -864,7 +865,7 @@ public void TemplateTest() } { - var rows = _importer.QueryXlsx(path.ToString(), sheetName: "Sheet2").ToList(); + var rows = _importer.QueryExcel(path.ToString(), sheetName: "Sheet2").ToList(); Assert.Equal(9, rows.Count); @@ -912,7 +913,7 @@ public void TemplateTest() }; _templater.ApplyXlsxTemplate(path.ToString(), templatePath, value); - var rows = _importer.QueryXlsx(path.ToString()).ToList(); + var rows = _importer.QueryExcel(path.ToString()).ToList(); Assert.Equal("FooCompany", rows[0].A); Assert.Equal("Jack", rows[2].B); Assert.Equal("HR", rows[2].C); From 41e4daf2fee1b2991bbc23bcf9f299011319caa8 Mon Sep 17 00:00:00 2001 From: Michele Bastione Date: Sun, 13 Jul 2025 02:05:37 +0200 Subject: [PATCH 15/26] Added public api for applying a template from a template stream --- .../Abstractions/IMiniExcelTemplate.cs | 3 +++ .../OpenXml/Templates/OpenXmlTemplate.cs | 6 +++--- src/MiniExcel/OpenXmlTemplater.cs | 17 +++++++++++++++++ 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/src/MiniExcel/Abstractions/IMiniExcelTemplate.cs b/src/MiniExcel/Abstractions/IMiniExcelTemplate.cs index 93e4d5bc..a38eb10f 100644 --- a/src/MiniExcel/Abstractions/IMiniExcelTemplate.cs +++ b/src/MiniExcel/Abstractions/IMiniExcelTemplate.cs @@ -8,6 +8,9 @@ public partial interface IMiniExcelTemplate [CreateSyncVersion] Task SaveAsByTemplateAsync(byte[] templateBytes, object value, CancellationToken cancellationToken = default); + [CreateSyncVersion] + Task SaveAsByTemplateAsync(Stream templateStream, object value, CancellationToken cancellationToken = default); + [CreateSyncVersion] Task MergeSameCellsAsync(string path, CancellationToken cancellationToken = default); diff --git a/src/MiniExcel/OpenXml/Templates/OpenXmlTemplate.cs b/src/MiniExcel/OpenXml/Templates/OpenXmlTemplate.cs index 16600d73..298cb6ac 100644 --- a/src/MiniExcel/OpenXml/Templates/OpenXmlTemplate.cs +++ b/src/MiniExcel/OpenXml/Templates/OpenXmlTemplate.cs @@ -36,18 +36,18 @@ internal OpenXmlTemplate(Stream stream, IMiniExcelConfiguration? configuration, public async Task SaveAsByTemplateAsync(string templatePath, object value, CancellationToken cancellationToken = default) { using var stream = File.Open(templatePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); - await SaveAsByTemplateImplAsync(stream, value, cancellationToken).ConfigureAwait(false); + await SaveAsByTemplateAsync(stream, value, cancellationToken).ConfigureAwait(false); } [CreateSyncVersion] public async Task SaveAsByTemplateAsync(byte[] templateBytes, object value, CancellationToken cancellationToken = default) { using Stream stream = new MemoryStream(templateBytes); - await SaveAsByTemplateImplAsync(stream, value, cancellationToken).ConfigureAwait(false); + await SaveAsByTemplateAsync(stream, value, cancellationToken).ConfigureAwait(false); } [CreateSyncVersion] - internal async Task SaveAsByTemplateImplAsync(Stream templateStream, object value, CancellationToken cancellationToken = default) + public async Task SaveAsByTemplateAsync(Stream templateStream, object value, CancellationToken cancellationToken = default) { templateStream.Seek(0, SeekOrigin.Begin); using var templateReader = await OpenXmlReader.CreateAsync(templateStream, null, cancellationToken: cancellationToken).ConfigureAwait(false); diff --git a/src/MiniExcel/OpenXmlTemplater.cs b/src/MiniExcel/OpenXmlTemplater.cs index a258b342..23d29197 100644 --- a/src/MiniExcel/OpenXmlTemplater.cs +++ b/src/MiniExcel/OpenXmlTemplater.cs @@ -12,6 +12,15 @@ public async Task ApplyXlsxTemplateAsync(string path, string templatePath, objec await ApplyXlsxTemplateAsync(stream, templatePath, value, configuration, cancellationToken).ConfigureAwait(false); } + [CreateSyncVersion] + public async Task ApplyXlsxTemplateAsync(string path, Stream templateStream, object value, + OpenXmlConfiguration? configuration = null, CancellationToken cancellationToken = default) + { + using var stream = File.Create(path); + var template = GetOpenXmlTemplate(stream, configuration); + await template.SaveAsByTemplateAsync(templateStream, value, cancellationToken).ConfigureAwait(false); + } + [CreateSyncVersion] public async Task ApplyXlsxTemplateAsync(Stream stream, string templatePath, object value, OpenXmlConfiguration? configuration = null, CancellationToken cancellationToken = default) @@ -20,6 +29,14 @@ public async Task ApplyXlsxTemplateAsync(Stream stream, string templatePath, obj await template.SaveAsByTemplateAsync(templatePath, value, cancellationToken).ConfigureAwait(false); } + [CreateSyncVersion] + public async Task ApplyXlsxTemplateAsync(Stream stream, Stream templateStream, object value, + OpenXmlConfiguration? configuration = null, CancellationToken cancellationToken = default) + { + var template = GetOpenXmlTemplate(stream, configuration); + await template.SaveAsByTemplateAsync(templateStream, value, cancellationToken).ConfigureAwait(false); + } + [CreateSyncVersion] public async Task ApplyXlsxTemplateAsync(string path, byte[] templateBytes, object value, OpenXmlConfiguration? configuration = null, CancellationToken cancellationToken = default) From 82e8cf48cd6bdd3aef27575dae5f7cad17d82631 Mon Sep 17 00:00:00 2001 From: Michele Bastione Date: Wed, 16 Jul 2025 01:02:20 +0200 Subject: [PATCH 16/26] Added assembly for legacy methods --- MiniExcel.slnx | 5 +- .../BenchmarkSections/CreateExcelBenchmark.cs | 3 +- .../BenchmarkSections/QueryExcelBenchmark.cs | 3 +- .../TemplateExcelBenchmark.cs | 2 +- .../BenchmarkSections/XlsxAsyncBenchmark.cs | 4 +- src/Directory.Build.props | 2 +- src/MiniExcel.Csv/CsvConfiguration.cs | 4 +- src/MiniExcel.Csv/CsvExporter.cs | 15 +- src/MiniExcel.Csv/CsvImporter.cs | 16 +- src/MiniExcel.Csv/CsvReader.cs | 2 +- src/MiniExcel.Csv/CsvWriter.cs | 2 +- src/MiniExcel.Legacy/Configuration.cs | 9 + src/MiniExcel.Legacy/ExcelType.cs | 4 + src/MiniExcel.Legacy/ExcelTypeHelper.cs | 37 ++ src/MiniExcel.Legacy/MiniExcel.Legacy.csproj | 12 + src/MiniExcel.Legacy/MiniExcel.cs | 411 ++++++++++++++++++ src/MiniExcel/MiniExcel.cs | 6 +- .../{Providers.cs => MiniExcelProviders.cs} | 6 + src/MiniExcel/OpenXml/OpenXmlConfiguration.cs | 2 +- src/MiniExcel/OpenXml/OpenXmlReader.cs | 2 +- src/MiniExcel/OpenXml/OpenXmlWriter.cs | 2 +- .../OpenXml/Templates/OpenXmlTemplate.cs | 2 +- src/MiniExcel/OpenXmlExporter.cs | 7 +- src/MiniExcel/OpenXmlImporter.cs | 6 +- src/MiniExcel/OpenXmlTemplater.cs | 3 + tests/MiniExcel.Csv.Tests/AsyncIssueTests.cs | 8 +- tests/MiniExcel.Csv.Tests/IssueTests.cs | 8 +- .../MiniExcelCsvAsycTests.cs | 4 +- .../MiniExcel.Csv.Tests/MiniExcelCsvTests.cs | 6 +- .../MiniExcelAutoAdjustWidthTests.cs | 2 +- .../MiniExcelIssueAsyncTests.cs | 6 +- tests/MiniExcel.Tests/MiniExcelIssueTests.cs | 6 +- .../MiniExcelOpenXmlAsyncTests.cs | 4 +- .../MiniExcelOpenXmlConfigurationTest.cs | 4 +- ...MiniExcelOpenXmlMultipleSheetAsyncTests.cs | 2 +- .../MiniExcelOpenXmlMultipleSheetTests.cs | 4 +- .../MiniExcel.Tests/MiniExcelOpenXmlTests.cs | 4 +- .../MiniExcelTemplateAsyncTests.cs | 4 +- .../SaveByTemplate/MiniExcelTemplateTests.cs | 6 +- 39 files changed, 566 insertions(+), 69 deletions(-) create mode 100644 src/MiniExcel.Legacy/Configuration.cs create mode 100644 src/MiniExcel.Legacy/ExcelType.cs create mode 100644 src/MiniExcel.Legacy/ExcelTypeHelper.cs create mode 100644 src/MiniExcel.Legacy/MiniExcel.Legacy.csproj create mode 100644 src/MiniExcel.Legacy/MiniExcel.cs rename src/MiniExcel/{Providers.cs => MiniExcelProviders.cs} (67%) diff --git a/MiniExcel.slnx b/MiniExcel.slnx index a7f45977..ff2ffce3 100644 --- a/MiniExcel.slnx +++ b/MiniExcel.slnx @@ -2,7 +2,7 @@ - + @@ -14,7 +14,7 @@ - + @@ -23,6 +23,7 @@ + diff --git a/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/CreateExcelBenchmark.cs b/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/CreateExcelBenchmark.cs index 56227298..3e456a7b 100644 --- a/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/CreateExcelBenchmark.cs +++ b/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/CreateExcelBenchmark.cs @@ -19,7 +19,8 @@ public void SetUp() { ExcelPackage.LicenseContext = LicenseContext.NonCommercial; Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); - _exporter = new OpenXmlExporter(); + + _exporter = MiniExcel.Exporter.GetExcelExporter(); } [Benchmark(Description = "MiniExcel Create Xlsx")] diff --git a/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/QueryExcelBenchmark.cs b/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/QueryExcelBenchmark.cs index c22f5e69..84741be7 100644 --- a/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/QueryExcelBenchmark.cs +++ b/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/QueryExcelBenchmark.cs @@ -18,7 +18,8 @@ public void SetUp() { ExcelPackage.LicenseContext = LicenseContext.NonCommercial; Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); - _importer = new OpenXmlImporter(); + + _importer = MiniExcel.Importer.GetExcelImporter(); } [Benchmark(Description = "MiniExcel QueryFirst")] diff --git a/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/TemplateExcelBenchmark.cs b/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/TemplateExcelBenchmark.cs index 27918fea..250887a6 100644 --- a/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/TemplateExcelBenchmark.cs +++ b/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/TemplateExcelBenchmark.cs @@ -11,7 +11,7 @@ public class TemplateExcelBenchmark : BenchmarkBase [GlobalSetup] public void Setup() { - _templater = new OpenXmlTemplater(); + _templater = MiniExcel.Templater.GetExcelTemplater(); } [Benchmark(Description = "MiniExcel Template Generate")] diff --git a/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/XlsxAsyncBenchmark.cs b/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/XlsxAsyncBenchmark.cs index 29b53702..0d65f969 100644 --- a/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/XlsxAsyncBenchmark.cs +++ b/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/XlsxAsyncBenchmark.cs @@ -11,8 +11,8 @@ public class XlsxAsyncBenchmark : BenchmarkBase [GlobalSetup] public void Setup() { - _exporter = new OpenXmlExporter(); - _templater = new OpenXmlTemplater(); + _exporter = MiniExcel.Exporter.GetExcelExporter(); + _templater = MiniExcel.Templater.GetExcelTemplater(); } [Benchmark(Description = "MiniExcel Create Xlsx Async")] diff --git a/src/Directory.Build.props b/src/Directory.Build.props index 626bbb1f..2b3251d9 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -14,7 +14,7 @@ - + diff --git a/src/MiniExcel.Csv/CsvConfiguration.cs b/src/MiniExcel.Csv/CsvConfiguration.cs index 86ec19bd..59d8f4c3 100644 --- a/src/MiniExcel.Csv/CsvConfiguration.cs +++ b/src/MiniExcel.Csv/CsvConfiguration.cs @@ -4,6 +4,8 @@ public class CsvConfiguration : MiniExcelBaseConfiguration { private static readonly Encoding DefaultEncoding = new UTF8Encoding(true); + internal static CsvConfiguration Default => new(); + public char Seperator { get; set; } = ','; public string NewLine { get; set; } = "\r\n"; public bool ReadLineBreaksWithinQuotes { get; set; } = true; @@ -13,6 +15,4 @@ public class CsvConfiguration : MiniExcelBaseConfiguration public Func? SplitFn { get; set; } public Func StreamReaderFunc { get; set; } = stream => new StreamReader(stream, DefaultEncoding); public Func StreamWriterFunc { get; set; } = stream => new StreamWriter(stream, DefaultEncoding); - - internal static readonly CsvConfiguration DefaultConfiguration = new(); } \ No newline at end of file diff --git a/src/MiniExcel.Csv/CsvExporter.cs b/src/MiniExcel.Csv/CsvExporter.cs index 92c6c45c..e8219545 100644 --- a/src/MiniExcel.Csv/CsvExporter.cs +++ b/src/MiniExcel.Csv/CsvExporter.cs @@ -2,6 +2,9 @@ namespace MiniExcelLib.Csv; public partial class CsvExporter { + internal CsvExporter() { } + + #region Append / Export [CreateSyncVersion] @@ -52,10 +55,10 @@ public async Task ExportCsvAsync(Stream stream, object value, bool printH [CreateSyncVersion] public async Task ConvertCsvToXlsxAsync(Stream csv, Stream xlsx, bool csvHasHeader = false, CancellationToken cancellationToken = default) { - var value = new CsvImporter(). - QueryCsvAsync(csv, useHeaderRow: csvHasHeader, cancellationToken: cancellationToken); + var value = new CsvImporter().QueryCsvAsync(csv, useHeaderRow: csvHasHeader, cancellationToken: cancellationToken); - await new OpenXmlExporter() + await MiniExcel.Exporter + .GetExcelExporter() .ExportExcelAsync(xlsx, value, printHeader: csvHasHeader, cancellationToken: cancellationToken) .ConfigureAwait(false); } @@ -81,7 +84,11 @@ public async Task ConvertXlsxToCsvAsync(string xlsx, string csvPath, bool xlsxHa [CreateSyncVersion] public async Task ConvertXlsxToCsvAsync(Stream xlsx, Stream csv, bool xlsxHasHeader = true, CancellationToken cancellationToken = default) { - var value = new OpenXmlImporter().QueryExcelAsync(xlsx, useHeaderRow: xlsxHasHeader, cancellationToken: cancellationToken).ConfigureAwait(false); + var value = MiniExcel.Importer + .GetExcelImporter() + .QueryExcelAsync(xlsx, useHeaderRow: xlsxHasHeader, cancellationToken: cancellationToken) + .ConfigureAwait(false); + await ExportCsvAsync(csv, value, printHeader: xlsxHasHeader, cancellationToken: cancellationToken).ConfigureAwait(false); } diff --git a/src/MiniExcel.Csv/CsvImporter.cs b/src/MiniExcel.Csv/CsvImporter.cs index 4c8482de..092f0ac3 100644 --- a/src/MiniExcel.Csv/CsvImporter.cs +++ b/src/MiniExcel.Csv/CsvImporter.cs @@ -4,11 +4,14 @@ namespace MiniExcelLib.Csv; public partial class CsvImporter { + internal CsvImporter() { } + + #region Query [CreateSyncVersion] - public async IAsyncEnumerable QueryCsvAsync(string path, CsvConfiguration? configuration = null, - bool treatHeaderAsData = false, [EnumeratorCancellation] CancellationToken cancellationToken = default) + public async IAsyncEnumerable QueryCsvAsync(string path, bool treatHeaderAsData = false, + CsvConfiguration? configuration = null, [EnumeratorCancellation] CancellationToken cancellationToken = default) where T : class, new() { using var stream = FileHelper.OpenSharedRead(path); @@ -22,8 +25,7 @@ public async IAsyncEnumerable QueryCsvAsync(string path, CsvConfiguration? [CreateSyncVersion] public async IAsyncEnumerable QueryCsvAsync(Stream stream, bool treatHeaderAsData = false, - CsvConfiguration? configuration = null, - [EnumeratorCancellation] CancellationToken cancellationToken = default) + CsvConfiguration? configuration = null, [EnumeratorCancellation] CancellationToken cancellationToken = default) where T : class, new() { using var csv = new CsvReader(stream, configuration); @@ -33,8 +35,7 @@ public async IAsyncEnumerable QueryCsvAsync(Stream stream, bool treatHeade [CreateSyncVersion] public async IAsyncEnumerable QueryCsvAsync(string path, bool useHeaderRow = false, - CsvConfiguration? configuration = null, - [EnumeratorCancellation] CancellationToken cancellationToken = default) + CsvConfiguration? configuration = null, [EnumeratorCancellation] CancellationToken cancellationToken = default) { using var stream = FileHelper.OpenSharedRead(path); await foreach (var item in QueryCsvAsync(stream, useHeaderRow, configuration, cancellationToken).ConfigureAwait(false)) @@ -43,8 +44,7 @@ public async IAsyncEnumerable QueryCsvAsync(string path, bool useHeader [CreateSyncVersion] public async IAsyncEnumerable QueryCsvAsync(Stream stream, bool useHeaderRow = false, - CsvConfiguration? configuration = null, - [EnumeratorCancellation] CancellationToken cancellationToken = default) + CsvConfiguration? configuration = null, [EnumeratorCancellation] CancellationToken cancellationToken = default) { #pragma warning disable CA2007 using var excelReader = new CsvReader(stream, configuration); diff --git a/src/MiniExcel.Csv/CsvReader.cs b/src/MiniExcel.Csv/CsvReader.cs index dc90893b..6d6a06d3 100644 --- a/src/MiniExcel.Csv/CsvReader.cs +++ b/src/MiniExcel.Csv/CsvReader.cs @@ -8,7 +8,7 @@ internal partial class CsvReader : IMiniExcelReader internal CsvReader(Stream stream, IMiniExcelConfiguration? configuration) { _stream = stream; - _config = configuration as CsvConfiguration ?? CsvConfiguration.DefaultConfiguration; + _config = configuration as CsvConfiguration ?? CsvConfiguration.Default; } [CreateSyncVersion] diff --git a/src/MiniExcel.Csv/CsvWriter.cs b/src/MiniExcel.Csv/CsvWriter.cs index aba6fa4e..4747e005 100644 --- a/src/MiniExcel.Csv/CsvWriter.cs +++ b/src/MiniExcel.Csv/CsvWriter.cs @@ -12,7 +12,7 @@ internal partial class CsvWriter : IMiniExcelWriter, IDisposable // todo: should we add an explicit parameter to leave the stream open instead of the convoluted way to do it through a Func? internal CsvWriter(Stream stream, object? value, bool printHeader, IMiniExcelConfiguration? configuration) { - _configuration = configuration as CsvConfiguration ?? CsvConfiguration.DefaultConfiguration; + _configuration = configuration as CsvConfiguration ?? CsvConfiguration.Default; _writer = _configuration.StreamWriterFunc(stream); _printHeader = printHeader; _value = value; diff --git a/src/MiniExcel.Legacy/Configuration.cs b/src/MiniExcel.Legacy/Configuration.cs new file mode 100644 index 00000000..e7b0d868 --- /dev/null +++ b/src/MiniExcel.Legacy/Configuration.cs @@ -0,0 +1,9 @@ +using MiniExcelLib; + +namespace MiniExcelLibs; + + +public interface IConfiguration : IMiniExcelConfiguration; + +public sealed class OpenXmlConfiguration : MiniExcelLib.OpenXml.OpenXmlConfiguration, IConfiguration; +public sealed class CsvConfiguration : MiniExcelLib.Csv.CsvConfiguration, IConfiguration; \ No newline at end of file diff --git a/src/MiniExcel.Legacy/ExcelType.cs b/src/MiniExcel.Legacy/ExcelType.cs new file mode 100644 index 00000000..d80f0310 --- /dev/null +++ b/src/MiniExcel.Legacy/ExcelType.cs @@ -0,0 +1,4 @@ +namespace MiniExcelLibs; + + +public enum ExcelType { XLSX, CSV, UNKNOWN } diff --git a/src/MiniExcel.Legacy/ExcelTypeHelper.cs b/src/MiniExcel.Legacy/ExcelTypeHelper.cs new file mode 100644 index 00000000..6be05705 --- /dev/null +++ b/src/MiniExcel.Legacy/ExcelTypeHelper.cs @@ -0,0 +1,37 @@ +namespace MiniExcelLibs; + +internal static class ExcelTypeHelper +{ + internal static ExcelType GetExcelType(this string filePath, ExcelType excelType) + { + if (excelType != ExcelType.UNKNOWN) + return excelType; + + var extension = Path.GetExtension(filePath).ToLowerInvariant(); + return extension switch + { + ".csv" => ExcelType.CSV, + ".xlsx" or ".xlsm" => ExcelType.XLSX, + _ => throw new NotSupportedException($"Extension {extension} is not suppprted. Try specifying the ExcelType if you know what the underlying format is.") + }; + } + + internal static ExcelType GetExcelType(this Stream stream, ExcelType excelType) + { + if (excelType != ExcelType.UNKNOWN) + return excelType; + + var probe = new byte[8]; + stream.Seek(0, SeekOrigin.Begin); + + var read = stream.Read(probe, 0, probe.Length); + if (read != probe.Length) + throw new InvalidDataException("The file/stream does not contain enough data to process"); + + stream.Seek(0, SeekOrigin.Begin); + if (probe[0] == 0x50 && probe[1] == 0x4B) + return ExcelType.XLSX; + + throw new InvalidDataException("The file type could not be inferred automatically, please specify ExcelType manually"); + } +} \ No newline at end of file diff --git a/src/MiniExcel.Legacy/MiniExcel.Legacy.csproj b/src/MiniExcel.Legacy/MiniExcel.Legacy.csproj new file mode 100644 index 00000000..4bc2751b --- /dev/null +++ b/src/MiniExcel.Legacy/MiniExcel.Legacy.csproj @@ -0,0 +1,12 @@ + + + + MiniExcelLibs + + + + + + + + diff --git a/src/MiniExcel.Legacy/MiniExcel.cs b/src/MiniExcel.Legacy/MiniExcel.cs new file mode 100644 index 00000000..dd562061 --- /dev/null +++ b/src/MiniExcel.Legacy/MiniExcel.cs @@ -0,0 +1,411 @@ +using System.Data; +using MiniExcelLib; +using MiniExcelLib.Csv; +using MiniExcelLib.DataReader; +using MiniExcelLib.OpenXml.Models; +using MiniExcelLib.OpenXml.Picture; +using Zomp.SyncMethodGenerator; +using MiniExcelNew = MiniExcelLib.MiniExcel; + +namespace MiniExcelLibs; + +public static partial class MiniExcel +{ + private static readonly OpenXmlExporter ExcelExporter = MiniExcelNew.Exporter.GetExcelExporter(); + private static readonly OpenXmlImporter ExcelImporter = MiniExcelNew.Importer.GetExcelImporter(); + private static readonly OpenXmlTemplater ExcelTemplater = MiniExcelNew.Templater.GetExcelTemplater(); + + private static readonly CsvExporter CsvExporter = MiniExcelNew.Exporter.GetCsvExporter(); + private static readonly CsvImporter CsvImporter = MiniExcelNew.Importer.GetCsvImporter(); + + + [CreateSyncVersion] + [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.MiniExcel.Exporter instead.")] + public static async Task AddPictureAsync(string path, CancellationToken cancellationToken = default, params MiniExcelPicture[] images) + => await ExcelExporter.AddExcelPictureAsync(path, cancellationToken, images).ConfigureAwait(false); + + [CreateSyncVersion] + [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.MiniExcel.Exporter instead.")] + public static async Task AddPictureAsync(Stream excelStream, CancellationToken cancellationToken = default, params MiniExcelPicture[] images) + => await ExcelExporter.AddExcelPictureAsync(excelStream, cancellationToken, images).ConfigureAwait(false); + + [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.MiniExcel.Importer instead.")] + public static MiniExcelDataReader GetReader(string path, bool useHeaderRow = false, string? sheetName = null, ExcelType excelType = ExcelType.UNKNOWN, string startCell = "A1", IConfiguration? configuration = null) + { + var type = path.GetExcelType(excelType); + return type switch + { + ExcelType.XLSX => ExcelImporter.GetExcelDataReader(path, useHeaderRow, sheetName, startCell, configuration as OpenXmlConfiguration), + ExcelType.CSV => CsvImporter.GetCsvDataReader(path, useHeaderRow, configuration as CsvConfiguration), + _ => throw new NotSupportedException($"Excel type {type} is not a valid Excel type") + }; + } + + [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.MiniExcel.Importer instead.")] + public static MiniExcelDataReader GetReader(this Stream stream, bool useHeaderRow = false, string? sheetName = null, ExcelType excelType = ExcelType.UNKNOWN, string startCell = "A1", IConfiguration? configuration = null) + { + var type = stream.GetExcelType(excelType); + return type switch + { + ExcelType.XLSX => ExcelImporter.GetExcelDataReader(stream, useHeaderRow, sheetName, startCell, configuration as OpenXmlConfiguration), + ExcelType.CSV => CsvImporter.GetCsvDataReader(stream, useHeaderRow, configuration as CsvConfiguration), + _ => throw new NotSupportedException($"Excel type {type} is not a valid Excel type") + }; + } + + [CreateSyncVersion] + [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.MiniExcel.Exporter instead.")] + public static async Task InsertAsync(string path, object value, string sheetName = "Sheet1", ExcelType excelType = ExcelType.UNKNOWN, IConfiguration? configuration = null, bool printHeader = true, bool overwriteSheet = false, CancellationToken cancellationToken = default) + { + var type = path.GetExcelType(excelType); + var task = type switch + { + ExcelType.XLSX => ExcelExporter.InsertExcelSheetAsync(path, value, sheetName, printHeader, overwriteSheet, configuration as OpenXmlConfiguration, cancellationToken), + ExcelType.CSV => CsvExporter.AppendToCsvAsync(path, value, printHeader, configuration as CsvConfiguration, cancellationToken), + _ => throw new InvalidDataException($"Excel type {type} is not a valid Excel type") + }; + + return await task.ConfigureAwait(false); + } + + [CreateSyncVersion] + [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.MiniExcel.Exporter instead.")] + public static async Task InsertAsync(this Stream stream, object value, string sheetName = "Sheet1", ExcelType excelType = ExcelType.XLSX, IConfiguration? configuration = null, bool printHeader = true, bool overwriteSheet = false, CancellationToken cancellationToken = default) + { + var type = stream.GetExcelType(excelType); + var task = type switch + { + ExcelType.XLSX => ExcelExporter.InsertExcelSheetAsync(stream, value, sheetName, printHeader, overwriteSheet, configuration as OpenXmlConfiguration, cancellationToken), + ExcelType.CSV => CsvExporter.AppendToCsvAsync(stream, value, configuration as CsvConfiguration, cancellationToken), + _ => throw new InvalidDataException($"Excel type {type} is not a valid Excel type") + }; + + return await task.ConfigureAwait(false); + } + + [CreateSyncVersion] + [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.MiniExcel.Exporter instead.")] + public static async Task SaveAsAsync(string path, object value, bool printHeader = true, string sheetName = "Sheet1", ExcelType excelType = ExcelType.UNKNOWN, IConfiguration? configuration = null, bool overwriteFile = false, CancellationToken cancellationToken = default) + { + var type = path.GetExcelType(excelType); + var task = type switch + { + ExcelType.XLSX => ExcelExporter.ExportExcelAsync(path, value, printHeader, sheetName, printHeader, configuration as OpenXmlConfiguration, cancellationToken), + ExcelType.CSV => CsvExporter.ExportCsvAsync(path, value, printHeader, overwriteFile, configuration as CsvConfiguration, cancellationToken), + _ => throw new InvalidDataException($"Excel type {type} is not a valid Excel type") + }; + + return await task.ConfigureAwait(false); + } + + [CreateSyncVersion] + [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.MiniExcel.Exporter instead.")] + public static async Task SaveAsAsync(this Stream stream, object value, bool printHeader = true, string sheetName = "Sheet1", ExcelType excelType = ExcelType.XLSX, IConfiguration? configuration = null, CancellationToken cancellationToken = default) + { + var type = stream.GetExcelType(excelType); + var task = type switch + { + ExcelType.XLSX => ExcelExporter.ExportExcelAsync(stream, value, printHeader, sheetName, configuration as OpenXmlConfiguration, cancellationToken), + ExcelType.CSV => CsvExporter.ExportCsvAsync(stream, value, printHeader, configuration as CsvConfiguration, cancellationToken), + _ => throw new InvalidDataException($"Excel type {type} is not a valid Excel type") + }; + + return await task.ConfigureAwait(false); + } + + [CreateSyncVersion] + [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.MiniExcel.Importer instead.")] + public static IAsyncEnumerable QueryAsync(string path, string? sheetName = null, ExcelType excelType = ExcelType.UNKNOWN, string startCell = "A1", IConfiguration? configuration = null, bool hasHeader = true, CancellationToken cancellationToken = default) where T : class, new() + { + var type = path.GetExcelType(excelType); + return type switch + { + ExcelType.XLSX => ExcelImporter.QueryExcelAsync(path, sheetName, startCell, hasHeader, configuration as OpenXmlConfiguration, cancellationToken), + ExcelType.CSV => CsvImporter.QueryCsvAsync(path, hasHeader, configuration as CsvConfiguration, cancellationToken), + _ => throw new InvalidDataException($"Excel type {type} is not a valid Excel type") + }; + } + + [CreateSyncVersion] + [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.MiniExcel.Importer instead.")] + public static IAsyncEnumerable QueryAsync(this Stream stream, string? sheetName = null, ExcelType excelType = ExcelType.UNKNOWN, string startCell = "A1", IConfiguration? configuration = null, bool hasHeader = true, CancellationToken cancellationToken = default) where T : class, new() + { + var type = stream.GetExcelType(excelType); + return type switch + { + ExcelType.XLSX => ExcelImporter.QueryExcelAsync(stream, sheetName, startCell, hasHeader, configuration as OpenXmlConfiguration, cancellationToken), + ExcelType.CSV => CsvImporter.QueryCsvAsync(stream, hasHeader, configuration as CsvConfiguration, cancellationToken), + _ => throw new InvalidDataException($"Excel type {type} is not a valid Excel type") + }; + } + + [CreateSyncVersion] + [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.MiniExcel.Importer instead.")] + public static IAsyncEnumerable QueryAsync(string path, bool useHeaderRow = false, string? sheetName = null, ExcelType excelType = ExcelType.UNKNOWN, string startCell = "A1", IConfiguration? configuration = null, CancellationToken cancellationToken = default) + { + var type = path.GetExcelType(excelType); + return type switch + { + ExcelType.XLSX => ExcelImporter.QueryExcelAsync(path, useHeaderRow, sheetName, startCell, configuration as OpenXmlConfiguration, cancellationToken), + ExcelType.CSV => CsvImporter.QueryCsvAsync(path, useHeaderRow, configuration as CsvConfiguration, cancellationToken), + _ => throw new InvalidDataException($"Excel type {type} is not a valid Excel type") + }; + } + + [CreateSyncVersion] + [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.MiniExcel.Importer instead.")] + public static IAsyncEnumerable QueryAsync(this Stream stream, bool useHeaderRow = false, string? sheetName = null, ExcelType excelType = ExcelType.UNKNOWN, string startCell = "A1", IConfiguration? configuration = null, CancellationToken cancellationToken = default) + { + var type = stream.GetExcelType(excelType); + return type switch + { + ExcelType.XLSX => ExcelImporter.QueryExcelAsync(stream, useHeaderRow, sheetName, startCell, configuration as OpenXmlConfiguration, cancellationToken), + ExcelType.CSV => CsvImporter.QueryCsvAsync(stream, useHeaderRow, configuration as CsvConfiguration, cancellationToken), + _ => throw new InvalidDataException($"Excel type {type} is not a valid Excel type") + }; + } + + #region QueryRange + + /// + /// Extract the given range。 Only uppercase letters are effective。 + /// e.g. + /// MiniExcel.QueryRange(path, startCell: "A2", endCell: "C3") + /// A2 represents the second row of column A, C3 represents the third row of column C + /// If you don't want to restrict rows, just don't include numbers + /// + [CreateSyncVersion] + [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.MiniExcel.Importer instead.")] + public static IAsyncEnumerable QueryRangeAsync(string path, bool useHeaderRow = false, string? sheetName = null, ExcelType excelType = ExcelType.UNKNOWN, string startCell = "A1", string endCell = "", IConfiguration? configuration = null, CancellationToken cancellationToken = default) + { + var type = path.GetExcelType(excelType); + return type switch + { + ExcelType.XLSX => ExcelImporter.QueryExcelRangeAsync(path, useHeaderRow, sheetName, startCell, endCell, configuration as OpenXmlConfiguration, cancellationToken), + ExcelType.CSV => throw new NotSupportedException("QueryRange is not supported for csv"), + _ => throw new InvalidDataException($"Excel type {type} is not a valid Excel type") + }; + } + + [CreateSyncVersion] + [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.MiniExcel.Importer instead.")] + public static IAsyncEnumerable QueryRangeAsync(this Stream stream, bool useHeaderRow = false, string? sheetName = null, ExcelType excelType = ExcelType.UNKNOWN, string startCell = "A1", string endCell = "", IConfiguration? configuration = null, CancellationToken cancellationToken = default) + { + var type = stream.GetExcelType(excelType); + return type switch + { + ExcelType.XLSX => ExcelImporter.QueryExcelRangeAsync(stream, useHeaderRow, sheetName, startCell, endCell, configuration as OpenXmlConfiguration, cancellationToken), + ExcelType.CSV => CsvImporter.QueryCsvAsync(stream, useHeaderRow, configuration as CsvConfiguration, cancellationToken), + _ => throw new InvalidDataException($"Excel type {type} is not a valid Excel type") + }; + } + + [CreateSyncVersion] + [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.MiniExcel.Importer instead.")] + public static IAsyncEnumerable QueryRangeAsync(string path, bool useHeaderRow = false, string? sheetName = null, ExcelType excelType = ExcelType.UNKNOWN, int startRowIndex = 1, int startColumnIndex = 1, int? endRowIndex = null, int? endColumnIndex = null, IConfiguration? configuration = null, CancellationToken cancellationToken = default) + { + var type = path.GetExcelType(excelType); + return type switch + { + ExcelType.XLSX => ExcelImporter.QueryExcelRangeAsync(path, useHeaderRow, sheetName, startRowIndex, startColumnIndex, endRowIndex, endColumnIndex, configuration as OpenXmlConfiguration, cancellationToken), + ExcelType.CSV => throw new NotSupportedException("QueryRange is not supported for csv"), + _ => throw new InvalidDataException($"Excel type {type} is not a valid Excel type") + }; + } + + [CreateSyncVersion] + [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.MiniExcel.Importer instead.")] + public static IAsyncEnumerable QueryRangeAsync(this Stream stream, bool useHeaderRow = false, string? sheetName = null, ExcelType excelType = ExcelType.UNKNOWN, int startRowIndex = 1, int startColumnIndex = 1, int? endRowIndex = null, int? endColumnIndex = null, IConfiguration? configuration = null, CancellationToken cancellationToken = default) + { + var type = stream.GetExcelType(excelType); + return type switch + { + ExcelType.XLSX => ExcelImporter.QueryExcelRangeAsync(stream, useHeaderRow, sheetName, startRowIndex, startColumnIndex, endRowIndex, endColumnIndex, configuration as OpenXmlConfiguration, cancellationToken), + ExcelType.CSV => throw new NotSupportedException("QueryRange is not supported for csv"), + _ => throw new InvalidDataException($"Excel type {type} is not a valid Excel type") + }; + } + + #endregion QueryRange + + [CreateSyncVersion] + [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.MiniExcel.Exporter instead.")] + public static async Task SaveAsByTemplateAsync(string path, string templatePath, object value, IConfiguration? configuration = null, CancellationToken cancellationToken = default) + => await ExcelTemplater.ApplyXlsxTemplateAsync(path, templatePath, value, configuration as OpenXmlConfiguration, cancellationToken).ConfigureAwait(false); + + [CreateSyncVersion] + [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.MiniExcel.Templater instead.")] + public static async Task SaveAsByTemplateAsync(string path, byte[] templateBytes, object value, IConfiguration? configuration = null) + => await ExcelTemplater.ApplyXlsxTemplateAsync(path, templateBytes, value, configuration as OpenXmlConfiguration).ConfigureAwait(false); + + [CreateSyncVersion] + [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.MiniExcel.Templater instead.")] + public static async Task SaveAsByTemplateAsync(this Stream stream, string templatePath, object value, IConfiguration? configuration = null) + => await ExcelTemplater.ApplyXlsxTemplateAsync(stream, templatePath, value, configuration as OpenXmlConfiguration).ConfigureAwait(false); + + [CreateSyncVersion] + [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.MiniExcel.Templater instead.")] + public static async Task SaveAsByTemplateAsync(this Stream stream, byte[] templateBytes, object value, IConfiguration? configuration = null) + => await ExcelTemplater.ApplyXlsxTemplateAsync(stream, templateBytes, value, configuration as OpenXmlConfiguration).ConfigureAwait(false); + + [CreateSyncVersion] + [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.MiniExcel.Templater instead.")] + public static async Task SaveAsByTemplateAsync(string path, Stream templateStream, object value, IConfiguration? configuration = null) + => await ExcelTemplater.ApplyXlsxTemplateAsync(path, templateStream, value, configuration as OpenXmlConfiguration).ConfigureAwait(false); + + [CreateSyncVersion] + [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.MiniExcel.Templater instead.")] + public static async Task SaveAsByTemplateAsync(this Stream stream, Stream templateStream, object value, IConfiguration? configuration = null) + => await ExcelTemplater.ApplyXlsxTemplateAsync(stream, templateStream, value, configuration as OpenXmlConfiguration).ConfigureAwait(false); + + #region MergeCells + + [CreateSyncVersion] + [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.MiniExcel.Templater instead.")] + public static async Task MergeSameCellsAsync(string mergedFilePath, string path, ExcelType excelType = ExcelType.XLSX, IConfiguration? configuration = null, CancellationToken cancellationToken = default) + { + if (excelType != ExcelType.XLSX) + throw new NotSupportedException("MergeSameCells is only supported for Xlsx files"); + + await ExcelTemplater.MergeSameCellsAsync(mergedFilePath, path, configuration as OpenXmlConfiguration, cancellationToken).ConfigureAwait(false); + } + + [CreateSyncVersion] + [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.MiniExcel.Templater instead.")] + public static async Task MergeSameCellsAsync(this Stream stream, string path, ExcelType excelType = ExcelType.XLSX, IConfiguration? configuration = null, CancellationToken cancellationToken = default) + { + if (excelType != ExcelType.XLSX) + throw new NotSupportedException("MergeSameCells is only supported for Xlsx files"); + + await ExcelTemplater.MergeSameCellsAsync(stream, path, configuration as OpenXmlConfiguration, cancellationToken).ConfigureAwait(false); + } + + [CreateSyncVersion] + [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.MiniExcel.Templater instead.")] + public static async Task MergeSameCellsAsync(this Stream stream, byte[] filePath, ExcelType excelType = ExcelType.XLSX, IConfiguration? configuration = null, CancellationToken cancellationToken = default) + { + if (excelType != ExcelType.XLSX) + throw new NotSupportedException("MergeSameCells is only supported for Xlsx files"); + + await ExcelTemplater.MergeSameCellsAsync(stream, filePath, configuration as OpenXmlConfiguration, cancellationToken).ConfigureAwait(false); + } + + #endregion + + /// + /// The use of QueryAsDataTable is not recommended, because it'll load all data into memory. + /// + [CreateSyncVersion] + [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.MiniExcel.Importer instead.")] + public static async Task QueryAsDataTableAsync(string path, bool useHeaderRow = true, string? sheetName = null, ExcelType excelType = ExcelType.UNKNOWN, string startCell = "A1", IConfiguration? configuration = null, CancellationToken cancellationToken = default) + { + var type = path.GetExcelType(excelType); + var task = type switch + { + ExcelType.XLSX => ExcelImporter.QueryExcelAsDataTableAsync(path, useHeaderRow, sheetName, startCell, configuration as OpenXmlConfiguration, cancellationToken), + ExcelType.CSV => CsvImporter.QueryCsvAsDataTableAsync(path, useHeaderRow, configuration as CsvConfiguration, cancellationToken), + _ => throw new InvalidDataException($"Excel type {type} is not a valid Excel type") + }; + + return await task.ConfigureAwait(false); + } + + /// + /// The use of QueryAsDataTable is not recommended, because it'll load all data into memory. + /// + [CreateSyncVersion] + [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.MiniExcel.Importer instead.")] + public static async Task QueryAsDataTableAsync(this Stream stream, bool useHeaderRow = true, string? sheetName = null, ExcelType excelType = ExcelType.UNKNOWN, string startCell = "A1", IConfiguration? configuration = null, CancellationToken cancellationToken = default) + { + var type = stream.GetExcelType(excelType); + var task = type switch + { + ExcelType.XLSX => ExcelImporter.QueryExcelAsDataTableAsync(stream, useHeaderRow, sheetName, startCell, configuration as OpenXmlConfiguration, cancellationToken), + ExcelType.CSV => CsvImporter.QueryCsvAsDataTableAsync(stream, useHeaderRow, configuration as CsvConfiguration, cancellationToken), + _ => throw new InvalidDataException($"Excel type {type} is not a valid Excel type") + }; + + return await task.ConfigureAwait(false); + } + + [CreateSyncVersion] + [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.MiniExcel.Importer instead.")] + public static async Task> GetSheetNamesAsync(string path, OpenXmlConfiguration? config = null, CancellationToken cancellationToken = default) + => await ExcelImporter.GetSheetNamesAsync(path, config, cancellationToken).ConfigureAwait(false); + + [CreateSyncVersion] + [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.MiniExcel.Importer instead.")] + public static async Task> GetSheetNamesAsync(this Stream stream, OpenXmlConfiguration? config = null, CancellationToken cancellationToken = default) + => await ExcelImporter.GetSheetNamesAsync(stream, config, cancellationToken).ConfigureAwait(false); + + [CreateSyncVersion] + [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.MiniExcel.Importer instead.")] + public static async Task> GetSheetInformationsAsync(string path, OpenXmlConfiguration? config = null, CancellationToken cancellationToken = default) + => await ExcelImporter.GetSheetInformationsAsync(path, config, cancellationToken).ConfigureAwait(false); + + [CreateSyncVersion] + [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.MiniExcel.Importer instead.")] + public static async Task> GetSheetInformationsAsync(this Stream stream, OpenXmlConfiguration? config = null, CancellationToken cancellationToken = default) + => await ExcelImporter.GetSheetInformationsAsync(stream, config, cancellationToken).ConfigureAwait(false); + + [CreateSyncVersion] + [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.MiniExcel.Importer instead.")] + public static async Task> GetColumnsAsync(string path, bool useHeaderRow = false, string? sheetName = null, ExcelType excelType = ExcelType.UNKNOWN, string startCell = "A1", IConfiguration? configuration = null, CancellationToken cancellationToken = default) + { + var type = path.GetExcelType(excelType); + var task = type switch + { + ExcelType.XLSX => ExcelImporter.GetExcelColumnsAsync(path, useHeaderRow, sheetName, startCell, configuration as OpenXmlConfiguration, cancellationToken), + ExcelType.CSV => CsvImporter.GetCsvColumnsAsync(path, useHeaderRow, configuration as CsvConfiguration, cancellationToken), + _ => throw new InvalidDataException($"Excel type {type} is not a valid Excel type") + }; + + return await task.ConfigureAwait(false); + } + + [CreateSyncVersion] + [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.MiniExcel.Importer instead.")] + public static async Task> GetColumnsAsync(this Stream stream, bool useHeaderRow = false, string? sheetName = null, ExcelType excelType = ExcelType.UNKNOWN, string startCell = "A1", IConfiguration? configuration = null, CancellationToken cancellationToken = default) + { + var type = stream.GetExcelType(excelType); + var task = type switch + { + ExcelType.XLSX => ExcelImporter.GetExcelColumnsAsync(stream, useHeaderRow, sheetName, startCell, configuration as OpenXmlConfiguration, cancellationToken), + ExcelType.CSV => CsvImporter.GetCsvColumnsAsync(stream, useHeaderRow, configuration as CsvConfiguration, cancellationToken), + _ => throw new InvalidDataException($"Excel type {type} is not a valid Excel type") + }; + + return await task.ConfigureAwait(false); + } + + [CreateSyncVersion] + [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.MiniExcel.Importer instead.")] + public static async Task> GetSheetDimensionsAsync(string path, CancellationToken cancellationToken = default) + => await ExcelImporter.GetSheetDimensionsAsync(path, cancellationToken).ConfigureAwait(false); + + [CreateSyncVersion] + [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.MiniExcel.Importer instead.")] + public static async Task> GetSheetDimensionsAsync(this Stream stream, CancellationToken cancellationToken = default) + => await ExcelImporter.GetSheetDimensionsAsync(stream, cancellationToken).ConfigureAwait(false); + + [CreateSyncVersion] + [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.MiniExcel.Exporter instead.")] + public static async Task ConvertCsvToXlsxAsync(string csv, string xlsx, CancellationToken cancellationToken = default) + => await CsvExporter.ConvertCsvToXlsxAsync(csv, xlsx, cancellationToken: cancellationToken).ConfigureAwait(false); + + [CreateSyncVersion] + [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.MiniExcel.Exporter instead.")] + public static async Task ConvertCsvToXlsxAsync(Stream csv, Stream xlsx, CancellationToken cancellationToken = default) + => await CsvExporter.ConvertCsvToXlsxAsync(csv, xlsx, cancellationToken: cancellationToken).ConfigureAwait(false); + + [CreateSyncVersion] + [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.MiniExcel.Exporter instead.")] + public static async Task ConvertXlsxToCsvAsync(string xlsx, string csv, CancellationToken cancellationToken = default) + => await CsvExporter.ConvertXlsxToCsvAsync(xlsx, csv, cancellationToken: cancellationToken).ConfigureAwait(false); + + [CreateSyncVersion] + [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.MiniExcel.Exporter instead.")] + public static async Task ConvertXlsxToCsvAsync(Stream xlsx, Stream csv, CancellationToken cancellationToken = default) + => await CsvExporter.ConvertXlsxToCsvAsync(xlsx, csv, cancellationToken: cancellationToken).ConfigureAwait(false); + +} \ No newline at end of file diff --git a/src/MiniExcel/MiniExcel.cs b/src/MiniExcel/MiniExcel.cs index f0719586..03cd049d 100644 --- a/src/MiniExcel/MiniExcel.cs +++ b/src/MiniExcel/MiniExcel.cs @@ -2,7 +2,7 @@ namespace MiniExcelLib; public static class MiniExcel { - public static MiniExcelExporterProvider GetExporterProvider() => new(); - public static MiniExcelImporterProvider GetImporterProvider() => new(); - public static MiniExcelTemplaterProvider GetTemplaterProvider() => new(); + public static readonly MiniExcelExporterProvider Exporter = new(); + public static readonly MiniExcelImporterProvider Importer = new(); + public static readonly MiniExcelTemplaterProvider Templater = new(); } \ No newline at end of file diff --git a/src/MiniExcel/Providers.cs b/src/MiniExcel/MiniExcelProviders.cs similarity index 67% rename from src/MiniExcel/Providers.cs rename to src/MiniExcel/MiniExcelProviders.cs index ba1e0034..06d8f415 100644 --- a/src/MiniExcel/Providers.cs +++ b/src/MiniExcel/MiniExcelProviders.cs @@ -2,15 +2,21 @@ namespace MiniExcelLib; public sealed class MiniExcelImporterProvider { + internal MiniExcelImporterProvider() { } + public OpenXmlImporter GetExcelImporter() => new(); } public sealed class MiniExcelExporterProvider { + internal MiniExcelExporterProvider() { } + public OpenXmlExporter GetExcelExporter() => new(); } public sealed class MiniExcelTemplaterProvider { + internal MiniExcelTemplaterProvider() { } + public OpenXmlTemplater GetExcelTemplater() => new(); } diff --git a/src/MiniExcel/OpenXml/OpenXmlConfiguration.cs b/src/MiniExcel/OpenXml/OpenXmlConfiguration.cs index 03e6c93d..09894245 100644 --- a/src/MiniExcel/OpenXml/OpenXmlConfiguration.cs +++ b/src/MiniExcel/OpenXml/OpenXmlConfiguration.cs @@ -4,7 +4,7 @@ namespace MiniExcelLib.OpenXml; public class OpenXmlConfiguration : MiniExcelBaseConfiguration { - internal static readonly OpenXmlConfiguration DefaultConfig = new(); + internal static OpenXmlConfiguration Default => new(); public bool FillMergedCells { get; set; } public TableStyles TableStyles { get; set; } = TableStyles.Default; diff --git a/src/MiniExcel/OpenXml/OpenXmlReader.cs b/src/MiniExcel/OpenXml/OpenXmlReader.cs index e174de62..2f4742bb 100644 --- a/src/MiniExcel/OpenXml/OpenXmlReader.cs +++ b/src/MiniExcel/OpenXml/OpenXmlReader.cs @@ -24,7 +24,7 @@ internal partial class OpenXmlReader : IMiniExcelReader private OpenXmlReader(Stream stream, IMiniExcelConfiguration? configuration) { Archive = new OpenXmlZip(stream); - _config = (OpenXmlConfiguration?)configuration ?? OpenXmlConfiguration.DefaultConfig; + _config = (OpenXmlConfiguration?)configuration ?? OpenXmlConfiguration.Default; } [CreateSyncVersion] diff --git a/src/MiniExcel/OpenXml/OpenXmlWriter.cs b/src/MiniExcel/OpenXml/OpenXmlWriter.cs index 67736f82..a3823171 100644 --- a/src/MiniExcel/OpenXml/OpenXmlWriter.cs +++ b/src/MiniExcel/OpenXml/OpenXmlWriter.cs @@ -31,7 +31,7 @@ internal OpenXmlWriter(Stream stream, object? value, string? sheetName, IMiniExc // Why ZipArchiveMode.Update not ZipArchiveMode.Create? // R : Mode create - ZipArchiveEntry does not support seeking.' - _configuration = configuration as OpenXmlConfiguration ?? OpenXmlConfiguration.DefaultConfig; + _configuration = configuration as OpenXmlConfiguration ?? OpenXmlConfiguration.Default; if (_configuration is { EnableAutoWidth: true, FastMode: false }) throw new InvalidOperationException("Auto width requires fast mode to be enabled"); diff --git a/src/MiniExcel/OpenXml/Templates/OpenXmlTemplate.cs b/src/MiniExcel/OpenXml/Templates/OpenXmlTemplate.cs index 298cb6ac..edc8573d 100644 --- a/src/MiniExcel/OpenXml/Templates/OpenXmlTemplate.cs +++ b/src/MiniExcel/OpenXml/Templates/OpenXmlTemplate.cs @@ -28,7 +28,7 @@ static OpenXmlTemplate() internal OpenXmlTemplate(Stream stream, IMiniExcelConfiguration? configuration, OpenXmlValueExtractor inputValueExtractor) { _outputFileStream = stream; - _configuration = (OpenXmlConfiguration?)configuration ?? OpenXmlConfiguration.DefaultConfig; + _configuration = (OpenXmlConfiguration?)configuration ?? OpenXmlConfiguration.Default; _inputValueExtractor = inputValueExtractor; } diff --git a/src/MiniExcel/OpenXmlExporter.cs b/src/MiniExcel/OpenXmlExporter.cs index b6632e92..49063cf4 100644 --- a/src/MiniExcel/OpenXmlExporter.cs +++ b/src/MiniExcel/OpenXmlExporter.cs @@ -4,6 +4,9 @@ namespace MiniExcelLib; public sealed partial class OpenXmlExporter { + internal OpenXmlExporter() { } + + [CreateSyncVersion] public async Task AddExcelPictureAsync(string path, CancellationToken cancellationToken = default, params MiniExcelPicture[] images) { @@ -21,7 +24,7 @@ public async Task AddExcelPictureAsync(Stream excelStream, CancellationToken can public async Task InsertExcelSheetAsync(string path, object value, string? sheetName = "Sheet1", bool printHeader = true, bool overwriteSheet = false, OpenXmlConfiguration? configuration = null, CancellationToken cancellationToken = default) { if (Path.GetExtension(path).Equals(".xlsm", StringComparison.InvariantCultureIgnoreCase)) - throw new NotSupportedException("MiniExcel's Insert does not support the .xlsm format"); + throw new NotSupportedException("MiniExcel's InsertExcelSheet does not support the .xlsm format"); if (!File.Exists(path)) { @@ -54,7 +57,7 @@ public async Task ExportExcelAsync(string path, object value, bool printH CancellationToken cancellationToken = default) { if (Path.GetExtension(path).Equals(".xlsm", StringComparison.InvariantCultureIgnoreCase)) - throw new NotSupportedException("MiniExcel's SaveAs does not support the .xlsm format"); + throw new NotSupportedException("MiniExcel's ExportExcel does not support the .xlsm format"); using var stream = overwriteFile ? File.Create(path) : new FileStream(path, FileMode.CreateNew); return await ExportExcelAsync(stream, value, printHeader, sheetName, configuration, cancellationToken).ConfigureAwait(false); diff --git a/src/MiniExcel/OpenXmlImporter.cs b/src/MiniExcel/OpenXmlImporter.cs index e6cf0731..d590893c 100644 --- a/src/MiniExcel/OpenXmlImporter.cs +++ b/src/MiniExcel/OpenXmlImporter.cs @@ -8,6 +8,8 @@ namespace MiniExcelLib; public sealed partial class OpenXmlImporter { + internal OpenXmlImporter() { } + #region Query [CreateSyncVersion] @@ -201,7 +203,7 @@ public async Task> GetSheetNamesAsync(string path, OpenXmlConfigura public async Task> GetSheetNamesAsync(Stream stream, OpenXmlConfiguration? config = null, CancellationToken cancellationToken = default) { - config ??= OpenXmlConfiguration.DefaultConfig; + config ??= OpenXmlConfiguration.Default; // todo: figure out why adding using statement breaks the tests #pragma warning disable CA2000 // Dispose objects before losing scope @@ -224,7 +226,7 @@ public async Task> GetSheetInformationsAsync(string path, OpenXm [CreateSyncVersion] public async Task> GetSheetInformationsAsync(Stream stream, OpenXmlConfiguration? config = null, CancellationToken cancellationToken = default) { - config ??= OpenXmlConfiguration.DefaultConfig; + config ??= OpenXmlConfiguration.Default; using var archive = new OpenXmlZip(stream); using var reader = await OpenXmlReader.CreateAsync(stream, config, cancellationToken: cancellationToken).ConfigureAwait(false); diff --git a/src/MiniExcel/OpenXmlTemplater.cs b/src/MiniExcel/OpenXmlTemplater.cs index 23d29197..2a39d0ee 100644 --- a/src/MiniExcel/OpenXmlTemplater.cs +++ b/src/MiniExcel/OpenXmlTemplater.cs @@ -4,6 +4,9 @@ namespace MiniExcelLib; public sealed partial class OpenXmlTemplater { + internal OpenXmlTemplater() { } + + [CreateSyncVersion] public async Task ApplyXlsxTemplateAsync(string path, string templatePath, object value, OpenXmlConfiguration? configuration = null, CancellationToken cancellationToken = default) diff --git a/tests/MiniExcel.Csv.Tests/AsyncIssueTests.cs b/tests/MiniExcel.Csv.Tests/AsyncIssueTests.cs index c9b0266f..506e719a 100644 --- a/tests/MiniExcel.Csv.Tests/AsyncIssueTests.cs +++ b/tests/MiniExcel.Csv.Tests/AsyncIssueTests.cs @@ -2,11 +2,11 @@ public class AsyncIssueTests { - private readonly CsvExporter _csvExporter = MiniExcel.GetExporterProvider().GetCsvExporter(); - private readonly CsvImporter _csvImporter = MiniExcel.GetImporterProvider().GetCsvImporter(); + private readonly CsvExporter _csvExporter = MiniExcel.Exporter.GetCsvExporter(); + private readonly CsvImporter _csvImporter = MiniExcel.Importer.GetCsvImporter(); - private readonly OpenXmlExporter _openXmlExporter = MiniExcel.GetExporterProvider().GetExcelExporter(); - private readonly OpenXmlImporter _openXmlImporter = MiniExcel.GetImporterProvider().GetExcelImporter(); + private readonly OpenXmlExporter _openXmlExporter = MiniExcel.Exporter.GetExcelExporter(); + private readonly OpenXmlImporter _openXmlImporter = MiniExcel.Importer.GetExcelImporter(); /// /// Csv SaveAs by datareader with encoding default show messy code #253 /// diff --git a/tests/MiniExcel.Csv.Tests/IssueTests.cs b/tests/MiniExcel.Csv.Tests/IssueTests.cs index 0643c37e..29108dab 100644 --- a/tests/MiniExcel.Csv.Tests/IssueTests.cs +++ b/tests/MiniExcel.Csv.Tests/IssueTests.cs @@ -2,11 +2,11 @@ public class IssueTests { - private readonly CsvExporter _csvExporter = MiniExcel.GetExporterProvider().GetCsvExporter(); - private readonly CsvImporter _csvImporter = MiniExcel.GetImporterProvider().GetCsvImporter(); + private readonly CsvExporter _csvExporter = MiniExcel.Exporter.GetCsvExporter(); + private readonly CsvImporter _csvImporter = MiniExcel.Importer.GetCsvImporter(); - private readonly OpenXmlExporter _openXmlExporter = MiniExcel.GetExporterProvider().GetExcelExporter(); - private readonly OpenXmlImporter _openXmlImporter = MiniExcel.GetImporterProvider().GetExcelImporter(); + private readonly OpenXmlExporter _openXmlExporter = MiniExcel.Exporter.GetExcelExporter(); + private readonly OpenXmlImporter _openXmlImporter = MiniExcel.Importer.GetExcelImporter(); [Fact] public void TestPR10() diff --git a/tests/MiniExcel.Csv.Tests/MiniExcelCsvAsycTests.cs b/tests/MiniExcel.Csv.Tests/MiniExcelCsvAsycTests.cs index 17730e01..75ec2a22 100644 --- a/tests/MiniExcel.Csv.Tests/MiniExcelCsvAsycTests.cs +++ b/tests/MiniExcel.Csv.Tests/MiniExcelCsvAsycTests.cs @@ -2,8 +2,8 @@ public class MiniExcelCsvAsycTests { - private readonly CsvExporter _exporter = MiniExcel.GetExporterProvider().GetCsvExporter(); - private readonly CsvImporter _importer = MiniExcel.GetImporterProvider().GetCsvImporter(); + private readonly CsvExporter _exporter = MiniExcel.Exporter.GetCsvExporter(); + private readonly CsvImporter _importer = MiniExcel.Importer.GetCsvImporter(); [Fact] public async Task Gb2312_Encoding_Read_Test() diff --git a/tests/MiniExcel.Csv.Tests/MiniExcelCsvTests.cs b/tests/MiniExcel.Csv.Tests/MiniExcelCsvTests.cs index 16d50a3e..bdf175c0 100644 --- a/tests/MiniExcel.Csv.Tests/MiniExcelCsvTests.cs +++ b/tests/MiniExcel.Csv.Tests/MiniExcelCsvTests.cs @@ -2,8 +2,8 @@ public class MiniExcelCsvTests { - private readonly CsvExporter _exporter = MiniExcel.GetExporterProvider().GetCsvExporter(); - private readonly CsvImporter _importer = MiniExcel.GetImporterProvider().GetCsvImporter(); + private readonly CsvExporter _exporter = MiniExcel.Exporter.GetCsvExporter(); + private readonly CsvImporter _importer = MiniExcel.Importer.GetCsvImporter(); [Fact] public void gb2312_Encoding_Read_Test() @@ -495,7 +495,7 @@ private static string MiniExcelGenerateCsv(string value) using (var stream = File.Create(path)) { IEnumerable records = [new { v1 = value, v2 = value }]; - var rowsWritten = MiniExcel.GetExporterProvider().GetCsvExporter().ExportCsv(stream, records); + var rowsWritten = MiniExcel.Exporter.GetCsvExporter().ExportCsv(stream, records); Assert.Equal(1, rowsWritten[0]); } diff --git a/tests/MiniExcel.Tests/MiniExcelAutoAdjustWidthTests.cs b/tests/MiniExcel.Tests/MiniExcelAutoAdjustWidthTests.cs index 7e92fde0..1f1ecbda 100644 --- a/tests/MiniExcel.Tests/MiniExcelAutoAdjustWidthTests.cs +++ b/tests/MiniExcel.Tests/MiniExcelAutoAdjustWidthTests.cs @@ -7,7 +7,7 @@ namespace MiniExcelLib.Tests; public class MiniExcelAutoAdjustWidthTests { - private readonly OpenXmlExporter _exporter = MiniExcel.GetExporterProvider().GetExcelExporter(); + private readonly OpenXmlExporter _exporter = MiniExcel.Exporter.GetExcelExporter(); [Fact] public async Task AutoAdjustWidthThrowsExceptionWithoutFastMode_Async() diff --git a/tests/MiniExcel.Tests/MiniExcelIssueAsyncTests.cs b/tests/MiniExcel.Tests/MiniExcelIssueAsyncTests.cs index bed14119..2be9bfc5 100644 --- a/tests/MiniExcel.Tests/MiniExcelIssueAsyncTests.cs +++ b/tests/MiniExcel.Tests/MiniExcelIssueAsyncTests.cs @@ -8,9 +8,9 @@ public class MiniExcelIssueAsyncTests(ITestOutputHelper output) { private readonly ITestOutputHelper _output = output; - private readonly OpenXmlImporter _importer = MiniExcel.GetImporterProvider().GetExcelImporter(); - private readonly OpenXmlExporter _exporter = MiniExcel.GetExporterProvider().GetExcelExporter(); - private readonly OpenXmlTemplater _templater = MiniExcel.GetTemplaterProvider().GetExcelTemplater(); + private readonly OpenXmlImporter _importer = MiniExcel.Importer.GetExcelImporter(); + private readonly OpenXmlExporter _exporter = MiniExcel.Exporter.GetExcelExporter(); + private readonly OpenXmlTemplater _templater = MiniExcel.Templater.GetExcelTemplater(); /// /// [SaveAsByTemplate support DateTime custom format · Issue #255 · mini-software/MiniExcel] diff --git a/tests/MiniExcel.Tests/MiniExcelIssueTests.cs b/tests/MiniExcel.Tests/MiniExcelIssueTests.cs index d0646c37..9eb67ee7 100644 --- a/tests/MiniExcel.Tests/MiniExcelIssueTests.cs +++ b/tests/MiniExcel.Tests/MiniExcelIssueTests.cs @@ -15,9 +15,9 @@ public class MiniExcelIssueTests(ITestOutputHelper output) { private readonly ITestOutputHelper _output = output; - private readonly OpenXmlImporter _importer = MiniExcel.GetImporterProvider().GetExcelImporter(); - private readonly OpenXmlExporter _exporter = MiniExcel.GetExporterProvider().GetExcelExporter(); - private readonly OpenXmlTemplater _templater = MiniExcel.GetTemplaterProvider().GetExcelTemplater(); + private readonly OpenXmlImporter _importer = MiniExcel.Importer.GetExcelImporter(); + private readonly OpenXmlExporter _exporter = MiniExcel.Exporter.GetExcelExporter(); + private readonly OpenXmlTemplater _templater = MiniExcel.Templater.GetExcelTemplater(); /// /// https://github.com/mini-software/MiniExcel/issues/549 diff --git a/tests/MiniExcel.Tests/MiniExcelOpenXmlAsyncTests.cs b/tests/MiniExcel.Tests/MiniExcelOpenXmlAsyncTests.cs index 52597f41..2e612104 100644 --- a/tests/MiniExcel.Tests/MiniExcelOpenXmlAsyncTests.cs +++ b/tests/MiniExcel.Tests/MiniExcelOpenXmlAsyncTests.cs @@ -10,8 +10,8 @@ namespace MiniExcelLib.Tests; public class MiniExcelOpenXmlAsyncTests { - private readonly OpenXmlImporter _importer = MiniExcel.GetImporterProvider().GetExcelImporter(); - private readonly OpenXmlExporter _exporter = MiniExcel.GetExporterProvider().GetExcelExporter(); + private readonly OpenXmlImporter _importer = MiniExcel.Importer.GetExcelImporter(); + private readonly OpenXmlExporter _exporter = MiniExcel.Exporter.GetExcelExporter(); [Fact] public async Task SaveAsControlChracter() diff --git a/tests/MiniExcel.Tests/MiniExcelOpenXmlConfigurationTest.cs b/tests/MiniExcel.Tests/MiniExcelOpenXmlConfigurationTest.cs index 7c0583a9..71ff935b 100644 --- a/tests/MiniExcel.Tests/MiniExcelOpenXmlConfigurationTest.cs +++ b/tests/MiniExcel.Tests/MiniExcelOpenXmlConfigurationTest.cs @@ -6,8 +6,8 @@ namespace MiniExcelLib.Tests; public class MiniExcelOpenXmlConfigurationTest { - private readonly OpenXmlImporter _importer = MiniExcel.GetImporterProvider().GetExcelImporter(); - private readonly OpenXmlExporter _exporter = MiniExcel.GetExporterProvider().GetExcelExporter(); + private readonly OpenXmlImporter _importer = MiniExcel.Importer.GetExcelImporter(); + private readonly OpenXmlExporter _exporter = MiniExcel.Exporter.GetExcelExporter(); [Fact] public async Task EnableWriteFilePathTest() { diff --git a/tests/MiniExcel.Tests/MiniExcelOpenXmlMultipleSheetAsyncTests.cs b/tests/MiniExcel.Tests/MiniExcelOpenXmlMultipleSheetAsyncTests.cs index b66b716c..38a89411 100644 --- a/tests/MiniExcel.Tests/MiniExcelOpenXmlMultipleSheetAsyncTests.cs +++ b/tests/MiniExcel.Tests/MiniExcelOpenXmlMultipleSheetAsyncTests.cs @@ -2,7 +2,7 @@ public class MiniExcelOpenXmlMultipleSheetAsyncTests { - private readonly OpenXmlImporter _importer = MiniExcel.GetImporterProvider().GetExcelImporter(); + private readonly OpenXmlImporter _importer = MiniExcel.Importer.GetExcelImporter(); [Fact] public async Task SpecifySheetNameQueryTest() diff --git a/tests/MiniExcel.Tests/MiniExcelOpenXmlMultipleSheetTests.cs b/tests/MiniExcel.Tests/MiniExcelOpenXmlMultipleSheetTests.cs index 7beafcbd..659adc71 100644 --- a/tests/MiniExcel.Tests/MiniExcelOpenXmlMultipleSheetTests.cs +++ b/tests/MiniExcel.Tests/MiniExcelOpenXmlMultipleSheetTests.cs @@ -6,7 +6,7 @@ namespace MiniExcelLib.Tests; public class MiniExcelOpenXmlMultipleSheetTests { - private readonly OpenXmlImporter _importer = MiniExcel.GetImporterProvider().GetExcelImporter(); + private readonly OpenXmlImporter _importer = MiniExcel.Importer.GetExcelImporter(); [Fact] public void SpecifySheetNameQueryTest() @@ -255,7 +255,7 @@ public void WriteHiddenSheetTest() using var file = AutoDeletingPath.Create(); var path = file.ToString(); - var rowsWritten = MiniExcel.GetExporterProvider().GetExcelExporter().ExportExcel(path, sheets, configuration: configuration); + var rowsWritten = MiniExcel.Exporter.GetExcelExporter().ExportExcel(path, sheets, configuration: configuration); Assert.Equal(2, rowsWritten.Length); Assert.Equal(2, rowsWritten[0]); diff --git a/tests/MiniExcel.Tests/MiniExcelOpenXmlTests.cs b/tests/MiniExcel.Tests/MiniExcelOpenXmlTests.cs index b338d20a..b1d1929c 100644 --- a/tests/MiniExcel.Tests/MiniExcelOpenXmlTests.cs +++ b/tests/MiniExcel.Tests/MiniExcelOpenXmlTests.cs @@ -11,8 +11,8 @@ public class MiniExcelOpenXmlTests(ITestOutputHelper output) { private readonly ITestOutputHelper _output = output; - private readonly OpenXmlImporter _importer = MiniExcel.GetImporterProvider().GetExcelImporter(); - private readonly OpenXmlExporter _exporter = MiniExcel.GetExporterProvider().GetExcelExporter(); + private readonly OpenXmlImporter _importer = MiniExcel.Importer.GetExcelImporter(); + private readonly OpenXmlExporter _exporter = MiniExcel.Exporter.GetExcelExporter(); [Fact] public void GetColumnsTest() diff --git a/tests/MiniExcel.Tests/SaveByTemplate/MiniExcelTemplateAsyncTests.cs b/tests/MiniExcel.Tests/SaveByTemplate/MiniExcelTemplateAsyncTests.cs index fd396948..7076c43c 100644 --- a/tests/MiniExcel.Tests/SaveByTemplate/MiniExcelTemplateAsyncTests.cs +++ b/tests/MiniExcel.Tests/SaveByTemplate/MiniExcelTemplateAsyncTests.cs @@ -4,8 +4,8 @@ namespace MiniExcelLib.Tests.SaveByTemplate; public class MiniExcelTemplateAsyncTests { - private readonly OpenXmlImporter _importer = MiniExcel.GetImporterProvider().GetExcelImporter(); - private readonly OpenXmlTemplater _templater = MiniExcel.GetTemplaterProvider().GetExcelTemplater(); + private readonly OpenXmlImporter _importer = MiniExcel.Importer.GetExcelImporter(); + private readonly OpenXmlTemplater _templater = MiniExcel.Templater.GetExcelTemplater(); [Fact] public async Task DatatableTemptyRowTest() diff --git a/tests/MiniExcel.Tests/SaveByTemplate/MiniExcelTemplateTests.cs b/tests/MiniExcel.Tests/SaveByTemplate/MiniExcelTemplateTests.cs index dec49d9a..4a7db8ab 100644 --- a/tests/MiniExcel.Tests/SaveByTemplate/MiniExcelTemplateTests.cs +++ b/tests/MiniExcel.Tests/SaveByTemplate/MiniExcelTemplateTests.cs @@ -7,9 +7,9 @@ namespace MiniExcelLib.Tests.SaveByTemplate; public class MiniExcelTemplateTests { - private readonly OpenXmlImporter _importer = MiniExcel.GetImporterProvider().GetExcelImporter(); - private readonly OpenXmlExporter _exporter = MiniExcel.GetExporterProvider().GetExcelExporter(); - private readonly OpenXmlTemplater _templater = MiniExcel.GetTemplaterProvider().GetExcelTemplater(); + private readonly OpenXmlImporter _importer = MiniExcel.Importer.GetExcelImporter(); + private readonly OpenXmlExporter _exporter = MiniExcel.Exporter.GetExcelExporter(); + private readonly OpenXmlTemplater _templater = MiniExcel.Templater.GetExcelTemplater(); [Fact] public void TestImageType() From 9b50b5a09bcdd3ad1413bd654a9b0a1ab482def2 Mon Sep 17 00:00:00 2001 From: Michele Bastione Date: Wed, 16 Jul 2025 01:21:01 +0200 Subject: [PATCH 17/26] Fixing build errors --- src/MiniExcel.Legacy/MiniExcel.cs | 64 ++++++++++++------------------- 1 file changed, 24 insertions(+), 40 deletions(-) diff --git a/src/MiniExcel.Legacy/MiniExcel.cs b/src/MiniExcel.Legacy/MiniExcel.cs index dd562061..bc6ab871 100644 --- a/src/MiniExcel.Legacy/MiniExcel.cs +++ b/src/MiniExcel.Legacy/MiniExcel.cs @@ -58,14 +58,12 @@ public static MiniExcelDataReader GetReader(this Stream stream, bool useHeaderRo public static async Task InsertAsync(string path, object value, string sheetName = "Sheet1", ExcelType excelType = ExcelType.UNKNOWN, IConfiguration? configuration = null, bool printHeader = true, bool overwriteSheet = false, CancellationToken cancellationToken = default) { var type = path.GetExcelType(excelType); - var task = type switch + return type switch { - ExcelType.XLSX => ExcelExporter.InsertExcelSheetAsync(path, value, sheetName, printHeader, overwriteSheet, configuration as OpenXmlConfiguration, cancellationToken), - ExcelType.CSV => CsvExporter.AppendToCsvAsync(path, value, printHeader, configuration as CsvConfiguration, cancellationToken), + ExcelType.XLSX => await ExcelExporter.InsertExcelSheetAsync(path, value, sheetName, printHeader, overwriteSheet, configuration as OpenXmlConfiguration, cancellationToken).ConfigureAwait(false), + ExcelType.CSV => await CsvExporter.AppendToCsvAsync(path, value, printHeader, configuration as CsvConfiguration, cancellationToken).ConfigureAwait(false), _ => throw new InvalidDataException($"Excel type {type} is not a valid Excel type") }; - - return await task.ConfigureAwait(false); } [CreateSyncVersion] @@ -73,14 +71,12 @@ public static async Task InsertAsync(string path, object value, string shee public static async Task InsertAsync(this Stream stream, object value, string sheetName = "Sheet1", ExcelType excelType = ExcelType.XLSX, IConfiguration? configuration = null, bool printHeader = true, bool overwriteSheet = false, CancellationToken cancellationToken = default) { var type = stream.GetExcelType(excelType); - var task = type switch + return type switch { - ExcelType.XLSX => ExcelExporter.InsertExcelSheetAsync(stream, value, sheetName, printHeader, overwriteSheet, configuration as OpenXmlConfiguration, cancellationToken), - ExcelType.CSV => CsvExporter.AppendToCsvAsync(stream, value, configuration as CsvConfiguration, cancellationToken), + ExcelType.XLSX => await ExcelExporter.InsertExcelSheetAsync(stream, value, sheetName, printHeader, overwriteSheet, configuration as OpenXmlConfiguration, cancellationToken).ConfigureAwait(false), + ExcelType.CSV => await CsvExporter.AppendToCsvAsync(stream, value, configuration as CsvConfiguration, cancellationToken).ConfigureAwait(false), _ => throw new InvalidDataException($"Excel type {type} is not a valid Excel type") }; - - return await task.ConfigureAwait(false); } [CreateSyncVersion] @@ -88,14 +84,12 @@ public static async Task InsertAsync(this Stream stream, object value, stri public static async Task SaveAsAsync(string path, object value, bool printHeader = true, string sheetName = "Sheet1", ExcelType excelType = ExcelType.UNKNOWN, IConfiguration? configuration = null, bool overwriteFile = false, CancellationToken cancellationToken = default) { var type = path.GetExcelType(excelType); - var task = type switch + return type switch { - ExcelType.XLSX => ExcelExporter.ExportExcelAsync(path, value, printHeader, sheetName, printHeader, configuration as OpenXmlConfiguration, cancellationToken), - ExcelType.CSV => CsvExporter.ExportCsvAsync(path, value, printHeader, overwriteFile, configuration as CsvConfiguration, cancellationToken), + ExcelType.XLSX => await ExcelExporter.ExportExcelAsync(path, value, printHeader, sheetName, printHeader, configuration as OpenXmlConfiguration, cancellationToken).ConfigureAwait(false), + ExcelType.CSV => await CsvExporter.ExportCsvAsync(path, value, printHeader, overwriteFile, configuration as CsvConfiguration, cancellationToken).ConfigureAwait(false), _ => throw new InvalidDataException($"Excel type {type} is not a valid Excel type") }; - - return await task.ConfigureAwait(false); } [CreateSyncVersion] @@ -103,14 +97,12 @@ public static async Task SaveAsAsync(string path, object value, bool prin public static async Task SaveAsAsync(this Stream stream, object value, bool printHeader = true, string sheetName = "Sheet1", ExcelType excelType = ExcelType.XLSX, IConfiguration? configuration = null, CancellationToken cancellationToken = default) { var type = stream.GetExcelType(excelType); - var task = type switch + return type switch { - ExcelType.XLSX => ExcelExporter.ExportExcelAsync(stream, value, printHeader, sheetName, configuration as OpenXmlConfiguration, cancellationToken), - ExcelType.CSV => CsvExporter.ExportCsvAsync(stream, value, printHeader, configuration as CsvConfiguration, cancellationToken), + ExcelType.XLSX => await ExcelExporter.ExportExcelAsync(stream, value, printHeader, sheetName, configuration as OpenXmlConfiguration, cancellationToken).ConfigureAwait(false), + ExcelType.CSV => await CsvExporter.ExportCsvAsync(stream, value, printHeader, configuration as CsvConfiguration, cancellationToken).ConfigureAwait(false), _ => throw new InvalidDataException($"Excel type {type} is not a valid Excel type") }; - - return await task.ConfigureAwait(false); } [CreateSyncVersion] @@ -300,14 +292,12 @@ public static async Task MergeSameCellsAsync(this Stream stream, byte[] filePath public static async Task QueryAsDataTableAsync(string path, bool useHeaderRow = true, string? sheetName = null, ExcelType excelType = ExcelType.UNKNOWN, string startCell = "A1", IConfiguration? configuration = null, CancellationToken cancellationToken = default) { var type = path.GetExcelType(excelType); - var task = type switch + return type switch { - ExcelType.XLSX => ExcelImporter.QueryExcelAsDataTableAsync(path, useHeaderRow, sheetName, startCell, configuration as OpenXmlConfiguration, cancellationToken), - ExcelType.CSV => CsvImporter.QueryCsvAsDataTableAsync(path, useHeaderRow, configuration as CsvConfiguration, cancellationToken), + ExcelType.XLSX => await ExcelImporter.QueryExcelAsDataTableAsync(path, useHeaderRow, sheetName, startCell, configuration as OpenXmlConfiguration, cancellationToken).ConfigureAwait(false), + ExcelType.CSV => await CsvImporter.QueryCsvAsDataTableAsync(path, useHeaderRow, configuration as CsvConfiguration, cancellationToken).ConfigureAwait(false), _ => throw new InvalidDataException($"Excel type {type} is not a valid Excel type") }; - - return await task.ConfigureAwait(false); } /// @@ -318,14 +308,12 @@ public static async Task QueryAsDataTableAsync(string path, bool useH public static async Task QueryAsDataTableAsync(this Stream stream, bool useHeaderRow = true, string? sheetName = null, ExcelType excelType = ExcelType.UNKNOWN, string startCell = "A1", IConfiguration? configuration = null, CancellationToken cancellationToken = default) { var type = stream.GetExcelType(excelType); - var task = type switch + return type switch { - ExcelType.XLSX => ExcelImporter.QueryExcelAsDataTableAsync(stream, useHeaderRow, sheetName, startCell, configuration as OpenXmlConfiguration, cancellationToken), - ExcelType.CSV => CsvImporter.QueryCsvAsDataTableAsync(stream, useHeaderRow, configuration as CsvConfiguration, cancellationToken), + ExcelType.XLSX => await ExcelImporter.QueryExcelAsDataTableAsync(stream, useHeaderRow, sheetName, startCell, configuration as OpenXmlConfiguration, cancellationToken).ConfigureAwait(false), + ExcelType.CSV => await CsvImporter.QueryCsvAsDataTableAsync(stream, useHeaderRow, configuration as CsvConfiguration, cancellationToken).ConfigureAwait(false), _ => throw new InvalidDataException($"Excel type {type} is not a valid Excel type") }; - - return await task.ConfigureAwait(false); } [CreateSyncVersion] @@ -353,14 +341,12 @@ public static async Task> GetSheetInformationsAsync(this Stream public static async Task> GetColumnsAsync(string path, bool useHeaderRow = false, string? sheetName = null, ExcelType excelType = ExcelType.UNKNOWN, string startCell = "A1", IConfiguration? configuration = null, CancellationToken cancellationToken = default) { var type = path.GetExcelType(excelType); - var task = type switch + return type switch { - ExcelType.XLSX => ExcelImporter.GetExcelColumnsAsync(path, useHeaderRow, sheetName, startCell, configuration as OpenXmlConfiguration, cancellationToken), - ExcelType.CSV => CsvImporter.GetCsvColumnsAsync(path, useHeaderRow, configuration as CsvConfiguration, cancellationToken), + ExcelType.XLSX => await ExcelImporter.GetExcelColumnsAsync(path, useHeaderRow, sheetName, startCell, configuration as OpenXmlConfiguration, cancellationToken).ConfigureAwait(false), + ExcelType.CSV => await CsvImporter.GetCsvColumnsAsync(path, useHeaderRow, configuration as CsvConfiguration, cancellationToken).ConfigureAwait(false), _ => throw new InvalidDataException($"Excel type {type} is not a valid Excel type") }; - - return await task.ConfigureAwait(false); } [CreateSyncVersion] @@ -368,14 +354,12 @@ public static async Task> GetColumnsAsync(string path, bool public static async Task> GetColumnsAsync(this Stream stream, bool useHeaderRow = false, string? sheetName = null, ExcelType excelType = ExcelType.UNKNOWN, string startCell = "A1", IConfiguration? configuration = null, CancellationToken cancellationToken = default) { var type = stream.GetExcelType(excelType); - var task = type switch + return type switch { - ExcelType.XLSX => ExcelImporter.GetExcelColumnsAsync(stream, useHeaderRow, sheetName, startCell, configuration as OpenXmlConfiguration, cancellationToken), - ExcelType.CSV => CsvImporter.GetCsvColumnsAsync(stream, useHeaderRow, configuration as CsvConfiguration, cancellationToken), + ExcelType.XLSX => await ExcelImporter.GetExcelColumnsAsync(stream, useHeaderRow, sheetName, startCell, configuration as OpenXmlConfiguration, cancellationToken).ConfigureAwait(false), + ExcelType.CSV => await CsvImporter.GetCsvColumnsAsync(stream, useHeaderRow, configuration as CsvConfiguration, cancellationToken).ConfigureAwait(false), _ => throw new InvalidDataException($"Excel type {type} is not a valid Excel type") }; - - return await task.ConfigureAwait(false); } [CreateSyncVersion] From 2d3320f875e9925d7f393414b5c97eb1edc93c16 Mon Sep 17 00:00:00 2001 From: Michele Bastione Date: Thu, 17 Jul 2025 00:04:35 +0200 Subject: [PATCH 18/26] Moved the public api under relevant namespace, changed version from beta to preview --- .../BenchmarkSections/CreateExcelBenchmark.cs | 1 + .../BenchmarkSections/QueryExcelBenchmark.cs | 1 + .../TemplateExcelBenchmark.cs | 1 + .../BenchmarkSections/XlsxAsyncBenchmark.cs | 1 + src/Directory.Build.props | 2 +- src/MiniExcel.Csv/{ => Api}/CsvExporter.cs | 2 +- src/MiniExcel.Csv/{ => Api}/CsvImporter.cs | 6 +- src/MiniExcel.Csv/ProviderExtensions.cs | 4 +- src/MiniExcel.Legacy/MiniExcel.cs | 5 ++ src/MiniExcel/MiniExcelProviders.cs | 6 +- .../{ => OpenXml/Api}/OpenXmlExporter.cs | 2 +- .../{ => OpenXml/Api}/OpenXmlImporter.cs | 6 +- .../{ => OpenXml/Api}/OpenXmlTemplater.cs | 2 +- src/MiniExcel/OpenXml/OpenXmlConfiguration.cs | 1 + src/MiniExcel/OpenXml/OpenXmlReader.cs | 1 + src/MiniExcel/OpenXml/OpenXmlWriter.cs | 4 ++ .../{ => Builder}/DefaultSheetStyleBuilder.cs | 29 ++++----- .../{ => Builder}/ISheetStyleBuilder.cs | 4 +- .../{ => Builder}/MinimalSheetStyleBuilder.cs | 25 +++----- .../{ => Builder}/SheetStyleBuildContext.cs | 32 +++++----- .../Styles/Builder/SheetStyleBuildResult.cs | 6 ++ .../{ => Builder}/SheetStyleBuilderBase.cs | 62 +++++++++---------- .../{ => Builder}/SheetStyleBuilderHelper.cs | 6 +- .../{ => Styles}/OpenXmlStyleOptions.cs | 2 +- .../OpenXml/{ => Styles}/OpenXmlStyles.cs | 2 +- .../OpenXml/Styles/SheetStyleBuildResult.cs | 11 ---- .../MiniExcel.Csv.Tests.csproj | 2 + tests/MiniExcel.Tests/MiniExcel.Tests.csproj | 1 + 28 files changed, 114 insertions(+), 113 deletions(-) rename src/MiniExcel.Csv/{ => Api}/CsvExporter.cs (97%) rename src/MiniExcel.Csv/{ => Api}/CsvImporter.cs (94%) rename src/MiniExcel/{ => OpenXml/Api}/OpenXmlExporter.cs (97%) rename src/MiniExcel/{ => OpenXml/Api}/OpenXmlImporter.cs (96%) rename src/MiniExcel/{ => OpenXml/Api}/OpenXmlTemplater.cs (96%) rename src/MiniExcel/OpenXml/Styles/{ => Builder}/DefaultSheetStyleBuilder.cs (97%) rename src/MiniExcel/OpenXml/Styles/{ => Builder}/ISheetStyleBuilder.cs (59%) rename src/MiniExcel/OpenXml/Styles/{ => Builder}/MinimalSheetStyleBuilder.cs (87%) rename src/MiniExcel/OpenXml/Styles/{ => Builder}/SheetStyleBuildContext.cs (92%) create mode 100644 src/MiniExcel/OpenXml/Styles/Builder/SheetStyleBuildResult.cs rename src/MiniExcel/OpenXml/Styles/{ => Builder}/SheetStyleBuilderBase.cs (87%) rename src/MiniExcel/OpenXml/Styles/{ => Builder}/SheetStyleBuilderHelper.cs (82%) rename src/MiniExcel/OpenXml/{ => Styles}/OpenXmlStyleOptions.cs (65%) rename src/MiniExcel/OpenXml/{ => Styles}/OpenXmlStyles.cs (97%) delete mode 100644 src/MiniExcel/OpenXml/Styles/SheetStyleBuildResult.cs diff --git a/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/CreateExcelBenchmark.cs b/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/CreateExcelBenchmark.cs index 3e456a7b..087be26e 100644 --- a/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/CreateExcelBenchmark.cs +++ b/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/CreateExcelBenchmark.cs @@ -5,6 +5,7 @@ using DocumentFormat.OpenXml.Packaging; using DocumentFormat.OpenXml.Spreadsheet; using MiniExcelLib.Benchmarks.Utils; +using MiniExcelLib.OpenXml.Api; using NPOI.XSSF.UserModel; using OfficeOpenXml; diff --git a/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/QueryExcelBenchmark.cs b/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/QueryExcelBenchmark.cs index 84741be7..6d044e02 100644 --- a/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/QueryExcelBenchmark.cs +++ b/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/QueryExcelBenchmark.cs @@ -4,6 +4,7 @@ using DocumentFormat.OpenXml.Packaging; using DocumentFormat.OpenXml.Spreadsheet; using ExcelDataReader; +using MiniExcelLib.OpenXml.Api; using NPOI.XSSF.UserModel; using OfficeOpenXml; diff --git a/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/TemplateExcelBenchmark.cs b/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/TemplateExcelBenchmark.cs index 250887a6..f30d4d54 100644 --- a/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/TemplateExcelBenchmark.cs +++ b/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/TemplateExcelBenchmark.cs @@ -1,6 +1,7 @@ using BenchmarkDotNet.Attributes; using ClosedXML.Report; using MiniExcelLib.Benchmarks.Utils; +using MiniExcelLib.OpenXml.Api; namespace MiniExcelLib.Benchmarks.BenchmarkSections; diff --git a/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/XlsxAsyncBenchmark.cs b/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/XlsxAsyncBenchmark.cs index 0d65f969..88f8b767 100644 --- a/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/XlsxAsyncBenchmark.cs +++ b/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/XlsxAsyncBenchmark.cs @@ -1,5 +1,6 @@ using BenchmarkDotNet.Attributes; using MiniExcelLib.Benchmarks.Utils; +using MiniExcelLib.OpenXml.Api; namespace MiniExcelLib.Benchmarks.BenchmarkSections; diff --git a/src/Directory.Build.props b/src/Directory.Build.props index 2b3251d9..8557ffdc 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -2,7 +2,7 @@ netstandard2.0;net8.0;net10.0 - 2.0.0-beta.1 + 2.0.0-preview.1 enable enable 13 diff --git a/src/MiniExcel.Csv/CsvExporter.cs b/src/MiniExcel.Csv/Api/CsvExporter.cs similarity index 97% rename from src/MiniExcel.Csv/CsvExporter.cs rename to src/MiniExcel.Csv/Api/CsvExporter.cs index e8219545..a255e646 100644 --- a/src/MiniExcel.Csv/CsvExporter.cs +++ b/src/MiniExcel.Csv/Api/CsvExporter.cs @@ -1,4 +1,4 @@ -namespace MiniExcelLib.Csv; +namespace MiniExcelLib.Csv.Api; public partial class CsvExporter { diff --git a/src/MiniExcel.Csv/CsvImporter.cs b/src/MiniExcel.Csv/Api/CsvImporter.cs similarity index 94% rename from src/MiniExcel.Csv/CsvImporter.cs rename to src/MiniExcel.Csv/Api/CsvImporter.cs index 092f0ac3..aa66f2a4 100644 --- a/src/MiniExcel.Csv/CsvImporter.cs +++ b/src/MiniExcel.Csv/Api/CsvImporter.cs @@ -1,6 +1,6 @@ using MiniExcelLib.DataReader; -namespace MiniExcelLib.Csv; +namespace MiniExcelLib.Csv.Api; public partial class CsvImporter { @@ -157,14 +157,14 @@ public async Task> GetCsvColumnsAsync(Stream stream, bool us public MiniExcelDataReader GetCsvDataReader(string path, bool useHeaderRow = false, CsvConfiguration? configuration = null) { var stream = FileHelper.OpenSharedRead(path); - var values = QueryCsv(stream, useHeaderRow, configuration).Cast>(); + var values = Enumerable.Cast>(QueryCsv(stream, useHeaderRow, configuration)); return MiniExcelDataReader.Create(stream, values); } public MiniExcelDataReader GetCsvDataReader(Stream stream, bool useHeaderRow = false, CsvConfiguration? configuration = null) { - var values = QueryCsv(stream, useHeaderRow, configuration).Cast>(); + var values = Enumerable.Cast>(QueryCsv(stream, useHeaderRow, configuration)); return MiniExcelDataReader.Create(stream, values); } diff --git a/src/MiniExcel.Csv/ProviderExtensions.cs b/src/MiniExcel.Csv/ProviderExtensions.cs index 7f6491e3..63f38611 100644 --- a/src/MiniExcel.Csv/ProviderExtensions.cs +++ b/src/MiniExcel.Csv/ProviderExtensions.cs @@ -2,6 +2,6 @@ namespace MiniExcelLib.Csv; public static class ProviderExtensions { - public static CsvExporter GetCsvExporter(this MiniExcelExporterProvider exporterProvider) => new(); - public static CsvImporter GetCsvImporter(this MiniExcelImporterProvider importerProvider) => new(); + public static Api.CsvExporter GetCsvExporter(this MiniExcelExporterProvider exporterProvider) => new(); + public static Api.CsvImporter GetCsvImporter(this MiniExcelImporterProvider importerProvider) => new(); } \ No newline at end of file diff --git a/src/MiniExcel.Legacy/MiniExcel.cs b/src/MiniExcel.Legacy/MiniExcel.cs index bc6ab871..00c3bd6f 100644 --- a/src/MiniExcel.Legacy/MiniExcel.cs +++ b/src/MiniExcel.Legacy/MiniExcel.cs @@ -5,7 +5,12 @@ using MiniExcelLib.OpenXml.Models; using MiniExcelLib.OpenXml.Picture; using Zomp.SyncMethodGenerator; +using CsvExporter = MiniExcelLib.Csv.Api.CsvExporter; +using CsvImporter = MiniExcelLib.Csv.Api.CsvImporter; using MiniExcelNew = MiniExcelLib.MiniExcel; +using OpenXmlExporter = MiniExcelLib.OpenXml.Api.OpenXmlExporter; +using OpenXmlImporter = MiniExcelLib.OpenXml.Api.OpenXmlImporter; +using OpenXmlTemplater = MiniExcelLib.OpenXml.Api.OpenXmlTemplater; namespace MiniExcelLibs; diff --git a/src/MiniExcel/MiniExcelProviders.cs b/src/MiniExcel/MiniExcelProviders.cs index 06d8f415..8cab7464 100644 --- a/src/MiniExcel/MiniExcelProviders.cs +++ b/src/MiniExcel/MiniExcelProviders.cs @@ -4,19 +4,19 @@ public sealed class MiniExcelImporterProvider { internal MiniExcelImporterProvider() { } - public OpenXmlImporter GetExcelImporter() => new(); + public OpenXml.Api.OpenXmlImporter GetExcelImporter() => new(); } public sealed class MiniExcelExporterProvider { internal MiniExcelExporterProvider() { } - public OpenXmlExporter GetExcelExporter() => new(); + public OpenXml.Api.OpenXmlExporter GetExcelExporter() => new(); } public sealed class MiniExcelTemplaterProvider { internal MiniExcelTemplaterProvider() { } - public OpenXmlTemplater GetExcelTemplater() => new(); + public OpenXml.Api.OpenXmlTemplater GetExcelTemplater() => new(); } diff --git a/src/MiniExcel/OpenXmlExporter.cs b/src/MiniExcel/OpenXml/Api/OpenXmlExporter.cs similarity index 97% rename from src/MiniExcel/OpenXmlExporter.cs rename to src/MiniExcel/OpenXml/Api/OpenXmlExporter.cs index 49063cf4..b5c6243e 100644 --- a/src/MiniExcel/OpenXmlExporter.cs +++ b/src/MiniExcel/OpenXml/Api/OpenXmlExporter.cs @@ -1,6 +1,6 @@ using MiniExcelLib.OpenXml.Picture; -namespace MiniExcelLib; +namespace MiniExcelLib.OpenXml.Api; public sealed partial class OpenXmlExporter { diff --git a/src/MiniExcel/OpenXmlImporter.cs b/src/MiniExcel/OpenXml/Api/OpenXmlImporter.cs similarity index 96% rename from src/MiniExcel/OpenXmlImporter.cs rename to src/MiniExcel/OpenXml/Api/OpenXmlImporter.cs index d590893c..1498401d 100644 --- a/src/MiniExcel/OpenXmlImporter.cs +++ b/src/MiniExcel/OpenXml/Api/OpenXmlImporter.cs @@ -4,7 +4,7 @@ using MiniExcelLib.OpenXml.Models; using MiniExcelLib.OpenXml.Zip; -namespace MiniExcelLib; +namespace MiniExcelLib.OpenXml.Api; public sealed partial class OpenXmlImporter { @@ -284,7 +284,7 @@ public MiniExcelDataReader GetExcelDataReader(string path, bool useHeaderRow = f string? sheetName = null, string startCell = "A1", OpenXmlConfiguration? configuration = null) { var stream = FileHelper.OpenSharedRead(path); - var values = QueryExcel(stream, useHeaderRow, sheetName, startCell, configuration).Cast>(); + var values = Enumerable.Cast>(QueryExcel(stream, useHeaderRow, sheetName, startCell, configuration)); return MiniExcelDataReader.Create(stream, values); } @@ -292,7 +292,7 @@ public MiniExcelDataReader GetExcelDataReader(string path, bool useHeaderRow = f public MiniExcelDataReader GetExcelDataReader(Stream stream, bool useHeaderRow = false, string? sheetName = null, string startCell = "A1", OpenXmlConfiguration? configuration = null) { - var values = QueryExcel(stream, useHeaderRow, sheetName, startCell, configuration).Cast>(); + var values = Enumerable.Cast>(QueryExcel(stream, useHeaderRow, sheetName, startCell, configuration)); return MiniExcelDataReader.Create(stream, values); } diff --git a/src/MiniExcel/OpenXmlTemplater.cs b/src/MiniExcel/OpenXml/Api/OpenXmlTemplater.cs similarity index 96% rename from src/MiniExcel/OpenXmlTemplater.cs rename to src/MiniExcel/OpenXml/Api/OpenXmlTemplater.cs index 2a39d0ee..8385910d 100644 --- a/src/MiniExcel/OpenXmlTemplater.cs +++ b/src/MiniExcel/OpenXml/Api/OpenXmlTemplater.cs @@ -1,6 +1,6 @@ using MiniExcelLib.OpenXml.Templates; -namespace MiniExcelLib; +namespace MiniExcelLib.OpenXml.Api; public sealed partial class OpenXmlTemplater { diff --git a/src/MiniExcel/OpenXml/OpenXmlConfiguration.cs b/src/MiniExcel/OpenXml/OpenXmlConfiguration.cs index 09894245..a1a3531b 100644 --- a/src/MiniExcel/OpenXml/OpenXmlConfiguration.cs +++ b/src/MiniExcel/OpenXml/OpenXmlConfiguration.cs @@ -1,4 +1,5 @@ using MiniExcelLib.OpenXml.Attributes; +using MiniExcelLib.OpenXml.Styles; namespace MiniExcelLib.OpenXml; diff --git a/src/MiniExcel/OpenXml/OpenXmlReader.cs b/src/MiniExcel/OpenXml/OpenXmlReader.cs index 2f4742bb..2083eda6 100644 --- a/src/MiniExcel/OpenXml/OpenXmlReader.cs +++ b/src/MiniExcel/OpenXml/OpenXmlReader.cs @@ -1,6 +1,7 @@ using System.Collections.ObjectModel; using MiniExcelLib.OpenXml.Constants; using MiniExcelLib.OpenXml.Models; +using MiniExcelLib.OpenXml.Styles; using MiniExcelLib.OpenXml.Zip; using IMiniExcelReader = MiniExcelLib.Abstractions.IMiniExcelReader; using MiniExcelMapper = MiniExcelLib.Reflection.MiniExcelMapper; diff --git a/src/MiniExcel/OpenXml/OpenXmlWriter.cs b/src/MiniExcel/OpenXml/OpenXmlWriter.cs index a3823171..c013dd80 100644 --- a/src/MiniExcel/OpenXml/OpenXmlWriter.cs +++ b/src/MiniExcel/OpenXml/OpenXmlWriter.cs @@ -2,9 +2,13 @@ using MiniExcelLib.OpenXml.Constants; using MiniExcelLib.OpenXml.Models; using MiniExcelLib.OpenXml.Styles; +using MiniExcelLib.OpenXml.Styles.Builder; using MiniExcelLib.OpenXml.Zip; using MiniExcelLib.WriteAdapters; +using DefaultSheetStyleBuilder = MiniExcelLib.OpenXml.Styles.Builder.DefaultSheetStyleBuilder; using IMiniExcelWriter = MiniExcelLib.Abstractions.IMiniExcelWriter; +using ISheetStyleBuilder = MiniExcelLib.OpenXml.Styles.Builder.ISheetStyleBuilder; +using MinimalSheetStyleBuilder = MiniExcelLib.OpenXml.Styles.Builder.MinimalSheetStyleBuilder; using SafeStreamWriter = MiniExcelLib.Helpers.SafeStreamWriter; namespace MiniExcelLib.OpenXml; diff --git a/src/MiniExcel/OpenXml/Styles/DefaultSheetStyleBuilder.cs b/src/MiniExcel/OpenXml/Styles/Builder/DefaultSheetStyleBuilder.cs similarity index 97% rename from src/MiniExcel/OpenXml/Styles/DefaultSheetStyleBuilder.cs rename to src/MiniExcel/OpenXml/Styles/Builder/DefaultSheetStyleBuilder.cs index 95d9919d..6988519f 100644 --- a/src/MiniExcel/OpenXml/Styles/DefaultSheetStyleBuilder.cs +++ b/src/MiniExcel/OpenXml/Styles/Builder/DefaultSheetStyleBuilder.cs @@ -1,8 +1,9 @@ -namespace MiniExcelLib.OpenXml.Styles; +namespace MiniExcelLib.OpenXml.Styles.Builder; -internal partial class DefaultSheetStyleBuilder : SheetStyleBuilderBase +internal partial class DefaultSheetStyleBuilder(SheetStyleBuildContext context, OpenXmlStyleOptions styleOptions) + : SheetStyleBuilderBase(context) { - private static readonly SheetStyleElementInfos GenerateElementInfos = new SheetStyleElementInfos + private static readonly SheetStyleElementInfos GenerateElementInfos = new() { NumFmtCount = 0,//The default NumFmt number is 0, but there will be NumFmt dynamically generated based on ColumnsToApply FontCount = 2, @@ -12,21 +13,15 @@ internal partial class DefaultSheetStyleBuilder : SheetStyleBuilderBase CellXfCount = 5 }; - private readonly SheetStyleBuildContext _context; - private OpenXmlStyleOptions _styleOptions; - - public DefaultSheetStyleBuilder(SheetStyleBuildContext context, OpenXmlStyleOptions styleOptions) : base(context) - { - _context = context; - _styleOptions = styleOptions; - } + private readonly SheetStyleBuildContext _context = context; + private readonly OpenXmlStyleOptions _styleOptions = styleOptions; protected override SheetStyleElementInfos GetGenerateElementInfos() { return GenerateElementInfos; } - [Zomp.SyncMethodGenerator.CreateSyncVersion] + [CreateSyncVersion] protected override async Task GenerateNumFmtAsync() { const int numFmtIndex = 166; @@ -45,7 +40,7 @@ protected override async Task GenerateNumFmtAsync() } } - [Zomp.SyncMethodGenerator.CreateSyncVersion] + [CreateSyncVersion] protected override async Task GenerateFontAsync() { /* @@ -103,7 +98,7 @@ protected override async Task GenerateFontAsync() await _context.NewXmlWriter.WriteEndElementAsync().ConfigureAwait(false); } - [Zomp.SyncMethodGenerator.CreateSyncVersion] + [CreateSyncVersion] protected override async Task GenerateFillAsync() { /* @@ -145,7 +140,7 @@ protected override async Task GenerateFillAsync() await _context.NewXmlWriter.WriteEndElementAsync().ConfigureAwait(false); } - [Zomp.SyncMethodGenerator.CreateSyncVersion] + [CreateSyncVersion] protected override async Task GenerateBorderAsync() { /* @@ -257,7 +252,7 @@ protected override async Task GenerateBorderAsync() await _context.NewXmlWriter.WriteEndElementAsync().ConfigureAwait(false); } - [Zomp.SyncMethodGenerator.CreateSyncVersion] + [CreateSyncVersion] protected override async Task GenerateCellStyleXfAsync() { /* @@ -324,7 +319,7 @@ protected override async Task GenerateCellStyleXfAsync() await _context.NewXmlWriter.WriteEndElementAsync().ConfigureAwait(false); } - [Zomp.SyncMethodGenerator.CreateSyncVersion] + [CreateSyncVersion] protected override async Task GenerateCellXfAsync() { /* diff --git a/src/MiniExcel/OpenXml/Styles/ISheetStyleBuilder.cs b/src/MiniExcel/OpenXml/Styles/Builder/ISheetStyleBuilder.cs similarity index 59% rename from src/MiniExcel/OpenXml/Styles/ISheetStyleBuilder.cs rename to src/MiniExcel/OpenXml/Styles/Builder/ISheetStyleBuilder.cs index 95668293..b7423b25 100644 --- a/src/MiniExcel/OpenXml/Styles/ISheetStyleBuilder.cs +++ b/src/MiniExcel/OpenXml/Styles/Builder/ISheetStyleBuilder.cs @@ -1,7 +1,7 @@ -namespace MiniExcelLib.OpenXml.Styles; +namespace MiniExcelLib.OpenXml.Styles.Builder; internal partial interface ISheetStyleBuilder { - [Zomp.SyncMethodGenerator.CreateSyncVersion] + [CreateSyncVersion] Task BuildAsync(CancellationToken cancellationToken = default); } \ No newline at end of file diff --git a/src/MiniExcel/OpenXml/Styles/MinimalSheetStyleBuilder.cs b/src/MiniExcel/OpenXml/Styles/Builder/MinimalSheetStyleBuilder.cs similarity index 87% rename from src/MiniExcel/OpenXml/Styles/MinimalSheetStyleBuilder.cs rename to src/MiniExcel/OpenXml/Styles/Builder/MinimalSheetStyleBuilder.cs index 80b6f9e9..d851f239 100644 --- a/src/MiniExcel/OpenXml/Styles/MinimalSheetStyleBuilder.cs +++ b/src/MiniExcel/OpenXml/Styles/Builder/MinimalSheetStyleBuilder.cs @@ -1,8 +1,8 @@ -namespace MiniExcelLib.OpenXml.Styles; +namespace MiniExcelLib.OpenXml.Styles.Builder; -internal partial class MinimalSheetStyleBuilder : SheetStyleBuilderBase +internal partial class MinimalSheetStyleBuilder(SheetStyleBuildContext context) : SheetStyleBuilderBase(context) { - internal static SheetStyleElementInfos GenerateElementInfos = new SheetStyleElementInfos + internal static SheetStyleElementInfos GenerateElementInfos = new() { NumFmtCount = 0,//默认的NumFmt数量是0,但是会有根据ColumnsToApply动态生成的NumFmt FontCount = 1, @@ -12,19 +12,14 @@ internal partial class MinimalSheetStyleBuilder : SheetStyleBuilderBase CellXfCount = 5 }; - private readonly SheetStyleBuildContext _context; - - public MinimalSheetStyleBuilder(SheetStyleBuildContext context) : base(context) - { - _context = context; - } + private readonly SheetStyleBuildContext _context = context; protected override SheetStyleElementInfos GetGenerateElementInfos() { return GenerateElementInfos; } - [Zomp.SyncMethodGenerator.CreateSyncVersion] + [CreateSyncVersion] protected override async Task GenerateNumFmtAsync() { const int numFmtIndex = 166; @@ -43,7 +38,7 @@ protected override async Task GenerateNumFmtAsync() } } - [Zomp.SyncMethodGenerator.CreateSyncVersion] + [CreateSyncVersion] protected override async Task GenerateFontAsync() { /* @@ -53,7 +48,7 @@ protected override async Task GenerateFontAsync() await _context.NewXmlWriter.WriteFullEndElementAsync().ConfigureAwait(false); } - [Zomp.SyncMethodGenerator.CreateSyncVersion] + [CreateSyncVersion] protected override async Task GenerateFillAsync() { /* @@ -63,7 +58,7 @@ protected override async Task GenerateFillAsync() await _context.NewXmlWriter.WriteFullEndElementAsync().ConfigureAwait(false); } - [Zomp.SyncMethodGenerator.CreateSyncVersion] + [CreateSyncVersion] protected override async Task GenerateBorderAsync() { /* @@ -73,7 +68,7 @@ protected override async Task GenerateBorderAsync() await _context.NewXmlWriter.WriteFullEndElementAsync().ConfigureAwait(false); } - [Zomp.SyncMethodGenerator.CreateSyncVersion] + [CreateSyncVersion] protected override async Task GenerateCellStyleXfAsync() { /* @@ -83,7 +78,7 @@ protected override async Task GenerateCellStyleXfAsync() await _context.NewXmlWriter.WriteFullEndElementAsync().ConfigureAwait(false); } - [Zomp.SyncMethodGenerator.CreateSyncVersion] + [CreateSyncVersion] protected override async Task GenerateCellXfAsync() { /* diff --git a/src/MiniExcel/OpenXml/Styles/SheetStyleBuildContext.cs b/src/MiniExcel/OpenXml/Styles/Builder/SheetStyleBuildContext.cs similarity index 92% rename from src/MiniExcel/OpenXml/Styles/SheetStyleBuildContext.cs rename to src/MiniExcel/OpenXml/Styles/Builder/SheetStyleBuildContext.cs index 5dae01e6..8dac140c 100644 --- a/src/MiniExcel/OpenXml/Styles/SheetStyleBuildContext.cs +++ b/src/MiniExcel/OpenXml/Styles/Builder/SheetStyleBuildContext.cs @@ -1,7 +1,7 @@ using MiniExcelLib.OpenXml.Constants; using MiniExcelLib.OpenXml.Zip; -namespace MiniExcelLib.OpenXml.Styles; +namespace MiniExcelLib.OpenXml.Styles.Builder; internal class SheetStyleBuildContext : IDisposable { @@ -17,11 +17,11 @@ internal class SheetStyleBuildContext : IDisposable private readonly Encoding _encoding; private readonly ICollection _columns; - private StringReader _emptyStylesXmlStringReader; + private StringReader? _emptyStylesXmlStringReader; private ZipArchiveEntry? _oldStyleXmlZipEntry; private ZipArchiveEntry? _newStyleXmlZipEntry; - private Stream _oldXmlReaderStream; - private Stream _newXmlWriterStream; + private Stream? _oldXmlReaderStream; + private Stream? _newXmlWriterStream; private bool _initialized; private bool _finalized; @@ -35,8 +35,8 @@ public SheetStyleBuildContext(Dictionary zipDictionary, _columns = columns; } - public XmlReader OldXmlReader { get; private set; } - public XmlWriter NewXmlWriter { get; private set; } + public XmlReader? OldXmlReader { get; private set; } + public XmlWriter? NewXmlWriter { get; private set; } public SheetStyleElementInfos OldElementInfos { get; private set; } public SheetStyleElementInfos GenerateElementInfos { get; private set; } public IEnumerable ColumnsToApply { get; private set; } @@ -52,7 +52,7 @@ public void Initialize(SheetStyleElementInfos generateElementInfos) { using (var oldStyleXmlStream = _oldStyleXmlZipEntry.Open()) { - using XmlReader reader = XmlReader.Create(oldStyleXmlStream, new XmlReaderSettings { IgnoreWhitespace = true }); + using var reader = XmlReader.Create(oldStyleXmlStream, new XmlReaderSettings { IgnoreWhitespace = true }); OldElementInfos = ReadSheetStyleElementInfos(reader); } @@ -143,7 +143,7 @@ public void FinalizeAndUpdateZipDictionary() try { - OldXmlReader.Dispose(); + OldXmlReader?.Dispose(); OldXmlReader = null; _oldXmlReaderStream?.Dispose(); _oldXmlReaderStream = null; @@ -151,12 +151,12 @@ public void FinalizeAndUpdateZipDictionary() _emptyStylesXmlStringReader?.Dispose(); _emptyStylesXmlStringReader = null; - NewXmlWriter.Flush(); - NewXmlWriter.Close(); - NewXmlWriter.Dispose(); + NewXmlWriter?.Flush(); + NewXmlWriter?.Close(); + NewXmlWriter?.Dispose(); NewXmlWriter = null; - _newXmlWriterStream.Dispose(); + _newXmlWriterStream?.Dispose(); _newXmlWriterStream = null; if (_oldStyleXmlZipEntry is null) @@ -201,7 +201,7 @@ public async Task FinalizeAndUpdateZipDictionaryAsync(CancellationToken cancella { cancellationToken.ThrowIfCancellationRequested(); - OldXmlReader.Dispose(); + OldXmlReader?.Dispose(); OldXmlReader = null; #if NET5_0_OR_GREATER if (_oldXmlReaderStream is not null) @@ -209,7 +209,7 @@ public async Task FinalizeAndUpdateZipDictionaryAsync(CancellationToken cancella await _oldXmlReaderStream.DisposeAsync().ConfigureAwait(false); } #else - _oldXmlReaderStream?.Dispose(); + _oldXmlReaderStream?.Dispose(); #endif _oldXmlReaderStream = null; @@ -223,7 +223,7 @@ public async Task FinalizeAndUpdateZipDictionaryAsync(CancellationToken cancella #if NET5_0_OR_GREATER await NewXmlWriter.DisposeAsync().ConfigureAwait(false); #else - NewXmlWriter.Dispose(); + NewXmlWriter.Dispose(); #endif NewXmlWriter = null; @@ -231,7 +231,7 @@ public async Task FinalizeAndUpdateZipDictionaryAsync(CancellationToken cancella #if NET5_0_OR_GREATER await _newXmlWriterStream.DisposeAsync().ConfigureAwait(false); #else - _newXmlWriterStream.Dispose(); + _newXmlWriterStream?.Dispose(); #endif _newXmlWriterStream = null; diff --git a/src/MiniExcel/OpenXml/Styles/Builder/SheetStyleBuildResult.cs b/src/MiniExcel/OpenXml/Styles/Builder/SheetStyleBuildResult.cs new file mode 100644 index 00000000..53a504d4 --- /dev/null +++ b/src/MiniExcel/OpenXml/Styles/Builder/SheetStyleBuildResult.cs @@ -0,0 +1,6 @@ +namespace MiniExcelLib.OpenXml.Styles.Builder; + +internal class SheetStyleBuildResult(Dictionary cellXfIdMap) +{ + public Dictionary CellXfIdMap { get; set; } = cellXfIdMap; +} \ No newline at end of file diff --git a/src/MiniExcel/OpenXml/Styles/SheetStyleBuilderBase.cs b/src/MiniExcel/OpenXml/Styles/Builder/SheetStyleBuilderBase.cs similarity index 87% rename from src/MiniExcel/OpenXml/Styles/SheetStyleBuilderBase.cs rename to src/MiniExcel/OpenXml/Styles/Builder/SheetStyleBuilderBase.cs index a21d4902..f0f8c9e9 100644 --- a/src/MiniExcel/OpenXml/Styles/SheetStyleBuilderBase.cs +++ b/src/MiniExcel/OpenXml/Styles/Builder/SheetStyleBuilderBase.cs @@ -1,8 +1,10 @@ -namespace MiniExcelLib.OpenXml.Styles; +namespace MiniExcelLib.OpenXml.Styles.Builder; -internal abstract partial class SheetStyleBuilderBase : ISheetStyleBuilder +internal abstract partial class SheetStyleBuilderBase(SheetStyleBuildContext context) : ISheetStyleBuilder { - internal static readonly Dictionary _allElements = new Dictionary + private readonly SheetStyleBuildContext _context = context; + + internal static readonly Dictionary AllElements = new() { ["numFmts"] = 0, ["fonts"] = 1, @@ -16,15 +18,9 @@ internal abstract partial class SheetStyleBuilderBase : ISheetStyleBuilder ["extLst"] = 9 }; - private readonly SheetStyleBuildContext _context; - - public SheetStyleBuilderBase(SheetStyleBuildContext context) - { - _context = context; - } // Todo: add CancellationToken to all methods called inside of BuildAsync - [Zomp.SyncMethodGenerator.CreateSyncVersion] + [CreateSyncVersion] public virtual async Task BuildAsync(CancellationToken cancellationToken = default) { await _context.InitializeAsync(GetGenerateElementInfos(), cancellationToken).ConfigureAwait(false); @@ -82,7 +78,7 @@ public virtual async Task BuildAsync(CancellationToken ca protected abstract SheetStyleElementInfos GetGenerateElementInfos(); - [Zomp.SyncMethodGenerator.CreateSyncVersion] + [CreateSyncVersion] protected virtual async Task WriteAttributesAsync(string element, CancellationToken cancellationToken = default) { if (_context.OldXmlReader.NodeType is XmlNodeType.Element || _context.OldXmlReader.NodeType is XmlNodeType.XmlDeclaration) @@ -145,49 +141,49 @@ protected virtual async Task WriteAttributesAsync(string element, CancellationTo } } - [Zomp.SyncMethodGenerator.CreateSyncVersion] + [CreateSyncVersion] protected virtual async Task GenerateElementBeforStartElementAsync() { - if (!_allElements.TryGetValue(_context.OldXmlReader.LocalName, out var elementIndex)) + if (!AllElements.TryGetValue(_context.OldXmlReader.LocalName, out var elementIndex)) { return; } - if (!_context.OldElementInfos.ExistsNumFmts && !_context.GenerateElementInfos.ExistsNumFmts && _allElements["numFmts"] < elementIndex) + if (!_context.OldElementInfos.ExistsNumFmts && !_context.GenerateElementInfos.ExistsNumFmts && AllElements["numFmts"] < elementIndex) { await GenerateNumFmtsAsync().ConfigureAwait(false); _context.GenerateElementInfos.ExistsNumFmts = true; } - else if (!_context.OldElementInfos.ExistsFonts && !_context.GenerateElementInfos.ExistsFonts && _allElements["fonts"] < elementIndex) + else if (!_context.OldElementInfos.ExistsFonts && !_context.GenerateElementInfos.ExistsFonts && AllElements["fonts"] < elementIndex) { await GenerateFontsAsync().ConfigureAwait(false); _context.GenerateElementInfos.ExistsFonts = true; } - else if (!_context.OldElementInfos.ExistsFills && !_context.GenerateElementInfos.ExistsFills && _allElements["fills"] < elementIndex) + else if (!_context.OldElementInfos.ExistsFills && !_context.GenerateElementInfos.ExistsFills && AllElements["fills"] < elementIndex) { await GenerateFillsAsync().ConfigureAwait(false); _context.GenerateElementInfos.ExistsFills = true; } - else if (!_context.OldElementInfos.ExistsBorders && !_context.GenerateElementInfos.ExistsBorders && _allElements["borders"] < elementIndex) + else if (!_context.OldElementInfos.ExistsBorders && !_context.GenerateElementInfos.ExistsBorders && AllElements["borders"] < elementIndex) { await GenerateBordersAsync().ConfigureAwait(false); _context.GenerateElementInfos.ExistsBorders = true; } - else if (!_context.OldElementInfos.ExistsCellStyleXfs && !_context.GenerateElementInfos.ExistsCellStyleXfs && _allElements["cellStyleXfs"] < elementIndex) + else if (!_context.OldElementInfos.ExistsCellStyleXfs && !_context.GenerateElementInfos.ExistsCellStyleXfs && AllElements["cellStyleXfs"] < elementIndex) { await GenerateCellStyleXfsAsync().ConfigureAwait(false); _context.GenerateElementInfos.ExistsCellStyleXfs = true; } - else if (!_context.OldElementInfos.ExistsCellXfs && !_context.GenerateElementInfos.ExistsCellXfs && _allElements["cellXfs"] < elementIndex) + else if (!_context.OldElementInfos.ExistsCellXfs && !_context.GenerateElementInfos.ExistsCellXfs && AllElements["cellXfs"] < elementIndex) { await GenerateCellXfsAsync().ConfigureAwait(false); _context.GenerateElementInfos.ExistsCellXfs = true; } } - [Zomp.SyncMethodGenerator.CreateSyncVersion] + [CreateSyncVersion] protected virtual async Task GenerateElementBeforEndElementAsync() { - switch (_context.OldXmlReader.LocalName) + switch (_context.OldXmlReader?.LocalName) { case "styleSheet" when !_context.OldElementInfos.ExistsNumFmts && !_context.GenerateElementInfos.ExistsNumFmts: await GenerateNumFmtsAsync().ConfigureAwait(false); @@ -213,7 +209,7 @@ protected virtual async Task GenerateElementBeforEndElementAsync() } } - [Zomp.SyncMethodGenerator.CreateSyncVersion] + [CreateSyncVersion] protected virtual async Task GenerateNumFmtsAsync() { await _context.NewXmlWriter.WriteStartElementAsync(_context.OldXmlReader.Prefix, "numFmts", _context.OldXmlReader.NamespaceURI).ConfigureAwait(false); @@ -227,10 +223,10 @@ protected virtual async Task GenerateNumFmtsAsync() } } - [Zomp.SyncMethodGenerator.CreateSyncVersion] + [CreateSyncVersion] protected abstract Task GenerateNumFmtAsync(); - [Zomp.SyncMethodGenerator.CreateSyncVersion] + [CreateSyncVersion] protected virtual async Task GenerateFontsAsync() { await _context.NewXmlWriter.WriteStartElementAsync(_context.OldXmlReader.Prefix, "fonts", _context.OldXmlReader.NamespaceURI).ConfigureAwait(false); @@ -244,10 +240,10 @@ protected virtual async Task GenerateFontsAsync() } } - [Zomp.SyncMethodGenerator.CreateSyncVersion] + [CreateSyncVersion] protected abstract Task GenerateFontAsync(); - [Zomp.SyncMethodGenerator.CreateSyncVersion] + [CreateSyncVersion] protected virtual async Task GenerateFillsAsync() { await _context.NewXmlWriter.WriteStartElementAsync(_context.OldXmlReader.Prefix, "fills", _context.OldXmlReader.NamespaceURI).ConfigureAwait(false); @@ -261,10 +257,10 @@ protected virtual async Task GenerateFillsAsync() } } - [Zomp.SyncMethodGenerator.CreateSyncVersion] + [CreateSyncVersion] protected abstract Task GenerateFillAsync(); - [Zomp.SyncMethodGenerator.CreateSyncVersion] + [CreateSyncVersion] protected virtual async Task GenerateBordersAsync() { await _context.NewXmlWriter.WriteStartElementAsync(_context.OldXmlReader.Prefix, "borders", _context.OldXmlReader.NamespaceURI).ConfigureAwait(false); @@ -278,10 +274,10 @@ protected virtual async Task GenerateBordersAsync() } } - [Zomp.SyncMethodGenerator.CreateSyncVersion] + [CreateSyncVersion] protected abstract Task GenerateBorderAsync(); - [Zomp.SyncMethodGenerator.CreateSyncVersion] + [CreateSyncVersion] protected virtual async Task GenerateCellStyleXfsAsync() { await _context.NewXmlWriter.WriteStartElementAsync(_context.OldXmlReader.Prefix, "cellStyleXfs", _context.OldXmlReader.NamespaceURI).ConfigureAwait(false); @@ -295,10 +291,10 @@ protected virtual async Task GenerateCellStyleXfsAsync() } } - [Zomp.SyncMethodGenerator.CreateSyncVersion] + [CreateSyncVersion] protected abstract Task GenerateCellStyleXfAsync(); - [Zomp.SyncMethodGenerator.CreateSyncVersion] + [CreateSyncVersion] protected virtual async Task GenerateCellXfsAsync() { await _context.NewXmlWriter.WriteStartElementAsync(_context.OldXmlReader.Prefix, "cellXfs", _context.OldXmlReader.NamespaceURI).ConfigureAwait(false); @@ -307,7 +303,7 @@ protected virtual async Task GenerateCellXfsAsync() await _context.NewXmlWriter.WriteFullEndElementAsync().ConfigureAwait(false); } - [Zomp.SyncMethodGenerator.CreateSyncVersion] + [CreateSyncVersion] protected abstract Task GenerateCellXfAsync(); private Dictionary GetCellXfIdMap() diff --git a/src/MiniExcel/OpenXml/Styles/SheetStyleBuilderHelper.cs b/src/MiniExcel/OpenXml/Styles/Builder/SheetStyleBuilderHelper.cs similarity index 82% rename from src/MiniExcel/OpenXml/Styles/SheetStyleBuilderHelper.cs rename to src/MiniExcel/OpenXml/Styles/Builder/SheetStyleBuilderHelper.cs index 7b8e9d7a..d024a79d 100644 --- a/src/MiniExcel/OpenXml/Styles/SheetStyleBuilderHelper.cs +++ b/src/MiniExcel/OpenXml/Styles/Builder/SheetStyleBuilderHelper.cs @@ -1,4 +1,4 @@ -namespace MiniExcelLib.OpenXml.Styles; +namespace MiniExcelLib.OpenXml.Styles.Builder; public static class SheetStyleBuilderHelper { @@ -14,8 +14,10 @@ public static IEnumerable GenerateStyleIds(int startUp foreach (var g in cols) { - foreach ( var col in g ) + foreach (var col in g) + { col.FormatId = startUpCellXfs + index; + } yield return g.First(); index++; diff --git a/src/MiniExcel/OpenXml/OpenXmlStyleOptions.cs b/src/MiniExcel/OpenXml/Styles/OpenXmlStyleOptions.cs similarity index 65% rename from src/MiniExcel/OpenXml/OpenXmlStyleOptions.cs rename to src/MiniExcel/OpenXml/Styles/OpenXmlStyleOptions.cs index 67c6bb76..bbde1f8d 100644 --- a/src/MiniExcel/OpenXml/OpenXmlStyleOptions.cs +++ b/src/MiniExcel/OpenXml/Styles/OpenXmlStyleOptions.cs @@ -1,4 +1,4 @@ -namespace MiniExcelLib.OpenXml; +namespace MiniExcelLib.OpenXml.Styles; public class OpenXmlStyleOptions { diff --git a/src/MiniExcel/OpenXml/OpenXmlStyles.cs b/src/MiniExcel/OpenXml/Styles/OpenXmlStyles.cs similarity index 97% rename from src/MiniExcel/OpenXml/OpenXmlStyles.cs rename to src/MiniExcel/OpenXml/Styles/OpenXmlStyles.cs index 29b21960..2a6897da 100644 --- a/src/MiniExcel/OpenXml/OpenXmlStyles.cs +++ b/src/MiniExcel/OpenXml/Styles/OpenXmlStyles.cs @@ -1,7 +1,7 @@ using MiniExcelLib.OpenXml.Constants; using MiniExcelLib.OpenXml.Zip; -namespace MiniExcelLib.OpenXml; +namespace MiniExcelLib.OpenXml.Styles; internal class OpenXmlStyles { diff --git a/src/MiniExcel/OpenXml/Styles/SheetStyleBuildResult.cs b/src/MiniExcel/OpenXml/Styles/SheetStyleBuildResult.cs deleted file mode 100644 index 93f83131..00000000 --- a/src/MiniExcel/OpenXml/Styles/SheetStyleBuildResult.cs +++ /dev/null @@ -1,11 +0,0 @@ -namespace MiniExcelLib.OpenXml.Styles; - -internal class SheetStyleBuildResult -{ - public SheetStyleBuildResult(Dictionary cellXfIdMap) - { - CellXfIdMap = cellXfIdMap; - } - - public Dictionary CellXfIdMap { get; set; } -} \ No newline at end of file diff --git a/tests/MiniExcel.Csv.Tests/MiniExcel.Csv.Tests.csproj b/tests/MiniExcel.Csv.Tests/MiniExcel.Csv.Tests.csproj index 3c2fb510..b4984567 100644 --- a/tests/MiniExcel.Csv.Tests/MiniExcel.Csv.Tests.csproj +++ b/tests/MiniExcel.Csv.Tests/MiniExcel.Csv.Tests.csproj @@ -35,6 +35,8 @@ + + diff --git a/tests/MiniExcel.Tests/MiniExcel.Tests.csproj b/tests/MiniExcel.Tests/MiniExcel.Tests.csproj index 48e4964b..dcdfd536 100644 --- a/tests/MiniExcel.Tests/MiniExcel.Tests.csproj +++ b/tests/MiniExcel.Tests/MiniExcel.Tests.csproj @@ -44,6 +44,7 @@ + From 1286b126d74c8eb6d1f27b02f6e024a1fc20a8c8 Mon Sep 17 00:00:00 2001 From: Michele Bastione Date: Sat, 19 Jul 2025 22:53:23 +0200 Subject: [PATCH 19/26] Removing warning suppressions and adding a check on seekable stream template for SaveAsByTemplate method --- src/MiniExcel.Csv/Api/CsvImporter.cs | 12 ++++-------- src/MiniExcel/OpenXml/Api/OpenXmlImporter.cs | 15 ++++----------- .../OpenXml/Templates/OpenXmlTemplate.cs | 3 +++ 3 files changed, 11 insertions(+), 19 deletions(-) diff --git a/src/MiniExcel.Csv/Api/CsvImporter.cs b/src/MiniExcel.Csv/Api/CsvImporter.cs index aa66f2a4..9c9b2d84 100644 --- a/src/MiniExcel.Csv/Api/CsvImporter.cs +++ b/src/MiniExcel.Csv/Api/CsvImporter.cs @@ -46,11 +46,9 @@ public async IAsyncEnumerable QueryCsvAsync(string path, bool useHeader public async IAsyncEnumerable QueryCsvAsync(Stream stream, bool useHeaderRow = false, CsvConfiguration? configuration = null, [EnumeratorCancellation] CancellationToken cancellationToken = default) { -#pragma warning disable CA2007 using var excelReader = new CsvReader(stream, configuration); await foreach (var item in excelReader.QueryAsync(useHeaderRow, null, "A1", cancellationToken).ConfigureAwait(false)) yield return item.Aggregate(seed: GetNewExpandoObject(), func: AddPairToDict); -#pragma warning restore CA2007 } #endregion @@ -81,9 +79,7 @@ public async Task QueryCsvAsDataTableAsync(Stream stream, bool useHea var rows = reader.QueryAsync(false, null, "A1", cancellationToken); var columnDict = new Dictionary(); -#pragma warning disable CA2007 await foreach (var row in rows.ConfigureAwait(false)) -#pragma warning restore CA2007 { if (first) { @@ -137,9 +133,9 @@ public async Task> GetCsvColumnsAsync(string path, bool useH public async Task> GetCsvColumnsAsync(Stream stream, bool useHeaderRow = false, CsvConfiguration? configuration = null, CancellationToken cancellationToken = default) { -#pragma warning disable CA2007 // Consider calling ConfigureAwait on the awaited task +#pragma warning disable CA2007 // We need to assign the AsyncEnumerator before we can call ConfigureAwait on it await using var enumerator = QueryCsvAsync(stream, useHeaderRow, configuration, cancellationToken).GetAsyncEnumerator(cancellationToken); -#pragma warning restore CA2007 // Consider calling ConfigureAwait on the awaited task +#pragma warning restore CA2007 _ = enumerator.ConfigureAwait(false); if (await enumerator.MoveNextAsync().ConfigureAwait(false)) @@ -157,14 +153,14 @@ public async Task> GetCsvColumnsAsync(Stream stream, bool us public MiniExcelDataReader GetCsvDataReader(string path, bool useHeaderRow = false, CsvConfiguration? configuration = null) { var stream = FileHelper.OpenSharedRead(path); - var values = Enumerable.Cast>(QueryCsv(stream, useHeaderRow, configuration)); + var values = QueryCsv(stream, useHeaderRow, configuration).Cast>(); return MiniExcelDataReader.Create(stream, values); } public MiniExcelDataReader GetCsvDataReader(Stream stream, bool useHeaderRow = false, CsvConfiguration? configuration = null) { - var values = Enumerable.Cast>(QueryCsv(stream, useHeaderRow, configuration)); + var values = QueryCsv(stream, useHeaderRow, configuration).Cast>(); return MiniExcelDataReader.Create(stream, values); } diff --git a/src/MiniExcel/OpenXml/Api/OpenXmlImporter.cs b/src/MiniExcel/OpenXml/Api/OpenXmlImporter.cs index 1498401d..25436597 100644 --- a/src/MiniExcel/OpenXml/Api/OpenXmlImporter.cs +++ b/src/MiniExcel/OpenXml/Api/OpenXmlImporter.cs @@ -1,4 +1,3 @@ -using System.Diagnostics.CodeAnalysis; using System.Dynamic; using MiniExcelLib.DataReader; using MiniExcelLib.OpenXml.Models; @@ -27,7 +26,6 @@ public async IAsyncEnumerable QueryExcelAsync(string path, string? sheetNa } [CreateSyncVersion] - [SuppressMessage("Reliability", "CA2007:Do not directly await a Task")] public async IAsyncEnumerable QueryExcelAsync(Stream stream, string? sheetName = null, string startCell = "A1", bool treatHeaderAsData = false, OpenXmlConfiguration? configuration = null, [EnumeratorCancellation] CancellationToken cancellationToken = default) where T : class, new() @@ -48,7 +46,6 @@ public async IAsyncEnumerable QueryExcelAsync(string path, bool useHead } [CreateSyncVersion] - [SuppressMessage("Reliability", "CA2007:Do not directly await a Task")] public async IAsyncEnumerable QueryExcelAsync(Stream stream, bool useHeaderRow = false, string? sheetName = null, string startCell = "A1", OpenXmlConfiguration? configuration = null, [EnumeratorCancellation] CancellationToken cancellationToken = default) @@ -81,7 +78,6 @@ public async IAsyncEnumerable QueryExcelRangeAsync(string path, bool us } [CreateSyncVersion] - [SuppressMessage("Reliability", "CA2007:Do not directly await a Task")] public async IAsyncEnumerable QueryExcelRangeAsync(Stream stream, bool useHeaderRow = false, string? sheetName = null, string startCell = "A1", string endCell = "", OpenXmlConfiguration? configuration = null, [EnumeratorCancellation] CancellationToken cancellationToken = default) @@ -103,7 +99,6 @@ public async IAsyncEnumerable QueryExcelRangeAsync(string path, bool us } [CreateSyncVersion] - [SuppressMessage("Reliability", "CA2007:Do not directly await a Task")] public async IAsyncEnumerable QueryExcelRangeAsync(Stream stream, bool useHeaderRow = false, string? sheetName = null, int startRowIndex = 1, int startColumnIndex = 1, int? endRowIndex = null, int? endColumnIndex = null, OpenXmlConfiguration? configuration = null, @@ -147,9 +142,7 @@ public async Task QueryExcelAsDataTableAsync(Stream stream, bool useH var rows = reader.QueryAsync(false, sheetName, startCell, cancellationToken); var columnDict = new Dictionary(); -#pragma warning disable CA2007 await foreach (var row in rows.ConfigureAwait(false)) -#pragma warning restore CA2007 { if (first) { @@ -263,9 +256,9 @@ public async Task> GetExcelColumnsAsync(Stream stream, bool string? sheetName = null, string startCell = "A1", OpenXmlConfiguration? configuration = null, CancellationToken cancellationToken = default) { -#pragma warning disable CA2007 // Consider calling ConfigureAwait on the awaited task +#pragma warning disable CA2007 // We need to assign the AsyncEnumerator before we can call ConfigureAwait on it await using var enumerator = QueryExcelAsync(stream, useHeaderRow, sheetName, startCell, configuration, cancellationToken).GetAsyncEnumerator(cancellationToken); -#pragma warning restore CA2007 // Consider calling ConfigureAwait on the awaited task +#pragma warning restore CA2007 _ = enumerator.ConfigureAwait(false); if (await enumerator.MoveNextAsync().ConfigureAwait(false)) @@ -284,7 +277,7 @@ public MiniExcelDataReader GetExcelDataReader(string path, bool useHeaderRow = f string? sheetName = null, string startCell = "A1", OpenXmlConfiguration? configuration = null) { var stream = FileHelper.OpenSharedRead(path); - var values = Enumerable.Cast>(QueryExcel(stream, useHeaderRow, sheetName, startCell, configuration)); + var values = QueryExcel(stream, useHeaderRow, sheetName, startCell, configuration).Cast>(); return MiniExcelDataReader.Create(stream, values); } @@ -292,7 +285,7 @@ public MiniExcelDataReader GetExcelDataReader(string path, bool useHeaderRow = f public MiniExcelDataReader GetExcelDataReader(Stream stream, bool useHeaderRow = false, string? sheetName = null, string startCell = "A1", OpenXmlConfiguration? configuration = null) { - var values = Enumerable.Cast>(QueryExcel(stream, useHeaderRow, sheetName, startCell, configuration)); + var values = QueryExcel(stream, useHeaderRow, sheetName, startCell, configuration).Cast>(); return MiniExcelDataReader.Create(stream, values); } diff --git a/src/MiniExcel/OpenXml/Templates/OpenXmlTemplate.cs b/src/MiniExcel/OpenXml/Templates/OpenXmlTemplate.cs index edc8573d..92ca55ab 100644 --- a/src/MiniExcel/OpenXml/Templates/OpenXmlTemplate.cs +++ b/src/MiniExcel/OpenXml/Templates/OpenXmlTemplate.cs @@ -49,6 +49,9 @@ public async Task SaveAsByTemplateAsync(byte[] templateBytes, object value, Canc [CreateSyncVersion] public async Task SaveAsByTemplateAsync(Stream templateStream, object value, CancellationToken cancellationToken = default) { + if(!templateStream.CanSeek) + throw new ArgumentException("The template stream must be seekable"); + templateStream.Seek(0, SeekOrigin.Begin); using var templateReader = await OpenXmlReader.CreateAsync(templateStream, null, cancellationToken: cancellationToken).ConfigureAwait(false); using var outputFileArchive = new OpenXmlZip(_outputFileStream, mode: ZipArchiveMode.Create, true, Encoding.UTF8, isUpdateMode: false); From f9893c40fc124531fda2f2f9095f1a8a0856089b Mon Sep 17 00:00:00 2001 From: Michele Bastione Date: Sun, 20 Jul 2025 11:19:53 +0200 Subject: [PATCH 20/26] Renamed API methods deleting Excel and Csv suffixes for simplicity Also moved a few tests and test sections from the main testing assembly to the csv testing assembly --- .../BenchmarkSections/CreateExcelBenchmark.cs | 2 +- .../BenchmarkSections/QueryExcelBenchmark.cs | 4 +- .../TemplateExcelBenchmark.cs | 2 +- .../BenchmarkSections/XlsxAsyncBenchmark.cs | 4 +- src/MiniExcel.Csv/Api/CsvExporter.cs | 16 +- src/MiniExcel.Csv/Api/CsvImporter.cs | 38 +- src/MiniExcel.Csv/Api/ProviderExtensions.cs | 7 + src/MiniExcel.Csv/ProviderExtensions.cs | 7 - src/MiniExcel.Legacy/MiniExcel.cs | 75 +- src/MiniExcel/OpenXml/Api/OpenXmlExporter.cs | 24 +- src/MiniExcel/OpenXml/Api/OpenXmlImporter.cs | 57 +- src/MiniExcel/OpenXml/Api/OpenXmlTemplater.cs | 16 +- tests/MiniExcel.Csv.Tests/AsyncIssueTests.cs | 155 +++- tests/MiniExcel.Csv.Tests/IssueTests.cs | 260 +++++-- .../MiniExcelCsvAsycTests.cs | 50 +- .../MiniExcel.Csv.Tests/MiniExcelCsvTests.cs | 58 +- .../MiniExcelAutoAdjustWidthTests.cs | 18 +- .../MiniExcelIssueAsyncTests.cs | 306 +++----- tests/MiniExcel.Tests/MiniExcelIssueTests.cs | 673 +++++++----------- .../MiniExcelOpenXmlAsyncTests.cs | 211 +++--- .../MiniExcelOpenXmlConfigurationTest.cs | 8 +- ...MiniExcelOpenXmlMultipleSheetAsyncTests.cs | 34 +- .../MiniExcelOpenXmlMultipleSheetTests.cs | 62 +- .../MiniExcel.Tests/MiniExcelOpenXmlTests.cs | 226 +++--- .../MiniExcelTemplateAsyncTests.cs | 90 +-- .../SaveByTemplate/MiniExcelTemplateTests.cs | 90 +-- 26 files changed, 1274 insertions(+), 1219 deletions(-) create mode 100644 src/MiniExcel.Csv/Api/ProviderExtensions.cs delete mode 100644 src/MiniExcel.Csv/ProviderExtensions.cs diff --git a/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/CreateExcelBenchmark.cs b/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/CreateExcelBenchmark.cs index 087be26e..2bd67c25 100644 --- a/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/CreateExcelBenchmark.cs +++ b/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/CreateExcelBenchmark.cs @@ -28,7 +28,7 @@ public void SetUp() public void MiniExcelCreateTest() { using var path = AutoDeletingPath.Create(); - _exporter.ExportExcel(path.FilePath, GetValue()); + _exporter.Export(path.FilePath, GetValue()); } [Benchmark(Description = "ClosedXml Create Xlsx")] diff --git a/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/QueryExcelBenchmark.cs b/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/QueryExcelBenchmark.cs index 6d044e02..34dfde1a 100644 --- a/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/QueryExcelBenchmark.cs +++ b/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/QueryExcelBenchmark.cs @@ -26,13 +26,13 @@ public void SetUp() [Benchmark(Description = "MiniExcel QueryFirst")] public void MiniExcel_QueryFirst_Test() { - _ = _importer.QueryExcel(FilePath).First(); + _ = _importer.Query(FilePath).First(); } [Benchmark(Description = "MiniExcel Query")] public void MiniExcel_Query() { - foreach (var _ in _importer.QueryExcel(FilePath)) { } + foreach (var _ in _importer.Query(FilePath)) { } } [Benchmark(Description = "ExcelDataReader QueryFirst")] diff --git a/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/TemplateExcelBenchmark.cs b/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/TemplateExcelBenchmark.cs index f30d4d54..ea16a09d 100644 --- a/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/TemplateExcelBenchmark.cs +++ b/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/TemplateExcelBenchmark.cs @@ -31,7 +31,7 @@ public void MiniExcel_Template_Generate_Test() }) }; - _templater.ApplyXlsxTemplate(path.FilePath, templatePath, value); + _templater.ApplyTemplate(path.FilePath, templatePath, value); } [Benchmark(Description = "ClosedXml.Report Template Generate")] diff --git a/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/XlsxAsyncBenchmark.cs b/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/XlsxAsyncBenchmark.cs index 88f8b767..b7131001 100644 --- a/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/XlsxAsyncBenchmark.cs +++ b/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/XlsxAsyncBenchmark.cs @@ -22,7 +22,7 @@ public async Task MiniExcelCreateAsyncTest() using var path = AutoDeletingPath.Create(); await using var stream = File.Create(path.FilePath); - await _exporter.ExportExcelAsync(stream, GetValue()); + await _exporter.ExportAsync(stream, GetValue()); } [Benchmark(Description = "MiniExcel Generate Template Async")] @@ -41,6 +41,6 @@ public async Task MiniExcel_Template_Generate_Async_Test() }) }; - await _templater.ApplyXlsxTemplateAsync(path.FilePath, templatePath, value); + await _templater.ApplyTemplateAsync(path.FilePath, templatePath, value); } } diff --git a/src/MiniExcel.Csv/Api/CsvExporter.cs b/src/MiniExcel.Csv/Api/CsvExporter.cs index a255e646..1676a847 100644 --- a/src/MiniExcel.Csv/Api/CsvExporter.cs +++ b/src/MiniExcel.Csv/Api/CsvExporter.cs @@ -13,7 +13,7 @@ public async Task AppendToCsvAsync(string path, object value, bool printHea { if (!File.Exists(path)) { - var rowsWritten = await ExportCsvAsync(path, value, printHeader, false, configuration, cancellationToken: cancellationToken).ConfigureAwait(false); + var rowsWritten = await ExportAsync(path, value, printHeader, false, configuration, cancellationToken: cancellationToken).ConfigureAwait(false); return rowsWritten.FirstOrDefault(); } @@ -33,15 +33,15 @@ public async Task AppendToCsvAsync(Stream stream, object value, CsvConfigur } [CreateSyncVersion] - public async Task ExportCsvAsync(string path, object value, bool printHeader = true, bool overwriteFile = false, + public async Task ExportAsync(string path, object value, bool printHeader = true, bool overwriteFile = false, CsvConfiguration? configuration = null, CancellationToken cancellationToken = default) { using var stream = overwriteFile ? File.Create(path) : new FileStream(path, FileMode.CreateNew); - return await ExportCsvAsync(stream, value, printHeader, configuration, cancellationToken).ConfigureAwait(false); + return await ExportAsync(stream, value, printHeader, configuration, cancellationToken).ConfigureAwait(false); } [CreateSyncVersion] - public async Task ExportCsvAsync(Stream stream, object value, bool printHeader = true, + public async Task ExportAsync(Stream stream, object value, bool printHeader = true, CsvConfiguration? configuration = null, CancellationToken cancellationToken = default) { using var writer = new CsvWriter(stream, value, printHeader, configuration); @@ -55,11 +55,11 @@ public async Task ExportCsvAsync(Stream stream, object value, bool printH [CreateSyncVersion] public async Task ConvertCsvToXlsxAsync(Stream csv, Stream xlsx, bool csvHasHeader = false, CancellationToken cancellationToken = default) { - var value = new CsvImporter().QueryCsvAsync(csv, useHeaderRow: csvHasHeader, cancellationToken: cancellationToken); + var value = new CsvImporter().QueryAsync(csv, useHeaderRow: csvHasHeader, cancellationToken: cancellationToken); await MiniExcel.Exporter .GetExcelExporter() - .ExportExcelAsync(xlsx, value, printHeader: csvHasHeader, cancellationToken: cancellationToken) + .ExportAsync(xlsx, value, printHeader: csvHasHeader, cancellationToken: cancellationToken) .ConfigureAwait(false); } @@ -86,10 +86,10 @@ public async Task ConvertXlsxToCsvAsync(Stream xlsx, Stream csv, bool xlsxHasHea { var value = MiniExcel.Importer .GetExcelImporter() - .QueryExcelAsync(xlsx, useHeaderRow: xlsxHasHeader, cancellationToken: cancellationToken) + .QueryAsync(xlsx, useHeaderRow: xlsxHasHeader, cancellationToken: cancellationToken) .ConfigureAwait(false); - await ExportCsvAsync(csv, value, printHeader: xlsxHasHeader, cancellationToken: cancellationToken).ConfigureAwait(false); + await ExportAsync(csv, value, printHeader: xlsxHasHeader, cancellationToken: cancellationToken).ConfigureAwait(false); } #endregion diff --git a/src/MiniExcel.Csv/Api/CsvImporter.cs b/src/MiniExcel.Csv/Api/CsvImporter.cs index 9c9b2d84..e677f1d2 100644 --- a/src/MiniExcel.Csv/Api/CsvImporter.cs +++ b/src/MiniExcel.Csv/Api/CsvImporter.cs @@ -10,13 +10,13 @@ internal CsvImporter() { } #region Query [CreateSyncVersion] - public async IAsyncEnumerable QueryCsvAsync(string path, bool treatHeaderAsData = false, + public async IAsyncEnumerable QueryAsync(string path, bool treatHeaderAsData = false, CsvConfiguration? configuration = null, [EnumeratorCancellation] CancellationToken cancellationToken = default) where T : class, new() { using var stream = FileHelper.OpenSharedRead(path); - var query = QueryCsvAsync(stream, treatHeaderAsData, configuration, cancellationToken); + var query = QueryAsync(stream, treatHeaderAsData, configuration, cancellationToken); //Foreach yield return twice reason : https://stackoverflow.com/questions/66791982/ienumerable-extract-code-lazy-loading-show-stream-was-not-readable await foreach (var item in query.ConfigureAwait(false)) @@ -24,7 +24,7 @@ public async IAsyncEnumerable QueryCsvAsync(string path, bool treatHeaderA } [CreateSyncVersion] - public async IAsyncEnumerable QueryCsvAsync(Stream stream, bool treatHeaderAsData = false, + public async IAsyncEnumerable QueryAsync(Stream stream, bool treatHeaderAsData = false, CsvConfiguration? configuration = null, [EnumeratorCancellation] CancellationToken cancellationToken = default) where T : class, new() { @@ -34,16 +34,16 @@ public async IAsyncEnumerable QueryCsvAsync(Stream stream, bool treatHeade } [CreateSyncVersion] - public async IAsyncEnumerable QueryCsvAsync(string path, bool useHeaderRow = false, + public async IAsyncEnumerable QueryAsync(string path, bool useHeaderRow = false, CsvConfiguration? configuration = null, [EnumeratorCancellation] CancellationToken cancellationToken = default) { using var stream = FileHelper.OpenSharedRead(path); - await foreach (var item in QueryCsvAsync(stream, useHeaderRow, configuration, cancellationToken).ConfigureAwait(false)) + await foreach (var item in QueryAsync(stream, useHeaderRow, configuration, cancellationToken).ConfigureAwait(false)) yield return item; } [CreateSyncVersion] - public async IAsyncEnumerable QueryCsvAsync(Stream stream, bool useHeaderRow = false, + public async IAsyncEnumerable QueryAsync(Stream stream, bool useHeaderRow = false, CsvConfiguration? configuration = null, [EnumeratorCancellation] CancellationToken cancellationToken = default) { using var excelReader = new CsvReader(stream, configuration); @@ -59,18 +59,18 @@ public async IAsyncEnumerable QueryCsvAsync(Stream stream, bool useHead /// QueryAsDataTable is not recommended, because it'll load all data into memory. /// [CreateSyncVersion] - public async Task QueryCsvAsDataTableAsync(string path, bool useHeaderRow = true, + public async Task QueryAsDataTableAsync(string path, bool useHeaderRow = true, CsvConfiguration? configuration = null, CancellationToken cancellationToken = default) { using var stream = FileHelper.OpenSharedRead(path); - return await QueryCsvAsDataTableAsync(stream, useHeaderRow, configuration, cancellationToken).ConfigureAwait(false); + return await QueryAsDataTableAsync(stream, useHeaderRow, configuration, cancellationToken).ConfigureAwait(false); } /// /// QueryAsDataTable is not recommended, because it'll load all data into memory. /// [CreateSyncVersion] - public async Task QueryCsvAsDataTableAsync(Stream stream, bool useHeaderRow = true, + public async Task QueryAsDataTableAsync(Stream stream, bool useHeaderRow = true, CsvConfiguration? configuration = null, CancellationToken cancellationToken = default) { var dt = new DataTable(); @@ -122,19 +122,19 @@ public async Task QueryCsvAsDataTableAsync(Stream stream, bool useHea #region Info [CreateSyncVersion] - public async Task> GetCsvColumnsAsync(string path, bool useHeaderRow = false, + public async Task> GetColumnNamesAsync(string path, bool useHeaderRow = false, CsvConfiguration? configuration = null, CancellationToken cancellationToken = default) { using var stream = FileHelper.OpenSharedRead(path); - return await GetCsvColumnsAsync(stream, useHeaderRow, configuration, cancellationToken).ConfigureAwait(false); + return await GetColumnNamesAsync(stream, useHeaderRow, configuration, cancellationToken).ConfigureAwait(false); } [CreateSyncVersion] - public async Task> GetCsvColumnsAsync(Stream stream, bool useHeaderRow = false, + public async Task> GetColumnNamesAsync(Stream stream, bool useHeaderRow = false, CsvConfiguration? configuration = null, CancellationToken cancellationToken = default) { #pragma warning disable CA2007 // We need to assign the AsyncEnumerator before we can call ConfigureAwait on it - await using var enumerator = QueryCsvAsync(stream, useHeaderRow, configuration, cancellationToken).GetAsyncEnumerator(cancellationToken); + await using var enumerator = QueryAsync(stream, useHeaderRow, configuration, cancellationToken).GetAsyncEnumerator(cancellationToken); #pragma warning restore CA2007 _ = enumerator.ConfigureAwait(false); @@ -150,17 +150,17 @@ public async Task> GetCsvColumnsAsync(Stream stream, bool us #region DataReader - public MiniExcelDataReader GetCsvDataReader(string path, bool useHeaderRow = false, CsvConfiguration? configuration = null) + public MiniExcelDataReader GetDataReader(string path, bool useHeaderRow = false, CsvConfiguration? configuration = null) { var stream = FileHelper.OpenSharedRead(path); - var values = QueryCsv(stream, useHeaderRow, configuration).Cast>(); + var values = Query(stream, useHeaderRow, configuration).Cast>(); return MiniExcelDataReader.Create(stream, values); } - public MiniExcelDataReader GetCsvDataReader(Stream stream, bool useHeaderRow = false, CsvConfiguration? configuration = null) + public MiniExcelDataReader GetDataReader(Stream stream, bool useHeaderRow = false, CsvConfiguration? configuration = null) { - var values = QueryCsv(stream, useHeaderRow, configuration).Cast>(); + var values = Query(stream, useHeaderRow, configuration).Cast>(); return MiniExcelDataReader.Create(stream, values); } @@ -169,7 +169,7 @@ public async Task GetAsyncCsvDataReader(string path, b CancellationToken cancellationToken = default) { var stream = FileHelper.OpenSharedRead(path); - var values = QueryCsvAsync(stream, useHeaderRow, configuration, cancellationToken); + var values = QueryAsync(stream, useHeaderRow, configuration, cancellationToken); return await MiniExcelAsyncDataReader.CreateAsync(stream, CastAsync(values, cancellationToken)).ConfigureAwait(false); } @@ -178,7 +178,7 @@ public async Task GetAsyncCsvDataReader(Stream stream, string? sheetName = null, string startCell = "A1", CsvConfiguration? configuration = null, CancellationToken cancellationToken = default) { - var values = QueryCsvAsync(stream, useHeaderRow, configuration, cancellationToken); + var values = QueryAsync(stream, useHeaderRow, configuration, cancellationToken); return await MiniExcelAsyncDataReader.CreateAsync(stream, CastAsync(values, cancellationToken)).ConfigureAwait(false); } diff --git a/src/MiniExcel.Csv/Api/ProviderExtensions.cs b/src/MiniExcel.Csv/Api/ProviderExtensions.cs new file mode 100644 index 00000000..bc2fe986 --- /dev/null +++ b/src/MiniExcel.Csv/Api/ProviderExtensions.cs @@ -0,0 +1,7 @@ +namespace MiniExcelLib.Csv.Api; + +public static class ProviderExtensions +{ + public static CsvExporter GetCsvExporter(this MiniExcelExporterProvider exporterProvider) => new(); + public static CsvImporter GetCsvImporter(this MiniExcelImporterProvider importerProvider) => new(); +} \ No newline at end of file diff --git a/src/MiniExcel.Csv/ProviderExtensions.cs b/src/MiniExcel.Csv/ProviderExtensions.cs deleted file mode 100644 index 63f38611..00000000 --- a/src/MiniExcel.Csv/ProviderExtensions.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace MiniExcelLib.Csv; - -public static class ProviderExtensions -{ - public static Api.CsvExporter GetCsvExporter(this MiniExcelExporterProvider exporterProvider) => new(); - public static Api.CsvImporter GetCsvImporter(this MiniExcelImporterProvider importerProvider) => new(); -} \ No newline at end of file diff --git a/src/MiniExcel.Legacy/MiniExcel.cs b/src/MiniExcel.Legacy/MiniExcel.cs index 00c3bd6f..7fde9196 100644 --- a/src/MiniExcel.Legacy/MiniExcel.cs +++ b/src/MiniExcel.Legacy/MiniExcel.cs @@ -1,6 +1,7 @@ using System.Data; using MiniExcelLib; using MiniExcelLib.Csv; +using MiniExcelLib.Csv.Api; using MiniExcelLib.DataReader; using MiniExcelLib.OpenXml.Models; using MiniExcelLib.OpenXml.Picture; @@ -27,12 +28,12 @@ public static partial class MiniExcel [CreateSyncVersion] [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.MiniExcel.Exporter instead.")] public static async Task AddPictureAsync(string path, CancellationToken cancellationToken = default, params MiniExcelPicture[] images) - => await ExcelExporter.AddExcelPictureAsync(path, cancellationToken, images).ConfigureAwait(false); + => await ExcelExporter.AddPictureAsync(path, cancellationToken, images).ConfigureAwait(false); [CreateSyncVersion] [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.MiniExcel.Exporter instead.")] public static async Task AddPictureAsync(Stream excelStream, CancellationToken cancellationToken = default, params MiniExcelPicture[] images) - => await ExcelExporter.AddExcelPictureAsync(excelStream, cancellationToken, images).ConfigureAwait(false); + => await ExcelExporter.AddPictureAsync(excelStream, cancellationToken, images).ConfigureAwait(false); [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.MiniExcel.Importer instead.")] public static MiniExcelDataReader GetReader(string path, bool useHeaderRow = false, string? sheetName = null, ExcelType excelType = ExcelType.UNKNOWN, string startCell = "A1", IConfiguration? configuration = null) @@ -41,7 +42,7 @@ public static MiniExcelDataReader GetReader(string path, bool useHeaderRow = fal return type switch { ExcelType.XLSX => ExcelImporter.GetExcelDataReader(path, useHeaderRow, sheetName, startCell, configuration as OpenXmlConfiguration), - ExcelType.CSV => CsvImporter.GetCsvDataReader(path, useHeaderRow, configuration as CsvConfiguration), + ExcelType.CSV => CsvImporter.GetDataReader(path, useHeaderRow, configuration as CsvConfiguration), _ => throw new NotSupportedException($"Excel type {type} is not a valid Excel type") }; } @@ -53,7 +54,7 @@ public static MiniExcelDataReader GetReader(this Stream stream, bool useHeaderRo return type switch { ExcelType.XLSX => ExcelImporter.GetExcelDataReader(stream, useHeaderRow, sheetName, startCell, configuration as OpenXmlConfiguration), - ExcelType.CSV => CsvImporter.GetCsvDataReader(stream, useHeaderRow, configuration as CsvConfiguration), + ExcelType.CSV => CsvImporter.GetDataReader(stream, useHeaderRow, configuration as CsvConfiguration), _ => throw new NotSupportedException($"Excel type {type} is not a valid Excel type") }; } @@ -65,7 +66,7 @@ public static async Task InsertAsync(string path, object value, string shee var type = path.GetExcelType(excelType); return type switch { - ExcelType.XLSX => await ExcelExporter.InsertExcelSheetAsync(path, value, sheetName, printHeader, overwriteSheet, configuration as OpenXmlConfiguration, cancellationToken).ConfigureAwait(false), + ExcelType.XLSX => await ExcelExporter.InsertSheetAsync(path, value, sheetName, printHeader, overwriteSheet, configuration as OpenXmlConfiguration, cancellationToken).ConfigureAwait(false), ExcelType.CSV => await CsvExporter.AppendToCsvAsync(path, value, printHeader, configuration as CsvConfiguration, cancellationToken).ConfigureAwait(false), _ => throw new InvalidDataException($"Excel type {type} is not a valid Excel type") }; @@ -78,7 +79,7 @@ public static async Task InsertAsync(this Stream stream, object value, stri var type = stream.GetExcelType(excelType); return type switch { - ExcelType.XLSX => await ExcelExporter.InsertExcelSheetAsync(stream, value, sheetName, printHeader, overwriteSheet, configuration as OpenXmlConfiguration, cancellationToken).ConfigureAwait(false), + ExcelType.XLSX => await ExcelExporter.InsertSheetAsync(stream, value, sheetName, printHeader, overwriteSheet, configuration as OpenXmlConfiguration, cancellationToken).ConfigureAwait(false), ExcelType.CSV => await CsvExporter.AppendToCsvAsync(stream, value, configuration as CsvConfiguration, cancellationToken).ConfigureAwait(false), _ => throw new InvalidDataException($"Excel type {type} is not a valid Excel type") }; @@ -91,8 +92,8 @@ public static async Task SaveAsAsync(string path, object value, bool prin var type = path.GetExcelType(excelType); return type switch { - ExcelType.XLSX => await ExcelExporter.ExportExcelAsync(path, value, printHeader, sheetName, printHeader, configuration as OpenXmlConfiguration, cancellationToken).ConfigureAwait(false), - ExcelType.CSV => await CsvExporter.ExportCsvAsync(path, value, printHeader, overwriteFile, configuration as CsvConfiguration, cancellationToken).ConfigureAwait(false), + ExcelType.XLSX => await ExcelExporter.ExportAsync(path, value, printHeader, sheetName, printHeader, configuration as OpenXmlConfiguration, cancellationToken).ConfigureAwait(false), + ExcelType.CSV => await CsvExporter.ExportAsync(path, value, printHeader, overwriteFile, configuration as CsvConfiguration, cancellationToken).ConfigureAwait(false), _ => throw new InvalidDataException($"Excel type {type} is not a valid Excel type") }; } @@ -104,8 +105,8 @@ public static async Task SaveAsAsync(this Stream stream, object value, bo var type = stream.GetExcelType(excelType); return type switch { - ExcelType.XLSX => await ExcelExporter.ExportExcelAsync(stream, value, printHeader, sheetName, configuration as OpenXmlConfiguration, cancellationToken).ConfigureAwait(false), - ExcelType.CSV => await CsvExporter.ExportCsvAsync(stream, value, printHeader, configuration as CsvConfiguration, cancellationToken).ConfigureAwait(false), + ExcelType.XLSX => await ExcelExporter.ExportAsync(stream, value, printHeader, sheetName, configuration as OpenXmlConfiguration, cancellationToken).ConfigureAwait(false), + ExcelType.CSV => await CsvExporter.ExportAsync(stream, value, printHeader, configuration as CsvConfiguration, cancellationToken).ConfigureAwait(false), _ => throw new InvalidDataException($"Excel type {type} is not a valid Excel type") }; } @@ -117,8 +118,8 @@ public static async Task SaveAsAsync(this Stream stream, object value, bo var type = path.GetExcelType(excelType); return type switch { - ExcelType.XLSX => ExcelImporter.QueryExcelAsync(path, sheetName, startCell, hasHeader, configuration as OpenXmlConfiguration, cancellationToken), - ExcelType.CSV => CsvImporter.QueryCsvAsync(path, hasHeader, configuration as CsvConfiguration, cancellationToken), + ExcelType.XLSX => ExcelImporter.QueryAsync(path, sheetName, startCell, hasHeader, configuration as OpenXmlConfiguration, cancellationToken), + ExcelType.CSV => CsvImporter.QueryAsync(path, hasHeader, configuration as CsvConfiguration, cancellationToken), _ => throw new InvalidDataException($"Excel type {type} is not a valid Excel type") }; } @@ -130,8 +131,8 @@ public static async Task SaveAsAsync(this Stream stream, object value, bo var type = stream.GetExcelType(excelType); return type switch { - ExcelType.XLSX => ExcelImporter.QueryExcelAsync(stream, sheetName, startCell, hasHeader, configuration as OpenXmlConfiguration, cancellationToken), - ExcelType.CSV => CsvImporter.QueryCsvAsync(stream, hasHeader, configuration as CsvConfiguration, cancellationToken), + ExcelType.XLSX => ExcelImporter.QueryAsync(stream, sheetName, startCell, hasHeader, configuration as OpenXmlConfiguration, cancellationToken), + ExcelType.CSV => CsvImporter.QueryAsync(stream, hasHeader, configuration as CsvConfiguration, cancellationToken), _ => throw new InvalidDataException($"Excel type {type} is not a valid Excel type") }; } @@ -143,8 +144,8 @@ public static IAsyncEnumerable QueryAsync(string path, bool useHeaderRo var type = path.GetExcelType(excelType); return type switch { - ExcelType.XLSX => ExcelImporter.QueryExcelAsync(path, useHeaderRow, sheetName, startCell, configuration as OpenXmlConfiguration, cancellationToken), - ExcelType.CSV => CsvImporter.QueryCsvAsync(path, useHeaderRow, configuration as CsvConfiguration, cancellationToken), + ExcelType.XLSX => ExcelImporter.QueryAsync(path, useHeaderRow, sheetName, startCell, configuration as OpenXmlConfiguration, cancellationToken), + ExcelType.CSV => CsvImporter.QueryAsync(path, useHeaderRow, configuration as CsvConfiguration, cancellationToken), _ => throw new InvalidDataException($"Excel type {type} is not a valid Excel type") }; } @@ -156,8 +157,8 @@ public static IAsyncEnumerable QueryAsync(this Stream stream, bool useH var type = stream.GetExcelType(excelType); return type switch { - ExcelType.XLSX => ExcelImporter.QueryExcelAsync(stream, useHeaderRow, sheetName, startCell, configuration as OpenXmlConfiguration, cancellationToken), - ExcelType.CSV => CsvImporter.QueryCsvAsync(stream, useHeaderRow, configuration as CsvConfiguration, cancellationToken), + ExcelType.XLSX => ExcelImporter.QueryAsync(stream, useHeaderRow, sheetName, startCell, configuration as OpenXmlConfiguration, cancellationToken), + ExcelType.CSV => CsvImporter.QueryAsync(stream, useHeaderRow, configuration as CsvConfiguration, cancellationToken), _ => throw new InvalidDataException($"Excel type {type} is not a valid Excel type") }; } @@ -178,7 +179,7 @@ public static IAsyncEnumerable QueryRangeAsync(string path, bool useHea var type = path.GetExcelType(excelType); return type switch { - ExcelType.XLSX => ExcelImporter.QueryExcelRangeAsync(path, useHeaderRow, sheetName, startCell, endCell, configuration as OpenXmlConfiguration, cancellationToken), + ExcelType.XLSX => ExcelImporter.QueryRangeAsync(path, useHeaderRow, sheetName, startCell, endCell, configuration as OpenXmlConfiguration, cancellationToken), ExcelType.CSV => throw new NotSupportedException("QueryRange is not supported for csv"), _ => throw new InvalidDataException($"Excel type {type} is not a valid Excel type") }; @@ -191,8 +192,8 @@ public static IAsyncEnumerable QueryRangeAsync(this Stream stream, bool var type = stream.GetExcelType(excelType); return type switch { - ExcelType.XLSX => ExcelImporter.QueryExcelRangeAsync(stream, useHeaderRow, sheetName, startCell, endCell, configuration as OpenXmlConfiguration, cancellationToken), - ExcelType.CSV => CsvImporter.QueryCsvAsync(stream, useHeaderRow, configuration as CsvConfiguration, cancellationToken), + ExcelType.XLSX => ExcelImporter.QueryRangeAsync(stream, useHeaderRow, sheetName, startCell, endCell, configuration as OpenXmlConfiguration, cancellationToken), + ExcelType.CSV => CsvImporter.QueryAsync(stream, useHeaderRow, configuration as CsvConfiguration, cancellationToken), _ => throw new InvalidDataException($"Excel type {type} is not a valid Excel type") }; } @@ -204,7 +205,7 @@ public static IAsyncEnumerable QueryRangeAsync(string path, bool useHea var type = path.GetExcelType(excelType); return type switch { - ExcelType.XLSX => ExcelImporter.QueryExcelRangeAsync(path, useHeaderRow, sheetName, startRowIndex, startColumnIndex, endRowIndex, endColumnIndex, configuration as OpenXmlConfiguration, cancellationToken), + ExcelType.XLSX => ExcelImporter.QueryRangeAsync(path, useHeaderRow, sheetName, startRowIndex, startColumnIndex, endRowIndex, endColumnIndex, configuration as OpenXmlConfiguration, cancellationToken), ExcelType.CSV => throw new NotSupportedException("QueryRange is not supported for csv"), _ => throw new InvalidDataException($"Excel type {type} is not a valid Excel type") }; @@ -217,7 +218,7 @@ public static IAsyncEnumerable QueryRangeAsync(this Stream stream, bool var type = stream.GetExcelType(excelType); return type switch { - ExcelType.XLSX => ExcelImporter.QueryExcelRangeAsync(stream, useHeaderRow, sheetName, startRowIndex, startColumnIndex, endRowIndex, endColumnIndex, configuration as OpenXmlConfiguration, cancellationToken), + ExcelType.XLSX => ExcelImporter.QueryRangeAsync(stream, useHeaderRow, sheetName, startRowIndex, startColumnIndex, endRowIndex, endColumnIndex, configuration as OpenXmlConfiguration, cancellationToken), ExcelType.CSV => throw new NotSupportedException("QueryRange is not supported for csv"), _ => throw new InvalidDataException($"Excel type {type} is not a valid Excel type") }; @@ -228,32 +229,32 @@ public static IAsyncEnumerable QueryRangeAsync(this Stream stream, bool [CreateSyncVersion] [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.MiniExcel.Exporter instead.")] public static async Task SaveAsByTemplateAsync(string path, string templatePath, object value, IConfiguration? configuration = null, CancellationToken cancellationToken = default) - => await ExcelTemplater.ApplyXlsxTemplateAsync(path, templatePath, value, configuration as OpenXmlConfiguration, cancellationToken).ConfigureAwait(false); + => await ExcelTemplater.ApplyTemplateAsync(path, templatePath, value, configuration as OpenXmlConfiguration, cancellationToken).ConfigureAwait(false); [CreateSyncVersion] [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.MiniExcel.Templater instead.")] public static async Task SaveAsByTemplateAsync(string path, byte[] templateBytes, object value, IConfiguration? configuration = null) - => await ExcelTemplater.ApplyXlsxTemplateAsync(path, templateBytes, value, configuration as OpenXmlConfiguration).ConfigureAwait(false); + => await ExcelTemplater.ApplyTemplateAsync(path, templateBytes, value, configuration as OpenXmlConfiguration).ConfigureAwait(false); [CreateSyncVersion] [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.MiniExcel.Templater instead.")] public static async Task SaveAsByTemplateAsync(this Stream stream, string templatePath, object value, IConfiguration? configuration = null) - => await ExcelTemplater.ApplyXlsxTemplateAsync(stream, templatePath, value, configuration as OpenXmlConfiguration).ConfigureAwait(false); + => await ExcelTemplater.ApplyTemplateAsync(stream, templatePath, value, configuration as OpenXmlConfiguration).ConfigureAwait(false); [CreateSyncVersion] [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.MiniExcel.Templater instead.")] public static async Task SaveAsByTemplateAsync(this Stream stream, byte[] templateBytes, object value, IConfiguration? configuration = null) - => await ExcelTemplater.ApplyXlsxTemplateAsync(stream, templateBytes, value, configuration as OpenXmlConfiguration).ConfigureAwait(false); + => await ExcelTemplater.ApplyTemplateAsync(stream, templateBytes, value, configuration as OpenXmlConfiguration).ConfigureAwait(false); [CreateSyncVersion] [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.MiniExcel.Templater instead.")] public static async Task SaveAsByTemplateAsync(string path, Stream templateStream, object value, IConfiguration? configuration = null) - => await ExcelTemplater.ApplyXlsxTemplateAsync(path, templateStream, value, configuration as OpenXmlConfiguration).ConfigureAwait(false); + => await ExcelTemplater.ApplyTemplateAsync(path, templateStream, value, configuration as OpenXmlConfiguration).ConfigureAwait(false); [CreateSyncVersion] [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.MiniExcel.Templater instead.")] public static async Task SaveAsByTemplateAsync(this Stream stream, Stream templateStream, object value, IConfiguration? configuration = null) - => await ExcelTemplater.ApplyXlsxTemplateAsync(stream, templateStream, value, configuration as OpenXmlConfiguration).ConfigureAwait(false); + => await ExcelTemplater.ApplyTemplateAsync(stream, templateStream, value, configuration as OpenXmlConfiguration).ConfigureAwait(false); #region MergeCells @@ -299,8 +300,8 @@ public static async Task QueryAsDataTableAsync(string path, bool useH var type = path.GetExcelType(excelType); return type switch { - ExcelType.XLSX => await ExcelImporter.QueryExcelAsDataTableAsync(path, useHeaderRow, sheetName, startCell, configuration as OpenXmlConfiguration, cancellationToken).ConfigureAwait(false), - ExcelType.CSV => await CsvImporter.QueryCsvAsDataTableAsync(path, useHeaderRow, configuration as CsvConfiguration, cancellationToken).ConfigureAwait(false), + ExcelType.XLSX => await ExcelImporter.QueryAsDataTableAsync(path, useHeaderRow, sheetName, startCell, configuration as OpenXmlConfiguration, cancellationToken).ConfigureAwait(false), + ExcelType.CSV => await CsvImporter.QueryAsDataTableAsync(path, useHeaderRow, configuration as CsvConfiguration, cancellationToken).ConfigureAwait(false), _ => throw new InvalidDataException($"Excel type {type} is not a valid Excel type") }; } @@ -315,8 +316,8 @@ public static async Task QueryAsDataTableAsync(this Stream stream, bo var type = stream.GetExcelType(excelType); return type switch { - ExcelType.XLSX => await ExcelImporter.QueryExcelAsDataTableAsync(stream, useHeaderRow, sheetName, startCell, configuration as OpenXmlConfiguration, cancellationToken).ConfigureAwait(false), - ExcelType.CSV => await CsvImporter.QueryCsvAsDataTableAsync(stream, useHeaderRow, configuration as CsvConfiguration, cancellationToken).ConfigureAwait(false), + ExcelType.XLSX => await ExcelImporter.QueryAsDataTableAsync(stream, useHeaderRow, sheetName, startCell, configuration as OpenXmlConfiguration, cancellationToken).ConfigureAwait(false), + ExcelType.CSV => await CsvImporter.QueryAsDataTableAsync(stream, useHeaderRow, configuration as CsvConfiguration, cancellationToken).ConfigureAwait(false), _ => throw new InvalidDataException($"Excel type {type} is not a valid Excel type") }; } @@ -348,8 +349,8 @@ public static async Task> GetColumnsAsync(string path, bool var type = path.GetExcelType(excelType); return type switch { - ExcelType.XLSX => await ExcelImporter.GetExcelColumnsAsync(path, useHeaderRow, sheetName, startCell, configuration as OpenXmlConfiguration, cancellationToken).ConfigureAwait(false), - ExcelType.CSV => await CsvImporter.GetCsvColumnsAsync(path, useHeaderRow, configuration as CsvConfiguration, cancellationToken).ConfigureAwait(false), + ExcelType.XLSX => await ExcelImporter.GetColumnNamesAsync(path, useHeaderRow, sheetName, startCell, configuration as OpenXmlConfiguration, cancellationToken).ConfigureAwait(false), + ExcelType.CSV => await CsvImporter.GetColumnNamesAsync(path, useHeaderRow, configuration as CsvConfiguration, cancellationToken).ConfigureAwait(false), _ => throw new InvalidDataException($"Excel type {type} is not a valid Excel type") }; } @@ -361,8 +362,8 @@ public static async Task> GetColumnsAsync(this Stream stream var type = stream.GetExcelType(excelType); return type switch { - ExcelType.XLSX => await ExcelImporter.GetExcelColumnsAsync(stream, useHeaderRow, sheetName, startCell, configuration as OpenXmlConfiguration, cancellationToken).ConfigureAwait(false), - ExcelType.CSV => await CsvImporter.GetCsvColumnsAsync(stream, useHeaderRow, configuration as CsvConfiguration, cancellationToken).ConfigureAwait(false), + ExcelType.XLSX => await ExcelImporter.GetColumnNamesAsync(stream, useHeaderRow, sheetName, startCell, configuration as OpenXmlConfiguration, cancellationToken).ConfigureAwait(false), + ExcelType.CSV => await CsvImporter.GetColumnNamesAsync(stream, useHeaderRow, configuration as CsvConfiguration, cancellationToken).ConfigureAwait(false), _ => throw new InvalidDataException($"Excel type {type} is not a valid Excel type") }; } diff --git a/src/MiniExcel/OpenXml/Api/OpenXmlExporter.cs b/src/MiniExcel/OpenXml/Api/OpenXmlExporter.cs index b5c6243e..249c350c 100644 --- a/src/MiniExcel/OpenXml/Api/OpenXmlExporter.cs +++ b/src/MiniExcel/OpenXml/Api/OpenXmlExporter.cs @@ -8,36 +8,36 @@ internal OpenXmlExporter() { } [CreateSyncVersion] - public async Task AddExcelPictureAsync(string path, CancellationToken cancellationToken = default, params MiniExcelPicture[] images) + public async Task AddPictureAsync(string path, CancellationToken cancellationToken = default, params MiniExcelPicture[] images) { using var stream = File.Open(path, FileMode.OpenOrCreate); await MiniExcelPictureImplement.AddPictureAsync(stream, cancellationToken, images).ConfigureAwait(false); } [CreateSyncVersion] - public async Task AddExcelPictureAsync(Stream excelStream, CancellationToken cancellationToken = default, params MiniExcelPicture[] images) + public async Task AddPictureAsync(Stream excelStream, CancellationToken cancellationToken = default, params MiniExcelPicture[] images) { await MiniExcelPictureImplement.AddPictureAsync(excelStream, cancellationToken, images).ConfigureAwait(false); } [CreateSyncVersion] - public async Task InsertExcelSheetAsync(string path, object value, string? sheetName = "Sheet1", bool printHeader = true, bool overwriteSheet = false, OpenXmlConfiguration? configuration = null, CancellationToken cancellationToken = default) + public async Task InsertSheetAsync(string path, object value, string? sheetName = "Sheet1", bool printHeader = true, bool overwriteSheet = false, OpenXmlConfiguration? configuration = null, CancellationToken cancellationToken = default) { if (Path.GetExtension(path).Equals(".xlsm", StringComparison.InvariantCultureIgnoreCase)) throw new NotSupportedException("MiniExcel's InsertExcelSheet does not support the .xlsm format"); if (!File.Exists(path)) { - var rowsWritten = await ExportExcelAsync(path, value, printHeader, sheetName, configuration: configuration, cancellationToken: cancellationToken).ConfigureAwait(false); + var rowsWritten = await ExportAsync(path, value, printHeader, sheetName, configuration: configuration, cancellationToken: cancellationToken).ConfigureAwait(false); return rowsWritten.FirstOrDefault(); } using var stream = new FileStream(path, FileMode.Open, FileAccess.ReadWrite, FileShare.Read, 4096, FileOptions.SequentialScan); - return await InsertExcelSheetAsync(stream, value, sheetName, printHeader, overwriteSheet, configuration, cancellationToken).ConfigureAwait(false); + return await InsertSheetAsync(stream, value, sheetName, printHeader, overwriteSheet, configuration, cancellationToken).ConfigureAwait(false); } [CreateSyncVersion] - public async Task InsertExcelSheetAsync(Stream stream, object value, string? sheetName = "Sheet1", + public async Task InsertSheetAsync(Stream stream, object value, string? sheetName = "Sheet1", bool printHeader = true, bool overwriteSheet = false, OpenXmlConfiguration? configuration = null, CancellationToken cancellationToken = default) { @@ -52,19 +52,21 @@ public async Task InsertExcelSheetAsync(Stream stream, object value, string } [CreateSyncVersion] - public async Task ExportExcelAsync(string path, object value, bool printHeader = true, + public async Task ExportAsync(string path, object value, bool printHeader = true, string? sheetName = "Sheet1", bool overwriteFile = false, OpenXmlConfiguration? configuration = null, CancellationToken cancellationToken = default) { if (Path.GetExtension(path).Equals(".xlsm", StringComparison.InvariantCultureIgnoreCase)) throw new NotSupportedException("MiniExcel's ExportExcel does not support the .xlsm format"); - - using var stream = overwriteFile ? File.Create(path) : new FileStream(path, FileMode.CreateNew); - return await ExportExcelAsync(stream, value, printHeader, sheetName, configuration, cancellationToken).ConfigureAwait(false); + + var filePath = path.EndsWith(".xlsx", StringComparison.InvariantCultureIgnoreCase) ? path : $"{path}.xlsx" ; + + using var stream = overwriteFile ? File.Create(filePath) : new FileStream(filePath, FileMode.CreateNew); + return await ExportAsync(stream, value, printHeader, sheetName, configuration, cancellationToken).ConfigureAwait(false); } [CreateSyncVersion] - public async Task ExportExcelAsync(Stream stream, object value, bool printHeader = true, string? sheetName = "Sheet1", + public async Task ExportAsync(Stream stream, object value, bool printHeader = true, string? sheetName = "Sheet1", OpenXmlConfiguration? configuration = null, CancellationToken cancellationToken = default) { var writer = await OpenXmlWriter diff --git a/src/MiniExcel/OpenXml/Api/OpenXmlImporter.cs b/src/MiniExcel/OpenXml/Api/OpenXmlImporter.cs index 25436597..140b7657 100644 --- a/src/MiniExcel/OpenXml/Api/OpenXmlImporter.cs +++ b/src/MiniExcel/OpenXml/Api/OpenXmlImporter.cs @@ -12,13 +12,13 @@ internal OpenXmlImporter() { } #region Query [CreateSyncVersion] - public async IAsyncEnumerable QueryExcelAsync(string path, string? sheetName = null, + public async IAsyncEnumerable QueryAsync(string path, string? sheetName = null, string startCell = "A1", bool treatHeaderAsData = false, OpenXmlConfiguration? configuration = null, [EnumeratorCancellation] CancellationToken cancellationToken = default) where T : class, new() { using var stream = FileHelper.OpenSharedRead(path); - var query = QueryExcelAsync(stream, sheetName, startCell, treatHeaderAsData, configuration, cancellationToken); + var query = QueryAsync(stream, sheetName, startCell, treatHeaderAsData, configuration, cancellationToken); //Foreach yield return twice reason : https://stackoverflow.com/questions/66791982/ienumerable-extract-code-lazy-loading-show-stream-was-not-readable await foreach (var item in query.ConfigureAwait(false)) @@ -26,7 +26,7 @@ public async IAsyncEnumerable QueryExcelAsync(string path, string? sheetNa } [CreateSyncVersion] - public async IAsyncEnumerable QueryExcelAsync(Stream stream, string? sheetName = null, + public async IAsyncEnumerable QueryAsync(Stream stream, string? sheetName = null, string startCell = "A1", bool treatHeaderAsData = false, OpenXmlConfiguration? configuration = null, [EnumeratorCancellation] CancellationToken cancellationToken = default) where T : class, new() { @@ -36,17 +36,17 @@ public async IAsyncEnumerable QueryExcelAsync(Stream stream, string? sheet } [CreateSyncVersion] - public async IAsyncEnumerable QueryExcelAsync(string path, bool useHeaderRow = false, + public async IAsyncEnumerable QueryAsync(string path, bool useHeaderRow = false, string? sheetName = null, string startCell = "A1", OpenXmlConfiguration? configuration = null, [EnumeratorCancellation] CancellationToken cancellationToken = default) { using var stream = FileHelper.OpenSharedRead(path); - await foreach (var item in QueryExcelAsync(stream, useHeaderRow, sheetName, startCell, configuration, cancellationToken).ConfigureAwait(false)) + await foreach (var item in QueryAsync(stream, useHeaderRow, sheetName, startCell, configuration, cancellationToken).ConfigureAwait(false)) yield return item; } [CreateSyncVersion] - public async IAsyncEnumerable QueryExcelAsync(Stream stream, bool useHeaderRow = false, + public async IAsyncEnumerable QueryAsync(Stream stream, bool useHeaderRow = false, string? sheetName = null, string startCell = "A1", OpenXmlConfiguration? configuration = null, [EnumeratorCancellation] CancellationToken cancellationToken = default) { @@ -68,17 +68,17 @@ public async IAsyncEnumerable QueryExcelAsync(Stream stream, bool useHe /// /// [CreateSyncVersion] - public async IAsyncEnumerable QueryExcelRangeAsync(string path, bool useHeaderRow = false, + public async IAsyncEnumerable QueryRangeAsync(string path, bool useHeaderRow = false, string? sheetName = null, string startCell = "A1", string endCell = "", OpenXmlConfiguration? configuration = null, [EnumeratorCancellation] CancellationToken cancellationToken = default) { using var stream = FileHelper.OpenSharedRead(path); - await foreach (var item in QueryExcelRangeAsync(stream, useHeaderRow, sheetName, startCell, endCell, configuration, cancellationToken).ConfigureAwait(false)) + await foreach (var item in QueryRangeAsync(stream, useHeaderRow, sheetName, startCell, endCell, configuration, cancellationToken).ConfigureAwait(false)) yield return item; } [CreateSyncVersion] - public async IAsyncEnumerable QueryExcelRangeAsync(Stream stream, bool useHeaderRow = false, + public async IAsyncEnumerable QueryRangeAsync(Stream stream, bool useHeaderRow = false, string? sheetName = null, string startCell = "A1", string endCell = "", OpenXmlConfiguration? configuration = null, [EnumeratorCancellation] CancellationToken cancellationToken = default) { @@ -88,18 +88,18 @@ public async IAsyncEnumerable QueryExcelRangeAsync(Stream stream, bool } [CreateSyncVersion] - public async IAsyncEnumerable QueryExcelRangeAsync(string path, bool useHeaderRow = false, + public async IAsyncEnumerable QueryRangeAsync(string path, bool useHeaderRow = false, string? sheetName = null, int startRowIndex = 1, int startColumnIndex = 1, int? endRowIndex = null, int? endColumnIndex = null, OpenXmlConfiguration? configuration = null, [EnumeratorCancellation] CancellationToken cancellationToken = default) { using var stream = FileHelper.OpenSharedRead(path); - await foreach (var item in QueryExcelRangeAsync(stream, useHeaderRow, sheetName, startRowIndex, startColumnIndex, endRowIndex, endColumnIndex, configuration, cancellationToken).ConfigureAwait(false)) + await foreach (var item in QueryRangeAsync(stream, useHeaderRow, sheetName, startRowIndex, startColumnIndex, endRowIndex, endColumnIndex, configuration, cancellationToken).ConfigureAwait(false)) yield return item; } [CreateSyncVersion] - public async IAsyncEnumerable QueryExcelRangeAsync(Stream stream, bool useHeaderRow = false, + public async IAsyncEnumerable QueryRangeAsync(Stream stream, bool useHeaderRow = false, string? sheetName = null, int startRowIndex = 1, int startColumnIndex = 1, int? endRowIndex = null, int? endColumnIndex = null, OpenXmlConfiguration? configuration = null, [EnumeratorCancellation] CancellationToken cancellationToken = default) @@ -117,19 +117,19 @@ public async IAsyncEnumerable QueryExcelRangeAsync(Stream stream, bool /// QueryAsDataTable is not recommended, because it'll load all data into memory. /// [CreateSyncVersion] - public async Task QueryExcelAsDataTableAsync(string path, bool useHeaderRow = true, + public async Task QueryAsDataTableAsync(string path, bool useHeaderRow = true, string? sheetName = null, string startCell = "A1", OpenXmlConfiguration? configuration = null, CancellationToken cancellationToken = default) { using var stream = FileHelper.OpenSharedRead(path); - return await QueryExcelAsDataTableAsync(stream, useHeaderRow, sheetName, startCell, configuration, cancellationToken).ConfigureAwait(false); + return await QueryAsDataTableAsync(stream, useHeaderRow, sheetName, startCell, configuration, cancellationToken).ConfigureAwait(false); } /// /// QueryAsDataTable is not recommended, because it'll load all data into memory. /// [CreateSyncVersion] - public async Task QueryExcelAsDataTableAsync(Stream stream, bool useHeaderRow = true, + public async Task QueryAsDataTableAsync(Stream stream, bool useHeaderRow = true, string? sheetName = null, string startCell = "A1", OpenXmlConfiguration? configuration = null, CancellationToken cancellationToken = default) { @@ -185,23 +185,18 @@ public async Task QueryExcelAsDataTableAsync(Stream stream, bool useH #region Sheet Info [CreateSyncVersion] - public async Task> GetSheetNamesAsync(string path, OpenXmlConfiguration? config = null, - CancellationToken cancellationToken = default) + public async Task> GetSheetNamesAsync(string path, OpenXmlConfiguration? config = null, CancellationToken cancellationToken = default) { using var stream = FileHelper.OpenSharedRead(path); return await GetSheetNamesAsync(stream, config, cancellationToken).ConfigureAwait(false); } [CreateSyncVersion] - public async Task> GetSheetNamesAsync(Stream stream, OpenXmlConfiguration? config = null, - CancellationToken cancellationToken = default) + public async Task> GetSheetNamesAsync(Stream stream, OpenXmlConfiguration? config = null, CancellationToken cancellationToken = default) { config ??= OpenXmlConfiguration.Default; - // todo: figure out why adding using statement breaks the tests -#pragma warning disable CA2000 // Dispose objects before losing scope - var archive = new OpenXmlZip(stream); -#pragma warning restore CA2000 // Dispose objects before losing scope + using var archive = new OpenXmlZip(stream, leaveOpen: true); using var reader = await OpenXmlReader.CreateAsync(stream, config, cancellationToken: cancellationToken).ConfigureAwait(false); var rels = await reader.GetWorkbookRelsAsync(archive.EntryCollection, cancellationToken).ConfigureAwait(false); @@ -243,21 +238,21 @@ public async Task> GetSheetDimensionsAsync(Stream stream, Canc } [CreateSyncVersion] - public async Task> GetExcelColumnsAsync(string path, bool useHeaderRow = false, + public async Task> GetColumnNamesAsync(string path, bool useHeaderRow = false, string? sheetName = null, string startCell = "A1", OpenXmlConfiguration? configuration = null, CancellationToken cancellationToken = default) { using var stream = FileHelper.OpenSharedRead(path); - return await GetExcelColumnsAsync(stream, useHeaderRow, sheetName, startCell, configuration, cancellationToken).ConfigureAwait(false); + return await GetColumnNamesAsync(stream, useHeaderRow, sheetName, startCell, configuration, cancellationToken).ConfigureAwait(false); } [CreateSyncVersion] - public async Task> GetExcelColumnsAsync(Stream stream, bool useHeaderRow = false, + public async Task> GetColumnNamesAsync(Stream stream, bool useHeaderRow = false, string? sheetName = null, string startCell = "A1", OpenXmlConfiguration? configuration = null, CancellationToken cancellationToken = default) { #pragma warning disable CA2007 // We need to assign the AsyncEnumerator before we can call ConfigureAwait on it - await using var enumerator = QueryExcelAsync(stream, useHeaderRow, sheetName, startCell, configuration, cancellationToken).GetAsyncEnumerator(cancellationToken); + await using var enumerator = QueryAsync(stream, useHeaderRow, sheetName, startCell, configuration, cancellationToken).GetAsyncEnumerator(cancellationToken); #pragma warning restore CA2007 _ = enumerator.ConfigureAwait(false); @@ -277,7 +272,7 @@ public MiniExcelDataReader GetExcelDataReader(string path, bool useHeaderRow = f string? sheetName = null, string startCell = "A1", OpenXmlConfiguration? configuration = null) { var stream = FileHelper.OpenSharedRead(path); - var values = QueryExcel(stream, useHeaderRow, sheetName, startCell, configuration).Cast>(); + var values = Query(stream, useHeaderRow, sheetName, startCell, configuration).Cast>(); return MiniExcelDataReader.Create(stream, values); } @@ -285,7 +280,7 @@ public MiniExcelDataReader GetExcelDataReader(string path, bool useHeaderRow = f public MiniExcelDataReader GetExcelDataReader(Stream stream, bool useHeaderRow = false, string? sheetName = null, string startCell = "A1", OpenXmlConfiguration? configuration = null) { - var values = QueryExcel(stream, useHeaderRow, sheetName, startCell, configuration).Cast>(); + var values = Query(stream, useHeaderRow, sheetName, startCell, configuration).Cast>(); return MiniExcelDataReader.Create(stream, values); } @@ -294,7 +289,7 @@ public async Task GetAsyncXlsxDataReader(string path, CancellationToken cancellationToken = default) { var stream = FileHelper.OpenSharedRead(path); - var values = QueryExcelAsync(stream, useHeaderRow, sheetName, startCell, configuration, cancellationToken); + var values = QueryAsync(stream, useHeaderRow, sheetName, startCell, configuration, cancellationToken); return await MiniExcelAsyncDataReader.CreateAsync(stream, CastAsync(values, cancellationToken)).ConfigureAwait(false); } @@ -303,7 +298,7 @@ public async Task GetAsyncXlsxDataReader(Stream stream string? sheetName = null, string startCell = "A1", OpenXmlConfiguration? configuration = null, CancellationToken cancellationToken = default) { - var values = QueryExcelAsync(stream, useHeaderRow, sheetName, startCell, configuration, cancellationToken); + var values = QueryAsync(stream, useHeaderRow, sheetName, startCell, configuration, cancellationToken); return await MiniExcelAsyncDataReader.CreateAsync(stream, CastAsync(values, cancellationToken)).ConfigureAwait(false); } diff --git a/src/MiniExcel/OpenXml/Api/OpenXmlTemplater.cs b/src/MiniExcel/OpenXml/Api/OpenXmlTemplater.cs index 8385910d..960c1387 100644 --- a/src/MiniExcel/OpenXml/Api/OpenXmlTemplater.cs +++ b/src/MiniExcel/OpenXml/Api/OpenXmlTemplater.cs @@ -8,15 +8,15 @@ internal OpenXmlTemplater() { } [CreateSyncVersion] - public async Task ApplyXlsxTemplateAsync(string path, string templatePath, object value, + public async Task ApplyTemplateAsync(string path, string templatePath, object value, OpenXmlConfiguration? configuration = null, CancellationToken cancellationToken = default) { using var stream = File.Create(path); - await ApplyXlsxTemplateAsync(stream, templatePath, value, configuration, cancellationToken).ConfigureAwait(false); + await ApplyTemplateAsync(stream, templatePath, value, configuration, cancellationToken).ConfigureAwait(false); } [CreateSyncVersion] - public async Task ApplyXlsxTemplateAsync(string path, Stream templateStream, object value, + public async Task ApplyTemplateAsync(string path, Stream templateStream, object value, OpenXmlConfiguration? configuration = null, CancellationToken cancellationToken = default) { using var stream = File.Create(path); @@ -25,7 +25,7 @@ public async Task ApplyXlsxTemplateAsync(string path, Stream templateStream, obj } [CreateSyncVersion] - public async Task ApplyXlsxTemplateAsync(Stream stream, string templatePath, object value, + public async Task ApplyTemplateAsync(Stream stream, string templatePath, object value, OpenXmlConfiguration? configuration = null, CancellationToken cancellationToken = default) { var template = GetOpenXmlTemplate(stream, configuration); @@ -33,7 +33,7 @@ public async Task ApplyXlsxTemplateAsync(Stream stream, string templatePath, obj } [CreateSyncVersion] - public async Task ApplyXlsxTemplateAsync(Stream stream, Stream templateStream, object value, + public async Task ApplyTemplateAsync(Stream stream, Stream templateStream, object value, OpenXmlConfiguration? configuration = null, CancellationToken cancellationToken = default) { var template = GetOpenXmlTemplate(stream, configuration); @@ -41,15 +41,15 @@ public async Task ApplyXlsxTemplateAsync(Stream stream, Stream templateStream, o } [CreateSyncVersion] - public async Task ApplyXlsxTemplateAsync(string path, byte[] templateBytes, object value, + public async Task ApplyTemplateAsync(string path, byte[] templateBytes, object value, OpenXmlConfiguration? configuration = null, CancellationToken cancellationToken = default) { using var stream = File.Create(path); - await ApplyXlsxTemplateAsync(stream, templateBytes, value, configuration, cancellationToken).ConfigureAwait(false); + await ApplyTemplateAsync(stream, templateBytes, value, configuration, cancellationToken).ConfigureAwait(false); } [CreateSyncVersion] - public async Task ApplyXlsxTemplateAsync(Stream stream, byte[] templateBytes, object value, + public async Task ApplyTemplateAsync(Stream stream, byte[] templateBytes, object value, OpenXmlConfiguration? configuration = null, CancellationToken cancellationToken = default) { var template = GetOpenXmlTemplate(stream, configuration); diff --git a/tests/MiniExcel.Csv.Tests/AsyncIssueTests.cs b/tests/MiniExcel.Csv.Tests/AsyncIssueTests.cs index 506e719a..6191f7a2 100644 --- a/tests/MiniExcel.Csv.Tests/AsyncIssueTests.cs +++ b/tests/MiniExcel.Csv.Tests/AsyncIssueTests.cs @@ -17,7 +17,7 @@ public async Task Issue253() var value = new[] { new { col1 = "世界你好" } }; using var path = AutoDeletingPath.Create(ExcelType.Csv); - await _csvExporter.ExportCsvAsync(path.ToString(), value); + await _csvExporter.ExportAsync(path.ToString(), value); const string expected = """ col1 @@ -38,7 +38,7 @@ public async Task Issue253() StreamWriterFunc = stream => new StreamWriter(stream, Encoding.GetEncoding("gb2312")) }; - await _csvExporter.ExportCsvAsync(path.ToString(), value, configuration: config); + await _csvExporter.ExportAsync(path.ToString(), value, configuration: config); const string expected = """ col1 @@ -54,7 +54,7 @@ public async Task Issue253() { var value = await cn.ExecuteReaderAsync("select '世界你好' col1"); using var path = AutoDeletingPath.Create(ExcelType.Csv); - await _csvExporter.ExportCsvAsync(path.ToString(), value); + await _csvExporter.ExportAsync(path.ToString(), value); const string expected = """ col1 @@ -76,7 +76,7 @@ public async Task Issue251() var reader = await cn.ExecuteReaderAsync(@"select '""<>+-*//}{\\n' a,1234567890 b union all select 'Hello World',-1234567890"); using var path = AutoDeletingPath.Create(ExcelType.Csv); - var rowsWritten = await _csvExporter.ExportCsvAsync(path.ToString(), reader); + var rowsWritten = await _csvExporter.ExportAsync(path.ToString(), reader); Assert.Single(rowsWritten); Assert.Equal(2, rowsWritten[0]); @@ -111,7 +111,6 @@ public enum WorkState [Fact] public async Task Issue89() { - //csv { const string text = """ @@ -127,7 +126,7 @@ public async Task Issue89() await writer.FlushAsync(); stream.Position = 0; - var q = _csvImporter.QueryCsvAsync(stream).ToBlockingEnumerable(); + var q = _csvImporter.QueryAsync(stream).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal(Issue89VO.WorkState.OnDuty, rows[0].State); @@ -135,11 +134,11 @@ public async Task Issue89() Assert.Equal(Issue89VO.WorkState.Leave, rows[2].State); var outputPath = PathHelper.GetTempPath("xlsx"); - var rowsWritten = await _openXmlExporter.ExportExcelAsync(outputPath, rows); + var rowsWritten = await _openXmlExporter.ExportAsync(outputPath, rows); Assert.Single(rowsWritten); Assert.Equal(3, rowsWritten[0]); - var q2 = _openXmlImporter.QueryExcelAsync(outputPath).ToBlockingEnumerable(); + var q2 = _openXmlImporter.QueryAsync(outputPath).ToBlockingEnumerable(); var rows2 = q2.ToList(); Assert.Equal(Issue89VO.WorkState.OnDuty, rows2[0].State); Assert.Equal(Issue89VO.WorkState.Fired, rows2[1].State); @@ -149,18 +148,18 @@ public async Task Issue89() //xlsx { var path = PathHelper.GetFile("xlsx/TestIssue89.xlsx"); - var q = _openXmlImporter.QueryExcelAsync(path).ToBlockingEnumerable(); + var q = _openXmlImporter.QueryAsync(path).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal(Issue89VO.WorkState.OnDuty, rows[0].State); Assert.Equal(Issue89VO.WorkState.Fired, rows[1].State); Assert.Equal(Issue89VO.WorkState.Leave, rows[2].State); var outputPath = PathHelper.GetTempPath(); - var rowsWritten = await _openXmlExporter.ExportExcelAsync(outputPath, rows); + var rowsWritten = await _openXmlExporter.ExportAsync(outputPath, rows); Assert.Single(rowsWritten); Assert.Equal(3, rowsWritten[0]); - var q1 = _openXmlImporter.QueryExcelAsync(outputPath).ToBlockingEnumerable(); + var q1 = _openXmlImporter.QueryAsync(outputPath).ToBlockingEnumerable(); var rows2 = q1.ToList(); Assert.Equal(Issue89VO.WorkState.OnDuty, rows2[0].State); Assert.Equal(Issue89VO.WorkState.Fired, rows2[1].State); @@ -186,10 +185,10 @@ public async Task Issue142() { using var file = AutoDeletingPath.Create(); var path = file.ToString(); - await _openXmlExporter.ExportExcelAsync(path, new[] { new Issue142VO { MyProperty1 = "MyProperty1", MyProperty2 = "MyProperty2", MyProperty3 = "MyProperty3", MyProperty4 = "MyProperty4", MyProperty5 = "MyProperty5", MyProperty6 = "MyProperty6", MyProperty7 = "MyProperty7" } }); + await _openXmlExporter.ExportAsync(path, new[] { new Issue142VO { MyProperty1 = "MyProperty1", MyProperty2 = "MyProperty2", MyProperty3 = "MyProperty3", MyProperty4 = "MyProperty4", MyProperty5 = "MyProperty5", MyProperty6 = "MyProperty6", MyProperty7 = "MyProperty7" } }); { - var q = _openXmlImporter.QueryExcelAsync(path).ToBlockingEnumerable(); + var q = _openXmlImporter.QueryAsync(path).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal("MyProperty4", rows[0].A); Assert.Equal("CustomColumnName", rows[0].B); //note @@ -209,7 +208,7 @@ public async Task Issue142() } { - var q = _openXmlImporter.QueryExcelAsync(path).ToBlockingEnumerable(); + var q = _openXmlImporter.QueryAsync(path).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal("MyProperty4", rows[0].MyProperty4); @@ -225,7 +224,7 @@ public async Task Issue142() { using var file = AutoDeletingPath.Create(ExcelType.Csv); var path = file.ToString(); - await _csvExporter.ExportCsvAsync(path, new[] { new Issue142VO { MyProperty1 = "MyProperty1", MyProperty2 = "MyProperty2", MyProperty3 = "MyProperty3", MyProperty4 = "MyProperty4", MyProperty5 = "MyProperty5", MyProperty6 = "MyProperty6", MyProperty7 = "MyProperty7" } }); + await _csvExporter.ExportAsync(path, new[] { new Issue142VO { MyProperty1 = "MyProperty1", MyProperty2 = "MyProperty2", MyProperty3 = "MyProperty3", MyProperty4 = "MyProperty4", MyProperty5 = "MyProperty5", MyProperty6 = "MyProperty6", MyProperty7 = "MyProperty7" } }); const string expected = """ MyProperty4,CustomColumnName,MyProperty5,MyProperty2,MyProperty6,,MyProperty3 @@ -235,7 +234,7 @@ public async Task Issue142() Assert.Equal(expected, await File.ReadAllTextAsync(path)); { - var q = _csvImporter.QueryCsvAsync(path).ToBlockingEnumerable(); + var q = _csvImporter.QueryAsync(path).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal("MyProperty4", rows[0].MyProperty4); @@ -251,9 +250,116 @@ public async Task Issue142() { using var path = AutoDeletingPath.Create(); Issue142VoDuplicateColumnName[] input = [new() { MyProperty1 = 0, MyProperty2 = 0, MyProperty3 = 0, MyProperty4 = 0 }]; - Assert.Throws(() => _openXmlExporter.ExportExcel(path.ToString(), input)); + Assert.Throws(() => _openXmlExporter.Export(path.ToString(), input)); } } + + /// + /// DataTable recommended to use Caption for column name first, then use columname + /// https://github.com/mini-software/MiniExcel/issues/217 + /// + [Fact] + public async Task Issue217() + { + using var table = new DataTable(); + table.Columns.Add("CustomerID"); + table.Columns.Add("CustomerName").Caption = "Name"; + table.Columns.Add("CreditLimit").Caption = "Limit"; + table.Rows.Add(1, "Jonathan", 23.44); + table.Rows.Add(2, "Bill", 56.87); + + using var path = AutoDeletingPath.Create(ExcelType.Csv); + await _csvExporter.ExportAsync(path.ToString(), table); + + var q = _csvImporter.QueryAsync(path.ToString()).ToBlockingEnumerable(); + var rows = q.ToList(); + Assert.Equal("Name", rows[0].B); + Assert.Equal("Limit", rows[0].C); + } + + + /// + /// Csv QueryAsync split comma not correct #237 + /// https://github.com/mini-software/MiniExcel/issues/237 + /// + [Fact] + public async Task Issue237() + { + using var path = AutoDeletingPath.Create(ExcelType.Csv); + var value = new[] + { + new{ id = "\"\"1,2,3\"\"" }, + new{ id = "1,2,3" } + }; + await _csvExporter.ExportAsync(path.ToString(), value); + + var q = _csvImporter.QueryAsync(path.ToString(), true).ToBlockingEnumerable(); + var rows = q.ToList(); + + Assert.Equal("\"\"1,2,3\"\"", rows[0].id); + Assert.Equal("1,2,3", rows[1].id); + } + + + /// + /// Support Custom Datetime format #241 + /// + [Fact] + public async Task Issue241() + { + Issue241Dto[] value = + [ + new() { Name = "Jack", InDate = new DateTime(2021, 01, 04) }, + new() { Name = "Henry", InDate = new DateTime(2020, 04, 05) } + ]; + + using var file = AutoDeletingPath.Create(ExcelType.Csv); + var path = file.ToString(); + var rowsWritten = await _csvExporter.ExportAsync(path, value); + + Assert.Single(rowsWritten); + Assert.Equal(2, rowsWritten[0]); + + var q1 = _csvImporter.QueryAsync(path, true).ToBlockingEnumerable(); + var rows1 = q1.ToList(); + Assert.Equal(rows1[0].InDate, "01 04, 2021"); + Assert.Equal(rows1[1].InDate, "04 05, 2020"); + + var q2 = _csvImporter.QueryAsync(path).ToBlockingEnumerable(); + var rows2 = q2.ToList(); + Assert.Equal(rows2[0].InDate, new DateTime(2021, 01, 04)); + Assert.Equal(rows2[1].InDate, new DateTime(2020, 04, 05)); + } + + + /// + /// Csv type mapping QueryAsync error "cannot be converted to xxx type" #243 + /// + [Fact] + public async Task Issue243() + { + using var path = AutoDeletingPath.Create(ExcelType.Csv); + var value = new[] + { + new { Name ="Jack",Age=25,InDate=new DateTime(2021,01,03)}, + new { Name ="Henry",Age=36,InDate=new DateTime(2020,05,03)}, + }; + + var rowsWritten = await _csvExporter.ExportAsync(path.ToString(), value); + Assert.Single(rowsWritten); + Assert.Equal(2, rowsWritten[0]); + + var q = _csvImporter.QueryAsync(path.ToString()).ToBlockingEnumerable(); + var rows = q.ToList(); + + Assert.Equal("Jack", rows[0].Name); + Assert.Equal(25, rows[0].Age); + Assert.Equal(new DateTime(2021, 01, 03), rows[0].InDate); + + Assert.Equal("Henry", rows[1].Name); + Assert.Equal(36, rows[1].Age); + Assert.Equal(new DateTime(2020, 05, 03), rows[1].InDate); + } #region Duplicated private class Issue142VO @@ -271,6 +377,21 @@ private class Issue142VO public string MyProperty5 { get; set; } //index = 2 public string MyProperty6 { get; set; } //index = 4 } + + private class Issue241Dto + { + public string Name { get; set; } + + [MiniExcelFormat("MM dd, yyyy")] + public DateTime InDate { get; set; } + } + + private class Issue243Dto + { + public string Name { get; set; } + public int Age { get; set; } + public DateTime InDate { get; set; } + } #endregion } diff --git a/tests/MiniExcel.Csv.Tests/IssueTests.cs b/tests/MiniExcel.Csv.Tests/IssueTests.cs index 29108dab..3d06a3dd 100644 --- a/tests/MiniExcel.Csv.Tests/IssueTests.cs +++ b/tests/MiniExcel.Csv.Tests/IssueTests.cs @@ -18,9 +18,34 @@ public void TestPR10() .Select(s => Regex.Replace(s.Replace("\"\"", "\""), "^\"|\"$", "")) .ToArray() }; - var rows = _csvImporter.QueryCsv(path, configuration: config).ToList(); + var rows = _csvImporter.Query(path, configuration: config).ToList(); } + /// + /// https://gitee.com/dotnetchina/MiniExcel/issues/I49RZH + /// https://github.com/mini-software/MiniExcel/issues/305 + /// + [Fact] + public void TestIssueI49RZH() + { + using var path = AutoDeletingPath.Create(ExcelType.Csv); + var value = new[] + { + new TestIssueI49RZHDto{ dd = DateTimeOffset.Parse("2022-01-22")}, + new TestIssueI49RZHDto{ dd = null} + }; + _csvExporter.Export(path.ToString(), value); + + var rows = _csvImporter.Query(path.ToString()).ToList(); + Assert.Equal("2022-01-22", rows[1].A); + } + + private class TestIssueI49RZHDto + { + [MiniExcelFormat("yyyy-MM-dd")] + public DateTimeOffset? dd { get; set; } + } + /// /// https://gitee.com/dotnetchina/MiniExcel/issues/I4X92G /// @@ -36,7 +61,7 @@ public void TestIssueI4X92G() new { ID = 1, Name = "Jack", InDate = new DateTime(2021,01,03)}, new { ID = 2, Name = "Henry", InDate = new DateTime(2020,05,03)} }; - _csvExporter.ExportCsv(path, value); + _csvExporter.Export(path, value); var content = File.ReadAllText(path); Assert.Equal( """ @@ -104,7 +129,7 @@ public void TestIssueI57WMM() using var stream = new MemoryStream(); var config = new CsvConfiguration { StreamWriterFunc = x => new StreamWriter(x, Encoding.Default, leaveOpen: true) }; - _csvExporter.ExportCsv(stream, sheets, configuration: config); + _csvExporter.Export(stream, sheets, configuration: config); stream.Seek(0, SeekOrigin.Begin); // convert stream to string @@ -114,13 +139,144 @@ public void TestIssueI57WMM() Assert.Equal("ID,Name\r\n0001,Jack\r\n", text); } + [Fact] + public void Issue217() + { + using var table = new DataTable(); + table.Columns.Add("CustomerID"); + table.Columns.Add("CustomerName").Caption = "Name"; + table.Columns.Add("CreditLimit").Caption = "Limit"; + table.Rows.Add(1, "Jonathan", 23.44); + table.Rows.Add(2, "Bill", 56.87); + + + + using var path = AutoDeletingPath.Create(ExcelType.Csv); + _csvExporter.Export(path.ToString(), table); + + var rows = _csvImporter.Query(path.ToString()).ToList(); + Assert.Equal("Name", rows[0].B); + Assert.Equal("Limit", rows[0].C); + } + + /// + /// Csv Query split comma not correct #237 + /// https://github.com/mini-software/MiniExcel/issues/237 + /// + [Fact] + public void Issue237() + { + var value = new[] + { + new{ id = "\"\"1,2,3\"\"" }, + new{ id = "1,2,3" } + }; + + using var path = AutoDeletingPath.Create(ExcelType.Csv); + _csvExporter.Export(path.ToString(), value); + + var rows = _csvImporter.Query(path.ToString(), true).ToList(); + + Assert.Equal("\"\"1,2,3\"\"", rows[0].id); + Assert.Equal("1,2,3", rows[1].id); + } + + /// + /// Support Custom Datetime format #241 + /// + [Fact] + public void Issue241() + { + Issue241Dto[] value = + [ + new() { Name = "Jack", InDate = new DateTime(2021, 01, 04) }, + new() { Name = "Henry", InDate = new DateTime(2020, 04, 05) } + ]; + + using var path = AutoDeletingPath.Create(ExcelType.Csv); + _csvExporter.Export(path.ToString(), value); + + var rows1 = _csvImporter.Query(path.ToString(), true).ToList(); + Assert.Equal(rows1[0].InDate, "01 04, 2021"); + Assert.Equal(rows1[1].InDate, "04 05, 2020"); + + var rows2 = _csvImporter.Query(path.ToString()).ToList(); + Assert.Equal(rows2[0].InDate, new DateTime(2021, 01, 04)); + Assert.Equal(rows2[1].InDate, new DateTime(2020, 04, 05)); + } + + private class Issue241Dto + { + public string Name { get; set; } + + [MiniExcelFormat("MM dd, yyyy")] + public DateTime InDate { get; set; } + } + + + /// + /// Csv type mapping Query error "cannot be converted to xxx type" #243 + /// + [Fact] + public void Issue243() + { + using var path = AutoDeletingPath.Create(ExcelType.Csv); + var value = new[] + { + new { Name = "Jack", Age = 25, InDate = new DateTime(2021,01,03) }, + new { Name = "Henry", Age = 36, InDate = new DateTime(2020,05,03) }, + }; + _csvExporter.Export(path.ToString(), value); + + var rows = _csvImporter.Query(path.ToString()).ToList(); + Assert.Equal("Jack", rows[0].Name); + Assert.Equal(25, rows[0].Age); + Assert.Equal(new DateTime(2021, 01, 03), rows[0].InDate); + + Assert.Equal("Henry", rows[1].Name); + Assert.Equal(36, rows[1].Age); + Assert.Equal(new DateTime(2020, 05, 03), rows[1].InDate); + } + + private class Issue243Dto + { + public string Name { get; set; } + public int Age { get; set; } + public DateTime InDate { get; set; } + } + + + /// + /// https://github.com/mini-software/MiniExcel/issues/312 + /// + [Fact] + public void TestIssue312() + { + using var path = AutoDeletingPath.Create(ExcelType.Csv); + TestIssue312Dto[] value = + [ + new() { Value = 12345.6789}, + new() { Value = null} + ]; + _csvExporter.Export(path.ToString(), value); + + var rows = _csvImporter.Query(path.ToString()).ToList(); + Assert.Equal("12,345.68", rows[1].A); + } + + private class TestIssue312Dto + { + [MiniExcelFormat("0,0.00")] + public double? Value { get; set; } + } + [Fact] public async Task TestIssue338() { Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); { var path = PathHelper.GetFile("csv/TestIssue338.csv"); - var row = _csvImporter.QueryCsvAsync(path).ToBlockingEnumerable().FirstOrDefault(); + var row = _csvImporter.QueryAsync(path).ToBlockingEnumerable().FirstOrDefault(); Assert.Equal("���IJ�������", row!.A); } { @@ -129,7 +285,7 @@ public async Task TestIssue338() { StreamReaderFunc = stream => new StreamReader(stream, Encoding.GetEncoding("gb2312")) }; - var row = _csvImporter.QueryCsvAsync(path, configuration: config).ToBlockingEnumerable().FirstOrDefault(); + var row = _csvImporter.QueryAsync(path, configuration: config).ToBlockingEnumerable().FirstOrDefault(); Assert.Equal("中文测试内容", row!.A); } { @@ -140,7 +296,7 @@ public async Task TestIssue338() }; await using (var stream = new FileStream(path, FileMode.Open, FileAccess.Read)) { - var row = _csvImporter.QueryCsvAsync(stream, configuration: config).ToBlockingEnumerable().FirstOrDefault(); + var row = _csvImporter.QueryAsync(stream, configuration: config).ToBlockingEnumerable().FirstOrDefault(); Assert.Equal("中文测试内容", row!.A); } } @@ -156,7 +312,7 @@ public void TestIssueI4WDA9() value.Rows.Add("\"Jack\""); } - _csvExporter.ExportCsv(path.ToString(), value); + _csvExporter.Export(path.ToString(), value); Assert.Equal("\"\"\"name\"\"\"\r\n\"\"\"Jack\"\"\"\r\n", File.ReadAllText(path.ToString())); } @@ -175,7 +331,7 @@ public void TestIssue316() { Culture = new CultureInfo("fr-FR"), }; - _openXmlExporter.ExportExcel(path, value, configuration: config); + _openXmlExporter.Export(path, value, configuration: config); //Datetime error Assert.Throws(() => @@ -184,11 +340,11 @@ public void TestIssue316() { Culture = new CultureInfo("en-US"), }; - _ = _openXmlImporter.QueryExcel(path, configuration: conf).ToList(); + _ = _openXmlImporter.Query(path, configuration: conf).ToList(); }); // dynamic - var rows = _openXmlImporter.QueryExcel(path, true).ToList(); + var rows = _openXmlImporter.Query(path, true).ToList(); Assert.Equal("123456,789", rows[0].Amount); Assert.Equal("31/01/2018 00:00:00", rows[0].CreateTime); } @@ -206,11 +362,11 @@ public void TestIssue316() { Culture = new CultureInfo("fr-FR"), }; - _openXmlExporter.ExportExcel(path, value, configuration: config); + _openXmlExporter.Export(path, value, configuration: config); } { - var rows = _openXmlImporter.QueryExcel(path, true).ToList(); + var rows = _openXmlImporter.Query(path, true).ToList(); Assert.Equal("123456,789", rows[0].Amount); Assert.Equal("12/05/2018 00:00:00", rows[0].CreateTime); } @@ -220,7 +376,7 @@ public void TestIssue316() { Culture = new CultureInfo("en-US"), }; - var rows = _openXmlImporter.QueryExcel(path, configuration: config).ToList(); + var rows = _openXmlImporter.Query(path, configuration: config).ToList(); Assert.Equal("2018-12-05 00:00:00", rows[0].CreateTime.ToString("yyyy-MM-dd HH:mm:ss")); Assert.Equal(123456789m, rows[0].Amount); @@ -231,7 +387,7 @@ public void TestIssue316() { Culture = new CultureInfo("fr-FR"), }; - var rows = _openXmlImporter.QueryExcel(path, configuration: config).ToList(); + var rows = _openXmlImporter.Query(path, configuration: config).ToList(); Assert.Equal("2018-05-12 00:00:00", rows[0].CreateTime.ToString("yyyy-MM-dd HH:mm:ss")); Assert.Equal(123456.789m, rows[0].Amount); @@ -251,7 +407,7 @@ public void TestIssue316() { Culture = new CultureInfo("fr-FR"), }; - _csvExporter.ExportCsv(path, value, configuration: config); + _csvExporter.Export(path, value, configuration: config); //Datetime error Assert.Throws(() => @@ -260,11 +416,11 @@ public void TestIssue316() { Culture = new CultureInfo("en-US") }; - _ = _csvImporter.QueryCsv(path, configuration: conf).ToList(); + _ = _csvImporter.Query(path, configuration: conf).ToList(); }); // dynamic - var rows = _csvImporter.QueryCsv(path, true).ToList(); + var rows = _csvImporter.Query(path, true).ToList(); Assert.Equal("123456,789", rows[0].Amount); Assert.Equal("31/01/2018 00:00:00", rows[0].CreateTime); } @@ -283,11 +439,11 @@ public void TestIssue316() { Culture = new CultureInfo("fr-FR"), }; - _csvExporter.ExportCsv(path, value, configuration: config); + _csvExporter.Export(path, value, configuration: config); } { - var rows = _csvImporter.QueryCsv(path, true).ToList(); + var rows = _csvImporter.Query(path, true).ToList(); Assert.Equal("123456,789", rows[0].Amount); Assert.Equal("12/05/2018 00:00:00", rows[0].CreateTime); } @@ -297,7 +453,7 @@ public void TestIssue316() { Culture = new CultureInfo("en-US"), }; - var rows = _csvImporter.QueryCsv(path, configuration: config).ToList(); + var rows = _csvImporter.Query(path, configuration: config).ToList(); Assert.Equal("2018-12-05 00:00:00", rows[0].CreateTime.ToString("yyyy-MM-dd HH:mm:ss")); Assert.Equal(123456789m, rows[0].Amount); @@ -308,7 +464,7 @@ public void TestIssue316() { Culture = new CultureInfo("fr-FR"), }; - var rows = _csvImporter.QueryCsv(path, configuration: config).ToList(); + var rows = _csvImporter.Query(path, configuration: config).ToList(); Assert.Equal("2018-05-12 00:00:00", rows[0].CreateTime.ToString("yyyy-MM-dd HH:mm:ss")); Assert.Equal(123456.789m, rows[0].Amount); @@ -325,7 +481,7 @@ public void TestIssue298() { var path = PathHelper.GetFile("/csv/TestIssue298.csv"); #pragma warning disable CS0618 // Type or member is obsolete - var dt = _csvImporter.QueryCsvAsDataTable(path); + var dt = _csvImporter.QueryAsDataTable(path); #pragma warning restore CS0618 Assert.Equal(["ID", "Name", "Age"], dt.Columns.Cast().Select(x => x.ColumnName)); } @@ -356,7 +512,7 @@ public void TestIssue292() using var path = AutoDeletingPath.Create(); _csvExporter.ConvertCsvToXlsx(csvPath, path.ToString()); - var rows = _openXmlImporter.QueryExcel(path.ToString()).ToList(); + var rows = _openXmlImporter.Query(path.ToString()).ToList(); Assert.Equal(3, rows.Count); Assert.Equal("Name", rows[0].A); Assert.Equal("Age", rows[0].B); @@ -378,8 +534,8 @@ public void TestIssue293() var path = PathHelper.GetFile("/csv/Test5x2.csv"); using var tempPath = AutoDeletingPath.Create(); using var csv = File.OpenRead(path); - var value = _csvImporter.QueryCsv(csv, useHeaderRow: false); - _openXmlExporter.ExportExcel(tempPath.ToString(), value, printHeader: false); + var value = _csvImporter.Query(csv, useHeaderRow: false); + _openXmlExporter.Export(tempPath.ToString(), value, printHeader: false); } /// @@ -390,7 +546,7 @@ public void TestIssue279() { var path = PathHelper.GetFile("/csv/TestHeader.csv"); #pragma warning disable CS0618 // Type or member is obsolete - using var dt = _csvImporter.QueryCsvAsDataTable(path); + using var dt = _csvImporter.QueryAsDataTable(path); #pragma warning restore CS0618 Assert.Equal("A1", dt.Rows[0]["Column1"]); Assert.Equal("A2", dt.Rows[1]["Column1"]); @@ -408,7 +564,7 @@ public void TestIssue261() using var path = AutoDeletingPath.Create(); _csvExporter.ConvertCsvToXlsx(csvPath, path.FilePath); - var rows = _openXmlImporter.QueryExcel(path.ToString()).ToList(); + var rows = _openXmlImporter.Query(path.ToString()).ToList(); Assert.Equal("Name", rows[0].A); Assert.Equal("Jack", rows[1].A); @@ -431,7 +587,7 @@ public void Issue253() { var value = new[] { new { col1 = "世界你好" } }; using var path = AutoDeletingPath.Create(ExcelType.Csv); - _csvExporter.ExportCsv(path.ToString(), value); + _csvExporter.Export(path.ToString(), value); const string expected = """ col1 @@ -449,7 +605,7 @@ public void Issue253() { StreamWriterFunc = stream => new StreamWriter(stream, Encoding.GetEncoding("gb2312")) }; - _csvExporter.ExportCsv(path.ToString(), value, configuration: config); + _csvExporter.Export(path.ToString(), value, configuration: config); const string expected = """ col1 @@ -464,7 +620,7 @@ public void Issue253() { var value = cn.ExecuteReader("select '世界你好' col1"); using var path = AutoDeletingPath.Create(ExcelType.Csv); - _csvExporter.ExportCsv(path.ToString(), value); + _csvExporter.Export(path.ToString(), value); const string expected = """ col1 @@ -484,7 +640,7 @@ public void Issue251() using var cn = Db.GetConnection(); using var reader = cn.ExecuteReader(@"select '""<>+-*//}{\\n' a,1234567890 b union all select 'Hello World',-1234567890"); using var path = AutoDeletingPath.Create(ExcelType.Csv); - _csvExporter.ExportCsv(path.ToString(), reader); + _csvExporter.Export(path.ToString(), reader); const string expected = """" a,b @@ -531,15 +687,15 @@ public void Issue89() writer.Write(text); writer.Flush(); stream.Position = 0; - var rows = _csvImporter.QueryCsv(stream, useHeaderRow: true).ToList(); + var rows = _csvImporter.Query(stream, useHeaderRow: true).ToList(); Assert.Equal(nameof(Issue89VO.WorkState.OnDuty), rows[0].State); Assert.Equal(nameof(Issue89VO.WorkState.Fired), rows[1].State); Assert.Equal(nameof(Issue89VO.WorkState.Leave), rows[2].State); using var path = AutoDeletingPath.Create(ExcelType.Csv); - _csvExporter.ExportCsv(path.ToString(), rows); - var rows2 = _csvImporter.QueryCsv(path.ToString()).ToList(); + _csvExporter.Export(path.ToString(), rows); + var rows2 = _csvImporter.Query(path.ToString()).ToList(); Assert.Equal(Issue89VO.WorkState.OnDuty, rows2[0].State); Assert.Equal(Issue89VO.WorkState.Fired, rows2[1].State); @@ -549,15 +705,15 @@ public void Issue89() //xlsx { var path = PathHelper.GetFile("xlsx/TestIssue89.xlsx"); - var rows = _openXmlImporter.QueryExcel(path).ToList(); + var rows = _openXmlImporter.Query(path).ToList(); Assert.Equal(Issue89VO.WorkState.OnDuty, rows[0].State); Assert.Equal(Issue89VO.WorkState.Fired, rows[1].State); Assert.Equal(Issue89VO.WorkState.Leave, rows[2].State); using var xlsxPath = AutoDeletingPath.Create(); - _openXmlExporter.ExportExcel(xlsxPath.ToString(), rows); - var rows2 = _openXmlImporter.QueryExcel(xlsxPath.ToString()).ToList(); + _openXmlExporter.Export(xlsxPath.ToString(), rows); + var rows2 = _openXmlImporter.Query(xlsxPath.ToString()).ToList(); Assert.Equal(Issue89VO.WorkState.OnDuty, rows2[0].State); Assert.Equal(Issue89VO.WorkState.Fired, rows2[1].State); @@ -608,12 +764,12 @@ public void Issue142() MyProperty7 = "MyProperty7" } ]; - var rowsWritten = _openXmlExporter.ExportExcel(path, values); + var rowsWritten = _openXmlExporter.Export(path, values); Assert.Single(rowsWritten); Assert.Equal(1, rowsWritten[0]); { - var rows = _openXmlImporter.QueryExcel(path).ToList(); + var rows = _openXmlImporter.Query(path).ToList(); Assert.Equal("MyProperty4", rows[0].A); Assert.Equal("CustomColumnName", rows[0].B); @@ -633,7 +789,7 @@ public void Issue142() } { - var rows = _openXmlImporter.QueryExcel(path).ToList(); + var rows = _openXmlImporter.Query(path).ToList(); Assert.Equal("MyProperty4", rows[0].MyProperty4); Assert.Equal("MyProperty1", rows[0].MyProperty1); @@ -657,7 +813,7 @@ public void Issue142() MyProperty7 = "MyProperty7" } ]; - var rowsWritten = _csvExporter.ExportCsv(path, values); + var rowsWritten = _csvExporter.Export(path, values); Assert.Single(rowsWritten); Assert.Equal(1, rowsWritten[0]); @@ -671,7 +827,7 @@ public void Issue142() Assert.Equal(expected, File.ReadAllText(path)); { - var rows = _csvImporter.QueryCsv(path).ToList(); + var rows = _csvImporter.Query(path).ToList(); Assert.Equal("MyProperty4", rows[0].MyProperty4); Assert.Equal("MyProperty1", rows[0].MyProperty1); @@ -689,7 +845,7 @@ public void Issue142() [ new() { MyProperty1 = 0, MyProperty2 = 0, MyProperty3 = 0, MyProperty4 = 0 } ]; - Assert.Throws(() => _csvExporter.ExportCsv(path.ToString(), input)); + Assert.Throws(() => _csvExporter.Export(path.ToString(), input)); } } @@ -699,13 +855,13 @@ public void Issue142_Query() const string path = "../../../../../samples/xlsx/TestIssue142.xlsx"; const string csvPath = "../../../../../samples/csv/TestIssue142.csv"; { - var rows = _openXmlImporter.QueryExcel(path).ToList(); + var rows = _openXmlImporter.Query(path).ToList(); Assert.Equal(0, rows[0].MyProperty1); } - Assert.Throws(() => _openXmlImporter.QueryExcel(path).ToList()); + Assert.Throws(() => _openXmlImporter.Query(path).ToList()); - var rowsXlsx = _openXmlImporter.QueryExcel(path).ToList(); + var rowsXlsx = _openXmlImporter.Query(path).ToList(); Assert.Equal("CustomColumnName", rowsXlsx[0].MyProperty1); Assert.Null(rowsXlsx[0].MyProperty7); Assert.Equal("MyProperty2", rowsXlsx[0].MyProperty2); @@ -714,7 +870,7 @@ public void Issue142_Query() Assert.Equal("MyProperty102", rowsXlsx[0].MyProperty5); Assert.Equal("MyProperty6", rowsXlsx[0].MyProperty6); - var rowsCsv = _csvImporter.QueryCsv(csvPath).ToList(); + var rowsCsv = _csvImporter.Query(csvPath).ToList(); Assert.Equal("CustomColumnName", rowsCsv[0].MyProperty1); Assert.Null(rowsCsv[0].MyProperty7); Assert.Equal("MyProperty2", rowsCsv[0].MyProperty2); @@ -769,11 +925,11 @@ public void Issue507_1() // create using (var stream = File.Create(path)) { - _csvExporter.ExportCsv(stream, values, configuration: config); + _csvExporter.Export(stream, values, configuration: config); } // read - var getRowsInfo = _csvImporter.QueryCsv(path, configuration: config).ToArray(); + var getRowsInfo = _csvImporter.Query(path, configuration: config).ToArray(); Assert.Equal(values.Length, getRowsInfo.Length); @@ -822,11 +978,11 @@ public void Issue507_2() // create using (var stream = File.Create(path)) { - _csvExporter.ExportCsv(stream, values, true, config); + _csvExporter.Export(stream, values, true, config); } // read - var getRowsInfo = _csvImporter.QueryCsv(path, configuration: config).ToArray(); + var getRowsInfo = _csvImporter.Query(path, configuration: config).ToArray(); Assert.Equal(values.Length, getRowsInfo.Length); File.Delete(path); @@ -848,7 +1004,7 @@ public void Issue507_3_MismatchedQuoteCsv() using var stream = new MemoryStream(Encoding.UTF8.GetBytes("A,B,C\n\"r1a: no end quote,r1b,r1c")); // read - var getRowsInfo = _csvImporter.QueryCsv(stream, configuration: config).ToArray(); + var getRowsInfo = _csvImporter.Query(stream, configuration: config).ToArray(); Assert.Equal(2, getRowsInfo.Length); } diff --git a/tests/MiniExcel.Csv.Tests/MiniExcelCsvAsycTests.cs b/tests/MiniExcel.Csv.Tests/MiniExcelCsvAsycTests.cs index 75ec2a22..032f3756 100644 --- a/tests/MiniExcel.Csv.Tests/MiniExcelCsvAsycTests.cs +++ b/tests/MiniExcel.Csv.Tests/MiniExcelCsvAsycTests.cs @@ -2,8 +2,8 @@ public class MiniExcelCsvAsycTests { - private readonly CsvExporter _exporter = MiniExcel.Exporter.GetCsvExporter(); - private readonly CsvImporter _importer = MiniExcel.Importer.GetCsvImporter(); + private readonly CsvExporter _csvExporter = MiniExcel.Exporter.GetCsvExporter(); + private readonly CsvImporter _csvImporter = MiniExcel.Importer.GetCsvImporter(); [Fact] public async Task Gb2312_Encoding_Read_Test() @@ -14,7 +14,7 @@ public async Task Gb2312_Encoding_Read_Test() { StreamReaderFunc = stream => new StreamReader(stream, encoding: Encoding.GetEncoding("gb2312")) }; - var q = _importer.QueryCsvAsync(path, true, configuration: config).ToBlockingEnumerable(); + var q = _csvImporter.QueryAsync(path, true, configuration: config).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal("世界你好", rows[0].栏位1); } @@ -44,7 +44,7 @@ public async Task SeperatorTest() } ]; - var rowsWritten = await _exporter.ExportCsvAsync(path, values, configuration: new CsvConfiguration { Seperator = ';' }); + var rowsWritten = await _csvExporter.ExportAsync(path, values, configuration: new CsvConfiguration { Seperator = ';' }); Assert.Equal(2, rowsWritten[0]); const string expected = @@ -66,7 +66,7 @@ public async Task SaveAsByDictionary() var path = file.ToString(); var table = new List>(); - await _exporter.ExportCsvAsync(path, table); + await _csvExporter.ExportAsync(path, table); Assert.Equal("\r\n", await File.ReadAllTextAsync(path)); } @@ -75,7 +75,7 @@ public async Task SaveAsByDictionary() var path = file.ToString(); var table = new Dictionary(); //TODO - Assert.Throws(() => _exporter.ExportCsv(path, table)); + Assert.Throws(() => _csvExporter.Export(path, table)); } { @@ -99,7 +99,7 @@ public async Task SaveAsByDictionary() { "d", new DateTime(2021, 1, 2) } } ]; - var rowsWritten = await _exporter.ExportCsvAsync(path, values); + var rowsWritten = await _csvExporter.ExportAsync(path, values); Assert.Equal(2, rowsWritten[0]); using var reader = new StreamReader(path); @@ -140,7 +140,7 @@ public async Task SaveAsByDictionary() } ]; - var rowsWritten = await _exporter.ExportCsvAsync(path, values); + var rowsWritten = await _csvExporter.ExportAsync(path, values); Assert.Equal(2, rowsWritten[0]); using var reader = new StreamReader(path); @@ -168,7 +168,7 @@ public async Task SaveAsByDataTableTest() var path1 = file1.ToString(); var emptyTable = new DataTable(); - await _exporter.ExportCsvAsync(path1, emptyTable); + await _csvExporter.ExportAsync(path1, emptyTable); var text = await File.ReadAllTextAsync(path1); Assert.Equal("\r\n", text); @@ -185,7 +185,7 @@ public async Task SaveAsByDataTableTest() table.Rows.Add(@"""<>+-*//}{\\n", 1234567890, true, new DateTime(2021, 1, 1)); table.Rows.Add("Hello World", -1234567890, false, new DateTime(2021, 1, 2)); - var rowsWritten = await _exporter.ExportCsvAsync(path2, table); + var rowsWritten = await _csvExporter.ExportAsync(path2, table); Assert.Equal(2, rowsWritten[0]); using var reader = new StreamReader(path2); @@ -217,13 +217,13 @@ public async Task CsvExcelTypeTest() var path = file.ToString(); var input = new[] { new { A = "Test1", B = "Test2" } }; - await _exporter.ExportCsvAsync(path, input); + await _csvExporter.ExportAsync(path, input); var texts = await File.ReadAllLinesAsync(path); Assert.Equal("A,B", texts[0]); Assert.Equal("Test1,Test2", texts[1]); - var q = _importer.QueryCsvAsync(path).ToBlockingEnumerable(); + var q = _csvImporter.QueryAsync(path).ToBlockingEnumerable(); var rows1 = q.ToList(); Assert.Equal("A", rows1[0].A); @@ -245,7 +245,7 @@ public async Task Create2x2_Test() using var file = AutoDeletingPath.Create(ExcelType.Csv); var path = file.ToString(); - await _exporter.ExportCsvAsync(path, new[] + await _csvExporter.ExportAsync(path, new[] { new { c1 = "A1", c2 = "B1"}, new { c1 = "A2", c2 = "B2"}, @@ -253,7 +253,7 @@ await _exporter.ExportCsvAsync(path, new[] await using (var stream = File.OpenRead(path)) { - var rows = _importer.QueryCsvAsync(stream, useHeaderRow: true).ToBlockingEnumerable().ToList(); + var rows = _csvImporter.QueryAsync(stream, useHeaderRow: true).ToBlockingEnumerable().ToList(); Assert.Equal("A1", rows[0].c1); Assert.Equal("B1", rows[0].c2); Assert.Equal("A2", rows[1].c1); @@ -261,7 +261,7 @@ await _exporter.ExportCsvAsync(path, new[] } { - var rows = _importer.QueryCsvAsync(path, useHeaderRow: true).ToBlockingEnumerable().ToList(); + var rows = _csvImporter.QueryAsync(path, useHeaderRow: true).ToBlockingEnumerable().ToList(); Assert.Equal("A1", rows[0].c1); Assert.Equal("B1", rows[0].c2); Assert.Equal("A2", rows[1].c1); @@ -275,7 +275,7 @@ public async Task CsvTypeMappingTest() using var file = AutoDeletingPath.Create(ExcelType.Csv); var path = file.ToString(); - await _exporter.ExportCsvAsync(path, new[] + await _csvExporter.ExportAsync(path, new[] { new { c1 = "A1", c2 = "B1"}, new { c1 = "A2", c2 = "B2"} @@ -283,7 +283,7 @@ await _exporter.ExportCsvAsync(path, new[] await using (var stream = File.OpenRead(path)) { - var rows = _importer.QueryCsv(stream).ToList(); + var rows = _csvImporter.Query(stream).ToList(); Assert.Equal("A1", rows[0].c1); Assert.Equal("B1", rows[0].c2); Assert.Equal("A2", rows[1].c1); @@ -291,7 +291,7 @@ await _exporter.ExportCsvAsync(path, new[] } { - var rows = _importer.QueryCsv(path).ToList(); + var rows = _csvImporter.Query(path).ToList(); Assert.Equal("A1", rows[0].c1); Assert.Equal("B1", rows[0].c2); Assert.Equal("A2", rows[1].c1); @@ -305,7 +305,7 @@ public async Task CsvReadEmptyStringAsNullTest() using var file = AutoDeletingPath.Create(ExcelType.Csv); var path = file.ToString(); - await _exporter.ExportCsvAsync(path, new[] + await _csvExporter.ExportAsync(path, new[] { new { c1 = (string?)"A1", c2 = (string?)null}, new { c1 = (string?)null, c2 = (string?)null} @@ -313,7 +313,7 @@ await _exporter.ExportCsvAsync(path, new[] await using (var stream = File.OpenRead(path)) { - var rows = _importer.QueryCsv(stream).ToList(); + var rows = _csvImporter.Query(stream).ToList(); Assert.Equal("A1", rows[0].c1); Assert.Equal(string.Empty, rows[0].c2); Assert.Equal(string.Empty, rows[1].c1); @@ -321,7 +321,7 @@ await _exporter.ExportCsvAsync(path, new[] } { - var rows = _importer.QueryCsv(path).ToList(); + var rows = _csvImporter.Query(path).ToList(); Assert.Equal("A1", rows[0].c1); Assert.Equal(string.Empty, rows[0].c2); Assert.Equal(string.Empty, rows[1].c1); @@ -331,7 +331,7 @@ await _exporter.ExportCsvAsync(path, new[] var config = new CsvConfiguration { ReadEmptyStringAsNull = true }; await using (var stream = File.OpenRead(path)) { - var rows = _importer.QueryCsv(stream, configuration: config).ToList(); + var rows = _csvImporter.Query(stream, configuration: config).ToList(); Assert.Equal("A1", rows[0].c1); Assert.Null(rows[0].c2); Assert.Null(rows[1].c1); @@ -339,7 +339,7 @@ await _exporter.ExportCsvAsync(path, new[] } { - var rows = _importer.QueryCsv(path, configuration: config).ToList(); + var rows = _csvImporter.Query(path, configuration: config).ToList(); Assert.Equal("A1", rows[0].c1); Assert.Null(rows[0].c2); Assert.Null(rows[1].c1); @@ -361,10 +361,10 @@ static async IAsyncEnumerable GetValues() } #pragma warning restore CS1998 // Async method lacks 'await' operators and will run synchronously - var rowsWritten = await _exporter.ExportCsvAsync(path, GetValues()); + var rowsWritten = await _csvExporter.ExportAsync(path, GetValues()); Assert.Equal(2, rowsWritten[0]); - var results = _importer.QueryCsv(path).ToList(); + var results = _csvImporter.Query(path).ToList(); Assert.Equal(2, results.Count); Assert.Equal("A1", results[0].c1); Assert.Equal("B1", results[0].c2); diff --git a/tests/MiniExcel.Csv.Tests/MiniExcelCsvTests.cs b/tests/MiniExcel.Csv.Tests/MiniExcelCsvTests.cs index bdf175c0..2dd6f4e1 100644 --- a/tests/MiniExcel.Csv.Tests/MiniExcelCsvTests.cs +++ b/tests/MiniExcel.Csv.Tests/MiniExcelCsvTests.cs @@ -2,8 +2,8 @@ public class MiniExcelCsvTests { - private readonly CsvExporter _exporter = MiniExcel.Exporter.GetCsvExporter(); - private readonly CsvImporter _importer = MiniExcel.Importer.GetCsvImporter(); + private readonly CsvExporter _csvExporter = MiniExcel.Exporter.GetCsvExporter(); + private readonly CsvImporter _csvImporter = MiniExcel.Importer.GetCsvImporter(); [Fact] public void gb2312_Encoding_Read_Test() @@ -14,7 +14,7 @@ public void gb2312_Encoding_Read_Test() { StreamReaderFunc = stream => new StreamReader(stream, encoding: Encoding.GetEncoding("gb2312")) }; - var rows = _importer.QueryCsv(path, true, configuration: config).ToList(); + var rows = _csvImporter.Query(path, true, configuration: config).ToList(); Assert.Equal("世界你好", rows[0].栏位1); } @@ -42,7 +42,7 @@ public void SeperatorTest() { "d", new DateTime(2021, 1, 2) } } ]; - var rowsWritten = _exporter.ExportCsv(path, values, configuration: new CsvConfiguration { Seperator = ';' }); + var rowsWritten = _csvExporter.Export(path, values, configuration: new CsvConfiguration { Seperator = ';' }); Assert.Equal(2, rowsWritten[0]); const string expected = @@ -79,7 +79,7 @@ public void DontQuoteWhitespacesTest() { "d", new DateTime(2021, 1, 2) } } ]; - var rowsWritten = _exporter.ExportCsv(path, values, configuration: new CsvConfiguration { QuoteWhitespaces = false }); + var rowsWritten = _csvExporter.Export(path, values, configuration: new CsvConfiguration { QuoteWhitespaces = false }); Assert.Equal(2, rowsWritten[0]); const string expected = @@ -116,7 +116,7 @@ public void AlwaysQuoteTest() } ]; - _exporter.ExportCsv(path, values, configuration: new CsvConfiguration { AlwaysQuote = true }); + _csvExporter.Export(path, values, configuration: new CsvConfiguration { AlwaysQuote = true }); const string expected = """" "a","b","c","d" @@ -144,7 +144,7 @@ public void QuoteSpecialCharacters() } ]; - var rowsWritten = _exporter.ExportCsv(path, values, configuration: new CsvConfiguration()); + var rowsWritten = _csvExporter.Export(path, values, configuration: new CsvConfiguration()); Assert.Equal(1, rowsWritten[0]); const string expected = "a,b,c,d\r\n\"potato,banana\",\"text\ntest\",\"text\rpotato\",\"2021-01-01 00:00:00\"\r\n"; @@ -157,7 +157,7 @@ public void SaveAsByDictionary() { using var path = AutoDeletingPath.Create(ExcelType.Csv); var table = new List>(); - _exporter.ExportCsv(path.ToString(), table); + _csvExporter.Export(path.ToString(), table); Assert.Equal("\r\n", File.ReadAllText(path.ToString())); } @@ -165,7 +165,7 @@ public void SaveAsByDictionary() using var path = AutoDeletingPath.Create(ExcelType.Csv); var table = new Dictionary(); //TODO - Assert.Throws(() => _exporter.ExportCsv(path.ToString(), table)); + Assert.Throws(() => _csvExporter.Export(path.ToString(), table)); } { @@ -189,7 +189,7 @@ public void SaveAsByDictionary() } ]; - var rowsWritten = _exporter.ExportCsv(path.ToString(), values); + var rowsWritten = _csvExporter.Export(path.ToString(), values); Assert.Equal(2, rowsWritten[0]); using var reader = new StreamReader(path.ToString()); @@ -226,7 +226,7 @@ public void SaveAsByDictionary() { 4, new DateTime(2021, 1, 2) } } ]; - _exporter.ExportCsv(path.ToString(), values); + _csvExporter.Export(path.ToString(), values); using (var reader = new StreamReader(path.ToString())) using (var csv = new global::CsvHelper.CsvReader(reader, CultureInfo.InvariantCulture)) @@ -257,7 +257,7 @@ public void SaveAsByDataTableTest() using var path = AutoDeletingPath.Create(ExcelType.Csv); var table = new DataTable(); - _exporter.ExportCsv(path.ToString(), table); + _csvExporter.Export(path.ToString(), table); var text = File.ReadAllText(path.ToString()); Assert.Equal("\r\n", text); @@ -276,7 +276,7 @@ public void SaveAsByDataTableTest() table.Rows.Add("Hello World", -1234567890, false, new DateTime(2021, 1, 2)); } - var rowsWritten = _exporter.ExportCsv(path.ToString(), table); + var rowsWritten = _csvExporter.Export(path.ToString(), table); Assert.Equal(2, rowsWritten[0]); using (var reader = new StreamReader(path.ToString())) @@ -318,13 +318,13 @@ public void CsvExcelTypeTest() var path = file.ToString(); var input = new[] { new { A = "Test1", B = "Test2" } }; - _exporter.ExportCsv(path, input); + _csvExporter.Export(path, input); var texts = File.ReadAllLines(path); Assert.Equal("A,B", texts[0]); Assert.Equal("Test1,Test2", texts[1]); - var rows = _importer.QueryCsv(path).ToList(); + var rows = _csvImporter.Query(path).ToList(); Assert.Equal("A", rows[0].A); Assert.Equal("B", rows[0].B); Assert.Equal("Test1", rows[1].A); @@ -343,7 +343,7 @@ public void Create2x2_Test() using var file = AutoDeletingPath.Create(ExcelType.Csv); var path = file.ToString(); - _exporter.ExportCsv(path, new[] + _csvExporter.Export(path, new[] { new { c1 = "A1", c2 = "B1"}, new { c1 = "A2", c2 = "B2"}, @@ -353,7 +353,7 @@ public void Create2x2_Test() using (var stream = File.OpenRead(path)) { - var rows = _importer.QueryCsv(stream, useHeaderRow: true).ToList(); + var rows = _csvImporter.Query(stream, useHeaderRow: true).ToList(); Assert.Equal("A1", rows[0].c1); Assert.Equal("B1", rows[0].c2); Assert.Equal("A2", rows[1].c1); @@ -361,7 +361,7 @@ public void Create2x2_Test() } { - var rows = _importer.QueryCsv(path, useHeaderRow: true).ToList(); + var rows = _csvImporter.Query(path, useHeaderRow: true).ToList(); Assert.Equal("A1", rows[0].c1); Assert.Equal("B1", rows[0].c2); Assert.Equal("A2", rows[1].c1); @@ -375,7 +375,7 @@ public void CsvTypeMappingTest() using var file = AutoDeletingPath.Create(ExcelType.Csv); var path = file.ToString(); - _exporter.ExportCsv(path, new[] + _csvExporter.Export(path, new[] { new { c1 = "A1", c2 = "B1"}, new { c1 = "A2", c2 = "B2"}, @@ -383,7 +383,7 @@ public void CsvTypeMappingTest() using (var stream = File.OpenRead(path)) { - var rows = _importer.QueryCsv(stream).ToList(); + var rows = _csvImporter.Query(stream).ToList(); Assert.Equal("A1", rows[0].c1); Assert.Equal("B1", rows[0].c2); Assert.Equal("A2", rows[1].c1); @@ -391,7 +391,7 @@ public void CsvTypeMappingTest() } { - var rows = _importer.QueryCsv(path).ToList(); + var rows = _csvImporter.Query(path).ToList(); Assert.Equal("A1", rows[0].c1); Assert.Equal("B1", rows[0].c2); Assert.Equal("A2", rows[1].c1); @@ -409,7 +409,7 @@ public void CsvColumnNotFoundTest() using (var stream = File.OpenRead(path)) { - var exception = Assert.Throws(() => _importer.QueryCsv(stream).ToList()); + var exception = Assert.Throws(() => _csvImporter.Query(stream).ToList()); Assert.Equal("c2", exception.ColumnName); Assert.Equal(2, exception.RowIndex); @@ -419,7 +419,7 @@ public void CsvColumnNotFoundTest() } { - var exception = Assert.Throws(() => _importer.QueryCsv(path).ToList()); + var exception = Assert.Throws(() => _csvImporter.Query(path).ToList()); Assert.Equal("c2", exception.ColumnName); Assert.Equal(2, exception.RowIndex); @@ -438,7 +438,7 @@ public void CsvColumnNotFoundWithAliasTest() File.WriteAllLines(path, ["col1,col2", "v1"]); using (var stream = File.OpenRead(path)) { - var exception = Assert.Throws(() => _importer.QueryCsv(stream).ToList()); + var exception = Assert.Throws(() => _csvImporter.Query(stream).ToList()); Assert.Equal("c2", exception.ColumnName); Assert.Equal(2, exception.RowIndex); @@ -448,7 +448,7 @@ public void CsvColumnNotFoundWithAliasTest() } { - var exception = Assert.Throws(() => _importer.QueryCsv(path).ToList()); + var exception = Assert.Throws(() => _csvImporter.Query(path).ToList()); Assert.Equal("c2", exception.ColumnName); Assert.Equal(2, exception.RowIndex); @@ -495,7 +495,7 @@ private static string MiniExcelGenerateCsv(string value) using (var stream = File.Create(path)) { IEnumerable records = [new { v1 = value, v2 = value }]; - var rowsWritten = MiniExcel.Exporter.GetCsvExporter().ExportCsv(stream, records); + var rowsWritten = MiniExcel.Exporter.GetCsvExporter().Export(stream, records); Assert.Equal(1, rowsWritten[0]); } @@ -516,7 +516,7 @@ public async Task InsertCsvTest() new { ID=1,Name ="Jack",InDate=new DateTime(2021,01,03)}, new { ID=2,Name ="Henry",InDate=new DateTime(2020,05,03)}, }; - await _exporter.ExportCsvAsync(path, value); + await _csvExporter.ExportAsync(path, value); var content = await File.ReadAllTextAsync(path); Assert.Equal( """ @@ -528,7 +528,7 @@ public async Task InsertCsvTest() } { var value = new { ID = 3, Name = "Mike", InDate = new DateTime(2021, 04, 23) }; - await _exporter.AppendToCsvAsync(path, value); + await _csvExporter.AppendToCsvAsync(path, value); var content = await File.ReadAllTextAsync(path); Assert.Equal( """ @@ -546,7 +546,7 @@ public async Task InsertCsvTest() new { ID=5,Name ="Gloria",InDate=new DateTime(2022,05,03)}, }; - await _exporter.AppendToCsvAsync(path, value); + await _csvExporter.AppendToCsvAsync(path, value); var content = await File.ReadAllTextAsync(path); Assert.Equal( """ diff --git a/tests/MiniExcel.Tests/MiniExcelAutoAdjustWidthTests.cs b/tests/MiniExcel.Tests/MiniExcelAutoAdjustWidthTests.cs index 1f1ecbda..1efceedf 100644 --- a/tests/MiniExcel.Tests/MiniExcelAutoAdjustWidthTests.cs +++ b/tests/MiniExcel.Tests/MiniExcelAutoAdjustWidthTests.cs @@ -7,7 +7,7 @@ namespace MiniExcelLib.Tests; public class MiniExcelAutoAdjustWidthTests { - private readonly OpenXmlExporter _exporter = MiniExcel.Exporter.GetExcelExporter(); + private readonly OpenXmlExporter _excelExporter = MiniExcel.Exporter.GetExcelExporter(); [Fact] public async Task AutoAdjustWidthThrowsExceptionWithoutFastMode_Async() @@ -15,7 +15,7 @@ public async Task AutoAdjustWidthThrowsExceptionWithoutFastMode_Async() using var file = AutoDeletingPath.Create(); var path = file.ToString(); - await Assert.ThrowsAsync(() => _exporter.ExportExcelAsync(path, AutoAdjustTestParameters.GetDictionaryTestData(), configuration: new OpenXmlConfiguration + await Assert.ThrowsAsync(() => _excelExporter.ExportAsync(path, AutoAdjustTestParameters.GetDictionaryTestData(), configuration: new OpenXmlConfiguration { EnableAutoWidth = true, })); @@ -27,7 +27,7 @@ public void AutoAdjustWidthThrowsExceptionWithoutFastMode() using var file = AutoDeletingPath.Create(); var path = file.ToString(); - Assert.Throws(() => _exporter.ExportExcel(path, AutoAdjustTestParameters.GetDictionaryTestData(), configuration: new OpenXmlConfiguration + Assert.Throws(() => _excelExporter.Export(path, AutoAdjustTestParameters.GetDictionaryTestData(), configuration: new OpenXmlConfiguration { EnableAutoWidth = true, })); @@ -40,7 +40,7 @@ public async Task AutoAdjustWidthEnumerable_Async() var path = file.ToString(); var configuration = AutoAdjustTestParameters.GetConfiguration(); - await _exporter.ExportExcelAsync(path, AutoAdjustTestParameters.GetDictionaryTestData(), configuration: configuration); + await _excelExporter.ExportAsync(path, AutoAdjustTestParameters.GetDictionaryTestData(), configuration: configuration); AssertExpectedWidth(path, configuration); } @@ -52,7 +52,7 @@ public void AutoAdjustWidthEnumerable() var path = file.ToString(); var configuration = AutoAdjustTestParameters.GetConfiguration(); - _exporter.ExportExcel(path, AutoAdjustTestParameters.GetDictionaryTestData(), configuration: configuration); + _excelExporter.Export(path, AutoAdjustTestParameters.GetDictionaryTestData(), configuration: configuration); AssertExpectedWidth(path, configuration); } @@ -70,7 +70,7 @@ public async Task AutoAdjustWidthDataReader_Async() await using var command = new SQLiteCommand(Db.GenerateDummyQuery(AutoAdjustTestParameters.GetDictionaryTestData()), connection); connection.Open(); await using var reader = command.ExecuteReader(); - await _exporter.ExportExcelAsync(path, reader, configuration: configuration); + await _excelExporter.ExportAsync(path, reader, configuration: configuration); } AssertExpectedWidth(path, configuration); @@ -89,7 +89,7 @@ public void AutoAdjustWidthDataReader() using var command = new SQLiteCommand(Db.GenerateDummyQuery(AutoAdjustTestParameters.GetDictionaryTestData()), connection); connection.Open(); using var reader = command.ExecuteReader(); - _exporter.ExportExcel(path, reader, configuration: configuration); + _excelExporter.Export(path, reader, configuration: configuration); } AssertExpectedWidth(path, configuration); @@ -114,7 +114,7 @@ public async Task AutoAdjustWidthDataTable_Async() } var configuration = AutoAdjustTestParameters.GetConfiguration(); - await _exporter.ExportExcelAsync(path, table, configuration: configuration); + await _excelExporter.ExportAsync(path, table, configuration: configuration); AssertExpectedWidth(path, configuration); } @@ -137,7 +137,7 @@ public void AutoAdjustWidthDataTable() } var configuration = AutoAdjustTestParameters.GetConfiguration(); - _exporter.ExportExcel(path, table, configuration: configuration); + _excelExporter.Export(path, table, configuration: configuration); AssertExpectedWidth(path, configuration); } diff --git a/tests/MiniExcel.Tests/MiniExcelIssueAsyncTests.cs b/tests/MiniExcel.Tests/MiniExcelIssueAsyncTests.cs index 2be9bfc5..96fd55b2 100644 --- a/tests/MiniExcel.Tests/MiniExcelIssueAsyncTests.cs +++ b/tests/MiniExcel.Tests/MiniExcelIssueAsyncTests.cs @@ -8,9 +8,9 @@ public class MiniExcelIssueAsyncTests(ITestOutputHelper output) { private readonly ITestOutputHelper _output = output; - private readonly OpenXmlImporter _importer = MiniExcel.Importer.GetExcelImporter(); - private readonly OpenXmlExporter _exporter = MiniExcel.Exporter.GetExcelExporter(); - private readonly OpenXmlTemplater _templater = MiniExcel.Templater.GetExcelTemplater(); + private readonly OpenXmlImporter _excelImporter = MiniExcel.Importer.GetExcelImporter(); + private readonly OpenXmlExporter _excelExporter = MiniExcel.Exporter.GetExcelExporter(); + private readonly OpenXmlTemplater _excelTemplater = MiniExcel.Templater.GetExcelTemplater(); /// /// [SaveAsByTemplate support DateTime custom format · Issue #255 · mini-software/MiniExcel] @@ -31,8 +31,8 @@ public async Task Issue255() } }; - await _templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); - var q = _importer.QueryExcelAsync(path.ToString()).ToBlockingEnumerable(); + await _excelTemplater.ApplyTemplateAsync(path.ToString(), templatePath, value); + var q = _excelImporter.QueryAsync(path.ToString()).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal("2021", rows[1].A.ToString()); @@ -49,11 +49,11 @@ public async Task Issue255() Time2 = new DateTime(2021, 01, 01) } }; - var rowsWritten = await _exporter.ExportExcelAsync(path.ToString(), value); + var rowsWritten = await _excelExporter.ExportAsync(path.ToString(), value); Assert.Single(rowsWritten); Assert.Equal(1, rowsWritten[0]); - var q = _importer.QueryExcelAsync(path.ToString()).ToBlockingEnumerable(); + var q = _excelImporter.QueryAsync(path.ToString()).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal("2021", rows[1].A.ToString()); Assert.Equal("2021", rows[1].B.ToString()); @@ -77,7 +77,7 @@ private class Issue255DTO public async Task Issue256() { var path = PathHelper.GetFile("xlsx/TestIssue256.xlsx"); - var q = _importer.QueryExcelAsync(path, false).ToBlockingEnumerable(); + var q = _excelImporter.QueryAsync(path, false).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal(new DateTime(2003, 4, 16), rows[1].A); @@ -92,46 +92,10 @@ public async Task Issue256() public async Task Issue242() { var path = PathHelper.GetFile("xls/TestIssue242.xls"); - Assert.Throws(() => _ = _importer.QueryExcelAsync(path).ToBlockingEnumerable().ToList()); + Assert.Throws(() => _ = _excelImporter.QueryAsync(path).ToBlockingEnumerable().ToList()); await using var stream = File.OpenRead(path); - Assert.Throws(() => _ = _importer.QueryExcelAsync(stream).ToBlockingEnumerable().ToList()); - } - - /// - /// Csv type mapping QueryAsync error "cannot be converted to xxx type" #243 - /// - [Fact] - public async Task Issue243() - { - using var path = AutoDeletingPath.Create(ExcelType.Csv); - var value = new[] - { - new { Name ="Jack",Age=25,InDate=new DateTime(2021,01,03)}, - new { Name ="Henry",Age=36,InDate=new DateTime(2020,05,03)}, - }; - - var rowsWritten = await _exporter.ExportExcelAsync(path.ToString(), value); - Assert.Single(rowsWritten); - Assert.Equal(2, rowsWritten[0]); - - var q = _importer.QueryExcelAsync(path.ToString()).ToBlockingEnumerable(); - var rows = q.ToList(); - - Assert.Equal("Jack", rows[0].Name); - Assert.Equal(25, rows[0].Age); - Assert.Equal(new DateTime(2021, 01, 03), rows[0].InDate); - - Assert.Equal("Henry", rows[1].Name); - Assert.Equal(36, rows[1].Age); - Assert.Equal(new DateTime(2020, 05, 03), rows[1].InDate); - } - - private class Issue243Dto - { - public string Name { get; set; } - public int Age { get; set; } - public DateTime InDate { get; set; } + Assert.Throws(() => _ = _excelImporter.QueryAsync(stream).ToBlockingEnumerable().ToList()); } /// @@ -146,43 +110,17 @@ public async Task Issue241() new() { Name="Henry",InDate=new DateTime(2020,04,05) } ]; - // csv - { - using var file = AutoDeletingPath.Create(ExcelType.Csv); - var path = file.ToString(); - var rowsWritten = await _exporter.ExportExcelAsync(path, value); - - Assert.Single(rowsWritten); - Assert.Equal(2, rowsWritten[0]); - - { - var q = _importer.QueryExcelAsync(path, true).ToBlockingEnumerable(); - var rows = q.ToList(); - - Assert.Equal(rows[0].InDate, "01 04, 2021"); - Assert.Equal(rows[1].InDate, "04 05, 2020"); - } - - { - var q = _importer.QueryExcelAsync(path).ToBlockingEnumerable(); - var rows = q.ToList(); - - Assert.Equal(rows[0].InDate, new DateTime(2021, 01, 04)); - Assert.Equal(rows[1].InDate, new DateTime(2020, 04, 05)); - } - } - // xlsx { using var file = AutoDeletingPath.Create(); var path = file.ToString(); - var rowsWritten = await _exporter.ExportExcelAsync(path, value); + var rowsWritten = await _excelExporter.ExportAsync(path, value); Assert.Single(rowsWritten); Assert.Equal(2, rowsWritten[0]); { - var q = _importer.QueryExcelAsync(path, true).ToBlockingEnumerable(); + var q = _excelImporter.QueryAsync(path, true).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal(rows[0].InDate, "01 04, 2021"); @@ -190,7 +128,7 @@ public async Task Issue241() } { - var q = _importer.QueryExcelAsync(path).ToBlockingEnumerable(); + var q = _excelImporter.QueryAsync(path).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal(rows[0].InDate, new DateTime(2021, 01, 04)); @@ -221,7 +159,7 @@ public async Task Issue132() new { Name ="Henry", Age=36, InDate=new DateTime(2020,05,03)}, }; - await _exporter.ExportExcelAsync(path.ToString(), value); + await _excelExporter.ExportAsync(path.ToString(), value); } { @@ -235,7 +173,7 @@ public async Task Issue132() { TableStyles = TableStyles.None }; - var rowsWritten = await _exporter.ExportExcelAsync(path.ToString(), value, configuration: config); + var rowsWritten = await _excelExporter.ExportAsync(path.ToString(), value, configuration: config); Assert.Single(rowsWritten); Assert.Equal(2, rowsWritten[0]); @@ -250,7 +188,7 @@ public async Task Issue132() new { Name ="Henry", Age=36,InDate=new DateTime(2020,05,03)}, }) ); - var rowsWritten = await _exporter.ExportExcelAsync(path.ToString(), value); + var rowsWritten = await _excelExporter.ExportAsync(path.ToString(), value); Assert.Single(rowsWritten); Assert.Equal(2, rowsWritten[0]); @@ -275,16 +213,16 @@ public async Task Issue235() department.TableName = "department"; sheets.Tables.Add(department); - var rowsWritten = await _exporter.ExportExcelAsync(path, sheets); + var rowsWritten = await _excelExporter.ExportAsync(path, sheets); Assert.Equal(2, rowsWritten.Length); Assert.Equal(2, rowsWritten[0]); - var sheetNames = await _importer.GetSheetNamesAsync(path); + var sheetNames = await _excelImporter.GetSheetNamesAsync(path); Assert.Equal("users", sheetNames[0]); Assert.Equal("department", sheetNames[1]); { - var q = _importer.QueryExcelAsync(path, true, sheetName: "users").ToBlockingEnumerable(); + var q = _excelImporter.QueryAsync(path, true, sheetName: "users").ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal("Jack", rows[0].Name); Assert.Equal(25, rows[0].Age); @@ -292,7 +230,7 @@ public async Task Issue235() Assert.Equal(44, rows[1].Age); } { - var q = _importer.QueryExcelAsync(path, true, sheetName: "department").ToBlockingEnumerable(); + var q = _excelImporter.QueryAsync(path, true, sheetName: "department").ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal("01", rows[0].ID); Assert.Equal("HR", rows[0].Name); @@ -310,7 +248,7 @@ public async Task Issue233() var path = PathHelper.GetFile("xlsx/TestIssue233.xlsx"); - var dt = await _importer.QueryExcelAsDataTableAsync(path); + var dt = await _excelImporter.QueryAsDataTableAsync(path); var rows = dt.Rows; @@ -319,28 +257,6 @@ public async Task Issue233() Assert.Equal("0.55/1.1", rows[1]["Size"]); } - /// - /// Csv QueryAsync split comma not correct #237 - /// https://github.com/mini-software/MiniExcel/issues/237 - /// - [Fact] - public async Task Issue237() - { - using var path = AutoDeletingPath.Create(ExcelType.Csv); - var value = new[] - { - new{ id="\"\"1,2,3\"\""}, - new{ id="1,2,3"}, - }; - await _exporter.ExportExcelAsync(path.ToString(), value); - - var q = _importer.QueryExcelAsync(path.ToString(), true).ToBlockingEnumerable(); - var rows = q.ToList(); - - Assert.Equal("\"\"1,2,3\"\"", rows[0].id); - Assert.Equal("1,2,3", rows[1].id); - } - /// /// SaveAs support multiple sheets #234 /// @@ -365,18 +281,18 @@ public async Task Issue234() ["users"] = users, ["department"] = department }; - var rowsWritten = await _exporter.ExportExcelAsync(path, sheets); + var rowsWritten = await _excelExporter.ExportAsync(path, sheets); Assert.Equal(2, rowsWritten.Length); Assert.Equal(2, rowsWritten[0]); - var sheetNames = _importer.GetSheetNames(path); + var sheetNames = _excelImporter.GetSheetNames(path); Assert.Equal("users", sheetNames[0]); Assert.Equal("department", sheetNames[1]); { - var q = _importer.QueryExcelAsync(path, true, sheetName: "users").ToBlockingEnumerable(); + var q = _excelImporter.QueryAsync(path, true, sheetName: "users").ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal("Jack", rows[0].Name); @@ -385,7 +301,7 @@ public async Task Issue234() Assert.Equal(44, rows[1].Age); } { - var q = _importer.QueryExcelAsync(path, true, sheetName: "department").ToBlockingEnumerable(); + var q = _excelImporter.QueryAsync(path, true, sheetName: "department").ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal("01", rows[0].ID); @@ -444,12 +360,12 @@ public async Task Issue230() await using (var reader = await cmd3.ExecuteReaderAsync(CommandBehavior.CloseConnection)) { using var path = AutoDeletingPath.Create(); - var rowsWritten = await _exporter.ExportExcelAsync(path.ToString(), reader, printHeader: true); + var rowsWritten = await _excelExporter.ExportAsync(path.ToString(), reader, printHeader: true); Assert.Single(rowsWritten); Assert.Equal(2, rowsWritten[0]); - var q = _importer.QueryExcelAsync(path.ToString(), true).ToBlockingEnumerable(); + var q = _excelImporter.QueryAsync(path.ToString(), true).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal(1, rows[0].id); @@ -466,7 +382,7 @@ public async Task Issue229() { var path = PathHelper.GetFile("xlsx/TestIssue229.xlsx"); - var dt = await _importer.QueryExcelAsDataTableAsync(path); + var dt = await _excelImporter.QueryAsDataTableAsync(path); foreach (DataColumn column in dt.Columns) { @@ -488,7 +404,7 @@ public Task Issue122() }; var path1 = PathHelper.GetFile("xlsx/TestIssue122.xlsx"); - var rows1 = _importer.QueryExcelAsync(path1, useHeaderRow: true, configuration: config).ToBlockingEnumerable().ToList(); + var rows1 = _excelImporter.QueryAsync(path1, useHeaderRow: true, configuration: config).ToBlockingEnumerable().ToList(); Assert.Equal("HR", rows1[0].Department); Assert.Equal("HR", rows1[1].Department); @@ -498,7 +414,7 @@ public Task Issue122() Assert.Equal("IT", rows1[5].Department); var path2 = PathHelper.GetFile("xlsx/TestIssue122_2.xlsx"); - var rows2 = _importer.QueryExcelAsync(path2, useHeaderRow: true, configuration: config).ToBlockingEnumerable().ToList(); + var rows2 = _excelImporter.QueryAsync(path2, useHeaderRow: true, configuration: config).ToBlockingEnumerable().ToList(); Assert.Equal("V1", rows2[2].Test1); Assert.Equal("V2", rows2[5].Test2); @@ -519,14 +435,14 @@ public async Task Issue227() { { var path = PathHelper.GetTempPath("xlsm"); - Assert.Throws(() => _exporter.ExportExcel(path, new[] { new { V = "A1" }, new { V = "A2" } })); + Assert.Throws(() => _excelExporter.Export(path, new[] { new { V = "A1" }, new { V = "A2" } })); File.Delete(path); } { var path = PathHelper.GetFile("xlsx/TestIssue227.xlsm"); { - var q = _importer.QueryExcelAsync(path).ToBlockingEnumerable(); + var q = _excelImporter.QueryAsync(path).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal(100, rows.Count); @@ -540,7 +456,7 @@ public async Task Issue227() } { await using var stream = File.OpenRead(path); - var q = _importer.QueryExcelAsync(stream).ToBlockingEnumerable(); + var q = _excelImporter.QueryAsync(stream).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal(100, rows.Count); @@ -564,7 +480,7 @@ public async Task Issue226() { using var path = AutoDeletingPath.Create(); var templatePath = PathHelper.GetFile("xlsx/TestIssue226.xlsx"); - await _templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, new { employees = new[] { new { name = "123" }, new { name = "123" } } }); + await _excelTemplater.ApplyTemplateAsync(path.ToString(), templatePath, new { employees = new[] { new { name = "123" }, new { name = "123" } } }); Assert.Equal("A1:A3", SheetHelper.GetFirstSheetDimensionRefValue(path.ToString())); } @@ -582,12 +498,12 @@ public async Task Issue223() new() { { "A", Guid.NewGuid() }, { "B", "HelloWorld" } } ]; using var path = AutoDeletingPath.Create(); - var rowsWritten = await _exporter.ExportExcelAsync(path.ToString(), value); + var rowsWritten = await _excelExporter.ExportAsync(path.ToString(), value); Assert.Single(rowsWritten); Assert.Equal(3, rowsWritten[0]); - var dt = await _importer.QueryExcelAsDataTableAsync(path.ToString()); + var dt = await _excelImporter.QueryAsDataTableAsync(path.ToString()); #pragma warning restore CS0618 var columns = dt.Columns; Assert.Equal(typeof(object), columns[0].DataType); @@ -605,7 +521,7 @@ public async Task Issue223() public async Task Issue222() { var path = PathHelper.GetFile("xlsx/TestIssue222.xlsx"); - var q = _importer.QueryExcelAsync(path).ToBlockingEnumerable(); + var q = _excelImporter.QueryAsync(path).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal(typeof(DateTime), rows[1].A.GetType()); Assert.Equal(new DateTime(2021, 4, 29), rows[1].A); @@ -620,7 +536,7 @@ public async Task Issue147() { { var path = PathHelper.GetFile("xlsx/TestIssue147.xlsx"); - var q = _importer.QueryExcelAsync(path, useHeaderRow: false, startCell: "C3", sheetName: "Sheet1").ToBlockingEnumerable(); + var q = _excelImporter.QueryAsync(path, useHeaderRow: false, startCell: "C3", sheetName: "Sheet1").ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal(["C", "D", "E"], (rows[0] as IDictionary)?.Keys); @@ -636,13 +552,13 @@ public async Task Issue147() } Assert.Equal(11, rows.Count); - var columns = await _importer.GetExcelColumnsAsync(path, startCell: "C3"); + var columns = await _excelImporter.GetColumnNamesAsync(path, startCell: "C3"); Assert.Equal(["C", "D", "E"], columns); } { var path = PathHelper.GetFile("xlsx/TestIssue147.xlsx"); - var q = _importer.QueryExcelAsync(path, useHeaderRow: true, startCell: "C3", sheetName: "Sheet1").ToBlockingEnumerable(); + var q = _excelImporter.QueryAsync(path, useHeaderRow: true, startCell: "C3", sheetName: "Sheet1").ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal(["Column1", "Column2", "Column3"], (rows[0] as IDictionary)?.Keys); @@ -657,7 +573,7 @@ public async Task Issue147() } Assert.Equal(10, rows.Count); - var columns = await _importer.GetExcelColumnsAsync(path, useHeaderRow: true, startCell: "C3"); + var columns = await _excelImporter.GetColumnNamesAsync(path, useHeaderRow: true, startCell: "C3"); Assert.Equal(["Column1", "Column2", "Column3"], columns); } } @@ -677,11 +593,11 @@ public async Task Issue211() await using var connection = new SQLiteConnection(connectionString); using var reader = await connection.ExecuteReaderAsync("select 1 Test1,2 Test2 union all select 3 , 4 union all select 5 ,6"); - var rowsWritten = await _exporter.ExportExcelAsync(path.ToString(), reader); + var rowsWritten = await _excelExporter.ExportAsync(path.ToString(), reader); Assert.Single(rowsWritten); Assert.Equal(3, rowsWritten[0]); - var q = _importer.QueryExcelAsync(path.ToString(), true).ToBlockingEnumerable(); + var q = _excelImporter.QueryAsync(path.ToString(), true).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal(1.0, rows[0].Test1); Assert.Equal(2.0, rows[0].Test2); @@ -704,11 +620,11 @@ public async Task EmptyDataReaderIssue() await using var connection2 = new SQLiteConnection(connectionString); using var reader = await connection2.ExecuteReaderAsync("SELECT * FROM test"); - var rowsWritten = await _exporter.ExportExcelAsync(path.ToString(), reader); + var rowsWritten = await _excelExporter.ExportAsync(path.ToString(), reader); Assert.Single(rowsWritten); Assert.Equal(0, rowsWritten[0]); - var q = _importer.QueryExcelAsync(path.ToString(), true).ToBlockingEnumerable(); + var q = _excelImporter.QueryAsync(path.ToString(), true).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Empty(rows); } @@ -721,12 +637,12 @@ public async Task Issue216() { using var path = AutoDeletingPath.Create(); var value = new[] { new { Test1 = "1", Test2 = 2 }, new { Test1 = "3", Test2 = 4 } }; - var rowsWritten = await _exporter.ExportExcelAsync(path.ToString(), value); + var rowsWritten = await _excelExporter.ExportAsync(path.ToString(), value); Assert.Single(rowsWritten); Assert.Equal(2, rowsWritten[0]); { - var table = await _importer.QueryExcelAsDataTableAsync(path.ToString()); + var table = await _excelImporter.QueryAsDataTableAsync(path.ToString()); Assert.Equal("Test1", table.Columns[0].ColumnName); Assert.Equal("Test2", table.Columns[1].ColumnName); Assert.Equal("1", table.Rows[0]["Test1"]); @@ -736,7 +652,7 @@ public async Task Issue216() } { - var dt = await _importer.QueryExcelAsDataTableAsync(path.ToString(), false); + var dt = await _excelImporter.QueryAsDataTableAsync(path.ToString(), false); Assert.Equal("Test1", dt.Rows[0]["A"]); Assert.Equal("Test2", dt.Rows[0]["B"]); Assert.Equal("1", dt.Rows[1]["A"]); @@ -756,9 +672,9 @@ public async Task IssueI3OSKV() { using var path = AutoDeletingPath.Create(); var value = new[] { new { Test = "12345678901234567890" } }; - await _exporter.ExportExcelAsync(path.ToString(), value); + await _excelExporter.ExportAsync(path.ToString(), value); - var q = _importer.QueryExcelAsync(path.ToString(), true).ToBlockingEnumerable(); + var q = _excelImporter.QueryAsync(path.ToString(), true).ToBlockingEnumerable(); var A2 = q.First().Test; Assert.Equal("12345678901234567890", A2); } @@ -766,9 +682,9 @@ public async Task IssueI3OSKV() { using var path = AutoDeletingPath.Create(); var value = new[] { new { Test = 123456.789 } }; - await _exporter.ExportExcelAsync(path.ToString(), value); + await _excelExporter.ExportAsync(path.ToString(), value); - var q = _importer.QueryExcelAsync(path.ToString(), true).ToBlockingEnumerable(); + var q = _excelImporter.QueryAsync(path.ToString(), true).ToBlockingEnumerable(); var A2 = q.First().Test; Assert.Equal(123456.789, A2); } @@ -782,7 +698,7 @@ public async Task IssueI3OSKV() public async Task Issue220() { var path = PathHelper.GetFile("xlsx/TestIssue220.xlsx"); - var rows = _importer.QueryExcelAsync(path, useHeaderRow: true).ToBlockingEnumerable(); + var rows = _excelImporter.QueryAsync(path, useHeaderRow: true).ToBlockingEnumerable(); var result = rows .GroupBy(s => s.PRT_ID) .Select(g => new @@ -806,9 +722,9 @@ public async Task Issue220() public async Task Issue215() { await using var stream = new MemoryStream(); - await _exporter.ExportExcelAsync(stream, new[] { new { V = "test1" }, new { V = "test2" } }); + await _excelExporter.ExportAsync(stream, new[] { new { V = "test1" }, new { V = "test2" } }); - var q = _importer.QueryExcelAsync(stream, true).ToBlockingEnumerable().Cast>(); + var q = _excelImporter.QueryAsync(stream, true).ToBlockingEnumerable().Cast>(); var rows = q.ToList(); Assert.Equal("test1", rows[0]["V"]); @@ -829,29 +745,15 @@ public async Task Issue217() table.Rows.Add(1, "Jonathan", 23.44); table.Rows.Add(2, "Bill", 56.87); - // openxml - { - using var path = AutoDeletingPath.Create(); - var rowsWritten = await _exporter.ExportExcelAsync(path.ToString(), table); - Assert.Single(rowsWritten); - Assert.Equal(2, rowsWritten[0]); + using var path = AutoDeletingPath.Create(); + var rowsWritten = await _excelExporter.ExportAsync(path.ToString(), table); + Assert.Single(rowsWritten); + Assert.Equal(2, rowsWritten[0]); - var q = _importer.QueryExcelAsync(path.ToString()).ToBlockingEnumerable(); - var rows = q.ToList(); - Assert.Equal("Name", rows[0].B); - Assert.Equal("Limit", rows[0].C); - } - - // csv - { - using var path = AutoDeletingPath.Create(ExcelType.Csv); - await _exporter.ExportExcelAsync(path.ToString(), table); - - var q = _importer.QueryExcelAsync(path.ToString()).ToBlockingEnumerable(); - var rows = q.ToList(); - Assert.Equal("Name", rows[0].B); - Assert.Equal("Limit", rows[0].C); - } + var q = _excelImporter.QueryAsync(path.ToString()).ToBlockingEnumerable(); + var rows = q.ToList(); + Assert.Equal("Name", rows[0].B); + Assert.Equal("Limit", rows[0].C); } /// @@ -864,9 +766,9 @@ public async Task Issue212() const string sheetName = "Demo"; using var path = AutoDeletingPath.Create(); - await _exporter.ExportExcelAsync(path.ToString(), new[] { new { x = 1, y = 2 } }, sheetName: sheetName); + await _excelExporter.ExportAsync(path.ToString(), new[] { new { x = 1, y = 2 } }, sheetName: sheetName); - var actualSheetName = _importer.GetSheetNames(path.ToString()).ToList()[0]; + var actualSheetName = _excelImporter.GetSheetNames(path.ToString()).ToList()[0]; Assert.Equal(sheetName, actualSheetName); } @@ -893,8 +795,8 @@ public async Task Issue207() } }; - await _templater.ApplyXlsxTemplateAsync(path, templatePath, value); - var q = _importer.QueryExcelAsync(path).ToBlockingEnumerable(); + await _excelTemplater.ApplyTemplateAsync(path, templatePath, value); + var q = _excelImporter.QueryAsync(path).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal("項目1", rows[0].A); @@ -939,9 +841,9 @@ public async Task Issue207() } }; - await _templater.ApplyXlsxTemplateAsync(path, templatePath, value); + await _excelTemplater.ApplyTemplateAsync(path, templatePath, value); - var q = _importer.QueryExcelAsync(path).ToBlockingEnumerable(); + var q = _excelImporter.QueryAsync(path).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal("項目1", rows[0].A); Assert.Equal("[]內容1,[]內容2,[]內容3,[]內容4,[]內容5", rows[0].C); @@ -971,10 +873,10 @@ public async Task Issue87() }; await using var stream = File.OpenRead(templatePath); - var q = _importer.QueryExcelAsync(templatePath).ToBlockingEnumerable(); + var q = _excelImporter.QueryAsync(templatePath).ToBlockingEnumerable(); var rows = q.ToList(); - await _templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); + await _excelTemplater.ApplyTemplateAsync(path.ToString(), templatePath, value); } /// @@ -996,7 +898,7 @@ public async Task Issue206() { ["employees"] = dt }; - await _templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); + await _excelTemplater.ApplyTemplateAsync(path.ToString(), templatePath, value); var dimension = SheetHelper.GetFirstSheetDimensionRefValue(path.ToString()); Assert.Equal("A1:B2", dimension); @@ -1012,7 +914,7 @@ public async Task Issue206() dt.Rows.Add("Jack", "HR"); } var value = new Dictionary { ["employees"] = dt }; - await _templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); + await _excelTemplater.ApplyTemplateAsync(path.ToString(), templatePath, value); var dimension = SheetHelper.GetFirstSheetDimensionRefValue(path.ToString()); Assert.Equal("A1:B2", dimension); @@ -1048,11 +950,11 @@ public async Task Issue193() new {name="Keaton",department="IT"} } }; - await _templater.ApplyXlsxTemplateAsync(path, templatePath, value); + await _excelTemplater.ApplyTemplateAsync(path, templatePath, value); - foreach (var sheetName in _importer.GetSheetNames(path)) + foreach (var sheetName in _excelImporter.GetSheetNames(path)) { - var q = _importer.QueryExcelAsync(path, sheetName: sheetName).ToBlockingEnumerable(); + var q = _excelImporter.QueryAsync(path, sheetName: sheetName).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal(9, rows.Count); @@ -1103,9 +1005,9 @@ public async Task Issue193() new {name="Keaton",department="IT"} } }; - await _templater.ApplyXlsxTemplateAsync(path, templatePath, value); + await _excelTemplater.ApplyTemplateAsync(path, templatePath, value); - var q = _importer.QueryExcelAsync(path).ToBlockingEnumerable(); + var q = _excelImporter.QueryAsync(path).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal("FooCompany", rows[0].A); Assert.Equal("Jack", rows[2].B); @@ -1134,19 +1036,19 @@ public async Task Issue142_Query() const string path = "../../../../../samples/xlsx/TestIssue142.xlsx"; const string pathCsv = "../../../../../samples/xlsx/TestIssue142.csv"; { - var rows = _importer.QueryExcelAsync(path).ToBlockingEnumerable().ToList(); + var rows = _excelImporter.QueryAsync(path).ToBlockingEnumerable().ToList(); Assert.Equal(0, rows[0].MyProperty1); } { await Assert.ThrowsAsync(async () => { - var q = _importer.QueryExcelAsync(path).ToBlockingEnumerable().ToList(); + var q = _excelImporter.QueryAsync(path).ToBlockingEnumerable().ToList(); }); } { - var q = _importer.QueryExcelAsync(path).ToBlockingEnumerable(); + var q = _excelImporter.QueryAsync(path).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal("CustomColumnName", rows[0].MyProperty1); Assert.Null(rows[0].MyProperty7); @@ -1158,7 +1060,7 @@ await Assert.ThrowsAsync(async () => } { - var q = _importer.QueryExcelAsync(path).ToBlockingEnumerable(); + var q = _excelImporter.QueryAsync(path).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal("CustomColumnName", rows[0].MyProperty1); Assert.Null(rows[0].MyProperty7); @@ -1206,19 +1108,19 @@ public async Task Issue150() { var path = PathHelper.GetTempFilePath(); - await Assert.ThrowsAnyAsync(async () => await _exporter.ExportExcelAsync(path, new[] { 1, 2 })); + await Assert.ThrowsAnyAsync(async () => await _excelExporter.ExportAsync(path, new[] { 1, 2 })); File.Delete(path); - await Assert.ThrowsAnyAsync(async () => await _exporter.ExportExcelAsync(path, new[] { "1", "2" })); + await Assert.ThrowsAnyAsync(async () => await _excelExporter.ExportAsync(path, new[] { "1", "2" })); File.Delete(path); - await Assert.ThrowsAnyAsync(async () => await _exporter.ExportExcelAsync(path, new[] { '1', '2' })); + await Assert.ThrowsAnyAsync(async () => await _excelExporter.ExportAsync(path, new[] { '1', '2' })); File.Delete(path); - await Assert.ThrowsAnyAsync(async () => await _exporter.ExportExcelAsync(path, new[] { DateTime.Now })); + await Assert.ThrowsAnyAsync(async () => await _excelExporter.ExportAsync(path, new[] { DateTime.Now })); File.Delete(path); - await Assert.ThrowsAnyAsync(async () => await _exporter.ExportExcelAsync(path, new[] { Guid.NewGuid() })); + await Assert.ThrowsAnyAsync(async () => await _excelExporter.ExportAsync(path, new[] { Guid.NewGuid() })); File.Delete(path); } @@ -1283,14 +1185,14 @@ public async Task Issue157() } ] """); - var rowsWritten = await _exporter.ExportExcelAsync(path, input); + var rowsWritten = await _excelExporter.ExportAsync(path, input); Assert.Single(rowsWritten); Assert.Equal(5, rowsWritten[0]); - var q = _importer.QueryExcelAsync(path, sheetName: "Sheet1").ToBlockingEnumerable(); + var q = _excelImporter.QueryAsync(path, sheetName: "Sheet1").ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal(6, rows.Count); - Assert.Equal("Sheet1", _importer.GetSheetNames(path).First()); + Assert.Equal("Sheet1", _excelImporter.GetSheetNames(path).First()); using var p = new ExcelPackage(new FileInfo(path)); var ws = p.Workbook.Worksheets.First(); @@ -1300,10 +1202,10 @@ public async Task Issue157() { const string path = "../../../../../samples/xlsx/TestIssue157.xlsx"; { - var q = _importer.QueryExcelAsync(path, sheetName: "Sheet1").ToBlockingEnumerable(); + var q = _excelImporter.QueryAsync(path, sheetName: "Sheet1").ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal(6, rows.Count); - Assert.Equal("Sheet1", _importer.GetSheetNames(path).First()); + Assert.Equal("Sheet1", _excelImporter.GetSheetNames(path).First()); } using (var p = new ExcelPackage(new FileInfo(path))) { @@ -1313,7 +1215,7 @@ public async Task Issue157() } { - var q = _importer.QueryExcelAsync(path, sheetName: "Sheet1").ToBlockingEnumerable(); + var q = _excelImporter.QueryAsync(path, sheetName: "Sheet1").ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal(5, rows.Count); @@ -1347,7 +1249,7 @@ public async Task Issue149() { const string path = "../../../../../samples/xlsx/TestIssue149.xlsx"; - var q = _importer.QueryExcelAsync(path).ToBlockingEnumerable(); + var q = _excelImporter.QueryAsync(path).ToBlockingEnumerable(); var rows = q.Select(s => (string)s.A).ToList(); for (int i = 0; i < chars.Length; i++) @@ -1364,9 +1266,9 @@ public async Task Issue149() var path = file.ToString(); var input = chars.Select(s => new { Test = s.ToString() }); - await _exporter.ExportExcelAsync(path, input); + await _excelExporter.ExportAsync(path, input); - var q = _importer.QueryExcelAsync(path, true).ToBlockingEnumerable(); + var q = _excelImporter.QueryAsync(path, true).ToBlockingEnumerable(); var rows = q.Select(s => (string)s.Test).ToList(); for (int i = 0; i < chars.Length; i++) @@ -1384,9 +1286,9 @@ public async Task Issue149() var path = file.ToString(); var input = chars.Select(s => new { Test = s.ToString() }); - await _exporter.ExportExcelAsync(path, input); + await _excelExporter.ExportAsync(path, input); - var q = _importer.QueryExcelAsync(path).ToBlockingEnumerable(); + var q = _excelImporter.QueryAsync(path).ToBlockingEnumerable(); var rows = q.Select(s => s.Test).ToList(); for (int i = 0; i < chars.Length; i++) @@ -1412,7 +1314,7 @@ private class Issue149VO public async Task Issue153() { const string path = "../../../../../samples/xlsx/TestIssue153.xlsx"; - var q = _importer.QueryExcelAsync(path, true).ToBlockingEnumerable(); + var q = _excelImporter.QueryAsync(path, true).ToBlockingEnumerable(); var rows = q.First() as IDictionary; Assert.Equal( @@ -1431,7 +1333,7 @@ public async Task Issue137() var path = "../../../../../samples/xlsx/TestIssue137.xlsx"; { - var q = _importer.QueryExcelAsync(path).ToBlockingEnumerable(); + var q = _excelImporter.QueryAsync(path).ToBlockingEnumerable(); var rows = q.ToList(); var first = rows[0] as IDictionary; // https://user-images.githubusercontent.com/12729184/113266322-ba06e400-9307-11eb-9521-d36abfda75cc.png Assert.Equal(["A", "B", "C", "D", "E", "F", "G", "H"], first?.Keys.ToArray()); @@ -1467,7 +1369,7 @@ public async Task Issue137() // dynamic query with head { - var q = _importer.QueryExcelAsync(path, true).ToBlockingEnumerable(); + var q = _excelImporter.QueryAsync(path, true).ToBlockingEnumerable(); var rows = q.ToList(); var first = rows[0] as IDictionary; // https://user-images.githubusercontent.com/12729184/113266322-ba06e400-9307-11eb-9521-d36abfda75cc.png Assert.Equal(["比例", "商品", "滿倉口數", "0", "1為港幣 0為台幣"], first?.Keys.ToArray()); @@ -1489,7 +1391,7 @@ public async Task Issue137() } { - var q = _importer.QueryExcelAsync(path).ToBlockingEnumerable(); + var q = _excelImporter.QueryAsync(path).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal(10, rows.Count); @@ -1523,7 +1425,7 @@ public async Task Issue138() { const string path = "../../../../../samples/xlsx/TestIssue138.xlsx"; { - var q = _importer.QueryExcelAsync(path, true).ToBlockingEnumerable(); + var q = _excelImporter.QueryAsync(path, true).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal(6, rows.Count); @@ -1549,7 +1451,7 @@ public async Task Issue138() } { - var q = _importer.QueryExcelAsync(path).ToBlockingEnumerable(); + var q = _excelImporter.QueryAsync(path).ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal(6, rows.Count); Assert.Equal(new DateTime(2021, 3, 1), rows[0].Date); diff --git a/tests/MiniExcel.Tests/MiniExcelIssueTests.cs b/tests/MiniExcel.Tests/MiniExcelIssueTests.cs index 9eb67ee7..bee312c1 100644 --- a/tests/MiniExcel.Tests/MiniExcelIssueTests.cs +++ b/tests/MiniExcel.Tests/MiniExcelIssueTests.cs @@ -15,9 +15,12 @@ public class MiniExcelIssueTests(ITestOutputHelper output) { private readonly ITestOutputHelper _output = output; - private readonly OpenXmlImporter _importer = MiniExcel.Importer.GetExcelImporter(); - private readonly OpenXmlExporter _exporter = MiniExcel.Exporter.GetExcelExporter(); - private readonly OpenXmlTemplater _templater = MiniExcel.Templater.GetExcelTemplater(); + private readonly OpenXmlImporter _excelImporter = MiniExcel.Importer.GetExcelImporter(); + private readonly OpenXmlExporter _excelExporter = MiniExcel.Exporter.GetExcelExporter(); + private readonly OpenXmlTemplater _excelTemplater = MiniExcel.Templater.GetExcelTemplater(); + + // private readonly OpenXmlImporter _csvImporter = MiniExcel.Importer.GetCsvImporter(); + // private readonly OpenXmlExporter _csvExporter = MiniExcel.Exporter.GetCsvExporter(); /// /// https://github.com/mini-software/MiniExcel/issues/549 @@ -27,14 +30,15 @@ public void TestIssue549() { var data = new[] { - new{id=1,name="jack"}, - new{id=2,name="mike"}, + new{ id = 1, name = "jack" }, + new{ id = 2, name = "mike" } }; + using var file = AutoDeletingPath.Create(); var path = file.ToString(); - _exporter.ExportExcel(path, data); - var rows = _importer.QueryExcel(path, true).ToList(); + _excelExporter.Export(path, data); + var rows = _excelImporter.Query(path, true).ToList(); { using var stream = new FileStream(path, FileMode.Open, FileAccess.Read); using var workbook = new XSSFWorkbook(stream); @@ -42,7 +46,7 @@ public void TestIssue549() var sheet = workbook.GetSheetAt(0); var a2 = sheet.GetRow(1).GetCell(0); var b2 = sheet.GetRow(1).GetCell(1); - Assert.Equal((string)rows[0].id.ToString(), a2.NumericCellValue.ToString()); + Assert.Equal((string)rows[0].id.ToString(), a2.NumericCellValue.ToString(CultureInfo.InvariantCulture)); Assert.Equal((string)rows[0].name.ToString(), b2.StringCellValue); } } @@ -62,7 +66,7 @@ public void TestIssue24020201() new() { { "specialMark", 3 } }, } }; - _templater.ApplyXlsxTemplate(path.ToString(), templatePath, data); + _excelTemplater.ApplyTemplate(path.ToString(), templatePath, data); } [Fact] @@ -79,9 +83,9 @@ public void TestIssue553() new{ ITM=3 } } }; - _templater.ApplyXlsxTemplate(path.ToString(), templatePath, data); + _excelTemplater.ApplyTemplate(path.ToString(), templatePath, data); - var rows = _importer.QueryExcel(path.ToString()).ToList(); + var rows = _excelImporter.Query(path.ToString()).ToList(); Assert.Equal(rows[2].A, 1); Assert.Equal(rows[3].A, 2); Assert.Equal(rows[4].A, 3); @@ -97,9 +101,9 @@ public void TestIssue289() new() { Name="0002", UserType=DescriptionEnum.V2 }, new() { Name="0003", UserType=DescriptionEnum.V3 } ]; - _exporter.ExportExcel(path.ToString(), value); + _excelExporter.Export(path.ToString(), value); - var rows = _importer.QueryExcel(path.ToString()).ToList(); + var rows = _excelImporter.Query(path.ToString()).ToList(); Assert.Equal(DescriptionEnum.V1, rows[0].UserType); Assert.Equal(DescriptionEnum.V2, rows[1].UserType); @@ -130,8 +134,8 @@ public void TestIssue430() { new TestIssue430Dto{ Date=DateTimeOffset.Parse("2021-01-31 10:03:00 +05:00")} }; - _exporter.ExportExcel(path.ToString(), value); - var rows = _importer.QueryExcel(path.ToString()).ToArray(); + _excelExporter.Export(path.ToString(), value); + var rows = _excelImporter.Query(path.ToString()).ToArray(); Assert.Equal("2021-01-31 10:03:00 +05:00", rows[0].Date.ToString("yyyy-MM-dd HH:mm:ss zzz")); } @@ -154,7 +158,7 @@ public void TestIssue_DataReaderSupportDimension() using var path = AutoDeletingPath.Create(); using var reader = table.CreateDataReader(); var config = new OpenXmlConfiguration { FastMode = true }; - _exporter.ExportExcel(path.ToString(), reader, configuration: config); + _excelExporter.Export(path.ToString(), reader, configuration: config); var xml = SheetHelper.GetZipFileContent(path.ToString(), "xl/worksheets/sheet1.xml"); Assert.Contains("", xml); @@ -178,8 +182,8 @@ public void TestIssue413() } }; var templatePath = PathHelper.GetFile("xlsx/TestIssue413.xlsx"); - _templater.ApplyXlsxTemplate(path.ToString(), templatePath, value); - var rows = _importer.QueryExcel(path.ToString()).ToList(); + _excelTemplater.ApplyTemplate(path.ToString(), templatePath, value); + var rows = _excelImporter.Query(path.ToString()).ToList(); Assert.Equal("2022-12-25 00:00:00", rows[1].B); Assert.Equal("2022-09-23 00:00:00", rows[2].B); @@ -194,7 +198,7 @@ public void TestIssue405() { using var path = AutoDeletingPath.Create(); var value = new[] { new { id = 1, name = "test" } }; - _exporter.ExportExcel(path.ToString(), value); + _excelExporter.Export(path.ToString(), value); var xml = SheetHelper.GetZipFileContent(path.ToString(), "xl/sharedStrings.xml"); Assert.StartsWith(">>(json); - _exporter.ExportExcel(path.ToString(), value, configuration: config); + _excelExporter.Export(path.ToString(), value, configuration: config); - var rows = _importer.QueryExcel(path.ToString()).ToList(); + var rows = _excelImporter.Query(path.ToString()).ToList(); Assert.Equal("createdate", rows[0].A); Assert.Equal(new DateTime(2022, 04, 12), rows[1].A); Assert.Equal("name", rows[0].B); @@ -252,9 +256,9 @@ public void TestIssue369() }; using var path = AutoDeletingPath.Create(); var value = new[] { new { id = 1, name = "Jack", createdate = new DateTime(2022, 04, 12), point = 123.456 } }; - _exporter.ExportExcel(path.ToString(), value, configuration: config); + _excelExporter.Export(path.ToString(), value, configuration: config); - var rows = _importer.QueryExcel(path.ToString()).ToList(); + var rows = _excelImporter.Query(path.ToString()).ToList(); Assert.Equal("createdate", rows[0].A); Assert.Equal(new DateTime(2022, 04, 12), rows[1].A); Assert.Equal("name", rows[0].B); @@ -268,9 +272,9 @@ public void TestIssueI4ZYUU() { using var path = AutoDeletingPath.Create(); TestIssueI4ZYUUDto[] value = [new() { MyProperty = "1", MyProperty2 = new DateTime(2022, 10, 15) }]; - _exporter.ExportExcel(path.ToString(), value); + _excelExporter.Export(path.ToString(), value); - var rows = _importer.QueryExcel(path.ToString()).ToList(); + var rows = _excelImporter.Query(path.ToString()).ToList(); Assert.Equal("2022-10", rows[1].B); using var workbook = new ClosedXML.Excel.XLWorkbook(path.ToString()); @@ -293,10 +297,10 @@ public void TestIssue360() { var path = PathHelper.GetFile("xlsx/NotDuplicateSharedStrings_10x100.xlsx"); var config = new OpenXmlConfiguration { SharedStringCacheSize = 1 }; - var sheets = _importer.GetSheetNames(path); + var sheets = _excelImporter.GetSheetNames(path); foreach (var sheetName in sheets) { - var dt = _importer.QueryExcelAsDataTable(path, useHeaderRow: true, sheetName: sheetName, configuration: config); + var dt = _excelImporter.QueryAsDataTable(path, useHeaderRow: true, sheetName: sheetName, configuration: config); } } @@ -333,7 +337,7 @@ public void TestIssue352() using var path = AutoDeletingPath.Create(); var reader = table.CreateDataReader(); - _exporter.ExportExcel(path.ToString(), reader); + _excelExporter.Export(path.ToString(), reader); var xml = SheetHelper.GetZipFileContent(path.ToString(), "xl/worksheets/sheet1.xml"); var cnt = Regex.Matches(xml, "").Count; } @@ -346,7 +350,7 @@ public void TestIssue352() using var path = AutoDeletingPath.Create(); var reader = table.CreateDataReader(); - _exporter.ExportExcel(path.ToString(), reader, false); + _excelExporter.Export(path.ToString(), reader, false); var xml = SheetHelper.GetZipFileContent(path.ToString(), "xl/worksheets/sheet1.xml"); var cnt = Regex.Matches(xml, "").Count; } @@ -357,7 +361,7 @@ public void TestIssue352() using var path = AutoDeletingPath.Create(); var reader = table.CreateDataReader(); - _exporter.ExportExcel(path.ToString(), reader); + _excelExporter.Export(path.ToString(), reader); var xml = SheetHelper.GetZipFileContent(path.ToString(), "xl/worksheets/sheet1.xml"); var cnt = Regex.Matches(xml, "").Count; } @@ -381,7 +385,7 @@ public void TestIssue401(bool autoFilter, int count) var reader = table.CreateDataReader(); using var path = AutoDeletingPath.Create(); var config = new OpenXmlConfiguration { AutoFilter = autoFilter }; - _exporter.ExportExcel(path.ToString(), reader, configuration: config); + _excelExporter.Export(path.ToString(), reader, configuration: config); var xml = SheetHelper.GetZipFileContent(path.ToString(), "xl/worksheets/sheet1.xml"); var cnt = Regex.Matches(xml, "").Count; @@ -398,7 +402,7 @@ public void TestIssue401(bool autoFilter, int count) var reader = table.CreateDataReader(); using var path = AutoDeletingPath.Create(); var config = new OpenXmlConfiguration { AutoFilter = autoFilter }; - _exporter.ExportExcel(path.ToString(), reader, false, configuration: config); + _excelExporter.Export(path.ToString(), reader, false, configuration: config); var xml = SheetHelper.GetZipFileContent(path.ToString(), "xl/worksheets/sheet1.xml"); var cnt = Regex.Matches(xml, "").Count; @@ -413,7 +417,7 @@ public void TestIssue401(bool autoFilter, int count) var reader = table.CreateDataReader(); using var path = AutoDeletingPath.Create(); var config = new OpenXmlConfiguration { AutoFilter = autoFilter }; - _exporter.ExportExcel(path.ToString(), reader, configuration: config); + _excelExporter.Export(path.ToString(), reader, configuration: config); var xml = SheetHelper.GetZipFileContent(path.ToString(), "xl/worksheets/sheet1.xml"); var cnt = Regex.Matches(xml, "").Count; @@ -440,7 +444,7 @@ UNION ALL """; using var reader = command.ExecuteReader(); - _exporter.ExportExcel(path.ToString(), reader, configuration: config); + _excelExporter.Export(path.ToString(), reader, configuration: config); } var xml = SheetHelper.GetZipFileContent(path.ToString(), "xl/worksheets/sheet1.xml"); @@ -464,7 +468,7 @@ UNION ALL using (var transaction = connection.BeginTransaction()) using (var stream = File.OpenRead(xlsxPath)) { - var rows = _importer.QueryExcel(stream); + var rows = _excelImporter.Query(stream); foreach (var row in rows) connection.Execute( "insert into T (A,B) values (@A,@B)", @@ -482,7 +486,7 @@ UNION ALL using var command = new SQLiteCommand("select * from T", connection); connection.Open(); using var reader = command.ExecuteReader(); - _exporter.ExportExcel(path.ToString(), reader, configuration: config); + _excelExporter.Export(path.ToString(), reader, configuration: config); } var xml = SheetHelper.GetZipFileContent(path.ToString(), "xl/worksheets/sheet1.xml"); @@ -498,12 +502,12 @@ public async Task TestIssue307() var path = file.ToString(); var value = new[] { new { id = 1, name = "Jack" } }; - await _exporter.ExportExcelAsync(path, value); - Assert.Throws(() => _exporter.ExportExcel(path, value)); + await _excelExporter.ExportAsync(path, value); + Assert.Throws(() => _excelExporter.Export(path, value)); - await _exporter.ExportExcelAsync(path, value, overwriteFile: true); - await Assert.ThrowsAsync(async () => await _exporter.ExportExcelAsync(path, value)); - await _exporter.ExportExcelAsync(path, value, overwriteFile: true); + await _excelExporter.ExportAsync(path, value, overwriteFile: true); + await Assert.ThrowsAsync(async () => await _excelExporter.ExportAsync(path, value)); + await _excelExporter.ExportAsync(path, value, overwriteFile: true); } [Fact] @@ -511,8 +515,8 @@ public void TestIssue310() { using var path = AutoDeletingPath.Create(); var value = new[] { new TestIssue310Dto { V1 = null }, new TestIssue310Dto { V1 = 2 } }; - _exporter.ExportExcel(path.ToString(), value); - var rows = _importer.QueryExcel(path.ToString()).ToList(); + _excelExporter.Export(path.ToString(), value); + var rows = _excelImporter.Query(path.ToString()).ToList(); } [Fact] @@ -524,8 +528,8 @@ public void TestIssue310Fix497() new TestIssue310Dto { V1 = null }, new TestIssue310Dto { V1 = 2 } }; - _exporter.ExportExcel(path.ToString(), value, configuration: new OpenXmlConfiguration { EnableWriteNullValueCell = false }); - var rows = _importer.QueryExcel(path.ToString()).ToList(); + _excelExporter.Export(path.ToString(), value, configuration: new OpenXmlConfiguration { EnableWriteNullValueCell = false }); + var rows = _excelImporter.Query(path.ToString()).ToList(); } private class TestIssue310Dto @@ -551,9 +555,9 @@ public void TestIssue343() table.Rows.Add(date, date); } var reader = table.CreateDataReader(); - _exporter.ExportExcel(path.ToString(), reader); + _excelExporter.Export(path.ToString(), reader); - var rows = _importer.QueryExcel(path.ToString(), true).ToArray(); + var rows = _excelImporter.Query(path.ToString(), true).ToArray(); Assert.Equal(date, rows[0].time1); Assert.Equal(date, rows[0].time2); } @@ -564,7 +568,7 @@ public void TestIssueI4YCLQ_2() var c = GeneralHelper.ConvertColumnName(1); var c2 = GeneralHelper.ConvertColumnName(3); var path = PathHelper.GetFile("xlsx/TestIssueI4YCLQ_2.xlsx"); - var rows = _importer.QueryExcel(path, startCell: "B2").ToList(); + var rows = _excelImporter.Query(path, startCell: "B2").ToList(); Assert.Null(rows[0].站点编码); Assert.Equal("N1", rows[0].站址名称); @@ -614,8 +618,8 @@ public void TestIssueI4WM67() { ["users"] = Array.Empty() }; - _templater.ApplyXlsxTemplate(path.ToString(), templatePath, value); - var rows = _importer.QueryExcel(path.ToString()).ToList(); + _excelTemplater.ApplyTemplate(path.ToString(), templatePath, value); + var rows = _excelImporter.Query(path.ToString()).ToList(); Assert.Single(rows); } @@ -637,7 +641,7 @@ public void TestIssueI4WXFB() ["Amount"] = 1000, ["Department"] = "HR" }; - _templater.ApplyXlsxTemplate(path.ToString(), templatePath, value); + _excelTemplater.ApplyTemplate(path.ToString(), templatePath, value); } { @@ -653,7 +657,7 @@ public void TestIssueI4WXFB() ["Amount"] = 1000, ["Department"] = "HR" }; - Assert.Throws(() => _templater.ApplyXlsxTemplate(path.ToString(), templatePath, value, config)); + Assert.Throws(() => _excelTemplater.ApplyTemplate(path.ToString(), templatePath, value, config)); } } @@ -678,7 +682,7 @@ public void TestIssue331_2() }); using var path = AutoDeletingPath.Create(); - _exporter.ExportExcel(path.ToString(), data, configuration: config); + _excelExporter.Export(path.ToString(), data, configuration: config); CultureInfo.CurrentCulture = CultureInfo.GetCultureInfo(cln); } @@ -697,9 +701,9 @@ public void TestIssue331() }); using var path = AutoDeletingPath.Create(); - _exporter.ExportExcel(path.ToString(), data); + _excelExporter.Export(path.ToString(), data); - var rows = _importer.QueryExcel(path.ToString(), startCell: "A2").ToArray(); + var rows = _excelImporter.Query(path.ToString(), startCell: "A2").ToArray(); Assert.Equal(1.5, rows[2].B); Assert.Equal(1.5, rows[2].C); @@ -721,16 +725,16 @@ public void TestIssueI4TXGT() var path = file.ToString(); var value = new[] { new TestIssueI4TXGTDto { ID = 1, Name = "Apple", Spc = "X", Up = 6999 } }; - _exporter.ExportExcel(path, value); + _excelExporter.Export(path, value); { - var rows = _importer.QueryExcel(path).ToList(); + var rows = _excelImporter.Query(path).ToList(); Assert.Equal("ID", rows[0].A); Assert.Equal("Name", rows[0].B); Assert.Equal("Specification", rows[0].C); Assert.Equal("Unit Price", rows[0].D); } { - var rows = _importer.QueryExcel(path).ToList(); + var rows = _excelImporter.Query(path).ToList(); Assert.Equal(1, rows[0].ID); Assert.Equal("Apple", rows[0].Name); Assert.Equal("X", rows[0].Spc); @@ -769,10 +773,10 @@ public void TestIssue328() file = File.ReadAllBytes(PathHelper.GetFile("other/TestIssue327.txt")) }, }; - _exporter.ExportExcel(path.ToString(), value); + _excelExporter.Export(path.ToString(), value); var rowIndx = 0; - using var reader = _importer.GetExcelDataReader(path.ToString(), true); + using var reader = _excelImporter.GetExcelDataReader(path.ToString(), true); Assert.Equal("id", reader.GetName(0)); Assert.Equal("name", reader.GetName(1)); @@ -809,8 +813,8 @@ public void TestIssue327() new { id = 2, file = File.ReadAllBytes(PathHelper.GetFile("other/TestIssue327.txt")) }, new { id = 3, file = File.ReadAllBytes(PathHelper.GetFile("other/TestIssue327.html")) }, }; - _exporter.ExportExcel(path.ToString(), value); - var rows = _importer.QueryExcel(path.ToString(), true).ToList(); + _excelExporter.Export(path.ToString(), value); + var rows = _excelImporter.Query(path.ToString(), true).ToList(); Assert.Equal(value[0].file, rows[0].file); Assert.Equal(value[1].file, rows[1].file); @@ -831,7 +835,7 @@ public void TestIssue325() { "sheet1",new[]{ new { id = 1, date = DateTime.Parse("2022-01-01") } }}, { "sheet2",new[]{ new { id = 2, date = DateTime.Parse("2022-01-01") } }}, }; - _exporter.ExportExcel(path.ToString(), value); + _excelExporter.Export(path.ToString(), value); var xml = SheetHelper.GetZipFileContent(path.ToString(), "xl/worksheets/_rels/sheet2.xml.rels"); var cnt = Regex.Matches(xml, "Id=\"drawing2\"").Count; @@ -846,32 +850,16 @@ public void TestIssue325() public void TestIssueI49RZH() { // xlsx + using var path = AutoDeletingPath.Create(); + var value = new[] { - using var path = AutoDeletingPath.Create(); - var value = new[] - { - new TestIssueI49RZHDto{ dd = DateTimeOffset.Parse("2022-01-22")}, - new TestIssueI49RZHDto{ dd = null} - }; - _exporter.ExportExcel(path.ToString(), value); - - var rows = _importer.QueryExcel(path.ToString()).ToList(); - Assert.Equal("2022-01-22", rows[1].A); - } - - //TODO:CSV - { - using var path = AutoDeletingPath.Create(ExcelType.Csv); - var value = new[] - { - new TestIssueI49RZHDto{ dd = DateTimeOffset.Parse("2022-01-22")}, - new TestIssueI49RZHDto{ dd = null} - }; - _exporter.ExportExcel(path.ToString(), value); + new TestIssueI49RZHDto{ dd = DateTimeOffset.Parse("2022-01-22")}, + new TestIssueI49RZHDto{ dd = null} + }; + _excelExporter.Export(path.ToString(), value); - var rows = _importer.QueryExcel(path.ToString()).ToList(); - Assert.Equal("2022-01-22", rows[1].A); - } + var rows = _excelImporter.Query(path.ToString()).ToList(); + Assert.Equal("2022-01-22", rows[1].A); } private class TestIssueI49RZHDto @@ -886,33 +874,16 @@ private class TestIssueI49RZHDto [Fact] public void TestIssue312() { - //xlsx - { - using var path = AutoDeletingPath.Create(); - TestIssue312Dto[] value = - [ - new() { Value = 12345.6789}, - new() { Value = null} - ]; - _exporter.ExportExcel(path.ToString(), value); - - var rows = _importer.QueryExcel(path.ToString()).ToList(); - Assert.Equal("12,345.68", rows[1].A); - } - - //TODO:CSV - { - using var path = AutoDeletingPath.Create(ExcelType.Csv); - TestIssue312Dto[] value = - [ - new() { Value = 12345.6789}, - new() { Value = null} - ]; - _exporter.ExportExcel(path.ToString(), value); + using var path = AutoDeletingPath.Create(); + TestIssue312Dto[] value = + [ + new() { Value = 12345.6789}, + new() { Value = null} + ]; + _excelExporter.Export(path.ToString(), value); - var rows = _importer.QueryExcel(path.ToString()).ToList(); - Assert.Equal("12,345.68", rows[1].A); - } + var rows = _excelImporter.Query(path.ToString()).ToList(); + Assert.Equal("12,345.68", rows[1].A); } private class TestIssue312Dto @@ -931,7 +902,7 @@ public void TestIssue209() try { var path = PathHelper.GetFile("xlsx/TestIssue309.xlsx"); - var rows = _importer.QueryExcel(path).ToList(); + var rows = _excelImporter.Query(path).ToList(); } catch (MiniExcelInvalidCastException ex) { @@ -962,13 +933,13 @@ public void TestIssue318() { new { Name="github", Image=imageByte}, }; - _exporter.ExportExcel(path.ToString(), value); + _excelExporter.Export(path.ToString(), value); // import to byte[] { const string expectedBase64 = "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAIAAAD9b0jDAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAEXRFWHRTb2Z0d2FyZQBTbmlwYXN0ZV0Xzt0AAALNSURBVEiJ7ZVLTBNBGMdndrfdIofy0ERbCgcFeYRuCy2JGOPNRA9qeIZS6YEEogQj0YMmGOqDSATxQaLRxKtRID4SgjGelUBpaQvGZ7kpII8aWtjd2dkdDxsJoS1pIh6M/k+z8833m/3+8+0OJISArRa15cT/0D8CZTYPe32+Zy+GxjzjMzOzAACDYafdZquqOG7hzJtkwUQthRC6cavv0eN+QRTBujUQQp1OV1dbffZMq1arTRaqKIok4eZTrSNjHqIo6gIIIQBgbQwpal+Z/f7dPo2GoaiNHtJut3vjPhBe7+kdfvW61Mq1nGyaX1xYjkRzsk2Z6Rm8IOTvzWs73SLwwqjHK4jCgf3lcV6VxGgiECji7AXm0gvtHYQQnue/zy8ghCRJWlxaWuV5Qsilq9cKzLYiiz04ORVLiHP6A4NPRQlhjLWsVpZlnU63Y3umRqNhGCYjPV3HsrIsMwyDsYQQejIwGEuIA/WMT1AAaDSahnoHTdPKL1vXPKVp2umoZVkWAOj1+ZOCzs7NKYTo9XqjYRcAgKIo9ZRUu9VxltGYZTQAAL5+m0kKijEmAPCrqyJCcRuOECKI4lL4ByEEYykpaE62iQIgurLi9wchhLIsry8fYwwh9PomwuEwACDbZEoKauHMgKJSU1PbOy6Hpqdpml5fPsMwn7+EOru6IYQAghKrJSloTVUFURSX02G3lRw+WulqbA4EJ9XQh4+f2s6dr65zhkLTEEIKwtqaylhCnG/fauFO1Nfde/Bw6Hm/0WiYevc+LU2vhlK2pQwNvwQAsCwrYexyOrji4lhCnOaXZRljXONoOHTk2Ju3I/5AcC3EC0JZ+cE9Bea8IqursUkUker4BsWBqpIk6aL7Sm4htzvfvByJqJORaDS3kMsvLuns6kYIJcpNCFU17pvouXlHEET1URDEnt7bo2OezbMS/vp+R3/PdfKPQ38Ccg0E/CDcpY8AAAAASUVORK5CYII="; - var rows = _importer.QueryExcel(path.ToString(), true).ToList(); + var rows = _excelImporter.Query(path.ToString(), true).ToList(); var actulBase64 = Convert.ToBase64String((byte[])rows[0].Image); Assert.Equal(expectedBase64, actulBase64); } @@ -976,7 +947,7 @@ public void TestIssue318() // import to base64 string { var config = new OpenXmlConfiguration { EnableConvertByteArray = false }; - var rows = _importer.QueryExcel(path.ToString(), true, configuration: config).ToList(); + var rows = _excelImporter.Query(path.ToString(), true, configuration: config).ToList(); var image = (string)rows[0].Image; Assert.StartsWith("@@@fileid@@@,xl/media/", image); } @@ -999,7 +970,7 @@ public void TestIssue304() new { Name="reddit", Image=File.ReadAllBytes(PathHelper.GetFile("images/reddit_logo.png"))}, new { Name="statck_overflow", Image=File.ReadAllBytes(PathHelper.GetFile("images/statck_overflow_logo.png"))}, }; - _exporter.ExportExcel(path, value); + _excelExporter.Export(path, value); Assert.Contains("/xl/media/", SheetHelper.GetZipFileContent(path, "xl/drawings/_rels/drawing1.xml.rels")); Assert.Contains("ext cx=\"609600\" cy=\"190500\"", SheetHelper.GetZipFileContent(path, "xl/drawings/drawing1.xml")); @@ -1023,9 +994,9 @@ public void TestIssueI4HL54() { { "Texts",reader} }; - _templater.ApplyXlsxTemplate(path.ToString(), templatePath, value); + _excelTemplater.ApplyTemplate(path.ToString(), templatePath, value); - var rows = _importer.QueryExcel(path.ToString(), true).ToList(); + var rows = _excelImporter.Query(path.ToString(), true).ToList(); Assert.Equal("Hello World1", rows[0].Text); Assert.Equal("Hello World2", rows[1].Text); } @@ -1040,21 +1011,21 @@ public void TestIssue294() { using var path = AutoDeletingPath.Create(); var value = new[] { new { Name = " Jack" } }; - _exporter.ExportExcel(path.ToString(), value); + _excelExporter.Export(path.ToString(), value); var sheetXml = SheetHelper.GetZipFileContent(path.ToString(), "xl/worksheets/sheet1.xml"); Assert.Contains("xml:space=\"preserve\"", sheetXml); } { using var path = AutoDeletingPath.Create(); var value = new[] { new { Name = "Ja ck" } }; - _exporter.ExportExcel(path.ToString(), value); + _excelExporter.Export(path.ToString(), value); var sheetXml = SheetHelper.GetZipFileContent(path.ToString(), "xl/worksheets/sheet1.xml"); Assert.DoesNotContain("xml:space=\"preserve\"", sheetXml); } { using var path = AutoDeletingPath.Create(); var value = new[] { new { Name = "Jack " } }; - _exporter.ExportExcel(path.ToString(), value); + _excelExporter.Export(path.ToString(), value); var sheetXml = SheetHelper.GetZipFileContent(path.ToString(), "xl/worksheets/sheet1.xml"); Assert.Contains("xml:space=\"preserve\"", sheetXml); } @@ -1075,7 +1046,7 @@ public void TestIssueI4DQUN() { "Title", "Hello & World < , > , \" , '" }, { "Details", new[] { new { Value = "Hello & Value < , > , \" , '" } } }, }; - _templater.ApplyXlsxTemplate(path.ToString(), templatePath, value); + _excelTemplater.ApplyTemplate(path.ToString(), templatePath, value); var sheetXml = SheetHelper.GetZipFileContent(path.ToString(), "xl/worksheets/sheet1.xml"); Assert.Contains("Hello & World < , > , \" , '", sheetXml); @@ -1091,7 +1062,7 @@ public void TestIssue190() { using var path = AutoDeletingPath.Create(); var value = new TestIssue190Dto[] { }; - _exporter.ExportExcel(path.ToString(), value, configuration: new OpenXmlConfiguration { AutoFilter = false }); + _excelExporter.Export(path.ToString(), value, configuration: new OpenXmlConfiguration { AutoFilter = false }); var sheetXml = SheetHelper.GetZipFileContent(path.ToString(), "xl/worksheets/sheet1.xml"); Assert.DoesNotContain("", sheetXml); @@ -1099,7 +1070,7 @@ public void TestIssue190() { using var path = AutoDeletingPath.Create(); var value = new TestIssue190Dto[] { }; - _exporter.ExportExcel(path.ToString(), value); + _excelExporter.Export(path.ToString(), value); var sheetXml = SheetHelper.GetZipFileContent(path.ToString(), "xl/worksheets/sheet1.xml"); Assert.Contains("", sheetXml); @@ -1111,7 +1082,7 @@ public void TestIssue190() new() { ID = 1, Name = "Jack", Age = 32 }, new() { ID = 2, Name = "Lisa", Age = 45 } ]; - _exporter.ExportExcel(path.ToString(), value); + _excelExporter.Export(path.ToString(), value); var sheetXml = SheetHelper.GetZipFileContent(path.ToString(), "xl/worksheets/sheet1.xml"); Assert.Contains("", sheetXml); @@ -1137,8 +1108,8 @@ public void TestIssueI49RYZ() new() { Name="Lisa", UserType=null } ]; using var path = AutoDeletingPath.Create(); - _exporter.ExportExcel(path.ToString(), values); - var rows = _importer.QueryExcel(path.ToString(), true).ToList(); + _excelExporter.Export(path.ToString(), values); + var rows = _excelImporter.Query(path.ToString(), true).ToList(); Assert.Equal("GeneralUser", rows[0].UserType); Assert.Equal("SuperAdministrator", rows[1].UserType); Assert.Equal("GeneralAdministrator", rows[2].UserType); @@ -1154,8 +1125,8 @@ public void TestIssue286() new() { E = TestIssue286Enum.VIP2 } ]; using var path = AutoDeletingPath.Create(); - _exporter.ExportExcel(path.ToString(), values); - var rows = _importer.QueryExcel(path.ToString(), true).ToList(); + _excelExporter.Export(path.ToString(), values); + var rows = _excelImporter.Query(path.ToString(), true).ToList(); Assert.Equal("VIP1", rows[0].E); Assert.Equal("VIP2", rows[1].E); @@ -1196,11 +1167,11 @@ public void TestIssue283() { "sheet01", cn.ExecuteReader("select 'v1' col1") }, { "sheet02", cn.ExecuteReader("select 'v2' col1") } }; - var rows = _exporter.ExportExcel(path.ToString(), sheets); + var rows = _excelExporter.Export(path.ToString(), sheets); Assert.Equal(2, rows.Length); } - var sheetNames = _importer.GetSheetNames(path.ToString()); + var sheetNames = _excelImporter.GetSheetNames(path.ToString()); Assert.Equal(["sheet01", "sheet02"], sheetNames); } @@ -1212,25 +1183,25 @@ public void TestIssueI40QA5() { { var path = PathHelper.GetFile("/xlsx/TestIssueI40QA5_1.xlsx"); - var rows = _importer.QueryExcel(path).ToList(); + var rows = _excelImporter.Query(path).ToList(); Assert.Equal("E001", rows[0].Empno); Assert.Equal("E002", rows[1].Empno); } { var path = PathHelper.GetFile("/xlsx/TestIssueI40QA5_2.xlsx"); - var rows = _importer.QueryExcel(path).ToList(); + var rows = _excelImporter.Query(path).ToList(); Assert.Equal("E001", rows[0].Empno); Assert.Equal("E002", rows[1].Empno); } { var path = PathHelper.GetFile("/xlsx/TestIssueI40QA5_3.xlsx"); - var rows = _importer.QueryExcel(path).ToList(); + var rows = _excelImporter.Query(path).ToList(); Assert.Equal("E001", rows[0].Empno); Assert.Equal("E002", rows[1].Empno); } { var path = PathHelper.GetFile("/xlsx/TestIssueI40QA5_4.xlsx"); - var rows = _importer.QueryExcel(path).ToList(); + var rows = _excelImporter.Query(path).ToList(); Assert.Null(rows[0].Empno); Assert.Null(rows[1].Empno); } @@ -1252,8 +1223,8 @@ public void TestIssues133() var value = new DataTable(); value.Columns.Add("Id"); value.Columns.Add("Name"); - _exporter.ExportExcel(path.ToString(), value); - var rows = _importer.QueryExcel(path.ToString()).ToList(); + _excelExporter.Export(path.ToString(), value); + var rows = _excelImporter.Query(path.ToString()).ToList(); Assert.Equal("Id", rows[0].A); Assert.Equal("Name", rows[0].B); @@ -1265,8 +1236,8 @@ public void TestIssues133() using var path = AutoDeletingPath.Create(); var value = Array.Empty(); - _exporter.ExportExcel(path.ToString(), value); - var rows = _importer.QueryExcel(path.ToString()).ToList(); + _excelExporter.Export(path.ToString(), value); + var rows = _excelImporter.Query(path.ToString()).ToList(); Assert.Equal("Id", rows[0].A); Assert.Equal("Name", rows[0].B); @@ -1290,7 +1261,7 @@ public void TestIssueI45TF5_2() { var value = new[] { new Dictionary { { "Col1&Col2", "V1&V2" } } }; var path = PathHelper.GetTempPath(); - _exporter.ExportExcel(path, value); + _excelExporter.Export(path, value); //System.Xml.XmlException : '<' is an unexpected token. The expected token is ';'. SheetHelper.GetZipFileContent(path, "xl/worksheets/sheet1.xml"); //check illegal format or not } @@ -1300,7 +1271,7 @@ public void TestIssueI45TF5_2() dt.Columns.Add("Col1&Col2"); dt.Rows.Add("V1&V2"); var path = PathHelper.GetTempPath(); - _exporter.ExportExcel(path, dt); + _excelExporter.Export(path, dt); //System.Xml.XmlException : '<' is an unexpected token. The expected token is ';'. SheetHelper.GetZipFileContent(path, "xl/worksheets/sheet1.xml"); //check illegal format or not } @@ -1310,7 +1281,7 @@ public void TestIssueI45TF5_2() public void TestIssueI45TF5() { using var path = AutoDeletingPath.Create(); - _exporter.ExportExcel(path.ToString(), new[] { new { C1 = "1&2;3,4", C2 = "1&2;3,4" } }); + _excelExporter.Export(path.ToString(), new[] { new { C1 = "1&2;3,4", C2 = "1&2;3,4" } }); var sheet1Xml = SheetHelper.GetZipFileContent(path.ToString(), "xl/worksheets/sheet1.xml"); Assert.DoesNotContain("", sheet1Xml); } @@ -1327,7 +1298,7 @@ public void TestIssue280() new() { ID = 2, Name = "Mike" } ]; using var path = AutoDeletingPath.Create(); - _exporter.ExportExcel(path.ToString(), value); + _excelExporter.Export(path.ToString(), value); } private class TestIssue280Dto @@ -1345,7 +1316,7 @@ private class TestIssue280Dto public void TestIssue272() { var path = PathHelper.GetFile("/xlsx/TestIssue272.xlsx"); - Assert.Throws(() => _importer.QueryExcel(path).ToList()); + Assert.Throws(() => _excelImporter.Query(path).ToList()); } /// @@ -1355,7 +1326,7 @@ public void TestIssue272() public void TestIssue267() { var path = PathHelper.GetFile("/xlsx/TestIssue267.xlsx"); - var row = _importer.QueryExcel(path).SingleOrDefault(); + var row = _excelImporter.Query(path).SingleOrDefault(); Assert.Equal(10618, row!.A); Assert.Equal("2021-02-23", row.B); Assert.Equal(43.199999999999996, row.C); @@ -1398,7 +1369,7 @@ public void TestIssueI3X2ZL() try { var path = PathHelper.GetFile("xlsx/TestIssueI3X2ZL_datetime_error.xlsx"); - var rows = _importer.QueryExcel(path, startCell: "B3").ToList(); + var rows = _excelImporter.Query(path, startCell: "B3").ToList(); } catch (InvalidCastException ex) { @@ -1411,7 +1382,7 @@ public void TestIssueI3X2ZL() try { var path = PathHelper.GetFile("xlsx/TestIssueI3X2ZL_int_error.xlsx"); - var rows = _importer.QueryExcel(path).ToList(); + var rows = _excelImporter.Query(path).ToList(); } catch (InvalidCastException ex) { @@ -1446,8 +1417,8 @@ public void Issue255() new Issue255DTO { Time = new DateTime(2021, 01, 01), Time2 = new DateTime(2021, 01, 01) } } }; - _templater.ApplyXlsxTemplate(path.ToString(), templatePath, value); - var rows = _importer.QueryExcel(path.ToString()).ToList(); + _excelTemplater.ApplyTemplate(path.ToString(), templatePath, value); + var rows = _excelImporter.Query(path.ToString()).ToList(); Assert.Equal("2021", rows[1].A.ToString()); Assert.Equal("2021", rows[1].B.ToString()); } @@ -1458,8 +1429,8 @@ public void Issue255() { new Issue255DTO { Time = new DateTime(2021, 01, 01) } }; - _exporter.ExportExcel(path.ToString(), value); - var rows = _importer.QueryExcel(path.ToString()).ToList(); + _excelExporter.Export(path.ToString(), value); + var rows = _excelImporter.Query(path.ToString()).ToList(); Assert.Equal("2021", rows[1].A.ToString()); } } @@ -1481,7 +1452,7 @@ private class Issue255DTO public void Issue256() { var path = PathHelper.GetFile("xlsx/TestIssue256.xlsx"); - var rows = _importer.QueryExcel(path, false).ToList(); + var rows = _excelImporter.Query(path, false).ToList(); Assert.Equal(new DateTime(2003, 4, 16), rows[1].A); Assert.Equal(new DateTime(2004, 4, 16), rows[1].B); } @@ -1493,41 +1464,10 @@ public void Issue256() public void Issue242() { var path = PathHelper.GetFile("xls/TestIssue242.xls"); - Assert.Throws(() => _importer.QueryExcel(path).ToList()); + Assert.Throws(() => _excelImporter.Query(path).ToList()); using var stream = File.OpenRead(path); - Assert.Throws(() => _importer.QueryExcel(stream).ToList()); - } - - /// - /// Csv type mapping Query error "cannot be converted to xxx type" #243 - /// - [Fact] - public void Issue243() - { - using var path = AutoDeletingPath.Create(ExcelType.Csv); - var value = new[] - { - new { Name = "Jack", Age = 25, InDate = new DateTime(2021,01,03) }, - new { Name = "Henry", Age = 36, InDate = new DateTime(2020,05,03) }, - }; - _exporter.ExportExcel(path.ToString(), value); - - var rows = _importer.QueryExcel(path.ToString()).ToList(); - Assert.Equal("Jack", rows[0].Name); - Assert.Equal(25, rows[0].Age); - Assert.Equal(new DateTime(2021, 01, 03), rows[0].InDate); - - Assert.Equal("Henry", rows[1].Name); - Assert.Equal(36, rows[1].Age); - Assert.Equal(new DateTime(2020, 05, 03), rows[1].InDate); - } - - private class Issue243Dto - { - public string Name { get; set; } - public int Age { get; set; } - public DateTime InDate { get; set; } + Assert.Throws(() => _excelImporter.Query(stream).ToList()); } /// @@ -1536,48 +1476,22 @@ private class Issue243Dto [Fact] public void Issue241() { - Issue241Dto[] value = [ new() { Name = "Jack", InDate = new DateTime(2021,01,04) }, new() { Name = "Henry", InDate = new DateTime(2020,04,05) } ]; - // csv - { - using var path = AutoDeletingPath.Create(ExcelType.Csv); - _exporter.ExportExcel(path.ToString(), value); - - { - var rows = _importer.QueryExcel(path.ToString(), true).ToList(); - Assert.Equal(rows[0].InDate, "01 04, 2021"); - Assert.Equal(rows[1].InDate, "04 05, 2020"); - } - - { - var rows = _importer.QueryExcel(path.ToString()).ToList(); - Assert.Equal(rows[0].InDate, new DateTime(2021, 01, 04)); - Assert.Equal(rows[1].InDate, new DateTime(2020, 04, 05)); - } - } - - // xlsx - { - using var path = AutoDeletingPath.Create(); - _exporter.ExportExcel(path.ToString(), value); + using var path = AutoDeletingPath.Create(); + _excelExporter.Export(path.ToString(), value); - { - var rows = _importer.QueryExcel(path.ToString(), true).ToList(); - Assert.Equal(rows[0].InDate, "01 04, 2021"); - Assert.Equal(rows[1].InDate, "04 05, 2020"); - } + var rows1 = _excelImporter.Query(path.ToString(), true).ToList(); + Assert.Equal(rows1[0].InDate, "01 04, 2021"); + Assert.Equal(rows1[1].InDate, "04 05, 2020"); - { - var rows = _importer.QueryExcel(path.ToString()).ToList(); - Assert.Equal(rows[0].InDate, new DateTime(2021, 01, 04)); - Assert.Equal(rows[1].InDate, new DateTime(2020, 04, 05)); - } - } + var rows2 = _excelImporter.Query(path.ToString()).ToList(); + Assert.Equal(rows2[0].InDate, new DateTime(2021, 01, 04)); + Assert.Equal(rows2[1].InDate, new DateTime(2020, 04, 05)); } private class Issue241Dto @@ -1601,7 +1515,7 @@ public void Issue132() new { name = "Henry", Age = 36, InDate = new DateTime(2020,05,03)}, }; - _exporter.ExportExcel(path.ToString(), value); + _excelExporter.Export(path.ToString(), value); } { @@ -1615,7 +1529,7 @@ public void Issue132() { TableStyles = TableStyles.None }; - _exporter.ExportExcel(path.ToString(), value, configuration: config); + _excelExporter.Export(path.ToString(), value, configuration: config); } { @@ -1627,7 +1541,7 @@ public void Issue132() new { name = "Henry", Age = 36, InDate = new DateTime(2020,05,03)}, }) ); - _exporter.ExportExcel(path.ToString(), value); + _excelExporter.Export(path.ToString(), value); } } @@ -1657,23 +1571,23 @@ public void Issue235() dataSet.Tables.Add(users); dataSet.Tables.Add(department); - var rowsWritten = _exporter.ExportExcel(path.ToString(), dataSet); + var rowsWritten = _excelExporter.Export(path.ToString(), dataSet); Assert.Equal(2, rowsWritten.Length); Assert.Equal(2, rowsWritten[0]); - var sheetNames = _importer.GetSheetNames(path.ToString()); + var sheetNames = _excelImporter.GetSheetNames(path.ToString()); Assert.Equal("users", sheetNames[0]); Assert.Equal("department", sheetNames[1]); { - var rows = _importer.QueryExcel(path.ToString(), true, sheetName: "users").ToList(); + var rows = _excelImporter.Query(path.ToString(), true, sheetName: "users").ToList(); Assert.Equal("Jack", rows[0].Name); Assert.Equal(25, rows[0].Age); Assert.Equal("Mike", rows[1].Name); Assert.Equal(44, rows[1].Age); } { - var rows = _importer.QueryExcel(path.ToString(), true, sheetName: "department").ToList(); + var rows = _excelImporter.Query(path.ToString(), true, sheetName: "department").ToList(); Assert.Equal("01", rows[0].ID); Assert.Equal("HR", rows[0].Name); Assert.Equal("02", rows[1].ID); @@ -1688,36 +1602,15 @@ public void Issue235() public void Issue233() { var path = PathHelper.GetFile("xlsx/TestIssue233.xlsx"); -#pragma warning disable CS0618 // Type or member is obsolete - var dt = _importer.QueryExcelAsDataTable(path); -#pragma warning restore CS0618 + + var dt = _excelImporter.QueryAsDataTable(path); + var rows = dt.Rows; Assert.Equal(0.55, rows[0]["Size"]); Assert.Equal("0.55/1.1", rows[1]["Size"]); } - /// - /// Csv Query split comma not correct #237 - /// https://github.com/mini-software/MiniExcel/issues/237 - /// - [Fact] - public void Issue237() - { - var value = new[] - { - new{ id="\"\"1,2,3\"\""}, - new{ id="1,2,3"}, - }; - using var path = AutoDeletingPath.Create(ExcelType.Csv); - _exporter.ExportExcel(path.ToString(), value); - - var rows = _importer.QueryExcel(path.ToString(), true).ToList(); - - Assert.Equal("\"\"1,2,3\"\"", rows[0].id); - Assert.Equal("1,2,3", rows[1].id); - } - /// /// SaveAs support multiple sheets #234 /// @@ -1742,21 +1635,21 @@ public void Issue234() ["users"] = users, ["department"] = department }; - _exporter.ExportExcel(path, sheets); + _excelExporter.Export(path, sheets); - var sheetNames = _importer.GetSheetNames(path); + var sheetNames = _excelImporter.GetSheetNames(path); Assert.Equal("users", sheetNames[0]); Assert.Equal("department", sheetNames[1]); { - var rows = _importer.QueryExcel(path, true, sheetName: "users").ToList(); + var rows = _excelImporter.Query(path, true, sheetName: "users").ToList(); Assert.Equal("Jack", rows[0].Name); Assert.Equal(25, rows[0].Age); Assert.Equal("Mike", rows[1].Name); Assert.Equal(44, rows[1].Age); } { - var rows = _importer.QueryExcel(path, true, sheetName: "department").ToList(); + var rows = _excelImporter.Query(path, true, sheetName: "department").ToList(); Assert.Equal("01", rows[0].ID); Assert.Equal("HR", rows[0].Name); Assert.Equal("02", rows[1].ID); @@ -1811,8 +1704,8 @@ public void Issue230() using (var reader = cmd3.ExecuteReader(CommandBehavior.CloseConnection)) { using var path = AutoDeletingPath.Create(); - _exporter.ExportExcel(path.ToString(), reader, printHeader: true); - var rows = _importer.QueryExcel(path.ToString(), true).ToList(); + _excelExporter.Export(path.ToString(), reader, printHeader: true); + var rows = _excelImporter.Query(path.ToString(), true).ToList(); Assert.Equal(1, rows[0].id); Assert.Equal(2, rows[1].id); } @@ -1826,9 +1719,9 @@ public void Issue230() public void Issue229() { var path = PathHelper.GetFile("xlsx/TestIssue229.xlsx"); -#pragma warning disable CS0618 // Type or member is obsolete - using var dt = _importer.QueryExcelAsDataTable(path); -#pragma warning restore CS0618 + + using var dt = _excelImporter.QueryAsDataTable(path); + foreach (DataColumn column in dt.Columns) { var v = dt.Rows[3][column]; @@ -1850,7 +1743,7 @@ public void Issue122() { var path = PathHelper.GetFile("xlsx/TestIssue122.xlsx"); { - var rows = _importer.QueryExcel(path, useHeaderRow: true, configuration: config).ToList(); + var rows = _excelImporter.Query(path, useHeaderRow: true, configuration: config).ToList(); Assert.Equal("HR", rows[0].Department); Assert.Equal("HR", rows[1].Department); Assert.Equal("HR", rows[2].Department); @@ -1863,7 +1756,7 @@ public void Issue122() { var path = PathHelper.GetFile("xlsx/TestIssue122_2.xlsx"); { - var rows = _importer.QueryExcel(path, useHeaderRow: true, configuration: config).ToList(); + var rows = _excelImporter.Query(path, useHeaderRow: true, configuration: config).ToList(); Assert.Equal("V1", rows[2].Test1); Assert.Equal("V2", rows[5].Test2); Assert.Equal("V3", rows[1].Test3); @@ -1883,14 +1776,14 @@ public void Issue227() { { var path = PathHelper.GetTempPath("xlsm"); - Assert.Throws(() => _exporter.ExportExcel(path, new[] { new { V = "A1" }, new { V = "A2" } })); + Assert.Throws(() => _excelExporter.Export(path, new[] { new { V = "A1" }, new { V = "A2" } })); File.Delete(path); } { var path = PathHelper.GetFile("xlsx/TestIssue227.xlsm"); { - var rows = _importer.QueryExcel(path).ToList(); + var rows = _excelImporter.Query(path).ToList(); Assert.Equal(100, rows.Count); Assert.Equal(Guid.Parse("78DE23D2-DCB6-BD3D-EC67-C112BBC322A2"), rows[0].ID); @@ -1903,7 +1796,7 @@ public void Issue227() } { using var stream = File.OpenRead(path); - var rows = _importer.QueryExcel(stream).ToList(); + var rows = _excelImporter.Query(stream).ToList(); Assert.Equal(100, rows.Count); Assert.Equal(Guid.Parse("78DE23D2-DCB6-BD3D-EC67-C112BBC322A2"), rows[0].ID); @@ -1928,7 +1821,7 @@ public void Issue226() { using var path = AutoDeletingPath.Create(); var templatePath = PathHelper.GetFile("xlsx/TestIssue226.xlsx"); - _templater.ApplyXlsxTemplate(path.ToString(), templatePath, new { employees = new[] { new { name = "123" }, new { name = "123" } } }); + _excelTemplater.ApplyTemplate(path.ToString(), templatePath, new { employees = new[] { new { name = "123" }, new { name = "123" } } }); Assert.Equal("A1:A3", SheetHelper.GetFirstSheetDimensionRefValue(path.ToString())); } @@ -1946,11 +1839,10 @@ public void Issue223() new() { { "A", Guid.NewGuid() }, { "B", "HelloWorld" } } ]; using var path = AutoDeletingPath.Create(); - _exporter.ExportExcel(path.ToString(), value); + _excelExporter.Export(path.ToString(), value); + + using var dt = _excelImporter.QueryAsDataTable(path.ToString()); -#pragma warning disable CS0618 // Type or member is obsolete - using var dt = _importer.QueryExcelAsDataTable(path.ToString()); -#pragma warning restore CS0618 var columns = dt.Columns; Assert.Equal(typeof(object), columns[0].DataType); Assert.Equal(typeof(object), columns[1].DataType); @@ -1967,7 +1859,7 @@ public void Issue223() public void Issue222() { var path = PathHelper.GetFile("xlsx/TestIssue222.xlsx"); - var rows = _importer.QueryExcel(path).ToList(); + var rows = _excelImporter.Query(path).ToList(); Assert.Equal(typeof(DateTime), rows[1].A.GetType()); Assert.Equal(new DateTime(2021, 4, 29), rows[1].A); } @@ -1981,7 +1873,7 @@ public void Issue147() { { var path = PathHelper.GetFile("xlsx/TestIssue147.xlsx"); - var rows = _importer.QueryExcel(path, useHeaderRow: false, startCell: "C3", sheetName: "Sheet1").ToList(); + var rows = _excelImporter.Query(path, useHeaderRow: false, startCell: "C3", sheetName: "Sheet1").ToList(); Assert.Equal(["C", "D", "E"], (rows[0] as IDictionary)?.Keys); Assert.Equal(["Column1", "Column2", "Column3"], new[] { rows[0].C as string, rows[0].D as string, rows[0].E as string }); @@ -1995,13 +1887,13 @@ public void Issue147() Assert.Equal(11, rows.Count); - var columns = _importer.GetExcelColumns(path, startCell: "C3"); + var columns = _excelImporter.GetColumnNames(path, startCell: "C3"); Assert.Equal(["C", "D", "E"], columns); } { var path = PathHelper.GetFile("xlsx/TestIssue147.xlsx"); - var rows = _importer.QueryExcel(path, useHeaderRow: true, startCell: "C3", sheetName: "Sheet1").ToList(); + var rows = _excelImporter.Query(path, useHeaderRow: true, startCell: "C3", sheetName: "Sheet1").ToList(); Assert.Equal(["Column1", "Column2", "Column3"], (rows[0] as IDictionary)?.Keys); Assert.Equal(["C4", "D4", "E4"], new[] { rows[0].Column1 as string, rows[0].Column2 as string, rows[0].Column3 as string }); @@ -2013,7 +1905,7 @@ public void Issue147() Assert.Equal(10, rows.Count); - var columns = _importer.GetExcelColumns(path, useHeaderRow: true, startCell: "C3"); + var columns = _excelImporter.GetColumnNames(path, useHeaderRow: true, startCell: "C3"); Assert.Equal(["Column1", "Column2", "Column3"], columns); } } @@ -2032,8 +1924,8 @@ public void Issue211() using var connection = new SQLiteConnection(connectionString); var reader = connection.ExecuteReader(@"select 1 Test1,2 Test2 union all select 3 , 4 union all select 5 ,6"); - _exporter.ExportExcel(path.ToString(), reader); - var rows = _importer.QueryExcel(path.ToString(), true).ToList(); + _excelExporter.Export(path.ToString(), reader); + var rows = _excelImporter.Query(path.ToString(), true).ToList(); Assert.Equal(1.0, rows[0].Test1); Assert.Equal(2.0, rows[0].Test2); @@ -2053,12 +1945,11 @@ public void Issue216() new { Test1 = "1", Test2 = 2 }, new { Test1 = "3", Test2 = 4 } }; - _exporter.ExportExcel(path.ToString(), value); + _excelExporter.Export(path.ToString(), value); { -#pragma warning disable CS0618 // Type or member is obsolete - using var table = _importer.QueryExcelAsDataTable(path.ToString()); -#pragma warning restore CS0618 + using var table = _excelImporter.QueryAsDataTable(path.ToString()); + Assert.Equal("Test1", table.Columns[0].ColumnName); Assert.Equal("Test2", table.Columns[1].ColumnName); Assert.Equal("1", table.Rows[0]["Test1"]); @@ -2068,9 +1959,8 @@ public void Issue216() } { -#pragma warning disable CS0618 // Type or member is obsolete - using var dt = _importer.QueryExcelAsDataTable(path.ToString(), false); -#pragma warning restore CS0618 + using var dt = _excelImporter.QueryAsDataTable(path.ToString(), false); + Assert.Equal("Test1", dt.Rows[0]["A"]); Assert.Equal("Test2", dt.Rows[0]["B"]); Assert.Equal("1", dt.Rows[1]["A"]); @@ -2090,18 +1980,18 @@ public void IssueI3OSKV() { using var path = AutoDeletingPath.Create(); var value = new[] { new { Test = "12345678901234567890" } }; - _exporter.ExportExcel(path.ToString(), value); + _excelExporter.Export(path.ToString(), value); - var A2 = _importer.QueryExcel(path.ToString(), true).First().Test; + var A2 = _excelImporter.Query(path.ToString(), true).First().Test; Assert.Equal("12345678901234567890", A2); } { using var path = AutoDeletingPath.Create(); var value = new[] { new { Test = 123456.789 } }; - _exporter.ExportExcel(path.ToString(), value); + _excelExporter.Export(path.ToString(), value); - var A2 = _importer.QueryExcel(path.ToString(), true).First().Test; + var A2 = _excelImporter.Query(path.ToString(), true).First().Test; Assert.Equal(123456.789, A2); } } @@ -2115,7 +2005,7 @@ public void IssueI3OSKV() public void Issue220() { var path = PathHelper.GetFile("xlsx/TestIssue220.xlsx"); - var rows = _importer.QueryExcel(path, useHeaderRow: true); + var rows = _excelImporter.Query(path, useHeaderRow: true); var result = rows .GroupBy(s => s.PRT_ID) .Select(g => new @@ -2139,8 +2029,8 @@ public void Issue220() public void Issue215() { using var stream = new MemoryStream(); - _exporter.ExportExcel(stream, new[] { new { V = "test1" }, new { V = "test2" } }); - var rows = _importer.QueryExcel(stream, true).ToList(); + _excelExporter.Export(stream, new[] { new { V = "test1" }, new { V = "test2" } }); + var rows = _excelImporter.Query(stream, true).ToList(); Assert.Equal("test1", rows[0].V); Assert.Equal("test2", rows[1].V); @@ -2160,29 +2050,16 @@ public void Issue217() table.Rows.Add(1, "Jonathan", 23.44); table.Rows.Add(2, "Bill", 56.87); - // openxml - { - using var path = AutoDeletingPath.Create(); - _exporter.ExportExcel(path.ToString(), table); - - var rows = _importer.QueryExcel(path.ToString()).ToList(); - Assert.Equal("Name", rows[0].B); - Assert.Equal("Limit", rows[0].C); - } - - // csv - { - using var path = AutoDeletingPath.Create(ExcelType.Csv); - _exporter.ExportExcel(path.ToString(), table); + using var path = AutoDeletingPath.Create(); + _excelExporter.Export(path.ToString(), table); - var rows = _importer.QueryExcel(path.ToString()).ToList(); - Assert.Equal("Name", rows[0].B); - Assert.Equal("Limit", rows[0].C); - } + var rows = _excelImporter.Query(path.ToString()).ToList(); + Assert.Equal("Name", rows[0].B); + Assert.Equal("Limit", rows[0].C); } /// - /// _ _exporter.ExportExcel(path, table,sheetName:“Name”) ,the actual sheetName is Sheet1 + /// _ _exporter.Export(path, table,sheetName:“Name”) ,the actual sheetName is Sheet1 /// https://github.com/mini-software/MiniExcel/issues/212 /// [Fact] @@ -2190,9 +2067,9 @@ public void Issue212() { const string sheetName = "Demo"; using var path = AutoDeletingPath.Create(); - _exporter.ExportExcel(path.ToString(), new[] { new { x = 1, y = 2 } }, sheetName: sheetName); + _excelExporter.Export(path.ToString(), new[] { new { x = 1, y = 2 } }, sheetName: sheetName); - var actualSheetName = _importer.GetSheetNames(path.ToString()).ToList()[0]; + var actualSheetName = _excelImporter.GetSheetNames(path.ToString()).ToList()[0]; Assert.Equal(sheetName, actualSheetName); } @@ -2218,8 +2095,8 @@ public void Issue207() } }; - _templater.ApplyXlsxTemplate(path, tempaltePath, value); - var rows = _importer.QueryExcel(path).ToList(); + _excelTemplater.ApplyTemplate(path, tempaltePath, value); + var rows = _excelImporter.Query(path).ToList(); Assert.Equal("項目1", rows[0].A); Assert.Equal("[]內容1,[]內容2,[]內容3,[]內容4,[]內容5", rows[0].B); @@ -2262,8 +2139,8 @@ public void Issue207() } }; - _templater.ApplyXlsxTemplate(path, tempaltePath, value); - var rows = _importer.QueryExcel(path).ToList(); + _excelTemplater.ApplyTemplate(path, tempaltePath, value); + var rows = _excelImporter.Query(path).ToList(); Assert.Equal("項目1", rows[0].A); Assert.Equal("[]內容1,[]內容2,[]內容3,[]內容4,[]內容5", rows[0].C); @@ -2291,8 +2168,8 @@ public void Issue87() Tests = Enumerable.Range(1, 5).Select((_, i) => new { test1 = i, test2 = i }) }; - var rows = _importer.QueryExcel(templatePath).ToList(); - _templater.ApplyXlsxTemplate(path.ToString(), templatePath, value); + var rows = _excelImporter.Query(templatePath).ToList(); + _excelTemplater.ApplyTemplate(path.ToString(), templatePath, value); } /// @@ -2302,7 +2179,7 @@ public void Issue87() public void Issue208() { const string path = "../../../../../samples/xlsx/TestIssue208.xlsx"; - var columns = _importer.GetExcelColumns(path).ToList(); + var columns = _excelImporter.GetColumnNames(path).ToList(); Assert.Equal(16384, columns.Count); Assert.Equal("XFD", columns[16383]); } @@ -2326,7 +2203,7 @@ public void Issue206() { ["employees"] = dt }; - _templater.ApplyXlsxTemplate(path.ToString(), templatePath, value); + _excelTemplater.ApplyTemplate(path.ToString(), templatePath, value); var dimension = SheetHelper.GetFirstSheetDimensionRefValue(path.ToString()); Assert.Equal("A1:B2", dimension); @@ -2342,7 +2219,7 @@ public void Issue206() dt.Rows.Add("Jack", "HR"); var value = new Dictionary { ["employees"] = dt }; - _templater.ApplyXlsxTemplate(path.ToString(), templatePath, value); + _excelTemplater.ApplyTemplate(path.ToString(), templatePath, value); var dimension = SheetHelper.GetFirstSheetDimensionRefValue(path.ToString()); Assert.Equal("A1:B2", dimension); @@ -2378,11 +2255,11 @@ public void Issue193() new { name = "Keaton", department = "IT" } } }; - _templater.ApplyXlsxTemplate(path, templatePath, value); + _excelTemplater.ApplyTemplate(path, templatePath, value); - foreach (var sheetName in _importer.GetSheetNames(path)) + foreach (var sheetName in _excelImporter.GetSheetNames(path)) { - var rows = _importer.QueryExcel(path, sheetName: sheetName).ToList(); + var rows = _excelImporter.Query(path, sheetName: sheetName).ToList(); Assert.Equal(9, rows.Count); Assert.Equal("FooCompany", rows[0].A); @@ -2429,8 +2306,8 @@ public void Issue193() new {name="Keaton",department="IT"} } }; - _templater.ApplyXlsxTemplate(path.ToString(), templatePath, value); - var rows = _importer.QueryExcel(path.ToString()).ToList(); + _excelTemplater.ApplyTemplate(path.ToString(), templatePath, value); + var rows = _excelImporter.Query(path.ToString()).ToList(); Assert.Equal("FooCompany", rows[0].A); Assert.Equal("Jack", rows[2].B); @@ -2461,19 +2338,19 @@ public void Issue150() { var path = Path.Combine(Path.GetTempPath(), $"{Guid.NewGuid()}.xlsx"); - Assert.Throws(() => _exporter.ExportExcel(path, new[] { 1, 2 })); + Assert.Throws(() => _excelExporter.Export(path, new[] { 1, 2 })); File.Delete(path); - Assert.Throws(() => _exporter.ExportExcel(path, new[] { "1", "2" })); + Assert.Throws(() => _excelExporter.Export(path, new[] { "1", "2" })); File.Delete(path); - Assert.Throws(() => _exporter.ExportExcel(path, new[] { '1', '2' })); + Assert.Throws(() => _excelExporter.Export(path, new[] { '1', '2' })); File.Delete(path); - Assert.Throws(() => _exporter.ExportExcel(path, new[] { DateTime.Now })); + Assert.Throws(() => _excelExporter.Export(path, new[] { DateTime.Now })); File.Delete(path); - Assert.Throws(() => _exporter.ExportExcel(path, new[] { Guid.NewGuid() })); + Assert.Throws(() => _excelExporter.Export(path, new[] { Guid.NewGuid() })); File.Delete(path); } @@ -2523,11 +2400,11 @@ public void Issue157() } ] """); - _exporter.ExportExcel(path, input); + _excelExporter.Export(path, input); - var rows = _importer.QueryExcel(path, sheetName: "Sheet1").ToList(); + var rows = _excelImporter.Query(path, sheetName: "Sheet1").ToList(); Assert.Equal(6, rows.Count); - Assert.Equal("Sheet1", _importer.GetSheetNames(path).First()); + Assert.Equal("Sheet1", _excelImporter.GetSheetNames(path).First()); using var p = new ExcelPackage(new FileInfo(path)); var ws = p.Workbook.Worksheets.First(); @@ -2538,9 +2415,9 @@ public void Issue157() const string path = "../../../../../samples/xlsx/TestIssue157.xlsx"; { - var rows = _importer.QueryExcel(path, sheetName: "Sheet1").ToList(); + var rows = _excelImporter.Query(path, sheetName: "Sheet1").ToList(); Assert.Equal(6, rows.Count); - Assert.Equal("Sheet1", _importer.GetSheetNames(path).First()); + Assert.Equal("Sheet1", _excelImporter.GetSheetNames(path).First()); } using (var p = new ExcelPackage(new FileInfo(path))) { @@ -2550,7 +2427,7 @@ public void Issue157() } { - var rows = _importer.QueryExcel(path, sheetName: "Sheet1").ToList(); + var rows = _excelImporter.Query(path, sheetName: "Sheet1").ToList(); Assert.Equal(5, rows.Count); Assert.Equal(Guid.Parse("78DE23D2-DCB6-BD3D-EC67-C112BBC322A2"), rows[0].ID); @@ -2583,7 +2460,7 @@ public void Issue149() { const string path = "../../../../../samples/xlsx/TestIssue149.xlsx"; - var rows = _importer.QueryExcel(path).Select(s => (string)s.A).ToList(); + var rows = _excelImporter.Query(path).Select(s => (string)s.A).ToList(); for (int i = 0; i < chars.Length; i++) { //output.WriteLine($"{i} , {chars[i]} , {rows[i]}"); @@ -2597,9 +2474,9 @@ public void Issue149() { using var path = AutoDeletingPath.Create(); var input = chars.Select(s => new { Test = s.ToString() }); - _exporter.ExportExcel(path.ToString(), input); + _excelExporter.Export(path.ToString(), input); - var rows = _importer.QueryExcel(path.ToString(), true).Select(s => (string)s.Test).ToList(); + var rows = _excelImporter.Query(path.ToString(), true).Select(s => (string)s.Test).ToList(); for (int i = 0; i < chars.Length; i++) { _output.WriteLine($"{i}, {chars[i]}, {rows[i]}"); @@ -2613,9 +2490,9 @@ public void Issue149() { using var path = AutoDeletingPath.Create(); var input = chars.Select(s => new { Test = s.ToString() }); - _exporter.ExportExcel(path.ToString(), input); + _excelExporter.Export(path.ToString(), input); - var rows = _importer.QueryExcel(path.ToString()).Select(s => s.Test).ToList(); + var rows = _excelImporter.Query(path.ToString()).Select(s => s.Test).ToList(); for (int i = 0; i < chars.Length; i++) { _output.WriteLine($"{i}, {chars[i]}, {rows[i]}"); @@ -2639,7 +2516,7 @@ private class Issue149VO public void Issue153() { const string path = "../../../../../samples/xlsx/TestIssue153.xlsx"; - var rows = _importer.QueryExcel(path, true).First() as IDictionary; + var rows = _excelImporter.Query(path, true).First() as IDictionary; Assert.Equal( [ "序号", "代号", "新代号", "名称", "XXX", "部门名称", "单位", "ERP工时 (小时)A", "工时(秒) A/3600", "标准人工工时(秒)", @@ -2656,7 +2533,7 @@ public void Issue137() const string path = "../../../../../samples/xlsx/TestIssue137.xlsx"; { - var rows = _importer.QueryExcel(path).ToList(); + var rows = _excelImporter.Query(path).ToList(); var first = rows[0] as IDictionary; // https://user-images.githubusercontent.com/12729184/113266322-ba06e400-9307-11eb-9521-d36abfda75cc.png Assert.Equal(["A", "B", "C", "D", "E", "F", "G", "H"], first?.Keys.ToArray()); Assert.Equal(11, rows.Count); @@ -2690,7 +2567,7 @@ public void Issue137() // dynamic query with head { - var rows = _importer.QueryExcel(path, true).ToList(); + var rows = _excelImporter.Query(path, true).ToList(); var first = rows[0] as IDictionary; //![image](https://user-images.githubusercontent.com/12729184/113266322-ba06e400-9307-11eb-9521-d36abfda75cc.png) Assert.Equal(["比例", "商品", "滿倉口數", "0", "1為港幣 0為台幣"], first?.Keys.ToArray()); Assert.Equal(10, rows.Count); @@ -2710,7 +2587,7 @@ public void Issue137() } { - var rows = _importer.QueryExcel(path).ToList(); + var rows = _excelImporter.Query(path).ToList(); Assert.Equal(10, rows.Count); { var row = rows[0]; @@ -2742,7 +2619,7 @@ public void Issue138() { const string path = "../../../../../samples/xlsx/TestIssue138.xlsx"; { - var rows = _importer.QueryExcel(path, true).ToList(); + var rows = _excelImporter.Query(path, true).ToList(); Assert.Equal(6, rows.Count); foreach (var index in new[] { 0, 2, 5 }) @@ -2767,7 +2644,7 @@ public void Issue138() } { - var rows = _importer.QueryExcel(path).ToList(); + var rows = _excelImporter.Query(path).ToList(); Assert.Equal(6, rows.Count); Assert.Equal(new DateTime(2021, 3, 1), rows[0].Date); @@ -2833,7 +2710,7 @@ public void IssueI50VD5() ["A"] = list1, ["B"] = list2, }; - _exporter.ExportExcel(path, sheets); + _excelExporter.Export(path, sheets); { Assert.Contains("/xl/media/", SheetHelper.GetZipFileContent(path, "xl/drawings/_rels/drawing1.xml.rels")); @@ -2876,7 +2753,7 @@ public void Issue422() var enumerableWithCount = new Issue422Enumerable(items); using var path = AutoDeletingPath.Create(); - _exporter.ExportExcel(path.ToString(), enumerableWithCount); + _excelExporter.Export(path.ToString(), enumerableWithCount); Assert.Equal(1, enumerableWithCount.GetEnumeratorCount); } @@ -2902,7 +2779,7 @@ public void Issue459() } }; - _templater.ApplyXlsxTemplate(ms, template, values); + _excelTemplater.ApplyTemplate(ms, template, values); } [Fact] @@ -2918,9 +2795,9 @@ public void Issue527() var template = PathHelper.GetFile("xlsx/Issue527Template.xlsx"); using var path = AutoDeletingPath.Create(); - _templater.ApplyXlsxTemplate(path.FilePath, template, value); + _excelTemplater.ApplyTemplate(path.FilePath, template, value); - var rows = _importer.QueryExcel(path.FilePath).ToList(); + var rows = _excelImporter.Query(path.FilePath).ToList(); Assert.Equal("General User", rows[1].B); Assert.Equal("General Administrator", rows[2].B); } @@ -2954,9 +2831,9 @@ WITH test('Id', 'Name') AS ( using var reader = cmd.ExecuteReader(); using var path = AutoDeletingPath.Create(); - _exporter.ExportExcel(path.FilePath, reader, configuration: excelconfig, overwriteFile: true); + _excelExporter.Export(path.FilePath, reader, configuration: excelconfig, overwriteFile: true); - var rows = _importer.QueryExcel(path.FilePath).ToList(); + var rows = _excelImporter.Query(path.FilePath).ToList(); Assert.All(rows, x => Assert.Single(x)); Assert.Equal("Name", rows[0].A); } @@ -2993,13 +2870,13 @@ public void Issue585() { const string path = "../../../../../samples/xlsx/TestIssue585.xlsx"; - var items1 = _importer.QueryExcel(path); + var items1 = _excelImporter.Query(path); Assert.Equal(2, items1.Count()); - var items2 = _importer.QueryExcel(path); + var items2 = _excelImporter.Query(path); Assert.Equal(2, items2.Count()); - var items3 = _importer.QueryExcel(path); + var items3 = _excelImporter.Query(path); Assert.Equal(2, items3.Count()); } @@ -3014,8 +2891,8 @@ public void Issue_542() { const string path = "../../../../../samples/xlsx/TestIssue542.xlsx"; - var resultWithoutFirstRow = _importer.QueryExcel(path).ToList(); - var resultWithFirstRow = _importer.QueryExcel(path, treatHeaderAsData: true).ToList(); + var resultWithoutFirstRow = _excelImporter.Query(path).ToList(); + var resultWithFirstRow = _excelImporter.Query(path, treatHeaderAsData: true).ToList(); Assert.Equal(15, resultWithoutFirstRow.Count); Assert.Equal(16, resultWithFirstRow.Count); @@ -3067,7 +2944,7 @@ public void Issue606_1() ); const string templateFileName = "../../../../../samples/xlsx/TestIssue606_Template.xlsx"; - _templater.ApplyXlsxTemplate(path, Path.GetFullPath(templateFileName), value); + _excelTemplater.ApplyTemplate(path, Path.GetFullPath(templateFileName), value); File.Delete(path); } @@ -3088,7 +2965,7 @@ public void TestIssue627() using var path = AutoDeletingPath.Create(); var value = new[] { new { long2 = "1550432695793487872" } }; - var rowsWritten = _exporter.ExportExcel(path.ToString(), value, configuration: config); + var rowsWritten = _excelExporter.Export(path.ToString(), value, configuration: config); Assert.Single(rowsWritten); Assert.Equal(1, rowsWritten[0]); @@ -3124,7 +3001,7 @@ public void Issue632_1() string.Concat(nameof(MiniExcelIssueTests), "_", nameof(Issue632_1), ".xlsx") ); - _exporter.ExportExcel(path, values, configuration: config, overwriteFile: true); + _excelExporter.Export(path, values, configuration: config, overwriteFile: true); File.Delete(path); } @@ -3149,7 +3026,7 @@ static IEnumerable GetTestData() using var memoryStream = new MemoryStream(); var testData = GetTestData(); - var rowsWritten = _exporter.ExportExcel(memoryStream, testData, configuration: new OpenXmlConfiguration + var rowsWritten = _excelExporter.Export(memoryStream, testData, configuration: new OpenXmlConfiguration { FastMode = true }); @@ -3158,7 +3035,7 @@ static IEnumerable GetTestData() memoryStream.Position = 0; - var queryData = _importer.QueryExcel(memoryStream).ToList(); + var queryData = _excelImporter.Query(memoryStream).ToList(); Assert.Equal(testData.Count(), queryData.Count); @@ -3187,14 +3064,14 @@ static IEnumerable GetTestData() using var memoryStream = new MemoryStream(); var testData = GetTestData(); - await _exporter.ExportExcelAsync(memoryStream, testData, configuration: new OpenXmlConfiguration + await _excelExporter.ExportAsync(memoryStream, testData, configuration: new OpenXmlConfiguration { FastMode = true, }); memoryStream.Position = 0; - var queryData = _importer.QueryExcelAsync(memoryStream).ToBlockingEnumerable().ToList(); + var queryData = _excelImporter.QueryAsync(memoryStream).ToBlockingEnumerable().ToList(); Assert.Equal(testData.Count(), queryData.Count); @@ -3212,10 +3089,10 @@ public void Issue_686() { var path = PathHelper.GetFile("xlsx/TestIssue686.xlsx"); Assert.Throws(() => - _importer.QueryExcelRange(path, useHeaderRow: false, startCell: "ZZFF10", endCell: "ZZFF11").First()); + _excelImporter.QueryRange(path, useHeaderRow: false, startCell: "ZZFF10", endCell: "ZZFF11").First()); Assert.Throws(() => - _importer.QueryExcelRange(path, useHeaderRow: false, startCell: "ZZFF@@10", endCell: "ZZFF@@11").First()); + _excelImporter.QueryRange(path, useHeaderRow: false, startCell: "ZZFF@@10", endCell: "ZZFF@@11").First()); } [Fact] @@ -3225,9 +3102,9 @@ public void Test_Issue_693_SaveSheetWithLongName() using var path2 = AutoDeletingPath.Create(); List> data = [new() { ["First"] = 1, ["Second"] = 2 }]; - Assert.Throws(() => _exporter.ExportExcel(path1.ToString(), data, sheetName: "Some Really Looooooooooong Sheet Name")); - _exporter.ExportExcel(path2.ToString(), new List>()); - Assert.Throws(() => _exporter.InsertExcelSheet(path2.ToString(), data, sheetName: "Some Other Very Looooooong Sheet Name")); + Assert.Throws(() => _excelExporter.Export(path1.ToString(), data, sheetName: "Some Really Looooooooooong Sheet Name")); + _excelExporter.Export(path2.ToString(), new List>()); + Assert.Throws(() => _excelExporter.InsertSheet(path2.ToString(), data, sheetName: "Some Other Very Looooooong Sheet Name")); } private class Issue697 @@ -3241,8 +3118,8 @@ private class Issue697 public void Test_Issue_697_EmptyRowsStronglyTypedQuery() { const string path = "../../../../../samples/xlsx/TestIssue697.xlsx"; - var rowsIgnoreEmpty = _importer.QueryExcel(path, configuration: new OpenXmlConfiguration { IgnoreEmptyRows = true }).ToList(); - var rowsCountEmpty = _importer.QueryExcel(path).ToList(); + var rowsIgnoreEmpty = _excelImporter.Query(path, configuration: new OpenXmlConfiguration { IgnoreEmptyRows = true }).ToList(); + var rowsCountEmpty = _excelImporter.Query(path).ToList(); Assert.Equal(4, rowsIgnoreEmpty.Count); Assert.Equal(5, rowsCountEmpty.Count); } @@ -3252,13 +3129,13 @@ public void Issue_710() { var values = new[] { new { Column1 = "MiniExcel", Column2 = 1, Column3 = "Test" } }; using var memoryStream = new MemoryStream(); - _exporter.ExportExcel(memoryStream, values, configuration: new OpenXmlConfiguration + _excelExporter.Export(memoryStream, values, configuration: new OpenXmlConfiguration { FastMode = true }); memoryStream.Position = 0; - using var dataReader = _importer.GetExcelDataReader(memoryStream, useHeaderRow: false); + using var dataReader = _excelImporter.GetExcelDataReader(memoryStream, useHeaderRow: false); dataReader.Read(); for (int i = 0; i < dataReader.FieldCount; i++) @@ -3277,9 +3154,9 @@ public void Issue_732_First_Sheet_Active() const string path2 = "../../../../../samples/xlsx/TestIssue732_2.xlsx"; const string path3 = "../../../../../samples/xlsx/TestIssue732_3.xlsx"; - var info1 = _importer.GetSheetInformations(path1); - var info2 = _importer.GetSheetInformations(path2); - var info3 = _importer.GetSheetInformations(path3); + var info1 = _excelImporter.GetSheetInformations(path1); + var info2 = _excelImporter.GetSheetInformations(path2); + var info3 = _excelImporter.GetSheetInformations(path3); Assert.Equal(0u, info1.SingleOrDefault(x => x.Active)?.Index); // first sheet is active Assert.Equal(1u, info2.SingleOrDefault(x => x.Active)?.Index); // second sheet is active @@ -3298,9 +3175,9 @@ public void TestIssue750() ["list"] = Enumerable.Range(0, 10_000) .Select(_ => new { value1 = Guid.NewGuid(), value2 = Guid.NewGuid(), }) }; - _templater.ApplyXlsxTemplate(path.ToString(), templatePath, data); + _excelTemplater.ApplyTemplate(path.ToString(), templatePath, data); - var rows = _importer.QueryExcel(path.ToString()) + var rows = _excelImporter.Query(path.ToString()) .Skip(1453) .Take(2) .ToList(); @@ -3330,7 +3207,7 @@ public void TestIssue751() { ["list"] = list }; - _templater.ApplyXlsxTemplate(path.ToString(), templatePath, data); + _excelTemplater.ApplyTemplate(path.ToString(), templatePath, data); using var stream = File.OpenRead(path.ToString()); using var workbook = new XSSFWorkbook(stream); @@ -3359,7 +3236,7 @@ public void TestIssue751() public void TestIssue763() { var path = PathHelper.GetFile("xlsx/TestIssue763.xlsx"); - var rows = _importer.QueryExcelRange(path, startCell: "A3", endCell: "J3").ToArray(); + var rows = _excelImporter.QueryRange(path, startCell: "A3", endCell: "J3").ToArray(); Assert.Equal("A3", rows[0].A); Assert.Equal(null, rows[0].J); } @@ -3388,8 +3265,8 @@ public void TestIssue768() ["list"] = list }; - _templater.ApplyXlsxTemplate(path.ToString(), templatePath, data); - var rows = _importer.QueryExcel(path.ToString(), startCell: "A16").ToList(); + _excelTemplater.ApplyTemplate(path.ToString(), templatePath, data); + var rows = _excelImporter.Query(path.ToString(), startCell: "A16").ToList(); Assert.Equal(list[0].value1.ToString(), rows[0].A.ToString()); Assert.Equal(list[1].value1.ToString(), rows[1].A.ToString()); @@ -3424,7 +3301,7 @@ public void TestIssue186() } ]; - _exporter.AddExcelPicture(path.FilePath, images); + _excelExporter.AddPicture(path.FilePath, images); } /// @@ -3452,8 +3329,8 @@ public void TestIssue771() list12 = GetEnumerable() }; - _templater.ApplyXlsxTemplate(path.FilePath, template, value); - var rows = _importer.QueryExcel(path.FilePath).ToList(); + _excelTemplater.ApplyTemplate(path.FilePath, template, value); + var rows = _excelImporter.Query(path.FilePath).ToList(); Assert.Equal("2025-1", rows[2].B); Assert.Equal(null, rows[3].B); @@ -3471,7 +3348,7 @@ public void TestIssue771() public void TestIssue772() { var path = PathHelper.GetFile("xlsx/TestIssue772.xlsx"); - var rows = _importer.QueryExcel(path, sheetName: "Supply plan(daily)", startCell: "A1") + var rows = _excelImporter.Query(path, sheetName: "Supply plan(daily)", startCell: "A1") .Cast>() .ToArray(); @@ -3495,8 +3372,8 @@ public void TestIssue773() var fill = new { t = a }; using var path = AutoDeletingPath.Create(); - _templater.ApplyXlsxTemplate(path.FilePath, templatePath, fill); - var rows = _importer.QueryExcel(path.FilePath).ToList(); + _excelTemplater.ApplyTemplate(path.FilePath, templatePath, fill); + var rows = _excelImporter.Query(path.FilePath).ToList(); Assert.Equal("H1", rows[4].AF); Assert.Equal("c3", rows[6].AA); @@ -3515,7 +3392,7 @@ public void TestIssue789() new Dictionary { {"no","2"} }, new Dictionary { {"no","3"} }, }; - _exporter.ExportExcel(path, value); + _excelExporter.Export(path, value); var xml = SheetHelper.GetZipFileContent(path.ToString(), "xl/worksheets/sheet1.xml"); @@ -3560,7 +3437,7 @@ public void TestIssue814() } ]; - _exporter.AddExcelPicture(path.FilePath, images); + _excelExporter.AddPicture(path.FilePath, images); using var package = new ExcelPackage(new FileInfo(path.FilePath)); @@ -3613,7 +3490,7 @@ public void TestIssue815() } ]; - _exporter.AddExcelPicture(path.FilePath, images); + _excelExporter.AddPicture(path.FilePath, images); using (var package = new ExcelPackage(new FileInfo(path.FilePath))) { @@ -3672,7 +3549,7 @@ public void TestIssue816() } ]; - _exporter.AddExcelPicture(path.FilePath, images); + _excelExporter.AddPicture(path.FilePath, images); using var package = new ExcelPackage(new FileInfo(path.FilePath)); @@ -3724,7 +3601,7 @@ public void TestIssue816() } ]; - _exporter.AddExcelPicture(path.FilePath, images); + _excelExporter.AddPicture(path.FilePath, images); using var package = new ExcelPackage(new FileInfo(path.FilePath)); // Check picture in the first sheet (C3) @@ -3773,7 +3650,7 @@ public void TestIssue816() public void TestIssue809() { var path = PathHelper.GetFile("xlsx/TestIssue809.xlsx"); - var rows = _importer.QueryExcel(path).ToList(); + var rows = _excelImporter.Query(path).ToList(); Assert.Equal(3, rows.Count); Assert.Equal(null, rows[0].A); diff --git a/tests/MiniExcel.Tests/MiniExcelOpenXmlAsyncTests.cs b/tests/MiniExcel.Tests/MiniExcelOpenXmlAsyncTests.cs index 2e612104..dd9c14e8 100644 --- a/tests/MiniExcel.Tests/MiniExcelOpenXmlAsyncTests.cs +++ b/tests/MiniExcel.Tests/MiniExcelOpenXmlAsyncTests.cs @@ -4,14 +4,13 @@ using MiniExcelLib.Tests.Common.Utils; using MiniExcelLib.Abstractions; using MiniExcelLib.Attributes; -using MiniExcelLib.OpenXml; namespace MiniExcelLib.Tests; public class MiniExcelOpenXmlAsyncTests { - private readonly OpenXmlImporter _importer = MiniExcel.Importer.GetExcelImporter(); - private readonly OpenXmlExporter _exporter = MiniExcel.Exporter.GetExcelExporter(); + private readonly OpenXmlImporter _excelImporter = MiniExcel.Importer.GetExcelImporter(); + private readonly OpenXmlExporter _excelExporter = MiniExcel.Exporter.GetExcelExporter(); [Fact] public async Task SaveAsControlChracter() @@ -30,10 +29,10 @@ public async Task SaveAsControlChracter() '\u0017','\u0018','\u0019','\u001A','\u001B','\u001C','\u001D','\u001E','\u001F','\u007F' ]; var input = chars.Select(s => new { Test = s.ToString() }); - await _exporter.ExportExcelAsync(path, input); + await _excelExporter.ExportAsync(path, input); - var rows2 = _importer.QueryExcelAsync(path, true).ToBlockingEnumerable().ToArray(); - var rows1 = _importer.QueryExcelAsync(path).ToBlockingEnumerable().ToArray(); + var rows2 = _excelImporter.QueryAsync(path, true).ToBlockingEnumerable().ToArray(); + var rows1 = _excelImporter.QueryAsync(path).ToBlockingEnumerable().ToArray(); } private class SaveAsControlChracterVO @@ -79,7 +78,7 @@ public async Task CustomAttributeWihoutVaildPropertiesTest() const string path = "../../../../../samples/xlsx/TestCustomExcelColumnAttribute.xlsx"; await Assert.ThrowsAsync(async () => { - _ = _importer.QueryExcelAsync(path).ToBlockingEnumerable().ToList(); + _ = _excelImporter.QueryAsync(path).ToBlockingEnumerable().ToList(); }); } @@ -87,7 +86,7 @@ await Assert.ThrowsAsync(async () => public async Task QueryCustomAttributesTest() { const string path = "../../../../../samples/xlsx/TestCustomExcelColumnAttribute.xlsx"; - var rows = _importer.QueryExcelAsync(path).ToBlockingEnumerable().ToList(); + var rows = _excelImporter.QueryAsync(path).ToBlockingEnumerable().ToList(); Assert.Equal("Column1", rows[0].Test1); Assert.Equal("Column2", rows[0].Test2); @@ -102,7 +101,7 @@ public async Task QueryCustomAttributesTest() public async Task QueryCustomAttributes2Test() { const string path = "../../../../../samples/xlsx/TestCustomExcelColumnAttribute.xlsx"; - var rows = _importer.QueryExcelAsync(path).ToBlockingEnumerable().ToList(); + var rows = _excelImporter.QueryAsync(path).ToBlockingEnumerable().ToList(); Assert.Equal("Column1", rows[0].Test1); Assert.Equal("Column2", rows[0].Test2); @@ -126,8 +125,8 @@ public async Task SaveAsCustomAttributesTest() Test4 = "Test4", }); - await _exporter.ExportExcelAsync(path.ToString(), input); - var d = _importer.QueryExcelAsync(path.ToString(), true).ToBlockingEnumerable(); + await _excelExporter.ExportAsync(path.ToString(), input); + var d = _excelImporter.QueryAsync(path.ToString(), true).ToBlockingEnumerable(); var rows = d.ToList(); var first = rows[0] as IDictionary; @@ -153,8 +152,8 @@ public async Task SaveAsCustomAttributes2Test() Test4 = "Test4", }); - await _exporter.ExportExcelAsync(path.ToString(), input); - var d = _importer.QueryExcelAsync(path.ToString(), true).ToBlockingEnumerable(); + await _excelExporter.ExportAsync(path.ToString(), input); + var d = _excelImporter.QueryAsync(path.ToString(), true).ToBlockingEnumerable(); var rows = d.ToList(); var first = rows[0] as IDictionary; @@ -179,7 +178,7 @@ private class CustomAttributesWihoutVaildPropertiesTestPoco public async Task QueryCastToIDictionary() { const string path = "../../../../../samples/xlsx/TestCenterEmptyRow/TestCenterEmptyRow.xlsx"; - foreach (IDictionary row in _importer.QueryExcelAsync(path).ToBlockingEnumerable()) + foreach (IDictionary row in _excelImporter.QueryAsync(path).ToBlockingEnumerable()) { _ = row; } @@ -191,7 +190,7 @@ public async Task CenterEmptyRowsQueryTest() const string path = "../../../../../samples/xlsx/TestCenterEmptyRow/TestCenterEmptyRow.xlsx"; await using (var stream = File.OpenRead(path)) { - var d = _importer.QueryExcelAsync(stream).ToBlockingEnumerable().Cast>(); + var d = _excelImporter.QueryAsync(stream).ToBlockingEnumerable().Cast>(); var rows = d.ToList(); Assert.Equal("a", rows[0]["A"]); Assert.Equal("b", rows[0]["B"]); @@ -227,7 +226,7 @@ public async Task CenterEmptyRowsQueryTest() await using (var stream = File.OpenRead(path)) { - var d = _importer.QueryExcelAsync(stream, useHeaderRow: true).ToBlockingEnumerable().Cast>(); + var d = _excelImporter.QueryAsync(stream, useHeaderRow: true).ToBlockingEnumerable().Cast>(); var rows = d.ToList(); Assert.Equal(1d, rows[0]["a"]); Assert.Null(rows[0]["b"]); @@ -261,7 +260,7 @@ public async Task TestDynamicQueryBasic_WithoutHead() { const string path = "../../../../../samples/xlsx/TestDynamicQueryBasic_WithoutHead.xlsx"; await using var stream = File.OpenRead(path); - var d = _importer.QueryExcelAsync(stream).ToBlockingEnumerable().Cast>(); + var d = _excelImporter.QueryAsync(stream).ToBlockingEnumerable().Cast>(); var rows = d.ToList(); Assert.Equal("MiniExcel", rows[0]["A"]); @@ -276,7 +275,7 @@ public async Task TestDynamicQueryBasic_useHeaderRow() const string path = "../../../../../samples/xlsx/TestDynamicQueryBasic.xlsx"; await using (var stream = File.OpenRead(path)) { - var d = _importer.QueryExcelAsync(stream, useHeaderRow: true).ToBlockingEnumerable().Cast>(); + var d = _excelImporter.QueryAsync(stream, useHeaderRow: true).ToBlockingEnumerable().Cast>(); var rows = d.ToList(); Assert.Equal("MiniExcel", rows[0]["Column1"]); Assert.Equal(1d, rows[0]["Column2"]); @@ -285,7 +284,7 @@ public async Task TestDynamicQueryBasic_useHeaderRow() } { - var d = _importer.QueryExcelAsync(path, useHeaderRow: true).ToBlockingEnumerable(); + var d = _excelImporter.QueryAsync(path, useHeaderRow: true).ToBlockingEnumerable(); var rows = d.ToList(); Assert.Equal("MiniExcel", rows[0].Column1); Assert.Equal(1d, rows[0].Column2); @@ -316,7 +315,7 @@ public async Task QueryStrongTypeMapping_Test() const string path = "../../../../../samples/xlsx/TestTypeMapping.xlsx"; await using (var stream = File.OpenRead(path)) { - var d = _importer.QueryExcelAsync(stream); + var d = _excelImporter.QueryAsync(stream); var rows = d.ToBlockingEnumerable().ToList(); Assert.Equal(100, rows.Count); @@ -330,7 +329,7 @@ public async Task QueryStrongTypeMapping_Test() } { - var rows = _importer.QueryExcel(path, useHeaderRow: true).ToList(); + var rows = _excelImporter.Query(path, useHeaderRow: true).ToList(); Assert.Equal(100, rows.Count); Assert.Equal("78DE23D2-DCB6-BD3D-EC67-C112BBC322A2", rows[0].ID); @@ -357,7 +356,7 @@ public async Task AutoCheckTypeTest() { const string path = "../../../../../samples/xlsx/TestTypeMapping_AutoCheckFormat.xlsx"; await using var stream = FileHelper.OpenRead(path); - _ = _importer.QueryExcelAsync(stream).ToBlockingEnumerable().ToList(); + _ = _excelImporter.QueryAsync(stream).ToBlockingEnumerable().ToList(); } [Fact] @@ -366,7 +365,7 @@ public async Task TestDatetimeSpanFormat_ClosedXml() const string path = "../../../../../samples/xlsx/TestDatetimeSpanFormat_ClosedXml.xlsx"; await using var stream = FileHelper.OpenRead(path); - var d = _importer.QueryExcelAsync(stream).ToBlockingEnumerable().Cast>(); + var d = _excelImporter.QueryAsync(stream).ToBlockingEnumerable().Cast>(); var row = d.First(); var a = row["A"]; var b = row["B"]; @@ -381,13 +380,13 @@ public async Task LargeFileQueryStrongTypeMapping_Test() const string path = "../../../../../benchmarks/MiniExcel.Benchmarks/Test1,000,000x10.xlsx"; await using (var stream = File.OpenRead(path)) { - var d = _importer.QueryExcelAsync(stream).ToBlockingEnumerable(); + var d = _excelImporter.QueryAsync(stream).ToBlockingEnumerable(); var rows = d.Take(2).ToList(); Assert.Equal("HelloWorld2", rows[0].HelloWorld1); Assert.Equal("HelloWorld3", rows[1].HelloWorld1); } { - var d = _importer.QueryExcelAsync(path).ToBlockingEnumerable(); + var d = _excelImporter.QueryAsync(path).ToBlockingEnumerable(); var rows = d.Take(2).ToList(); Assert.Equal("HelloWorld2", rows[0].HelloWorld1); Assert.Equal("HelloWorld3", rows[1].HelloWorld1); @@ -408,7 +407,7 @@ public async Task QueryExcelDataReaderCheckTest(string path) var exceldatareaderResult = reader.AsDataSet(); await using var stream = File.OpenRead(path); - var d = _importer.QueryExcelAsync(stream).ToBlockingEnumerable(); + var d = _excelImporter.QueryAsync(stream).ToBlockingEnumerable(); var rows = d.ToList(); Assert.Equal(exceldatareaderResult.Tables[0].Rows.Count, rows.Count); @@ -430,7 +429,7 @@ public async Task QuerySheetWithoutRAttribute() const string path = "../../../../../samples/xlsx/TestWihoutRAttribute.xlsx"; await using var stream = File.OpenRead(path); - var d = _importer.QueryExcelAsync(stream).ToBlockingEnumerable().Cast>(); + var d = _excelImporter.QueryAsync(stream).ToBlockingEnumerable().Cast>(); var rows = d.ToList(); var keys = rows.First().Keys; @@ -453,7 +452,7 @@ public async Task FixDimensionJustOneColumnParsingError_Test() { const string path = "../../../../../samples/xlsx/TestDimensionC3.xlsx"; await using var stream = File.OpenRead(path); - var d = _importer.QueryExcelAsync(stream).ToBlockingEnumerable(); + var d = _excelImporter.QueryAsync(stream).ToBlockingEnumerable(); var rows = d.ToList(); var keys = (rows.First() as IDictionary)?.Keys; Assert.Equal(3, keys?.Count); @@ -479,10 +478,10 @@ public async Task SaveAsFileWithDimensionByICollection() using (var file = AutoDeletingPath.Create()) { var path = file.ToString(); - await _exporter.ExportExcelAsync(path, values); + await _excelExporter.ExportAsync(path, values); await using (var stream = File.OpenRead(path)) { - var d = _importer.QueryExcelAsync(stream, useHeaderRow: false).ToBlockingEnumerable().Cast>(); + var d = _excelImporter.QueryAsync(stream, useHeaderRow: false).ToBlockingEnumerable().Cast>(); var rows = d.ToList(); Assert.Equal(3, rows.Count); Assert.Equal("A", rows[0]["A"]); @@ -492,7 +491,7 @@ public async Task SaveAsFileWithDimensionByICollection() await using (var stream = File.OpenRead(path)) { - var d = _importer.QueryExcelAsync(stream, useHeaderRow: true).ToBlockingEnumerable().Cast>(); + var d = _excelImporter.QueryAsync(stream, useHeaderRow: true).ToBlockingEnumerable().Cast>(); var rows = d.ToList(); Assert.Equal(2, rows.Count); Assert.Equal("A", rows[0]["A"]); @@ -503,7 +502,7 @@ public async Task SaveAsFileWithDimensionByICollection() } using var newPath = AutoDeletingPath.Create(); - await _exporter.ExportExcelAsync(newPath.ToString(), values, false); + await _excelExporter.ExportAsync(newPath.ToString(), values, false); Assert.Equal("A1:B2", SheetHelper.GetFirstSheetDimensionRefValue(newPath.ToString())); } @@ -513,10 +512,10 @@ public async Task SaveAsFileWithDimensionByICollection() using (var file = AutoDeletingPath.Create()) { var path = file.ToString(); - await _exporter.ExportExcelAsync(path, values, false); + await _excelExporter.ExportAsync(path, values, false); await using (var stream = File.OpenRead(path)) { - var d = _importer.QueryExcelAsync(stream, useHeaderRow: false).ToBlockingEnumerable(); + var d = _excelImporter.QueryAsync(stream, useHeaderRow: false).ToBlockingEnumerable(); var rows = d.ToList(); Assert.Empty(rows); } @@ -527,10 +526,10 @@ public async Task SaveAsFileWithDimensionByICollection() using (var file = AutoDeletingPath.Create()) { var path = file.ToString(); - await _exporter.ExportExcelAsync(path, values); + await _excelExporter.ExportAsync(path, values); { await using var stream = File.OpenRead(path); - var d = _importer.QueryExcelAsync(stream, useHeaderRow: false).ToBlockingEnumerable(); + var d = _excelImporter.QueryAsync(stream, useHeaderRow: false).ToBlockingEnumerable(); var rows = d.ToList(); Assert.Single(rows); } @@ -549,11 +548,11 @@ public async Task SaveAsFileWithDimensionByICollection() using (var file = AutoDeletingPath.Create()) { var path = file.ToString(); - await _exporter.ExportExcelAsync(path, values); + await _excelExporter.ExportAsync(path, values); await using (var stream = File.OpenRead(path)) { - var d = _importer.QueryExcelAsync(stream, useHeaderRow: false).ToBlockingEnumerable().Cast>(); + var d = _excelImporter.QueryAsync(stream, useHeaderRow: false).ToBlockingEnumerable().Cast>(); var rows = d.ToList(); Assert.Equal(3, rows.Count); Assert.Equal("A", rows[0]["A"]); @@ -563,7 +562,7 @@ public async Task SaveAsFileWithDimensionByICollection() await using (var stream = File.OpenRead(path)) { - var d = _importer.QueryExcelAsync(stream, useHeaderRow: true).ToBlockingEnumerable().Cast>(); + var d = _excelImporter.QueryAsync(stream, useHeaderRow: true).ToBlockingEnumerable().Cast>(); var rows = d.ToList(); Assert.Equal(2, rows.Count); Assert.Equal("A", rows[0]["A"]); @@ -575,7 +574,7 @@ public async Task SaveAsFileWithDimensionByICollection() using (var path = AutoDeletingPath.Create()) { - await _exporter.ExportExcelAsync(path.ToString(), values, false); + await _excelExporter.ExportAsync(path.ToString(), values, false); Assert.Equal("A1:B2", SheetHelper.GetFirstSheetDimensionRefValue(path.ToString())); } } @@ -584,7 +583,7 @@ public async Task SaveAsFileWithDimensionByICollection() { using var path = AutoDeletingPath.Create(); var values = new List(); - await Assert.ThrowsAsync(() => _exporter.ExportExcelAsync(path.ToString(), values)); + await Assert.ThrowsAsync(() => _excelExporter.ExportAsync(path.ToString(), values)); } } @@ -596,15 +595,15 @@ public async Task SaveAsFileWithDimension() var path = file.ToString(); using var table = new DataTable(); - await _exporter.ExportExcelAsync(path, table); + await _excelExporter.ExportAsync(path, table); Assert.Equal("A1", SheetHelper.GetFirstSheetDimensionRefValue(path)); { await using var stream = File.OpenRead(path); - var d = _importer.QueryExcelAsync(stream).ToBlockingEnumerable(); + var d = _excelImporter.QueryAsync(stream).ToBlockingEnumerable(); var rows = d.ToList(); Assert.Single(rows); } - await _exporter.ExportExcelAsync(path, table, printHeader: false, overwriteFile: true); + await _excelExporter.ExportAsync(path, table, printHeader: false, overwriteFile: true); Assert.Equal("A1", SheetHelper.GetFirstSheetDimensionRefValue(path)); } { @@ -619,12 +618,12 @@ public async Task SaveAsFileWithDimension() table.Rows.Add(@"""<>+-*//}{\\n", 1234567890); table.Rows.Add("Hello World", -1234567890, false, DateTime.Now); - await _exporter.ExportExcelAsync(path, table); + await _excelExporter.ExportAsync(path, table); Assert.Equal("A1:D3", SheetHelper.GetFirstSheetDimensionRefValue(path)); await using (var stream = File.OpenRead(path)) { - var d = _importer.QueryExcelAsync(stream, useHeaderRow: true).ToBlockingEnumerable().Cast>(); + var d = _excelImporter.QueryAsync(stream, useHeaderRow: true).ToBlockingEnumerable().Cast>(); var rows = d.ToList(); Assert.Equal(2, rows.Count); Assert.Equal(@"""<>+-*//}{\\n", rows[0]["a"]); @@ -635,7 +634,7 @@ public async Task SaveAsFileWithDimension() await using (var stream = File.OpenRead(path)) { - var d = _importer.QueryExcelAsync(stream).ToBlockingEnumerable().Cast>(); + var d = _excelImporter.QueryAsync(stream).ToBlockingEnumerable().Cast>(); var rows = d.ToList(); Assert.Equal(3, rows.Count); Assert.Equal("a", rows[0]["A"]); @@ -644,7 +643,7 @@ public async Task SaveAsFileWithDimension() Assert.Equal("d", rows[0]["D"]); } - await _exporter.ExportExcelAsync(path, table, printHeader: false, overwriteFile: true); + await _excelExporter.ExportAsync(path, table, printHeader: false, overwriteFile: true); Assert.Equal("A1:D2", SheetHelper.GetFirstSheetDimensionRefValue(path)); } @@ -655,7 +654,7 @@ public async Task SaveAsFileWithDimension() table.Rows.Add("A"); table.Rows.Add("B"); - await _exporter.ExportExcelAsync(path.ToString(), table); + await _excelExporter.ExportAsync(path.ToString(), table); Assert.Equal("A1:A3", SheetHelper.GetFirstSheetDimensionRefValue(path.ToString())); } } @@ -677,7 +676,7 @@ public async Task SaveAsByDataTableTest() table.Rows.Add(@"""<>+-*//}{\\n", 1234567890, true, now); table.Rows.Add("Hello World", -1234567890, false, now.Date); - await _exporter.ExportExcelAsync(path, table); + await _excelExporter.ExportAsync(path, table); using var p = new ExcelPackage(new FileInfo(path)); var ws = p.Workbook.Worksheets.First(); @@ -700,7 +699,7 @@ public async Task SaveAsByDataTableTest() table.Rows.Add("MiniExcel", 1); table.Rows.Add("Github", 2); - await _exporter.ExportExcelAsync(path.ToString(), table); + await _excelExporter.ExportAsync(path.ToString(), table); } } @@ -710,19 +709,19 @@ public async Task QueryByLINQExtensionsVoidTaskLargeFileOOMTest() const string path = "../../../../../benchmarks/MiniExcel.Benchmarks/Test1,000,000x10.xlsx"; { - var row = _importer.QueryExcelAsync(path).ToBlockingEnumerable().First(); + var row = _excelImporter.QueryAsync(path).ToBlockingEnumerable().First(); Assert.Equal("HelloWorld1", row.A); } await using (var stream = File.OpenRead(path)) { - var d = _importer.QueryExcelAsync(stream).ToBlockingEnumerable().Cast>(); + var d = _excelImporter.QueryAsync(stream).ToBlockingEnumerable().Cast>(); var row = d.First(); Assert.Equal("HelloWorld1", row["A"]); } { - var d = _importer.QueryExcelAsync(path).ToBlockingEnumerable().Cast>(); + var d = _excelImporter.QueryAsync(path).ToBlockingEnumerable().Cast>(); var rows = d.Take(10); Assert.Equal(10, rows.Count()); } @@ -736,12 +735,12 @@ public async Task EmptyTest() await using (var connection = Db.GetConnection("Data Source=:memory:")) { var rows = await connection.QueryAsync("with cte as (select 1 id,2 val) select * from cte where 1=2"); - await _exporter.ExportExcelAsync(path.ToString(), rows); + await _excelExporter.ExportAsync(path.ToString(), rows); } await using (var stream = File.OpenRead(path.ToString())) { - var row = _importer.QueryExcelAsync(stream, useHeaderRow: true).ToBlockingEnumerable(); + var row = _excelImporter.QueryAsync(stream, useHeaderRow: true).ToBlockingEnumerable(); Assert.Empty(row); } } @@ -758,11 +757,11 @@ public async Task SaveAsByIEnumerableIDictionary() new() { { "Column1", "MiniExcel" }, { "Column2", 1 } }, new() { { "Column1", "Github" }, { "Column2", 2 } } ]; - await _exporter.ExportExcelAsync(path, values); + await _excelExporter.ExportAsync(path, values); await using (var stream = File.OpenRead(path)) { - var d = _importer.QueryExcelAsync(stream, useHeaderRow: false).ToBlockingEnumerable().Cast>(); + var d = _excelImporter.QueryAsync(stream, useHeaderRow: false).ToBlockingEnumerable().Cast>(); var rows = d.ToList(); Assert.Equal("Column1", rows[0]["A"]); Assert.Equal("Column2", rows[0]["B"]); @@ -774,7 +773,7 @@ public async Task SaveAsByIEnumerableIDictionary() await using (var stream = File.OpenRead(path)) { - var d = _importer.QueryExcelAsync(stream, useHeaderRow: true).ToBlockingEnumerable().Cast>(); + var d = _excelImporter.QueryAsync(stream, useHeaderRow: true).ToBlockingEnumerable().Cast>(); var rows = d.ToList(); Assert.Equal(2, rows.Count); Assert.Equal("MiniExcel", rows[0]["Column1"]); @@ -795,11 +794,11 @@ public async Task SaveAsByIEnumerableIDictionary() new() { { 1, "MiniExcel" }, { 2, 1 } }, new() { { 1, "Github" }, { 2, 2 } } ]; - await _exporter.ExportExcelAsync(path, values); + await _excelExporter.ExportAsync(path, values); await using (var stream = File.OpenRead(path)) { - var d = _importer.QueryExcelAsync(stream, useHeaderRow: false).ToBlockingEnumerable(); + var d = _excelImporter.QueryAsync(stream, useHeaderRow: false).ToBlockingEnumerable(); var rows = d.ToList(); Assert.Equal(3, rows.Count); } @@ -827,11 +826,11 @@ public async Task SaveAsByIEnumerableIDictionaryWithDynamicConfiguration() new() { { "Column1", "MiniExcel" }, { "Column2", 1 } }, new() { { "Column1", "Github" }, { "Column2", 2 } } ]; - await _exporter.ExportExcelAsync(path, values, configuration: config); + await _excelExporter.ExportAsync(path, values, configuration: config); await using (var stream = File.OpenRead(path)) { - var d = _importer.QueryExcelAsync(stream, useHeaderRow: true).ToBlockingEnumerable().Cast>(); + var d = _excelImporter.QueryAsync(stream, useHeaderRow: true).ToBlockingEnumerable().Cast>(); var rows = d.ToList(); Assert.Equal(2, rows.Count); Assert.Equal("Name Column", rows[0].Keys.ElementAt(0)); @@ -858,7 +857,7 @@ public async Task SaveAsFrozenRowsAndColumnsTest() using var file = AutoDeletingPath.Create(); var path = file.ToString(); - await _exporter.ExportExcelAsync( + await _excelExporter.ExportAsync( path, new[] { @@ -870,7 +869,7 @@ await _exporter.ExportExcelAsync( await using (var stream = File.OpenRead(path)) { - var rows = _importer.QueryExcelAsync(stream, useHeaderRow: true).ToBlockingEnumerable().ToList(); + var rows = _excelImporter.QueryAsync(stream, useHeaderRow: true).ToBlockingEnumerable().ToList(); Assert.Equal("MiniExcel", rows[0].Column1); Assert.Equal(1, rows[0].Column2); @@ -889,13 +888,13 @@ await _exporter.ExportExcelAsync( table.Rows.Add("Hello World", -1234567890, false, DateTime.Now.Date); using var pathTable = AutoDeletingPath.Create(); - await _exporter.ExportExcelAsync(pathTable.ToString(), table, configuration: config); + await _excelExporter.ExportAsync(pathTable.ToString(), table, configuration: config); Assert.Equal("A1:D3", SheetHelper.GetFirstSheetDimensionRefValue(pathTable.ToString())); // data reader await using var reader = table.CreateDataReader(); using var pathReader = AutoDeletingPath.Create(); - await _exporter.ExportExcelAsync(pathReader.ToString(), reader, configuration: config); + await _excelExporter.ExportAsync(pathReader.ToString(), reader, configuration: config); Assert.Equal("A1:D3", SheetHelper.GetFirstSheetDimensionRefValue(pathTable.ToString())); } @@ -909,13 +908,13 @@ public async Task SaveAsByDapperRows() await using (var connection = Db.GetConnection("Data Source=:memory:")) { var rows = await connection.QueryAsync("select 'MiniExcel' as Column1,1 as Column2 union all select 'Github',2"); - await _exporter.ExportExcelAsync(path, rows); + await _excelExporter.ExportAsync(path, rows); } Assert.Equal("A1:B3", SheetHelper.GetFirstSheetDimensionRefValue(path)); await using (var stream = File.OpenRead(path)) { - var rows = _importer.QueryExcelAsync(stream, useHeaderRow: true).ToBlockingEnumerable().Cast>().ToList(); + var rows = _excelImporter.QueryAsync(stream, useHeaderRow: true).ToBlockingEnumerable().Cast>().ToList(); Assert.Equal("MiniExcel", rows[0]["Column1"]); Assert.Equal(1d, rows[0]["Column2"]); Assert.Equal("Github", rows[1]["Column1"]); @@ -926,18 +925,18 @@ public async Task SaveAsByDapperRows() await using (var connection = Db.GetConnection("Data Source=:memory:")) { var rows = (await connection.QueryAsync("with cte as (select 'MiniExcel' as Column1,1 as Column2 union all select 'Github',2)select * from cte where 1=2")).ToList(); - await _exporter.ExportExcelAsync(path, rows, overwriteFile: true); + await _excelExporter.ExportAsync(path, rows, overwriteFile: true); } await using (var stream = File.OpenRead(path)) { - var rows = _importer.QueryExcelAsync(stream, useHeaderRow: false).ToBlockingEnumerable().ToList(); + var rows = _excelImporter.QueryAsync(stream, useHeaderRow: false).ToBlockingEnumerable().ToList(); Assert.Empty(rows); } await using (var stream = File.OpenRead(path)) { - var rows = _importer.QueryExcelAsync(stream, useHeaderRow: true).ToBlockingEnumerable().ToList(); + var rows = _excelImporter.QueryAsync(stream, useHeaderRow: true).ToBlockingEnumerable().ToList(); Assert.Empty(rows); } Assert.Equal("A1", SheetHelper.GetFirstSheetDimensionRefValue(path)); @@ -946,13 +945,13 @@ public async Task SaveAsByDapperRows() await using (var connection = Db.GetConnection("Data Source=:memory:")) { var rows = (await connection.QueryAsync("select 'MiniExcel' as Column1,1 as Column2 union all select 'Github',2")).ToList(); - await _exporter.ExportExcelAsync(path, rows, overwriteFile: true); + await _excelExporter.ExportAsync(path, rows, overwriteFile: true); } Assert.Equal("A1:B3", SheetHelper.GetFirstSheetDimensionRefValue(path)); await using (var stream = File.OpenRead(path)) { - var rows = _importer.QueryExcelAsync(stream, useHeaderRow: false).ToBlockingEnumerable().Cast>().ToList(); + var rows = _excelImporter.QueryAsync(stream, useHeaderRow: false).ToBlockingEnumerable().Cast>().ToList(); Assert.Equal("Column1", rows[0]["A"]); Assert.Equal("Column2", rows[0]["B"]); Assert.Equal("MiniExcel", rows[1]["A"]); @@ -963,7 +962,7 @@ public async Task SaveAsByDapperRows() await using (var stream = File.OpenRead(path)) { - var rows = _importer.QueryExcelAsync(stream, useHeaderRow: true).ToBlockingEnumerable().Cast>().ToList(); + var rows = _excelImporter.QueryAsync(stream, useHeaderRow: true).ToBlockingEnumerable().Cast>().ToList(); Assert.Equal("MiniExcel", rows[0]["Column1"]); Assert.Equal(1d, rows[0]["Column2"]); Assert.Equal("Github", rows[1]["Column1"]); @@ -987,10 +986,10 @@ public async Task QueryByStrongTypeParameterTest() new() { Column1 = "MiniExcel", Column2 = 1 }, new() { Column1 = "Github", Column2 = 2 } ]; - await _exporter.ExportExcelAsync(path, values); + await _excelExporter.ExportAsync(path, values); await using var stream = File.OpenRead(path); - var rows = _importer.QueryExcelAsync(stream, useHeaderRow: true).ToBlockingEnumerable().Cast>().ToList(); + var rows = _excelImporter.QueryAsync(stream, useHeaderRow: true).ToBlockingEnumerable().Cast>().ToList(); Assert.Equal("MiniExcel", rows[0]["Column1"]); Assert.Equal(1d, rows[0]["Column2"]); @@ -1008,10 +1007,10 @@ public async Task QueryByDictionaryStringAndObjectParameterTest() new() { { "Column1", "MiniExcel" }, { "Column2", 1 } }, new() { { "Column1", "Github" }, { "Column2", 2 } } ]; - await _exporter.ExportExcelAsync(path, values); + await _excelExporter.ExportAsync(path, values); await using var stream = File.OpenRead(path); - var rows = _importer.QueryExcelAsync(stream, useHeaderRow: true).ToBlockingEnumerable().Cast>().ToList(); + var rows = _excelImporter.QueryAsync(stream, useHeaderRow: true).ToBlockingEnumerable().Cast>().ToList(); Assert.Equal("MiniExcel", rows[0]["Column1"]); Assert.Equal(1d, rows[0]["Column2"]); @@ -1038,7 +1037,7 @@ public async Task SQLiteInsertTest() await using (var transaction = connection.BeginTransaction()) await using (var stream = File.OpenRead(path)) { - var rows = _importer.QueryExcelAsync(stream).ToBlockingEnumerable().Cast>(); + var rows = _excelImporter.QueryAsync(stream).ToBlockingEnumerable().Cast>(); foreach (var row in rows) await connection.ExecuteAsync( "insert into T (A,B) values (@A,@B)", @@ -1063,7 +1062,7 @@ public async Task SaveAsBasicCreateTest() using var file = AutoDeletingPath.Create(); var path = file.ToString(); - await _exporter.ExportExcelAsync(path, new[] + await _excelExporter.ExportAsync(path, new[] { new { Column1 = "MiniExcel", Column2 = 1 }, new { Column1 = "Github", Column2 = 2} @@ -1071,7 +1070,7 @@ await _exporter.ExportExcelAsync(path, new[] await using (var stream = File.OpenRead(path)) { - var d = _importer.QueryExcelAsync(stream, useHeaderRow: true).ToBlockingEnumerable().Cast>(); + var d = _excelImporter.QueryAsync(stream, useHeaderRow: true).ToBlockingEnumerable().Cast>(); var rows = d.ToList(); Assert.Equal("MiniExcel", rows[0]["Column1"]); Assert.Equal(1d, rows[0]["Column2"]); @@ -1095,12 +1094,12 @@ public async Task SaveAsBasicStreamTest() }; await using (var stream = new FileStream(path, FileMode.CreateNew)) { - await _exporter.ExportExcelAsync(stream, values); + await _excelExporter.ExportAsync(stream, values); } await using (var stream = File.OpenRead(path)) { - var rows = _importer.QueryExcelAsync(stream, useHeaderRow: true).ToBlockingEnumerable().Cast>().ToList(); + var rows = _excelImporter.QueryAsync(stream, useHeaderRow: true).ToBlockingEnumerable().Cast>().ToList(); Assert.Equal("MiniExcel", rows[0]["Column1"]); Assert.Equal(1d, rows[0]["Column2"]); Assert.Equal("Github", rows[1]["Column1"]); @@ -1118,14 +1117,14 @@ public async Task SaveAsBasicStreamTest() await using (var stream = new MemoryStream()) await using (var fileStream = new FileStream(path, FileMode.Create)) { - await _exporter.ExportExcelAsync(stream, values); + await _excelExporter.ExportAsync(stream, values); stream.Seek(0, SeekOrigin.Begin); await stream.CopyToAsync(fileStream); } await using (var stream = File.OpenRead(path)) { - var rows = _importer.QueryExcelAsync(stream, useHeaderRow: true).ToBlockingEnumerable().Cast>().ToList(); + var rows = _excelImporter.QueryAsync(stream, useHeaderRow: true).ToBlockingEnumerable().Cast>().ToList(); Assert.Equal("MiniExcel", rows[0]["Column1"]); Assert.Equal(1d, rows[0]["Column2"]); Assert.Equal("Github", rows[1]["Column1"]); @@ -1138,7 +1137,7 @@ public async Task SaveAsBasicStreamTest() public async Task SaveAsSpecialAndTypeCreateTest() { using var path = AutoDeletingPath.Create(); - await _exporter.ExportExcelAsync(path.ToString(), new[] + await _excelExporter.ExportAsync(path.ToString(), new[] { new { a = @"""<>+-*//}{\\n", b = 1234567890, c = true, d = DateTime.Now }, new { a = "Hello World", b = -1234567890, c = false, d = DateTime.Now.Date} @@ -1153,7 +1152,7 @@ public async Task SaveAsFileEpplusCanReadTest() using var path = AutoDeletingPath.Create(); var now = DateTime.Now; - await _exporter.ExportExcelAsync(path.ToString(), new[] + await _excelExporter.ExportAsync(path.ToString(), new[] { new { a = @"""<>+-*//}{\\n", b = 1234567890, c = true, d = now}, new { a = "Hello World", b = -1234567890, c = false, d = now.Date} @@ -1179,7 +1178,7 @@ public async Task SavaAsClosedXmlCanReadTest() var now = DateTime.Now; using var path = AutoDeletingPath.Create(); - await _exporter.ExportExcelAsync(path.ToString(), new[] + await _excelExporter.ExportAsync(path.ToString(), new[] { new { a = @"""<>+-*//}{\\n", b = 1234567890, c = true, d = now}, new { a = "Hello World", b = -1234567890, c = false, d = now.Date} @@ -1204,7 +1203,7 @@ public async Task ContentTypeUriContentTypeReadCheckTest() var now = DateTime.Now; using var path = AutoDeletingPath.Create(); - await _exporter.ExportExcelAsync(path.ToString(), new[] + await _excelExporter.ExportAsync(path.ToString(), new[] { new { a = @"""<>+-*//}{\\n", b = 1234567890, c = true, d = now}, new { a = "Hello World", b = -1234567890, c = false, d = now.Date} @@ -1232,7 +1231,7 @@ await Assert.ThrowsAsync(async () => await cts.CancelAsync(); await using var stream = FileHelper.OpenRead(path); - var rows = _importer.QueryExcelAsync(stream, cancellationToken: cts.Token).ToBlockingEnumerable(cts.Token).ToList(); + var rows = _excelImporter.QueryAsync(stream, cancellationToken: cts.Token).ToBlockingEnumerable(cts.Token).ToList(); }); } @@ -1252,7 +1251,7 @@ await Assert.ThrowsAsync(async () => }); await using var stream = FileHelper.OpenRead(path); - var d = _importer.QueryExcelAsync(stream, cancellationToken: cts.Token).ToBlockingEnumerable(cts.Token); + var d = _excelImporter.QueryAsync(stream, cancellationToken: cts.Token).ToBlockingEnumerable(cts.Token); await cancelTask; _ = d.ToList(); }); @@ -1300,10 +1299,10 @@ public async Task DynamicColumnsConfigurationIsUsedWhenCreatingExcelUsingIDataRe ] }; await using var reader = table.CreateDataReader(); - await _exporter.ExportExcelAsync(path.ToString(), reader, configuration: configuration); + await _excelExporter.ExportAsync(path.ToString(), reader, configuration: configuration); await using var stream = File.OpenRead(path.ToString()); - var rows = _importer.QueryExcelAsync(stream, useHeaderRow: true).ToBlockingEnumerable() + var rows = _excelImporter.QueryAsync(stream, useHeaderRow: true).ToBlockingEnumerable() .Cast>() .ToList(); @@ -1366,10 +1365,10 @@ public async Task DynamicColumnsConfigurationIsUsedWhenCreatingExcelUsingDataTab } ] }; - await _exporter.ExportExcelAsync(path.ToString(), table, configuration: configuration); + await _excelExporter.ExportAsync(path.ToString(), table, configuration: configuration); await using var stream = File.OpenRead(path.ToString()); - var rows = _importer.QueryExcelAsync(stream, useHeaderRow: true).ToBlockingEnumerable() + var rows = _excelImporter.QueryAsync(stream, useHeaderRow: true).ToBlockingEnumerable() .Cast>() .ToList(); @@ -1402,13 +1401,13 @@ public async Task SaveAsByMiniExcelDataReader() new() { Column1= "MiniExcel" ,Column2 = 1 }, new() { Column1 = "Github", Column2 = 2 } }; - await _exporter.ExportExcelAsync(path1.ToString(), values); + await _excelExporter.ExportAsync(path1.ToString(), values); - await using (IMiniExcelDataReader? reader = _importer.GetExcelDataReader(path1.ToString(), true)) + await using (IMiniExcelDataReader? reader = _excelImporter.GetExcelDataReader(path1.ToString(), true)) { using var path2 = AutoDeletingPath.Create(); - await _exporter.ExportExcelAsync(path2.ToString(), reader); - var results = _importer.QueryExcelAsync(path2.ToString()).ToBlockingEnumerable().ToList(); + await _excelExporter.ExportAsync(path2.ToString(), reader); + var results = _excelImporter.QueryAsync(path2.ToString()).ToBlockingEnumerable().ToList(); Assert.True(results.Count == 2); Assert.True(results.First().Column1 == "MiniExcel"); @@ -1434,7 +1433,7 @@ public async Task InsertSheetTest() table.Rows.Add(@"""<>+-*//}{\\n", 1234567890, true, now); table.Rows.Add("Hello World", -1234567890, false, now.Date); - await _exporter.InsertExcelSheetAsync(path, table, sheetName: "Sheet1"); + await _excelExporter.InsertSheetAsync(path, table, sheetName: "Sheet1"); using var p = new ExcelPackage(new FileInfo(path)); var sheet1 = p.Workbook.Worksheets[0]; @@ -1457,7 +1456,7 @@ public async Task InsertSheetTest() table.Rows.Add("MiniExcel", 1); table.Rows.Add("Github", 2); - await _exporter.InsertExcelSheetAsync(path, table, sheetName: "Sheet2"); + await _excelExporter.InsertSheetAsync(path, table, sheetName: "Sheet2"); using var p = new ExcelPackage(new FileInfo(path)); var sheet2 = p.Workbook.Worksheets[1]; @@ -1478,7 +1477,7 @@ public async Task InsertSheetTest() table.Columns.Add("Column2", typeof(DateTime)); table.Rows.Add("Test", now); - await _exporter.InsertExcelSheetAsync(path, table, sheetName: "Sheet2", printHeader: false, configuration: new OpenXmlConfiguration + await _excelExporter.InsertSheetAsync(path, table, sheetName: "Sheet2", printHeader: false, configuration: new OpenXmlConfiguration { FastMode = true, AutoFilter = false, @@ -1509,7 +1508,7 @@ public async Task InsertSheetTest() table.Rows.Add("MiniExcel", now); table.Rows.Add("Github", now); - await _exporter.InsertExcelSheetAsync(path, table, sheetName: "Sheet3", configuration: new OpenXmlConfiguration + await _excelExporter.InsertSheetAsync(path, table, sheetName: "Sheet3", configuration: new OpenXmlConfiguration { FastMode = true, AutoFilter = false, @@ -1555,8 +1554,8 @@ static async IAsyncEnumerable GetValues() } #pragma warning restore CS1998 - await _exporter.ExportExcelAsync(path.ToString(), GetValues()); - var results = _importer.QueryExcel(path.ToString(), useHeaderRow: true).ToList(); + await _excelExporter.ExportAsync(path.ToString(), GetValues()); + var results = _excelImporter.Query(path.ToString(), useHeaderRow: true).ToList(); Assert.Equal(2, results.Count); Assert.Equal("MiniExcel", results[0].Column1); diff --git a/tests/MiniExcel.Tests/MiniExcelOpenXmlConfigurationTest.cs b/tests/MiniExcel.Tests/MiniExcelOpenXmlConfigurationTest.cs index 71ff935b..b685403b 100644 --- a/tests/MiniExcel.Tests/MiniExcelOpenXmlConfigurationTest.cs +++ b/tests/MiniExcel.Tests/MiniExcelOpenXmlConfigurationTest.cs @@ -6,8 +6,8 @@ namespace MiniExcelLib.Tests; public class MiniExcelOpenXmlConfigurationTest { - private readonly OpenXmlImporter _importer = MiniExcel.Importer.GetExcelImporter(); - private readonly OpenXmlExporter _exporter = MiniExcel.Exporter.GetExcelExporter(); + private readonly OpenXmlImporter _excelImporter = MiniExcel.Importer.GetExcelImporter(); + private readonly OpenXmlExporter _excelExporter = MiniExcel.Exporter.GetExcelExporter(); [Fact] public async Task EnableWriteFilePathTest() { @@ -23,10 +23,10 @@ public async Task EnableWriteFilePathTest() ]; var path = PathHelper.GetFile("xlsx/Test_EnableWriteFilePath.xlsx"); - await _exporter.ExportExcelAsync(path, value, configuration: new OpenXmlConfiguration { EnableWriteFilePath = false }, overwriteFile: true); + await _excelExporter.ExportAsync(path, value, configuration: new OpenXmlConfiguration { EnableWriteFilePath = false }, overwriteFile: true); Assert.True(File.Exists(path)); - var rows = await _importer.QueryExcelAsync(path).CreateListAsync(); + var rows = await _excelImporter.QueryAsync(path).CreateListAsync(); Assert.True(rows.All(x => x.Img is null or [])); } diff --git a/tests/MiniExcel.Tests/MiniExcelOpenXmlMultipleSheetAsyncTests.cs b/tests/MiniExcel.Tests/MiniExcelOpenXmlMultipleSheetAsyncTests.cs index 38a89411..5a1e8438 100644 --- a/tests/MiniExcel.Tests/MiniExcelOpenXmlMultipleSheetAsyncTests.cs +++ b/tests/MiniExcel.Tests/MiniExcelOpenXmlMultipleSheetAsyncTests.cs @@ -2,28 +2,28 @@ public class MiniExcelOpenXmlMultipleSheetAsyncTests { - private readonly OpenXmlImporter _importer = MiniExcel.Importer.GetExcelImporter(); + private readonly OpenXmlImporter _excelImporter = MiniExcel.Importer.GetExcelImporter(); [Fact] public async Task SpecifySheetNameQueryTest() { const string path = "../../../../../samples/xlsx/TestMultiSheet.xlsx"; { - var q = _importer.QueryExcelAsync(path, sheetName: "Sheet3").ToBlockingEnumerable(); + var q = _excelImporter.QueryAsync(path, sheetName: "Sheet3").ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal(5, rows.Count); Assert.Equal(3, rows[0].A); Assert.Equal(3, rows[0].B); } { - var q = _importer.QueryExcelAsync(path, sheetName: "Sheet2").ToBlockingEnumerable(); + var q = _excelImporter.QueryAsync(path, sheetName: "Sheet2").ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal(12, rows.Count); Assert.Equal(1, rows[0].A); Assert.Equal(1, rows[0].B); } { - var q = _importer.QueryExcelAsync(path, sheetName: "Sheet1").ToBlockingEnumerable(); + var q = _excelImporter.QueryAsync(path, sheetName: "Sheet1").ToBlockingEnumerable(); var rows = q.ToList(); Assert.Equal(12, rows.Count); Assert.Equal(2, rows[0].A); @@ -32,7 +32,7 @@ public async Task SpecifySheetNameQueryTest() { await Assert.ThrowsAsync(() => { - _ = _importer.QueryExcelAsync(path, sheetName: "xxxx").ToBlockingEnumerable().ToList(); + _ = _excelImporter.QueryAsync(path, sheetName: "xxxx").ToBlockingEnumerable().ToList(); return Task.CompletedTask; }); } @@ -40,25 +40,25 @@ await Assert.ThrowsAsync(() => await using var stream = File.OpenRead(path); { - var rows = _importer.QueryExcelAsync(stream, sheetName: "Sheet3").ToBlockingEnumerable().Cast>().ToList(); + var rows = _excelImporter.QueryAsync(stream, sheetName: "Sheet3").ToBlockingEnumerable().Cast>().ToList(); Assert.Equal(5, rows.Count); Assert.Equal(3d, rows[0]["A"]); Assert.Equal(3d, rows[0]["B"]); } { - var rows = _importer.QueryExcelAsync(stream, sheetName: "Sheet2").ToBlockingEnumerable().Cast>().ToList(); + var rows = _excelImporter.QueryAsync(stream, sheetName: "Sheet2").ToBlockingEnumerable().Cast>().ToList(); Assert.Equal(12, rows.Count); Assert.Equal(1d, rows[0]["A"]); Assert.Equal(1d, rows[0]["B"]); } { - var rows = _importer.QueryExcelAsync(stream, sheetName: "Sheet1").ToBlockingEnumerable().Cast>().ToList(); + var rows = _excelImporter.QueryAsync(stream, sheetName: "Sheet1").ToBlockingEnumerable().Cast>().ToList(); Assert.Equal(12, rows.Count); Assert.Equal(2d, rows[0]["A"]); Assert.Equal(2d, rows[0]["B"]); } { - var rows = _importer.QueryExcelAsync(stream, sheetName: "Sheet1").ToBlockingEnumerable().Cast>().ToList(); + var rows = _excelImporter.QueryAsync(stream, sheetName: "Sheet1").ToBlockingEnumerable().Cast>().ToList(); Assert.Equal(12, rows.Count); Assert.Equal(2d, rows[0]["A"]); Assert.Equal(2d, rows[0]["B"]); @@ -70,9 +70,9 @@ public async Task MultiSheetsQueryBasicTest() { const string path = "../../../../../samples/xlsx/TestMultiSheet.xlsx"; await using var stream = File.OpenRead(path); - _ = _importer.QueryExcelAsync(stream, sheetName: "Sheet1").ToBlockingEnumerable(); - _ = _importer.QueryExcelAsync(stream, sheetName: "Sheet2").ToBlockingEnumerable(); - _ = _importer.QueryExcelAsync(stream, sheetName: "Sheet3").ToBlockingEnumerable(); + _ = _excelImporter.QueryAsync(stream, sheetName: "Sheet1").ToBlockingEnumerable(); + _ = _excelImporter.QueryAsync(stream, sheetName: "Sheet2").ToBlockingEnumerable(); + _ = _excelImporter.QueryAsync(stream, sheetName: "Sheet3").ToBlockingEnumerable(); } [Fact] @@ -80,21 +80,23 @@ public async Task MultiSheetsQueryTest() { const string path = "../../../../../samples/xlsx/TestMultiSheet.xlsx"; { - var sheetNames = (await _importer.GetSheetNamesAsync(path)).ToList(); + var sheetNames = await _excelImporter.GetSheetNamesAsync(path); foreach (var sheetName in sheetNames) { - _ = _importer.QueryExcelAsync(path, sheetName: sheetName).ToBlockingEnumerable(); + _ = _excelImporter.QueryAsync(path, sheetName: sheetName).ToBlockingEnumerable(); } + Assert.Equal(new[] { "Sheet1", "Sheet2", "Sheet3" }, sheetNames); } { await using var stream = File.OpenRead(path); - var sheetNames = (await _importer.GetSheetNamesAsync(stream)).ToList(); + var sheetNames = await _excelImporter.GetSheetNamesAsync(stream); + Assert.Equal(new[] { "Sheet1", "Sheet2", "Sheet3" }, sheetNames); foreach (var sheetName in sheetNames) { - _ = _importer.QueryExcelAsync(stream, sheetName: sheetName).ToBlockingEnumerable().ToList(); + _ = _excelImporter.QueryAsync(stream, sheetName: sheetName).ToBlockingEnumerable().ToList(); } } } diff --git a/tests/MiniExcel.Tests/MiniExcelOpenXmlMultipleSheetTests.cs b/tests/MiniExcel.Tests/MiniExcelOpenXmlMultipleSheetTests.cs index 659adc71..bba87ab7 100644 --- a/tests/MiniExcel.Tests/MiniExcelOpenXmlMultipleSheetTests.cs +++ b/tests/MiniExcel.Tests/MiniExcelOpenXmlMultipleSheetTests.cs @@ -6,54 +6,54 @@ namespace MiniExcelLib.Tests; public class MiniExcelOpenXmlMultipleSheetTests { - private readonly OpenXmlImporter _importer = MiniExcel.Importer.GetExcelImporter(); + private readonly OpenXmlImporter _excelImporter = MiniExcel.Importer.GetExcelImporter(); [Fact] public void SpecifySheetNameQueryTest() { const string path = "../../../../../samples/xlsx/TestMultiSheet.xlsx"; { - var rows = _importer.QueryExcel(path, sheetName: "Sheet3").ToList(); + var rows = _excelImporter.Query(path, sheetName: "Sheet3").ToList(); Assert.Equal(5, rows.Count); Assert.Equal(3, rows[0].A); Assert.Equal(3, rows[0].B); } { - var rows = _importer.QueryExcel(path, sheetName: "Sheet2").ToList(); + var rows = _excelImporter.Query(path, sheetName: "Sheet2").ToList(); Assert.Equal(12, rows.Count); Assert.Equal(1, rows[0].A); Assert.Equal(1, rows[0].B); } { - var rows = _importer.QueryExcel(path, sheetName: "Sheet1").ToList(); + var rows = _excelImporter.Query(path, sheetName: "Sheet1").ToList(); Assert.Equal(12, rows.Count); Assert.Equal(2, rows[0].A); Assert.Equal(2, rows[0].B); } - Assert.Throws(() => _importer.QueryExcel(path, sheetName: "xxxx").ToList()); + Assert.Throws(() => _excelImporter.Query(path, sheetName: "xxxx").ToList()); using var stream = File.OpenRead(path); { - var rows = _importer.QueryExcel(stream, sheetName: "Sheet3").ToList(); + var rows = _excelImporter.Query(stream, sheetName: "Sheet3").ToList(); Assert.Equal(5, rows.Count); Assert.Equal(3, rows[0].A); Assert.Equal(3, rows[0].B); } { - var rows = _importer.QueryExcel(stream, sheetName: "Sheet2").ToList(); + var rows = _excelImporter.Query(stream, sheetName: "Sheet2").ToList(); Assert.Equal(12, rows.Count); Assert.Equal(1, rows[0].A); Assert.Equal(1, rows[0].B); } { - var rows = _importer.QueryExcel(stream, sheetName: "Sheet1").ToList(); + var rows = _excelImporter.Query(stream, sheetName: "Sheet1").ToList(); Assert.Equal(12, rows.Count); Assert.Equal(2, rows[0].A); Assert.Equal(2, rows[0].B); } { - var rows = _importer.QueryExcel(stream, sheetName: "Sheet1").ToList(); + var rows = _excelImporter.Query(stream, sheetName: "Sheet1").ToList(); Assert.Equal(12, rows.Count); Assert.Equal(2, rows[0].A); Assert.Equal(2, rows[0].B); @@ -66,9 +66,9 @@ public void MultiSheetsQueryBasicTest() const string path = "../../../../../samples/xlsx/TestMultiSheet.xlsx"; using var stream = File.OpenRead(path); - _ = _importer.QueryExcel(stream, sheetName: "Sheet1"); - _ = _importer.QueryExcel(stream, sheetName: "Sheet2"); - _ = _importer.QueryExcel(stream, sheetName: "Sheet3"); + _ = _excelImporter.Query(stream, sheetName: "Sheet1"); + _ = _excelImporter.Query(stream, sheetName: "Sheet2"); + _ = _excelImporter.Query(stream, sheetName: "Sheet3"); } [Fact] @@ -76,10 +76,10 @@ public void MultiSheetsQueryTest() { const string path = "../../../../../samples/xlsx/TestMultiSheet.xlsx"; { - var sheetNames = _importer.GetSheetNames(path).ToList(); + var sheetNames = _excelImporter.GetSheetNames(path).ToList(); foreach (var sheetName in sheetNames) { - var rows = _importer.QueryExcel(path, sheetName: sheetName).ToList(); + var rows = _excelImporter.Query(path, sheetName: sheetName).ToList(); } Assert.Equal(new[] { "Sheet1", "Sheet2", "Sheet3" }, sheetNames); @@ -87,12 +87,12 @@ public void MultiSheetsQueryTest() { using var stream = File.OpenRead(path); - var sheetNames = _importer.GetSheetNames(stream).ToList(); - Assert.Equal(new[] { "Sheet1", "Sheet2", "Sheet3" }, sheetNames); + var sheetNames = _excelImporter.GetSheetNames(stream).ToList(); + Assert.Equal(new[] { "Sheet1", "Sheet2", "Sheet3" }, sheetNames); foreach (var sheetName in sheetNames) { - var rows = _importer.QueryExcel(stream, sheetName: sheetName).ToList(); + var rows = _excelImporter.Query(stream, sheetName: sheetName).ToList(); } } } @@ -117,21 +117,21 @@ public void ExcelSheetAttributeIsUsedWhenReadExcel() const string path = "../../../../../samples/xlsx/TestDynamicSheet.xlsx"; using (var stream = File.OpenRead(path)) { - var users = _importer.QueryExcel(stream).ToList(); + var users = _excelImporter.Query(stream).ToList(); Assert.Equal(2, users.Count); Assert.Equal("Jack", users[0].Name); - var departments = _importer.QueryExcel(stream).ToList(); + var departments = _excelImporter.Query(stream).ToList(); Assert.Equal(2, departments.Count); Assert.Equal("HR", departments[0].Name); } { - var users = _importer.QueryExcel(path).ToList(); + var users = _excelImporter.Query(path).ToList(); Assert.Equal(2, users.Count); Assert.Equal("Jack", users[0].Name); - var departments = _importer.QueryExcel(path).ToList(); + var departments = _excelImporter.Query(path).ToList(); Assert.Equal(2, departments.Count); Assert.Equal("HR", departments[0].Name); } @@ -153,34 +153,34 @@ public void DynamicSheetConfigurationIsUsedWhenReadExcel() using (var stream = File.OpenRead(path)) { // take first sheet as default - var users = _importer.QueryExcel(stream, configuration: configuration, useHeaderRow: true).ToList(); + var users = _excelImporter.Query(stream, configuration: configuration, useHeaderRow: true).ToList(); Assert.Equal(2, users.Count); Assert.Equal("Jack", users[0].Name); // take second sheet by sheet name - var departments = _importer.QueryExcel(stream, sheetName: "Departments", configuration: configuration, useHeaderRow: true).ToList(); + var departments = _excelImporter.Query(stream, sheetName: "Departments", configuration: configuration, useHeaderRow: true).ToList(); Assert.Equal(2, departments.Count); Assert.Equal("HR", departments[0].Name); // take second sheet by sheet key - departments = _importer.QueryExcel(stream, sheetName: "departmentSheet", configuration: configuration, useHeaderRow: true).ToList(); + departments = _excelImporter.Query(stream, sheetName: "departmentSheet", configuration: configuration, useHeaderRow: true).ToList(); Assert.Equal(2, departments.Count); Assert.Equal("HR", departments[0].Name); } { // take first sheet as default - var users = _importer.QueryExcel(path, configuration: configuration, useHeaderRow: true).ToList(); + var users = _excelImporter.Query(path, configuration: configuration, useHeaderRow: true).ToList(); Assert.Equal(2, users.Count); Assert.Equal("Jack", users[0].Name); // take second sheet by sheet name - var departments = _importer.QueryExcel(path, sheetName: "Departments", configuration: configuration, useHeaderRow: true).ToList(); + var departments = _excelImporter.Query(path, sheetName: "Departments", configuration: configuration, useHeaderRow: true).ToList(); Assert.Equal(2, departments.Count); Assert.Equal("HR", departments[0].Name); // take second sheet by sheet key - departments = _importer.QueryExcel(path, sheetName: "departmentSheet", configuration: configuration, useHeaderRow: true).ToList(); + departments = _excelImporter.Query(path, sheetName: "departmentSheet", configuration: configuration, useHeaderRow: true).ToList(); Assert.Equal(2, departments.Count); Assert.Equal("HR", departments[0].Name); } @@ -191,7 +191,7 @@ public void ReadSheetVisibilityStateTest() { const string path = "../../../../../samples/xlsx/TestMultiSheetWithHiddenSheet.xlsx"; { - var sheetInfos = _importer.GetSheetInformations(path).ToList(); + var sheetInfos = _excelImporter.GetSheetInformations(path).ToList(); Assert.Collection(sheetInfos, i => { @@ -255,12 +255,12 @@ public void WriteHiddenSheetTest() using var file = AutoDeletingPath.Create(); var path = file.ToString(); - var rowsWritten = MiniExcel.Exporter.GetExcelExporter().ExportExcel(path, sheets, configuration: configuration); + var rowsWritten = MiniExcel.Exporter.GetExcelExporter().Export(path, sheets, configuration: configuration); Assert.Equal(2, rowsWritten.Length); Assert.Equal(2, rowsWritten[0]); - var sheetInfos = _importer.GetSheetInformations(path).ToList(); + var sheetInfos = _excelImporter.GetSheetInformations(path).ToList(); Assert.Collection(sheetInfos, i => { @@ -279,7 +279,7 @@ public void WriteHiddenSheetTest() foreach (var sheetName in sheetInfos.Select(s => s.Name)) { - var rows = _importer.QueryExcel(path, sheetName: sheetName).ToList(); + var rows = _excelImporter.Query(path, sheetName: sheetName).ToList(); } } } \ No newline at end of file diff --git a/tests/MiniExcel.Tests/MiniExcelOpenXmlTests.cs b/tests/MiniExcel.Tests/MiniExcelOpenXmlTests.cs index b1d1929c..e038fa7f 100644 --- a/tests/MiniExcel.Tests/MiniExcelOpenXmlTests.cs +++ b/tests/MiniExcel.Tests/MiniExcelOpenXmlTests.cs @@ -11,8 +11,8 @@ public class MiniExcelOpenXmlTests(ITestOutputHelper output) { private readonly ITestOutputHelper _output = output; - private readonly OpenXmlImporter _importer = MiniExcel.Importer.GetExcelImporter(); - private readonly OpenXmlExporter _exporter = MiniExcel.Exporter.GetExcelExporter(); + private readonly OpenXmlImporter _excelImporter = MiniExcel.Importer.GetExcelImporter(); + private readonly OpenXmlExporter _excelExporter = MiniExcel.Exporter.GetExcelExporter(); [Fact] public void GetColumnsTest() @@ -20,17 +20,17 @@ public void GetColumnsTest() const string tmPath = "../../../../../samples/xlsx/TestTypeMapping.xlsx"; const string tePath = "../../../../../samples/xlsx/TestEmpty.xlsx"; { - var columns = _importer.GetExcelColumns (tmPath); + var columns = _excelImporter.GetColumnNames (tmPath); Assert.Equal(["A", "B", "C", "D", "E", "F", "G", "H"], columns); } { - var columns = _importer.GetExcelColumns (tmPath); + var columns = _excelImporter.GetColumnNames (tmPath); Assert.Equal(8, columns.Count); } { - var columns = _importer.GetExcelColumns (tePath); + var columns = _excelImporter.GetColumnNames (tePath); Assert.Empty(columns); } } @@ -50,10 +50,10 @@ public void SaveAsControlChracter() '\u0017','\u0018','\u0019','\u001A','\u001B','\u001C','\u001D','\u001E','\u001F','\u007F' ]; var input = chars.Select(s => new { Test = s.ToString() }); - _exporter.ExportExcel(path.ToString(), input); + _excelExporter.Export(path.ToString(), input); - var rows2 = _importer.QueryExcel(path.ToString(), true).Select(s => s.Test).ToArray(); - var rows1 = _importer.QueryExcel(path.ToString()).Select(s => s.Test).ToArray(); + var rows2 = _excelImporter.Query(path.ToString(), true).Select(s => s.Test).ToArray(); + var rows1 = _excelImporter.Query(path.ToString()).Select(s => s.Test).ToArray(); } private class SaveAsControlChracterVO @@ -81,14 +81,14 @@ private class ExcelAttributeDemo public void CustomAttributeWihoutVaildPropertiesTest() { const string path = "../../../../../samples/xlsx/TestCustomExcelColumnAttribute.xlsx"; - Assert.Throws(() => _importer.QueryExcel(path).ToList()); + Assert.Throws(() => _excelImporter.Query(path).ToList()); } [Fact] public void QueryCustomAttributesTest() { const string path = "../../../../../samples/xlsx/TestCustomExcelColumnAttribute.xlsx"; - var rows = _importer.QueryExcel(path).ToList(); + var rows = _excelImporter.Query(path).ToList(); Assert.Equal("Column1", rows[0].Test1); Assert.Equal("Column2", rows[0].Test2); @@ -112,8 +112,8 @@ public void SaveAsCustomAttributesTest() Test4 = "Test4", }); - _exporter.ExportExcel(path.ToString(), input); - var rows = _importer.QueryExcel(path.ToString(), true).ToList(); + _excelExporter.Export(path.ToString(), input); + var rows = _excelImporter.Query(path.ToString(), true).ToList(); var first = rows[0] as IDictionary; Assert.Equal(3, rows.Count); @@ -139,7 +139,7 @@ private class CustomAttributesWihoutVaildPropertiesTestPoco public void QueryCastToIDictionary() { const string path = "../../../../../samples/xlsx/TestCenterEmptyRow/TestCenterEmptyRow.xlsx"; - foreach (IDictionary row in _importer.QueryExcel(path)) + foreach (IDictionary row in _excelImporter.Query(path)) { _ = row; } @@ -150,7 +150,7 @@ public void QueryRangeToIDictionary() { const string path = "../../../../../samples/xlsx/TestCenterEmptyRow/TestCenterEmptyRow.xlsx"; // tips:Only uppercase letters are effective - var rows = _importer.QueryExcelRange(path, startCell: "A2", endCell: "C7") + var rows = _excelImporter.QueryRange(path, startCell: "A2", endCell: "C7") .Cast>() .ToList(); @@ -161,7 +161,7 @@ public void QueryRangeToIDictionary() var startCellXY = ReferenceHelper.ConvertCellToCoordinates("A2"); var endCellXY = ReferenceHelper.ConvertCellToCoordinates("C7"); - rows = _importer.QueryExcelRange(path, startRowIndex: startCellXY.Item2, startColumnIndex: startCellXY.Item1, endRowIndex: endCellXY.Item2, endColumnIndex: endCellXY.Item1) + rows = _excelImporter.QueryRange(path, startRowIndex: startCellXY.Item2, startColumnIndex: startCellXY.Item1, endRowIndex: endCellXY.Item2, endColumnIndex: endCellXY.Item1) .Cast>() .ToList(); Assert.Equal(5, rows.Count); @@ -169,14 +169,14 @@ public void QueryRangeToIDictionary() Assert.Equal(2d, rows[1]["B"]); Assert.Equal(null!, rows[2]["A"]); - rows = _importer.QueryExcelRange(path, startRowIndex:2, startColumnIndex: 1, endRowIndex: 3) + rows = _excelImporter.QueryRange(path, startRowIndex:2, startColumnIndex: 1, endRowIndex: 3) .Cast>() .ToList(); Assert.Equal(2, rows.Count); Assert.Equal(4, rows[0].Count); Assert.Equal(4d, rows[1]["D"]); - rows = _importer.QueryExcelRange(path, startRowIndex: 2, startColumnIndex: 1, endColumnIndex: 3) + rows = _excelImporter.QueryRange(path, startRowIndex: 2, startColumnIndex: 1, endColumnIndex: 3) .Cast>() .ToList(); Assert.Equal(5, rows.Count); @@ -190,7 +190,7 @@ public void CenterEmptyRowsQueryTest() const string path = "../../../../../samples/xlsx/TestCenterEmptyRow/TestCenterEmptyRow.xlsx"; using (var stream = File.OpenRead(path)) { - var rows = _importer.QueryExcel(stream).ToList(); + var rows = _excelImporter.Query(stream).ToList(); Assert.Equal("a", rows[0].A); Assert.Equal("b", rows[0].B); @@ -225,7 +225,7 @@ public void CenterEmptyRowsQueryTest() using (var stream = File.OpenRead(path)) { - var rows = _importer.QueryExcel(stream, useHeaderRow: true).ToList(); + var rows = _excelImporter.Query(stream, useHeaderRow: true).ToList(); Assert.Equal(1, rows[0].a); Assert.Equal(null, rows[0].b); @@ -259,7 +259,7 @@ public void TestEmptyRowsQuerySelfClosingTag() { const string path = "../../../../../samples/xlsx/TestEmptySelfClosingRow.xlsx"; using var stream = File.OpenRead(path); - var rows = _importer.QueryExcel(stream).ToList(); + var rows = _excelImporter.Query(stream).ToList(); Assert.Equal(null, rows[0].A); Assert.Equal(1, rows[1].A); @@ -278,7 +278,7 @@ public void TestDynamicQueryBasic_WithoutHead() { const string path = "../../../../../samples/xlsx/TestDynamicQueryBasic_WithoutHead.xlsx"; using var stream = File.OpenRead(path); - var rows = _importer.QueryExcel(stream).ToList(); + var rows = _excelImporter.Query(stream).ToList(); Assert.Equal("MiniExcel", rows[0].A); Assert.Equal(1, rows[0].B); @@ -292,7 +292,7 @@ public void TestDynamicQueryBasic_useHeaderRow() const string path = "../../../../../samples/xlsx/TestDynamicQueryBasic.xlsx"; using (var stream = File.OpenRead(path)) { - var rows = _importer.QueryExcel(stream, useHeaderRow: true).ToList(); + var rows = _excelImporter.Query(stream, useHeaderRow: true).ToList(); Assert.Equal("MiniExcel", rows[0].Column1); Assert.Equal(1, rows[0].Column2); @@ -301,7 +301,7 @@ public void TestDynamicQueryBasic_useHeaderRow() } { - var rows = _importer.QueryExcel(path, useHeaderRow: true).ToList(); + var rows = _excelImporter.Query(path, useHeaderRow: true).ToList(); Assert.Equal("MiniExcel", rows[0].Column1); Assert.Equal(1, rows[0].Column2); @@ -332,7 +332,7 @@ public void QueryStrongTypeMapping_Test() const string path = "../../../../../samples/xlsx/TestTypeMapping.xlsx"; using (var stream = File.OpenRead(path)) { - var rows = _importer.QueryExcel(stream).ToList(); + var rows = _excelImporter.Query(stream).ToList(); Assert.Equal(100, rows.Count); Assert.Equal(Guid.Parse("78DE23D2-DCB6-BD3D-EC67-C112BBC322A2"), rows[0].ID); @@ -345,7 +345,7 @@ public void QueryStrongTypeMapping_Test() } { - var rows = _importer.QueryExcel(path).ToList(); + var rows = _excelImporter.Query(path).ToList(); Assert.Equal(100, rows.Count); Assert.Equal(Guid.Parse("78DE23D2-DCB6-BD3D-EC67-C112BBC322A2"), rows[0].ID); @@ -371,7 +371,7 @@ public void AutoCheckTypeTest() { const string path = "../../../../../samples/xlsx/TestTypeMapping_AutoCheckFormat.xlsx"; using var stream = FileHelper.OpenRead(path); - var rows = _importer.QueryExcel(stream).ToList(); + var rows = _excelImporter.Query(stream).ToList(); } private class ExcelUriDemo @@ -386,7 +386,7 @@ public void UriMappingTest() { const string path = "../../../../../samples/xlsx/TestUriMapping.xlsx"; using var stream = File.OpenRead(path); - var rows = _importer.QueryExcel(stream).ToList(); + var rows = _excelImporter.Query(stream).ToList(); Assert.Equal("Felix", rows[1].Name); Assert.Equal(44, rows[1].Age); @@ -404,7 +404,7 @@ private class SimpleAccount public void TrimColumnNamesTest() { const string path = "../../../../../samples/xlsx/TestTrimColumnNames.xlsx"; - var rows = _importer.QueryExcel(path).ToList(); + var rows = _excelImporter.Query(path).ToList(); Assert.Equal("Raymond", rows[4].Name); Assert.Equal(18, rows[4].Age); @@ -418,7 +418,7 @@ public void TestDatetimeSpanFormat_ClosedXml() const string path = "../../../../../samples/xlsx/TestDatetimeSpanFormat_ClosedXml.xlsx"; using var stream = FileHelper.OpenRead(path); - var row = _importer.QueryExcel(stream).First(); + var row = _excelImporter.Query(stream).First(); var a = row.A; var b = row.B; Assert.Equal(DateTime.Parse("2021-03-20T23:39:42.3130000"), (DateTime)a); @@ -431,13 +431,13 @@ public void LargeFileQueryStrongTypeMapping_Test() const string path = "../../../../../benchmarks/MiniExcel.Benchmarks/Test1,000,000x10.xlsx"; using (var stream = File.OpenRead(path)) { - var rows = _importer.QueryExcel(stream).Take(2).ToList(); + var rows = _excelImporter.Query(stream).Take(2).ToList(); Assert.Equal("HelloWorld2", rows[0].HelloWorld1); Assert.Equal("HelloWorld3", rows[1].HelloWorld1); } { - var rows = _importer.QueryExcel(path).Take(2).ToList(); + var rows = _excelImporter.Query(path).Take(2).ToList(); Assert.Equal("HelloWorld2", rows[0].HelloWorld1); Assert.Equal("HelloWorld3", rows[1].HelloWorld1); @@ -447,7 +447,7 @@ public void LargeFileQueryStrongTypeMapping_Test() [Theory] [InlineData("../../../../../samples/xlsx/ExcelDataReaderCollections/TestChess.xlsx")] [InlineData("../../../../../samples/xlsx/TestCenterEmptyRow/TestCenterEmptyRow.xlsx")] - public void QueryExcelDataReaderCheckTest(string path) + public void QueryDataReaderCheckTest(string path) { #if NETCOREAPP3_1_OR_GREATER Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); @@ -457,7 +457,7 @@ public void QueryExcelDataReaderCheckTest(string path) var exceldatareaderResult = reader.AsDataSet(); using var stream = File.OpenRead(path); - var rows = _importer.QueryExcel(stream).ToList(); + var rows = _excelImporter.Query(stream).ToList(); Assert.Equal(exceldatareaderResult.Tables[0].Rows.Count, rows.Count); foreach (IDictionary row in rows) @@ -487,7 +487,7 @@ public void QuerySheetWithoutRAttribute() { const string path = "../../../../../samples/xlsx/TestWihoutRAttribute.xlsx"; using var stream = File.OpenRead(path); - var rows = _importer.QueryExcel(stream).ToList(); + var rows = _excelImporter.Query(stream).ToList(); var keys = (rows.First() as IDictionary)!.Keys; Assert.Equal(2, rows.Count); @@ -509,7 +509,7 @@ public void FixDimensionJustOneColumnParsingError_Test() { const string path = "../../../../../samples/xlsx/TestDimensionC3.xlsx"; using var stream = File.OpenRead(path); - var rows = _importer.QueryExcel(stream).ToList(); + var rows = _excelImporter.Query(stream).ToList(); var keys = ((IDictionary)rows.First()).Keys; Assert.Equal(3, keys.Count); Assert.Equal(2, rows.Count); @@ -533,11 +533,11 @@ public void SaveAsFileWithDimensionByICollection() new() { A = "A", B = "B" }, new() { A = "A", B = "B" } ]; - _exporter.ExportExcel(path, values); + _excelExporter.Export(path, values); using (var stream = File.OpenRead(path)) { - var rows = _importer.QueryExcel(stream, useHeaderRow: false).ToList(); + var rows = _excelImporter.Query(stream, useHeaderRow: false).ToList(); Assert.Equal(3, rows.Count); Assert.Equal("A", rows[0].A); Assert.Equal("A", rows[1].A); @@ -545,14 +545,14 @@ public void SaveAsFileWithDimensionByICollection() } using (var stream = File.OpenRead(path)) { - var rows = _importer.QueryExcel(stream, useHeaderRow: true).ToList(); + var rows = _excelImporter.Query(stream, useHeaderRow: true).ToList(); Assert.Equal(2, rows.Count); Assert.Equal("A", rows[0].A); Assert.Equal("A", rows[1].A); } Assert.Equal("A1:B3", SheetHelper.GetFirstSheetDimensionRefValue(path)); - _exporter.ExportExcel(path, values, false, overwriteFile: true); + _excelExporter.Export(path, values, false, overwriteFile: true); Assert.Equal("A1:B2", SheetHelper.GetFirstSheetDimensionRefValue(path)); } @@ -562,20 +562,20 @@ public void SaveAsFileWithDimensionByICollection() var path = file.ToString(); List values = []; - _exporter.ExportExcel(path, values, false); + _excelExporter.Export(path, values, false); { using (var stream = File.OpenRead(path)) { - var rows = _importer.QueryExcel(stream, useHeaderRow: false).ToList(); + var rows = _excelImporter.Query(stream, useHeaderRow: false).ToList(); Assert.Empty(rows); } Assert.Equal("A1:B1", SheetHelper.GetFirstSheetDimensionRefValue(path)); } - _exporter.ExportExcel(path, values, overwriteFile: true); + _excelExporter.Export(path, values, overwriteFile: true); { using var stream = File.OpenRead(path); - var rows = _importer.QueryExcel(stream, useHeaderRow: false).ToList(); + var rows = _excelImporter.Query(stream, useHeaderRow: false).ToList(); Assert.Single(rows); } Assert.Equal("A1:B1", SheetHelper.GetFirstSheetDimensionRefValue(path)); @@ -590,11 +590,11 @@ public void SaveAsFileWithDimensionByICollection() new {A="A",B="B"}, new {A="A",B="B"}, }; - _exporter.ExportExcel(path, values); + _excelExporter.Export(path, values); { using (var stream = File.OpenRead(path)) { - var rows = _importer.QueryExcel(stream, useHeaderRow: false).ToList(); + var rows = _excelImporter.Query(stream, useHeaderRow: false).ToList(); Assert.Equal(3, rows.Count); Assert.Equal("A", rows[0].A); Assert.Equal("A", rows[1].A); @@ -602,7 +602,7 @@ public void SaveAsFileWithDimensionByICollection() } using (var stream = File.OpenRead(path)) { - var rows = _importer.QueryExcel(stream, useHeaderRow: true).ToList(); + var rows = _excelImporter.Query(stream, useHeaderRow: true).ToList(); Assert.Equal(2, rows.Count); Assert.Equal("A", rows[0].A); Assert.Equal("A", rows[1].A); @@ -610,7 +610,7 @@ public void SaveAsFileWithDimensionByICollection() } Assert.Equal("A1:B3", SheetHelper.GetFirstSheetDimensionRefValue(path)); - _exporter.ExportExcel(path, values, false, overwriteFile: true); + _excelExporter.Export(path, values, false, overwriteFile: true); Assert.Equal("A1:B2", SheetHelper.GetFirstSheetDimensionRefValue(path)); } @@ -618,7 +618,7 @@ public void SaveAsFileWithDimensionByICollection() { using var path = AutoDeletingPath.Create(); var values = new List(); - Assert.Throws(() => _exporter.ExportExcel(path.ToString(), values)); + Assert.Throws(() => _excelExporter.Export(path.ToString(), values)); } } @@ -630,15 +630,15 @@ public void SaveAsFileWithDimension() var path = file.ToString(); var table = new DataTable(); - _exporter.ExportExcel(path, table); + _excelExporter.Export(path, table); Assert.Equal("A1", SheetHelper.GetFirstSheetDimensionRefValue(path)); { using var stream = File.OpenRead(path); - var rows = _importer.QueryExcel(stream).ToList(); + var rows = _excelImporter.Query(stream).ToList(); Assert.Single(rows); } - _exporter.ExportExcel(path, table, printHeader: false, overwriteFile: true); + _excelExporter.Export(path, table, printHeader: false, overwriteFile: true); Assert.Equal("A1", SheetHelper.GetFirstSheetDimensionRefValue(path)); } @@ -654,12 +654,12 @@ public void SaveAsFileWithDimension() table.Rows.Add(@"""<>+-*//}{\\n", 1234567890); table.Rows.Add("Hello World", -1234567890, false, DateTime.Now); - _exporter.ExportExcel(path, table); + _excelExporter.Export(path, table); Assert.Equal("A1:D3", SheetHelper.GetFirstSheetDimensionRefValue(path)); using (var stream = File.OpenRead(path)) { - var rows = _importer.QueryExcel(stream, useHeaderRow: true).ToList(); + var rows = _excelImporter.Query(stream, useHeaderRow: true).ToList(); Assert.Equal(2, rows.Count); Assert.Equal(@"""<>+-*//}{\\n", rows[0].a); Assert.Equal(1234567890, rows[0].b); @@ -669,7 +669,7 @@ public void SaveAsFileWithDimension() using (var stream = File.OpenRead(path)) { - var rows = _importer.QueryExcel(stream).ToList(); + var rows = _excelImporter.Query(stream).ToList(); Assert.Equal(3, rows.Count); Assert.Equal("a", rows[0].A); Assert.Equal("b", rows[0].B); @@ -677,7 +677,7 @@ public void SaveAsFileWithDimension() Assert.Equal("d", rows[0].D); } - _exporter.ExportExcel(path, table, printHeader: false, overwriteFile: true); + _excelExporter.Export(path, table, printHeader: false, overwriteFile: true); Assert.Equal("A1:D2", SheetHelper.GetFirstSheetDimensionRefValue(path)); } @@ -690,7 +690,7 @@ public void SaveAsFileWithDimension() table.Rows.Add("A"); table.Rows.Add("B"); - _exporter.ExportExcel(path.ToString(), table); + _excelExporter.Export(path.ToString(), table); Assert.Equal("A1:A3", SheetHelper.GetFirstSheetDimensionRefValue(path.ToString())); } } @@ -711,7 +711,7 @@ public void SaveAsByDataTableTest() table.Rows.Add(@"""<>+-*//}{\\n", 1234567890, true, now); table.Rows.Add("Hello World", -1234567890, false, now.Date); - _exporter.ExportExcel(path, table, sheetName: "R&D"); + _excelExporter.Export(path, table, sheetName: "R&D"); using var p = new ExcelPackage(new FileInfo(path)); var ws = p.Workbook.Worksheets.First(); @@ -736,7 +736,7 @@ public void SaveAsByDataTableTest() table.Rows.Add("MiniExcel", 1); table.Rows.Add("Github", 2); - _exporter.ExportExcel(path.ToString(), table); + _excelExporter.Export(path.ToString(), table); } } @@ -745,16 +745,16 @@ public void QueryByLINQExtensionsAvoidLargeFileOOMTest() { const string path = "../../../../../benchmarks/MiniExcel.Benchmarks/Test1,000,000x10.xlsx"; - var query1 = _importer.QueryExcel(path).First(); + var query1 = _excelImporter.Query(path).First(); Assert.Equal("HelloWorld1", query1.A); using (var stream = File.OpenRead(path)) { - var query2 = _importer.QueryExcel(stream).First(); + var query2 = _excelImporter.Query(stream).First(); Assert.Equal("HelloWorld1", query2.A); } - var query3 = _importer.QueryExcel(path).Take(10); + var query3 = _excelImporter.Query(path).Take(10); Assert.Equal(10, query3.Count()); } @@ -765,11 +765,11 @@ public void EmptyTest() using (var connection = Db.GetConnection("Data Source=:memory:")) { var rows = connection.Query("with cte as (select 1 id,2 val) select * from cte where 1=2"); - _exporter.ExportExcel(path.ToString(), rows); + _excelExporter.Export(path.ToString(), rows); } using (var stream = File.OpenRead(path.ToString())) { - var rows = _importer.QueryExcel(stream, useHeaderRow: true).ToList(); + var rows = _excelImporter.Query(stream, useHeaderRow: true).ToList(); Assert.Empty(rows); } } @@ -791,11 +791,11 @@ public void SaveAsByIEnumerableIDictionary() ["R&D"] = values, ["success!"] = values }; - _exporter.ExportExcel(path, sheets); + _excelExporter.Export(path, sheets); using (var stream = File.OpenRead(path)) { - var rows = _importer.QueryExcel(stream, useHeaderRow: false).ToList(); + var rows = _excelImporter.Query(stream, useHeaderRow: false).ToList(); Assert.Equal("Column1", rows[0].A); Assert.Equal("Column2", rows[0].B); Assert.Equal("MiniExcel", rows[1].A); @@ -803,12 +803,12 @@ public void SaveAsByIEnumerableIDictionary() Assert.Equal("Github", rows[2].A); Assert.Equal(2, rows[2].B); - Assert.Equal("R&D", _importer.GetSheetNames(stream)[0]); + Assert.Equal("R&D", _excelImporter.GetSheetNames(stream)[0]); } using (var stream = File.OpenRead(path)) { - var rows = _importer.QueryExcel(stream, useHeaderRow: true).ToList(); + var rows = _excelImporter.Query(stream, useHeaderRow: true).ToList(); Assert.Equal(2, rows.Count); Assert.Equal("MiniExcel", rows[0].Column1); @@ -816,7 +816,7 @@ public void SaveAsByIEnumerableIDictionary() Assert.Equal("Github", rows[1].Column1); Assert.Equal(2, rows[1].Column2); - Assert.Equal("success!", _importer.GetSheetNames(stream)[1]); + Assert.Equal("success!", _excelImporter.GetSheetNames(stream)[1]); } Assert.Equal("A1:B3", SheetHelper.GetFirstSheetDimensionRefValue(path)); @@ -828,11 +828,11 @@ public void SaveAsByIEnumerableIDictionary() new() { { 1, "MiniExcel"}, { 2, 1 } }, new() { { 1, "Github" }, { 2, 2 } }, }; - _exporter.ExportExcel(path, values, overwriteFile: true); + _excelExporter.Export(path, values, overwriteFile: true); using (var stream = File.OpenRead(path)) { - var rows = _importer.QueryExcel(stream, useHeaderRow: false).ToList(); + var rows = _excelImporter.Query(stream, useHeaderRow: false).ToList(); Assert.Equal(3, rows.Count); } @@ -851,7 +851,7 @@ public void SaveAsFrozenRowsAndColumnsTest() // Test enumerable using var path = AutoDeletingPath.Create(); - _exporter.ExportExcel( + _excelExporter.Export( path.ToString(), new[] { @@ -863,7 +863,7 @@ public void SaveAsFrozenRowsAndColumnsTest() using (var stream = File.OpenRead(path.ToString())) { - var rows = _importer.QueryExcel(stream, useHeaderRow: true).ToList(); + var rows = _excelImporter.Query(stream, useHeaderRow: true).ToList(); Assert.Equal("MiniExcel", rows[0].Column1); Assert.Equal(1, rows[0].Column2); @@ -883,14 +883,14 @@ public void SaveAsFrozenRowsAndColumnsTest() table.Rows.Add("Hello World", -1234567890, false, DateTime.Now.Date); using var pathTable = AutoDeletingPath.Create(); - _exporter.ExportExcel(pathTable.ToString(), table, configuration: config); + _excelExporter.Export(pathTable.ToString(), table, configuration: config); Assert.Equal("A1:D3", SheetHelper.GetFirstSheetDimensionRefValue(pathTable.ToString())); // data reader var reader = table.CreateDataReader(); using var pathReader = AutoDeletingPath.Create(); - _exporter.ExportExcel(pathReader.ToString(), reader, configuration: config, overwriteFile: true); + _excelExporter.Export(pathReader.ToString(), reader, configuration: config, overwriteFile: true); Assert.Equal("A1:D3", SheetHelper.GetFirstSheetDimensionRefValue(pathTable.ToString())); //TODO: fix datareader not writing ref dimension (also in async version) } @@ -904,14 +904,14 @@ public void SaveAsByDapperRows() using (var connection = Db.GetConnection("Data Source=:memory:")) { var rows = connection.Query("select 'MiniExcel' as Column1,1 as Column2 union all select 'Github',2"); - _exporter.ExportExcel(path, rows); + _excelExporter.Export(path, rows); } Assert.Equal("A1:B3", SheetHelper.GetFirstSheetDimensionRefValue(path)); using (var stream = File.OpenRead(path)) { - var rows = _importer.QueryExcel(stream, useHeaderRow: true).ToList(); + var rows = _excelImporter.Query(stream, useHeaderRow: true).ToList(); Assert.Equal("MiniExcel", rows[0].Column1); Assert.Equal(1, rows[0].Column2); @@ -923,18 +923,18 @@ public void SaveAsByDapperRows() using (var connection = Db.GetConnection("Data Source=:memory:")) { var rows = connection.Query("with cte as (select 'MiniExcel' as Column1,1 as Column2 union all select 'Github',2)select * from cte where 1=2").ToList(); - _exporter.ExportExcel(path, rows, overwriteFile: true); + _excelExporter.Export(path, rows, overwriteFile: true); } using (var stream = File.OpenRead(path)) { - var rows = _importer.QueryExcel(stream, useHeaderRow: false).ToList(); + var rows = _excelImporter.Query(stream, useHeaderRow: false).ToList(); Assert.Empty(rows); } using (var stream = File.OpenRead(path)) { - var rows = _importer.QueryExcel(stream, useHeaderRow: true).ToList(); + var rows = _excelImporter.Query(stream, useHeaderRow: true).ToList(); Assert.Empty(rows); } @@ -944,14 +944,14 @@ public void SaveAsByDapperRows() using (var connection = Db.GetConnection("Data Source=:memory:")) { var rows = connection.Query("select 'MiniExcel' as Column1,1 as Column2 union all select 'Github',2").ToList(); - _exporter.ExportExcel(path, rows, overwriteFile: true); + _excelExporter.Export(path, rows, overwriteFile: true); } Assert.Equal("A1:B3", SheetHelper.GetFirstSheetDimensionRefValue(path)); using (var stream = File.OpenRead(path)) { - var rows = _importer.QueryExcel(stream, useHeaderRow: false).ToList(); + var rows = _excelImporter.Query(stream, useHeaderRow: false).ToList(); Assert.Equal("Column1", rows[0].A); Assert.Equal("Column2", rows[0].B); @@ -963,7 +963,7 @@ public void SaveAsByDapperRows() using (var stream = File.OpenRead(path)) { - var rows = _importer.QueryExcel(stream, useHeaderRow: true).ToList(); + var rows = _excelImporter.Query(stream, useHeaderRow: true).ToList(); Assert.Equal("MiniExcel", rows[0].Column1); Assert.Equal(1, rows[0].Column2); @@ -986,10 +986,10 @@ public void QueryByStrongTypeParameterTest() new() { Column1 = "MiniExcel", Column2 = 1 }, new() { Column1 = "Github", Column2 = 2 } ]; - _exporter.ExportExcel(path.ToString(), values); + _excelExporter.Export(path.ToString(), values); using var stream = File.OpenRead(path.ToString()); - var rows = _importer.QueryExcel(stream, useHeaderRow: true).ToList(); + var rows = _excelImporter.Query(stream, useHeaderRow: true).ToList(); Assert.Equal("MiniExcel", rows[0].Column1); Assert.Equal(1, rows[0].Column2); @@ -1006,10 +1006,10 @@ public void QueryByDictionaryStringAndObjectParameterTest() new() { { "Column1", "MiniExcel" }, { "Column2", 1 } }, new() { { "Column1", "Github" }, { "Column2", 2 } } ]; - _exporter.ExportExcel(path.ToString(), values); + _excelExporter.Export(path.ToString(), values); using var stream = File.OpenRead(path.ToString()); - var rows = _importer.QueryExcel(stream, useHeaderRow: true).ToList(); + var rows = _excelImporter.Query(stream, useHeaderRow: true).ToList(); Assert.Equal("MiniExcel", rows[0].Column1); Assert.Equal(1, rows[0].Column2); @@ -1036,7 +1036,7 @@ public void SQLiteInsertTest() using (var transaction = connection.BeginTransaction()) using (var stream = File.OpenRead(path)) { - var rows = _importer.QueryExcel(stream); + var rows = _excelImporter.Query(stream); foreach (var row in rows) { _ = connection.Execute("insert into T (A,B) values (@A,@B)", new { row.A, row.B }, transaction: transaction); @@ -1058,7 +1058,7 @@ public void SaveAsBasicCreateTest() { using var path = AutoDeletingPath.Create(); - var rowsWritten = _exporter.ExportExcel(path.ToString(), new[] + var rowsWritten = _excelExporter.Export(path.ToString(), new[] { new { Column1 = "MiniExcel", Column2 = 1 }, new { Column1 = "Github", Column2 = 2} @@ -1069,7 +1069,7 @@ public void SaveAsBasicCreateTest() using (var stream = File.OpenRead(path.ToString())) { - var rows = _importer.QueryExcel(stream, useHeaderRow: true).ToList(); + var rows = _excelImporter.Query(stream, useHeaderRow: true).ToList(); Assert.Equal("MiniExcel", rows[0].Column1); Assert.Equal(1, rows[0].Column2); @@ -1092,14 +1092,14 @@ public void SaveAsBasicStreamTest() }; using (var stream = new FileStream(path.ToString(), FileMode.CreateNew)) { - var rowsWritten = _exporter.ExportExcel(stream, values); + var rowsWritten = _excelExporter.Export(stream, values); Assert.Single(rowsWritten); Assert.Equal(2, rowsWritten[0]); } using (var stream = File.OpenRead(path.ToString())) { - var rows = _importer.QueryExcel(stream, useHeaderRow: true).ToList(); + var rows = _excelImporter.Query(stream, useHeaderRow: true).ToList(); Assert.Equal("MiniExcel", rows[0].Column1); Assert.Equal(1, rows[0].Column2); @@ -1117,7 +1117,7 @@ public void SaveAsBasicStreamTest() using (var stream = new MemoryStream()) using (var fileStream = new FileStream(path.ToString(), FileMode.Create)) { - var rowsWritten = _exporter.ExportExcel(stream, values); + var rowsWritten = _excelExporter.Export(stream, values); stream.Seek(0, SeekOrigin.Begin); stream.CopyTo(fileStream); Assert.Single(rowsWritten); @@ -1126,7 +1126,7 @@ public void SaveAsBasicStreamTest() using (var stream = File.OpenRead(path.ToString())) { - var rows = _importer.QueryExcel(stream, useHeaderRow: true).ToList(); + var rows = _excelImporter.Query(stream, useHeaderRow: true).ToList(); Assert.Equal("MiniExcel", rows[0].Column1); Assert.Equal(1, rows[0].Column2); @@ -1140,7 +1140,7 @@ public void SaveAsBasicStreamTest() public void SaveAsSpecialAndTypeCreateTest() { using var path = AutoDeletingPath.Create(); - var rowsWritten = _exporter.ExportExcel(path.ToString(), new[] + var rowsWritten = _excelExporter.Export(path.ToString(), new[] { new { a = @"""<>+-*//}{\\n", b = 1234567890, c = true, d = DateTime.Now }, new { a = "Hello World", b = -1234567890, c = false, d = DateTime.Now.Date } @@ -1157,7 +1157,7 @@ public void SaveAsFileEpplusCanReadTest() { var now = DateTime.Now; using var path = AutoDeletingPath.Create(); - var rowsWritten = _exporter.ExportExcel(path.ToString(), new[] + var rowsWritten = _excelExporter.Export(path.ToString(), new[] { new { a = @"""<>+-*//}{\\n", b = 1234567890, c = true, d = now}, new { a = "Hello World", b = -1234567890, c = false, d = now.Date } @@ -1184,7 +1184,7 @@ public void SavaAsClosedXmlCanReadTest() { var now = DateTime.Now; using var path = AutoDeletingPath.Create(); - var rowsWritten = _exporter.ExportExcel(path.ToString(), new[] + var rowsWritten = _excelExporter.Export(path.ToString(), new[] { new { a = @"""<>+-*//}{\\n", b = 1234567890, c = true, d = now }, new { a = "Hello World", b = -1234567890, c = false, d = now.Date } @@ -1214,7 +1214,7 @@ public void ContentTypeUriContentTypeReadCheckTest() { var now = DateTime.Now; using var path = AutoDeletingPath.Create(); - var rowsWritten = _exporter.ExportExcel(path.ToString(), new[] + var rowsWritten = _excelExporter.Export(path.ToString(), new[] { new { a = @"""<>+-*//}{\\n", b = 1234567890, c = true, d= now }, new { a = "Hello World", b = -1234567890, c = false, d = now.Date } @@ -1238,10 +1238,10 @@ public void ContentTypeUriContentTypeReadCheckTest() public void TestStirctOpenXml() { const string path = "../../../../../samples/xlsx/TestStrictOpenXml.xlsx"; - var columns = _importer.GetExcelColumns (path); + var columns = _excelImporter.GetColumnNames (path); Assert.Equal(["A", "B", "C"], columns); - var rows = _importer.QueryExcel(path).ToList(); + var rows = _excelImporter.Query(path).ToList(); Assert.Equal(rows[0].A, "title1"); Assert.Equal(rows[0].B, "title2"); Assert.Equal(rows[0].C, "title3"); @@ -1256,7 +1256,7 @@ public void SharedStringCacheTest() const string path = "../../../../../benchmarks/MiniExcel.Benchmarks/Test1,000,000x10_SharingStrings.xlsx"; var ts = Stopwatch.GetTimestamp(); - _ = _importer.QueryExcel(path, configuration: new OpenXmlConfiguration { EnableSharedStringCache = true }).First(); + _ = _excelImporter.Query(path, configuration: new OpenXmlConfiguration { EnableSharedStringCache = true }).First(); using var currentProcess = Process.GetCurrentProcess(); var totalBytesOfMemoryUsed = currentProcess.WorkingSet64; @@ -1270,7 +1270,7 @@ public void SharedStringNoCacheTest() const string path = "../../../../../benchmarks/MiniExcel.Benchmarks/Test1,000,000x10_SharingStrings.xlsx"; var ts = Stopwatch.GetTimestamp(); - _ = _importer.QueryExcel(path).First(); + _ = _excelImporter.Query(path).First(); using var currentProcess = Process.GetCurrentProcess(); var totalBytesOfMemoryUsed = currentProcess.WorkingSet64; _output.WriteLine("totalBytesOfMemoryUsed: " + totalBytesOfMemoryUsed); @@ -1318,10 +1318,10 @@ public void DynamicColumnsConfigurationIsUsedWhenCreatingExcelUsingIDataReader() ] }; var reader = table.CreateDataReader(); - _exporter.ExportExcel(path.ToString(), reader, configuration: configuration); + _excelExporter.Export(path.ToString(), reader, configuration: configuration); using var stream = File.OpenRead(path.ToString()); - var rows = _importer.QueryExcel(stream, useHeaderRow: true) + var rows = _excelImporter.Query(stream, useHeaderRow: true) .Select(x => (IDictionary)x) .ToList(); @@ -1384,10 +1384,10 @@ public void DynamicColumnsConfigurationIsUsedWhenCreatingExcelUsingDataTable() } ] }; - _exporter.ExportExcel(path.ToString(), table, configuration: configuration); + _excelExporter.Export(path.ToString(), table, configuration: configuration); using var stream = File.OpenRead(path.ToString()); - var rows = _importer.QueryExcel(stream, useHeaderRow: true) + var rows = _excelImporter.Query(stream, useHeaderRow: true) .Select(x => (IDictionary)x) .Select(x => (IDictionary)x) .ToList(); @@ -1428,7 +1428,7 @@ public void InsertSheetTest() table.Rows.Add(@"""<>+-*//}{\\n", 1234567890, true, now); table.Rows.Add("Hello World", -1234567890, false, now.Date); - var rowsWritten = _exporter.InsertExcelSheet(path, table, sheetName: "Sheet1"); + var rowsWritten = _excelExporter.InsertSheet(path, table, sheetName: "Sheet1"); Assert.Equal(2, rowsWritten); using var p = new ExcelPackage(new FileInfo(path)); @@ -1453,7 +1453,7 @@ public void InsertSheetTest() table.Rows.Add("MiniExcel", 1); table.Rows.Add("Github", 2); - var rowsWritten = _exporter.InsertExcelSheet(path, table, sheetName: "Sheet2"); + var rowsWritten = _excelExporter.InsertSheet(path, table, sheetName: "Sheet2"); Assert.Equal(2, rowsWritten); using var p = new ExcelPackage(new FileInfo(path)); @@ -1476,7 +1476,7 @@ public void InsertSheetTest() table.Columns.Add("Column2", typeof(DateTime)); table.Rows.Add("Test", now); - var rowsWritten = _exporter.InsertExcelSheet(path, table, sheetName: "Sheet2", printHeader: false, configuration: new OpenXmlConfiguration + var rowsWritten = _excelExporter.InsertSheet(path, table, sheetName: "Sheet2", printHeader: false, configuration: new OpenXmlConfiguration { FastMode = true, AutoFilter = false, @@ -1509,7 +1509,7 @@ public void InsertSheetTest() table.Rows.Add("MiniExcel", now); table.Rows.Add("Github", now); - var rowsWritten = _exporter.InsertExcelSheet(path, table, sheetName: "Sheet3", configuration: new OpenXmlConfiguration + var rowsWritten = _excelExporter.InsertSheet(path, table, sheetName: "Sheet3", configuration: new OpenXmlConfiguration { FastMode = true, AutoFilter = false, @@ -1552,7 +1552,7 @@ private class DateOnlyTest [Fact] public void DateOnlySupportTest() { - var query = _importer.QueryExcel(PathHelper.GetFile("xlsx/TestDateOnlyMapping.xlsx")).ToList(); + var query = _excelImporter.Query(PathHelper.GetFile("xlsx/TestDateOnlyMapping.xlsx")).ToList(); Assert.Equal(new DateOnly(2020, 9, 27), query[0].Date); Assert.Equal(new DateOnly(2020, 10, 25), query[1].Date); @@ -1567,7 +1567,7 @@ public void DateOnlySupportTest() public void SheetDimensionsTest() { var path1 = PathHelper.GetFile("xlsx/TestTypeMapping.xlsx"); - var dim1 = _importer.GetSheetDimensions(path1); + var dim1 = _excelImporter.GetSheetDimensions(path1); Assert.Equal("A1", dim1[0].StartCell); Assert.Equal("H101", dim1[0].EndCell); Assert.Equal(101, dim1[0].Rows.Count); @@ -1578,7 +1578,7 @@ public void SheetDimensionsTest() Assert.Equal(8, dim1[0].Columns.EndIndex); var path2 = PathHelper.GetFile("xlsx/TestNoDimension.xlsx"); - var dim2 = _importer.GetSheetDimensions(path2); + var dim2 = _excelImporter.GetSheetDimensions(path2); Assert.Equal(101, dim2[0].Rows.Count); Assert.Equal(7, dim2[0].Columns.Count); Assert.Equal(1, dim2[0].Rows.StartIndex); @@ -1591,7 +1591,7 @@ public void SheetDimensionsTest() public void SheetDimensionsTest_MultiSheet() { var path = PathHelper.GetFile("xlsx/TestMultiSheet.xlsx"); - var dim = _importer.GetSheetDimensions(path); + var dim = _excelImporter.GetSheetDimensions(path); Assert.Equal("A1", dim[0].StartCell); Assert.Equal("D12", dim[0].EndCell); diff --git a/tests/MiniExcel.Tests/SaveByTemplate/MiniExcelTemplateAsyncTests.cs b/tests/MiniExcel.Tests/SaveByTemplate/MiniExcelTemplateAsyncTests.cs index 7076c43c..3f413965 100644 --- a/tests/MiniExcel.Tests/SaveByTemplate/MiniExcelTemplateAsyncTests.cs +++ b/tests/MiniExcel.Tests/SaveByTemplate/MiniExcelTemplateAsyncTests.cs @@ -4,8 +4,8 @@ namespace MiniExcelLib.Tests.SaveByTemplate; public class MiniExcelTemplateAsyncTests { - private readonly OpenXmlImporter _importer = MiniExcel.Importer.GetExcelImporter(); - private readonly OpenXmlTemplater _templater = MiniExcel.Templater.GetExcelTemplater(); + private readonly OpenXmlImporter _excelImporter = MiniExcel.Importer.GetExcelImporter(); + private readonly OpenXmlTemplater _excelTemplater = MiniExcel.Templater.GetExcelTemplater(); [Fact] public async Task DatatableTemptyRowTest() @@ -29,8 +29,8 @@ public async Task DatatableTemptyRowTest() ["managers"] = managers, ["employees"] = employees }; - await _templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); - var rows = _importer.QueryExcelAsync(path.ToString()).ToBlockingEnumerable().ToList(); + await _excelTemplater.ApplyTemplateAsync(path.ToString(), templatePath, value); + var rows = _excelImporter.QueryAsync(path.ToString()).ToBlockingEnumerable().ToList(); var dimension = SheetHelper.GetFirstSheetDimensionRefValue(path.ToString()); Assert.Equal("A1:C5", dimension); @@ -54,8 +54,8 @@ public async Task DatatableTemptyRowTest() ["employees"] = employees }; - await _templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); - var rows = _importer.QueryExcelAsync(path.ToString()).ToBlockingEnumerable().ToList(); + await _excelTemplater.ApplyTemplateAsync(path.ToString(), templatePath, value); + var rows = _excelImporter.QueryAsync(path.ToString()).ToBlockingEnumerable().ToList(); var dimension = SheetHelper.GetFirstSheetDimensionRefValue(path.ToString()); Assert.Equal("A1:C5", dimension); @@ -88,8 +88,8 @@ public async Task DatatableTest() ["managers"] = managers, ["employees"] = employees }; - await _templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); - var rows = _importer.QueryExcelAsync(path.ToString()).ToBlockingEnumerable().ToList(); + await _excelTemplater.ApplyTemplateAsync(path.ToString(), templatePath, value); + var rows = _excelImporter.QueryAsync(path.ToString()).ToBlockingEnumerable().ToList(); var dimension = SheetHelper.GetFirstSheetDimensionRefValue(path.ToString()); Assert.Equal("A1:C9", dimension); @@ -112,7 +112,7 @@ public async Task DatatableTest() Assert.Equal("IT", rows[8].C); { - rows = _importer.QueryExcelAsync(path.ToString(), sheetName: "Sheet2").ToBlockingEnumerable().ToList(); + rows = _excelImporter.QueryAsync(path.ToString(), sheetName: "Sheet2").ToBlockingEnumerable().ToList(); Assert.Equal(9, rows.Count); Assert.Equal("FooCompany", rows[0].A); @@ -149,10 +149,10 @@ public async Task DapperTemplateTest() ["managers"] = connection.Query("select 'Jack' name,'HR' department union all select 'Loan','IT'"), ["employees"] = connection.Query(@"select 'Wade' name,'HR' department union all select 'Felix','HR' union all select 'Eric','IT' union all select 'Keaton','IT'") }; - await _templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); + await _excelTemplater.ApplyTemplateAsync(path.ToString(), templatePath, value); { - var rows = _importer.QueryExcelAsync(path.ToString()).ToBlockingEnumerable().ToList(); + var rows = _excelImporter.QueryAsync(path.ToString()).ToBlockingEnumerable().ToList(); Assert.Equal(9, rows.Count); @@ -177,7 +177,7 @@ public async Task DapperTemplateTest() } { - var rows = _importer.QueryExcelAsync(path.ToString(), sheetName: "Sheet2").ToBlockingEnumerable().ToList(); + var rows = _excelImporter.QueryAsync(path.ToString(), sheetName: "Sheet2").ToBlockingEnumerable().ToList(); Assert.Equal(9, rows.Count); Assert.Equal("FooCompany", rows[0].A); @@ -223,10 +223,10 @@ public async Task DictionaryTemplateTest() new Dictionary{["name"]="Keaton",["department"]="IT"} } }; - await _templater.ApplyXlsxTemplateAsync(path, templatePath, value); + await _excelTemplater.ApplyTemplateAsync(path, templatePath, value); { - var rows = _importer.QueryExcel(path).ToList(); + var rows = _excelImporter.Query(path).ToList(); Assert.Equal(9, rows.Count); @@ -251,7 +251,7 @@ public async Task DictionaryTemplateTest() } { - var rows = _importer.QueryExcel(path, sheetName: "Sheet2").ToList(); + var rows = _excelImporter.Query(path, sheetName: "Sheet2").ToList(); Assert.Equal(9, rows.Count); @@ -294,9 +294,9 @@ public async Task TestGithubProject() Projects = projects, TotalStar = projects.Sum(s => s.Star) }; - await _templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); + await _excelTemplater.ApplyTemplateAsync(path.ToString(), templatePath, value); - var rows = _importer.QueryExcelAsync(path.ToString()).ToBlockingEnumerable().ToList(); + var rows = _excelImporter.QueryAsync(path.ToString()).ToBlockingEnumerable().ToList(); Assert.Equal("ITWeiHan Github Projects", rows[0].B); Assert.Equal("Total Star : 178", rows[8].C); @@ -342,9 +342,9 @@ public async Task TestIEnumerableType() poco } }; - await _templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); + await _excelTemplater.ApplyTemplateAsync(path.ToString(), templatePath, value); - var rows = _importer.QueryExcel(path.ToString()).ToList(); + var rows = _excelImporter.Query(path.ToString()).ToList(); Assert.Equal(poco.@string, rows[0].@string); Assert.Equal(poco.@int, rows[0].@int); Assert.Equal(poco.@double, rows[0].@double); @@ -407,9 +407,9 @@ public async Task TestTemplateTypeMapping() @bool = true, Guid = Guid.NewGuid() }; - await _templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); + await _excelTemplater.ApplyTemplateAsync(path.ToString(), templatePath, value); - var rows = _importer.QueryExcel(path.ToString()).ToList(); + var rows = _excelImporter.Query(path.ToString()).ToList(); Assert.Equal(value.@string, rows[0].@string); Assert.Equal(value.@int, rows[0].@int); Assert.Equal(value.@double, rows[0].@double); @@ -431,7 +431,7 @@ public async Task TemplateCenterEmptyTest() { Tests = Enumerable.Range(1, 5).Select(i => new { test1 = i, test2 = i }) }; - await _templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); + await _excelTemplater.ApplyTemplateAsync(path.ToString(), templatePath, value); } [Fact] @@ -449,9 +449,9 @@ public async Task TemplateAsyncBasiTest() VIP = true, Points = 123 }; - await _templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); + await _excelTemplater.ApplyTemplateAsync(path.ToString(), templatePath, value); - var rows = _importer.QueryExcelAsync(path.ToString()).ToBlockingEnumerable().ToList(); + var rows = _excelImporter.QueryAsync(path.ToString()).ToBlockingEnumerable().ToList(); Assert.Equal("Jack", rows[1].A); Assert.Equal("2021-01-01 00:00:00", rows[1].B); Assert.Equal(true, rows[1].C); @@ -473,9 +473,9 @@ public async Task TemplateAsyncBasiTest() VIP = true, Points = 123 }; - await _templater.ApplyXlsxTemplateAsync(path, templateBytes, value); + await _excelTemplater.ApplyTemplateAsync(path, templateBytes, value); - var rows = (_importer.QueryExcelAsync(path).ToBlockingEnumerable()).ToList(); + var rows = (_excelImporter.QueryAsync(path).ToBlockingEnumerable()).ToList(); Assert.Equal("Jack", rows[1].A); Assert.Equal("2021-01-01 00:00:00", rows[1].B); Assert.Equal(true, rows[1].C); @@ -500,10 +500,10 @@ public async Task TemplateAsyncBasiTest() }; await using (var stream = File.Create(path.ToString())) { - await _templater.ApplyXlsxTemplateAsync(stream, templateBytes, value); + await _excelTemplater.ApplyTemplateAsync(stream, templateBytes, value); } - var rows = _importer.QueryExcelAsync(path.ToString()).ToBlockingEnumerable().ToList(); + var rows = _excelImporter.QueryAsync(path.ToString()).ToBlockingEnumerable().ToList(); Assert.Equal("Jack", rows[1].A); Assert.Equal("2021-01-01 00:00:00", rows[1].B); Assert.Equal(true, rows[1].C); @@ -525,9 +525,9 @@ public async Task TemplateAsyncBasiTest() ["VIP"] = true, ["Points"] = 123 }; - await _templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); + await _excelTemplater.ApplyTemplateAsync(path.ToString(), templatePath, value); - var rows = _importer.QueryExcelAsync(path.ToString()).ToBlockingEnumerable().ToList(); + var rows = _excelImporter.QueryAsync(path.ToString()).ToBlockingEnumerable().ToList(); Assert.Equal("Jack", rows[1].A); Assert.Equal("2021-01-01 00:00:00", rows[1].B); Assert.Equal(true, rows[1].C); @@ -559,7 +559,7 @@ public async Task TestIEnumerable() new { name = "Loan", department = "IT "} } }; - await _templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); + await _excelTemplater.ApplyTemplateAsync(path.ToString(), templatePath, value); var dimension = SheetHelper.GetFirstSheetDimensionRefValue(path.ToString()); Assert.Equal("A1:B7", dimension); @@ -581,7 +581,7 @@ public async Task TestIEnumerable() new { name = "Loan", department = "IT "} } }; - await _templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); + await _excelTemplater.ApplyTemplateAsync(path.ToString(), templatePath, value); var dimension = SheetHelper.GetFirstSheetDimensionRefValue(path.ToString()); Assert.Equal("A1:B7", dimension); @@ -606,7 +606,7 @@ public async Task TestIEnumerable() { ["employees"] = dt }; - await _templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); + await _excelTemplater.ApplyTemplateAsync(path.ToString(), templatePath, value); var dimension = SheetHelper.GetFirstSheetDimensionRefValue(path.ToString()); Assert.Equal("A1:B7", dimension); @@ -633,7 +633,7 @@ public async Task TestIEnumerableGrouped() new { name = "Loan", department = "IT" } } }; - await _templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); + await _excelTemplater.ApplyTemplateAsync(path.ToString(), templatePath, value); var dimension = SheetHelper.GetFirstSheetDimensionRefValue(path.ToString()); Assert.Equal("A1:B18", dimension); @@ -655,7 +655,7 @@ public async Task TestIEnumerableGrouped() new { name = "Loan", department = "IT "} } }; - await _templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); + await _excelTemplater.ApplyTemplateAsync(path.ToString(), templatePath, value); var dimension = SheetHelper.GetFirstSheetDimensionRefValue(path.ToString()); Assert.Equal("A1:B18", dimension); @@ -680,7 +680,7 @@ public async Task TestIEnumerableGrouped() { ["employees"] = dt }; - await _templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); + await _excelTemplater.ApplyTemplateAsync(path.ToString(), templatePath, value); var dimension = SheetHelper.GetFirstSheetDimensionRefValue(path.ToString()); Assert.Equal("A1:B18", dimension); @@ -707,7 +707,7 @@ public async Task TestIEnumerableConditional() new { name = "Loan", department = "IT "} } }; - await _templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); + await _excelTemplater.ApplyTemplateAsync(path.ToString(), templatePath, value); var dimension = SheetHelper.GetFirstSheetDimensionRefValue(path.ToString()); Assert.Equal("A1:B18", dimension); @@ -729,7 +729,7 @@ public async Task TestIEnumerableConditional() new { name = "Loan", department = "IT" } } }; - await _templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); + await _excelTemplater.ApplyTemplateAsync(path.ToString(), templatePath, value); var dimension = SheetHelper.GetFirstSheetDimensionRefValue(path.ToString()); Assert.Equal("A1:B18", dimension); @@ -754,7 +754,7 @@ public async Task TestIEnumerableConditional() { ["employees"] = dt }; - await _templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); + await _excelTemplater.ApplyTemplateAsync(path.ToString(), templatePath, value); var dimension = SheetHelper.GetFirstSheetDimensionRefValue(path.ToString()); Assert.Equal("A1:B18", dimension); @@ -785,10 +785,10 @@ public async Task TemplateTest() new { name = "Keaton", department = "IT" } } }; - await _templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); + await _excelTemplater.ApplyTemplateAsync(path.ToString(), templatePath, value); { - var rows = _importer.QueryExcelAsync(path.ToString()).ToBlockingEnumerable().ToList(); + var rows = _excelImporter.QueryAsync(path.ToString()).ToBlockingEnumerable().ToList(); Assert.Equal(9, rows.Count); Assert.Equal("FooCompany", rows[0].A); @@ -812,7 +812,7 @@ public async Task TemplateTest() } { - var rows = _importer.QueryExcelAsync(path.ToString(), sheetName: "Sheet2").ToBlockingEnumerable().ToList(); + var rows = _excelImporter.QueryAsync(path.ToString(), sheetName: "Sheet2").ToBlockingEnumerable().ToList(); Assert.Equal(9, rows.Count); Assert.Equal("FooCompany", rows[0].A); @@ -856,9 +856,9 @@ public async Task TemplateTest() new { name = "Keaton", department = "IT" } } }; - await _templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value); + await _excelTemplater.ApplyTemplateAsync(path.ToString(), templatePath, value); - var rows = _importer.QueryExcelAsync(path.ToString()).ToBlockingEnumerable().ToList(); + var rows = _excelImporter.QueryAsync(path.ToString()).ToBlockingEnumerable().ToList(); Assert.Equal("FooCompany", rows[0].A); Assert.Equal("Jack", rows[2].B); Assert.Equal("HR", rows[2].C); @@ -898,7 +898,7 @@ await Assert.ThrowsAsync(async () => }; await cts.CancelAsync(); - await _templater.ApplyXlsxTemplateAsync(path.ToString(), templatePath, value, cancellationToken: cts.Token); + await _excelTemplater.ApplyTemplateAsync(path.ToString(), templatePath, value, cancellationToken: cts.Token); }); } } \ No newline at end of file diff --git a/tests/MiniExcel.Tests/SaveByTemplate/MiniExcelTemplateTests.cs b/tests/MiniExcel.Tests/SaveByTemplate/MiniExcelTemplateTests.cs index 4a7db8ab..10d3b086 100644 --- a/tests/MiniExcel.Tests/SaveByTemplate/MiniExcelTemplateTests.cs +++ b/tests/MiniExcel.Tests/SaveByTemplate/MiniExcelTemplateTests.cs @@ -7,9 +7,9 @@ namespace MiniExcelLib.Tests.SaveByTemplate; public class MiniExcelTemplateTests { - private readonly OpenXmlImporter _importer = MiniExcel.Importer.GetExcelImporter(); - private readonly OpenXmlExporter _exporter = MiniExcel.Exporter.GetExcelExporter(); - private readonly OpenXmlTemplater _templater = MiniExcel.Templater.GetExcelTemplater(); + private readonly OpenXmlImporter _excelImporter = MiniExcel.Importer.GetExcelImporter(); + private readonly OpenXmlExporter _excelExporter = MiniExcel.Exporter.GetExcelExporter(); + private readonly OpenXmlTemplater _excelTemplater = MiniExcel.Templater.GetExcelTemplater(); [Fact] public void TestImageType() @@ -58,7 +58,7 @@ public void TestImageType() }; // Act - _exporter.AddExcelPicture(path.ToString(), pictures); + _excelExporter.AddPicture(path.ToString(), pictures); // Assert using var zip = ZipFile.OpenRead(path.FilePath); @@ -115,9 +115,9 @@ public void DatatableTemptyRowTest() ["managers"] = managers, ["employees"] = employees }; - _templater.ApplyXlsxTemplate(path.ToString(), templatePath, value); + _excelTemplater.ApplyTemplate(path.ToString(), templatePath, value); - var rows = _importer.QueryExcel(path.ToString()).ToList(); + var rows = _excelImporter.Query(path.ToString()).ToList(); var dimension = SheetHelper.GetFirstSheetDimensionRefValue(path.ToString()); Assert.Equal("A1:C5", dimension); } @@ -140,9 +140,9 @@ public void DatatableTemptyRowTest() ["managers"] = managers, ["employees"] = employees }; - _templater.ApplyXlsxTemplate(path.ToString(), templatePath, value); + _excelTemplater.ApplyTemplate(path.ToString(), templatePath, value); - var rows = _importer.QueryExcel(path.ToString()).ToList(); + var rows = _excelImporter.Query(path.ToString()).ToList(); var dimension = SheetHelper.GetFirstSheetDimensionRefValue(path.ToString()); Assert.Equal("A1:C5", dimension); } @@ -175,10 +175,10 @@ public void DatatableTest() ["managers"] = managers, ["employees"] = employees }; - _templater.ApplyXlsxTemplate(path, templatePath, value); + _excelTemplater.ApplyTemplate(path, templatePath, value); { - var rows = _importer.QueryExcel(path).ToList(); + var rows = _excelImporter.Query(path).ToList(); var dimension = SheetHelper.GetFirstSheetDimensionRefValue(path); Assert.Equal("A1:C9", dimension); @@ -203,7 +203,7 @@ public void DatatableTest() } { - var rows = _importer.QueryExcel(path, sheetName: "Sheet2").ToList(); + var rows = _excelImporter.Query(path, sheetName: "Sheet2").ToList(); Assert.Equal(9, rows.Count); Assert.Equal("FooCompany", rows[0].A); @@ -242,10 +242,10 @@ public void DapperTemplateTest() ["managers"] = connection.Query("select 'Jack' name,'HR' department union all select 'Loan','IT'"), ["employees"] = connection.Query("select 'Wade' name,'HR' department union all select 'Felix','HR' union all select 'Eric','IT' union all select 'Keaton','IT'") }; - _templater.ApplyXlsxTemplate(path, templatePath, value); + _excelTemplater.ApplyTemplate(path, templatePath, value); { - var rows = _importer.QueryExcel(path).ToList(); + var rows = _excelImporter.Query(path).ToList(); Assert.Equal(9, rows.Count); Assert.Equal("FooCompany", rows[0].A); @@ -269,7 +269,7 @@ public void DapperTemplateTest() } { - var rows = _importer.QueryExcel(path, sheetName: "Sheet2").ToList(); + var rows = _excelImporter.Query(path, sheetName: "Sheet2").ToList(); Assert.Equal(9, rows.Count); Assert.Equal("FooCompany", rows[0].A); @@ -317,10 +317,10 @@ public void DictionaryTemplateTest() new Dictionary { ["name"] = "Keaton", ["department"] = "IT" } } }; - _templater.ApplyXlsxTemplate(path, templatePath, value); + _excelTemplater.ApplyTemplate(path, templatePath, value); { - var rows = _importer.QueryExcel(path).ToList(); + var rows = _excelImporter.Query(path).ToList(); Assert.Equal(9, rows.Count); Assert.Equal("FooCompany", rows[0].A); @@ -344,7 +344,7 @@ public void DictionaryTemplateTest() } { - var rows = _importer.QueryExcel(path, sheetName: "Sheet2").ToList(); + var rows = _excelImporter.Query(path, sheetName: "Sheet2").ToList(); Assert.Equal(9, rows.Count); Assert.Equal("FooCompany", rows[0].A); @@ -394,9 +394,9 @@ public void GroupTemplateTest() new() { name = "Felix", department = "HR" } } }; - _templater.ApplyXlsxTemplate(path, templatePath, value); + _excelTemplater.ApplyTemplate(path, templatePath, value); - var rows = _importer.QueryExcel(path).ToList(); + var rows = _excelImporter.Query(path).ToList(); Assert.Equal(16, rows.Count); Assert.Equal("Jack", rows[1].A); @@ -463,9 +463,9 @@ public void TestGithubProject() Projects = projects, TotalStar = projects.Sum(s => s.Star) }; - _templater.ApplyXlsxTemplate(path.ToString(), templatePath, value); + _excelTemplater.ApplyTemplate(path.ToString(), templatePath, value); - var rows = _importer.QueryExcel(path.ToString()).ToList(); + var rows = _excelImporter.Query(path.ToString()).ToList(); Assert.Equal("ITWeiHan Github Projects", rows[0].B); Assert.Equal("Total Star : 178", rows[8].C); @@ -514,9 +514,9 @@ public void TestIEnumerableType() poco } }; - _templater.ApplyXlsxTemplate(path.ToString(), templatePath, value); + _excelTemplater.ApplyTemplate(path.ToString(), templatePath, value); - var rows = _importer.QueryExcel(path.ToString()).ToList(); + var rows = _excelImporter.Query(path.ToString()).ToList(); Assert.Equal(poco.@string, rows[0].@string); Assert.Equal(poco.@int, rows[0].@int); Assert.Equal(poco.@double, rows[0].@double); @@ -582,9 +582,9 @@ public void TestTemplateTypeMapping() @bool = true, Guid = Guid.NewGuid() }; - _templater.ApplyXlsxTemplate(path.ToString(), templatePath, value); + _excelTemplater.ApplyTemplate(path.ToString(), templatePath, value); - var rows = _importer.QueryExcel(path.ToString()).ToList(); + var rows = _excelImporter.Query(path.ToString()).ToList(); Assert.Equal(value.@string, rows[0].@string); Assert.Equal(value.@int, rows[0].@int); Assert.Equal(value.@double, rows[0].@double); @@ -607,7 +607,7 @@ public void TemplateCenterEmptyTest() { Tests = Enumerable.Range(1, 5).Select(i => new { test1 = i, test2 = i }) }; - _templater.ApplyXlsxTemplate(path.ToString(), templatePath, value); + _excelTemplater.ApplyTemplate(path.ToString(), templatePath, value); } [Fact] @@ -625,9 +625,9 @@ public void TemplateBasicTest() VIP = true, Points = 123 }; - _templater.ApplyXlsxTemplate(path.ToString(), templatePath, value); + _excelTemplater.ApplyTemplate(path.ToString(), templatePath, value); - var rows = _importer.QueryExcel(path.ToString()).ToList(); + var rows = _excelImporter.Query(path.ToString()).ToList(); Assert.Equal("Jack", rows[1].A); Assert.Equal("2021-01-01 00:00:00", rows[1].B); Assert.Equal(true, rows[1].C); @@ -649,9 +649,9 @@ public void TemplateBasicTest() VIP = true, Points = 123 }; - _templater.ApplyXlsxTemplate(path.ToString(), templateBytes, value); + _excelTemplater.ApplyTemplate(path.ToString(), templateBytes, value); - var rows = _importer.QueryExcel(path.ToString()).ToList(); + var rows = _excelImporter.Query(path.ToString()).ToList(); Assert.Equal("Jack", rows[1].A); Assert.Equal("2021-01-01 00:00:00", rows[1].B); Assert.Equal(true, rows[1].C); @@ -676,10 +676,10 @@ public void TemplateBasicTest() }; using (var stream = File.Create(path.ToString())) { - _templater.ApplyXlsxTemplate(stream, templateBytes, value); + _excelTemplater.ApplyTemplate(stream, templateBytes, value); } - var rows = _importer.QueryExcel(path.ToString()).ToList(); + var rows = _excelImporter.Query(path.ToString()).ToList(); Assert.Equal("Jack", rows[1].A); Assert.Equal("2021-01-01 00:00:00", rows[1].B); Assert.Equal(true, rows[1].C); @@ -701,9 +701,9 @@ public void TemplateBasicTest() ["VIP"] = true, ["Points"] = 123 }; - _templater.ApplyXlsxTemplate(path.ToString(), templatePath, value); + _excelTemplater.ApplyTemplate(path.ToString(), templatePath, value); - var rows = _importer.QueryExcel(path.ToString()).ToList(); + var rows = _excelImporter.Query(path.ToString()).ToList(); Assert.Equal("Jack", rows[1].A); Assert.Equal("2021-01-01 00:00:00", rows[1].B); Assert.Equal(true, rows[1].C); @@ -735,7 +735,7 @@ public void TestIEnumerable() new { name = "Loan", department = "IT" } } }; - _templater.ApplyXlsxTemplate(path.ToString(), templatePath, value); + _excelTemplater.ApplyTemplate(path.ToString(), templatePath, value); var dimension = SheetHelper.GetFirstSheetDimensionRefValue(path.ToString()); Assert.Equal("A1:B7", dimension); @@ -757,7 +757,7 @@ public void TestIEnumerable() new { name = "Loan", department = "IT" } } }; - _templater.ApplyXlsxTemplate(path.ToString(), templatePath, value); + _excelTemplater.ApplyTemplate(path.ToString(), templatePath, value); var dimension = SheetHelper.GetFirstSheetDimensionRefValue(path.ToString()); Assert.Equal("A1:B7", dimension); @@ -782,7 +782,7 @@ public void TestIEnumerable() { ["employees"] = dt }; - _templater.ApplyXlsxTemplate(path.ToString(), templatePath, value); + _excelTemplater.ApplyTemplate(path.ToString(), templatePath, value); var dimension = SheetHelper.GetFirstSheetDimensionRefValue(path.ToString()); Assert.Equal("A1:B7", dimension); @@ -807,7 +807,7 @@ public void TestIEnumerableWithFormulas() new { name = "Joan", department = "IT", salary = 120000 } } }; - _templater.ApplyXlsxTemplate(path.ToString(), templatePath, value); + _excelTemplater.ApplyTemplate(path.ToString(), templatePath, value); var dimension = SheetHelper.GetFirstSheetDimensionRefValue(path.ToString()); Assert.Equal("A1:C13", dimension); @@ -837,10 +837,10 @@ public void TemplateTest() new { name = "Keaton", department = "IT" } } }; - _templater.ApplyXlsxTemplate(path.ToString(), templatePath, value); + _excelTemplater.ApplyTemplate(path.ToString(), templatePath, value); { - var rows = _importer.QueryExcel(path.ToString()).ToList(); + var rows = _excelImporter.Query(path.ToString()).ToList(); Assert.Equal(9, rows.Count); @@ -865,7 +865,7 @@ public void TemplateTest() } { - var rows = _importer.QueryExcel(path.ToString(), sheetName: "Sheet2").ToList(); + var rows = _excelImporter.Query(path.ToString(), sheetName: "Sheet2").ToList(); Assert.Equal(9, rows.Count); @@ -911,9 +911,9 @@ public void TemplateTest() new { name = "Keaton", department = "IT" } } }; - _templater.ApplyXlsxTemplate(path.ToString(), templatePath, value); + _excelTemplater.ApplyTemplate(path.ToString(), templatePath, value); - var rows = _importer.QueryExcel(path.ToString()).ToList(); + var rows = _excelImporter.Query(path.ToString()).ToList(); Assert.Equal("FooCompany", rows[0].A); Assert.Equal("Jack", rows[2].B); Assert.Equal("HR", rows[2].C); @@ -941,7 +941,7 @@ public void MergeSameCellsWithTagTest() const string path = "../../../../../samples/xlsx/TestMergeWithTag.xlsx"; using var mergedFilePath = AutoDeletingPath.Create(); - _templater.MergeSameCells(mergedFilePath.ToString(), path); + _excelTemplater.MergeSameCells(mergedFilePath.ToString(), path); var mergedCells = SheetHelper.GetFirstSheetMergedCells(mergedFilePath.ToString()); Assert.Equal("A2:A4", mergedCells[0]); @@ -955,7 +955,7 @@ public void MergeSameCellsWithLimitTagTest() const string path = "../../../../../samples/xlsx/TestMergeWithLimitTag.xlsx"; using var mergedFilePath = AutoDeletingPath.Create(); - _templater.MergeSameCells(mergedFilePath.ToString(), path); + _excelTemplater.MergeSameCells(mergedFilePath.ToString(), path); var mergedCells = SheetHelper.GetFirstSheetMergedCells(mergedFilePath.ToString()); Assert.Equal("A3:A4", mergedCells[0]); From 2c8b317082faae86bdb390ac14e0fef5fe51dc88 Mon Sep 17 00:00:00 2001 From: Michele Bastione Date: Mon, 21 Jul 2025 18:50:29 +0200 Subject: [PATCH 21/26] Changed namespaces .Api to .Providers in both main and csv assemblies --- .../BenchmarkSections/CreateExcelBenchmark.cs | 2 +- .../BenchmarkSections/QueryExcelBenchmark.cs | 2 +- .../BenchmarkSections/TemplateExcelBenchmark.cs | 2 +- .../BenchmarkSections/XlsxAsyncBenchmark.cs | 2 +- .../{Api => Providers}/CsvExporter.cs | 2 +- .../{Api => Providers}/CsvImporter.cs | 6 +++--- .../{Api => Providers}/ProviderExtensions.cs | 2 +- src/MiniExcel.Legacy/MiniExcel.cs | 14 ++++++-------- src/MiniExcel/MiniExcelProviders.cs | 8 +++++--- .../OpenXml/{Api => Providers}/OpenXmlExporter.cs | 2 +- .../OpenXml/{Api => Providers}/OpenXmlImporter.cs | 6 +++--- .../OpenXml/{Api => Providers}/OpenXmlTemplater.cs | 2 +- .../MiniExcel.Csv.Tests/MiniExcel.Csv.Tests.csproj | 4 ++-- tests/MiniExcel.Tests/MiniExcel.Tests.csproj | 2 +- 14 files changed, 28 insertions(+), 28 deletions(-) rename src/MiniExcel.Csv/{Api => Providers}/CsvExporter.cs (96%) rename src/MiniExcel.Csv/{Api => Providers}/CsvImporter.cs (94%) rename src/MiniExcel.Csv/{Api => Providers}/ProviderExtensions.cs (85%) rename src/MiniExcel/OpenXml/{Api => Providers}/OpenXmlExporter.cs (97%) rename src/MiniExcel/OpenXml/{Api => Providers}/OpenXmlImporter.cs (96%) rename src/MiniExcel/OpenXml/{Api => Providers}/OpenXmlTemplater.cs (96%) diff --git a/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/CreateExcelBenchmark.cs b/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/CreateExcelBenchmark.cs index 2bd67c25..f06ca014 100644 --- a/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/CreateExcelBenchmark.cs +++ b/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/CreateExcelBenchmark.cs @@ -5,7 +5,7 @@ using DocumentFormat.OpenXml.Packaging; using DocumentFormat.OpenXml.Spreadsheet; using MiniExcelLib.Benchmarks.Utils; -using MiniExcelLib.OpenXml.Api; +using MiniExcelLib.OpenXml.Providers; using NPOI.XSSF.UserModel; using OfficeOpenXml; diff --git a/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/QueryExcelBenchmark.cs b/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/QueryExcelBenchmark.cs index 34dfde1a..83ea0a44 100644 --- a/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/QueryExcelBenchmark.cs +++ b/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/QueryExcelBenchmark.cs @@ -4,7 +4,7 @@ using DocumentFormat.OpenXml.Packaging; using DocumentFormat.OpenXml.Spreadsheet; using ExcelDataReader; -using MiniExcelLib.OpenXml.Api; +using MiniExcelLib.OpenXml.Providers; using NPOI.XSSF.UserModel; using OfficeOpenXml; diff --git a/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/TemplateExcelBenchmark.cs b/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/TemplateExcelBenchmark.cs index ea16a09d..5fead05a 100644 --- a/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/TemplateExcelBenchmark.cs +++ b/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/TemplateExcelBenchmark.cs @@ -1,7 +1,7 @@ using BenchmarkDotNet.Attributes; using ClosedXML.Report; using MiniExcelLib.Benchmarks.Utils; -using MiniExcelLib.OpenXml.Api; +using MiniExcelLib.OpenXml.Providers; namespace MiniExcelLib.Benchmarks.BenchmarkSections; diff --git a/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/XlsxAsyncBenchmark.cs b/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/XlsxAsyncBenchmark.cs index b7131001..2a63e868 100644 --- a/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/XlsxAsyncBenchmark.cs +++ b/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/XlsxAsyncBenchmark.cs @@ -1,6 +1,6 @@ using BenchmarkDotNet.Attributes; using MiniExcelLib.Benchmarks.Utils; -using MiniExcelLib.OpenXml.Api; +using MiniExcelLib.OpenXml.Providers; namespace MiniExcelLib.Benchmarks.BenchmarkSections; diff --git a/src/MiniExcel.Csv/Api/CsvExporter.cs b/src/MiniExcel.Csv/Providers/CsvExporter.cs similarity index 96% rename from src/MiniExcel.Csv/Api/CsvExporter.cs rename to src/MiniExcel.Csv/Providers/CsvExporter.cs index 1676a847..ba2b804e 100644 --- a/src/MiniExcel.Csv/Api/CsvExporter.cs +++ b/src/MiniExcel.Csv/Providers/CsvExporter.cs @@ -1,4 +1,4 @@ -namespace MiniExcelLib.Csv.Api; +namespace MiniExcelLib.Csv.Providers; public partial class CsvExporter { diff --git a/src/MiniExcel.Csv/Api/CsvImporter.cs b/src/MiniExcel.Csv/Providers/CsvImporter.cs similarity index 94% rename from src/MiniExcel.Csv/Api/CsvImporter.cs rename to src/MiniExcel.Csv/Providers/CsvImporter.cs index e677f1d2..072cf70e 100644 --- a/src/MiniExcel.Csv/Api/CsvImporter.cs +++ b/src/MiniExcel.Csv/Providers/CsvImporter.cs @@ -1,6 +1,6 @@ using MiniExcelLib.DataReader; -namespace MiniExcelLib.Csv.Api; +namespace MiniExcelLib.Csv.Providers; public partial class CsvImporter { @@ -153,14 +153,14 @@ public async Task> GetColumnNamesAsync(Stream stream, bool u public MiniExcelDataReader GetDataReader(string path, bool useHeaderRow = false, CsvConfiguration? configuration = null) { var stream = FileHelper.OpenSharedRead(path); - var values = Query(stream, useHeaderRow, configuration).Cast>(); + var values = Enumerable.Cast>(Query(stream, useHeaderRow, configuration)); return MiniExcelDataReader.Create(stream, values); } public MiniExcelDataReader GetDataReader(Stream stream, bool useHeaderRow = false, CsvConfiguration? configuration = null) { - var values = Query(stream, useHeaderRow, configuration).Cast>(); + var values = Enumerable.Cast>(Query(stream, useHeaderRow, configuration)); return MiniExcelDataReader.Create(stream, values); } diff --git a/src/MiniExcel.Csv/Api/ProviderExtensions.cs b/src/MiniExcel.Csv/Providers/ProviderExtensions.cs similarity index 85% rename from src/MiniExcel.Csv/Api/ProviderExtensions.cs rename to src/MiniExcel.Csv/Providers/ProviderExtensions.cs index bc2fe986..8a58afd8 100644 --- a/src/MiniExcel.Csv/Api/ProviderExtensions.cs +++ b/src/MiniExcel.Csv/Providers/ProviderExtensions.cs @@ -1,4 +1,4 @@ -namespace MiniExcelLib.Csv.Api; +namespace MiniExcelLib.Csv.Providers; public static class ProviderExtensions { diff --git a/src/MiniExcel.Legacy/MiniExcel.cs b/src/MiniExcel.Legacy/MiniExcel.cs index 7fde9196..264e6a49 100644 --- a/src/MiniExcel.Legacy/MiniExcel.cs +++ b/src/MiniExcel.Legacy/MiniExcel.cs @@ -1,17 +1,15 @@ using System.Data; -using MiniExcelLib; -using MiniExcelLib.Csv; -using MiniExcelLib.Csv.Api; +using MiniExcelLib.Csv.Providers; using MiniExcelLib.DataReader; using MiniExcelLib.OpenXml.Models; using MiniExcelLib.OpenXml.Picture; using Zomp.SyncMethodGenerator; -using CsvExporter = MiniExcelLib.Csv.Api.CsvExporter; -using CsvImporter = MiniExcelLib.Csv.Api.CsvImporter; +using CsvExporter = MiniExcelLib.Csv.Providers.CsvExporter; +using CsvImporter = MiniExcelLib.Csv.Providers.CsvImporter; using MiniExcelNew = MiniExcelLib.MiniExcel; -using OpenXmlExporter = MiniExcelLib.OpenXml.Api.OpenXmlExporter; -using OpenXmlImporter = MiniExcelLib.OpenXml.Api.OpenXmlImporter; -using OpenXmlTemplater = MiniExcelLib.OpenXml.Api.OpenXmlTemplater; +using OpenXmlExporter = MiniExcelLib.OpenXml.Providers.OpenXmlExporter; +using OpenXmlImporter = MiniExcelLib.OpenXml.Providers.OpenXmlImporter; +using OpenXmlTemplater = MiniExcelLib.OpenXml.Providers.OpenXmlTemplater; namespace MiniExcelLibs; diff --git a/src/MiniExcel/MiniExcelProviders.cs b/src/MiniExcel/MiniExcelProviders.cs index 8cab7464..25031de0 100644 --- a/src/MiniExcel/MiniExcelProviders.cs +++ b/src/MiniExcel/MiniExcelProviders.cs @@ -1,22 +1,24 @@ +using MiniExcelLib.OpenXml.Providers; + namespace MiniExcelLib; public sealed class MiniExcelImporterProvider { internal MiniExcelImporterProvider() { } - public OpenXml.Api.OpenXmlImporter GetExcelImporter() => new(); + public OpenXmlImporter GetExcelImporter() => new(); } public sealed class MiniExcelExporterProvider { internal MiniExcelExporterProvider() { } - public OpenXml.Api.OpenXmlExporter GetExcelExporter() => new(); + public OpenXmlExporter GetExcelExporter() => new(); } public sealed class MiniExcelTemplaterProvider { internal MiniExcelTemplaterProvider() { } - public OpenXml.Api.OpenXmlTemplater GetExcelTemplater() => new(); + public OpenXmlTemplater GetExcelTemplater() => new(); } diff --git a/src/MiniExcel/OpenXml/Api/OpenXmlExporter.cs b/src/MiniExcel/OpenXml/Providers/OpenXmlExporter.cs similarity index 97% rename from src/MiniExcel/OpenXml/Api/OpenXmlExporter.cs rename to src/MiniExcel/OpenXml/Providers/OpenXmlExporter.cs index 249c350c..ab972feb 100644 --- a/src/MiniExcel/OpenXml/Api/OpenXmlExporter.cs +++ b/src/MiniExcel/OpenXml/Providers/OpenXmlExporter.cs @@ -1,6 +1,6 @@ using MiniExcelLib.OpenXml.Picture; -namespace MiniExcelLib.OpenXml.Api; +namespace MiniExcelLib.OpenXml.Providers; public sealed partial class OpenXmlExporter { diff --git a/src/MiniExcel/OpenXml/Api/OpenXmlImporter.cs b/src/MiniExcel/OpenXml/Providers/OpenXmlImporter.cs similarity index 96% rename from src/MiniExcel/OpenXml/Api/OpenXmlImporter.cs rename to src/MiniExcel/OpenXml/Providers/OpenXmlImporter.cs index 140b7657..613dbc93 100644 --- a/src/MiniExcel/OpenXml/Api/OpenXmlImporter.cs +++ b/src/MiniExcel/OpenXml/Providers/OpenXmlImporter.cs @@ -3,7 +3,7 @@ using MiniExcelLib.OpenXml.Models; using MiniExcelLib.OpenXml.Zip; -namespace MiniExcelLib.OpenXml.Api; +namespace MiniExcelLib.OpenXml.Providers; public sealed partial class OpenXmlImporter { @@ -272,7 +272,7 @@ public MiniExcelDataReader GetExcelDataReader(string path, bool useHeaderRow = f string? sheetName = null, string startCell = "A1", OpenXmlConfiguration? configuration = null) { var stream = FileHelper.OpenSharedRead(path); - var values = Query(stream, useHeaderRow, sheetName, startCell, configuration).Cast>(); + var values = Enumerable.Cast>(Query(stream, useHeaderRow, sheetName, startCell, configuration)); return MiniExcelDataReader.Create(stream, values); } @@ -280,7 +280,7 @@ public MiniExcelDataReader GetExcelDataReader(string path, bool useHeaderRow = f public MiniExcelDataReader GetExcelDataReader(Stream stream, bool useHeaderRow = false, string? sheetName = null, string startCell = "A1", OpenXmlConfiguration? configuration = null) { - var values = Query(stream, useHeaderRow, sheetName, startCell, configuration).Cast>(); + var values = Enumerable.Cast>(Query(stream, useHeaderRow, sheetName, startCell, configuration)); return MiniExcelDataReader.Create(stream, values); } diff --git a/src/MiniExcel/OpenXml/Api/OpenXmlTemplater.cs b/src/MiniExcel/OpenXml/Providers/OpenXmlTemplater.cs similarity index 96% rename from src/MiniExcel/OpenXml/Api/OpenXmlTemplater.cs rename to src/MiniExcel/OpenXml/Providers/OpenXmlTemplater.cs index 960c1387..bd72348a 100644 --- a/src/MiniExcel/OpenXml/Api/OpenXmlTemplater.cs +++ b/src/MiniExcel/OpenXml/Providers/OpenXmlTemplater.cs @@ -1,6 +1,6 @@ using MiniExcelLib.OpenXml.Templates; -namespace MiniExcelLib.OpenXml.Api; +namespace MiniExcelLib.OpenXml.Providers; public sealed partial class OpenXmlTemplater { diff --git a/tests/MiniExcel.Csv.Tests/MiniExcel.Csv.Tests.csproj b/tests/MiniExcel.Csv.Tests/MiniExcel.Csv.Tests.csproj index b4984567..7e4a2811 100644 --- a/tests/MiniExcel.Csv.Tests/MiniExcel.Csv.Tests.csproj +++ b/tests/MiniExcel.Csv.Tests/MiniExcel.Csv.Tests.csproj @@ -35,8 +35,8 @@ - - + + diff --git a/tests/MiniExcel.Tests/MiniExcel.Tests.csproj b/tests/MiniExcel.Tests/MiniExcel.Tests.csproj index dcdfd536..27d8b549 100644 --- a/tests/MiniExcel.Tests/MiniExcel.Tests.csproj +++ b/tests/MiniExcel.Tests/MiniExcel.Tests.csproj @@ -44,7 +44,7 @@ - + From 76d1d4f2dd8864e3e3eefc852c907dc7fe7932bb Mon Sep 17 00:00:00 2001 From: Michele Bastione Date: Mon, 21 Jul 2025 19:11:09 +0200 Subject: [PATCH 22/26] Added Directory.Packages.props file and moved package metadata content to Directory.Build.props --- src/Directory.Build.props | 41 ++++++++++++++++++++++------------ src/Directory.Packages.props | 17 ++++++++++++++ src/MiniExcel/MiniExcel.csproj | 27 ---------------------- 3 files changed, 44 insertions(+), 41 deletions(-) create mode 100644 src/Directory.Packages.props diff --git a/src/Directory.Build.props b/src/Directory.Build.props index 8557ffdc..2cc88351 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -7,24 +7,37 @@ enable 13 + + + MiniExcel + MiniExcel + Mini-Software + excel;xlsx;csv;micro-helper;mini;openxml;helper; + Fast, Low-Memory, Easy Excel .NET processing tool for importing, exporting and templating spreadsheets + Github : https://github.com/mini-software/MiniExcel + Gitee : https://gitee.com/dotnetchina/MiniExcel + Issues : https://github.com/mini-software/MiniExcel/issues + Todo : https://github.com/mini-software/MiniExcel/projects/1?fullscreen=true + Wei Lin, Michele Bastione, PING-HSIU SHIH, Amos(izanhzh), eynarhaji, Mini-Software team + MiniExcel + Wei Lin, 2021 onwards + en + https://raw.githubusercontent.com/mini-software/MiniExcel/master/LICENSE + Apache-2.0 + https://github.com/mini-software/MiniExcel + https://github.com/mini-software/MiniExcel + Github + icon.png + Please Check [Release Notes](https://github.com/mini-software/MiniExcel/tree/master/docs) + true + true + snupkg + README.md + True ..\miniexcel.snk - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/Directory.Packages.props b/src/Directory.Packages.props new file mode 100644 index 00000000..bb48b5d7 --- /dev/null +++ b/src/Directory.Packages.props @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/MiniExcel/MiniExcel.csproj b/src/MiniExcel/MiniExcel.csproj index 017b5239..dcb98785 100644 --- a/src/MiniExcel/MiniExcel.csproj +++ b/src/MiniExcel/MiniExcel.csproj @@ -3,33 +3,6 @@ MiniExcelLib - - - MiniExcel - MiniExcel - Mini-Software - excel;xlsx;csv;micro-helper;mini;openxml;helper; - Fast, Low-Memory, Easy Excel .NET processing tool for importing, exporting and templating spreadsheets - Github : https://github.com/mini-software/MiniExcel - Gitee : https://gitee.com/dotnetchina/MiniExcel - Issues : https://github.com/mini-software/MiniExcel/issues - Todo : https://github.com/mini-software/MiniExcel/projects/1?fullscreen=true - Wei Lin, Michele Bastione, PING-HSIU SHIH, Amos(izanhzh), eynarhaji, Mini-Software team - MiniExcel - Wei Lin, 2021 onwards - en - https://raw.githubusercontent.com/mini-software/MiniExcel/master/LICENSE - Apache-2.0 - https://github.com/mini-software/MiniExcel - https://github.com/mini-software/MiniExcel - Github - icon.png - Please Check [Release Notes](https://github.com/mini-software/MiniExcel/tree/master/docs) - true - true - snupkg - README.md - From ddb77b0863d6de093b927cddc6a60514986e6c2a Mon Sep 17 00:00:00 2001 From: Michele Bastione Date: Mon, 21 Jul 2025 20:14:23 +0200 Subject: [PATCH 23/26] Reintroduced facade assembly containing legacy code - Renamed MiniExcel to MiniExcel.Core again - Added different packages titles and ids for the assemblies - Renamed the providers back to Api but simplified namespaces --- MiniExcel.slnx | 9 +- .../BenchmarkSections/CreateExcelBenchmark.cs | 4 +- .../BenchmarkSections/QueryExcelBenchmark.cs | 4 +- .../TemplateExcelBenchmark.cs | 4 +- .../BenchmarkSections/XlsxAsyncBenchmark.cs | 6 +- .../MiniExcel.Benchmarks.csproj | 2 +- ...miniexcel.publickey => miniexcel.publickey | Bin src/Directory.Build.props | 2 - .../Abstractions/IInputValueExtractor.cs | 2 +- .../Abstractions/IMiniExcelDataReader.cs | 2 +- .../Abstractions/IMiniExcelReader.cs | 2 +- .../Abstractions/IMiniExcelTemplate.cs | 2 +- .../Abstractions/IMiniExcelWriteAdapter.cs | 4 +- .../IMiniExcelWriteAdapterAsync.cs | 4 +- .../Abstractions/IMiniExcelWriter.cs | 2 +- .../Api}/OpenXmlExporter.cs | 5 +- .../Api}/OpenXmlImporter.cs | 9 +- .../Api}/OpenXmlTemplater.cs | 5 +- .../Attributes/MiniExcelColumnAttribute.cs | 4 +- .../MiniExcelColumnIndexAttribute.cs | 4 +- .../MiniExcelColumnNameAttribute.cs | 2 +- .../MiniExcelColumnWidthAttribute.cs | 2 +- .../Attributes/MiniExcelFormatAttribute.cs | 2 +- .../Attributes/MiniExcelIgnoreAttribute.cs | 2 +- .../DataReader/MiniExcelAsyncDataReader.cs | 2 +- .../DataReader/MiniExcelDataReader.cs | 2 +- .../DataReader/MiniExcelDataReaderBase.cs | 4 +- .../Enums/XlsxImgType.cs | 2 +- .../MiniExcelColumnNotFoundException.cs | 2 +- .../MiniExcelInvalidCastException.cs | 2 +- .../GlobalUsings.cs | 11 +- .../Helpers/AttributeExtension.cs | 2 +- .../Helpers/ColumnHelper.cs | 2 +- .../Helpers/FileHelper.cs | 2 +- .../Helpers/ImageHelper.cs | 2 +- .../Helpers/ListHelper.cs | 2 +- .../Helpers/SafeStreamWriter.cs | 2 +- .../Helpers/StringHelper.cs | 2 +- .../Helpers/TaskHelper.cs | 2 +- .../Helpers/ThrowHelper.cs | 2 +- .../Helpers/TypeHelper.cs | 2 +- .../Helpers/XmlHelper.cs | 2 +- src/MiniExcel.Core/MiniExcel.Core.csproj | 16 ++ .../MiniExcel.cs | 2 +- .../MiniExcelConfiguration.cs | 4 +- .../MiniExcelProviders.cs | 10 +- .../OpenXml/Attributes/ExcelSheetAttribute.cs | 4 +- .../OpenXml/Constants/ExcelContentTypes.cs | 2 +- .../OpenXml/Constants/ExcelFileNames.cs | 2 +- .../OpenXml/Constants/ExcelXml.cs | 5 +- .../OpenXml/Constants/Schemas.cs | 2 +- .../OpenXml/Constants/WorksheetXml.cs | 4 +- .../OpenXml/Models/DrawingDto.cs | 2 +- .../OpenXml/Models/ExcelRange.cs | 2 +- .../OpenXml/Models/ExcelWidthCollection.cs | 4 +- .../OpenXml/Models/ExcellSheetInfo.cs | 2 +- .../OpenXml/Models/FileDto.cs | 2 +- .../OpenXml/Models/MergeCells.cs | 2 +- .../OpenXml/Models/SheetDto.cs | 2 +- .../OpenXml/Models/SheetInfo.cs | 2 +- .../OpenXml/Models/SheetRecord.cs | 2 +- .../OpenXml/OpenXmlConfiguration.cs | 6 +- .../OpenXml/OpenXmlReader.cs | 24 +- .../OpenXml/OpenXmlWriter.DefaultOpenXml.cs | 16 +- .../OpenXml/OpenXmlWriter.cs | 32 ++- .../OpenXml/Picture/OpenXmlPicture.cs | 5 +- .../Picture/OpenXmlPictureImplement.cs | 6 +- .../Builder/DefaultSheetStyleBuilder.cs | 2 +- .../Styles/Builder/ISheetStyleBuilder.cs | 2 +- .../Builder/MinimalSheetStyleBuilder.cs | 2 +- .../Styles/Builder/SheetStyleBuildContext.cs | 8 +- .../Styles/Builder/SheetStyleBuildResult.cs | 2 +- .../Styles/Builder/SheetStyleBuilderBase.cs | 2 +- .../Styles/Builder/SheetStyleBuilderHelper.cs | 5 +- .../OpenXml/Styles/OpenXmlStyleOptions.cs | 2 +- .../OpenXml/Styles/OpenXmlStyles.cs | 8 +- .../OpenXml/Styles/SheetStyleElementInfos.cs | 2 +- .../OpenXml/Templates/OpenXmlTemplate.Impl.cs | 8 +- .../Templates/OpenXmlTemplate.MergeCells.cs | 4 +- .../OpenXml/Templates/OpenXmlTemplate.cs | 9 +- .../Templates/OpenXmlValueExtractor.cs | 5 +- .../OpenXml/Utils/CalcChainHelper.cs | 2 +- .../OpenXml/Utils/DateTimeHelper.cs | 2 +- .../OpenXml/Utils/GeneralHelper.cs | 2 +- .../OpenXml/Utils/MiniExcelPropertyHelper.cs | 6 +- .../Utils/OpenXmlNumberFormatHelper.cs | 2 +- .../OpenXml/Utils/ReferenceHelper.cs | 2 +- .../OpenXml/Utils/SharedStringsDiskCache.cs | 2 +- .../OpenXml/Utils/XmlReaderHelper.cs | 4 +- .../OpenXml/Zip/MiniExcelZipArchive.cs | 2 +- .../OpenXml/Zip/OpenXmlZip.cs | 2 +- .../OpenXml/Zip/ZipPackageInfo.cs | 2 +- .../Properties/AssemblyInfo.cs | 0 .../Reflection/CustomPropertyHelper.cs | 4 +- .../Reflection/MemberGetter.cs | 2 +- .../Reflection/MemberSetter.cs | 2 +- .../Reflection/MiniExcelColumnInfo.cs | 4 +- .../Reflection/MiniExcelMapper.cs | 6 +- .../Reflection/MiniExcelProperty.cs | 2 +- .../AsyncEnumerableWriteAdapter.cs | 5 +- .../WriteAdapters/DataReaderWriteAdapter.cs | 5 +- .../WriteAdapters/DataTableWriteAdapter.cs | 5 +- .../WriteAdapters/EnumerableWriteAdapter.cs | 6 +- .../MiniExcelDataReaderWriteAdapter.cs | 5 +- .../MiniExcelWriteAdapterFactory.cs | 5 +- .../{Providers => Api}/CsvExporter.cs | 9 +- .../{Providers => Api}/CsvImporter.cs | 6 +- .../{Providers => Api}/ProviderExtensions.cs | 5 +- src/MiniExcel.Csv/CsvConfiguration.cs | 2 + src/MiniExcel.Csv/CsvReader.cs | 7 + src/MiniExcel.Csv/CsvWriter.cs | 8 +- src/MiniExcel.Csv/GlobalUsings.cs | 8 +- src/MiniExcel.Csv/MiniExcel.Csv.csproj | 7 +- src/MiniExcel.Legacy/Configuration.cs | 9 - src/MiniExcel.Legacy/MiniExcel.Legacy.csproj | 12 - src/MiniExcel/Legacy/Configuration.cs | 9 + .../Legacy}/ExcelType.cs | 2 +- .../Legacy}/ExcelTypeHelper.cs | 2 +- .../Legacy}/MiniExcel.cs | 30 +- src/MiniExcel/MiniExcel.csproj | 20 +- src/{MiniExcel => }/icon.png | Bin .../MiniExcel.Core.Tests.csproj} | 17 +- .../MiniExcelAutoAdjustWidthTests.cs | 4 +- .../MiniExcelIssueAsyncTests.cs | 8 +- .../MiniExcelIssueTests.cs | 17 +- .../MiniExcelOpenXmlAsyncTests.cs | 9 +- .../MiniExcelOpenXmlConfigurationTest.cs | 7 +- ...MiniExcelOpenXmlMultipleSheetAsyncTests.cs | 2 +- .../MiniExcelOpenXmlMultipleSheetTests.cs | 8 +- .../MiniExcelOpenXmlTests.cs | 10 +- .../InputValueExtractorTests.cs | 2 +- .../MiniExcelTemplateAsyncTests.cs | 4 +- .../SaveByTemplate/MiniExcelTemplateTests.cs | 10 +- .../TemplateOptimization/DummyFiller.cs | 74 +++++ .../TemplateOptimization/MainTest.cs | 82 ++++++ .../TemplateOptimization/MatrixCreator.cs | 257 ++++++++++++++++++ .../TemplateOptimization/RawDataFillTest.cs | 160 +++++++++++ .../TemplateOptimization/template.xlsx | Bin 0 -> 55272 bytes .../Utils/EpplusLicense.cs | 0 .../Utils/FileHelper.cs | 0 .../Utils/SheetHelper.cs | 0 tests/MiniExcel.Csv.Tests/AsyncIssueTests.cs | 4 +- tests/MiniExcel.Csv.Tests/IssueTests.cs | 4 +- .../MiniExcel.Csv.Tests.csproj | 18 +- 144 files changed, 962 insertions(+), 302 deletions(-) rename src/MiniExcel/miniexcel.publickey => miniexcel.publickey (100%) rename src/{MiniExcel => MiniExcel.Core}/Abstractions/IInputValueExtractor.cs (73%) rename src/{MiniExcel => MiniExcel.Core}/Abstractions/IMiniExcelDataReader.cs (88%) rename src/{MiniExcel => MiniExcel.Core}/Abstractions/IMiniExcelReader.cs (95%) rename src/{MiniExcel => MiniExcel.Core}/Abstractions/IMiniExcelTemplate.cs (91%) rename src/{MiniExcel => MiniExcel.Core}/Abstractions/IMiniExcelWriteAdapter.cs (83%) rename src/{MiniExcel => MiniExcel.Core}/Abstractions/IMiniExcelWriteAdapterAsync.cs (73%) rename src/{MiniExcel => MiniExcel.Core}/Abstractions/IMiniExcelWriter.cs (83%) rename src/{MiniExcel/OpenXml/Providers => MiniExcel.Core/Api}/OpenXmlExporter.cs (95%) rename src/{MiniExcel/OpenXml/Providers => MiniExcel.Core/Api}/OpenXmlImporter.cs (96%) rename src/{MiniExcel/OpenXml/Providers => MiniExcel.Core/Api}/OpenXmlTemplater.cs (95%) rename src/{MiniExcel => MiniExcel.Core}/Attributes/MiniExcelColumnAttribute.cs (91%) rename src/{MiniExcel => MiniExcel.Core}/Attributes/MiniExcelColumnIndexAttribute.cs (89%) rename src/{MiniExcel => MiniExcel.Core}/Attributes/MiniExcelColumnNameAttribute.cs (86%) rename src/{MiniExcel => MiniExcel.Core}/Attributes/MiniExcelColumnWidthAttribute.cs (81%) rename src/{MiniExcel => MiniExcel.Core}/Attributes/MiniExcelFormatAttribute.cs (79%) rename src/{MiniExcel => MiniExcel.Core}/Attributes/MiniExcelIgnoreAttribute.cs (80%) rename src/{MiniExcel => MiniExcel.Core}/DataReader/MiniExcelAsyncDataReader.cs (95%) rename src/{MiniExcel => MiniExcel.Core}/DataReader/MiniExcelDataReader.cs (94%) rename src/{MiniExcel => MiniExcel.Core}/DataReader/MiniExcelDataReaderBase.cs (95%) rename src/{MiniExcel => MiniExcel.Core}/Enums/XlsxImgType.cs (91%) rename src/{MiniExcel => MiniExcel.Core}/Exceptions/MiniExcelColumnNotFoundException.cs (90%) rename src/{MiniExcel => MiniExcel.Core}/Exceptions/MiniExcelInvalidCastException.cs (87%) rename src/{MiniExcel => MiniExcel.Core}/GlobalUsings.cs (60%) rename src/{MiniExcel => MiniExcel.Core}/Helpers/AttributeExtension.cs (94%) rename src/{MiniExcel => MiniExcel.Core}/Helpers/ColumnHelper.cs (95%) rename src/{MiniExcel => MiniExcel.Core}/Helpers/FileHelper.cs (78%) rename src/{MiniExcel => MiniExcel.Core}/Helpers/ImageHelper.cs (93%) rename src/{MiniExcel => MiniExcel.Core}/Helpers/ListHelper.cs (88%) rename src/{MiniExcel => MiniExcel.Core}/Helpers/SafeStreamWriter.cs (94%) rename src/{MiniExcel => MiniExcel.Core}/Helpers/StringHelper.cs (83%) rename src/{MiniExcel => MiniExcel.Core}/Helpers/TaskHelper.cs (90%) rename src/{MiniExcel => MiniExcel.Core}/Helpers/ThrowHelper.cs (91%) rename src/{MiniExcel => MiniExcel.Core}/Helpers/TypeHelper.cs (94%) rename src/{MiniExcel => MiniExcel.Core}/Helpers/XmlHelper.cs (95%) create mode 100644 src/MiniExcel.Core/MiniExcel.Core.csproj rename src/{MiniExcel => MiniExcel.Core}/MiniExcel.cs (87%) rename src/{MiniExcel => MiniExcel.Core}/MiniExcelConfiguration.cs (86%) rename src/{MiniExcel => MiniExcel.Core}/MiniExcelProviders.cs (53%) rename src/{MiniExcel => MiniExcel.Core}/OpenXml/Attributes/ExcelSheetAttribute.cs (75%) rename src/{MiniExcel => MiniExcel.Core}/OpenXml/Constants/ExcelContentTypes.cs (92%) rename src/{MiniExcel => MiniExcel.Core}/OpenXml/Constants/ExcelFileNames.cs (91%) rename src/{MiniExcel => MiniExcel.Core}/OpenXml/Constants/ExcelXml.cs (96%) rename src/{MiniExcel => MiniExcel.Core}/OpenXml/Constants/Schemas.cs (91%) rename src/{MiniExcel => MiniExcel.Core}/OpenXml/Constants/WorksheetXml.cs (96%) rename src/{MiniExcel => MiniExcel.Core}/OpenXml/Models/DrawingDto.cs (64%) rename src/{MiniExcel => MiniExcel.Core}/OpenXml/Models/ExcelRange.cs (91%) rename src/{MiniExcel => MiniExcel.Core}/OpenXml/Models/ExcelWidthCollection.cs (93%) rename src/{MiniExcel => MiniExcel.Core}/OpenXml/Models/ExcellSheetInfo.cs (88%) rename src/{MiniExcel => MiniExcel.Core}/OpenXml/Models/FileDto.cs (88%) rename src/{MiniExcel => MiniExcel.Core}/OpenXml/Models/MergeCells.cs (77%) rename src/{MiniExcel => MiniExcel.Core}/OpenXml/Models/SheetDto.cs (82%) rename src/{MiniExcel => MiniExcel.Core}/OpenXml/Models/SheetInfo.cs (91%) rename src/{MiniExcel => MiniExcel.Core}/OpenXml/Models/SheetRecord.cs (92%) rename src/{MiniExcel => MiniExcel.Core}/OpenXml/OpenXmlConfiguration.cs (89%) rename src/{MiniExcel => MiniExcel.Core}/OpenXml/OpenXmlReader.cs (96%) rename src/{MiniExcel => MiniExcel.Core}/OpenXml/OpenXmlWriter.DefaultOpenXml.cs (94%) rename src/{MiniExcel => MiniExcel.Core}/OpenXml/OpenXmlWriter.cs (95%) rename src/{MiniExcel => MiniExcel.Core}/OpenXml/Picture/OpenXmlPicture.cs (83%) rename src/{MiniExcel => MiniExcel.Core}/OpenXml/Picture/OpenXmlPictureImplement.cs (97%) rename src/{MiniExcel => MiniExcel.Core}/OpenXml/Styles/Builder/DefaultSheetStyleBuilder.cs (98%) rename src/{MiniExcel => MiniExcel.Core}/OpenXml/Styles/Builder/ISheetStyleBuilder.cs (73%) rename src/{MiniExcel => MiniExcel.Core}/OpenXml/Styles/Builder/MinimalSheetStyleBuilder.cs (96%) rename src/{MiniExcel => MiniExcel.Core}/OpenXml/Styles/Builder/SheetStyleBuildContext.cs (96%) rename src/{MiniExcel => MiniExcel.Core}/OpenXml/Styles/Builder/SheetStyleBuildResult.cs (72%) rename src/{MiniExcel => MiniExcel.Core}/OpenXml/Styles/Builder/SheetStyleBuilderBase.cs (97%) rename src/{MiniExcel => MiniExcel.Core}/OpenXml/Styles/Builder/SheetStyleBuilderHelper.cs (81%) rename src/{MiniExcel => MiniExcel.Core}/OpenXml/Styles/OpenXmlStyleOptions.cs (63%) rename src/{MiniExcel => MiniExcel.Core}/OpenXml/Styles/OpenXmlStyles.cs (95%) rename src/{MiniExcel => MiniExcel.Core}/OpenXml/Styles/SheetStyleElementInfos.cs (89%) rename src/{MiniExcel => MiniExcel.Core}/OpenXml/Templates/OpenXmlTemplate.Impl.cs (97%) rename src/{MiniExcel => MiniExcel.Core}/OpenXml/Templates/OpenXmlTemplate.MergeCells.cs (94%) rename src/{MiniExcel => MiniExcel.Core}/OpenXml/Templates/OpenXmlTemplate.cs (94%) rename src/{MiniExcel => MiniExcel.Core}/OpenXml/Templates/OpenXmlValueExtractor.cs (89%) rename src/{MiniExcel => MiniExcel.Core}/OpenXml/Utils/CalcChainHelper.cs (95%) rename src/{MiniExcel => MiniExcel.Core}/OpenXml/Utils/DateTimeHelper.cs (91%) rename src/{MiniExcel => MiniExcel.Core}/OpenXml/Utils/GeneralHelper.cs (93%) rename src/{MiniExcel => MiniExcel.Core}/OpenXml/Utils/MiniExcelPropertyHelper.cs (88%) rename src/{MiniExcel => MiniExcel.Core}/OpenXml/Utils/OpenXmlNumberFormatHelper.cs (96%) rename src/{MiniExcel => MiniExcel.Core}/OpenXml/Utils/ReferenceHelper.cs (95%) rename src/{MiniExcel => MiniExcel.Core}/OpenXml/Utils/SharedStringsDiskCache.cs (95%) rename src/{MiniExcel => MiniExcel.Core}/OpenXml/Utils/XmlReaderHelper.cs (95%) rename src/{MiniExcel => MiniExcel.Core}/OpenXml/Zip/MiniExcelZipArchive.cs (85%) rename src/{MiniExcel => MiniExcel.Core}/OpenXml/Zip/OpenXmlZip.cs (94%) rename src/{MiniExcel => MiniExcel.Core}/OpenXml/Zip/ZipPackageInfo.cs (82%) rename src/{MiniExcel => MiniExcel.Core}/Properties/AssemblyInfo.cs (100%) rename src/{MiniExcel => MiniExcel.Core}/Reflection/CustomPropertyHelper.cs (96%) rename src/{MiniExcel => MiniExcel.Core}/Reflection/MemberGetter.cs (92%) rename src/{MiniExcel => MiniExcel.Core}/Reflection/MemberSetter.cs (93%) rename src/{MiniExcel => MiniExcel.Core}/Reflection/MiniExcelColumnInfo.cs (88%) rename src/{MiniExcel => MiniExcel.Core}/Reflection/MiniExcelMapper.cs (96%) rename src/{MiniExcel => MiniExcel.Core}/Reflection/MiniExcelProperty.cs (93%) rename src/{MiniExcel => MiniExcel.Core}/WriteAdapters/AsyncEnumerableWriteAdapter.cs (92%) rename src/{MiniExcel => MiniExcel.Core}/WriteAdapters/DataReaderWriteAdapter.cs (91%) rename src/{MiniExcel => MiniExcel.Core}/WriteAdapters/DataTableWriteAdapter.cs (89%) rename src/{MiniExcel => MiniExcel.Core}/WriteAdapters/EnumerableWriteAdapter.cs (91%) rename src/{MiniExcel => MiniExcel.Core}/WriteAdapters/MiniExcelDataReaderWriteAdapter.cs (92%) rename src/{MiniExcel => MiniExcel.Core}/WriteAdapters/MiniExcelWriteAdapterFactory.cs (89%) rename src/MiniExcel.Csv/{Providers => Api}/CsvExporter.cs (94%) rename src/MiniExcel.Csv/{Providers => Api}/CsvImporter.cs (96%) rename src/MiniExcel.Csv/{Providers => Api}/ProviderExtensions.cs (70%) delete mode 100644 src/MiniExcel.Legacy/Configuration.cs delete mode 100644 src/MiniExcel.Legacy/MiniExcel.Legacy.csproj create mode 100644 src/MiniExcel/Legacy/Configuration.cs rename src/{MiniExcel.Legacy => MiniExcel/Legacy}/ExcelType.cs (57%) rename src/{MiniExcel.Legacy => MiniExcel/Legacy}/ExcelTypeHelper.cs (95%) rename src/{MiniExcel.Legacy => MiniExcel/Legacy}/MiniExcel.cs (95%) rename src/{MiniExcel => }/icon.png (100%) rename tests/{MiniExcel.Tests/MiniExcel.Tests.csproj => MiniExcel.Core.Tests/MiniExcel.Core.Tests.csproj} (81%) rename tests/{MiniExcel.Tests => MiniExcel.Core.Tests}/MiniExcelAutoAdjustWidthTests.cs (96%) rename tests/{MiniExcel.Tests => MiniExcel.Core.Tests}/MiniExcelIssueAsyncTests.cs (97%) rename tests/{MiniExcel.Tests => MiniExcel.Core.Tests}/MiniExcelIssueTests.cs (97%) rename tests/{MiniExcel.Tests => MiniExcel.Core.Tests}/MiniExcelOpenXmlAsyncTests.cs (97%) rename tests/{MiniExcel.Tests => MiniExcel.Core.Tests}/MiniExcelOpenXmlConfigurationTest.cs (91%) rename tests/{MiniExcel.Tests => MiniExcel.Core.Tests}/MiniExcelOpenXmlMultipleSheetAsyncTests.cs (96%) rename tests/{MiniExcel.Tests => MiniExcel.Core.Tests}/MiniExcelOpenXmlMultipleSheetTests.cs (95%) rename tests/{MiniExcel.Tests => MiniExcel.Core.Tests}/MiniExcelOpenXmlTests.cs (97%) rename tests/{MiniExcel.Tests => MiniExcel.Core.Tests}/SaveByTemplate/InputValueExtractorTests.cs (98%) rename tests/{MiniExcel.Tests => MiniExcel.Core.Tests}/SaveByTemplate/MiniExcelTemplateAsyncTests.cs (97%) rename tests/{MiniExcel.Tests => MiniExcel.Core.Tests}/SaveByTemplate/MiniExcelTemplateTests.cs (96%) create mode 100644 tests/MiniExcel.Core.Tests/TemplateOptimization/DummyFiller.cs create mode 100644 tests/MiniExcel.Core.Tests/TemplateOptimization/MainTest.cs create mode 100644 tests/MiniExcel.Core.Tests/TemplateOptimization/MatrixCreator.cs create mode 100644 tests/MiniExcel.Core.Tests/TemplateOptimization/RawDataFillTest.cs create mode 100644 tests/MiniExcel.Core.Tests/TemplateOptimization/template.xlsx rename tests/{MiniExcel.Tests => MiniExcel.Core.Tests}/Utils/EpplusLicense.cs (100%) rename tests/{MiniExcel.Tests => MiniExcel.Core.Tests}/Utils/FileHelper.cs (100%) rename tests/{MiniExcel.Tests => MiniExcel.Core.Tests}/Utils/SheetHelper.cs (100%) diff --git a/MiniExcel.slnx b/MiniExcel.slnx index ff2ffce3..92c62e02 100644 --- a/MiniExcel.slnx +++ b/MiniExcel.slnx @@ -15,6 +15,9 @@ + + + @@ -22,13 +25,13 @@ + - - + - + \ No newline at end of file diff --git a/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/CreateExcelBenchmark.cs b/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/CreateExcelBenchmark.cs index f06ca014..0e2bc057 100644 --- a/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/CreateExcelBenchmark.cs +++ b/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/CreateExcelBenchmark.cs @@ -5,7 +5,7 @@ using DocumentFormat.OpenXml.Packaging; using DocumentFormat.OpenXml.Spreadsheet; using MiniExcelLib.Benchmarks.Utils; -using MiniExcelLib.OpenXml.Providers; +using MiniExcelLib.Core; using NPOI.XSSF.UserModel; using OfficeOpenXml; @@ -21,7 +21,7 @@ public void SetUp() ExcelPackage.LicenseContext = LicenseContext.NonCommercial; Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); - _exporter = MiniExcel.Exporter.GetExcelExporter(); + _exporter = MiniExcel.Exporter.GetOpenXmlExporter(); } [Benchmark(Description = "MiniExcel Create Xlsx")] diff --git a/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/QueryExcelBenchmark.cs b/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/QueryExcelBenchmark.cs index 83ea0a44..94ec2eee 100644 --- a/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/QueryExcelBenchmark.cs +++ b/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/QueryExcelBenchmark.cs @@ -4,7 +4,7 @@ using DocumentFormat.OpenXml.Packaging; using DocumentFormat.OpenXml.Spreadsheet; using ExcelDataReader; -using MiniExcelLib.OpenXml.Providers; +using MiniExcelLib.Core; using NPOI.XSSF.UserModel; using OfficeOpenXml; @@ -20,7 +20,7 @@ public void SetUp() ExcelPackage.LicenseContext = LicenseContext.NonCommercial; Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); - _importer = MiniExcel.Importer.GetExcelImporter(); + _importer = MiniExcel.Importer.GetOpenXmlImporter(); } [Benchmark(Description = "MiniExcel QueryFirst")] diff --git a/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/TemplateExcelBenchmark.cs b/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/TemplateExcelBenchmark.cs index 5fead05a..372c014a 100644 --- a/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/TemplateExcelBenchmark.cs +++ b/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/TemplateExcelBenchmark.cs @@ -1,7 +1,7 @@ using BenchmarkDotNet.Attributes; using ClosedXML.Report; using MiniExcelLib.Benchmarks.Utils; -using MiniExcelLib.OpenXml.Providers; +using MiniExcelLib.Core; namespace MiniExcelLib.Benchmarks.BenchmarkSections; @@ -12,7 +12,7 @@ public class TemplateExcelBenchmark : BenchmarkBase [GlobalSetup] public void Setup() { - _templater = MiniExcel.Templater.GetExcelTemplater(); + _templater = MiniExcel.Templater.GetOpenXmlTemplater(); } [Benchmark(Description = "MiniExcel Template Generate")] diff --git a/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/XlsxAsyncBenchmark.cs b/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/XlsxAsyncBenchmark.cs index 2a63e868..41e7ecbc 100644 --- a/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/XlsxAsyncBenchmark.cs +++ b/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/XlsxAsyncBenchmark.cs @@ -1,6 +1,6 @@ using BenchmarkDotNet.Attributes; using MiniExcelLib.Benchmarks.Utils; -using MiniExcelLib.OpenXml.Providers; +using MiniExcelLib.Core; namespace MiniExcelLib.Benchmarks.BenchmarkSections; @@ -12,8 +12,8 @@ public class XlsxAsyncBenchmark : BenchmarkBase [GlobalSetup] public void Setup() { - _exporter = MiniExcel.Exporter.GetExcelExporter(); - _templater = MiniExcel.Templater.GetExcelTemplater(); + _exporter = MiniExcel.Exporter.GetOpenXmlExporter(); + _templater = MiniExcel.Templater.GetOpenXmlTemplater(); } [Benchmark(Description = "MiniExcel Create Xlsx Async")] diff --git a/benchmarks/MiniExcel.Benchmarks/MiniExcel.Benchmarks.csproj b/benchmarks/MiniExcel.Benchmarks/MiniExcel.Benchmarks.csproj index 26f1d19a..f2dcfd17 100644 --- a/benchmarks/MiniExcel.Benchmarks/MiniExcel.Benchmarks.csproj +++ b/benchmarks/MiniExcel.Benchmarks/MiniExcel.Benchmarks.csproj @@ -35,7 +35,7 @@ - + diff --git a/src/MiniExcel/miniexcel.publickey b/miniexcel.publickey similarity index 100% rename from src/MiniExcel/miniexcel.publickey rename to miniexcel.publickey diff --git a/src/Directory.Build.props b/src/Directory.Build.props index 2cc88351..7c777d29 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -9,7 +9,6 @@ - MiniExcel MiniExcel Mini-Software excel;xlsx;csv;micro-helper;mini;openxml;helper; @@ -19,7 +18,6 @@ Issues : https://github.com/mini-software/MiniExcel/issues Todo : https://github.com/mini-software/MiniExcel/projects/1?fullscreen=true Wei Lin, Michele Bastione, PING-HSIU SHIH, Amos(izanhzh), eynarhaji, Mini-Software team - MiniExcel Wei Lin, 2021 onwards en https://raw.githubusercontent.com/mini-software/MiniExcel/master/LICENSE diff --git a/src/MiniExcel/Abstractions/IInputValueExtractor.cs b/src/MiniExcel.Core/Abstractions/IInputValueExtractor.cs similarity index 73% rename from src/MiniExcel/Abstractions/IInputValueExtractor.cs rename to src/MiniExcel.Core/Abstractions/IInputValueExtractor.cs index f374af28..f0409064 100644 --- a/src/MiniExcel/Abstractions/IInputValueExtractor.cs +++ b/src/MiniExcel.Core/Abstractions/IInputValueExtractor.cs @@ -1,4 +1,4 @@ -namespace MiniExcelLib.Abstractions; +namespace MiniExcelLib.Core.Abstractions; public interface IInputValueExtractor { diff --git a/src/MiniExcel/Abstractions/IMiniExcelDataReader.cs b/src/MiniExcel.Core/Abstractions/IMiniExcelDataReader.cs similarity index 88% rename from src/MiniExcel/Abstractions/IMiniExcelDataReader.cs rename to src/MiniExcel.Core/Abstractions/IMiniExcelDataReader.cs index 4ecf5c91..a36aec05 100644 --- a/src/MiniExcel/Abstractions/IMiniExcelDataReader.cs +++ b/src/MiniExcel.Core/Abstractions/IMiniExcelDataReader.cs @@ -1,4 +1,4 @@ -namespace MiniExcelLib.Abstractions; +namespace MiniExcelLib.Core.Abstractions; public interface IMiniExcelDataReader : IDataReader #if NET8_0_OR_GREATER diff --git a/src/MiniExcel/Abstractions/IMiniExcelReader.cs b/src/MiniExcel.Core/Abstractions/IMiniExcelReader.cs similarity index 95% rename from src/MiniExcel/Abstractions/IMiniExcelReader.cs rename to src/MiniExcel.Core/Abstractions/IMiniExcelReader.cs index 91806f15..3760c139 100644 --- a/src/MiniExcel/Abstractions/IMiniExcelReader.cs +++ b/src/MiniExcel.Core/Abstractions/IMiniExcelReader.cs @@ -1,4 +1,4 @@ -namespace MiniExcelLib.Abstractions; +namespace MiniExcelLib.Core.Abstractions; public partial interface IMiniExcelReader : IDisposable { diff --git a/src/MiniExcel/Abstractions/IMiniExcelTemplate.cs b/src/MiniExcel.Core/Abstractions/IMiniExcelTemplate.cs similarity index 91% rename from src/MiniExcel/Abstractions/IMiniExcelTemplate.cs rename to src/MiniExcel.Core/Abstractions/IMiniExcelTemplate.cs index a38eb10f..57a3eb8f 100644 --- a/src/MiniExcel/Abstractions/IMiniExcelTemplate.cs +++ b/src/MiniExcel.Core/Abstractions/IMiniExcelTemplate.cs @@ -1,4 +1,4 @@ -namespace MiniExcelLib.Abstractions; +namespace MiniExcelLib.Core.Abstractions; public partial interface IMiniExcelTemplate { diff --git a/src/MiniExcel/Abstractions/IMiniExcelWriteAdapter.cs b/src/MiniExcel.Core/Abstractions/IMiniExcelWriteAdapter.cs similarity index 83% rename from src/MiniExcel/Abstractions/IMiniExcelWriteAdapter.cs rename to src/MiniExcel.Core/Abstractions/IMiniExcelWriteAdapter.cs index c4da1031..1fb24a85 100644 --- a/src/MiniExcel/Abstractions/IMiniExcelWriteAdapter.cs +++ b/src/MiniExcel.Core/Abstractions/IMiniExcelWriteAdapter.cs @@ -1,4 +1,6 @@ -namespace MiniExcelLib.Abstractions; +using MiniExcelLib.Core.Reflection; + +namespace MiniExcelLib.Core.Abstractions; public interface IMiniExcelWriteAdapter { diff --git a/src/MiniExcel/Abstractions/IMiniExcelWriteAdapterAsync.cs b/src/MiniExcel.Core/Abstractions/IMiniExcelWriteAdapterAsync.cs similarity index 73% rename from src/MiniExcel/Abstractions/IMiniExcelWriteAdapterAsync.cs rename to src/MiniExcel.Core/Abstractions/IMiniExcelWriteAdapterAsync.cs index 21804018..03865a63 100644 --- a/src/MiniExcel/Abstractions/IMiniExcelWriteAdapterAsync.cs +++ b/src/MiniExcel.Core/Abstractions/IMiniExcelWriteAdapterAsync.cs @@ -1,4 +1,6 @@ -namespace MiniExcelLib.Abstractions; +using MiniExcelLib.Core.Reflection; + +namespace MiniExcelLib.Core.Abstractions; public interface IMiniExcelWriteAdapterAsync { diff --git a/src/MiniExcel/Abstractions/IMiniExcelWriter.cs b/src/MiniExcel.Core/Abstractions/IMiniExcelWriter.cs similarity index 83% rename from src/MiniExcel/Abstractions/IMiniExcelWriter.cs rename to src/MiniExcel.Core/Abstractions/IMiniExcelWriter.cs index 2f827904..b80f88dd 100644 --- a/src/MiniExcel/Abstractions/IMiniExcelWriter.cs +++ b/src/MiniExcel.Core/Abstractions/IMiniExcelWriter.cs @@ -1,4 +1,4 @@ -namespace MiniExcelLib.Abstractions; +namespace MiniExcelLib.Core.Abstractions; public partial interface IMiniExcelWriter { diff --git a/src/MiniExcel/OpenXml/Providers/OpenXmlExporter.cs b/src/MiniExcel.Core/Api/OpenXmlExporter.cs similarity index 95% rename from src/MiniExcel/OpenXml/Providers/OpenXmlExporter.cs rename to src/MiniExcel.Core/Api/OpenXmlExporter.cs index ab972feb..49f47ee6 100644 --- a/src/MiniExcel/OpenXml/Providers/OpenXmlExporter.cs +++ b/src/MiniExcel.Core/Api/OpenXmlExporter.cs @@ -1,6 +1,7 @@ -using MiniExcelLib.OpenXml.Picture; +using MiniExcelLib.Core.OpenXml.Picture; -namespace MiniExcelLib.OpenXml.Providers; +// ReSharper disable once CheckNamespace +namespace MiniExcelLib.Core; public sealed partial class OpenXmlExporter { diff --git a/src/MiniExcel/OpenXml/Providers/OpenXmlImporter.cs b/src/MiniExcel.Core/Api/OpenXmlImporter.cs similarity index 96% rename from src/MiniExcel/OpenXml/Providers/OpenXmlImporter.cs rename to src/MiniExcel.Core/Api/OpenXmlImporter.cs index 613dbc93..228271b1 100644 --- a/src/MiniExcel/OpenXml/Providers/OpenXmlImporter.cs +++ b/src/MiniExcel.Core/Api/OpenXmlImporter.cs @@ -1,9 +1,10 @@ using System.Dynamic; -using MiniExcelLib.DataReader; -using MiniExcelLib.OpenXml.Models; -using MiniExcelLib.OpenXml.Zip; +using MiniExcelLib.Core.DataReader; +using MiniExcelLib.Core.OpenXml.Models; +using MiniExcelLib.Core.OpenXml.Zip; -namespace MiniExcelLib.OpenXml.Providers; +// ReSharper disable once CheckNamespace +namespace MiniExcelLib.Core; public sealed partial class OpenXmlImporter { diff --git a/src/MiniExcel/OpenXml/Providers/OpenXmlTemplater.cs b/src/MiniExcel.Core/Api/OpenXmlTemplater.cs similarity index 95% rename from src/MiniExcel/OpenXml/Providers/OpenXmlTemplater.cs rename to src/MiniExcel.Core/Api/OpenXmlTemplater.cs index bd72348a..30bb8bcb 100644 --- a/src/MiniExcel/OpenXml/Providers/OpenXmlTemplater.cs +++ b/src/MiniExcel.Core/Api/OpenXmlTemplater.cs @@ -1,6 +1,7 @@ -using MiniExcelLib.OpenXml.Templates; +using MiniExcelLib.Core.OpenXml.Templates; -namespace MiniExcelLib.OpenXml.Providers; +// ReSharper disable once CheckNamespace +namespace MiniExcelLib.Core; public sealed partial class OpenXmlTemplater { diff --git a/src/MiniExcel/Attributes/MiniExcelColumnAttribute.cs b/src/MiniExcel.Core/Attributes/MiniExcelColumnAttribute.cs similarity index 91% rename from src/MiniExcel/Attributes/MiniExcelColumnAttribute.cs rename to src/MiniExcel.Core/Attributes/MiniExcelColumnAttribute.cs index 340d26ea..c7a2c287 100644 --- a/src/MiniExcel/Attributes/MiniExcelColumnAttribute.cs +++ b/src/MiniExcel.Core/Attributes/MiniExcelColumnAttribute.cs @@ -1,4 +1,6 @@ -namespace MiniExcelLib.Attributes; +using MiniExcelLib.Core.Helpers; + +namespace MiniExcelLib.Core.Attributes; [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field)] public class MiniExcelColumnAttribute : Attribute diff --git a/src/MiniExcel/Attributes/MiniExcelColumnIndexAttribute.cs b/src/MiniExcel.Core/Attributes/MiniExcelColumnIndexAttribute.cs similarity index 89% rename from src/MiniExcel/Attributes/MiniExcelColumnIndexAttribute.cs rename to src/MiniExcel.Core/Attributes/MiniExcelColumnIndexAttribute.cs index ff90f9be..73a44212 100644 --- a/src/MiniExcel/Attributes/MiniExcelColumnIndexAttribute.cs +++ b/src/MiniExcel.Core/Attributes/MiniExcelColumnIndexAttribute.cs @@ -1,4 +1,6 @@ -namespace MiniExcelLib.Attributes; +using MiniExcelLib.Core.Helpers; + +namespace MiniExcelLib.Core.Attributes; [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field)] public class MiniExcelColumnIndexAttribute : Attribute diff --git a/src/MiniExcel/Attributes/MiniExcelColumnNameAttribute.cs b/src/MiniExcel.Core/Attributes/MiniExcelColumnNameAttribute.cs similarity index 86% rename from src/MiniExcel/Attributes/MiniExcelColumnNameAttribute.cs rename to src/MiniExcel.Core/Attributes/MiniExcelColumnNameAttribute.cs index 6d46080a..ce38efeb 100644 --- a/src/MiniExcel/Attributes/MiniExcelColumnNameAttribute.cs +++ b/src/MiniExcel.Core/Attributes/MiniExcelColumnNameAttribute.cs @@ -1,4 +1,4 @@ -namespace MiniExcelLib.Attributes; +namespace MiniExcelLib.Core.Attributes; [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field)] public class MiniExcelColumnNameAttribute(string excelColumnName, string[]? aliases = null) : Attribute diff --git a/src/MiniExcel/Attributes/MiniExcelColumnWidthAttribute.cs b/src/MiniExcel.Core/Attributes/MiniExcelColumnWidthAttribute.cs similarity index 81% rename from src/MiniExcel/Attributes/MiniExcelColumnWidthAttribute.cs rename to src/MiniExcel.Core/Attributes/MiniExcelColumnWidthAttribute.cs index 2f75c776..4f9a7b6e 100644 --- a/src/MiniExcel/Attributes/MiniExcelColumnWidthAttribute.cs +++ b/src/MiniExcel.Core/Attributes/MiniExcelColumnWidthAttribute.cs @@ -1,4 +1,4 @@ -namespace MiniExcelLib.Attributes; +namespace MiniExcelLib.Core.Attributes; [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field)] public class MiniExcelColumnWidthAttribute(double excelColumnWidth) : Attribute diff --git a/src/MiniExcel/Attributes/MiniExcelFormatAttribute.cs b/src/MiniExcel.Core/Attributes/MiniExcelFormatAttribute.cs similarity index 79% rename from src/MiniExcel/Attributes/MiniExcelFormatAttribute.cs rename to src/MiniExcel.Core/Attributes/MiniExcelFormatAttribute.cs index 49de1d2f..6df4f1ae 100644 --- a/src/MiniExcel/Attributes/MiniExcelFormatAttribute.cs +++ b/src/MiniExcel.Core/Attributes/MiniExcelFormatAttribute.cs @@ -1,4 +1,4 @@ -namespace MiniExcelLib.Attributes; +namespace MiniExcelLib.Core.Attributes; [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field)] public class MiniExcelFormatAttribute(string format) : Attribute diff --git a/src/MiniExcel/Attributes/MiniExcelIgnoreAttribute.cs b/src/MiniExcel.Core/Attributes/MiniExcelIgnoreAttribute.cs similarity index 80% rename from src/MiniExcel/Attributes/MiniExcelIgnoreAttribute.cs rename to src/MiniExcel.Core/Attributes/MiniExcelIgnoreAttribute.cs index b7303f60..8b2c0692 100644 --- a/src/MiniExcel/Attributes/MiniExcelIgnoreAttribute.cs +++ b/src/MiniExcel.Core/Attributes/MiniExcelIgnoreAttribute.cs @@ -1,4 +1,4 @@ -namespace MiniExcelLib.Attributes; +namespace MiniExcelLib.Core.Attributes; [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field)] public class MiniExcelIgnoreAttribute(bool excelIgnore = true) : Attribute diff --git a/src/MiniExcel/DataReader/MiniExcelAsyncDataReader.cs b/src/MiniExcel.Core/DataReader/MiniExcelAsyncDataReader.cs similarity index 95% rename from src/MiniExcel/DataReader/MiniExcelAsyncDataReader.cs rename to src/MiniExcel.Core/DataReader/MiniExcelAsyncDataReader.cs index fa1a275e..aafdca80 100644 --- a/src/MiniExcel/DataReader/MiniExcelAsyncDataReader.cs +++ b/src/MiniExcel.Core/DataReader/MiniExcelAsyncDataReader.cs @@ -1,4 +1,4 @@ -namespace MiniExcelLib.DataReader; +namespace MiniExcelLib.Core.DataReader; // todo: this is way improvable, ideally the sync and async implementations into a single datareader public class MiniExcelAsyncDataReader : MiniExcelDataReaderBase, IAsyncDisposable diff --git a/src/MiniExcel/DataReader/MiniExcelDataReader.cs b/src/MiniExcel.Core/DataReader/MiniExcelDataReader.cs similarity index 94% rename from src/MiniExcel/DataReader/MiniExcelDataReader.cs rename to src/MiniExcel.Core/DataReader/MiniExcelDataReader.cs index c2a01277..df1d14e0 100644 --- a/src/MiniExcel/DataReader/MiniExcelDataReader.cs +++ b/src/MiniExcel.Core/DataReader/MiniExcelDataReader.cs @@ -1,4 +1,4 @@ -namespace MiniExcelLib.DataReader; +namespace MiniExcelLib.Core.DataReader; public class MiniExcelDataReader : MiniExcelDataReaderBase { diff --git a/src/MiniExcel/DataReader/MiniExcelDataReaderBase.cs b/src/MiniExcel.Core/DataReader/MiniExcelDataReaderBase.cs similarity index 95% rename from src/MiniExcel/DataReader/MiniExcelDataReaderBase.cs rename to src/MiniExcel.Core/DataReader/MiniExcelDataReaderBase.cs index 9ed4fdbd..e10811ec 100644 --- a/src/MiniExcel/DataReader/MiniExcelDataReaderBase.cs +++ b/src/MiniExcel.Core/DataReader/MiniExcelDataReaderBase.cs @@ -1,4 +1,6 @@ -namespace MiniExcelLib.DataReader; +using MiniExcelLib.Core.Abstractions; + +namespace MiniExcelLib.Core.DataReader; /// /// IMiniExcelDataReader Base Class diff --git a/src/MiniExcel/Enums/XlsxImgType.cs b/src/MiniExcel.Core/Enums/XlsxImgType.cs similarity index 91% rename from src/MiniExcel/Enums/XlsxImgType.cs rename to src/MiniExcel.Core/Enums/XlsxImgType.cs index 03c5c325..066ff335 100644 --- a/src/MiniExcel/Enums/XlsxImgType.cs +++ b/src/MiniExcel.Core/Enums/XlsxImgType.cs @@ -1,4 +1,4 @@ -namespace MiniExcelLib.Enums; +namespace MiniExcelLib.Core.Enums; /// /// Excel image display mode (whether the image aligns/scales with cells). diff --git a/src/MiniExcel/Exceptions/MiniExcelColumnNotFoundException.cs b/src/MiniExcel.Core/Exceptions/MiniExcelColumnNotFoundException.cs similarity index 90% rename from src/MiniExcel/Exceptions/MiniExcelColumnNotFoundException.cs rename to src/MiniExcel.Core/Exceptions/MiniExcelColumnNotFoundException.cs index dffec064..621bfafb 100644 --- a/src/MiniExcel/Exceptions/MiniExcelColumnNotFoundException.cs +++ b/src/MiniExcel.Core/Exceptions/MiniExcelColumnNotFoundException.cs @@ -1,4 +1,4 @@ -namespace MiniExcelLib.Exceptions; +namespace MiniExcelLib.Core.Exceptions; public class MiniExcelColumnNotFoundException( string? columnIndex, diff --git a/src/MiniExcel/Exceptions/MiniExcelInvalidCastException.cs b/src/MiniExcel.Core/Exceptions/MiniExcelInvalidCastException.cs similarity index 87% rename from src/MiniExcel/Exceptions/MiniExcelInvalidCastException.cs rename to src/MiniExcel.Core/Exceptions/MiniExcelInvalidCastException.cs index ef906a8d..2c883e0f 100644 --- a/src/MiniExcel/Exceptions/MiniExcelInvalidCastException.cs +++ b/src/MiniExcel.Core/Exceptions/MiniExcelInvalidCastException.cs @@ -1,4 +1,4 @@ -namespace MiniExcelLib.Exceptions; +namespace MiniExcelLib.Core.Exceptions; public class MiniExcelInvalidCastException(string columnName, int row, object value, Type invalidCastType, string message) : InvalidCastException(message) diff --git a/src/MiniExcel/GlobalUsings.cs b/src/MiniExcel.Core/GlobalUsings.cs similarity index 60% rename from src/MiniExcel/GlobalUsings.cs rename to src/MiniExcel.Core/GlobalUsings.cs index c38200dc..05f12759 100644 --- a/src/MiniExcel/GlobalUsings.cs +++ b/src/MiniExcel.Core/GlobalUsings.cs @@ -9,10 +9,9 @@ global using System.Text; global using System.Text.RegularExpressions; global using System.Xml; -global using MiniExcelLib.Abstractions; -global using MiniExcelLib.Attributes; -global using MiniExcelLib.Helpers; -global using MiniExcelLib.OpenXml; -global using MiniExcelLib.OpenXml.Utils; -global using MiniExcelLib.Reflection; +global using MiniExcelLib.Core.Abstractions; +global using MiniExcelLib.Core.Helpers; +global using MiniExcelLib.Core.OpenXml; +global using MiniExcelLib.Core.OpenXml.Utils; +global using MiniExcelLib.Core.Reflection; global using Zomp.SyncMethodGenerator; \ No newline at end of file diff --git a/src/MiniExcel/Helpers/AttributeExtension.cs b/src/MiniExcel.Core/Helpers/AttributeExtension.cs similarity index 94% rename from src/MiniExcel/Helpers/AttributeExtension.cs rename to src/MiniExcel.Core/Helpers/AttributeExtension.cs index 61484a7f..a8236785 100644 --- a/src/MiniExcel/Helpers/AttributeExtension.cs +++ b/src/MiniExcel.Core/Helpers/AttributeExtension.cs @@ -1,4 +1,4 @@ -namespace MiniExcelLib.Helpers; +namespace MiniExcelLib.Core.Helpers; internal static class AttributeExtension { diff --git a/src/MiniExcel/Helpers/ColumnHelper.cs b/src/MiniExcel.Core/Helpers/ColumnHelper.cs similarity index 95% rename from src/MiniExcel/Helpers/ColumnHelper.cs rename to src/MiniExcel.Core/Helpers/ColumnHelper.cs index 7e23be0a..b5d9ccba 100644 --- a/src/MiniExcel/Helpers/ColumnHelper.cs +++ b/src/MiniExcel.Core/Helpers/ColumnHelper.cs @@ -1,6 +1,6 @@ using System.Collections.Concurrent; -namespace MiniExcelLib.Helpers; +namespace MiniExcelLib.Core.Helpers; // For Row/Column Index public static class ColumnHelper diff --git a/src/MiniExcel/Helpers/FileHelper.cs b/src/MiniExcel.Core/Helpers/FileHelper.cs similarity index 78% rename from src/MiniExcel/Helpers/FileHelper.cs rename to src/MiniExcel.Core/Helpers/FileHelper.cs index a11518de..dbd1180c 100644 --- a/src/MiniExcel/Helpers/FileHelper.cs +++ b/src/MiniExcel.Core/Helpers/FileHelper.cs @@ -1,4 +1,4 @@ -namespace MiniExcelLib.Helpers; +namespace MiniExcelLib.Core.Helpers; public static class FileHelper { diff --git a/src/MiniExcel/Helpers/ImageHelper.cs b/src/MiniExcel.Core/Helpers/ImageHelper.cs similarity index 93% rename from src/MiniExcel/Helpers/ImageHelper.cs rename to src/MiniExcel.Core/Helpers/ImageHelper.cs index 1350b2c4..97013e66 100644 --- a/src/MiniExcel/Helpers/ImageHelper.cs +++ b/src/MiniExcel.Core/Helpers/ImageHelper.cs @@ -1,4 +1,4 @@ -namespace MiniExcelLib.Helpers; +namespace MiniExcelLib.Core.Helpers; internal static class ImageHelper { diff --git a/src/MiniExcel/Helpers/ListHelper.cs b/src/MiniExcel.Core/Helpers/ListHelper.cs similarity index 88% rename from src/MiniExcel/Helpers/ListHelper.cs rename to src/MiniExcel.Core/Helpers/ListHelper.cs index 3d89a84a..e6cc173b 100644 --- a/src/MiniExcel/Helpers/ListHelper.cs +++ b/src/MiniExcel.Core/Helpers/ListHelper.cs @@ -1,4 +1,4 @@ -namespace MiniExcelLib.Helpers; +namespace MiniExcelLib.Core.Helpers; internal static class ListHelper { diff --git a/src/MiniExcel/Helpers/SafeStreamWriter.cs b/src/MiniExcel.Core/Helpers/SafeStreamWriter.cs similarity index 94% rename from src/MiniExcel/Helpers/SafeStreamWriter.cs rename to src/MiniExcel.Core/Helpers/SafeStreamWriter.cs index 4a88409e..e147263c 100644 --- a/src/MiniExcel/Helpers/SafeStreamWriter.cs +++ b/src/MiniExcel.Core/Helpers/SafeStreamWriter.cs @@ -1,4 +1,4 @@ -namespace MiniExcelLib.Helpers; +namespace MiniExcelLib.Core.Helpers; internal partial class SafeStreamWriter(Stream stream, Encoding encoding, int bufferSize) : IDisposable { diff --git a/src/MiniExcel/Helpers/StringHelper.cs b/src/MiniExcel.Core/Helpers/StringHelper.cs similarity index 83% rename from src/MiniExcel/Helpers/StringHelper.cs rename to src/MiniExcel.Core/Helpers/StringHelper.cs index 9d5d7aae..94ff906b 100644 --- a/src/MiniExcel/Helpers/StringHelper.cs +++ b/src/MiniExcel.Core/Helpers/StringHelper.cs @@ -1,4 +1,4 @@ -namespace MiniExcelLib.Helpers; +namespace MiniExcelLib.Core.Helpers; internal static class StringHelper { diff --git a/src/MiniExcel/Helpers/TaskHelper.cs b/src/MiniExcel.Core/Helpers/TaskHelper.cs similarity index 90% rename from src/MiniExcel/Helpers/TaskHelper.cs rename to src/MiniExcel.Core/Helpers/TaskHelper.cs index 258e77ec..909e5691 100644 --- a/src/MiniExcel/Helpers/TaskHelper.cs +++ b/src/MiniExcel.Core/Helpers/TaskHelper.cs @@ -1,4 +1,4 @@ -namespace MiniExcelLib.Helpers; +namespace MiniExcelLib.Core.Helpers; internal static class TaskHelper { diff --git a/src/MiniExcel/Helpers/ThrowHelper.cs b/src/MiniExcel.Core/Helpers/ThrowHelper.cs similarity index 91% rename from src/MiniExcel/Helpers/ThrowHelper.cs rename to src/MiniExcel.Core/Helpers/ThrowHelper.cs index 46b43097..892e0645 100644 --- a/src/MiniExcel/Helpers/ThrowHelper.cs +++ b/src/MiniExcel.Core/Helpers/ThrowHelper.cs @@ -1,4 +1,4 @@ -namespace MiniExcelLib.Helpers; +namespace MiniExcelLib.Core.Helpers; internal static class ThrowHelper { diff --git a/src/MiniExcel/Helpers/TypeHelper.cs b/src/MiniExcel.Core/Helpers/TypeHelper.cs similarity index 94% rename from src/MiniExcel/Helpers/TypeHelper.cs rename to src/MiniExcel.Core/Helpers/TypeHelper.cs index e6150393..1ba86cbf 100644 --- a/src/MiniExcel/Helpers/TypeHelper.cs +++ b/src/MiniExcel.Core/Helpers/TypeHelper.cs @@ -1,4 +1,4 @@ -namespace MiniExcelLib.Helpers; +namespace MiniExcelLib.Core.Helpers; internal static class TypeHelper { diff --git a/src/MiniExcel/Helpers/XmlHelper.cs b/src/MiniExcel.Core/Helpers/XmlHelper.cs similarity index 95% rename from src/MiniExcel/Helpers/XmlHelper.cs rename to src/MiniExcel.Core/Helpers/XmlHelper.cs index b362e420..ea12a6bf 100644 --- a/src/MiniExcel/Helpers/XmlHelper.cs +++ b/src/MiniExcel.Core/Helpers/XmlHelper.cs @@ -1,4 +1,4 @@ -namespace MiniExcelLib.Helpers; +namespace MiniExcelLib.Core.Helpers; /// XmlEncoder MIT Copyright ©2021 from https://github.com/ClosedXML internal static partial class XmlHelper diff --git a/src/MiniExcel.Core/MiniExcel.Core.csproj b/src/MiniExcel.Core/MiniExcel.Core.csproj new file mode 100644 index 00000000..7db6767f --- /dev/null +++ b/src/MiniExcel.Core/MiniExcel.Core.csproj @@ -0,0 +1,16 @@ + + + + MiniExcelLib.Core + + + + MiniExcel.Core + MiniExcel.Core + + + + + + + diff --git a/src/MiniExcel/MiniExcel.cs b/src/MiniExcel.Core/MiniExcel.cs similarity index 87% rename from src/MiniExcel/MiniExcel.cs rename to src/MiniExcel.Core/MiniExcel.cs index 03cd049d..34827555 100644 --- a/src/MiniExcel/MiniExcel.cs +++ b/src/MiniExcel.Core/MiniExcel.cs @@ -1,4 +1,4 @@ -namespace MiniExcelLib; +namespace MiniExcelLib.Core; public static class MiniExcel { diff --git a/src/MiniExcel/MiniExcelConfiguration.cs b/src/MiniExcel.Core/MiniExcelConfiguration.cs similarity index 86% rename from src/MiniExcel/MiniExcelConfiguration.cs rename to src/MiniExcel.Core/MiniExcelConfiguration.cs index 85ab2bf9..e5ec3ea0 100644 --- a/src/MiniExcel/MiniExcelConfiguration.cs +++ b/src/MiniExcel.Core/MiniExcelConfiguration.cs @@ -1,4 +1,6 @@ -namespace MiniExcelLib; +using MiniExcelLib.Core.Attributes; + +namespace MiniExcelLib.Core; public interface IMiniExcelConfiguration; diff --git a/src/MiniExcel/MiniExcelProviders.cs b/src/MiniExcel.Core/MiniExcelProviders.cs similarity index 53% rename from src/MiniExcel/MiniExcelProviders.cs rename to src/MiniExcel.Core/MiniExcelProviders.cs index 25031de0..9a15527c 100644 --- a/src/MiniExcel/MiniExcelProviders.cs +++ b/src/MiniExcel.Core/MiniExcelProviders.cs @@ -1,24 +1,22 @@ -using MiniExcelLib.OpenXml.Providers; - -namespace MiniExcelLib; +namespace MiniExcelLib.Core; public sealed class MiniExcelImporterProvider { internal MiniExcelImporterProvider() { } - public OpenXmlImporter GetExcelImporter() => new(); + public OpenXmlImporter GetOpenXmlImporter() => new(); } public sealed class MiniExcelExporterProvider { internal MiniExcelExporterProvider() { } - public OpenXmlExporter GetExcelExporter() => new(); + public OpenXmlExporter GetOpenXmlExporter() => new(); } public sealed class MiniExcelTemplaterProvider { internal MiniExcelTemplaterProvider() { } - public OpenXmlTemplater GetExcelTemplater() => new(); + public OpenXmlTemplater GetOpenXmlTemplater() => new(); } diff --git a/src/MiniExcel/OpenXml/Attributes/ExcelSheetAttribute.cs b/src/MiniExcel.Core/OpenXml/Attributes/ExcelSheetAttribute.cs similarity index 75% rename from src/MiniExcel/OpenXml/Attributes/ExcelSheetAttribute.cs rename to src/MiniExcel.Core/OpenXml/Attributes/ExcelSheetAttribute.cs index 1d2f921e..fc2011f1 100644 --- a/src/MiniExcel/OpenXml/Attributes/ExcelSheetAttribute.cs +++ b/src/MiniExcel.Core/OpenXml/Attributes/ExcelSheetAttribute.cs @@ -1,6 +1,6 @@ -using MiniExcelLib.OpenXml.Models; +using MiniExcelLib.Core.OpenXml.Models; -namespace MiniExcelLib.OpenXml.Attributes; +namespace MiniExcelLib.Core.OpenXml.Attributes; [AttributeUsage(AttributeTargets.Class)] public class ExcelSheetAttribute : Attribute diff --git a/src/MiniExcel/OpenXml/Constants/ExcelContentTypes.cs b/src/MiniExcel.Core/OpenXml/Constants/ExcelContentTypes.cs similarity index 92% rename from src/MiniExcel/OpenXml/Constants/ExcelContentTypes.cs rename to src/MiniExcel.Core/OpenXml/Constants/ExcelContentTypes.cs index dcef2d61..6ef0fe98 100644 --- a/src/MiniExcel/OpenXml/Constants/ExcelContentTypes.cs +++ b/src/MiniExcel.Core/OpenXml/Constants/ExcelContentTypes.cs @@ -1,4 +1,4 @@ -namespace MiniExcelLib.OpenXml.Constants; +namespace MiniExcelLib.Core.OpenXml.Constants; internal static class ExcelContentTypes { diff --git a/src/MiniExcel/OpenXml/Constants/ExcelFileNames.cs b/src/MiniExcel.Core/OpenXml/Constants/ExcelFileNames.cs similarity index 91% rename from src/MiniExcel/OpenXml/Constants/ExcelFileNames.cs rename to src/MiniExcel.Core/OpenXml/Constants/ExcelFileNames.cs index 1ea810f6..0f7a6f26 100644 --- a/src/MiniExcel/OpenXml/Constants/ExcelFileNames.cs +++ b/src/MiniExcel.Core/OpenXml/Constants/ExcelFileNames.cs @@ -1,4 +1,4 @@ -namespace MiniExcelLib.OpenXml.Constants; +namespace MiniExcelLib.Core.OpenXml.Constants; internal static class ExcelFileNames { diff --git a/src/MiniExcel/OpenXml/Constants/ExcelXml.cs b/src/MiniExcel.Core/OpenXml/Constants/ExcelXml.cs similarity index 96% rename from src/MiniExcel/OpenXml/Constants/ExcelXml.cs rename to src/MiniExcel.Core/OpenXml/Constants/ExcelXml.cs index 87e87cb1..d5fd0639 100644 --- a/src/MiniExcel/OpenXml/Constants/ExcelXml.cs +++ b/src/MiniExcel.Core/OpenXml/Constants/ExcelXml.cs @@ -1,6 +1,7 @@ -using MiniExcelLib.OpenXml.Models; +using MiniExcelLib.Core.Helpers; +using MiniExcelLib.Core.OpenXml.Models; -namespace MiniExcelLib.OpenXml.Constants; +namespace MiniExcelLib.Core.OpenXml.Constants; internal static class ExcelXml { diff --git a/src/MiniExcel/OpenXml/Constants/Schemas.cs b/src/MiniExcel.Core/OpenXml/Constants/Schemas.cs similarity index 91% rename from src/MiniExcel/OpenXml/Constants/Schemas.cs rename to src/MiniExcel.Core/OpenXml/Constants/Schemas.cs index 72c2e08f..8af3ea62 100644 --- a/src/MiniExcel/OpenXml/Constants/Schemas.cs +++ b/src/MiniExcel.Core/OpenXml/Constants/Schemas.cs @@ -1,4 +1,4 @@ -namespace MiniExcelLib.OpenXml.Constants; +namespace MiniExcelLib.Core.OpenXml.Constants; internal static class Schemas { diff --git a/src/MiniExcel/OpenXml/Constants/WorksheetXml.cs b/src/MiniExcel.Core/OpenXml/Constants/WorksheetXml.cs similarity index 96% rename from src/MiniExcel/OpenXml/Constants/WorksheetXml.cs rename to src/MiniExcel.Core/OpenXml/Constants/WorksheetXml.cs index ef5f8532..a82e5f11 100644 --- a/src/MiniExcel/OpenXml/Constants/WorksheetXml.cs +++ b/src/MiniExcel.Core/OpenXml/Constants/WorksheetXml.cs @@ -1,4 +1,6 @@ -namespace MiniExcelLib.OpenXml.Constants; +using MiniExcelLib.Core.Attributes; + +namespace MiniExcelLib.Core.OpenXml.Constants; internal static class WorksheetXml { diff --git a/src/MiniExcel/OpenXml/Models/DrawingDto.cs b/src/MiniExcel.Core/OpenXml/Models/DrawingDto.cs similarity index 64% rename from src/MiniExcel/OpenXml/Models/DrawingDto.cs rename to src/MiniExcel.Core/OpenXml/Models/DrawingDto.cs index 43ddbcf4..3a8ba087 100644 --- a/src/MiniExcel/OpenXml/Models/DrawingDto.cs +++ b/src/MiniExcel.Core/OpenXml/Models/DrawingDto.cs @@ -1,4 +1,4 @@ -namespace MiniExcelLib.OpenXml.Models; +namespace MiniExcelLib.Core.OpenXml.Models; internal class DrawingDto { diff --git a/src/MiniExcel/OpenXml/Models/ExcelRange.cs b/src/MiniExcel.Core/OpenXml/Models/ExcelRange.cs similarity index 91% rename from src/MiniExcel/OpenXml/Models/ExcelRange.cs rename to src/MiniExcel.Core/OpenXml/Models/ExcelRange.cs index bea1fd20..b541c7c8 100644 --- a/src/MiniExcel/OpenXml/Models/ExcelRange.cs +++ b/src/MiniExcel.Core/OpenXml/Models/ExcelRange.cs @@ -1,4 +1,4 @@ -namespace MiniExcelLib.OpenXml.Models; +namespace MiniExcelLib.Core.OpenXml.Models; public class ExcelRangeElement { diff --git a/src/MiniExcel/OpenXml/Models/ExcelWidthCollection.cs b/src/MiniExcel.Core/OpenXml/Models/ExcelWidthCollection.cs similarity index 93% rename from src/MiniExcel/OpenXml/Models/ExcelWidthCollection.cs rename to src/MiniExcel.Core/OpenXml/Models/ExcelWidthCollection.cs index e1ac0d38..b122fc07 100644 --- a/src/MiniExcel/OpenXml/Models/ExcelWidthCollection.cs +++ b/src/MiniExcel.Core/OpenXml/Models/ExcelWidthCollection.cs @@ -1,4 +1,6 @@ -namespace MiniExcelLib.OpenXml.Models; +using MiniExcelLib.Core.Reflection; + +namespace MiniExcelLib.Core.OpenXml.Models; public sealed class ExcelColumnWidth { diff --git a/src/MiniExcel/OpenXml/Models/ExcellSheetInfo.cs b/src/MiniExcel.Core/OpenXml/Models/ExcellSheetInfo.cs similarity index 88% rename from src/MiniExcel/OpenXml/Models/ExcellSheetInfo.cs rename to src/MiniExcel.Core/OpenXml/Models/ExcellSheetInfo.cs index 57cb3efd..79cd8869 100644 --- a/src/MiniExcel/OpenXml/Models/ExcellSheetInfo.cs +++ b/src/MiniExcel.Core/OpenXml/Models/ExcellSheetInfo.cs @@ -1,4 +1,4 @@ -namespace MiniExcelLib.OpenXml.Models; +namespace MiniExcelLib.Core.OpenXml.Models; internal class ExcellSheetInfo { diff --git a/src/MiniExcel/OpenXml/Models/FileDto.cs b/src/MiniExcel.Core/OpenXml/Models/FileDto.cs similarity index 88% rename from src/MiniExcel/OpenXml/Models/FileDto.cs rename to src/MiniExcel.Core/OpenXml/Models/FileDto.cs index 8bb581f5..6a6ddc4a 100644 --- a/src/MiniExcel/OpenXml/Models/FileDto.cs +++ b/src/MiniExcel.Core/OpenXml/Models/FileDto.cs @@ -1,4 +1,4 @@ -namespace MiniExcelLib.OpenXml.Models; +namespace MiniExcelLib.Core.OpenXml.Models; internal class FileDto { diff --git a/src/MiniExcel/OpenXml/Models/MergeCells.cs b/src/MiniExcel.Core/OpenXml/Models/MergeCells.cs similarity index 77% rename from src/MiniExcel/OpenXml/Models/MergeCells.cs rename to src/MiniExcel.Core/OpenXml/Models/MergeCells.cs index b5b4ba3b..a8c41919 100644 --- a/src/MiniExcel/OpenXml/Models/MergeCells.cs +++ b/src/MiniExcel.Core/OpenXml/Models/MergeCells.cs @@ -1,4 +1,4 @@ -namespace MiniExcelLib.OpenXml.Models; +namespace MiniExcelLib.Core.OpenXml.Models; internal class MergeCells { diff --git a/src/MiniExcel/OpenXml/Models/SheetDto.cs b/src/MiniExcel.Core/OpenXml/Models/SheetDto.cs similarity index 82% rename from src/MiniExcel/OpenXml/Models/SheetDto.cs rename to src/MiniExcel.Core/OpenXml/Models/SheetDto.cs index 1bea641f..c18cb0ea 100644 --- a/src/MiniExcel/OpenXml/Models/SheetDto.cs +++ b/src/MiniExcel.Core/OpenXml/Models/SheetDto.cs @@ -1,4 +1,4 @@ -namespace MiniExcelLib.OpenXml.Models; +namespace MiniExcelLib.Core.OpenXml.Models; internal class SheetDto { diff --git a/src/MiniExcel/OpenXml/Models/SheetInfo.cs b/src/MiniExcel.Core/OpenXml/Models/SheetInfo.cs similarity index 91% rename from src/MiniExcel/OpenXml/Models/SheetInfo.cs rename to src/MiniExcel.Core/OpenXml/Models/SheetInfo.cs index ac063d16..5bea92b2 100644 --- a/src/MiniExcel/OpenXml/Models/SheetInfo.cs +++ b/src/MiniExcel.Core/OpenXml/Models/SheetInfo.cs @@ -1,4 +1,4 @@ -namespace MiniExcelLib.OpenXml.Models; +namespace MiniExcelLib.Core.OpenXml.Models; public class SheetInfo(uint id, uint index, string name, SheetState sheetState, bool active) { diff --git a/src/MiniExcel/OpenXml/Models/SheetRecord.cs b/src/MiniExcel.Core/OpenXml/Models/SheetRecord.cs similarity index 92% rename from src/MiniExcel/OpenXml/Models/SheetRecord.cs rename to src/MiniExcel.Core/OpenXml/Models/SheetRecord.cs index 57747254..2bc57d71 100644 --- a/src/MiniExcel/OpenXml/Models/SheetRecord.cs +++ b/src/MiniExcel.Core/OpenXml/Models/SheetRecord.cs @@ -1,4 +1,4 @@ -namespace MiniExcelLib.OpenXml.Models; +namespace MiniExcelLib.Core.OpenXml.Models; internal sealed class SheetRecord(string name, string state, uint id, string rid, bool active) { diff --git a/src/MiniExcel/OpenXml/OpenXmlConfiguration.cs b/src/MiniExcel.Core/OpenXml/OpenXmlConfiguration.cs similarity index 89% rename from src/MiniExcel/OpenXml/OpenXmlConfiguration.cs rename to src/MiniExcel.Core/OpenXml/OpenXmlConfiguration.cs index a1a3531b..4c0c3a00 100644 --- a/src/MiniExcel/OpenXml/OpenXmlConfiguration.cs +++ b/src/MiniExcel.Core/OpenXml/OpenXmlConfiguration.cs @@ -1,7 +1,7 @@ -using MiniExcelLib.OpenXml.Attributes; -using MiniExcelLib.OpenXml.Styles; +using MiniExcelLib.Core.OpenXml.Attributes; +using MiniExcelLib.Core.OpenXml.Styles; -namespace MiniExcelLib.OpenXml; +namespace MiniExcelLib.Core.OpenXml; public class OpenXmlConfiguration : MiniExcelBaseConfiguration { diff --git a/src/MiniExcel/OpenXml/OpenXmlReader.cs b/src/MiniExcel.Core/OpenXml/OpenXmlReader.cs similarity index 96% rename from src/MiniExcel/OpenXml/OpenXmlReader.cs rename to src/MiniExcel.Core/OpenXml/OpenXmlReader.cs index 2083eda6..1cbfd8bd 100644 --- a/src/MiniExcel/OpenXml/OpenXmlReader.cs +++ b/src/MiniExcel.Core/OpenXml/OpenXmlReader.cs @@ -1,15 +1,17 @@ using System.Collections.ObjectModel; -using MiniExcelLib.OpenXml.Constants; -using MiniExcelLib.OpenXml.Models; -using MiniExcelLib.OpenXml.Styles; -using MiniExcelLib.OpenXml.Zip; -using IMiniExcelReader = MiniExcelLib.Abstractions.IMiniExcelReader; -using MiniExcelMapper = MiniExcelLib.Reflection.MiniExcelMapper; -using XmlReaderHelper = MiniExcelLib.OpenXml.Utils.XmlReaderHelper; - -namespace MiniExcelLib.OpenXml; - -internal partial class OpenXmlReader : IMiniExcelReader +using MiniExcelLib.Core.Helpers; +using MiniExcelLib.Core.OpenXml.Constants; +using MiniExcelLib.Core.OpenXml.Models; +using MiniExcelLib.Core.OpenXml.Styles; +using MiniExcelLib.Core.OpenXml.Utils; +using MiniExcelLib.Core.OpenXml.Zip; +using MiniExcelLib.Core.Reflection; +using MiniExcelMapper = MiniExcelLib.Core.Reflection.MiniExcelMapper; +using XmlReaderHelper = MiniExcelLib.Core.OpenXml.Utils.XmlReaderHelper; + +namespace MiniExcelLib.Core.OpenXml; + +internal partial class OpenXmlReader : Abstractions.IMiniExcelReader { private static readonly string[] Ns = [Schemas.SpreadsheetmlXmlns, Schemas.SpreadsheetmlXmlStrictns]; private static readonly string[] RelationshiopNs = [Schemas.SpreadsheetmlXmlRelationshipns, Schemas.SpreadsheetmlXmlStrictRelationshipns]; diff --git a/src/MiniExcel/OpenXml/OpenXmlWriter.DefaultOpenXml.cs b/src/MiniExcel.Core/OpenXml/OpenXmlWriter.DefaultOpenXml.cs similarity index 94% rename from src/MiniExcel/OpenXml/OpenXmlWriter.DefaultOpenXml.cs rename to src/MiniExcel.Core/OpenXml/OpenXmlWriter.DefaultOpenXml.cs index db5ff468..47178af3 100644 --- a/src/MiniExcel/OpenXml/OpenXmlWriter.DefaultOpenXml.cs +++ b/src/MiniExcel.Core/OpenXml/OpenXmlWriter.DefaultOpenXml.cs @@ -1,12 +1,14 @@ -using MiniExcelLib.OpenXml.Constants; -using MiniExcelLib.OpenXml.Models; -using MiniExcelLib.OpenXml.Zip; -using static MiniExcelLib.Helpers.ImageHelper; -using IMiniExcelWriter = MiniExcelLib.Abstractions.IMiniExcelWriter; +using MiniExcelLib.Core.Helpers; +using MiniExcelLib.Core.OpenXml.Constants; +using MiniExcelLib.Core.OpenXml.Models; +using MiniExcelLib.Core.OpenXml.Utils; +using MiniExcelLib.Core.OpenXml.Zip; +using MiniExcelLib.Core.Reflection; +using static MiniExcelLib.Core.Helpers.ImageHelper; -namespace MiniExcelLib.OpenXml; +namespace MiniExcelLib.Core.OpenXml; -internal partial class OpenXmlWriter : IMiniExcelWriter +internal partial class OpenXmlWriter : Abstractions.IMiniExcelWriter { private readonly Dictionary _zipDictionary = []; private Dictionary _cellXfIdMap; diff --git a/src/MiniExcel/OpenXml/OpenXmlWriter.cs b/src/MiniExcel.Core/OpenXml/OpenXmlWriter.cs similarity index 95% rename from src/MiniExcel/OpenXml/OpenXmlWriter.cs rename to src/MiniExcel.Core/OpenXml/OpenXmlWriter.cs index c013dd80..4d0b2acc 100644 --- a/src/MiniExcel/OpenXml/OpenXmlWriter.cs +++ b/src/MiniExcel.Core/OpenXml/OpenXmlWriter.cs @@ -1,19 +1,21 @@ using System.Xml.Linq; -using MiniExcelLib.OpenXml.Constants; -using MiniExcelLib.OpenXml.Models; -using MiniExcelLib.OpenXml.Styles; -using MiniExcelLib.OpenXml.Styles.Builder; -using MiniExcelLib.OpenXml.Zip; -using MiniExcelLib.WriteAdapters; -using DefaultSheetStyleBuilder = MiniExcelLib.OpenXml.Styles.Builder.DefaultSheetStyleBuilder; -using IMiniExcelWriter = MiniExcelLib.Abstractions.IMiniExcelWriter; -using ISheetStyleBuilder = MiniExcelLib.OpenXml.Styles.Builder.ISheetStyleBuilder; -using MinimalSheetStyleBuilder = MiniExcelLib.OpenXml.Styles.Builder.MinimalSheetStyleBuilder; -using SafeStreamWriter = MiniExcelLib.Helpers.SafeStreamWriter; - -namespace MiniExcelLib.OpenXml; - -internal partial class OpenXmlWriter : IMiniExcelWriter +using MiniExcelLib.Core.Abstractions; +using MiniExcelLib.Core.Helpers; +using MiniExcelLib.Core.OpenXml.Constants; +using MiniExcelLib.Core.OpenXml.Models; +using MiniExcelLib.Core.OpenXml.Styles.Builder; +using MiniExcelLib.Core.OpenXml.Utils; +using MiniExcelLib.Core.OpenXml.Zip; +using MiniExcelLib.Core.Reflection; +using MiniExcelLib.Core.WriteAdapters; +using DefaultSheetStyleBuilder = MiniExcelLib.Core.OpenXml.Styles.Builder.DefaultSheetStyleBuilder; +using ISheetStyleBuilder = MiniExcelLib.Core.OpenXml.Styles.Builder.ISheetStyleBuilder; +using MinimalSheetStyleBuilder = MiniExcelLib.Core.OpenXml.Styles.Builder.MinimalSheetStyleBuilder; +using SafeStreamWriter = MiniExcelLib.Core.Helpers.SafeStreamWriter; + +namespace MiniExcelLib.Core.OpenXml; + +internal partial class OpenXmlWriter : Abstractions.IMiniExcelWriter { private static readonly UTF8Encoding Utf8WithBom = new(true); diff --git a/src/MiniExcel/OpenXml/Picture/OpenXmlPicture.cs b/src/MiniExcel.Core/OpenXml/Picture/OpenXmlPicture.cs similarity index 83% rename from src/MiniExcel/OpenXml/Picture/OpenXmlPicture.cs rename to src/MiniExcel.Core/OpenXml/Picture/OpenXmlPicture.cs index ef692395..b0c471a3 100644 --- a/src/MiniExcel/OpenXml/Picture/OpenXmlPicture.cs +++ b/src/MiniExcel.Core/OpenXml/Picture/OpenXmlPicture.cs @@ -1,7 +1,8 @@ using System.Drawing; -using MiniExcelLib.Enums; +using MiniExcelLib.Core.Enums; +using MiniExcelLib.Core.OpenXml.Utils; -namespace MiniExcelLib.OpenXml.Picture; +namespace MiniExcelLib.Core.OpenXml.Picture; public class MiniExcelPicture { diff --git a/src/MiniExcel/OpenXml/Picture/OpenXmlPictureImplement.cs b/src/MiniExcel.Core/OpenXml/Picture/OpenXmlPictureImplement.cs similarity index 97% rename from src/MiniExcel/OpenXml/Picture/OpenXmlPictureImplement.cs rename to src/MiniExcel.Core/OpenXml/Picture/OpenXmlPictureImplement.cs index 750e5214..602658aa 100644 --- a/src/MiniExcel/OpenXml/Picture/OpenXmlPictureImplement.cs +++ b/src/MiniExcel.Core/OpenXml/Picture/OpenXmlPictureImplement.cs @@ -1,8 +1,8 @@ using System.Drawing; -using MiniExcelLib.Enums; -using MiniExcelLib.OpenXml.Zip; +using MiniExcelLib.Core.Enums; +using MiniExcelLib.Core.OpenXml.Zip; -namespace MiniExcelLib.OpenXml.Picture; +namespace MiniExcelLib.Core.OpenXml.Picture; internal static partial class MiniExcelPictureImplement { diff --git a/src/MiniExcel/OpenXml/Styles/Builder/DefaultSheetStyleBuilder.cs b/src/MiniExcel.Core/OpenXml/Styles/Builder/DefaultSheetStyleBuilder.cs similarity index 98% rename from src/MiniExcel/OpenXml/Styles/Builder/DefaultSheetStyleBuilder.cs rename to src/MiniExcel.Core/OpenXml/Styles/Builder/DefaultSheetStyleBuilder.cs index 6988519f..3f4d387e 100644 --- a/src/MiniExcel/OpenXml/Styles/Builder/DefaultSheetStyleBuilder.cs +++ b/src/MiniExcel.Core/OpenXml/Styles/Builder/DefaultSheetStyleBuilder.cs @@ -1,4 +1,4 @@ -namespace MiniExcelLib.OpenXml.Styles.Builder; +namespace MiniExcelLib.Core.OpenXml.Styles.Builder; internal partial class DefaultSheetStyleBuilder(SheetStyleBuildContext context, OpenXmlStyleOptions styleOptions) : SheetStyleBuilderBase(context) diff --git a/src/MiniExcel/OpenXml/Styles/Builder/ISheetStyleBuilder.cs b/src/MiniExcel.Core/OpenXml/Styles/Builder/ISheetStyleBuilder.cs similarity index 73% rename from src/MiniExcel/OpenXml/Styles/Builder/ISheetStyleBuilder.cs rename to src/MiniExcel.Core/OpenXml/Styles/Builder/ISheetStyleBuilder.cs index b7423b25..7e8685a6 100644 --- a/src/MiniExcel/OpenXml/Styles/Builder/ISheetStyleBuilder.cs +++ b/src/MiniExcel.Core/OpenXml/Styles/Builder/ISheetStyleBuilder.cs @@ -1,4 +1,4 @@ -namespace MiniExcelLib.OpenXml.Styles.Builder; +namespace MiniExcelLib.Core.OpenXml.Styles.Builder; internal partial interface ISheetStyleBuilder { diff --git a/src/MiniExcel/OpenXml/Styles/Builder/MinimalSheetStyleBuilder.cs b/src/MiniExcel.Core/OpenXml/Styles/Builder/MinimalSheetStyleBuilder.cs similarity index 96% rename from src/MiniExcel/OpenXml/Styles/Builder/MinimalSheetStyleBuilder.cs rename to src/MiniExcel.Core/OpenXml/Styles/Builder/MinimalSheetStyleBuilder.cs index d851f239..89f6e766 100644 --- a/src/MiniExcel/OpenXml/Styles/Builder/MinimalSheetStyleBuilder.cs +++ b/src/MiniExcel.Core/OpenXml/Styles/Builder/MinimalSheetStyleBuilder.cs @@ -1,4 +1,4 @@ -namespace MiniExcelLib.OpenXml.Styles.Builder; +namespace MiniExcelLib.Core.OpenXml.Styles.Builder; internal partial class MinimalSheetStyleBuilder(SheetStyleBuildContext context) : SheetStyleBuilderBase(context) { diff --git a/src/MiniExcel/OpenXml/Styles/Builder/SheetStyleBuildContext.cs b/src/MiniExcel.Core/OpenXml/Styles/Builder/SheetStyleBuildContext.cs similarity index 96% rename from src/MiniExcel/OpenXml/Styles/Builder/SheetStyleBuildContext.cs rename to src/MiniExcel.Core/OpenXml/Styles/Builder/SheetStyleBuildContext.cs index 8dac140c..e24453f6 100644 --- a/src/MiniExcel/OpenXml/Styles/Builder/SheetStyleBuildContext.cs +++ b/src/MiniExcel.Core/OpenXml/Styles/Builder/SheetStyleBuildContext.cs @@ -1,7 +1,9 @@ -using MiniExcelLib.OpenXml.Constants; -using MiniExcelLib.OpenXml.Zip; +using MiniExcelLib.Core.Attributes; +using MiniExcelLib.Core.Helpers; +using MiniExcelLib.Core.OpenXml.Constants; +using MiniExcelLib.Core.OpenXml.Zip; -namespace MiniExcelLib.OpenXml.Styles.Builder; +namespace MiniExcelLib.Core.OpenXml.Styles.Builder; internal class SheetStyleBuildContext : IDisposable { diff --git a/src/MiniExcel/OpenXml/Styles/Builder/SheetStyleBuildResult.cs b/src/MiniExcel.Core/OpenXml/Styles/Builder/SheetStyleBuildResult.cs similarity index 72% rename from src/MiniExcel/OpenXml/Styles/Builder/SheetStyleBuildResult.cs rename to src/MiniExcel.Core/OpenXml/Styles/Builder/SheetStyleBuildResult.cs index 53a504d4..47b63da7 100644 --- a/src/MiniExcel/OpenXml/Styles/Builder/SheetStyleBuildResult.cs +++ b/src/MiniExcel.Core/OpenXml/Styles/Builder/SheetStyleBuildResult.cs @@ -1,4 +1,4 @@ -namespace MiniExcelLib.OpenXml.Styles.Builder; +namespace MiniExcelLib.Core.OpenXml.Styles.Builder; internal class SheetStyleBuildResult(Dictionary cellXfIdMap) { diff --git a/src/MiniExcel/OpenXml/Styles/Builder/SheetStyleBuilderBase.cs b/src/MiniExcel.Core/OpenXml/Styles/Builder/SheetStyleBuilderBase.cs similarity index 97% rename from src/MiniExcel/OpenXml/Styles/Builder/SheetStyleBuilderBase.cs rename to src/MiniExcel.Core/OpenXml/Styles/Builder/SheetStyleBuilderBase.cs index f0f8c9e9..10129602 100644 --- a/src/MiniExcel/OpenXml/Styles/Builder/SheetStyleBuilderBase.cs +++ b/src/MiniExcel.Core/OpenXml/Styles/Builder/SheetStyleBuilderBase.cs @@ -1,4 +1,4 @@ -namespace MiniExcelLib.OpenXml.Styles.Builder; +namespace MiniExcelLib.Core.OpenXml.Styles.Builder; internal abstract partial class SheetStyleBuilderBase(SheetStyleBuildContext context) : ISheetStyleBuilder { diff --git a/src/MiniExcel/OpenXml/Styles/Builder/SheetStyleBuilderHelper.cs b/src/MiniExcel.Core/OpenXml/Styles/Builder/SheetStyleBuilderHelper.cs similarity index 81% rename from src/MiniExcel/OpenXml/Styles/Builder/SheetStyleBuilderHelper.cs rename to src/MiniExcel.Core/OpenXml/Styles/Builder/SheetStyleBuilderHelper.cs index d024a79d..1e4a60c9 100644 --- a/src/MiniExcel/OpenXml/Styles/Builder/SheetStyleBuilderHelper.cs +++ b/src/MiniExcel.Core/OpenXml/Styles/Builder/SheetStyleBuilderHelper.cs @@ -1,4 +1,7 @@ -namespace MiniExcelLib.OpenXml.Styles.Builder; +using MiniExcelLib.Core.Attributes; +using MiniExcelLib.Core.OpenXml.Utils; + +namespace MiniExcelLib.Core.OpenXml.Styles.Builder; public static class SheetStyleBuilderHelper { diff --git a/src/MiniExcel/OpenXml/Styles/OpenXmlStyleOptions.cs b/src/MiniExcel.Core/OpenXml/Styles/OpenXmlStyleOptions.cs similarity index 63% rename from src/MiniExcel/OpenXml/Styles/OpenXmlStyleOptions.cs rename to src/MiniExcel.Core/OpenXml/Styles/OpenXmlStyleOptions.cs index bbde1f8d..68261879 100644 --- a/src/MiniExcel/OpenXml/Styles/OpenXmlStyleOptions.cs +++ b/src/MiniExcel.Core/OpenXml/Styles/OpenXmlStyleOptions.cs @@ -1,4 +1,4 @@ -namespace MiniExcelLib.OpenXml.Styles; +namespace MiniExcelLib.Core.OpenXml.Styles; public class OpenXmlStyleOptions { diff --git a/src/MiniExcel/OpenXml/Styles/OpenXmlStyles.cs b/src/MiniExcel.Core/OpenXml/Styles/OpenXmlStyles.cs similarity index 95% rename from src/MiniExcel/OpenXml/Styles/OpenXmlStyles.cs rename to src/MiniExcel.Core/OpenXml/Styles/OpenXmlStyles.cs index 2a6897da..be53a3ed 100644 --- a/src/MiniExcel/OpenXml/Styles/OpenXmlStyles.cs +++ b/src/MiniExcel.Core/OpenXml/Styles/OpenXmlStyles.cs @@ -1,7 +1,9 @@ -using MiniExcelLib.OpenXml.Constants; -using MiniExcelLib.OpenXml.Zip; +using MiniExcelLib.Core.OpenXml.Constants; +using MiniExcelLib.Core.OpenXml.Utils; +using MiniExcelLib.Core.OpenXml.Zip; +using XmlReaderHelper = MiniExcelLib.Core.OpenXml.Utils.XmlReaderHelper; -namespace MiniExcelLib.OpenXml.Styles; +namespace MiniExcelLib.Core.OpenXml.Styles; internal class OpenXmlStyles { diff --git a/src/MiniExcel/OpenXml/Styles/SheetStyleElementInfos.cs b/src/MiniExcel.Core/OpenXml/Styles/SheetStyleElementInfos.cs similarity index 89% rename from src/MiniExcel/OpenXml/Styles/SheetStyleElementInfos.cs rename to src/MiniExcel.Core/OpenXml/Styles/SheetStyleElementInfos.cs index db6bc188..3ab807e8 100644 --- a/src/MiniExcel/OpenXml/Styles/SheetStyleElementInfos.cs +++ b/src/MiniExcel.Core/OpenXml/Styles/SheetStyleElementInfos.cs @@ -1,4 +1,4 @@ -namespace MiniExcelLib.OpenXml.Styles; +namespace MiniExcelLib.Core.OpenXml.Styles; public class SheetStyleElementInfos { diff --git a/src/MiniExcel/OpenXml/Templates/OpenXmlTemplate.Impl.cs b/src/MiniExcel.Core/OpenXml/Templates/OpenXmlTemplate.Impl.cs similarity index 97% rename from src/MiniExcel/OpenXml/Templates/OpenXmlTemplate.Impl.cs rename to src/MiniExcel.Core/OpenXml/Templates/OpenXmlTemplate.Impl.cs index 712e7f15..6bb25e03 100644 --- a/src/MiniExcel/OpenXml/Templates/OpenXmlTemplate.Impl.cs +++ b/src/MiniExcel.Core/OpenXml/Templates/OpenXmlTemplate.Impl.cs @@ -1,6 +1,10 @@ -using MiniExcelLib.OpenXml.Constants; +using MiniExcelLib.Core.Attributes; +using MiniExcelLib.Core.Helpers; +using MiniExcelLib.Core.OpenXml.Constants; +using MiniExcelLib.Core.OpenXml.Utils; +using MiniExcelLib.Core.Reflection; -namespace MiniExcelLib.OpenXml.Templates; +namespace MiniExcelLib.Core.OpenXml.Templates; #region Utils internal class XRowInfo diff --git a/src/MiniExcel/OpenXml/Templates/OpenXmlTemplate.MergeCells.cs b/src/MiniExcel.Core/OpenXml/Templates/OpenXmlTemplate.MergeCells.cs similarity index 94% rename from src/MiniExcel/OpenXml/Templates/OpenXmlTemplate.MergeCells.cs rename to src/MiniExcel.Core/OpenXml/Templates/OpenXmlTemplate.MergeCells.cs index 7147bc4c..ab990744 100644 --- a/src/MiniExcel/OpenXml/Templates/OpenXmlTemplate.MergeCells.cs +++ b/src/MiniExcel.Core/OpenXml/Templates/OpenXmlTemplate.MergeCells.cs @@ -1,6 +1,6 @@ -using MiniExcelLib.OpenXml.Zip; +using MiniExcelLib.Core.OpenXml.Zip; -namespace MiniExcelLib.OpenXml.Templates; +namespace MiniExcelLib.Core.OpenXml.Templates; internal partial class OpenXmlTemplate { diff --git a/src/MiniExcel/OpenXml/Templates/OpenXmlTemplate.cs b/src/MiniExcel.Core/OpenXml/Templates/OpenXmlTemplate.cs similarity index 94% rename from src/MiniExcel/OpenXml/Templates/OpenXmlTemplate.cs rename to src/MiniExcel.Core/OpenXml/Templates/OpenXmlTemplate.cs index 92ca55ab..d6e9e083 100644 --- a/src/MiniExcel/OpenXml/Templates/OpenXmlTemplate.cs +++ b/src/MiniExcel.Core/OpenXml/Templates/OpenXmlTemplate.cs @@ -1,7 +1,10 @@ -using MiniExcelLib.OpenXml.Constants; -using MiniExcelLib.OpenXml.Zip; +using MiniExcelLib.Core.Abstractions; +using MiniExcelLib.Core.OpenXml.Constants; +using MiniExcelLib.Core.OpenXml.Zip; +using CalcChainHelper = MiniExcelLib.Core.OpenXml.Utils.CalcChainHelper; +using IMiniExcelTemplate = MiniExcelLib.Core.Abstractions.IMiniExcelTemplate; -namespace MiniExcelLib.OpenXml.Templates; +namespace MiniExcelLib.Core.OpenXml.Templates; internal partial class OpenXmlTemplate : IMiniExcelTemplate { diff --git a/src/MiniExcel/OpenXml/Templates/OpenXmlValueExtractor.cs b/src/MiniExcel.Core/OpenXml/Templates/OpenXmlValueExtractor.cs similarity index 89% rename from src/MiniExcel/OpenXml/Templates/OpenXmlValueExtractor.cs rename to src/MiniExcel.Core/OpenXml/Templates/OpenXmlValueExtractor.cs index eb9ceacd..50a49056 100644 --- a/src/MiniExcel/OpenXml/Templates/OpenXmlValueExtractor.cs +++ b/src/MiniExcel.Core/OpenXml/Templates/OpenXmlValueExtractor.cs @@ -1,4 +1,7 @@ -namespace MiniExcelLib.OpenXml.Templates; +using MiniExcelLib.Core.Abstractions; +using MiniExcelLib.Core.Helpers; + +namespace MiniExcelLib.Core.OpenXml.Templates; public class OpenXmlValueExtractor : IInputValueExtractor { diff --git a/src/MiniExcel/OpenXml/Utils/CalcChainHelper.cs b/src/MiniExcel.Core/OpenXml/Utils/CalcChainHelper.cs similarity index 95% rename from src/MiniExcel/OpenXml/Utils/CalcChainHelper.cs rename to src/MiniExcel.Core/OpenXml/Utils/CalcChainHelper.cs index 9c1f6107..c2bae0ce 100644 --- a/src/MiniExcel/OpenXml/Utils/CalcChainHelper.cs +++ b/src/MiniExcel.Core/OpenXml/Utils/CalcChainHelper.cs @@ -1,4 +1,4 @@ -namespace MiniExcelLib.OpenXml.Utils; +namespace MiniExcelLib.Core.OpenXml.Utils; internal static partial class CalcChainHelper { diff --git a/src/MiniExcel/OpenXml/Utils/DateTimeHelper.cs b/src/MiniExcel.Core/OpenXml/Utils/DateTimeHelper.cs similarity index 91% rename from src/MiniExcel/OpenXml/Utils/DateTimeHelper.cs rename to src/MiniExcel.Core/OpenXml/Utils/DateTimeHelper.cs index 31c5d945..dac80e70 100644 --- a/src/MiniExcel/OpenXml/Utils/DateTimeHelper.cs +++ b/src/MiniExcel.Core/OpenXml/Utils/DateTimeHelper.cs @@ -1,4 +1,4 @@ -namespace MiniExcelLib.OpenXml.Utils; +namespace MiniExcelLib.Core.OpenXml.Utils; public static class DateTimeHelper { diff --git a/src/MiniExcel/OpenXml/Utils/GeneralHelper.cs b/src/MiniExcel.Core/OpenXml/Utils/GeneralHelper.cs similarity index 93% rename from src/MiniExcel/OpenXml/Utils/GeneralHelper.cs rename to src/MiniExcel.Core/OpenXml/Utils/GeneralHelper.cs index cbed85d7..1f19995a 100644 --- a/src/MiniExcel/OpenXml/Utils/GeneralHelper.cs +++ b/src/MiniExcel.Core/OpenXml/Utils/GeneralHelper.cs @@ -1,4 +1,4 @@ -namespace MiniExcelLib.OpenXml.Utils; +namespace MiniExcelLib.Core.OpenXml.Utils; internal static class GeneralHelper { diff --git a/src/MiniExcel/OpenXml/Utils/MiniExcelPropertyHelper.cs b/src/MiniExcel.Core/OpenXml/Utils/MiniExcelPropertyHelper.cs similarity index 88% rename from src/MiniExcel/OpenXml/Utils/MiniExcelPropertyHelper.cs rename to src/MiniExcel.Core/OpenXml/Utils/MiniExcelPropertyHelper.cs index 2f7e8e20..f2cd8848 100644 --- a/src/MiniExcel/OpenXml/Utils/MiniExcelPropertyHelper.cs +++ b/src/MiniExcel.Core/OpenXml/Utils/MiniExcelPropertyHelper.cs @@ -1,7 +1,7 @@ -using MiniExcelLib.OpenXml.Attributes; -using MiniExcelLib.OpenXml.Models; +using MiniExcelLib.Core.OpenXml.Attributes; +using MiniExcelLib.Core.OpenXml.Models; -namespace MiniExcelLib.OpenXml.Utils; +namespace MiniExcelLib.Core.OpenXml.Utils; internal static class ExcelPropertyHelper { diff --git a/src/MiniExcel/OpenXml/Utils/OpenXmlNumberFormatHelper.cs b/src/MiniExcel.Core/OpenXml/Utils/OpenXmlNumberFormatHelper.cs similarity index 96% rename from src/MiniExcel/OpenXml/Utils/OpenXmlNumberFormatHelper.cs rename to src/MiniExcel.Core/OpenXml/Utils/OpenXmlNumberFormatHelper.cs index fceae1ab..813067bc 100644 --- a/src/MiniExcel/OpenXml/Utils/OpenXmlNumberFormatHelper.cs +++ b/src/MiniExcel.Core/OpenXml/Utils/OpenXmlNumberFormatHelper.cs @@ -1,4 +1,4 @@ -namespace MiniExcelLib.OpenXml.Utils; +namespace MiniExcelLib.Core.OpenXml.Utils; /// /// This code edit from https://github.com/andersnm/ExcelNumberFormat diff --git a/src/MiniExcel/OpenXml/Utils/ReferenceHelper.cs b/src/MiniExcel.Core/OpenXml/Utils/ReferenceHelper.cs similarity index 95% rename from src/MiniExcel/OpenXml/Utils/ReferenceHelper.cs rename to src/MiniExcel.Core/OpenXml/Utils/ReferenceHelper.cs index d19c7d09..4cd4135f 100644 --- a/src/MiniExcel/OpenXml/Utils/ReferenceHelper.cs +++ b/src/MiniExcel.Core/OpenXml/Utils/ReferenceHelper.cs @@ -1,4 +1,4 @@ -namespace MiniExcelLib.OpenXml.Utils; +namespace MiniExcelLib.Core.OpenXml.Utils; internal static class ReferenceHelper { diff --git a/src/MiniExcel/OpenXml/Utils/SharedStringsDiskCache.cs b/src/MiniExcel.Core/OpenXml/Utils/SharedStringsDiskCache.cs similarity index 95% rename from src/MiniExcel/OpenXml/Utils/SharedStringsDiskCache.cs rename to src/MiniExcel.Core/OpenXml/Utils/SharedStringsDiskCache.cs index 5a8eaf0a..bae9245c 100644 --- a/src/MiniExcel/OpenXml/Utils/SharedStringsDiskCache.cs +++ b/src/MiniExcel.Core/OpenXml/Utils/SharedStringsDiskCache.cs @@ -1,4 +1,4 @@ -namespace MiniExcelLib.OpenXml.Utils; +namespace MiniExcelLib.Core.OpenXml.Utils; internal class SharedStringsDiskCache : IDictionary, IDisposable { diff --git a/src/MiniExcel/OpenXml/Utils/XmlReaderHelper.cs b/src/MiniExcel.Core/OpenXml/Utils/XmlReaderHelper.cs similarity index 95% rename from src/MiniExcel/OpenXml/Utils/XmlReaderHelper.cs rename to src/MiniExcel.Core/OpenXml/Utils/XmlReaderHelper.cs index b3c735ca..e65e60ed 100644 --- a/src/MiniExcel/OpenXml/Utils/XmlReaderHelper.cs +++ b/src/MiniExcel.Core/OpenXml/Utils/XmlReaderHelper.cs @@ -1,6 +1,6 @@ -using MiniExcelLib.OpenXml.Constants; +using MiniExcelLib.Core.OpenXml.Constants; -namespace MiniExcelLib.OpenXml.Utils; +namespace MiniExcelLib.Core.OpenXml.Utils; internal static partial class XmlReaderHelper { diff --git a/src/MiniExcel/OpenXml/Zip/MiniExcelZipArchive.cs b/src/MiniExcel.Core/OpenXml/Zip/MiniExcelZipArchive.cs similarity index 85% rename from src/MiniExcel/OpenXml/Zip/MiniExcelZipArchive.cs rename to src/MiniExcel.Core/OpenXml/Zip/MiniExcelZipArchive.cs index 069e49d7..9df07bdc 100644 --- a/src/MiniExcel/OpenXml/Zip/MiniExcelZipArchive.cs +++ b/src/MiniExcel.Core/OpenXml/Zip/MiniExcelZipArchive.cs @@ -1,4 +1,4 @@ -namespace MiniExcelLib.OpenXml.Zip; +namespace MiniExcelLib.Core.OpenXml.Zip; public class MiniExcelZipArchive(Stream stream, ZipArchiveMode mode, bool leaveOpen, Encoding entryNameEncoding) : ZipArchive(stream, mode, leaveOpen, entryNameEncoding) diff --git a/src/MiniExcel/OpenXml/Zip/OpenXmlZip.cs b/src/MiniExcel.Core/OpenXml/Zip/OpenXmlZip.cs similarity index 94% rename from src/MiniExcel/OpenXml/Zip/OpenXmlZip.cs rename to src/MiniExcel.Core/OpenXml/Zip/OpenXmlZip.cs index b85daad3..abc594fd 100644 --- a/src/MiniExcel/OpenXml/Zip/OpenXmlZip.cs +++ b/src/MiniExcel.Core/OpenXml/Zip/OpenXmlZip.cs @@ -1,6 +1,6 @@ using System.Collections.ObjectModel; -namespace MiniExcelLib.OpenXml.Zip; +namespace MiniExcelLib.Core.OpenXml.Zip; /// Copy & modified by ExcelDataReader ZipWorker @MIT License internal class OpenXmlZip : IDisposable diff --git a/src/MiniExcel/OpenXml/Zip/ZipPackageInfo.cs b/src/MiniExcel.Core/OpenXml/Zip/ZipPackageInfo.cs similarity index 82% rename from src/MiniExcel/OpenXml/Zip/ZipPackageInfo.cs rename to src/MiniExcel.Core/OpenXml/Zip/ZipPackageInfo.cs index f8ca652a..4cee1d50 100644 --- a/src/MiniExcel/OpenXml/Zip/ZipPackageInfo.cs +++ b/src/MiniExcel.Core/OpenXml/Zip/ZipPackageInfo.cs @@ -1,4 +1,4 @@ -namespace MiniExcelLib.OpenXml.Zip; +namespace MiniExcelLib.Core.OpenXml.Zip; internal class ZipPackageInfo(ZipArchiveEntry zipArchiveEntry, string contentType) { diff --git a/src/MiniExcel/Properties/AssemblyInfo.cs b/src/MiniExcel.Core/Properties/AssemblyInfo.cs similarity index 100% rename from src/MiniExcel/Properties/AssemblyInfo.cs rename to src/MiniExcel.Core/Properties/AssemblyInfo.cs diff --git a/src/MiniExcel/Reflection/CustomPropertyHelper.cs b/src/MiniExcel.Core/Reflection/CustomPropertyHelper.cs similarity index 96% rename from src/MiniExcel/Reflection/CustomPropertyHelper.cs rename to src/MiniExcel.Core/Reflection/CustomPropertyHelper.cs index 46874459..9d88810a 100644 --- a/src/MiniExcel/Reflection/CustomPropertyHelper.cs +++ b/src/MiniExcel.Core/Reflection/CustomPropertyHelper.cs @@ -1,6 +1,8 @@ using System.ComponentModel; +using MiniExcelLib.Core.Attributes; +using MiniExcelLib.Core.Helpers; -namespace MiniExcelLib.Reflection; +namespace MiniExcelLib.Core.Reflection; public static class CustomPropertyHelper { diff --git a/src/MiniExcel/Reflection/MemberGetter.cs b/src/MiniExcel.Core/Reflection/MemberGetter.cs similarity index 92% rename from src/MiniExcel/Reflection/MemberGetter.cs rename to src/MiniExcel.Core/Reflection/MemberGetter.cs index 2b8cbc8e..233fde62 100644 --- a/src/MiniExcel/Reflection/MemberGetter.cs +++ b/src/MiniExcel.Core/Reflection/MemberGetter.cs @@ -1,6 +1,6 @@ using System.Linq.Expressions; -namespace MiniExcelLib.Reflection; +namespace MiniExcelLib.Core.Reflection; public class MemberGetter(PropertyInfo property) { diff --git a/src/MiniExcel/Reflection/MemberSetter.cs b/src/MiniExcel.Core/Reflection/MemberSetter.cs similarity index 93% rename from src/MiniExcel/Reflection/MemberSetter.cs rename to src/MiniExcel.Core/Reflection/MemberSetter.cs index 6073ec63..1e81c84c 100644 --- a/src/MiniExcel/Reflection/MemberSetter.cs +++ b/src/MiniExcel.Core/Reflection/MemberSetter.cs @@ -1,6 +1,6 @@ using System.Linq.Expressions; -namespace MiniExcelLib.Reflection; +namespace MiniExcelLib.Core.Reflection; public class MemberSetter { diff --git a/src/MiniExcel/Reflection/MiniExcelColumnInfo.cs b/src/MiniExcel.Core/Reflection/MiniExcelColumnInfo.cs similarity index 88% rename from src/MiniExcel/Reflection/MiniExcelColumnInfo.cs rename to src/MiniExcel.Core/Reflection/MiniExcelColumnInfo.cs index b0ebf98d..076332a7 100644 --- a/src/MiniExcel/Reflection/MiniExcelColumnInfo.cs +++ b/src/MiniExcel.Core/Reflection/MiniExcelColumnInfo.cs @@ -1,4 +1,6 @@ -namespace MiniExcelLib.Reflection; +using MiniExcelLib.Core.Attributes; + +namespace MiniExcelLib.Core.Reflection; public class MiniExcelColumnInfo { diff --git a/src/MiniExcel/Reflection/MiniExcelMapper.cs b/src/MiniExcel.Core/Reflection/MiniExcelMapper.cs similarity index 96% rename from src/MiniExcel/Reflection/MiniExcelMapper.cs rename to src/MiniExcel.Core/Reflection/MiniExcelMapper.cs index 09c27e24..bd50802d 100644 --- a/src/MiniExcel/Reflection/MiniExcelMapper.cs +++ b/src/MiniExcel.Core/Reflection/MiniExcelMapper.cs @@ -1,7 +1,9 @@ using System.ComponentModel; -using MiniExcelLib.Exceptions; +using MiniExcelLib.Core.Exceptions; +using MiniExcelLib.Core.Helpers; +using MiniExcelLib.Core.OpenXml.Utils; -namespace MiniExcelLib.Reflection; +namespace MiniExcelLib.Core.Reflection; public static partial class MiniExcelMapper { diff --git a/src/MiniExcel/Reflection/MiniExcelProperty.cs b/src/MiniExcel.Core/Reflection/MiniExcelProperty.cs similarity index 93% rename from src/MiniExcel/Reflection/MiniExcelProperty.cs rename to src/MiniExcel.Core/Reflection/MiniExcelProperty.cs index ee0e58fe..3c2dafe7 100644 --- a/src/MiniExcel/Reflection/MiniExcelProperty.cs +++ b/src/MiniExcel.Core/Reflection/MiniExcelProperty.cs @@ -1,4 +1,4 @@ -namespace MiniExcelLib.Reflection; +namespace MiniExcelLib.Core.Reflection; public abstract class Member; diff --git a/src/MiniExcel/WriteAdapters/AsyncEnumerableWriteAdapter.cs b/src/MiniExcel.Core/WriteAdapters/AsyncEnumerableWriteAdapter.cs similarity index 92% rename from src/MiniExcel/WriteAdapters/AsyncEnumerableWriteAdapter.cs rename to src/MiniExcel.Core/WriteAdapters/AsyncEnumerableWriteAdapter.cs index ae348ca2..64ec78db 100644 --- a/src/MiniExcel/WriteAdapters/AsyncEnumerableWriteAdapter.cs +++ b/src/MiniExcel.Core/WriteAdapters/AsyncEnumerableWriteAdapter.cs @@ -1,4 +1,7 @@ -namespace MiniExcelLib.WriteAdapters; +using MiniExcelLib.Core.Abstractions; +using MiniExcelLib.Core.Reflection; + +namespace MiniExcelLib.Core.WriteAdapters; internal class AsyncEnumerableWriteAdapter(IAsyncEnumerable values, MiniExcelBaseConfiguration configuration) : IMiniExcelWriteAdapterAsync { diff --git a/src/MiniExcel/WriteAdapters/DataReaderWriteAdapter.cs b/src/MiniExcel.Core/WriteAdapters/DataReaderWriteAdapter.cs similarity index 91% rename from src/MiniExcel/WriteAdapters/DataReaderWriteAdapter.cs rename to src/MiniExcel.Core/WriteAdapters/DataReaderWriteAdapter.cs index 9d247f95..eb678e3a 100644 --- a/src/MiniExcel/WriteAdapters/DataReaderWriteAdapter.cs +++ b/src/MiniExcel.Core/WriteAdapters/DataReaderWriteAdapter.cs @@ -1,4 +1,7 @@ -namespace MiniExcelLib.WriteAdapters; +using MiniExcelLib.Core.Abstractions; +using MiniExcelLib.Core.Reflection; + +namespace MiniExcelLib.Core.WriteAdapters; internal class DataReaderWriteAdapter(IDataReader reader, MiniExcelBaseConfiguration configuration) : IMiniExcelWriteAdapter { diff --git a/src/MiniExcel/WriteAdapters/DataTableWriteAdapter.cs b/src/MiniExcel.Core/WriteAdapters/DataTableWriteAdapter.cs similarity index 89% rename from src/MiniExcel/WriteAdapters/DataTableWriteAdapter.cs rename to src/MiniExcel.Core/WriteAdapters/DataTableWriteAdapter.cs index 1d607843..33715ced 100644 --- a/src/MiniExcel/WriteAdapters/DataTableWriteAdapter.cs +++ b/src/MiniExcel.Core/WriteAdapters/DataTableWriteAdapter.cs @@ -1,4 +1,7 @@ -namespace MiniExcelLib.WriteAdapters; +using MiniExcelLib.Core.Abstractions; +using MiniExcelLib.Core.Reflection; + +namespace MiniExcelLib.Core.WriteAdapters; internal class DataTableWriteAdapter(DataTable dataTable, MiniExcelBaseConfiguration configuration) : IMiniExcelWriteAdapter { diff --git a/src/MiniExcel/WriteAdapters/EnumerableWriteAdapter.cs b/src/MiniExcel.Core/WriteAdapters/EnumerableWriteAdapter.cs similarity index 91% rename from src/MiniExcel/WriteAdapters/EnumerableWriteAdapter.cs rename to src/MiniExcel.Core/WriteAdapters/EnumerableWriteAdapter.cs index 582e8299..4f64c137 100644 --- a/src/MiniExcel/WriteAdapters/EnumerableWriteAdapter.cs +++ b/src/MiniExcel.Core/WriteAdapters/EnumerableWriteAdapter.cs @@ -1,4 +1,8 @@ -namespace MiniExcelLib.WriteAdapters; +using MiniExcelLib.Core.Abstractions; +using MiniExcelLib.Core.Helpers; +using MiniExcelLib.Core.Reflection; + +namespace MiniExcelLib.Core.WriteAdapters; internal class EnumerableWriteAdapter(IEnumerable values, MiniExcelBaseConfiguration configuration) : IMiniExcelWriteAdapter { diff --git a/src/MiniExcel/WriteAdapters/MiniExcelDataReaderWriteAdapter.cs b/src/MiniExcel.Core/WriteAdapters/MiniExcelDataReaderWriteAdapter.cs similarity index 92% rename from src/MiniExcel/WriteAdapters/MiniExcelDataReaderWriteAdapter.cs rename to src/MiniExcel.Core/WriteAdapters/MiniExcelDataReaderWriteAdapter.cs index 0d02afc5..494b6ea3 100644 --- a/src/MiniExcel/WriteAdapters/MiniExcelDataReaderWriteAdapter.cs +++ b/src/MiniExcel.Core/WriteAdapters/MiniExcelDataReaderWriteAdapter.cs @@ -1,4 +1,7 @@ -namespace MiniExcelLib.WriteAdapters; +using MiniExcelLib.Core.Abstractions; +using MiniExcelLib.Core.Reflection; + +namespace MiniExcelLib.Core.WriteAdapters; internal class MiniExcelDataReaderWriteAdapter(IMiniExcelDataReader reader, MiniExcelBaseConfiguration configuration) : IMiniExcelWriteAdapterAsync { diff --git a/src/MiniExcel/WriteAdapters/MiniExcelWriteAdapterFactory.cs b/src/MiniExcel.Core/WriteAdapters/MiniExcelWriteAdapterFactory.cs similarity index 89% rename from src/MiniExcel/WriteAdapters/MiniExcelWriteAdapterFactory.cs rename to src/MiniExcel.Core/WriteAdapters/MiniExcelWriteAdapterFactory.cs index 07ceb2d8..07e6641a 100644 --- a/src/MiniExcel/WriteAdapters/MiniExcelWriteAdapterFactory.cs +++ b/src/MiniExcel.Core/WriteAdapters/MiniExcelWriteAdapterFactory.cs @@ -1,4 +1,7 @@ -namespace MiniExcelLib.WriteAdapters; +using MiniExcelLib.Core.Abstractions; +using MiniExcelLib.Core.Helpers; + +namespace MiniExcelLib.Core.WriteAdapters; public static class MiniExcelWriteAdapterFactory { diff --git a/src/MiniExcel.Csv/Providers/CsvExporter.cs b/src/MiniExcel.Csv/Api/CsvExporter.cs similarity index 94% rename from src/MiniExcel.Csv/Providers/CsvExporter.cs rename to src/MiniExcel.Csv/Api/CsvExporter.cs index ba2b804e..56bd05cc 100644 --- a/src/MiniExcel.Csv/Providers/CsvExporter.cs +++ b/src/MiniExcel.Csv/Api/CsvExporter.cs @@ -1,4 +1,7 @@ -namespace MiniExcelLib.Csv.Providers; +using MiniExcelLib.Core; + +// ReSharper disable once CheckNamespace +namespace MiniExcelLib.Csv; public partial class CsvExporter { @@ -58,7 +61,7 @@ public async Task ConvertCsvToXlsxAsync(Stream csv, Stream xlsx, bool csvHasHead var value = new CsvImporter().QueryAsync(csv, useHeaderRow: csvHasHeader, cancellationToken: cancellationToken); await MiniExcel.Exporter - .GetExcelExporter() + .GetOpenXmlExporter() .ExportAsync(xlsx, value, printHeader: csvHasHeader, cancellationToken: cancellationToken) .ConfigureAwait(false); } @@ -85,7 +88,7 @@ public async Task ConvertXlsxToCsvAsync(string xlsx, string csvPath, bool xlsxHa public async Task ConvertXlsxToCsvAsync(Stream xlsx, Stream csv, bool xlsxHasHeader = true, CancellationToken cancellationToken = default) { var value = MiniExcel.Importer - .GetExcelImporter() + .GetOpenXmlImporter() .QueryAsync(xlsx, useHeaderRow: xlsxHasHeader, cancellationToken: cancellationToken) .ConfigureAwait(false); diff --git a/src/MiniExcel.Csv/Providers/CsvImporter.cs b/src/MiniExcel.Csv/Api/CsvImporter.cs similarity index 96% rename from src/MiniExcel.Csv/Providers/CsvImporter.cs rename to src/MiniExcel.Csv/Api/CsvImporter.cs index 072cf70e..c37527ac 100644 --- a/src/MiniExcel.Csv/Providers/CsvImporter.cs +++ b/src/MiniExcel.Csv/Api/CsvImporter.cs @@ -1,6 +1,8 @@ -using MiniExcelLib.DataReader; +using MiniExcelLib.Core.DataReader; +using MiniExcelLib.Core.Helpers; -namespace MiniExcelLib.Csv.Providers; +// ReSharper disable once CheckNamespace +namespace MiniExcelLib.Csv; public partial class CsvImporter { diff --git a/src/MiniExcel.Csv/Providers/ProviderExtensions.cs b/src/MiniExcel.Csv/Api/ProviderExtensions.cs similarity index 70% rename from src/MiniExcel.Csv/Providers/ProviderExtensions.cs rename to src/MiniExcel.Csv/Api/ProviderExtensions.cs index 8a58afd8..20f7937d 100644 --- a/src/MiniExcel.Csv/Providers/ProviderExtensions.cs +++ b/src/MiniExcel.Csv/Api/ProviderExtensions.cs @@ -1,4 +1,7 @@ -namespace MiniExcelLib.Csv.Providers; +using MiniExcelLib.Core; + +// ReSharper disable once CheckNamespace +namespace MiniExcelLib.Csv; public static class ProviderExtensions { diff --git a/src/MiniExcel.Csv/CsvConfiguration.cs b/src/MiniExcel.Csv/CsvConfiguration.cs index 59d8f4c3..3334f5c7 100644 --- a/src/MiniExcel.Csv/CsvConfiguration.cs +++ b/src/MiniExcel.Csv/CsvConfiguration.cs @@ -1,3 +1,5 @@ +using MiniExcelLib.Core; + namespace MiniExcelLib.Csv; public class CsvConfiguration : MiniExcelBaseConfiguration diff --git a/src/MiniExcel.Csv/CsvReader.cs b/src/MiniExcel.Csv/CsvReader.cs index 6d6a06d3..0d0108f4 100644 --- a/src/MiniExcel.Csv/CsvReader.cs +++ b/src/MiniExcel.Csv/CsvReader.cs @@ -1,3 +1,10 @@ +using MiniExcelLib.Core; +using MiniExcelLib.Core.Exceptions; +using MiniExcelLib.Core.Helpers; +using MiniExcelLib.Core.Reflection; +using IMiniExcelReader = MiniExcelLib.Core.Abstractions.IMiniExcelReader; +using MiniExcelMapper = MiniExcelLib.Core.Reflection.MiniExcelMapper; + namespace MiniExcelLib.Csv; internal partial class CsvReader : IMiniExcelReader diff --git a/src/MiniExcel.Csv/CsvWriter.cs b/src/MiniExcel.Csv/CsvWriter.cs index 4747e005..709cf49f 100644 --- a/src/MiniExcel.Csv/CsvWriter.cs +++ b/src/MiniExcel.Csv/CsvWriter.cs @@ -1,4 +1,10 @@ -namespace MiniExcelLib.Csv; +using MiniExcelLib.Core; +using MiniExcelLib.Core.Abstractions; +using MiniExcelLib.Core.Reflection; +using MiniExcelLib.Core.WriteAdapters; +using IMiniExcelWriter = MiniExcelLib.Core.Abstractions.IMiniExcelWriter; + +namespace MiniExcelLib.Csv; internal partial class CsvWriter : IMiniExcelWriter, IDisposable { diff --git a/src/MiniExcel.Csv/GlobalUsings.cs b/src/MiniExcel.Csv/GlobalUsings.cs index 6498278a..eaf45918 100644 --- a/src/MiniExcel.Csv/GlobalUsings.cs +++ b/src/MiniExcel.Csv/GlobalUsings.cs @@ -7,9 +7,7 @@ global using System.Runtime.CompilerServices; global using System.Text; global using System.Text.RegularExpressions; -global using MiniExcelLib.Abstractions; -global using MiniExcelLib.Exceptions; -global using MiniExcelLib.Helpers; -global using MiniExcelLib.Reflection; -global using MiniExcelLib.WriteAdapters; +global using MiniExcelLib.Core.Abstractions; +global using MiniExcelLib.Core.Helpers; +global using MiniExcelLib.Core.Reflection; global using Zomp.SyncMethodGenerator; \ No newline at end of file diff --git a/src/MiniExcel.Csv/MiniExcel.Csv.csproj b/src/MiniExcel.Csv/MiniExcel.Csv.csproj index 547249d3..4ce1cdb3 100644 --- a/src/MiniExcel.Csv/MiniExcel.Csv.csproj +++ b/src/MiniExcel.Csv/MiniExcel.Csv.csproj @@ -4,8 +4,13 @@ MiniExcelLib.Csv + + MiniExcel.Csv + MiniExcel.Csv + + - + diff --git a/src/MiniExcel.Legacy/Configuration.cs b/src/MiniExcel.Legacy/Configuration.cs deleted file mode 100644 index e7b0d868..00000000 --- a/src/MiniExcel.Legacy/Configuration.cs +++ /dev/null @@ -1,9 +0,0 @@ -using MiniExcelLib; - -namespace MiniExcelLibs; - - -public interface IConfiguration : IMiniExcelConfiguration; - -public sealed class OpenXmlConfiguration : MiniExcelLib.OpenXml.OpenXmlConfiguration, IConfiguration; -public sealed class CsvConfiguration : MiniExcelLib.Csv.CsvConfiguration, IConfiguration; \ No newline at end of file diff --git a/src/MiniExcel.Legacy/MiniExcel.Legacy.csproj b/src/MiniExcel.Legacy/MiniExcel.Legacy.csproj deleted file mode 100644 index 4bc2751b..00000000 --- a/src/MiniExcel.Legacy/MiniExcel.Legacy.csproj +++ /dev/null @@ -1,12 +0,0 @@ - - - - MiniExcelLibs - - - - - - - - diff --git a/src/MiniExcel/Legacy/Configuration.cs b/src/MiniExcel/Legacy/Configuration.cs new file mode 100644 index 00000000..afb592c6 --- /dev/null +++ b/src/MiniExcel/Legacy/Configuration.cs @@ -0,0 +1,9 @@ +using MiniExcelLib.Core; + +namespace MiniExcelLib.Legacy; + + +public interface IConfiguration : IMiniExcelConfiguration; + +public sealed class OpenXmlConfiguration : Core.OpenXml.OpenXmlConfiguration, IConfiguration; +public sealed class CsvConfiguration : MiniExcelLib.Csv.CsvConfiguration, IConfiguration; \ No newline at end of file diff --git a/src/MiniExcel.Legacy/ExcelType.cs b/src/MiniExcel/Legacy/ExcelType.cs similarity index 57% rename from src/MiniExcel.Legacy/ExcelType.cs rename to src/MiniExcel/Legacy/ExcelType.cs index d80f0310..b8869acf 100644 --- a/src/MiniExcel.Legacy/ExcelType.cs +++ b/src/MiniExcel/Legacy/ExcelType.cs @@ -1,4 +1,4 @@ -namespace MiniExcelLibs; +namespace MiniExcelLib.Legacy; public enum ExcelType { XLSX, CSV, UNKNOWN } diff --git a/src/MiniExcel.Legacy/ExcelTypeHelper.cs b/src/MiniExcel/Legacy/ExcelTypeHelper.cs similarity index 95% rename from src/MiniExcel.Legacy/ExcelTypeHelper.cs rename to src/MiniExcel/Legacy/ExcelTypeHelper.cs index 6be05705..cf5cd8d2 100644 --- a/src/MiniExcel.Legacy/ExcelTypeHelper.cs +++ b/src/MiniExcel/Legacy/ExcelTypeHelper.cs @@ -1,4 +1,4 @@ -namespace MiniExcelLibs; +namespace MiniExcelLib.Legacy; internal static class ExcelTypeHelper { diff --git a/src/MiniExcel.Legacy/MiniExcel.cs b/src/MiniExcel/Legacy/MiniExcel.cs similarity index 95% rename from src/MiniExcel.Legacy/MiniExcel.cs rename to src/MiniExcel/Legacy/MiniExcel.cs index 264e6a49..638b1e49 100644 --- a/src/MiniExcel.Legacy/MiniExcel.cs +++ b/src/MiniExcel/Legacy/MiniExcel.cs @@ -1,26 +1,24 @@ using System.Data; -using MiniExcelLib.Csv.Providers; -using MiniExcelLib.DataReader; -using MiniExcelLib.OpenXml.Models; -using MiniExcelLib.OpenXml.Picture; +using MiniExcelLib.Core.DataReader; +using MiniExcelLib.Core.OpenXml.Models; +using MiniExcelLib.Core.OpenXml.Picture; +using MiniExcelLib.Csv; using Zomp.SyncMethodGenerator; -using CsvExporter = MiniExcelLib.Csv.Providers.CsvExporter; -using CsvImporter = MiniExcelLib.Csv.Providers.CsvImporter; -using MiniExcelNew = MiniExcelLib.MiniExcel; -using OpenXmlExporter = MiniExcelLib.OpenXml.Providers.OpenXmlExporter; -using OpenXmlImporter = MiniExcelLib.OpenXml.Providers.OpenXmlImporter; -using OpenXmlTemplater = MiniExcelLib.OpenXml.Providers.OpenXmlTemplater; +using NewMiniExcel = MiniExcelLib.Core.MiniExcel; +using OpenXmlExporter = MiniExcelLib.Core.OpenXmlExporter; +using OpenXmlImporter = MiniExcelLib.Core.OpenXmlImporter; +using OpenXmlTemplater = MiniExcelLib.Core.OpenXmlTemplater; -namespace MiniExcelLibs; +namespace MiniExcelLib.Legacy; public static partial class MiniExcel { - private static readonly OpenXmlExporter ExcelExporter = MiniExcelNew.Exporter.GetExcelExporter(); - private static readonly OpenXmlImporter ExcelImporter = MiniExcelNew.Importer.GetExcelImporter(); - private static readonly OpenXmlTemplater ExcelTemplater = MiniExcelNew.Templater.GetExcelTemplater(); + private static readonly OpenXmlExporter ExcelExporter = NewMiniExcel.Exporter.GetOpenXmlExporter(); + private static readonly OpenXmlImporter ExcelImporter = NewMiniExcel.Importer.GetOpenXmlImporter(); + private static readonly OpenXmlTemplater ExcelTemplater = NewMiniExcel.Templater.GetOpenXmlTemplater(); - private static readonly CsvExporter CsvExporter = MiniExcelNew.Exporter.GetCsvExporter(); - private static readonly CsvImporter CsvImporter = MiniExcelNew.Importer.GetCsvImporter(); + private static readonly CsvExporter CsvExporter = NewMiniExcel.Exporter.GetCsvExporter(); + private static readonly CsvImporter CsvImporter = NewMiniExcel.Importer.GetCsvImporter(); [CreateSyncVersion] diff --git a/src/MiniExcel/MiniExcel.csproj b/src/MiniExcel/MiniExcel.csproj index dcb98785..c05de8ac 100644 --- a/src/MiniExcel/MiniExcel.csproj +++ b/src/MiniExcel/MiniExcel.csproj @@ -1,11 +1,17 @@  - - MiniExcelLib - - - - - + + MiniExcelLib + + + + MiniExcel + MiniExcel + + + + + + diff --git a/src/MiniExcel/icon.png b/src/icon.png similarity index 100% rename from src/MiniExcel/icon.png rename to src/icon.png diff --git a/tests/MiniExcel.Tests/MiniExcel.Tests.csproj b/tests/MiniExcel.Core.Tests/MiniExcel.Core.Tests.csproj similarity index 81% rename from tests/MiniExcel.Tests/MiniExcel.Tests.csproj rename to tests/MiniExcel.Core.Tests/MiniExcel.Core.Tests.csproj index 27d8b549..0c874746 100644 --- a/tests/MiniExcel.Tests/MiniExcel.Tests.csproj +++ b/tests/MiniExcel.Core.Tests/MiniExcel.Core.Tests.csproj @@ -29,32 +29,31 @@ - + + + - - + + + + + - - - - miniexcel.snk - - diff --git a/tests/MiniExcel.Tests/MiniExcelAutoAdjustWidthTests.cs b/tests/MiniExcel.Core.Tests/MiniExcelAutoAdjustWidthTests.cs similarity index 96% rename from tests/MiniExcel.Tests/MiniExcelAutoAdjustWidthTests.cs rename to tests/MiniExcel.Core.Tests/MiniExcelAutoAdjustWidthTests.cs index 1efceedf..db8fa764 100644 --- a/tests/MiniExcel.Tests/MiniExcelAutoAdjustWidthTests.cs +++ b/tests/MiniExcel.Core.Tests/MiniExcelAutoAdjustWidthTests.cs @@ -1,13 +1,13 @@ using DocumentFormat.OpenXml.Packaging; using DocumentFormat.OpenXml.Spreadsheet; +using MiniExcelLib.Core.OpenXml.Models; using MiniExcelLib.Tests.Common.Utils; -using MiniExcelLib.OpenXml.Models; namespace MiniExcelLib.Tests; public class MiniExcelAutoAdjustWidthTests { - private readonly OpenXmlExporter _excelExporter = MiniExcel.Exporter.GetExcelExporter(); + private readonly OpenXmlExporter _excelExporter = MiniExcel.Exporter.GetOpenXmlExporter(); [Fact] public async Task AutoAdjustWidthThrowsExceptionWithoutFastMode_Async() diff --git a/tests/MiniExcel.Tests/MiniExcelIssueAsyncTests.cs b/tests/MiniExcel.Core.Tests/MiniExcelIssueAsyncTests.cs similarity index 97% rename from tests/MiniExcel.Tests/MiniExcelIssueAsyncTests.cs rename to tests/MiniExcel.Core.Tests/MiniExcelIssueAsyncTests.cs index 96fd55b2..b62a7692 100644 --- a/tests/MiniExcel.Tests/MiniExcelIssueAsyncTests.cs +++ b/tests/MiniExcel.Core.Tests/MiniExcelIssueAsyncTests.cs @@ -1,6 +1,4 @@ using MiniExcelLib.Tests.Common.Utils; -using MiniExcelLib.Attributes; -using Newtonsoft.Json; namespace MiniExcelLib.Tests; @@ -8,9 +6,9 @@ public class MiniExcelIssueAsyncTests(ITestOutputHelper output) { private readonly ITestOutputHelper _output = output; - private readonly OpenXmlImporter _excelImporter = MiniExcel.Importer.GetExcelImporter(); - private readonly OpenXmlExporter _excelExporter = MiniExcel.Exporter.GetExcelExporter(); - private readonly OpenXmlTemplater _excelTemplater = MiniExcel.Templater.GetExcelTemplater(); + private readonly OpenXmlImporter _excelImporter = MiniExcel.Importer.GetOpenXmlImporter(); + private readonly OpenXmlExporter _excelExporter = MiniExcel.Exporter.GetOpenXmlExporter(); + private readonly OpenXmlTemplater _excelTemplater = MiniExcel.Templater.GetOpenXmlTemplater(); /// /// [SaveAsByTemplate support DateTime custom format · Issue #255 · mini-software/MiniExcel] diff --git a/tests/MiniExcel.Tests/MiniExcelIssueTests.cs b/tests/MiniExcel.Core.Tests/MiniExcelIssueTests.cs similarity index 97% rename from tests/MiniExcel.Tests/MiniExcelIssueTests.cs rename to tests/MiniExcel.Core.Tests/MiniExcelIssueTests.cs index bee312c1..c59e9ba4 100644 --- a/tests/MiniExcel.Tests/MiniExcelIssueTests.cs +++ b/tests/MiniExcel.Core.Tests/MiniExcelIssueTests.cs @@ -1,12 +1,9 @@ -using System.Collections; -using System.ComponentModel; +using System.ComponentModel; using System.Text.RegularExpressions; +using MiniExcelLib.Core.Exceptions; +using MiniExcelLib.Core.OpenXml.Picture; +using MiniExcelLib.Core.OpenXml.Utils; using MiniExcelLib.Tests.Common.Utils; -using MiniExcelLib.Attributes; -using MiniExcelLib.Exceptions; -using MiniExcelLib.OpenXml.Picture; -using MiniExcelLib.OpenXml.Utils; -using Newtonsoft.Json; using NPOI.XSSF.UserModel; namespace MiniExcelLib.Tests; @@ -15,9 +12,9 @@ public class MiniExcelIssueTests(ITestOutputHelper output) { private readonly ITestOutputHelper _output = output; - private readonly OpenXmlImporter _excelImporter = MiniExcel.Importer.GetExcelImporter(); - private readonly OpenXmlExporter _excelExporter = MiniExcel.Exporter.GetExcelExporter(); - private readonly OpenXmlTemplater _excelTemplater = MiniExcel.Templater.GetExcelTemplater(); + private readonly OpenXmlImporter _excelImporter = MiniExcel.Importer.GetOpenXmlImporter(); + private readonly OpenXmlExporter _excelExporter = MiniExcel.Exporter.GetOpenXmlExporter(); + private readonly OpenXmlTemplater _excelTemplater = MiniExcel.Templater.GetOpenXmlTemplater(); // private readonly OpenXmlImporter _csvImporter = MiniExcel.Importer.GetCsvImporter(); // private readonly OpenXmlExporter _csvExporter = MiniExcel.Exporter.GetCsvExporter(); diff --git a/tests/MiniExcel.Tests/MiniExcelOpenXmlAsyncTests.cs b/tests/MiniExcel.Core.Tests/MiniExcelOpenXmlAsyncTests.cs similarity index 97% rename from tests/MiniExcel.Tests/MiniExcelOpenXmlAsyncTests.cs rename to tests/MiniExcel.Core.Tests/MiniExcelOpenXmlAsyncTests.cs index dd9c14e8..b0b5c241 100644 --- a/tests/MiniExcel.Tests/MiniExcelOpenXmlAsyncTests.cs +++ b/tests/MiniExcel.Core.Tests/MiniExcelOpenXmlAsyncTests.cs @@ -1,16 +1,13 @@ -using System.IO.Packaging; -using ClosedXML.Excel; +using ClosedXML.Excel; using ExcelDataReader; using MiniExcelLib.Tests.Common.Utils; -using MiniExcelLib.Abstractions; -using MiniExcelLib.Attributes; namespace MiniExcelLib.Tests; public class MiniExcelOpenXmlAsyncTests { - private readonly OpenXmlImporter _excelImporter = MiniExcel.Importer.GetExcelImporter(); - private readonly OpenXmlExporter _excelExporter = MiniExcel.Exporter.GetExcelExporter(); + private readonly OpenXmlImporter _excelImporter = MiniExcel.Importer.GetOpenXmlImporter(); + private readonly OpenXmlExporter _excelExporter = MiniExcel.Exporter.GetOpenXmlExporter(); [Fact] public async Task SaveAsControlChracter() diff --git a/tests/MiniExcel.Tests/MiniExcelOpenXmlConfigurationTest.cs b/tests/MiniExcel.Core.Tests/MiniExcelOpenXmlConfigurationTest.cs similarity index 91% rename from tests/MiniExcel.Tests/MiniExcelOpenXmlConfigurationTest.cs rename to tests/MiniExcel.Core.Tests/MiniExcelOpenXmlConfigurationTest.cs index b685403b..0d358148 100644 --- a/tests/MiniExcel.Tests/MiniExcelOpenXmlConfigurationTest.cs +++ b/tests/MiniExcel.Core.Tests/MiniExcelOpenXmlConfigurationTest.cs @@ -1,13 +1,12 @@ +using MiniExcelLib.Core.Helpers; using MiniExcelLib.Tests.Common.Utils; -using MiniExcelLib.Attributes; -using MiniExcelLib.Helpers; namespace MiniExcelLib.Tests; public class MiniExcelOpenXmlConfigurationTest { - private readonly OpenXmlImporter _excelImporter = MiniExcel.Importer.GetExcelImporter(); - private readonly OpenXmlExporter _excelExporter = MiniExcel.Exporter.GetExcelExporter(); + private readonly OpenXmlImporter _excelImporter = MiniExcel.Importer.GetOpenXmlImporter(); + private readonly OpenXmlExporter _excelExporter = MiniExcel.Exporter.GetOpenXmlExporter(); [Fact] public async Task EnableWriteFilePathTest() { diff --git a/tests/MiniExcel.Tests/MiniExcelOpenXmlMultipleSheetAsyncTests.cs b/tests/MiniExcel.Core.Tests/MiniExcelOpenXmlMultipleSheetAsyncTests.cs similarity index 96% rename from tests/MiniExcel.Tests/MiniExcelOpenXmlMultipleSheetAsyncTests.cs rename to tests/MiniExcel.Core.Tests/MiniExcelOpenXmlMultipleSheetAsyncTests.cs index 5a1e8438..5efe4448 100644 --- a/tests/MiniExcel.Tests/MiniExcelOpenXmlMultipleSheetAsyncTests.cs +++ b/tests/MiniExcel.Core.Tests/MiniExcelOpenXmlMultipleSheetAsyncTests.cs @@ -2,7 +2,7 @@ public class MiniExcelOpenXmlMultipleSheetAsyncTests { - private readonly OpenXmlImporter _excelImporter = MiniExcel.Importer.GetExcelImporter(); + private readonly OpenXmlImporter _excelImporter = MiniExcel.Importer.GetOpenXmlImporter(); [Fact] public async Task SpecifySheetNameQueryTest() diff --git a/tests/MiniExcel.Tests/MiniExcelOpenXmlMultipleSheetTests.cs b/tests/MiniExcel.Core.Tests/MiniExcelOpenXmlMultipleSheetTests.cs similarity index 95% rename from tests/MiniExcel.Tests/MiniExcelOpenXmlMultipleSheetTests.cs rename to tests/MiniExcel.Core.Tests/MiniExcelOpenXmlMultipleSheetTests.cs index bba87ab7..6d35de6e 100644 --- a/tests/MiniExcel.Tests/MiniExcelOpenXmlMultipleSheetTests.cs +++ b/tests/MiniExcel.Core.Tests/MiniExcelOpenXmlMultipleSheetTests.cs @@ -1,12 +1,12 @@ -using MiniExcelLib.OpenXml.Attributes; -using MiniExcelLib.OpenXml.Models; +using MiniExcelLib.Core.OpenXml.Attributes; +using MiniExcelLib.Core.OpenXml.Models; using MiniExcelLib.Tests.Common.Utils; namespace MiniExcelLib.Tests; public class MiniExcelOpenXmlMultipleSheetTests { - private readonly OpenXmlImporter _excelImporter = MiniExcel.Importer.GetExcelImporter(); + private readonly OpenXmlImporter _excelImporter = MiniExcel.Importer.GetOpenXmlImporter(); [Fact] public void SpecifySheetNameQueryTest() @@ -255,7 +255,7 @@ public void WriteHiddenSheetTest() using var file = AutoDeletingPath.Create(); var path = file.ToString(); - var rowsWritten = MiniExcel.Exporter.GetExcelExporter().Export(path, sheets, configuration: configuration); + var rowsWritten = MiniExcel.Exporter.GetOpenXmlExporter().Export(path, sheets, configuration: configuration); Assert.Equal(2, rowsWritten.Length); Assert.Equal(2, rowsWritten[0]); diff --git a/tests/MiniExcel.Tests/MiniExcelOpenXmlTests.cs b/tests/MiniExcel.Core.Tests/MiniExcelOpenXmlTests.cs similarity index 97% rename from tests/MiniExcel.Tests/MiniExcelOpenXmlTests.cs rename to tests/MiniExcel.Core.Tests/MiniExcelOpenXmlTests.cs index e038fa7f..9c533edc 100644 --- a/tests/MiniExcel.Tests/MiniExcelOpenXmlTests.cs +++ b/tests/MiniExcel.Core.Tests/MiniExcelOpenXmlTests.cs @@ -1,9 +1,7 @@ -using System.IO.Packaging; -using ClosedXML.Excel; +using ClosedXML.Excel; using ExcelDataReader; +using MiniExcelLib.Core.OpenXml.Utils; using MiniExcelLib.Tests.Common.Utils; -using MiniExcelLib.Attributes; -using MiniExcelLib.OpenXml.Utils; namespace MiniExcelLib.Tests; @@ -11,8 +9,8 @@ public class MiniExcelOpenXmlTests(ITestOutputHelper output) { private readonly ITestOutputHelper _output = output; - private readonly OpenXmlImporter _excelImporter = MiniExcel.Importer.GetExcelImporter(); - private readonly OpenXmlExporter _excelExporter = MiniExcel.Exporter.GetExcelExporter(); + private readonly OpenXmlImporter _excelImporter = MiniExcel.Importer.GetOpenXmlImporter(); + private readonly OpenXmlExporter _excelExporter = MiniExcel.Exporter.GetOpenXmlExporter(); [Fact] public void GetColumnsTest() diff --git a/tests/MiniExcel.Tests/SaveByTemplate/InputValueExtractorTests.cs b/tests/MiniExcel.Core.Tests/SaveByTemplate/InputValueExtractorTests.cs similarity index 98% rename from tests/MiniExcel.Tests/SaveByTemplate/InputValueExtractorTests.cs rename to tests/MiniExcel.Core.Tests/SaveByTemplate/InputValueExtractorTests.cs index 72c4d81d..e5df32a9 100644 --- a/tests/MiniExcel.Tests/SaveByTemplate/InputValueExtractorTests.cs +++ b/tests/MiniExcel.Core.Tests/SaveByTemplate/InputValueExtractorTests.cs @@ -1,4 +1,4 @@ -using MiniExcelLib.OpenXml.Templates; +using MiniExcelLib.Core.OpenXml.Templates; namespace MiniExcelLib.Tests.SaveByTemplate; diff --git a/tests/MiniExcel.Tests/SaveByTemplate/MiniExcelTemplateAsyncTests.cs b/tests/MiniExcel.Core.Tests/SaveByTemplate/MiniExcelTemplateAsyncTests.cs similarity index 97% rename from tests/MiniExcel.Tests/SaveByTemplate/MiniExcelTemplateAsyncTests.cs rename to tests/MiniExcel.Core.Tests/SaveByTemplate/MiniExcelTemplateAsyncTests.cs index 3f413965..7a946d07 100644 --- a/tests/MiniExcel.Tests/SaveByTemplate/MiniExcelTemplateAsyncTests.cs +++ b/tests/MiniExcel.Core.Tests/SaveByTemplate/MiniExcelTemplateAsyncTests.cs @@ -4,8 +4,8 @@ namespace MiniExcelLib.Tests.SaveByTemplate; public class MiniExcelTemplateAsyncTests { - private readonly OpenXmlImporter _excelImporter = MiniExcel.Importer.GetExcelImporter(); - private readonly OpenXmlTemplater _excelTemplater = MiniExcel.Templater.GetExcelTemplater(); + private readonly OpenXmlImporter _excelImporter = MiniExcel.Importer.GetOpenXmlImporter(); + private readonly OpenXmlTemplater _excelTemplater = MiniExcel.Templater.GetOpenXmlTemplater(); [Fact] public async Task DatatableTemptyRowTest() diff --git a/tests/MiniExcel.Tests/SaveByTemplate/MiniExcelTemplateTests.cs b/tests/MiniExcel.Core.Tests/SaveByTemplate/MiniExcelTemplateTests.cs similarity index 96% rename from tests/MiniExcel.Tests/SaveByTemplate/MiniExcelTemplateTests.cs rename to tests/MiniExcel.Core.Tests/SaveByTemplate/MiniExcelTemplateTests.cs index 10d3b086..067427d4 100644 --- a/tests/MiniExcel.Tests/SaveByTemplate/MiniExcelTemplateTests.cs +++ b/tests/MiniExcel.Core.Tests/SaveByTemplate/MiniExcelTemplateTests.cs @@ -1,15 +1,15 @@ +using MiniExcelLib.Core.Enums; +using MiniExcelLib.Core.OpenXml.Picture; using MiniExcelLib.Tests.Common.Utils; -using MiniExcelLib.Enums; -using MiniExcelLib.OpenXml.Picture; using OfficeOpenXml.Drawing; namespace MiniExcelLib.Tests.SaveByTemplate; public class MiniExcelTemplateTests { - private readonly OpenXmlImporter _excelImporter = MiniExcel.Importer.GetExcelImporter(); - private readonly OpenXmlExporter _excelExporter = MiniExcel.Exporter.GetExcelExporter(); - private readonly OpenXmlTemplater _excelTemplater = MiniExcel.Templater.GetExcelTemplater(); + private readonly OpenXmlImporter _excelImporter = MiniExcel.Importer.GetOpenXmlImporter(); + private readonly OpenXmlExporter _excelExporter = MiniExcel.Exporter.GetOpenXmlExporter(); + private readonly OpenXmlTemplater _excelTemplater = MiniExcel.Templater.GetOpenXmlTemplater(); [Fact] public void TestImageType() diff --git a/tests/MiniExcel.Core.Tests/TemplateOptimization/DummyFiller.cs b/tests/MiniExcel.Core.Tests/TemplateOptimization/DummyFiller.cs new file mode 100644 index 00000000..0c174a8e --- /dev/null +++ b/tests/MiniExcel.Core.Tests/TemplateOptimization/DummyFiller.cs @@ -0,0 +1,74 @@ +namespace MiniExcelLib.Tests.TemplateOptimization; + +public class FileSystemEntry +{ + public string Path { get; set; } + public SecurityIdentifier Owner { get; set; } + public FileAttributes FileEntryAttributes { get; set; } + public Dictionary Acl { get; set; } + public bool IsModified { get; set; } + public string Error { get; set; } +} + +public static class DummyFiller +{ + public static IEnumerable GenerateDummyFileSystemEntries(int n) + { + var allRights = Enum.GetValues().ToArray(); + var random = new Random(); + var firstAcl = DummyAccessList(random, allRights); + + yield return new FileSystemEntry + { + Path = $@"C:\Users\DummyUser\Documents\", + Owner = DummySecurityIdentifier(random), + FileEntryAttributes = FileAttributes.Directory, + Acl = firstAcl, + IsModified = (random.Next() & 1) == 1, + Error = firstAcl.Count == 0 ? "Access Denied" : string.Empty // 10% chance of error + }; + + var tempEnum = Enumerable.Range(1, n).Select(i => + { + var acl = DummyAccessList(random, allRights); + var randomAttributes = (FileAttributes)((1 << random.Next(12)) | (int)FileAttributes.Normal); + randomAttributes &= ~FileAttributes.Directory; + return new FileSystemEntry + { + Path = $@"C:\Users\DummyUser\Documents\File {i++}.txt", + Owner = DummySecurityIdentifier(random), + FileEntryAttributes = randomAttributes, + Acl = acl, + IsModified = (random.Next() & 1) == 1, + Error = acl.Count == 0 ? "Access Denied" : string.Empty // 10% chance of error + }; + }); + foreach (var entry in tempEnum) + { + yield return entry; + } + } + + private static Dictionary DummyAccessList(Random random, FileSystemRights[] allRights) => + Enumerable.Range(0, random.Next(0, 5)) + .Select(_ => new + { + Sid = DummySecurityIdentifier(random), + AccessType = DummyFileSystemRights(random, allRights) + }) + .GroupBy(o => o.Sid) + .ToDictionary( + g => g.Key, + g => g.Select(x => x.AccessType).First() + ); + + private static SecurityIdentifier DummySecurityIdentifier(Random random) => new( + $"S-1-5-21-100000000-100000000-100000000-{random.Next(999990000, 999999999)}"); + + + private static FileSystemRights DummyFileSystemRights(Random random, FileSystemRights[] allRights) + { + var rightsCount = random.Next(1, allRights.Length); + return (FileSystemRights)random.NextInt64((1L << rightsCount) - 1); + } +} \ No newline at end of file diff --git a/tests/MiniExcel.Core.Tests/TemplateOptimization/MainTest.cs b/tests/MiniExcel.Core.Tests/TemplateOptimization/MainTest.cs new file mode 100644 index 00000000..1bccb412 --- /dev/null +++ b/tests/MiniExcel.Core.Tests/TemplateOptimization/MainTest.cs @@ -0,0 +1,82 @@ +namespace MiniExcelLib.Tests.TemplateOptimization; + +public class MainTest +{ + private readonly ITestOutputHelper _testOutputHelper; + + public MainTest(ITestOutputHelper testOutputHelper) + { + _testOutputHelper = testOutputHelper; + } + + internal const int GenerateLimit = 1000; + + [Fact] + public void OptimizationTest() + { + var tmpFilePath = Path.Combine(Environment.CurrentDirectory, @"C:\Users\computer\source\repos\MiniExcel\tests\MiniExcel.Core.Tests\TemplateOptimization\template.xlsx"); + + var testList = DummyFiller.GenerateDummyFileSystemEntries(GenerateLimit).ToList(); + _testOutputHelper.WriteLine("Getting SIDs from result(owner)"); + var identities = testList.Select(x => x.Owner).ToList(); + _testOutputHelper.WriteLine("Getting SIDs from result(ACLs)"); + foreach (var securityIdentifier in testList.Select(x => x.Acl).SelectMany(sid => sid.Keys)) + { + identities.Append(securityIdentifier); + } + + _testOutputHelper.WriteLine("Creating Matrix List"); + var timer = Stopwatch.StartNew(); + var matrixCreator = new MatrixCreator(testList, identities); + var matrixRows = matrixCreator.Creation().ToList(); + timer.Stop(); + _testOutputHelper.WriteLine($"Created in {timer.Elapsed}"); + + var sheets = SheetCreation(matrixRows); + tmpFilePath = matrixCreator.ExcelFileCreator(tmpFilePath); + + var timestamp = Stopwatch.GetTimestamp(); + var memory = Environment.WorkingSet / (1024 * 1024); + TestingMethod(matrixCreator, sheets, tmpFilePath, "result_template.xlsx"); + memory = Environment.WorkingSet / (1024 * 1024) - memory; + var elapsed = Stopwatch.GetElapsedTime(timestamp); + + _testOutputHelper.WriteLine($"\n \n Memory used: {memory}MB \nWith Time: {elapsed.TotalMilliseconds} ms \n \n"); } + + private static void TestingMethod(MatrixCreator matrixCreator, Dictionary sheets, string templatePath = "", string saveAsName = "result.xlsx") + { + var path = Path.Combine(Environment.CurrentDirectory, saveAsName); + if (File.Exists(path)) File.Delete(path); + MiniExcel.Templater.GetOpenXmlTemplater().ApplyTemplate(saveAsName, templatePath, sheets); + } + + private static Dictionary SheetCreation(List? matrixRows) + { + var sheets = new Dictionary(); + if (matrixRows is null) + return sheets; + + var pages = (int)Math.Ceiling(matrixRows.Count / ReportHelper.MaxMatrixRow); + var matrixLength = matrixRows.First().Access.Length; + var identityParts = (int)Math.Ceiling(matrixLength / ReportHelper.MaxMatrixIdentityPart); + + for (var page = 0; page < pages; page++) + { + for (var part = 0; part < identityParts; part++) + { + var startPart = (int)(part * ReportHelper.MaxMatrixIdentityPart); + var endPart = Math.Min((int)(startPart + ReportHelper.MaxMatrixIdentityPart), matrixLength); + + var partName = identityParts == 1 ? "" : $"-{part + 1}"; + var sheetName = "Matrix" + (page == 0 && identityParts == 1 ? "" : $"_{page + 1}{partName}"); + + var chunk = ReportHelper.Page(matrixRows, (int)ReportHelper.MaxMatrixRow, page) + .Select(x => x.ToDictionary(startPart, endPart)); + sheets.TryAdd(sheetName, chunk); + Console.WriteLine($"Adding {sheetName} Sheet"); + } + } + + return sheets; + } +} \ No newline at end of file diff --git a/tests/MiniExcel.Core.Tests/TemplateOptimization/MatrixCreator.cs b/tests/MiniExcel.Core.Tests/TemplateOptimization/MatrixCreator.cs new file mode 100644 index 00000000..115a2455 --- /dev/null +++ b/tests/MiniExcel.Core.Tests/TemplateOptimization/MatrixCreator.cs @@ -0,0 +1,257 @@ +using System.Buffers; +using System.Collections.Concurrent; +using ClosedXML.Excel; + +namespace MiniExcelLib.Tests.TemplateOptimization; + +#region Models + +/// +/// Represents access types for file system permissions +/// +public enum AccessType : byte +{ + None = 0, + FullControl = 1, // 'F' + Modify = 2, // 'M' + Write = 3, // 'W' + Read = 4, // 'R' + Special = 5 // 'S' +} + +public class AccountInfo +{ + public SecurityIdentifier Sid { get; set; } + public string Name { get; set; } + public string Domain { get; set; } +} + +#endregion + +#region Helper + +/// +/// Helper class for account-related operations +/// +public static class ReportHelper +{ + public const double MaxMatrixIdentityPart = 400; + public const double MaxMatrixRow = 400; + + public readonly struct MatrixRow(string path, AccessType[] access) + { + public string Path { get; } = path; + public AccessType[] Access { get; } = access; + + public Dictionary ToDictionary(int startPart, int endPart) + { + var dict = new Dictionary(endPart - startPart + 1) + { + ["Path"] = Path + }; + + for (var i = startPart; i < endPart; i++) + { + if (i < Access.Length) + { + dict[i.ToString()] = GetAccessType(Access[i]); + } + } + + return dict; + } + } + + private static ConcurrentDictionary AccessTypeMap { get; } = new( + new Dictionary + { + { FileSystemRights.FullControl, AccessType.FullControl }, + { FileSystemRights.Modify | FileSystemRights.Synchronize, AccessType.Modify }, + { FileSystemRights.Write | FileSystemRights.Synchronize, AccessType.Write }, + { FileSystemRights.Read | FileSystemRights.ReadAndExecute | FileSystemRights.Synchronize, AccessType.Read } + }); + + public static string? GetAccessType(AccessType accessType) => accessType switch + { + AccessType.None => null, + AccessType.FullControl => "F", + AccessType.Modify => "M", + AccessType.Write => "W", + AccessType.Read => "R", + AccessType.Special => "S", + _ => string.Empty + }; + + public static AccessType GetAccessType(FileSystemRights acl) => AccessTypeMap.GetValueOrDefault(acl, AccessType.Special); + + public static IEnumerable Page(IEnumerable en, int pageSize, int page) + { + return en.Skip(page * pageSize).Take(pageSize); + } +} + +#endregion + +public class MatrixCreator +{ + private ConcurrentDictionary _entryCache; + private readonly List _resultList; + private readonly List _aclSids; + private readonly ConcurrentDictionary _identityCache; + + public MatrixCreator(List resultList, List aclSids) + { + _entryCache = []; + _resultList = resultList; + _aclSids = aclSids; + _identityCache = new (_aclSids + .Distinct() + .Select((sid, index) => new { sid, index }) + .ToDictionary(x => x.sid, x => x.index) + ); + } + + + public IEnumerable Creation() + { + var first = _resultList.First(); + yield return new ReportHelper.MatrixRow(first.Path, CheckPathAccess(first.Path, first.Acl)); + + foreach (var fileSystemStruct in _resultList) + { + var child = fileSystemStruct.Path; + + var childAccessArray = CheckPathAccess(child, fileSystemStruct.Acl); + var parentArray = CheckPathAccess(Path.GetDirectoryName(child) ?? child); + + + // If the parent and current Path array is not sequence equal + if (AreAccessArraysEqual(childAccessArray, parentArray)) continue; + yield return new ReportHelper.MatrixRow(child, childAccessArray); + } + } + + private static bool AreAccessArraysEqual(AccessType[] array1, AccessType[] array2) + { + // Quick check: if both arrays have the same reference, they're equal + return MemoryExtensions.SequenceEqual(array1, array2); + } + + private AccessType[] CheckPathAccess(string currentFolder, + Dictionary? accessDict = null) + { + if (_entryCache.TryGetValue(currentFolder, out var accessArray)) return accessArray; + if (accessDict is null) return []; + var accessSpan = GetAccess(accessDict); + if (!accessSpan.TryCopyTo(accessArray) || accessArray is null) accessArray = accessSpan.ToArray(); + _entryCache.TryAdd(currentFolder, accessArray); + + return accessArray; + } + + private Span GetAccess(Dictionary accessDict) + { + var pooledArray = ArrayPool.Shared.Rent(_identityCache.Count); + try + { + var resultSpan = pooledArray.AsSpan(0, _identityCache.Count); + resultSpan.Clear(); + + foreach (var (sid, rights) in accessDict) + { + if (!_identityCache.TryGetValue(sid, out var index)) continue; + resultSpan[index] = ReportHelper.GetAccessType(rights); + } + + return resultSpan; + } + catch (Exception ex) + { + Console.WriteLine($"Error in matrix row creation: {ex.Message}"); + return []; + } + finally + { + // Return the array to the pool + ArrayPool.Shared.Return(pooledArray); + } + } + + public string ExcelFileCreator(string outputPath) + { + Console.WriteLine("Creating base template"); + // Step 1: Create template with ClosedXML + var templatePath = Path.Combine(Path.GetDirectoryName(outputPath) ?? string.Empty, "template.xlsx"); + using var workbook = new XLWorkbook(); + + MatrixSheet(workbook); + + workbook.SaveAs(templatePath); + + return templatePath; + } + + + private void MatrixSheet(XLWorkbook workbook) + { + var matrixRowCount = Creation().Count(); + var pageCount = (int)Math.Ceiling(matrixRowCount / ReportHelper.MaxMatrixRow); + if (pageCount == 0 || matrixRowCount == 1) + { + Console.WriteLine("No data found. Matrix will be skipped."); + return; + } + + var identityParts = (int)Math.Ceiling(_identityCache.Count / ReportHelper.MaxMatrixIdentityPart); + if (_identityCache.Count > ReportHelper.MaxMatrixIdentityPart) + Console.WriteLine($"Warning: Currently found users count is {_identityCache.Count}. " + + $"Will be separated into {identityParts} parts per page ({pageCount}/{identityParts})."); + + for (var page = 0; page < pageCount; page++) + { + for (var part = 0; part < identityParts; part++) + { + var partName = identityParts == 1 ? "" : $"-{part + 1}"; + var sheetName = "Matrix" + (page == 0 && identityParts == 1 ? "" : $"_{page + 1}{partName}"); + + var matrixSheet = workbook.Worksheets.Add(sheetName); + Console.WriteLine($"Creating {sheetName} sheet"); + // Create header row + var userIndex = 2; + + //Set up Rows + var headerRow = matrixSheet.Row(1); + var fillDataRow = matrixSheet.Row(2); + fillDataRow.Cell(1).Value = $"{{{{{sheetName}.Path}}}}"; + + // Set up splitter cell first + var splitterCell = matrixSheet.Cell(1, 1); + splitterCell.Value = "Path"; + splitterCell.Style.Font.SetFontColor(XLColor.ForestGreen); + matrixSheet.Column(1).Width = 60; + + var headerStyle = headerRow.Cell(userIndex).Style; + headerStyle.Font.SetFontColor(XLColor.White); + headerStyle.Font.SetBold(true); + headerStyle.Alignment.SetTextRotation(90); + headerStyle.Fill.SetBackgroundColor(XLColor.ForestGreen); + + foreach (var sid in ReportHelper.Page(_identityCache, (int)ReportHelper.MaxMatrixIdentityPart, part)) + { + var header = headerRow.Cell(userIndex); + + + header.Style = headerStyle; + header.Value = $"{sid.Key.Value}"; + fillDataRow.Cell(userIndex).Value = + $"{{{{{sheetName}.{part * ReportHelper.MaxMatrixIdentityPart + userIndex - 2}}}}}"; + matrixSheet.Column(userIndex).Width = 3; + userIndex++; + } + + headerRow.SetAutoFilter(); + matrixSheet.SheetView.Freeze(1, 1); + } + } + } +} \ No newline at end of file diff --git a/tests/MiniExcel.Core.Tests/TemplateOptimization/RawDataFillTest.cs b/tests/MiniExcel.Core.Tests/TemplateOptimization/RawDataFillTest.cs new file mode 100644 index 00000000..032c9f2a --- /dev/null +++ b/tests/MiniExcel.Core.Tests/TemplateOptimization/RawDataFillTest.cs @@ -0,0 +1,160 @@ +using ClosedXML.Excel; + +namespace MiniExcelLib.Tests.TemplateOptimization; + +internal static class MiniExcelVersion +{ + private static IEnumerable Page(IEnumerable en, int pageSize, int page) + { + return en.Skip(page * pageSize).Take(pageSize); + } + + private static IEnumerable OptimizeFileSystemStructs(IEnumerable fileSystemStructs) + { + return fileSystemStructs.SelectMany(entry => + entry.Acl.Count != 0 + ? entry.Acl.Select(acl => CreateRawEntry(entry, acl.Key.ToString(), acl.Value.ToString())) + : [CreateRawEntry(entry, string.Empty, string.Empty)] + ); + } + + private static object CreateRawEntry(FileSystemEntry entry, string aclIdentity, string aclRights) + { + return new + { + entry.Path, + entry.Owner, + entry.FileEntryAttributes, + ACLIdentity = aclIdentity, + ACLRights = aclRights, + entry.IsModified, + entry.Error + }; + } + + public static void RawDataFill(IEnumerable fileSystemStructs, string filePath, int maxRowPerSheet) + { + var result = OptimizeFileSystemStructs(fileSystemStructs); + + var sheets = new Dictionary(); + var pageNumbers = Math.Ceiling((decimal)(result.Count() / (double)maxRowPerSheet)); + for (var pager = 0; pager < pageNumbers; pager++) + { + sheets.TryAdd("RawData " + (pager == 0 ? "" : pager + 1), Page(result, maxRowPerSheet, pager)); + } + + using var stream = File.Create(filePath); + MiniExcel.Exporter.GetOpenXmlExporter().Export(stream, sheets, configuration: new OpenXmlConfiguration + { + FreezeRowCount = 1, DynamicColumns = + [ + new DynamicExcelColumn("Path") { Width = 65 }, + new DynamicExcelColumn("Owner") { Width = 50 }, + new DynamicExcelColumn("FileEntryAttributes") { Width = 20 }, + new DynamicExcelColumn("ACLIdentity") { Name = "Account Identity", Width = 50 }, + new DynamicExcelColumn("ACLRights") { Name = "Account Rights", Width = 30 }, + new DynamicExcelColumn("IsModified") { Name = "Modified" }, + new DynamicExcelColumn("Error") + ] + }); + sheets.Clear(); + + using var workbook = new XLWorkbook(stream); + foreach (var worksheet in workbook.Worksheets) + { + var firstRow = worksheet.FirstRow(); + var firstRowStyle = firstRow.Style; + firstRowStyle.Fill.SetBackgroundColor(XLColor.FromHtml("#FF228B22")); + firstRowStyle.Font.Bold = true; + firstRow.Height = 30; + firstRowStyle.Alignment.Horizontal = XLAlignmentHorizontalValues.Center; + firstRowStyle.Alignment.Vertical = XLAlignmentVerticalValues.Center; + firstRowStyle.Font.SetFontColor(XLColor.White); + } + } +} + +internal static class ClosedXMLVersion +{ + private static IEnumerable Page(IEnumerable en, int pageSize, int page) + { + return en.Skip(page * pageSize).Take(pageSize); + } + + private static IEnumerable OptimizeFileSystemStructs(IEnumerable fileSystemStructs) + { + return fileSystemStructs.SelectMany(entry => + entry.Acl.Count != 0 + ? entry.Acl.Select(acl => CreateRawEntry(entry, acl.Key.ToString(), acl.Value.ToString())) + : [CreateRawEntry(entry, string.Empty, string.Empty)] + ); + } + + private static object CreateRawEntry(FileSystemEntry entry, string aclIdentity, string aclRights) => new + { + entry.Path, + entry.Owner, + entry.FileEntryAttributes, + ACLIdentity = aclIdentity, + ACLRights = aclRights, + entry.IsModified, + entry.Error + }; + + private enum HeaderColumn + { + Folder, + Owner, + FileEntryAttributes, + ACLUser, + ACLAuthorityLevel, + Modified, + Error + } + + + /// + /// This method populates the 'rawdata' sheet in the Excel workbook with the provided results list. + /// + /// The Excel workbook to work with. + /// The list of results to populate the sheet with. + /// + public static void RawDataFill(IEnumerable fileSystemEntries, string filePath, int maxRowPerSheet) + { + using var workbook = !File.Exists(filePath) ? new XLWorkbook() : new XLWorkbook(filePath); + var result = OptimizeFileSystemStructs(fileSystemEntries); + var maxPages = Math.Ceiling((decimal)(result.Count() / (double)maxRowPerSheet)); + + for (var pager = 0; pager < maxPages; pager++) + { + var worksheetName = "RawData" + (pager == 0 ? "" : $" {pager + 1}"); + var worksheet = workbook.Worksheets.Add(worksheetName); + for (var i = 0; i < Enum.GetNames().Length; i++) + { + worksheet.Cell(1, i + 1).Value = Enum.GetName(typeof(HeaderColumn), i); + } + + // Apply styling to the headers + var headerRange = worksheet.Range(1, 1, 1, Enum.GetNames().Length); + headerRange.Style.Fill.SetBackgroundColor(XLColor.FromHtml("#FF228B22")); + headerRange.Style.Font.Bold = true; + + var dataToSet = Page(result, maxRowPerSheet, pager); + + //2. tól kezdjük a fejléc miatt + worksheet.Cell(2, 1).InsertData(dataToSet); + _ = worksheet.Range("A:F").SetAutoFilter(); + _ = worksheet.Columns("A:F").AdjustToContents(); + _ = worksheet.Style.Border.InsideBorder = XLBorderStyleValues.Thin; + _ = worksheet.Style.Border.InsideBorderColor = XLColor.FromHtml("#FF3B444B"); + _ = worksheet.Style.Font.SetFontColor(XLColor.Black); + + worksheet.FirstRow().Height = 30; + worksheet.FirstRow().Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Center; + worksheet.FirstRow().Style.Alignment.Vertical = XLAlignmentVerticalValues.Center; + worksheet.FirstRow().Style.Font.SetFontColor(XLColor.White); + } + + if (!File.Exists(filePath)) workbook.SaveAs(filePath); + } +} \ No newline at end of file diff --git a/tests/MiniExcel.Core.Tests/TemplateOptimization/template.xlsx b/tests/MiniExcel.Core.Tests/TemplateOptimization/template.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..e7f41a0fc9251236193d4d1323b01a9437477164 GIT binary patch literal 55272 zcmeEuXIPX;*0vE95DXxS2#O$*L~;fN2};f&NwVaep;07APLe~5B#|UZK#~Ye4r-I3 zL9&D<=lE4IyE8kxv%51JuJ^mH_x;h;Rj2McRp->Hy3g~pC@XRN1ksTrM@}EfdA;_S zeDj@E_0c0o^iCZ)LI|WzW=xKjHm16kmZo={%*~1;H7(=s68RkX8;Q&)3E$nKqszP{ z66um}ET3iW76YUggXO@0j44s!3mx>9FV>5wnwG_rSt;8^q}*@v9$r@m}5aDE6U&sb-^ z>zpg!8@F0^411h8p7A(d+UgG*Zyqj0w(@}lyW{)otSUz~-?`B%KTPA6+Nfn|B^Wk1 zdB)@Rs~vl{PikMXO??E3D|m3(IaPDBS2m=Uyz~h5XS(qC8r^w?IW|v}a7*7zSD)aV z&UxoJV$i7OdT^&U-NsPQ`?zbgpI)f6_&M=&w@E!IkBOX!+YlaQ7)rPoaN}jY`njjv zC%!sK9Lw2G{=qQhe{U8FFa9t&{bnimG!dd=4IR*aU4^v3(AGVPqGf(YUImTGq2uq( zS+!xhW~Cgb7`3rLnyvAc;l*U>QX9&+MZ+!DEzxUfd;{xnfy0DylTf>N?BdO>2O&(P zO(gc)Rv{td@f(}euGhP@d$dK#Pu9n7?G7eapZ%cCC;zRgp z6|_iciku~-f0a=1bt_clb{U@FFK}+q~WQO;b ze_#T$CS{Xb*rS)U4cXU{1o3zuT(mRJaloK z+1?g$;kS23uZoIV3KBSYw8tc2kTNqH6};0qoqGj7{0qrAwwRolCvR(8%k{+YiesFa zDn6@*s5yj0$wrjTdkPxAZCRbIp~o+dRgNykUYKF6{NcLccV?70okuEjeKIFAS+aZ% z*VM0=gRI4iM=C1>!^Yla{4uy&zBbmTZ}vTaeT_G)L&&=x?dg4qBX*g++j!AjPB<|g zD`*x-G0WCw5qD{pt(MO$(->VEea45U&0c2pE_?d)1V>G0YvwSAtx0C4LY@;kl_%)K zhf6bTYgaZSAd1PAVO};PQ-+mrp>r;iY3JdBYKHS1cLh)_!1eN@aH8S5@k%Xkr*Sho zkcvs3qX+4q|Ty`^^P z-ASUXghp@Ct7TUF9PH_8C6$bZ@6bf4mu>5Ezwopr<65*~;GB zn@6e~S4+qLv>;cBDo~GID?0GVH+<($d#mE$g+H@mirPo|PV=OG_UBhjII$mBRf5*y zbqE`@xcxP6)(_*b(P}{FoT4Q4mK~!>b+>#^Rm1cs@xY=dfFOTZv%Ft=f zO}$XJqpex8Sm#18pE5wjyJ|OALq?bWfgb-_OPYM0`uT+f#lX^G&4q-{ZAFybFpf8^ zNR^5Lo6%w==?wRdL0V5t^94a3dKquOfiH4mbW#<0=NGyZ6E=-`q9i8#kUn3(gyRxf zQdmnSJtDFcAv>N*iQ4PV*Pv4v#F?k0%amOTW}D878|6MuLjH(B*^T~;=?y#&_u~`=2@T~Kr64Rz# z>aqGA(j^rs>cG6pPyYVw=`Ur(==270L=h5n`hyE#tux%52k-KeQZ(;GvJUmUympp0|LR6AeNtw{lCmO&f-ODf zvX;Ex7zcBrf_&K6p56BWx=3z|iwgSG#5_a(y()T{W4S=xoRiG4&=cu44eD}v%=Sbm zIK^_Qqq1a>ZF+8GLqS7%{u^DB1lGvwY2O;mO~|hk3l3eoN36ha^h5Oy@jVL#8KeYt z=#;d>Yuy=HfA+<_nC9!ikqHsFH?$=hY%+3rQ72Rr2y zxW|W>S7gCgS!iCjB7yV4JC~sRq!(_*={Ai$LWWA9N5G2xJ!tKyppKseO^nJ?Yn>v& zR+$xt3TR?)?!U_;K^c3Mt-R@k8;={EZ$*m8jGl>w(rWv|iO>!98I_Z|{HJ<&O&EOL zrd96%E$5l%xPfU3i;8|=3PQ{^4X}vr&Gv_h?Zx-G>Cz{aPj0+ATFIuW`dz{e~WJ*W<6Ifoo(49(lg0dcJ!>iB1*q z!L;=@jl62l{L7MFbO6lmT(N>82p-b;t{k97xy}`OY~yoM1n?$r$4mcA`z%be95c!m zC;c3V1wK-Q+iPG!M}>88Li3H1s~uDr);F(0;tIqkLdDQk!2A+*WCO5gn7c6)cwsMV z1|2raeQ_lVT5N}umVz!EU5Np}TyTLxJ}8c;={ z4o2sbA@1@37oX+52ZSYWwqr=A=Dg_@B`0iolGeL*r*6pThcG&j7a$~ZBRl(2@m6f& z<fPf1Enmw@FGX1||G1-^KJj4{q6 zv(e_60Z!Ope-i>cxpJM_6v$#r2i~A;8VPgX7xg+fUd*%)m;YQ6yu zd|V?wwV!14novmb*aKT9JA{g)@_(WTn)^-lERVx~ZZfeQ}q z8n}^pof&+0f8a`h29m(-CfG7peQ(PwaJKI7cmz&_vR8KNa*umcJOL}T=_xdTYDrqd zi-8~T98W?2IdbnQ>G6y8z)j_+Z8(hCJBd(}`uX8&z^+noHQO{A*pezr=0sXbzwih5 zhRrgVp<6)~sMAdp`7Re1kK3Rh(vM#{HUbK;g8oSN>yFu;6pUvkP{ z0K@oJy+VP51to?X!SzFqNzpa2NHc0F0;<(E&Fg;h{T-5)8%%A-!3xUrbUVP&UwCIb z{wKtx7T`WSVujdG5*J{l+XG(>fgXLjXVXC0!g-c0 zMAt-IA8E$zpV?TzNJft84f7#J~sSHOSWJ4{0eek4I;`M1mo0 zJjJV#lN_0hProh3?2SmT3Ik9b3VDA2OzJy3gFSF@b9b9lVm`O=eli4RELYWg!@hx1 zCnANh1nIEsl*?DA&VATg{sVjjC)FK|9tZ&^{_S(2I%Di)m^2VYtqpQ_^g83cKwgZwj-3Rf!L0=f+l zU_P9#GB?;iIZ1)3|6>KQo)`^NVtzVhOD#tw1*+G`_{Ynrl$bbmseXO1iZQbO7;E^2 zJpz=**xjpz?s`1R16W%4ehF}aGR31wu)Z8f-)cktn|wf3dBj*F9c&#gJ@Lp_UK;lH zD;LW(=6>k!oZgU=TuQhnl2Txh?T@=*zy&3bAK590(JYu2 zG2fG!2z6ZT=7Ha)C^u>F1$YnIi1j-K`OKBa7j7~6iPySsr#k&<1IT%K)K-r0gA-U| z7caO@&)LrGS%mhd64cN3Q0y)Un8@+|dM~&}bKY*4 z1Wr8>h2y6fY$2!NT>I!wq_CBc?g)wGu@XvAz~~?w92<4>hl-NSKTMYOP+8NoO`{g3|ZzL+xHO-!P1ByPnJ?*`YqGu@?q;PQxBMR`TLA8 zu%+Yuabg8mJ_>4aa20S*fFwl>%NO%)0kq!Bl#ru3$vecR8bOP|Yy{HukYlixo|%O= z_c*wX7Yy_(>j96A4*9~nS)|fdp5Lg!6LKzF`8P00VIx?leHQ;mP80})b!%|`z&?EC zrvqvD{S{~rY=H1;&jA-{A=yiR+9X!{&M=_*JyTT<2qnSQt;&=b-NxgGE_c(6(Z*2V zNMf=$gO9@A7~y%awvWt6G&n_qF{Ab_-jmqkK;Fd(brD#thSC}wT8 zv+C=)xo%Owd=;7r@((-kgcD3&GE7SmrWOR$F}06XLSi+oSY<$%Oo`JFPP(KOl;~Trn4JN3a9BnO)%h{f z-E-r1`emD%!iRu+HJCK$;VQg$nnBA=Ns=GVt$p**>pNc|OD8FTT%K&XI3?^2j<_)M6!C7B52UCJ5Q!&cUn@L=$+op3^9&~Ojt%uoUGkAs(P9j#ZcRWJ1Hvb7N z>-dTZeD5`aMSmc)0+FnCDY`uj?5=wdmzXrT6*_TUVTz)yM+R8F^6rbGSaFc493~9f z#0v>fvx*~YSSOk}za{O^8IV?2OrF4%4|4N@Nk8@w%fZ|>0py(8N@W`0QdpA=hvA#X z4M>1&`5W2~8anJG@aZM+jI9-ndCayQ@RqGM6+8w6H%7tpl5iD!njlc<9`pmGwr;~Q zLSRwL2*>Y<7kLTQSU@?_1igqgD&M^FAQJZvbsu-D|=8#Zvqs+X!G%3FS68 z#S4z74l`E-&-6HC#W+X|L^lfF_#0e`Cov&|YQJb!W{657GD2oLMhFZb{LU4FE_yBrbfICct!;W%K_YaTQj9Cu3+7o8#wS5VtRgf z(vjwAZ)2LL*amq8fyTY8(L@l#3#Ogg>|M5OJ*_yXuVq(!%1g`>>h6P7x;laCi zmuI=1>gRwLH!%K({G`XpB?J!?`(diN!TwHnF5aa%8?1)^MW-t}d;7=(Sq9$kCfQ}9}Wf2uz5Gz6~d?*POG|3gufYDW#) z4{T1wQF=PW4{ngFx*z7Ml9jzr^+b1;Qz=`b8H2%5claW$@G2#SXZ;O2st0`6cOE8< z7kbEjlXc(mpCx@whU#Q%{m=_CNe;h&&$wdD98{F6wnQ*%J>_o>QafjwFeM;-BZVi% z+-d8Q*7ih$%73rYdtHb(R!~GD;SX3kEDC{AKZWx{Gv5P=FXS``JQs z2{Gm_TU^F>FvT_cb^<{U(jeE)=P(U&JKN6yvI5(zudAdA5*nN}!zm!6TsQuha(RZk z@;nkAk~{W8u(L72HQrS!z~-}>q^#GNVg06)>O4#>QofV|rVYZtl% zSKz-)hEjaxtD*`LOH;b&0FkKp+%^`uz(uXQ7B4ywGV}Cbxfb3cxw%>ZFr^Yj*6tVN$I=7Yq_nGvpNkkfNjggH=Fs zU51u~9+L8Bpg?toc?JlW96pPxet{7NT4PM;V>~w#m6p zqYbW$`Eibd{>-^f^z-TBHW3AP;+~xKr#DvZ*dzt=z-grK=Q8?THQ+>H11%ql`GXz-23WB=52Bc)_;#=bCTHv`ZN8`-5N8s$`fxDk< zd2r)89Y_{pVl+VmJjrCiFBPSwU|Ntvk8(#45Wxqe;9Q(sFwv>i)oJk@by{I9z@S-; z*~;K%BR)(^4qw*7iyu5e`3}zAWEKNC;T-E_G3LlKgSOi6Eyns=GGbd>`bt|N{)|X5 z-h1FNHtQojxO1&-$ZmjCc#jTJ;o#iG7hr5?e7G;P7rbfeZoYc$tTPeFos`6s;flvd z6a$yYs#NsG5d78fhK+@17?W&{R*SlUZ?7;!wfwpBMigx3`zb7HPiR&%Q^9yFq5?4~MZ6SwN* zhw!%4Poh`%p_DBa!K7#;Af-9%>c_KU{AN?D(OeRU<6WS*O%o`Hm0|Th z98tP^I06^JG|m|az;8FT-nP4u##EBLV@3MhUs#Z^_c?V9xz2DXa5#PVwLVq>yB(?z zzt-b^YB~JWlB*zDE(OyS^?iq`iLf3N7XjFFb-{b4HKTXiHJN9HmTF(CQP|LaQXzaB zf?lZ~t~kwW7%nY#5H3yO*m`BC5i1xI^JAw%3}|Y0gX!KRAKH@rl?~~uNn@5d~ z5u8lG<+}9bj_hT8qFcwkzuwc~kiASmlz!ZM>7I^&?B#QFPv}w@*I!<#A;`3$cCCwf zeV67oJ}z#A=jXSt@6zAK$HPT?elC4|m+3Y>KJLXApBrD_Wxb7m7FXfL=ib+MId9_= z;6}Xo{NqW3Kv_7yu8Ztt3ZltV-bX(NKZ5G;lkYybEqUJIbufM3O`J2{4~2AI$;MC< z`JC}K7Sc(OjiDjJ!S(hN(n*z#p(XOc_0AO1$(D_wC&Izw{Ztz{cfQd3vsLn4&D((_ zxGUbDpC#YbxgB^Jm(}NUX!2cy-mlklSM3$FxD485V_6j^@guowgFo9)Ga*@w-nL$G zC{?8YlUVo{1gO3jexT7r?tElqLHzoAv84Np=R7mc@%en`K0!!%7mlQ}^=VE>K2-AS z>b3asN9!-Sf35D%bN_!L{Sw2!=;hpMK82Y))9UP{S#( z*?wwx`%^+Pv(eMmE2OqQ_5a^ieG-zlM{w6#g2YD^;}SEz&GAJVPGz$3%B1x<)3voL z7&|0ADqK-~m&i%!r_e-xBb*Dw-T$6yCb|72ej>N9QTvxzR=fYJ9{K@)68{Bv?UVMq zF|7Yr{mBoKllT$bwfgOMV_E;N3jGkq$|l&H?CyN-VFJ8A{@&G6ymFt)ny&BWg9{nq z{6hbGs$D6l1RZ80)z&MQY<>RctJXg2=3mpo6zE1Xq|+uQx$JFB6L`v)r4t7)Wk_52 zE6|kGWky^b?PT0b>^o=gRevi_Xw6F$l=j~B)S&Jy3QBvQda67jgmUK<($EUrt}CR$ zhh^Yl>0jaE$0K|^Oyx!iv%Qb#jYIf#Sc)E&^%RG7P$FvIva+o@5x-+)TRbf1oGO{R zu8`Y(>95a{O-zmqQc30!o+X8NWp*v^8T=e$IK|_y5M7kCL^p07%Of0c1p=a2wDiE& zB^HQd)H}r0IT0_1swE~92OcUSIaI`Ss7Uh=PzC^IqKU}{0X-n^Ocn`%IEhOTcZuOp zkxB)w^P6c_sU(wcx+tbdzP?nHzc$D@9|jOtD=vFQT%t#0j?>aGD(|v1Ig))M=RRje z`Ca@|>@(q`8OMT8#^4d*9QSUzr^6;2bC$^GxcBru9X{C@LL!_K-e>OXJdlk!PvmpL zoA$nrq-@MZBAk=n5AW+J%Ek~A`JD7NzOSPp8$&{bgX8UYUq@dy<_eJyj(6sL9W&XO zt3)`byqoUp*vZCRBl0=rJ$+xtO*V#t2(XCV{Q`tv6R!h zNl2$iHinVN2hV$2NT)(JhKUFV-}{WPPMvHFGm#IzH?6Qvt8C0qspcO|_xL@&AN8uf z`TP^PGfs{0=_H}W%bru`_+Ek}>NhgY-_Ae(Kb8Kc^S?=6a<`Tj3(lLo9Q^Oas<1U1 z{G0WshPS?}Q~als+y7{${AXpMtcrpf$%wM^|BM<$|M&30Uoc=-N_#>wtI?0vD?GM7 z|5yFV4>buoca1K$Ucs^T`M>HiRe=l`nE4>mrNV%$Ycgy8A)PfxAC zm33x12)v|{rgrrL54;6p|9h%wE=4h{43qc)+_k#x@BhcE+tu8)TY1Rp{dJFHzy3G& zsxcR}ULHGggc$$Gk+XmLH}-bUW(J4=zC@n zn=@3=b*=d~2e9AvTy~>Ua~>qi5{EXD?A+PVNOHC1E1x0t>Ap@(%!i5yxP0?_+3nkT z@)h4EvLxKtk@gB{ocQymM}qJ@vy7uhAJ00FiqPdH-XruH-gu=q8vHqO~pv+QOk*g&Sj#;;km)V^PXH4tq z9}W3dEF5&1)BNmaziSr_E!%iMMOm;c@6&S^w=NR3m!^vx&Alk}Mbr6Z<^A2-xri`# z8-|@t$+;9v`b_*B(Oy@i5iRj_kSrsWJ9EX{ea)k%9$x;yc~r`F!^jHl7v>}FaVgG; zW>UQ)yogYA`b4u-_^$FXR#DT^D@xibkI*)@60fS*1+Qc%6sPV^-)Ar;yt!VmWc`ww zr-5&`W4)=+{RzTDU|@-24(sTlW9xg|Xg1s0sAI@n_sdOJdWogPwj4jFM%NE-Bo)Z1 z77%umbxWRt2ROeDS%Guk=F~47Ig%H4IZ&wCt^RA?Le8WHOK;>k4=Lya-DB3y>C7CS2@wtSx`+P4;o z4>o_4DA0!tmra*j6@Jtd7+$CzLS(BTNkRlH?J6q;5uaBVnrgQfO?mg;M+;s%*ek8- z8?NLJ>Zlg?T;WO(m@qz=UR*&U^7D|$blcs1gVBkB&GHvsNJ19D1MJa!|l_h z52^;42nihqLTJjPDMnV^-Q$K_Y`M0VTF3>g>^B=*HrBDz=%qbD1Th)G##qaJk3>oB zTeX6cK5?yV+&%iaO{x*zx0u+}Ojx*jo}%RD6>VQhu#-(FGm4cdH&_bx%y2gs;{@B} zgr#Vh*2v|qNvE*pt`P!39_XkVx!toJm7+0=+?9D|>fQkQ`Nhh*tGSws_uD{&B1lwY zcE-POaMs`4ue6tV_JVaG{W|rii3)?{9Huv>x15?ZXR%pSy>%Jb3OMUhv>~P&kXo^T_Z5 zk>`owETYfT!V5&7=Y+F}JueO~5PM!3&LaLC75-8Dmc$HYA46<_ev$s2@UHMOaYKno z%05OQC=JW6te zQjNtM3K+h%hSRF1#!@T17iX17e-dUGC0Rq+#t`c%5~s#O9l%zo|LBsjVbiNapc(`g zK%hPZHbG$c?*)E~?qG=hM)HLrb~#ewsn!>gub>$X3t-VBXc4eE-42-eXF(>k*#-!j z0fG)7{vCn8NSrzgaR6J1{yUXBSl9d7gC+WO+C#AT?lED1r>f4fNs-~(V0fllY8kac zp}4I?`g+z&hS)ebkR1**xnyk7)cIE!!?4LH$u`P1#@_|R0>>8v$9KY=CPSmW%;O5P+}&0UB=BzaXfk6p51jr$t_cNwkPRLu@^hSCM|diq@H?lj_w(-@=Xe z9*aw)uLay-jE#c*|6(`uDbUHG&+`Xx1bC-=NWx>1sOVcHZ3Vv_ZvcvR~T5Tq#}NdJHUUR;;J_(EtpynGm-+3+U913pj#k>2_< zF%H(EcvNj#$L)J_Q)Ghiu~UFp#*n z02Y-AYA@?{gc93Vrh5T^ZihkRV8o+OW7glmue67F;DU8NeUEp%W0k2+8z+0#v z1-yC-@M=Cc;MK2ySF_vG9Q7PLZJ8PtPfQKoF>v;@&5dT^ui@U1_-k^_JJ*2sKTfWF z^aryOCpD>NscpkrqgzD^v{^`+o;7Ju;oY(glZ*iZ9UyoK1oS}A3I%#V5DEl;NvVHD zu7?c!dy9>WLQ#_Y%?d(VUu1A0!(M_6%M2KnLH_AKD?k)Rz{__Y1Ya45L?R&gH81`r z1iyz{waNb@1Uubg6eT&0_Y@Qoun2%f3oL+zX~4o)&>(Pde-hblUx}_#Nc>$B6UyFsuW(So*;&V*>7zOn43djldcp>H&fjAdDgD{0jn| zFiMH^e^$Iv(JF3%B)rm$ccbjdtcuWMmK<$dd&usWnOOurd+I$cfJFsyjUL#YBe!Wo&vfnJ=M+&t-_fnA@S6|7vbD6UYm6sSn}=8M@* z*S1t<3eh5{*nLkLRZciNUAmDqFr5k>yx*WBFx$15Ji_&X2JIoYYRp0jp|2SFMQx1= zy1U_2$pCiMz$12N?fY={dPfLNNJ~T4eEeERmT~6vRkp;5k(`xj1_IUq%+g)XfslC1 z1?6~DQPXr&(Rfkg^84l0(QC$`$9Wsjl($}b`UWPNFHGpYELiuK+sK{qpo_)2wl|Sk--QFPdMbmYm5U$L$v<(S};jG z*ax=;R3VZHu{j#ww&|9n_4(oOkd_QdJ6dTZX{su4ugX}E+@qA8yYkt>$N9Z!Q3qT8 z#KgQGU*-myGNOI0dsc+q_xDG>Tx(u;I6Z(}cOeaI;GET2Np=@Npw?D3Iq@;`Zhlji zF*+3s9~Sn_Hl~gvN+;1b_nl^U(oj=I7H*d;`UfU;cq@Jgq+_E|ZP7v9nDyP0W5@{1 zx^;4Xle%GKWqOUGI=_doVTn{*P?}F5$b-9X&*r7z z4kB=4LAq=cAvHxE)%GR9VinWy@L=;oaL26m?vLr|)s@;LfqX9a$)&Q&B=U|852wk5 z;GIRMA0O0?`Y+Ux73!6B3 zo{D$uq#RWX>cVUBs0iwNVGNuS&nVS`qmGCaXfPi2*XLG0M$}|ea^iOQgw+{Ys+I`| zL_=W7Aut*OnIKRb0;?hL83dlZ2!I!FL5-47V+;f`L!cf6Hb7t~1X5poFRsCIG@y?9 zVgab!`0rNUh_?qS+;Y2_?u;tYjdR=;mK+Oj@s6oyjBX5P9ZOR4(IqX>xPxLlpjV(u zcWzOYT#0%b!8-OJv6QRDTlYI&GZ&rCk6)%@9Njg{g<2 z|Clfn+C~g)ONF*6LfdeGZSv4II%peoKr94Z1R#9~l7yf$0K@`8w*aUKI^cJKuBcA{ zEoPAo*ob^3@)DVPW#>VG-w=*sz|Q{})DA)1aOC)*un>;?H-&fLvY~Bd&^8ia+c>mM z1KI{7zy{j(Gsqi&GR^@I5d;YVkOGVVTnM@WG|@r_{3B3}^46fhN%aZa9U`;H4y?j^ zC4mx|e<%zPOHB zT4)4xM;f&BZ$WerL=8Zh(9%c>@L2*MK*k?Fs}VZ7wgZ07gN*zgFfuh@?L4dQ1`J{hv>XA=YeClb0jyoZ zWolI-=yb_Z{VpF)wEBBKoD%iB{5U=8@A+*9Eo(Mgo$q%Wwd1h}+G>UF0s6*={QO&t zz4Tj*4am8VvIUPtG>Sw&h=Hk*Oik+?e*vr3x%&lV40wP+^C5%kLk4YwoSXtVSp{-( zJ0$PHL-N*uR9gmtb`Xe#z%dByIRrxT9y}!PClFWzfnE@J7LxZ(NZu-tyxSpp4<3@Y z{;^Ab61Sd&mHt%G2NfYG`R`PSnqsY+z4B0Od7Gk=E5Vj1Hl{7#U&tBWVi^Z_b(ay!gCu#4UQIhK+u25*nW?=S=-|$@&G@(-2ikS4J*_@OKNkh^%&r2 zGRV;?khWtXZBIcFBx(sruQLxoNJFB|2OM1L062IG67`Uuml7Ey>Hr8@h9F4PUm?f^ zfQ%qf&qEL->J|vvh9Kn29MYS|GWy;v<W{IA*j>{oEP^mTkVB*FM>kXi=0o?ha zd1T$MkIr|1#xRS_0vYpf2Az*_d~lj+;AyUd z3;xeA_0O9A4qN{Ph5MHb{{s4Nu=P(m;fnqaQ~#RI{~f0Oh0cE=;=jk%zfd^M5Tf;G zO8?KX^+E~fr9=wD#!pXvM$vGp&!UbVSIf5_Io{{gl>B>O+c)W4?l-_O*L*$(Oa z4-@rYG5Sr!ZoPn6-g`FkRia$A|ZvRT)zC3a=a zaXrw3d||*rl|$H;)STSs&XAe!2jnUiJ5935g>FJkv-%@q3stcFbCQyiK7cg(W}v;9#*5df2?)wgiiH>MEp( zHsqP+ble!Wz{iZt`YwFb`QebEJ{E)?!IrLX)tmPO5$@Q}4~#GkjEvmnX7l~vQMOfh zEt(XWyhJBM(N>?u)t0@z!pwuRBdIZN*V6 zT#0iWSa(JfHZ*;7?G+^FMi{z<2{`QStl+K99sK&=WvM@wdwKfIkt1Y$fA=*Q>)~s# z_+guVWeO2(?~y8;f#h656Z-=LNT0rWVB)H?mtE6$joioBN^kFArRLhTy0I-L!`T5W)!DA)d$%;Vh9+ibINYiC z8ZKG}#4Di_FIPATI4zHegv}f65U z+XaQ?^9$zrPnFU8PEPv4zGD%qVVbtXh=XYg*Q(((b}fnvz5|oc_~G4r!`DtSyZ9HY&LV~Q8Z=CMW9v+W)()`P)2c9*xQrwN)O zGMbhauXtCU4xuG`&@0bnv*{#0VtZa7c~OQk@T9i?-AiuNpH&x)2#`-|v>#l?tGcAa zuqo=5|2+?MGjX~3pJWobjJJOaU~*3D)zF`>_gvuG#mC#f10`eUhp9Ba(NGy@-vDJ-Ru^by1O2uPOG^w-|NYJ3(b>N6?_c0xI_+Mxs2WeAIEd zu2|6i&@WB<1O+lt>bUpREND*~0K}__C{H;c5SJ=Vd)?`!jw=Z&-(f{os+2mS8NZA= z1r~+P@5i_dBXydrTj^?}#$uEno@8#zW|`v-Rx?nwBLm&ju)7O(=Ynn@g9hd-{DELS z$0tUZP{w)~xJJcV9JwK6k#t z=7OCQhLHvvXJGfm7|=~~H;bWM=83YJ1M*XL!JNQz2t4*50$v9eUOWLT^aK{loC6k~ zffmXE3u$nHg%5xmkhdWSy5S835do0jzX)o~j(flJz_7~;L&K7FYfd0cjeV=$9S2ie z;=%udH>~4(zvIVKt}=)N(xh))iKjzkD<1S--+JKW$@#ptVe`kL1_TC~UB`*!+j z`-uoqRqI=?***ue-cMtWN;ty+0{lA+`MaQU9fmv`i1J<#<0K)z<2>WL+z#oA~{{$=2pmLfS1kOR=00e%7Kz9hlgF(#!gF2fJ0-Ygn6#{1=upa^|4>cYF zDIoBdNay;mM>-6aq@Tmv$uN?*dI1J?h|zy1sQ>;k`P)dp|6hvq!!r}BbkPC%OU!2s zXo*i}Fj7#|o~`P;9F2{isZix~cJF;3lhnj-)-cd5(x+ioem1#MNr?oRRnXKez@)&n z@PYQjfKt5fep{1LQgOU8q3OrW0MzW8Rzfk~nm(!hTUnO=Y>tUc=y$$ihMfytzHQ#V zFVg!3s`$*FnuUD3&&wxMT>ip9DXm3dvI@VtIeza$N!tf!cO^Gz*OLRMB8?-lSvrqJ z;>+HaGY8Cka4TtU3Fu56mY`M$vmi8cnSGCC*7Qhh6Krort-X7?A)kIUfM+%;@x%3W z#+a)9BG;!1wJheXQsoY_AK#(BzUejZ>2t4gQtj87p2EZt8pSyX&lxClmJe0*NBf5P zY6fa^tW|BE`gQh{^F+Rh?c$LmjuC%1dty7xo-i1j{%+FxpMFH7qUwv~xwg6&6kqgk zfc2z){F&>bjn?1P2TtvTuQSe_bO=x16J+H#F{=(!)57Kv5*ki>9BeIw2)g&1(@>O; zlumE-D9obFc&6905S4wynlcpi0~B{MBF1{>d$1pd9edCn80&3x7KLD?+ng_9!%ps1 znn~Q9v6c}R7r|iPXcCf!F831C5TD-Mtgj|-9HDP{!2Y^J;mjMv+WXn{F>n5O zXAqm$#Yx2-(AK>UJ$8F*#WC;cJ!)2)@Fs+cjkcWCb{| zC(bD|t(3b97A=%aK1b$lPAr#qRXZ1zJ8UjmZPvKuy>Rwg;2db%+}e$)7HIacjr8CX z=+JN~L?$6#PIV07X9%tnjyV)ASonZn5sj)=rd|)MhZstvYYQy7*g6U(30g1BGz2W{ zFT3a=k}?<*@G;mmJDp06sCDOg=Q(V;D<5Lx>v+-gg`NG{=@)M9;73G?ugMt42pLNP z!<;G0wXFe)hJ9K461`sYk{#0Um2y2Zmq|iP?91 zzCgY*&5JnrTH+g(;9)bF@qXT7z!$su(WCX_ly`Xt{o}QP745qR33D779_DR^CCK&z zx54a&o!LxI*AaEr4i1kAE`$KKdW*z$&5A8#34^Xfhb%FX$3P|(z(FU28ezwS;?OwUYNx^90SU5(5@V%Juk_IDdpx~FX@kaxE2S)AgE zs^g1{SyG$0r9|1Lzv@dyM6<I=Kq~)CzQMA(7 z?K@dDavI$i#H`gg*=D{MAnHNOlniB13B^nRyiI&?@smL%3N(3ve9tGPG<(>ZD0=Nw z(8tnj)G;G#O}ru$%9~M^ghb`TJ#7t*{$t)tPUcSo8%%}u`LwRmjV<+uUJ2>(Y2U2i z@T#9GPG%FxJDa)WZ2mN;!&KPpjcXSgP>Hu)1}IYsQN1%$Mr{why13R!fjPrr0=YcHz44rHqIp*9y3h zCr*c<&QRa;V`#s9R9@fu(U~ul0k)5xT~v@*UTkuGhM*V#ItPBCOwfgzBmpQGg5d9!4{tpPlWg&+y&c{Lt7g(HH~jT& z!~JBb;v*#Mx(I1vPm2_AH$6D)7lQrgf9dz4>`Tz6Bx;(Zx|l4^K@GmwZ<8y;}OZz&0+8;ER&NC@Ko-5{|r4FLBaw+U~Oql%7@45lmt z%7~gKs3KCt@6g1OiP&&Ajo%KZN0^cvR(AtJ6ZCPH;zLV6d3q3sM@ZIG<25}@|E}#b zPNnb~4mk#KM7P6R9;V-e+D}65w6ak9bEq8`YX3V>ux{}86(-dBs_wkCJ2HapoSnA?f($uKMvq>R3QX8 z%iK+!x5GPrfd)7#{?f&E*mWOjISaKI%R((LpcYc71^pUo!GT(Sf{v7Q+k_i$Ru%&Q z!j_RH)(5N|4fmQ9uDuql-57e|EL^(|Fpv!z_zysaaOc%v97I7R-2Q(oy8UfpIJ_0L zMHX94Mx)md>-1iV!Dq`6AN5|i_W$+v9dJ=3 z+t;XIKtw@;AOfO*#34zNpeQOyOyne4g5)S^4S)!W5+n*nPzFRmNkfne) z3`iJY2;Z%7fnA?(-|qi=`}Ajf=k}@FmAY%D>YVDQJ3edWRXkTI%iHmpLx+kerhnbo z_Ze4!;|3en&$Uh0jN3~d@2K2WKvR}`MLrllHJj{kAG@*RbGT)>(CDXh^eGJh-c@BR zynfpORg6&b=%m7}a!=RYs!k4D8P{^&%-MWD>`rY5TDW|F>54UOXN>dyBWp)p=qlPO{81Dm;~qZJOg}9vsx}A0PKA<@H@p zzY#0bUUN{pLOpk_ab%zu(?;yftPXqXHwVl*V|w|!o3CoH;$aayae<Q6d7&RLqmM>>7t0Gu9&IOW~@ zz}Kk)I2A>0*9xy7%~nyz$u~EmKNrsHs7@FbF*FuL*_Vsq`!Oc51lly|yR#vUun39o zKOkHO=({JXDy?3;NpLLLzPLNd5%bVL`tv&BwZb>NnEXv*8yc>ai;bGo1zS1x-H5I% z3^^@aR~2ez!b}iRzz)Yqo=gUkP}F0%SSnn?Tp-C4vlGJdq|zo6f&4HID}+5l>_F^+ zWkTinU9f2Q0oDqG9tObjI1v^M9YtXI&@1sc6j%fn7x0K!LkNO3ceFS+iYPV&Iasgr zLaduYM7HTfD|i2YFy(j)nC?e`g38iSKHyT0ns?AuU@@=|v2{8TlLwCoJOm|#*o!hl zi!uW=pMMTUuNfq&j;{9za&+W6y3|>1&J$-znSr)m!;kWD8rnKt5#{uaW>DM);QD+w zy|%2FdfQjb157LCPPP@3xOc^D;{}t`HzzQS*4_AcD{rt@Vn`aT#D&)_znKJ&6*K4R zis^o9#gvHuZmL3Fx1m-9;!pXd!ziyJkXLA3$RJlLZ50!&un?-DOHA%Tbs6(qndJ^z zYzEp;P*x-=xEU0jE*upcNH&FtThobnH+V$1As{LaV&IG-;tc_ja{l`;&J#pb0$}cx z-)2UaqC}Sh){Ylq^b{f@PbVVzAVe;K2j!XWzYkM}YI{j)Vz`q63rLsp*XU8*filCX z#|iJJ%+&ZC#o!PNjb_2y$~#et7;-&FPjKp)8_JYgWh=K6o|<7**W7Hhjm%X$Tdf&G zyEVC$*HPx zPvV1k2eBsD+6q{{rzNzdwD87x0b7SQXW+Z33{B5NsyJx+`$tiY@Io2ZDWN*!Or<@> zg_`~;H2qahRE9`s`q!xGli_JF5r?V~))gJwNllM}1uh3Oh9~qW;^Pny4aW;nbP5qO zrxOu!@QAEKKpY)J&H3kGN8$NIf$qXa=od^J=u*s3JSWogVh_s9ZzppJR;Vmu-w}}K z8z|35QJ(+rFd%I7v@@X^P=R)ccB%%FBat5(ldXmmsE+t7Gi><eX&!wB-cUflzf54S!_UgZp6bn zrEkl8E56EYr<<2(ds;)+xT!=)TvL~vXV=RiAbt-DcWjAsec9@+&L(S+TR8O9Ew?Rt z$PTAB@x&72?JmtE?oKe0-$5*kk}twnWpv$@6Jd)N?2Iu_l+PXUnz&G0>r*%rXXh=c zNz}|aob||h*kAxm5vL< z=ez0%UD?>J!3%R83l?HgLX6s5M`n%Hxv_S*EyRxc`Tbd?KE?Q?aJwCICEhPOS+=%K zJLmZNo>$*0D<%IqxglhPc)`7qy4NxDE8Dbsl$eol++@pEw)&k@Uw>GqoUi||Z9mMk zwf=j${{HVXZEa4>&G`Y{dZ!%a1jIYo^-o#6drRDs;5KckZLJeQ^MuSZTu*PqP}m27 z)b*`O@v}u5)j>BVu}z1|ruuqSy!w_F2mFeOgyg`wia<9%ZG3ifVM(wr{y|6Quw8ST zdvjrOZ%6U7i;RK2)?T=e!`UOQcxSIK3q&Gbu5doLtysQ2XJq^Vu5^0L$*%(^&&p5nwBYj?~y)3be$Aa)qLyL&rkdCfRw)RgrW8FVDr_ZvIs_f0xo%*!7%kZCWd z?YiJjY-&?;?;YUtEu1f_lh1>zE-p0o7U$!qS~|MhrYwBsy^99qN53WN_ZN@aw;OmA zj@*T5x6q=GiM}{5X}b??(@l##W0P-v1{zM`T78DI9}%Y3r8nb8LkG6%`!03#OBi|M zM$yDuK}!zQM(d~kOcoM-|An1AYmuj`+$Bf+7lVuCH&l#qd27$vxQ6}^%m zc+cJJDw>=45H_LyjL6fT?T$^Z8=o3A{ot$PF=MVMfvcO{oNt6-{g5o5-C>a~ch?WL zjgaj$B2+Fgh9B~i87}H`nD_p;G`e-VuJJyuDlw5e!7s!w@AX)X;^oD}D5ixhtp1{> z`hX(8W>wQ*g)d>;WU0Wvqhadp!su@kaOK03F$0Ov)DDX?f%px{H9j6iU)aLmP4tb$ zRbv;gSq#YRd_R2Il3Q%&#BhYg_V`_&J_3pVrMXP7O^qi*Gf)DbrIoktewNmwqpw$& zm75JzzY8jWC@gKIc{U;sI4|S|&b|%t5}cFovHit{7=)||{%0eM09^o*VRn~;c=^jZ z3z?AMxD1)y&+IBEujUpowQcX2vj}O3W_&#t;(4hS8H-?0y#-^fn#U#8w^tcouLmOp z8I)ikHvg?%`8^aON3;qK-uZH!@im>n_}bP7JeXU;vESC}JOo1uj8-tV9g3ayytMCq z#CDad9BNXTN5B*%nJZwJUfmcWXM<>Ri)^cQ(nme&qzersMmd3f`O28QK*(+zeRB;c^rDa3__Wr!AcVMn$TM&9!c#P4u?AMq0P9SrOvDA zIIUE{TQBz%f#?DB2!YNb&~*Tv{`(*vz5RW|;h7qT>w&!gucqf*KpL~tv{GxzZcF%P z4rX=BKWVC>q69%vL{L$if%} z_%von+?qmTnfT}CZ5f|h%^MKfw&_|H(Bi?Q`|q33r~(pAv%EYP@O% z4*%ME_^way0G$4mU$WGfp|^^CDppfvpj6jUsO7*k_r6NIjNf-D}P)^A3 zQ&jXwR4Q61)mc<3WmGEEA9zuz{uT5q0_h?U>JQckB!D8JqQ69u;2A*t38+rfAK=-% zeZ#=ahpru)Mkxh!eT~s&HDU~rwwFRZJ zYC);WP%370fyUx-dM9feXgqE=@{rTP<47U~21sKhFO zY(O31&t2Kp^Et!Lo^nqIFdL?+rd}m9TGl6%E%aYJJZpc7X6x2DF_|di#RI!VWFB>E z2h1`lGf|(Hj5Jedg)E4%1G8jvH zV16y#98JJcP4LJe_d}{)>c#T1J?$ll$j``Bxochnpnl;n3m0>%{E{0N*A0iQmX~R( zx?-M)l^VovQenAc*>n0AqU82yN!^AcNo4L$Tw;#f5`)y%;2(b~&+y@rrYMLi-5xj} zGeb9KNO^Mp&N(gx|AHum2$l<+N5Qxp5r36a8H~~hmUzw+V62Ud&*D6dFp(@ZoSHWr zF?%wucX272H0>aW&|+uQH1;k#FRwVa=&d+A!FiPcH7s%Ew)Xz+LOSeBn(1CmH4jV$ zukS;qAdT&v&<0(1jxNJ8Zlh^29?fyR&f}^1Jt)Bzr@d(Q?7GIhn=~!V{%!>^I`^3}tG28f;Q-lyio1{l#VLW&l_PQ6`b`d-rIndBRntJfLUI z6~ON=nQReD>}5GT{6gQFSKFF$ufeNYvwDxPb2jgn3Byc{Z)A1x%TPN}OYGV~_ZD7H zNy~aoiuN&nFe5BWz#K>B7|HyGOx5$qJAuq6By$p(v!Qb^{K6#M|I+nTn{z`hy8a`` z4S{s&>l#jyAt)ofn$@R7P__`L0Ujg-7^OKwhm+u$gJ$5W*A?-=GY1a?_%}(1H=6zs z1$u%^eC9HgIe8g+rFsRr!x^C8Y_~#Bk^O$Y5_-yeCQ_&jjc*5CD^Vyj2<3Y>1BGG& zsEs8l6hI$#z<><1YMRyE$58HKersnKo+DXO_oCVh(r}_8H7bDat1W|MP^}}-MtGEy zK;9835{%(^7|~&Z4IyD5{~x%j@0+2EK_9L1K-Ew8{S#aoIx!x`+ke~@0Tn?F4|Y6^ z+fEUr2ItYNE)lhDiuQuRc#deKH75;vk~{(o!Wk^qWh>^TRWo|kOkXuCSIv%9b8^Mp zwRta0o!i2z`)EwCl`#JW=3*3{bmi-5%r$EiS4_vFsA3|uIRn{H>z##6N1`T%VcF?< z7-}lc<$D@|#Fs(i%OG}A69Z`c)N&-XWsn-`2QYTS6dF1QLpIE>{V!cNpzB^mZ7l}n z+K28w7;~NGuc3^frh!lB9OMl~=l`k;2I{aYmMtlp&}5l)DVjZtB~7Psq4~8xcYn+2 z92m+t*pVJc%$5~|-||*2Q!eeCLvd`J6Z|I6S!Dx>&Pc&*DaqGxgkS0`BbiJrb zt_rSdGR662Ef$V2G%Z}s$H^=_>*}bmvdEJ+`s_w@`z`> zaxQ*k!QqQ_Itmgm*!vY3vEfu)7;`()>vKAAxmFT!v!mVjiJ5l(Z5`Po1}}&Uc3p+} z25hVn*oKjjC_S&DsXp(91~#c@opv9!unXf3FoE<@&M1?pnxn+#P9zN6m|OgDXNfF;U@MCOn!x-z?WrMYz=Nr2soBw(+}0lzfHF7>%Z1+7xI zo=HzjCv$SlF)x>B%TC!UA}9g~Jyp07i!q+`xCgug@5bNlWA5vJpv%x-C-X4}%cd%J z{$r}XMO;elz&oGLBl1PwjwDGyoNGePm2LNJ>%V%wuxsmRb!g%LFe`3zGsVC#pg~ik zuQneK3oXDfBp!*?#)197Qa-0eS9JPTrd(6KAgB6#UYJ40~3b&7`9 ziznGzO9JYi)n}O(M~ozGmfBe#(8|GV%V?Qy|0bng&bG9acrCO$Cm63YB94_Gb(g>D zHBw3`PZ#%~5Z^ri;tf9NTjG@3;ZF}j@&j9ny>#3$SRWkEoB2#uG2(^XiNZRGrVIO& zCTA*fJr*6)_EbhiJLHJpGB-A4@pa#;*P7TTB{$LBYe-=CGV05z%fcSgdbL$!Dg)7iKuo#sC_(XjV${O#;5s4Ap*J+K#TQhyTA1b~aEZ(+Aovld7 z+EP(JI#--ik!jHIaPZ4MIaal*Zay`yt|s~U=Zr+I)bY7{k}{R)mqXaDsGdkDjrTT+ z=#JVyrIedmmmi#;zw6gP+JJ$NSG6n+CKt0iHYgFQyIboYCiyKj*7ORtCm(*x{aAKi zRYPRsJD#93yA#4%Hf8M2upA%1Rz9F0!!@q15VEO=)w1sn-)3Bqd)E3 zT}j?WDaHSa&#$fK~ zPh9}w3OZ>T5OnT6`59I62(D;TjwfOjd$(VD%wx%uE7s3X5uFqd1nGz@y7SkiR7#Sf zv*;YaIFt;A2l8;2=};bIsz1H$jl-R_rvkF*LPX+$A{~-N7ZK}tXYCo$`qK{9l{%Cs z>m*gUG-P`CnKZ_)WtnMK3_J2?@mhqN#%KuRSZY!!HMcd@rbPSPG}o-KbwQ_+(J8%M zHL2HIhqNs;YAvcnuqJK??Gbz}f^fdutH&?*v?6+tHuG>HV2MbHrh^$A5$y%BVP z1ZCsXuIQ`+GCUyzh|E5xOL(W{o}QzJ1p*HeFRcV{P$cIO(BIq4X=Z+%VyEIT$%68bQ6^wzokP5_rf_m*2A=Eh{hzo z^|3-N6+_Qcjfixc4q9T^pB}RK8|PTg+g>TDECCq`dffbYVN(0hC4bCaIs& z6+-9>wt?|@n<<6gb}$aWDYyedyRYuxo7oWDnq0&PUbq1$mgvARf&}w=*D@{#9i)xx zKO!_pZWFz6U&hN5M&L(pR~}BRs|sAL}4M z@ub{C{}uv0p)GSMN#R*C3Oh${Uy^#RiO$A~0_#y`L4i%uR)PN6c7RWNe}%4Y32!Hr zE+9X=r_>z(@QzZmLSF@Z=fM|k!vna}eA@KR0+4pQ4F%TZ*<*<3nRZU2_9b0v&z4O3 zR1p&XgkA}68FJO-EW1*`b>*ch1-AU;;pcD837je66<$k|8apm``nfWdDmm6dyXNe3 z!%6iqlEV2%PY8rE;iQbqPW{>ruY(2Gk5*pmTV<-Ue<81CTw0nM&TT z)Rne~Wc~N|PCwfoJ7LoJd8+%B zNp!U=OI2HwVyofs+`9W$TuD-aI&mw*^^TovXNGTLvnzVyB$_=x?9!D@9ZV9uV}D&l zUVqnGONrUG)FK{*cC{i(EbFd{@bf3xs2N!WKUx!JzB$~>z)><9jLAIeFiK6~ZJ$0x zpquBlC*Vp1+xn+8#--xvhu23MM|NOOX)7k@Js}F!e9fNsxf{i}JN*2%Fsh(Q%X4MN z0!>4^7vpTlg?XZyhaMbIVOq;SlxpNAd3ndpb4g9v2M+HP;V&y`cd*WRhLzSA2)4+n z9-Zhfdrz$*k8k$&NFJdsH?(kVqhe?(lDR4qZ{jWeEAgArAEg4j*j%Xu{#+^`vAlr! zQJcA99BqKVL+QBoQ@8wE+4URVD@hLy9sscbCA%_+1=7VCCyq~0?s1^LJGzwe6-zzM z7&CHrwkejvb^$NHv@kfJPVDG2ZA;AV=(ezyjZ@wVLavkP;HGHpJMejbvG zHuE}F<4i?equFHxHO`CE{7cmui_`N33sj;q1U^b9pJ*;i|-W zsq^j~y}6u?=|&ze3vq0MM!6Tq8=JQJd1meMOB@i02Q_e=i*dP6yXEzw;3h$^t06p`HsMzW9PRpfd{qu5`~t4(G&K&!*_ zqpwab(OhxJ&V6=suOByYWHxamx3w<0#*Zy0u6xnqYh8jsYKU%!~Q9DZqLtJi`9 zb7C(pIVjnvH&M_8mMp!e7ewmiac`Ok11>sOtpYyJ-@~(VFEldTEN*U`Ngf!$8u<>- z?yQ+`Pw>r=Xl(2sVl&bnsPXa6N4t($yKs*8&)?mCqhV3(?7ub*V0-r%I(2Vo~v7i?Kalzgy z5En>+xZoX#3!dBrae-SZ6Nb7w!y-4ItRIdAWP?oG8L1!2exPF9!7j(ZeVc45Lo%40 z#ZmGGIg68IC^?I>G__@-OCgBz88q1K64 zUwid+&sExcM;I(4$apd(ACsTIT_MGJFogdE?;2|}N6k&Q_5?R7|H7&hueFxEx~H7> z`EeGVwG2U`i2Hwj6Rb`O0Ifd*2?TPk^3!fW0)ajd2(TC^Fa%{GkOu-`05pz3#R!B1 z0^}eNU@-=eC=v)1E$HmB4*O`KLmZ ze=|h+=Q?~_fBcyN>D2hn-Jl)lxeHQ(_%6z7C9VO20_Y58>p(&96Nv#N{;O&Pfc`xR z#D9_!(4ortGtfcA^rs++07y*#ONg;gNzx14LwbR=NEARvBKI#tgBsZHubhe?o%)@W zV0N7q2o4s@H-dygUZhkhsjnf#A&h7C@E+v;72N+$f&e;$zbSJ-BzmNUIEza8XHtTH zr#DD6N3w>%R-|8ee>q&$pF`m9nC09lryfyo$51NjI)K6enaqE~jFr~~Ey?EwkPJMX zEd$BGU(+}Ii3kFTD=d)ILI*t(HBq(vsq6mnWU-u==BFbG-%=NDlMdH z;WdgUFVmc57&U*TIotDTNA{bX*;@+PZx{z^pKBD=IYy>^tH=9wryKexV#v;n!7Hv4NhBW*y1zrnuL*j~c`;Ghx|jGI^pBCzY%t{s%v&$&_eVY8dE zliEo9fX%g~^4Aa~T>`r|6|@p?i5*O?LAxJHr73tY6vE+JPCFpB%OA!;n>3s}TR)O}zS zJ1Zd;?veA6qT8#YNos{Rpm;Ec?a?r>p{bWnkX2`mu4?cZN2H5Dp4niKFdV_gGZEz8 z*`Uv`Rh!`=FW|eb1J)gy>6?VGKz$Vrtl1O?TgeTY@PJst^u?Q)pfW23q?Q2P!v_B& zNEvanLM)Ll?3z`3jkfmV6K`l5=TAdBvZSJdAk~4h2g+SJw6<+1q6cdO-+2}hh(Y~O ze*YjUr3qC0VG?hiABswi$kU*T=(!48ul**7_(!A)v;!y5rJ(kDqIuD!f}sCdlhhJ4 znn8qVROO_qeS|W38X;gaF{Dy}g&Eih6ejtg7-(})f)XNS|0A$S$y!q3K~Z3th;mfj z!t1DVKO`;lySd@PidnX5`aN9n9(c535?0Nu$17g@q!p7ddBq%9H6K1%@ftmiCtVom z*gI3coBkSK#aN+B#6WX)%c7ccg614LhAK%AnsXgV1_8~vcQ>lRJm?!TBpC!F^o{GN zZ}dUmNF^y_^r3GYB55j6-%wf(W~%f(*#AO|@S6fcIlcyU1Q0(2HMpV@@SvPVpd2Zq zVt^jX3vC!$i1rEXMB9Vn(bk~^9@G*32^etUf5|Yx+Je*o%=A^WbJg6ExdM<`HEmYS z*j2N7)tp&1xwBRxXs(+6tLBT}OyfxD@nfpJh998q4&FkQp{vbVzn!FGfVLYa>0zv) zBcze;YXJ~;>_pWF>V+Quy{HCXLPxku5=Fp6BK!`jUQjhS3Xwz+D464Nuncun?I;*0 z>^S;e4}tbD>-@WiITifGl=i*x;$&j>E>%&nfp?#czx0gQohQO}=?M)RGn2xx6Ye(` zriD^(mSrD^=OP#sFFZUzRVQe>wbuccH(wrlLEg66Z??y$%@!tnk_TLx?IrrB-^$5e z%y)2Z)>QM$*_Dp7v9Gd}^~!cg4)^tPUm7WSyQ_F{+z0khUz|Vh?NH=#K#=(DQ}$3L z8`{aN!YHS#%+bmA=7pt;#A62pt>?GgX!tgt+&aTwFN$4sicuqYcsO^lYW6B8g*)Ev zRfwGktFnKYQ&(oU!*B7Kj-NKGIDRyz%p+)gZCp{F%*dcw$EcfePFJYk1^w>(2VOKP zwGj;DV8%^bB($jlkJ$Psmyw?M4pF z2wK@0GxymJc&3POGrTuSGt^D#Dws;rS(+_gTKbkKFK?SJHyPM#QS2of>n+S`Fola- z7_lHMPJJ14A%sRf#P(Vh;tXIm5 zb-j+0v)1zJrBiiF`s2pV&Mj;N_hgLS^wva-n~%556`db7ksY+#&L zKe1!+xo^%cyLqPyBg~S+g!|~UvCqul;5b`Z!$p?Su?`EIluv&9guVN$`?GKI1c{x3 z1+6#gi_2>)yIAVkMiWo8)jjib&XtyvrIMd*%zS8yNS=+|DU2 z`C=cI4;N=oCHgLnz3{W0!<}ij&q+U4)BSBIuJQBXC5xGx%@5s)jaEwzc@;HmwN^9j z9mY#4#W?*>>ICn_AgEhnnt4=L`ye5TVpdZRB_3(``rM2$8b)R{f@=Li!Jd> zwt;nqOWw1D-p|u6OBcm<`i+~2B&Y@2OC`wNCHT#h6?sZi6J{1B$|ustw=%}~79E#d zTo5Vg!o8Wo6I^tTWXh#AV5o_qT7d%sEWYVg-4C_C&%137p3qA0gDh9o49I)$mogeH zn^5$N)0a~}u_QL@#PSxl3#O^#k|AEUIFoR<(KaA!yS^Um3!Hr!X#TJz@JC)?`8P=( zsCc;_WB@jx8~8BJ|Lg+n?4K0N{u8 z0>|QSI9v#(*xK8}z^{H43p)tY2-=rSAIUAE=oRgy$dnT`WS>BWJQ(Z5z&MCOGJ(y8 z>^mnfGrrzf_=zG@0bI3jRSek=OolPO-d5O0k$D8;c}evhxb(yZC`67r8?xIV;}{rT zU~n9t5XNkSZ3#?tV8Y=hzY0uF#Fz)cEW-c~AV(-Y!Kd>{ij0jH3==r&0wz~o$@ zRD^T_df@Zj0|0xHP5{C?(q>#gd;<77Ze{LKSTwJSUkXbgc80Q4GxJOOkVQR}}VkSu`m5NHO05Vigb0{NWIww@{0 z0$ITNS7;~UYp-C3-b*kPMV9otHMnash80s64IQ{{wS{4gV9${Qr>+|7W~< zOKcMG?X#`lv~vH%f zl`j9+i0^-cBmW)xb0YlNf5VplPel0t$d>>69QpeNM9>5*)9L>|i19yi=>IY!9!Pt? zr_G}}NJHFuxUGpVP(^7XZawNAx~Mk!5CQ*RL3h%w1Kd`lyfxVz%TX^Uphpk5))Wwc z)MzR~+H78klBogWk)J@TaSf|bX%aL8L2sg{E~KcYDC#a0b+83RtwK?M4n=pn3(ENk zlyfAAkVZM@hMW%~>A+o7ygvcypd^|o0Mb`jA|b_}y6E-x6IG`3isFBr2wdltbn#rn zEML@_Ultt-&q;3{OvV8BeS3yq%JQ^pcxw!{5-xbfn{C^XB46ag4k-=G6CFVQqxB>3zBFs6rO0ViN;t{B1C z%%VfT-A0Ca^w$1uVV`sTHw!CK^Uy?m&JEgpN~vCq=FaEb8=D=KZXTqG{+xSz^KGRQ zsx+~mb0arrC{b%0$6pr4a}Mp@>cStLe6H53TCTd6ZS#8G9l(Y^`R)1Z%R!Wtz=4gB z(ak*f2toNcw?5#HetNFdtNKK>Dc|M*-smyI%(LHa)m(l`$wlJW(}LXj@}|-Lu(YrZ z=kM5R2$d9q-uYW@9cX8OtPc`t)_R>xjS@Nn2&JnZ%BW=XMmy=7WBW=HA8YUL2mb%? zYqprr@PFS`_6*)n$T+zBH)DR;$mRIWm`2>^KJ*C&*Z&(Wgy9_!@l1TulM0pt`v<&*V4EnBt0??(C z%b;W5K@gV@H9HL5g$=0Vq467^h58E&;_XD}exqn`|04{|u7O6NthkC;B+oh2I46_u zD?O4`H~lNyGwOwo*^qnHU%t-GM^=?txa-O$h!Z=;zxw*M%x8Ap{m_=%wWVxfq@UaO z%hu$&IwRPEBi&vCM`$2SE1cueQknxcZ-Hhdr(aj4y%(XTBrfi<1AIdq|WOWZ z=hJL8uYCb}%;yX+(i8$1g!DNgU$?ots83-mRy4+?ZAx7N*Zx8X

b2T^uSvORR55+>$Uqk#eoe(#ANwzB$-eM0#^n?+JGd@noL_kz1?q!>dq@si%b= zFLfsaJ8rt^#1QN-ZW$j&HQkMj#G6K4i|q7^TKVU!^yT!#D+cCe7ONgCWmv~rw_V5} zmWYiPx*GUY*VtX+_OipzOnx2uVCd4NKhK~!D}BH=*1f5&X1-`_&_}Vxx^dy~d|MmC zNP~Fn-3~WD`|BFcgULEVrrA?2!#h@V-!-!6c!Bn3x#)v0sjj(dTT^ zvHqE-PU1408QXi9f(p0k(QaS}4cP0uyWEs^iKATmlgjSOwMLtS8D{u`tF%AaD}+!K zF_`d=-PmS&sdzKE?^JB(AJe~<@d|_io4vUqg+H9a>%jX27J1;)21pN5g3a?PfLVI( z0d9eE?Q>xp_iILPB4IOiES-ml{^L*K{k#5>y63`w&!A9YHT5=&vMb0)i3{w1fne zL(oZ}|HG~cm*LkCs08W}Z9WTV^F6~ro0mki`G3G=s;N_tBmq)L5D1|@HD-3z~c{}B`q@D~IPD9kcaTn>txOd$ zy@>^~`*SYs{T3Js?5{gcJZV({*8Yp_@UDg^I8)B8z26wllpj3#+`80|QZs1${<)^B zg>jZ{8w%XouGbBvOL*=0 zq)SrHOupZw>9`#ZYNXQwfZ1;jSI8}abV(23hhs20grY+@Iz*vE96BVT!$WjPMh7f9 zq@zO?I^>`O4jqcop$r|W(4ht$8qlE;9h%Xh4IR4v^$=8Yz^6}qyO8>* zD_F5oAz$?Q_`}|eDvu?#?D>cYY|YRESrsNm?IxX^5f5@<))JSdY}vy*`S^QF+C4~e z0mHQG3wGfh{a9k!uAIdOZ4={nlVrDfB{bC)<)l*gJ68AdR8}1>Y*^a*$8T8YR0FeK zQjn45?j$1v*#Mb`Eym@%`33XuM`85kYD7ofzD=BNiTCPgn!u6`?XLnRRdzXC7jAj% zy7QUe3n5Tn}w+zg^#CoVu?A^QZ z)$R6D1MZW&oheO^Hq>Yveijb;)EW`IjW3$ASe#~tJmPBVhbPSkUT$lAeTarysX0&d z?&;8bw>1aN-fW=qRaE{;5gK$jEmoU${Q)VbDK@DnAFj8;76uzUxaQ4{ueB8L64N3V_bN2>YGe?4V%DNd)AGb!w{45w zt9xO_UQL0WZpB?06jZ!SZkpr)TH*)NIM-aE+;QWk<|pYa&+8(!5m|AMXSTeuH+y-j z%-UaBh3-g7%BX^OV(@M<)jJsvXiiT=t7dG-m7}h@Y*O}1&PG8Q_5irkFUNZZCJpPi|ql zzZb(tZg%QZ4x9YKR1}8yR?0Q+@uu*uL|M=ADN8@^rCh3FfwA0cZ0~LzcZrL?w~p0% zNqOIE?f6q>bmy#tK9Suse|?FPzi&j!;_)li3{wxSgL?ZEJEJ>thGnVBRo{v9rLn)b zu-jXmQ)91Y@E2X-#F-ht|A^w(J<72Jgf6u(f*f88J%QZtft>Lj@zd+0qA;g16;?bLR7CfUHNpPooh zxbvK{Y#(MjCBF~Duwcf;V9@ckVfPKg=2RwsJD+!{QL$6v1tl%g0{OHvY!_+|crc7? zH<)MinSFpUn(S{Lh9!5$&R=XQoL`>Wp~;$=9FcK&zonU0><58v9}%X~2QfSD51(Y) zAf!L0bI|CV=+VpA(5IBt>sZ!>+U)a=`8v&cJ@0DhrsUIkv*M3G73tVmvPFow+$tKF{`@%rP9vQl#Dd)a^MH zt?C3~;CW3XJyxE1`yMA=dJ-H^(mu|zaJ1Hek?GO>7dS=%x z{8q@vKkWu*l|RFseM-y;Y){sG-E-*v(9?t4GSg41cipQqaCz5lTUD0YJezxV-8BXR8kNJwoDe(by?k{^n zFrQv{rEL@cI8^+LY3?C~IYu!jUYR?ImyXSorI7Upp4eBdQhl3z@Ip*TXDInP?#{w@P=Z?@O& zpW>`5BUG1y#>nipl!P9krh6QJbmn8%@>8CSEbZQuZnyun*^g_;$k4x2@RWBjHnlOf zG{-obJGohznmc1In7bI88M_!`OzoY_1st609n76vtl)%%q?oCNu#||Tg|U#Bg~@&s zVRIp2V{tKaa}hC%{idRV4$c?MOdasJVi|cDE7;x4ot&-g?PNKG1%)`+&FxI>&8+M! zWjS13ECeJucZcXxL|cTrMc5g{RAjJBHU8B-YOj0LRhoL!9V zOwE6bzmme4blO=Es=^L(X<_el!Po^pLe`e64G+p6P`lQA9ME zB<$ykA!as^SlE zRs&yv+O@FyKSdT5`hDc(Kyosq9O9}yhvXN{dK&0SV?F)5=g04I zw4D0C_RRUM&i9K+nwg4=nu!XT3yX=EN|MTl`F($IUg^XeNl(K=F`D{}@FYCFfsBm# z`*+^&{rLASO6t>fO)7S!Lfh7V!fI#P$CGbdL(}3?cE@QAUyRHVlVj5-KiL{g9xqfd zxRr9ENm1fpYSqJCDw* zKX^LytlaWU!iHZbk3Dxu%hWEsHO1$^e)Em^af;VA4LFWODib66a|DgBUv4$t{_>&M zzNWB}W-#Jfa0YiX2d%qzRIyvV#HKy|?8-6c8Gbomd1Qj@h%=WiIlHdVDTZJ6nLaQl zd%(H9f6X-~E?o+C-EqG6^6HJZUpFY$=S8s^`HFIdnqpdOau>*#p9$Zq(`E6Ps~%LR z-^TAhA@mO0+dlnT)W8krBK>1=*-Euh5zB6jcGS~agq<~huT zLmuK7@4ZGPhlS5m-DclAYEkzgp^Na+;6q_?(UvNehrtwApTwsfk8(S{MpN?X@C%NK zvr+3rShpl5Vg*-X8(euuqh>s=R5+b(x2sG$Mc>_N!|73Km;L0Y2?SbKd)CgKe;A1 zWXnO3*w1&EpAG9!TO5dyW9FGRZfWp5)x9=C?wtK`${zb@GU>%Fmm@t@Z6lTxWO@uK zIPXV~-D1rxkqH)dPnBKvJQTIPk^I&i8E}>C9rO4 z#$M-UE3MAr-5ow;Cso$0r6Z$*Zv4G9SZ7ikilH@3p>uBq?;rpC@Ywn>vF|8@R|X^= zSx-i`?GGu3!TaMg<;T=awB#Wo7&0=}?zN;0tp=!BNBU*yeBRi}-0X~t6MQ9bM*ZT) z2-?xx4X?q_LQh3Twq-RrSQydo5nMcN&3~FyZrl4|Jz6rd^xNOxk++(3hCX)Kj!7f zxBjh0$u;|F6w*5Ye~j|uj^?XTI6QtDg|xrWr z3-$e5-~4?Wk+v%MG0Knp>(wYnpZqimiH-eZlpmLtR-v@kp{Xcliw?+T} literal 0 HcmV?d00001 diff --git a/tests/MiniExcel.Tests/Utils/EpplusLicense.cs b/tests/MiniExcel.Core.Tests/Utils/EpplusLicense.cs similarity index 100% rename from tests/MiniExcel.Tests/Utils/EpplusLicense.cs rename to tests/MiniExcel.Core.Tests/Utils/EpplusLicense.cs diff --git a/tests/MiniExcel.Tests/Utils/FileHelper.cs b/tests/MiniExcel.Core.Tests/Utils/FileHelper.cs similarity index 100% rename from tests/MiniExcel.Tests/Utils/FileHelper.cs rename to tests/MiniExcel.Core.Tests/Utils/FileHelper.cs diff --git a/tests/MiniExcel.Tests/Utils/SheetHelper.cs b/tests/MiniExcel.Core.Tests/Utils/SheetHelper.cs similarity index 100% rename from tests/MiniExcel.Tests/Utils/SheetHelper.cs rename to tests/MiniExcel.Core.Tests/Utils/SheetHelper.cs diff --git a/tests/MiniExcel.Csv.Tests/AsyncIssueTests.cs b/tests/MiniExcel.Csv.Tests/AsyncIssueTests.cs index 6191f7a2..083db91a 100644 --- a/tests/MiniExcel.Csv.Tests/AsyncIssueTests.cs +++ b/tests/MiniExcel.Csv.Tests/AsyncIssueTests.cs @@ -5,8 +5,8 @@ public class AsyncIssueTests private readonly CsvExporter _csvExporter = MiniExcel.Exporter.GetCsvExporter(); private readonly CsvImporter _csvImporter = MiniExcel.Importer.GetCsvImporter(); - private readonly OpenXmlExporter _openXmlExporter = MiniExcel.Exporter.GetExcelExporter(); - private readonly OpenXmlImporter _openXmlImporter = MiniExcel.Importer.GetExcelImporter(); + private readonly OpenXmlExporter _openXmlExporter = MiniExcel.Exporter.GetOpenXmlExporter(); + private readonly OpenXmlImporter _openXmlImporter = MiniExcel.Importer.GetOpenXmlImporter(); ///

/// Csv SaveAs by datareader with encoding default show messy code #253 /// diff --git a/tests/MiniExcel.Csv.Tests/IssueTests.cs b/tests/MiniExcel.Csv.Tests/IssueTests.cs index 3d06a3dd..c1bd3245 100644 --- a/tests/MiniExcel.Csv.Tests/IssueTests.cs +++ b/tests/MiniExcel.Csv.Tests/IssueTests.cs @@ -5,8 +5,8 @@ public class IssueTests private readonly CsvExporter _csvExporter = MiniExcel.Exporter.GetCsvExporter(); private readonly CsvImporter _csvImporter = MiniExcel.Importer.GetCsvImporter(); - private readonly OpenXmlExporter _openXmlExporter = MiniExcel.Exporter.GetExcelExporter(); - private readonly OpenXmlImporter _openXmlImporter = MiniExcel.Importer.GetExcelImporter(); + private readonly OpenXmlExporter _openXmlExporter = MiniExcel.Exporter.GetOpenXmlExporter(); + private readonly OpenXmlImporter _openXmlImporter = MiniExcel.Importer.GetOpenXmlImporter(); [Fact] public void TestPR10() diff --git a/tests/MiniExcel.Csv.Tests/MiniExcel.Csv.Tests.csproj b/tests/MiniExcel.Csv.Tests/MiniExcel.Csv.Tests.csproj index 7e4a2811..84e3963f 100644 --- a/tests/MiniExcel.Csv.Tests/MiniExcel.Csv.Tests.csproj +++ b/tests/MiniExcel.Csv.Tests/MiniExcel.Csv.Tests.csproj @@ -27,21 +27,19 @@ - - - - - - - - - - + + + + + + + + From 771c62ad9e0e79bd584b23efb4776dcb5f8a570d Mon Sep 17 00:00:00 2001 From: Michele Bastione Date: Mon, 21 Jul 2025 20:21:55 +0200 Subject: [PATCH 24/26] Fixed accidentally adding old tests not part of the solution --- .gitignore | 3 +- .../TemplateOptimization/DummyFiller.cs | 74 ----- .../TemplateOptimization/MainTest.cs | 82 ------ .../TemplateOptimization/MatrixCreator.cs | 257 ------------------ .../TemplateOptimization/RawDataFillTest.cs | 160 ----------- .../TemplateOptimization/template.xlsx | Bin 55272 -> 0 bytes 6 files changed, 2 insertions(+), 574 deletions(-) delete mode 100644 tests/MiniExcel.Core.Tests/TemplateOptimization/DummyFiller.cs delete mode 100644 tests/MiniExcel.Core.Tests/TemplateOptimization/MainTest.cs delete mode 100644 tests/MiniExcel.Core.Tests/TemplateOptimization/MatrixCreator.cs delete mode 100644 tests/MiniExcel.Core.Tests/TemplateOptimization/RawDataFillTest.cs delete mode 100644 tests/MiniExcel.Core.Tests/TemplateOptimization/template.xlsx diff --git a/.gitignore b/.gitignore index 5f5f7fd7..d17a1326 100644 --- a/.gitignore +++ b/.gitignore @@ -402,4 +402,5 @@ FodyWeavers.xsd /tests/MiniExcel.Tests.AspNetMvc/packages /TestTemplate /tests/MiniExcel.Tests/TemplateOptimization -/samples/xlsx/Test_EnableWriteFilePath.xlsx \ No newline at end of file +/samples/xlsx/Test_EnableWriteFilePath.xlsx +/tests/MiniExcel.Core.Tests/TemplateOptimization/ \ No newline at end of file diff --git a/tests/MiniExcel.Core.Tests/TemplateOptimization/DummyFiller.cs b/tests/MiniExcel.Core.Tests/TemplateOptimization/DummyFiller.cs deleted file mode 100644 index 0c174a8e..00000000 --- a/tests/MiniExcel.Core.Tests/TemplateOptimization/DummyFiller.cs +++ /dev/null @@ -1,74 +0,0 @@ -namespace MiniExcelLib.Tests.TemplateOptimization; - -public class FileSystemEntry -{ - public string Path { get; set; } - public SecurityIdentifier Owner { get; set; } - public FileAttributes FileEntryAttributes { get; set; } - public Dictionary Acl { get; set; } - public bool IsModified { get; set; } - public string Error { get; set; } -} - -public static class DummyFiller -{ - public static IEnumerable GenerateDummyFileSystemEntries(int n) - { - var allRights = Enum.GetValues().ToArray(); - var random = new Random(); - var firstAcl = DummyAccessList(random, allRights); - - yield return new FileSystemEntry - { - Path = $@"C:\Users\DummyUser\Documents\", - Owner = DummySecurityIdentifier(random), - FileEntryAttributes = FileAttributes.Directory, - Acl = firstAcl, - IsModified = (random.Next() & 1) == 1, - Error = firstAcl.Count == 0 ? "Access Denied" : string.Empty // 10% chance of error - }; - - var tempEnum = Enumerable.Range(1, n).Select(i => - { - var acl = DummyAccessList(random, allRights); - var randomAttributes = (FileAttributes)((1 << random.Next(12)) | (int)FileAttributes.Normal); - randomAttributes &= ~FileAttributes.Directory; - return new FileSystemEntry - { - Path = $@"C:\Users\DummyUser\Documents\File {i++}.txt", - Owner = DummySecurityIdentifier(random), - FileEntryAttributes = randomAttributes, - Acl = acl, - IsModified = (random.Next() & 1) == 1, - Error = acl.Count == 0 ? "Access Denied" : string.Empty // 10% chance of error - }; - }); - foreach (var entry in tempEnum) - { - yield return entry; - } - } - - private static Dictionary DummyAccessList(Random random, FileSystemRights[] allRights) => - Enumerable.Range(0, random.Next(0, 5)) - .Select(_ => new - { - Sid = DummySecurityIdentifier(random), - AccessType = DummyFileSystemRights(random, allRights) - }) - .GroupBy(o => o.Sid) - .ToDictionary( - g => g.Key, - g => g.Select(x => x.AccessType).First() - ); - - private static SecurityIdentifier DummySecurityIdentifier(Random random) => new( - $"S-1-5-21-100000000-100000000-100000000-{random.Next(999990000, 999999999)}"); - - - private static FileSystemRights DummyFileSystemRights(Random random, FileSystemRights[] allRights) - { - var rightsCount = random.Next(1, allRights.Length); - return (FileSystemRights)random.NextInt64((1L << rightsCount) - 1); - } -} \ No newline at end of file diff --git a/tests/MiniExcel.Core.Tests/TemplateOptimization/MainTest.cs b/tests/MiniExcel.Core.Tests/TemplateOptimization/MainTest.cs deleted file mode 100644 index 1bccb412..00000000 --- a/tests/MiniExcel.Core.Tests/TemplateOptimization/MainTest.cs +++ /dev/null @@ -1,82 +0,0 @@ -namespace MiniExcelLib.Tests.TemplateOptimization; - -public class MainTest -{ - private readonly ITestOutputHelper _testOutputHelper; - - public MainTest(ITestOutputHelper testOutputHelper) - { - _testOutputHelper = testOutputHelper; - } - - internal const int GenerateLimit = 1000; - - [Fact] - public void OptimizationTest() - { - var tmpFilePath = Path.Combine(Environment.CurrentDirectory, @"C:\Users\computer\source\repos\MiniExcel\tests\MiniExcel.Core.Tests\TemplateOptimization\template.xlsx"); - - var testList = DummyFiller.GenerateDummyFileSystemEntries(GenerateLimit).ToList(); - _testOutputHelper.WriteLine("Getting SIDs from result(owner)"); - var identities = testList.Select(x => x.Owner).ToList(); - _testOutputHelper.WriteLine("Getting SIDs from result(ACLs)"); - foreach (var securityIdentifier in testList.Select(x => x.Acl).SelectMany(sid => sid.Keys)) - { - identities.Append(securityIdentifier); - } - - _testOutputHelper.WriteLine("Creating Matrix List"); - var timer = Stopwatch.StartNew(); - var matrixCreator = new MatrixCreator(testList, identities); - var matrixRows = matrixCreator.Creation().ToList(); - timer.Stop(); - _testOutputHelper.WriteLine($"Created in {timer.Elapsed}"); - - var sheets = SheetCreation(matrixRows); - tmpFilePath = matrixCreator.ExcelFileCreator(tmpFilePath); - - var timestamp = Stopwatch.GetTimestamp(); - var memory = Environment.WorkingSet / (1024 * 1024); - TestingMethod(matrixCreator, sheets, tmpFilePath, "result_template.xlsx"); - memory = Environment.WorkingSet / (1024 * 1024) - memory; - var elapsed = Stopwatch.GetElapsedTime(timestamp); - - _testOutputHelper.WriteLine($"\n \n Memory used: {memory}MB \nWith Time: {elapsed.TotalMilliseconds} ms \n \n"); } - - private static void TestingMethod(MatrixCreator matrixCreator, Dictionary sheets, string templatePath = "", string saveAsName = "result.xlsx") - { - var path = Path.Combine(Environment.CurrentDirectory, saveAsName); - if (File.Exists(path)) File.Delete(path); - MiniExcel.Templater.GetOpenXmlTemplater().ApplyTemplate(saveAsName, templatePath, sheets); - } - - private static Dictionary SheetCreation(List? matrixRows) - { - var sheets = new Dictionary(); - if (matrixRows is null) - return sheets; - - var pages = (int)Math.Ceiling(matrixRows.Count / ReportHelper.MaxMatrixRow); - var matrixLength = matrixRows.First().Access.Length; - var identityParts = (int)Math.Ceiling(matrixLength / ReportHelper.MaxMatrixIdentityPart); - - for (var page = 0; page < pages; page++) - { - for (var part = 0; part < identityParts; part++) - { - var startPart = (int)(part * ReportHelper.MaxMatrixIdentityPart); - var endPart = Math.Min((int)(startPart + ReportHelper.MaxMatrixIdentityPart), matrixLength); - - var partName = identityParts == 1 ? "" : $"-{part + 1}"; - var sheetName = "Matrix" + (page == 0 && identityParts == 1 ? "" : $"_{page + 1}{partName}"); - - var chunk = ReportHelper.Page(matrixRows, (int)ReportHelper.MaxMatrixRow, page) - .Select(x => x.ToDictionary(startPart, endPart)); - sheets.TryAdd(sheetName, chunk); - Console.WriteLine($"Adding {sheetName} Sheet"); - } - } - - return sheets; - } -} \ No newline at end of file diff --git a/tests/MiniExcel.Core.Tests/TemplateOptimization/MatrixCreator.cs b/tests/MiniExcel.Core.Tests/TemplateOptimization/MatrixCreator.cs deleted file mode 100644 index 115a2455..00000000 --- a/tests/MiniExcel.Core.Tests/TemplateOptimization/MatrixCreator.cs +++ /dev/null @@ -1,257 +0,0 @@ -using System.Buffers; -using System.Collections.Concurrent; -using ClosedXML.Excel; - -namespace MiniExcelLib.Tests.TemplateOptimization; - -#region Models - -/// -/// Represents access types for file system permissions -/// -public enum AccessType : byte -{ - None = 0, - FullControl = 1, // 'F' - Modify = 2, // 'M' - Write = 3, // 'W' - Read = 4, // 'R' - Special = 5 // 'S' -} - -public class AccountInfo -{ - public SecurityIdentifier Sid { get; set; } - public string Name { get; set; } - public string Domain { get; set; } -} - -#endregion - -#region Helper - -/// -/// Helper class for account-related operations -/// -public static class ReportHelper -{ - public const double MaxMatrixIdentityPart = 400; - public const double MaxMatrixRow = 400; - - public readonly struct MatrixRow(string path, AccessType[] access) - { - public string Path { get; } = path; - public AccessType[] Access { get; } = access; - - public Dictionary ToDictionary(int startPart, int endPart) - { - var dict = new Dictionary(endPart - startPart + 1) - { - ["Path"] = Path - }; - - for (var i = startPart; i < endPart; i++) - { - if (i < Access.Length) - { - dict[i.ToString()] = GetAccessType(Access[i]); - } - } - - return dict; - } - } - - private static ConcurrentDictionary AccessTypeMap { get; } = new( - new Dictionary - { - { FileSystemRights.FullControl, AccessType.FullControl }, - { FileSystemRights.Modify | FileSystemRights.Synchronize, AccessType.Modify }, - { FileSystemRights.Write | FileSystemRights.Synchronize, AccessType.Write }, - { FileSystemRights.Read | FileSystemRights.ReadAndExecute | FileSystemRights.Synchronize, AccessType.Read } - }); - - public static string? GetAccessType(AccessType accessType) => accessType switch - { - AccessType.None => null, - AccessType.FullControl => "F", - AccessType.Modify => "M", - AccessType.Write => "W", - AccessType.Read => "R", - AccessType.Special => "S", - _ => string.Empty - }; - - public static AccessType GetAccessType(FileSystemRights acl) => AccessTypeMap.GetValueOrDefault(acl, AccessType.Special); - - public static IEnumerable Page(IEnumerable en, int pageSize, int page) - { - return en.Skip(page * pageSize).Take(pageSize); - } -} - -#endregion - -public class MatrixCreator -{ - private ConcurrentDictionary _entryCache; - private readonly List _resultList; - private readonly List _aclSids; - private readonly ConcurrentDictionary _identityCache; - - public MatrixCreator(List resultList, List aclSids) - { - _entryCache = []; - _resultList = resultList; - _aclSids = aclSids; - _identityCache = new (_aclSids - .Distinct() - .Select((sid, index) => new { sid, index }) - .ToDictionary(x => x.sid, x => x.index) - ); - } - - - public IEnumerable Creation() - { - var first = _resultList.First(); - yield return new ReportHelper.MatrixRow(first.Path, CheckPathAccess(first.Path, first.Acl)); - - foreach (var fileSystemStruct in _resultList) - { - var child = fileSystemStruct.Path; - - var childAccessArray = CheckPathAccess(child, fileSystemStruct.Acl); - var parentArray = CheckPathAccess(Path.GetDirectoryName(child) ?? child); - - - // If the parent and current Path array is not sequence equal - if (AreAccessArraysEqual(childAccessArray, parentArray)) continue; - yield return new ReportHelper.MatrixRow(child, childAccessArray); - } - } - - private static bool AreAccessArraysEqual(AccessType[] array1, AccessType[] array2) - { - // Quick check: if both arrays have the same reference, they're equal - return MemoryExtensions.SequenceEqual(array1, array2); - } - - private AccessType[] CheckPathAccess(string currentFolder, - Dictionary? accessDict = null) - { - if (_entryCache.TryGetValue(currentFolder, out var accessArray)) return accessArray; - if (accessDict is null) return []; - var accessSpan = GetAccess(accessDict); - if (!accessSpan.TryCopyTo(accessArray) || accessArray is null) accessArray = accessSpan.ToArray(); - _entryCache.TryAdd(currentFolder, accessArray); - - return accessArray; - } - - private Span GetAccess(Dictionary accessDict) - { - var pooledArray = ArrayPool.Shared.Rent(_identityCache.Count); - try - { - var resultSpan = pooledArray.AsSpan(0, _identityCache.Count); - resultSpan.Clear(); - - foreach (var (sid, rights) in accessDict) - { - if (!_identityCache.TryGetValue(sid, out var index)) continue; - resultSpan[index] = ReportHelper.GetAccessType(rights); - } - - return resultSpan; - } - catch (Exception ex) - { - Console.WriteLine($"Error in matrix row creation: {ex.Message}"); - return []; - } - finally - { - // Return the array to the pool - ArrayPool.Shared.Return(pooledArray); - } - } - - public string ExcelFileCreator(string outputPath) - { - Console.WriteLine("Creating base template"); - // Step 1: Create template with ClosedXML - var templatePath = Path.Combine(Path.GetDirectoryName(outputPath) ?? string.Empty, "template.xlsx"); - using var workbook = new XLWorkbook(); - - MatrixSheet(workbook); - - workbook.SaveAs(templatePath); - - return templatePath; - } - - - private void MatrixSheet(XLWorkbook workbook) - { - var matrixRowCount = Creation().Count(); - var pageCount = (int)Math.Ceiling(matrixRowCount / ReportHelper.MaxMatrixRow); - if (pageCount == 0 || matrixRowCount == 1) - { - Console.WriteLine("No data found. Matrix will be skipped."); - return; - } - - var identityParts = (int)Math.Ceiling(_identityCache.Count / ReportHelper.MaxMatrixIdentityPart); - if (_identityCache.Count > ReportHelper.MaxMatrixIdentityPart) - Console.WriteLine($"Warning: Currently found users count is {_identityCache.Count}. " + - $"Will be separated into {identityParts} parts per page ({pageCount}/{identityParts})."); - - for (var page = 0; page < pageCount; page++) - { - for (var part = 0; part < identityParts; part++) - { - var partName = identityParts == 1 ? "" : $"-{part + 1}"; - var sheetName = "Matrix" + (page == 0 && identityParts == 1 ? "" : $"_{page + 1}{partName}"); - - var matrixSheet = workbook.Worksheets.Add(sheetName); - Console.WriteLine($"Creating {sheetName} sheet"); - // Create header row - var userIndex = 2; - - //Set up Rows - var headerRow = matrixSheet.Row(1); - var fillDataRow = matrixSheet.Row(2); - fillDataRow.Cell(1).Value = $"{{{{{sheetName}.Path}}}}"; - - // Set up splitter cell first - var splitterCell = matrixSheet.Cell(1, 1); - splitterCell.Value = "Path"; - splitterCell.Style.Font.SetFontColor(XLColor.ForestGreen); - matrixSheet.Column(1).Width = 60; - - var headerStyle = headerRow.Cell(userIndex).Style; - headerStyle.Font.SetFontColor(XLColor.White); - headerStyle.Font.SetBold(true); - headerStyle.Alignment.SetTextRotation(90); - headerStyle.Fill.SetBackgroundColor(XLColor.ForestGreen); - - foreach (var sid in ReportHelper.Page(_identityCache, (int)ReportHelper.MaxMatrixIdentityPart, part)) - { - var header = headerRow.Cell(userIndex); - - - header.Style = headerStyle; - header.Value = $"{sid.Key.Value}"; - fillDataRow.Cell(userIndex).Value = - $"{{{{{sheetName}.{part * ReportHelper.MaxMatrixIdentityPart + userIndex - 2}}}}}"; - matrixSheet.Column(userIndex).Width = 3; - userIndex++; - } - - headerRow.SetAutoFilter(); - matrixSheet.SheetView.Freeze(1, 1); - } - } - } -} \ No newline at end of file diff --git a/tests/MiniExcel.Core.Tests/TemplateOptimization/RawDataFillTest.cs b/tests/MiniExcel.Core.Tests/TemplateOptimization/RawDataFillTest.cs deleted file mode 100644 index 032c9f2a..00000000 --- a/tests/MiniExcel.Core.Tests/TemplateOptimization/RawDataFillTest.cs +++ /dev/null @@ -1,160 +0,0 @@ -using ClosedXML.Excel; - -namespace MiniExcelLib.Tests.TemplateOptimization; - -internal static class MiniExcelVersion -{ - private static IEnumerable Page(IEnumerable en, int pageSize, int page) - { - return en.Skip(page * pageSize).Take(pageSize); - } - - private static IEnumerable OptimizeFileSystemStructs(IEnumerable fileSystemStructs) - { - return fileSystemStructs.SelectMany(entry => - entry.Acl.Count != 0 - ? entry.Acl.Select(acl => CreateRawEntry(entry, acl.Key.ToString(), acl.Value.ToString())) - : [CreateRawEntry(entry, string.Empty, string.Empty)] - ); - } - - private static object CreateRawEntry(FileSystemEntry entry, string aclIdentity, string aclRights) - { - return new - { - entry.Path, - entry.Owner, - entry.FileEntryAttributes, - ACLIdentity = aclIdentity, - ACLRights = aclRights, - entry.IsModified, - entry.Error - }; - } - - public static void RawDataFill(IEnumerable fileSystemStructs, string filePath, int maxRowPerSheet) - { - var result = OptimizeFileSystemStructs(fileSystemStructs); - - var sheets = new Dictionary(); - var pageNumbers = Math.Ceiling((decimal)(result.Count() / (double)maxRowPerSheet)); - for (var pager = 0; pager < pageNumbers; pager++) - { - sheets.TryAdd("RawData " + (pager == 0 ? "" : pager + 1), Page(result, maxRowPerSheet, pager)); - } - - using var stream = File.Create(filePath); - MiniExcel.Exporter.GetOpenXmlExporter().Export(stream, sheets, configuration: new OpenXmlConfiguration - { - FreezeRowCount = 1, DynamicColumns = - [ - new DynamicExcelColumn("Path") { Width = 65 }, - new DynamicExcelColumn("Owner") { Width = 50 }, - new DynamicExcelColumn("FileEntryAttributes") { Width = 20 }, - new DynamicExcelColumn("ACLIdentity") { Name = "Account Identity", Width = 50 }, - new DynamicExcelColumn("ACLRights") { Name = "Account Rights", Width = 30 }, - new DynamicExcelColumn("IsModified") { Name = "Modified" }, - new DynamicExcelColumn("Error") - ] - }); - sheets.Clear(); - - using var workbook = new XLWorkbook(stream); - foreach (var worksheet in workbook.Worksheets) - { - var firstRow = worksheet.FirstRow(); - var firstRowStyle = firstRow.Style; - firstRowStyle.Fill.SetBackgroundColor(XLColor.FromHtml("#FF228B22")); - firstRowStyle.Font.Bold = true; - firstRow.Height = 30; - firstRowStyle.Alignment.Horizontal = XLAlignmentHorizontalValues.Center; - firstRowStyle.Alignment.Vertical = XLAlignmentVerticalValues.Center; - firstRowStyle.Font.SetFontColor(XLColor.White); - } - } -} - -internal static class ClosedXMLVersion -{ - private static IEnumerable Page(IEnumerable en, int pageSize, int page) - { - return en.Skip(page * pageSize).Take(pageSize); - } - - private static IEnumerable OptimizeFileSystemStructs(IEnumerable fileSystemStructs) - { - return fileSystemStructs.SelectMany(entry => - entry.Acl.Count != 0 - ? entry.Acl.Select(acl => CreateRawEntry(entry, acl.Key.ToString(), acl.Value.ToString())) - : [CreateRawEntry(entry, string.Empty, string.Empty)] - ); - } - - private static object CreateRawEntry(FileSystemEntry entry, string aclIdentity, string aclRights) => new - { - entry.Path, - entry.Owner, - entry.FileEntryAttributes, - ACLIdentity = aclIdentity, - ACLRights = aclRights, - entry.IsModified, - entry.Error - }; - - private enum HeaderColumn - { - Folder, - Owner, - FileEntryAttributes, - ACLUser, - ACLAuthorityLevel, - Modified, - Error - } - - - /// - /// This method populates the 'rawdata' sheet in the Excel workbook with the provided results list. - /// - /// The Excel workbook to work with. - /// The list of results to populate the sheet with. - /// - public static void RawDataFill(IEnumerable fileSystemEntries, string filePath, int maxRowPerSheet) - { - using var workbook = !File.Exists(filePath) ? new XLWorkbook() : new XLWorkbook(filePath); - var result = OptimizeFileSystemStructs(fileSystemEntries); - var maxPages = Math.Ceiling((decimal)(result.Count() / (double)maxRowPerSheet)); - - for (var pager = 0; pager < maxPages; pager++) - { - var worksheetName = "RawData" + (pager == 0 ? "" : $" {pager + 1}"); - var worksheet = workbook.Worksheets.Add(worksheetName); - for (var i = 0; i < Enum.GetNames().Length; i++) - { - worksheet.Cell(1, i + 1).Value = Enum.GetName(typeof(HeaderColumn), i); - } - - // Apply styling to the headers - var headerRange = worksheet.Range(1, 1, 1, Enum.GetNames().Length); - headerRange.Style.Fill.SetBackgroundColor(XLColor.FromHtml("#FF228B22")); - headerRange.Style.Font.Bold = true; - - var dataToSet = Page(result, maxRowPerSheet, pager); - - //2. tól kezdjük a fejléc miatt - worksheet.Cell(2, 1).InsertData(dataToSet); - _ = worksheet.Range("A:F").SetAutoFilter(); - _ = worksheet.Columns("A:F").AdjustToContents(); - _ = worksheet.Style.Border.InsideBorder = XLBorderStyleValues.Thin; - _ = worksheet.Style.Border.InsideBorderColor = XLColor.FromHtml("#FF3B444B"); - _ = worksheet.Style.Font.SetFontColor(XLColor.Black); - - worksheet.FirstRow().Height = 30; - worksheet.FirstRow().Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Center; - worksheet.FirstRow().Style.Alignment.Vertical = XLAlignmentVerticalValues.Center; - worksheet.FirstRow().Style.Font.SetFontColor(XLColor.White); - } - - if (!File.Exists(filePath)) workbook.SaveAs(filePath); - } -} \ No newline at end of file diff --git a/tests/MiniExcel.Core.Tests/TemplateOptimization/template.xlsx b/tests/MiniExcel.Core.Tests/TemplateOptimization/template.xlsx deleted file mode 100644 index e7f41a0fc9251236193d4d1323b01a9437477164..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 55272 zcmeEuXIPX;*0vE95DXxS2#O$*L~;fN2};f&NwVaep;07APLe~5B#|UZK#~Ye4r-I3 zL9&D<=lE4IyE8kxv%51JuJ^mH_x;h;Rj2McRp->Hy3g~pC@XRN1ksTrM@}EfdA;_S zeDj@E_0c0o^iCZ)LI|WzW=xKjHm16kmZo={%*~1;H7(=s68RkX8;Q&)3E$nKqszP{ z66um}ET3iW76YUggXO@0j44s!3mx>9FV>5wnwG_rSt;8^q}*@v9$r@m}5aDE6U&sb-^ z>zpg!8@F0^411h8p7A(d+UgG*Zyqj0w(@}lyW{)otSUz~-?`B%KTPA6+Nfn|B^Wk1 zdB)@Rs~vl{PikMXO??E3D|m3(IaPDBS2m=Uyz~h5XS(qC8r^w?IW|v}a7*7zSD)aV z&UxoJV$i7OdT^&U-NsPQ`?zbgpI)f6_&M=&w@E!IkBOX!+YlaQ7)rPoaN}jY`njjv zC%!sK9Lw2G{=qQhe{U8FFa9t&{bnimG!dd=4IR*aU4^v3(AGVPqGf(YUImTGq2uq( zS+!xhW~Cgb7`3rLnyvAc;l*U>QX9&+MZ+!DEzxUfd;{xnfy0DylTf>N?BdO>2O&(P zO(gc)Rv{td@f(}euGhP@d$dK#Pu9n7?G7eapZ%cCC;zRgp z6|_iciku~-f0a=1bt_clb{U@FFK}+q~WQO;b ze_#T$CS{Xb*rS)U4cXU{1o3zuT(mRJaloK z+1?g$;kS23uZoIV3KBSYw8tc2kTNqH6};0qoqGj7{0qrAwwRolCvR(8%k{+YiesFa zDn6@*s5yj0$wrjTdkPxAZCRbIp~o+dRgNykUYKF6{NcLccV?70okuEjeKIFAS+aZ% z*VM0=gRI4iM=C1>!^Yla{4uy&zBbmTZ}vTaeT_G)L&&=x?dg4qBX*g++j!AjPB<|g zD`*x-G0WCw5qD{pt(MO$(->VEea45U&0c2pE_?d)1V>G0YvwSAtx0C4LY@;kl_%)K zhf6bTYgaZSAd1PAVO};PQ-+mrp>r;iY3JdBYKHS1cLh)_!1eN@aH8S5@k%Xkr*Sho zkcvs3qX+4q|Ty`^^P z-ASUXghp@Ct7TUF9PH_8C6$bZ@6bf4mu>5Ezwopr<65*~;GB zn@6e~S4+qLv>;cBDo~GID?0GVH+<($d#mE$g+H@mirPo|PV=OG_UBhjII$mBRf5*y zbqE`@xcxP6)(_*b(P}{FoT4Q4mK~!>b+>#^Rm1cs@xY=dfFOTZv%Ft=f zO}$XJqpex8Sm#18pE5wjyJ|OALq?bWfgb-_OPYM0`uT+f#lX^G&4q-{ZAFybFpf8^ zNR^5Lo6%w==?wRdL0V5t^94a3dKquOfiH4mbW#<0=NGyZ6E=-`q9i8#kUn3(gyRxf zQdmnSJtDFcAv>N*iQ4PV*Pv4v#F?k0%amOTW}D878|6MuLjH(B*^T~;=?y#&_u~`=2@T~Kr64Rz# z>aqGA(j^rs>cG6pPyYVw=`Ur(==270L=h5n`hyE#tux%52k-KeQZ(;GvJUmUympp0|LR6AeNtw{lCmO&f-ODf zvX;Ex7zcBrf_&K6p56BWx=3z|iwgSG#5_a(y()T{W4S=xoRiG4&=cu44eD}v%=Sbm zIK^_Qqq1a>ZF+8GLqS7%{u^DB1lGvwY2O;mO~|hk3l3eoN36ha^h5Oy@jVL#8KeYt z=#;d>Yuy=HfA+<_nC9!ikqHsFH?$=hY%+3rQ72Rr2y zxW|W>S7gCgS!iCjB7yV4JC~sRq!(_*={Ai$LWWA9N5G2xJ!tKyppKseO^nJ?Yn>v& zR+$xt3TR?)?!U_;K^c3Mt-R@k8;={EZ$*m8jGl>w(rWv|iO>!98I_Z|{HJ<&O&EOL zrd96%E$5l%xPfU3i;8|=3PQ{^4X}vr&Gv_h?Zx-G>Cz{aPj0+ATFIuW`dz{e~WJ*W<6Ifoo(49(lg0dcJ!>iB1*q z!L;=@jl62l{L7MFbO6lmT(N>82p-b;t{k97xy}`OY~yoM1n?$r$4mcA`z%be95c!m zC;c3V1wK-Q+iPG!M}>88Li3H1s~uDr);F(0;tIqkLdDQk!2A+*WCO5gn7c6)cwsMV z1|2raeQ_lVT5N}umVz!EU5Np}TyTLxJ}8c;={ z4o2sbA@1@37oX+52ZSYWwqr=A=Dg_@B`0iolGeL*r*6pThcG&j7a$~ZBRl(2@m6f& z<fPf1Enmw@FGX1||G1-^KJj4{q6 zv(e_60Z!Ope-i>cxpJM_6v$#r2i~A;8VPgX7xg+fUd*%)m;YQ6yu zd|V?wwV!14novmb*aKT9JA{g)@_(WTn)^-lERVx~ZZfeQ}q z8n}^pof&+0f8a`h29m(-CfG7peQ(PwaJKI7cmz&_vR8KNa*umcJOL}T=_xdTYDrqd zi-8~T98W?2IdbnQ>G6y8z)j_+Z8(hCJBd(}`uX8&z^+noHQO{A*pezr=0sXbzwih5 zhRrgVp<6)~sMAdp`7Re1kK3Rh(vM#{HUbK;g8oSN>yFu;6pUvkP{ z0K@oJy+VP51to?X!SzFqNzpa2NHc0F0;<(E&Fg;h{T-5)8%%A-!3xUrbUVP&UwCIb z{wKtx7T`WSVujdG5*J{l+XG(>fgXLjXVXC0!g-c0 zMAt-IA8E$zpV?TzNJft84f7#J~sSHOSWJ4{0eek4I;`M1mo0 zJjJV#lN_0hProh3?2SmT3Ik9b3VDA2OzJy3gFSF@b9b9lVm`O=eli4RELYWg!@hx1 zCnANh1nIEsl*?DA&VATg{sVjjC)FK|9tZ&^{_S(2I%Di)m^2VYtqpQ_^g83cKwgZwj-3Rf!L0=f+l zU_P9#GB?;iIZ1)3|6>KQo)`^NVtzVhOD#tw1*+G`_{Ynrl$bbmseXO1iZQbO7;E^2 zJpz=**xjpz?s`1R16W%4ehF}aGR31wu)Z8f-)cktn|wf3dBj*F9c&#gJ@Lp_UK;lH zD;LW(=6>k!oZgU=TuQhnl2Txh?T@=*zy&3bAK590(JYu2 zG2fG!2z6ZT=7Ha)C^u>F1$YnIi1j-K`OKBa7j7~6iPySsr#k&<1IT%K)K-r0gA-U| z7caO@&)LrGS%mhd64cN3Q0y)Un8@+|dM~&}bKY*4 z1Wr8>h2y6fY$2!NT>I!wq_CBc?g)wGu@XvAz~~?w92<4>hl-NSKTMYOP+8NoO`{g3|ZzL+xHO-!P1ByPnJ?*`YqGu@?q;PQxBMR`TLA8 zu%+Yuabg8mJ_>4aa20S*fFwl>%NO%)0kq!Bl#ru3$vecR8bOP|Yy{HukYlixo|%O= z_c*wX7Yy_(>j96A4*9~nS)|fdp5Lg!6LKzF`8P00VIx?leHQ;mP80})b!%|`z&?EC zrvqvD{S{~rY=H1;&jA-{A=yiR+9X!{&M=_*JyTT<2qnSQt;&=b-NxgGE_c(6(Z*2V zNMf=$gO9@A7~y%awvWt6G&n_qF{Ab_-jmqkK;Fd(brD#thSC}wT8 zv+C=)xo%Owd=;7r@((-kgcD3&GE7SmrWOR$F}06XLSi+oSY<$%Oo`JFPP(KOl;~Trn4JN3a9BnO)%h{f z-E-r1`emD%!iRu+HJCK$;VQg$nnBA=Ns=GVt$p**>pNc|OD8FTT%K&XI3?^2j<_)M6!C7B52UCJ5Q!&cUn@L=$+op3^9&~Ojt%uoUGkAs(P9j#ZcRWJ1Hvb7N z>-dTZeD5`aMSmc)0+FnCDY`uj?5=wdmzXrT6*_TUVTz)yM+R8F^6rbGSaFc493~9f z#0v>fvx*~YSSOk}za{O^8IV?2OrF4%4|4N@Nk8@w%fZ|>0py(8N@W`0QdpA=hvA#X z4M>1&`5W2~8anJG@aZM+jI9-ndCayQ@RqGM6+8w6H%7tpl5iD!njlc<9`pmGwr;~Q zLSRwL2*>Y<7kLTQSU@?_1igqgD&M^FAQJZvbsu-D|=8#Zvqs+X!G%3FS68 z#S4z74l`E-&-6HC#W+X|L^lfF_#0e`Cov&|YQJb!W{657GD2oLMhFZb{LU4FE_yBrbfICct!;W%K_YaTQj9Cu3+7o8#wS5VtRgf z(vjwAZ)2LL*amq8fyTY8(L@l#3#Ogg>|M5OJ*_yXuVq(!%1g`>>h6P7x;laCi zmuI=1>gRwLH!%K({G`XpB?J!?`(diN!TwHnF5aa%8?1)^MW-t}d;7=(Sq9$kCfQ}9}Wf2uz5Gz6~d?*POG|3gufYDW#) z4{T1wQF=PW4{ngFx*z7Ml9jzr^+b1;Qz=`b8H2%5claW$@G2#SXZ;O2st0`6cOE8< z7kbEjlXc(mpCx@whU#Q%{m=_CNe;h&&$wdD98{F6wnQ*%J>_o>QafjwFeM;-BZVi% z+-d8Q*7ih$%73rYdtHb(R!~GD;SX3kEDC{AKZWx{Gv5P=FXS``JQs z2{Gm_TU^F>FvT_cb^<{U(jeE)=P(U&JKN6yvI5(zudAdA5*nN}!zm!6TsQuha(RZk z@;nkAk~{W8u(L72HQrS!z~-}>q^#GNVg06)>O4#>QofV|rVYZtl% zSKz-)hEjaxtD*`LOH;b&0FkKp+%^`uz(uXQ7B4ywGV}Cbxfb3cxw%>ZFr^Yj*6tVN$I=7Yq_nGvpNkkfNjggH=Fs zU51u~9+L8Bpg?toc?JlW96pPxet{7NT4PM;V>~w#m6p zqYbW$`Eibd{>-^f^z-TBHW3AP;+~xKr#DvZ*dzt=z-grK=Q8?THQ+>H11%ql`GXz-23WB=52Bc)_;#=bCTHv`ZN8`-5N8s$`fxDk< zd2r)89Y_{pVl+VmJjrCiFBPSwU|Ntvk8(#45Wxqe;9Q(sFwv>i)oJk@by{I9z@S-; z*~;K%BR)(^4qw*7iyu5e`3}zAWEKNC;T-E_G3LlKgSOi6Eyns=GGbd>`bt|N{)|X5 z-h1FNHtQojxO1&-$ZmjCc#jTJ;o#iG7hr5?e7G;P7rbfeZoYc$tTPeFos`6s;flvd z6a$yYs#NsG5d78fhK+@17?W&{R*SlUZ?7;!wfwpBMigx3`zb7HPiR&%Q^9yFq5?4~MZ6SwN* zhw!%4Poh`%p_DBa!K7#;Af-9%>c_KU{AN?D(OeRU<6WS*O%o`Hm0|Th z98tP^I06^JG|m|az;8FT-nP4u##EBLV@3MhUs#Z^_c?V9xz2DXa5#PVwLVq>yB(?z zzt-b^YB~JWlB*zDE(OyS^?iq`iLf3N7XjFFb-{b4HKTXiHJN9HmTF(CQP|LaQXzaB zf?lZ~t~kwW7%nY#5H3yO*m`BC5i1xI^JAw%3}|Y0gX!KRAKH@rl?~~uNn@5d~ z5u8lG<+}9bj_hT8qFcwkzuwc~kiASmlz!ZM>7I^&?B#QFPv}w@*I!<#A;`3$cCCwf zeV67oJ}z#A=jXSt@6zAK$HPT?elC4|m+3Y>KJLXApBrD_Wxb7m7FXfL=ib+MId9_= z;6}Xo{NqW3Kv_7yu8Ztt3ZltV-bX(NKZ5G;lkYybEqUJIbufM3O`J2{4~2AI$;MC< z`JC}K7Sc(OjiDjJ!S(hN(n*z#p(XOc_0AO1$(D_wC&Izw{Ztz{cfQd3vsLn4&D((_ zxGUbDpC#YbxgB^Jm(}NUX!2cy-mlklSM3$FxD485V_6j^@guowgFo9)Ga*@w-nL$G zC{?8YlUVo{1gO3jexT7r?tElqLHzoAv84Np=R7mc@%en`K0!!%7mlQ}^=VE>K2-AS z>b3asN9!-Sf35D%bN_!L{Sw2!=;hpMK82Y))9UP{S#( z*?wwx`%^+Pv(eMmE2OqQ_5a^ieG-zlM{w6#g2YD^;}SEz&GAJVPGz$3%B1x<)3voL z7&|0ADqK-~m&i%!r_e-xBb*Dw-T$6yCb|72ej>N9QTvxzR=fYJ9{K@)68{Bv?UVMq zF|7Yr{mBoKllT$bwfgOMV_E;N3jGkq$|l&H?CyN-VFJ8A{@&G6ymFt)ny&BWg9{nq z{6hbGs$D6l1RZ80)z&MQY<>RctJXg2=3mpo6zE1Xq|+uQx$JFB6L`v)r4t7)Wk_52 zE6|kGWky^b?PT0b>^o=gRevi_Xw6F$l=j~B)S&Jy3QBvQda67jgmUK<($EUrt}CR$ zhh^Yl>0jaE$0K|^Oyx!iv%Qb#jYIf#Sc)E&^%RG7P$FvIva+o@5x-+)TRbf1oGO{R zu8`Y(>95a{O-zmqQc30!o+X8NWp*v^8T=e$IK|_y5M7kCL^p07%Of0c1p=a2wDiE& zB^HQd)H}r0IT0_1swE~92OcUSIaI`Ss7Uh=PzC^IqKU}{0X-n^Ocn`%IEhOTcZuOp zkxB)w^P6c_sU(wcx+tbdzP?nHzc$D@9|jOtD=vFQT%t#0j?>aGD(|v1Ig))M=RRje z`Ca@|>@(q`8OMT8#^4d*9QSUzr^6;2bC$^GxcBru9X{C@LL!_K-e>OXJdlk!PvmpL zoA$nrq-@MZBAk=n5AW+J%Ek~A`JD7NzOSPp8$&{bgX8UYUq@dy<_eJyj(6sL9W&XO zt3)`byqoUp*vZCRBl0=rJ$+xtO*V#t2(XCV{Q`tv6R!h zNl2$iHinVN2hV$2NT)(JhKUFV-}{WPPMvHFGm#IzH?6Qvt8C0qspcO|_xL@&AN8uf z`TP^PGfs{0=_H}W%bru`_+Ek}>NhgY-_Ae(Kb8Kc^S?=6a<`Tj3(lLo9Q^Oas<1U1 z{G0WshPS?}Q~als+y7{${AXpMtcrpf$%wM^|BM<$|M&30Uoc=-N_#>wtI?0vD?GM7 z|5yFV4>buoca1K$Ucs^T`M>HiRe=l`nE4>mrNV%$Ycgy8A)PfxAC zm33x12)v|{rgrrL54;6p|9h%wE=4h{43qc)+_k#x@BhcE+tu8)TY1Rp{dJFHzy3G& zsxcR}ULHGggc$$Gk+XmLH}-bUW(J4=zC@n zn=@3=b*=d~2e9AvTy~>Ua~>qi5{EXD?A+PVNOHC1E1x0t>Ap@(%!i5yxP0?_+3nkT z@)h4EvLxKtk@gB{ocQymM}qJ@vy7uhAJ00FiqPdH-XruH-gu=q8vHqO~pv+QOk*g&Sj#;;km)V^PXH4tq z9}W3dEF5&1)BNmaziSr_E!%iMMOm;c@6&S^w=NR3m!^vx&Alk}Mbr6Z<^A2-xri`# z8-|@t$+;9v`b_*B(Oy@i5iRj_kSrsWJ9EX{ea)k%9$x;yc~r`F!^jHl7v>}FaVgG; zW>UQ)yogYA`b4u-_^$FXR#DT^D@xibkI*)@60fS*1+Qc%6sPV^-)Ar;yt!VmWc`ww zr-5&`W4)=+{RzTDU|@-24(sTlW9xg|Xg1s0sAI@n_sdOJdWogPwj4jFM%NE-Bo)Z1 z77%umbxWRt2ROeDS%Guk=F~47Ig%H4IZ&wCt^RA?Le8WHOK;>k4=Lya-DB3y>C7CS2@wtSx`+P4;o z4>o_4DA0!tmra*j6@Jtd7+$CzLS(BTNkRlH?J6q;5uaBVnrgQfO?mg;M+;s%*ek8- z8?NLJ>Zlg?T;WO(m@qz=UR*&U^7D|$blcs1gVBkB&GHvsNJ19D1MJa!|l_h z52^;42nihqLTJjPDMnV^-Q$K_Y`M0VTF3>g>^B=*HrBDz=%qbD1Th)G##qaJk3>oB zTeX6cK5?yV+&%iaO{x*zx0u+}Ojx*jo}%RD6>VQhu#-(FGm4cdH&_bx%y2gs;{@B} zgr#Vh*2v|qNvE*pt`P!39_XkVx!toJm7+0=+?9D|>fQkQ`Nhh*tGSws_uD{&B1lwY zcE-POaMs`4ue6tV_JVaG{W|rii3)?{9Huv>x15?ZXR%pSy>%Jb3OMUhv>~P&kXo^T_Z5 zk>`owETYfT!V5&7=Y+F}JueO~5PM!3&LaLC75-8Dmc$HYA46<_ev$s2@UHMOaYKno z%05OQC=JW6te zQjNtM3K+h%hSRF1#!@T17iX17e-dUGC0Rq+#t`c%5~s#O9l%zo|LBsjVbiNapc(`g zK%hPZHbG$c?*)E~?qG=hM)HLrb~#ewsn!>gub>$X3t-VBXc4eE-42-eXF(>k*#-!j z0fG)7{vCn8NSrzgaR6J1{yUXBSl9d7gC+WO+C#AT?lED1r>f4fNs-~(V0fllY8kac zp}4I?`g+z&hS)ebkR1**xnyk7)cIE!!?4LH$u`P1#@_|R0>>8v$9KY=CPSmW%;O5P+}&0UB=BzaXfk6p51jr$t_cNwkPRLu@^hSCM|diq@H?lj_w(-@=Xe z9*aw)uLay-jE#c*|6(`uDbUHG&+`Xx1bC-=NWx>1sOVcHZ3Vv_ZvcvR~T5Tq#}NdJHUUR;;J_(EtpynGm-+3+U913pj#k>2_< zF%H(EcvNj#$L)J_Q)Ghiu~UFp#*n z02Y-AYA@?{gc93Vrh5T^ZihkRV8o+OW7glmue67F;DU8NeUEp%W0k2+8z+0#v z1-yC-@M=Cc;MK2ySF_vG9Q7PLZJ8PtPfQKoF>v;@&5dT^ui@U1_-k^_JJ*2sKTfWF z^aryOCpD>NscpkrqgzD^v{^`+o;7Ju;oY(glZ*iZ9UyoK1oS}A3I%#V5DEl;NvVHD zu7?c!dy9>WLQ#_Y%?d(VUu1A0!(M_6%M2KnLH_AKD?k)Rz{__Y1Ya45L?R&gH81`r z1iyz{waNb@1Uubg6eT&0_Y@Qoun2%f3oL+zX~4o)&>(Pde-hblUx}_#Nc>$B6UyFsuW(So*;&V*>7zOn43djldcp>H&fjAdDgD{0jn| zFiMH^e^$Iv(JF3%B)rm$ccbjdtcuWMmK<$dd&usWnOOurd+I$cfJFsyjUL#YBe!Wo&vfnJ=M+&t-_fnA@S6|7vbD6UYm6sSn}=8M@* z*S1t<3eh5{*nLkLRZciNUAmDqFr5k>yx*WBFx$15Ji_&X2JIoYYRp0jp|2SFMQx1= zy1U_2$pCiMz$12N?fY={dPfLNNJ~T4eEeERmT~6vRkp;5k(`xj1_IUq%+g)XfslC1 z1?6~DQPXr&(Rfkg^84l0(QC$`$9Wsjl($}b`UWPNFHGpYELiuK+sK{qpo_)2wl|Sk--QFPdMbmYm5U$L$v<(S};jG z*ax=;R3VZHu{j#ww&|9n_4(oOkd_QdJ6dTZX{su4ugX}E+@qA8yYkt>$N9Z!Q3qT8 z#KgQGU*-myGNOI0dsc+q_xDG>Tx(u;I6Z(}cOeaI;GET2Np=@Npw?D3Iq@;`Zhlji zF*+3s9~Sn_Hl~gvN+;1b_nl^U(oj=I7H*d;`UfU;cq@Jgq+_E|ZP7v9nDyP0W5@{1 zx^;4Xle%GKWqOUGI=_doVTn{*P?}F5$b-9X&*r7z z4kB=4LAq=cAvHxE)%GR9VinWy@L=;oaL26m?vLr|)s@;LfqX9a$)&Q&B=U|852wk5 z;GIRMA0O0?`Y+Ux73!6B3 zo{D$uq#RWX>cVUBs0iwNVGNuS&nVS`qmGCaXfPi2*XLG0M$}|ea^iOQgw+{Ys+I`| zL_=W7Aut*OnIKRb0;?hL83dlZ2!I!FL5-47V+;f`L!cf6Hb7t~1X5poFRsCIG@y?9 zVgab!`0rNUh_?qS+;Y2_?u;tYjdR=;mK+Oj@s6oyjBX5P9ZOR4(IqX>xPxLlpjV(u zcWzOYT#0%b!8-OJv6QRDTlYI&GZ&rCk6)%@9Njg{g<2 z|Clfn+C~g)ONF*6LfdeGZSv4II%peoKr94Z1R#9~l7yf$0K@`8w*aUKI^cJKuBcA{ zEoPAo*ob^3@)DVPW#>VG-w=*sz|Q{})DA)1aOC)*un>;?H-&fLvY~Bd&^8ia+c>mM z1KI{7zy{j(Gsqi&GR^@I5d;YVkOGVVTnM@WG|@r_{3B3}^46fhN%aZa9U`;H4y?j^ zC4mx|e<%zPOHB zT4)4xM;f&BZ$WerL=8Zh(9%c>@L2*MK*k?Fs}VZ7wgZ07gN*zgFfuh@?L4dQ1`J{hv>XA=YeClb0jyoZ zWolI-=yb_Z{VpF)wEBBKoD%iB{5U=8@A+*9Eo(Mgo$q%Wwd1h}+G>UF0s6*={QO&t zz4Tj*4am8VvIUPtG>Sw&h=Hk*Oik+?e*vr3x%&lV40wP+^C5%kLk4YwoSXtVSp{-( zJ0$PHL-N*uR9gmtb`Xe#z%dByIRrxT9y}!PClFWzfnE@J7LxZ(NZu-tyxSpp4<3@Y z{;^Ab61Sd&mHt%G2NfYG`R`PSnqsY+z4B0Od7Gk=E5Vj1Hl{7#U&tBWVi^Z_b(ay!gCu#4UQIhK+u25*nW?=S=-|$@&G@(-2ikS4J*_@OKNkh^%&r2 zGRV;?khWtXZBIcFBx(sruQLxoNJFB|2OM1L062IG67`Uuml7Ey>Hr8@h9F4PUm?f^ zfQ%qf&qEL->J|vvh9Kn29MYS|GWy;v<W{IA*j>{oEP^mTkVB*FM>kXi=0o?ha zd1T$MkIr|1#xRS_0vYpf2Az*_d~lj+;AyUd z3;xeA_0O9A4qN{Ph5MHb{{s4Nu=P(m;fnqaQ~#RI{~f0Oh0cE=;=jk%zfd^M5Tf;G zO8?KX^+E~fr9=wD#!pXvM$vGp&!UbVSIf5_Io{{gl>B>O+c)W4?l-_O*L*$(Oa z4-@rYG5Sr!ZoPn6-g`FkRia$A|ZvRT)zC3a=a zaXrw3d||*rl|$H;)STSs&XAe!2jnUiJ5935g>FJkv-%@q3stcFbCQyiK7cg(W}v;9#*5df2?)wgiiH>MEp( zHsqP+ble!Wz{iZt`YwFb`QebEJ{E)?!IrLX)tmPO5$@Q}4~#GkjEvmnX7l~vQMOfh zEt(XWyhJBM(N>?u)t0@z!pwuRBdIZN*V6 zT#0iWSa(JfHZ*;7?G+^FMi{z<2{`QStl+K99sK&=WvM@wdwKfIkt1Y$fA=*Q>)~s# z_+guVWeO2(?~y8;f#h656Z-=LNT0rWVB)H?mtE6$joioBN^kFArRLhTy0I-L!`T5W)!DA)d$%;Vh9+ibINYiC z8ZKG}#4Di_FIPATI4zHegv}f65U z+XaQ?^9$zrPnFU8PEPv4zGD%qVVbtXh=XYg*Q(((b}fnvz5|oc_~G4r!`DtSyZ9HY&LV~Q8Z=CMW9v+W)()`P)2c9*xQrwN)O zGMbhauXtCU4xuG`&@0bnv*{#0VtZa7c~OQk@T9i?-AiuNpH&x)2#`-|v>#l?tGcAa zuqo=5|2+?MGjX~3pJWobjJJOaU~*3D)zF`>_gvuG#mC#f10`eUhp9Ba(NGy@-vDJ-Ru^by1O2uPOG^w-|NYJ3(b>N6?_c0xI_+Mxs2WeAIEd zu2|6i&@WB<1O+lt>bUpREND*~0K}__C{H;c5SJ=Vd)?`!jw=Z&-(f{os+2mS8NZA= z1r~+P@5i_dBXydrTj^?}#$uEno@8#zW|`v-Rx?nwBLm&ju)7O(=Ynn@g9hd-{DELS z$0tUZP{w)~xJJcV9JwK6k#t z=7OCQhLHvvXJGfm7|=~~H;bWM=83YJ1M*XL!JNQz2t4*50$v9eUOWLT^aK{loC6k~ zffmXE3u$nHg%5xmkhdWSy5S835do0jzX)o~j(flJz_7~;L&K7FYfd0cjeV=$9S2ie z;=%udH>~4(zvIVKt}=)N(xh))iKjzkD<1S--+JKW$@#ptVe`kL1_TC~UB`*!+j z`-uoqRqI=?***ue-cMtWN;ty+0{lA+`MaQU9fmv`i1J<#<0K)z<2>WL+z#oA~{{$=2pmLfS1kOR=00e%7Kz9hlgF(#!gF2fJ0-Ygn6#{1=upa^|4>cYF zDIoBdNay;mM>-6aq@Tmv$uN?*dI1J?h|zy1sQ>;k`P)dp|6hvq!!r}BbkPC%OU!2s zXo*i}Fj7#|o~`P;9F2{isZix~cJF;3lhnj-)-cd5(x+ioem1#MNr?oRRnXKez@)&n z@PYQjfKt5fep{1LQgOU8q3OrW0MzW8Rzfk~nm(!hTUnO=Y>tUc=y$$ihMfytzHQ#V zFVg!3s`$*FnuUD3&&wxMT>ip9DXm3dvI@VtIeza$N!tf!cO^Gz*OLRMB8?-lSvrqJ z;>+HaGY8Cka4TtU3Fu56mY`M$vmi8cnSGCC*7Qhh6Krort-X7?A)kIUfM+%;@x%3W z#+a)9BG;!1wJheXQsoY_AK#(BzUejZ>2t4gQtj87p2EZt8pSyX&lxClmJe0*NBf5P zY6fa^tW|BE`gQh{^F+Rh?c$LmjuC%1dty7xo-i1j{%+FxpMFH7qUwv~xwg6&6kqgk zfc2z){F&>bjn?1P2TtvTuQSe_bO=x16J+H#F{=(!)57Kv5*ki>9BeIw2)g&1(@>O; zlumE-D9obFc&6905S4wynlcpi0~B{MBF1{>d$1pd9edCn80&3x7KLD?+ng_9!%ps1 znn~Q9v6c}R7r|iPXcCf!F831C5TD-Mtgj|-9HDP{!2Y^J;mjMv+WXn{F>n5O zXAqm$#Yx2-(AK>UJ$8F*#WC;cJ!)2)@Fs+cjkcWCb{| zC(bD|t(3b97A=%aK1b$lPAr#qRXZ1zJ8UjmZPvKuy>Rwg;2db%+}e$)7HIacjr8CX z=+JN~L?$6#PIV07X9%tnjyV)ASonZn5sj)=rd|)MhZstvYYQy7*g6U(30g1BGz2W{ zFT3a=k}?<*@G;mmJDp06sCDOg=Q(V;D<5Lx>v+-gg`NG{=@)M9;73G?ugMt42pLNP z!<;G0wXFe)hJ9K461`sYk{#0Um2y2Zmq|iP?91 zzCgY*&5JnrTH+g(;9)bF@qXT7z!$su(WCX_ly`Xt{o}QP745qR33D779_DR^CCK&z zx54a&o!LxI*AaEr4i1kAE`$KKdW*z$&5A8#34^Xfhb%FX$3P|(z(FU28ezwS;?OwUYNx^90SU5(5@V%Juk_IDdpx~FX@kaxE2S)AgE zs^g1{SyG$0r9|1Lzv@dyM6<I=Kq~)CzQMA(7 z?K@dDavI$i#H`gg*=D{MAnHNOlniB13B^nRyiI&?@smL%3N(3ve9tGPG<(>ZD0=Nw z(8tnj)G;G#O}ru$%9~M^ghb`TJ#7t*{$t)tPUcSo8%%}u`LwRmjV<+uUJ2>(Y2U2i z@T#9GPG%FxJDa)WZ2mN;!&KPpjcXSgP>Hu)1}IYsQN1%$Mr{why13R!fjPrr0=YcHz44rHqIp*9y3h zCr*c<&QRa;V`#s9R9@fu(U~ul0k)5xT~v@*UTkuGhM*V#ItPBCOwfgzBmpQGg5d9!4{tpPlWg&+y&c{Lt7g(HH~jT& z!~JBb;v*#Mx(I1vPm2_AH$6D)7lQrgf9dz4>`Tz6Bx;(Zx|l4^K@GmwZ<8y;}OZz&0+8;ER&NC@Ko-5{|r4FLBaw+U~Oql%7@45lmt z%7~gKs3KCt@6g1OiP&&Ajo%KZN0^cvR(AtJ6ZCPH;zLV6d3q3sM@ZIG<25}@|E}#b zPNnb~4mk#KM7P6R9;V-e+D}65w6ak9bEq8`YX3V>ux{}86(-dBs_wkCJ2HapoSnA?f($uKMvq>R3QX8 z%iK+!x5GPrfd)7#{?f&E*mWOjISaKI%R((LpcYc71^pUo!GT(Sf{v7Q+k_i$Ru%&Q z!j_RH)(5N|4fmQ9uDuql-57e|EL^(|Fpv!z_zysaaOc%v97I7R-2Q(oy8UfpIJ_0L zMHX94Mx)md>-1iV!Dq`6AN5|i_W$+v9dJ=3 z+t;XIKtw@;AOfO*#34zNpeQOyOyne4g5)S^4S)!W5+n*nPzFRmNkfne) z3`iJY2;Z%7fnA?(-|qi=`}Ajf=k}@FmAY%D>YVDQJ3edWRXkTI%iHmpLx+kerhnbo z_Ze4!;|3en&$Uh0jN3~d@2K2WKvR}`MLrllHJj{kAG@*RbGT)>(CDXh^eGJh-c@BR zynfpORg6&b=%m7}a!=RYs!k4D8P{^&%-MWD>`rY5TDW|F>54UOXN>dyBWp)p=qlPO{81Dm;~qZJOg}9vsx}A0PKA<@H@p zzY#0bUUN{pLOpk_ab%zu(?;yftPXqXHwVl*V|w|!o3CoH;$aayae<Q6d7&RLqmM>>7t0Gu9&IOW~@ zz}Kk)I2A>0*9xy7%~nyz$u~EmKNrsHs7@FbF*FuL*_Vsq`!Oc51lly|yR#vUun39o zKOkHO=({JXDy?3;NpLLLzPLNd5%bVL`tv&BwZb>NnEXv*8yc>ai;bGo1zS1x-H5I% z3^^@aR~2ez!b}iRzz)Yqo=gUkP}F0%SSnn?Tp-C4vlGJdq|zo6f&4HID}+5l>_F^+ zWkTinU9f2Q0oDqG9tObjI1v^M9YtXI&@1sc6j%fn7x0K!LkNO3ceFS+iYPV&Iasgr zLaduYM7HTfD|i2YFy(j)nC?e`g38iSKHyT0ns?AuU@@=|v2{8TlLwCoJOm|#*o!hl zi!uW=pMMTUuNfq&j;{9za&+W6y3|>1&J$-znSr)m!;kWD8rnKt5#{uaW>DM);QD+w zy|%2FdfQjb157LCPPP@3xOc^D;{}t`HzzQS*4_AcD{rt@Vn`aT#D&)_znKJ&6*K4R zis^o9#gvHuZmL3Fx1m-9;!pXd!ziyJkXLA3$RJlLZ50!&un?-DOHA%Tbs6(qndJ^z zYzEp;P*x-=xEU0jE*upcNH&FtThobnH+V$1As{LaV&IG-;tc_ja{l`;&J#pb0$}cx z-)2UaqC}Sh){Ylq^b{f@PbVVzAVe;K2j!XWzYkM}YI{j)Vz`q63rLsp*XU8*filCX z#|iJJ%+&ZC#o!PNjb_2y$~#et7;-&FPjKp)8_JYgWh=K6o|<7**W7Hhjm%X$Tdf&G zyEVC$*HPx zPvV1k2eBsD+6q{{rzNzdwD87x0b7SQXW+Z33{B5NsyJx+`$tiY@Io2ZDWN*!Or<@> zg_`~;H2qahRE9`s`q!xGli_JF5r?V~))gJwNllM}1uh3Oh9~qW;^Pny4aW;nbP5qO zrxOu!@QAEKKpY)J&H3kGN8$NIf$qXa=od^J=u*s3JSWogVh_s9ZzppJR;Vmu-w}}K z8z|35QJ(+rFd%I7v@@X^P=R)ccB%%FBat5(ldXmmsE+t7Gi><eX&!wB-cUflzf54S!_UgZp6bn zrEkl8E56EYr<<2(ds;)+xT!=)TvL~vXV=RiAbt-DcWjAsec9@+&L(S+TR8O9Ew?Rt z$PTAB@x&72?JmtE?oKe0-$5*kk}twnWpv$@6Jd)N?2Iu_l+PXUnz&G0>r*%rXXh=c zNz}|aob||h*kAxm5vL< z=ez0%UD?>J!3%R83l?HgLX6s5M`n%Hxv_S*EyRxc`Tbd?KE?Q?aJwCICEhPOS+=%K zJLmZNo>$*0D<%IqxglhPc)`7qy4NxDE8Dbsl$eol++@pEw)&k@Uw>GqoUi||Z9mMk zwf=j${{HVXZEa4>&G`Y{dZ!%a1jIYo^-o#6drRDs;5KckZLJeQ^MuSZTu*PqP}m27 z)b*`O@v}u5)j>BVu}z1|ruuqSy!w_F2mFeOgyg`wia<9%ZG3ifVM(wr{y|6Quw8ST zdvjrOZ%6U7i;RK2)?T=e!`UOQcxSIK3q&Gbu5doLtysQ2XJq^Vu5^0L$*%(^&&p5nwBYj?~y)3be$Aa)qLyL&rkdCfRw)RgrW8FVDr_ZvIs_f0xo%*!7%kZCWd z?YiJjY-&?;?;YUtEu1f_lh1>zE-p0o7U$!qS~|MhrYwBsy^99qN53WN_ZN@aw;OmA zj@*T5x6q=GiM}{5X}b??(@l##W0P-v1{zM`T78DI9}%Y3r8nb8LkG6%`!03#OBi|M zM$yDuK}!zQM(d~kOcoM-|An1AYmuj`+$Bf+7lVuCH&l#qd27$vxQ6}^%m zc+cJJDw>=45H_LyjL6fT?T$^Z8=o3A{ot$PF=MVMfvcO{oNt6-{g5o5-C>a~ch?WL zjgaj$B2+Fgh9B~i87}H`nD_p;G`e-VuJJyuDlw5e!7s!w@AX)X;^oD}D5ixhtp1{> z`hX(8W>wQ*g)d>;WU0Wvqhadp!su@kaOK03F$0Ov)DDX?f%px{H9j6iU)aLmP4tb$ zRbv;gSq#YRd_R2Il3Q%&#BhYg_V`_&J_3pVrMXP7O^qi*Gf)DbrIoktewNmwqpw$& zm75JzzY8jWC@gKIc{U;sI4|S|&b|%t5}cFovHit{7=)||{%0eM09^o*VRn~;c=^jZ z3z?AMxD1)y&+IBEujUpowQcX2vj}O3W_&#t;(4hS8H-?0y#-^fn#U#8w^tcouLmOp z8I)ikHvg?%`8^aON3;qK-uZH!@im>n_}bP7JeXU;vESC}JOo1uj8-tV9g3ayytMCq z#CDad9BNXTN5B*%nJZwJUfmcWXM<>Ri)^cQ(nme&qzersMmd3f`O28QK*(+zeRB;c^rDa3__Wr!AcVMn$TM&9!c#P4u?AMq0P9SrOvDA zIIUE{TQBz%f#?DB2!YNb&~*Tv{`(*vz5RW|;h7qT>w&!gucqf*KpL~tv{GxzZcF%P z4rX=BKWVC>q69%vL{L$if%} z_%von+?qmTnfT}CZ5f|h%^MKfw&_|H(Bi?Q`|q33r~(pAv%EYP@O% z4*%ME_^way0G$4mU$WGfp|^^CDppfvpj6jUsO7*k_r6NIjNf-D}P)^A3 zQ&jXwR4Q61)mc<3WmGEEA9zuz{uT5q0_h?U>JQckB!D8JqQ69u;2A*t38+rfAK=-% zeZ#=ahpru)Mkxh!eT~s&HDU~rwwFRZJ zYC);WP%370fyUx-dM9feXgqE=@{rTP<47U~21sKhFO zY(O31&t2Kp^Et!Lo^nqIFdL?+rd}m9TGl6%E%aYJJZpc7X6x2DF_|di#RI!VWFB>E z2h1`lGf|(Hj5Jedg)E4%1G8jvH zV16y#98JJcP4LJe_d}{)>c#T1J?$ll$j``Bxochnpnl;n3m0>%{E{0N*A0iQmX~R( zx?-M)l^VovQenAc*>n0AqU82yN!^AcNo4L$Tw;#f5`)y%;2(b~&+y@rrYMLi-5xj} zGeb9KNO^Mp&N(gx|AHum2$l<+N5Qxp5r36a8H~~hmUzw+V62Ud&*D6dFp(@ZoSHWr zF?%wucX272H0>aW&|+uQH1;k#FRwVa=&d+A!FiPcH7s%Ew)Xz+LOSeBn(1CmH4jV$ zukS;qAdT&v&<0(1jxNJ8Zlh^29?fyR&f}^1Jt)Bzr@d(Q?7GIhn=~!V{%!>^I`^3}tG28f;Q-lyio1{l#VLW&l_PQ6`b`d-rIndBRntJfLUI z6~ON=nQReD>}5GT{6gQFSKFF$ufeNYvwDxPb2jgn3Byc{Z)A1x%TPN}OYGV~_ZD7H zNy~aoiuN&nFe5BWz#K>B7|HyGOx5$qJAuq6By$p(v!Qb^{K6#M|I+nTn{z`hy8a`` z4S{s&>l#jyAt)ofn$@R7P__`L0Ujg-7^OKwhm+u$gJ$5W*A?-=GY1a?_%}(1H=6zs z1$u%^eC9HgIe8g+rFsRr!x^C8Y_~#Bk^O$Y5_-yeCQ_&jjc*5CD^Vyj2<3Y>1BGG& zsEs8l6hI$#z<><1YMRyE$58HKersnKo+DXO_oCVh(r}_8H7bDat1W|MP^}}-MtGEy zK;9835{%(^7|~&Z4IyD5{~x%j@0+2EK_9L1K-Ew8{S#aoIx!x`+ke~@0Tn?F4|Y6^ z+fEUr2ItYNE)lhDiuQuRc#deKH75;vk~{(o!Wk^qWh>^TRWo|kOkXuCSIv%9b8^Mp zwRta0o!i2z`)EwCl`#JW=3*3{bmi-5%r$EiS4_vFsA3|uIRn{H>z##6N1`T%VcF?< z7-}lc<$D@|#Fs(i%OG}A69Z`c)N&-XWsn-`2QYTS6dF1QLpIE>{V!cNpzB^mZ7l}n z+K28w7;~NGuc3^frh!lB9OMl~=l`k;2I{aYmMtlp&}5l)DVjZtB~7Psq4~8xcYn+2 z92m+t*pVJc%$5~|-||*2Q!eeCLvd`J6Z|I6S!Dx>&Pc&*DaqGxgkS0`BbiJrb zt_rSdGR662Ef$V2G%Z}s$H^=_>*}bmvdEJ+`s_w@`z`> zaxQ*k!QqQ_Itmgm*!vY3vEfu)7;`()>vKAAxmFT!v!mVjiJ5l(Z5`Po1}}&Uc3p+} z25hVn*oKjjC_S&DsXp(91~#c@opv9!unXf3FoE<@&M1?pnxn+#P9zN6m|OgDXNfF;U@MCOn!x-z?WrMYz=Nr2soBw(+}0lzfHF7>%Z1+7xI zo=HzjCv$SlF)x>B%TC!UA}9g~Jyp07i!q+`xCgug@5bNlWA5vJpv%x-C-X4}%cd%J z{$r}XMO;elz&oGLBl1PwjwDGyoNGePm2LNJ>%V%wuxsmRb!g%LFe`3zGsVC#pg~ik zuQneK3oXDfBp!*?#)197Qa-0eS9JPTrd(6KAgB6#UYJ40~3b&7`9 ziznGzO9JYi)n}O(M~ozGmfBe#(8|GV%V?Qy|0bng&bG9acrCO$Cm63YB94_Gb(g>D zHBw3`PZ#%~5Z^ri;tf9NTjG@3;ZF}j@&j9ny>#3$SRWkEoB2#uG2(^XiNZRGrVIO& zCTA*fJr*6)_EbhiJLHJpGB-A4@pa#;*P7TTB{$LBYe-=CGV05z%fcSgdbL$!Dg)7iKuo#sC_(XjV${O#;5s4Ap*J+K#TQhyTA1b~aEZ(+Aovld7 z+EP(JI#--ik!jHIaPZ4MIaal*Zay`yt|s~U=Zr+I)bY7{k}{R)mqXaDsGdkDjrTT+ z=#JVyrIedmmmi#;zw6gP+JJ$NSG6n+CKt0iHYgFQyIboYCiyKj*7ORtCm(*x{aAKi zRYPRsJD#93yA#4%Hf8M2upA%1Rz9F0!!@q15VEO=)w1sn-)3Bqd)E3 zT}j?WDaHSa&#$fK~ zPh9}w3OZ>T5OnT6`59I62(D;TjwfOjd$(VD%wx%uE7s3X5uFqd1nGz@y7SkiR7#Sf zv*;YaIFt;A2l8;2=};bIsz1H$jl-R_rvkF*LPX+$A{~-N7ZK}tXYCo$`qK{9l{%Cs z>m*gUG-P`CnKZ_)WtnMK3_J2?@mhqN#%KuRSZY!!HMcd@rbPSPG}o-KbwQ_+(J8%M zHL2HIhqNs;YAvcnuqJK??Gbz}f^fdutH&?*v?6+tHuG>HV2MbHrh^$A5$y%BVP z1ZCsXuIQ`+GCUyzh|E5xOL(W{o}QzJ1p*HeFRcV{P$cIO(BIq4X=Z+%VyEIT$%68bQ6^wzokP5_rf_m*2A=Eh{hzo z^|3-N6+_Qcjfixc4q9T^pB}RK8|PTg+g>TDECCq`dffbYVN(0hC4bCaIs& z6+-9>wt?|@n<<6gb}$aWDYyedyRYuxo7oWDnq0&PUbq1$mgvARf&}w=*D@{#9i)xx zKO!_pZWFz6U&hN5M&L(pR~}BRs|sAL}4M z@ub{C{}uv0p)GSMN#R*C3Oh${Uy^#RiO$A~0_#y`L4i%uR)PN6c7RWNe}%4Y32!Hr zE+9X=r_>z(@QzZmLSF@Z=fM|k!vna}eA@KR0+4pQ4F%TZ*<*<3nRZU2_9b0v&z4O3 zR1p&XgkA}68FJO-EW1*`b>*ch1-AU;;pcD837je66<$k|8apm``nfWdDmm6dyXNe3 z!%6iqlEV2%PY8rE;iQbqPW{>ruY(2Gk5*pmTV<-Ue<81CTw0nM&TT z)Rne~Wc~N|PCwfoJ7LoJd8+%B zNp!U=OI2HwVyofs+`9W$TuD-aI&mw*^^TovXNGTLvnzVyB$_=x?9!D@9ZV9uV}D&l zUVqnGONrUG)FK{*cC{i(EbFd{@bf3xs2N!WKUx!JzB$~>z)><9jLAIeFiK6~ZJ$0x zpquBlC*Vp1+xn+8#--xvhu23MM|NOOX)7k@Js}F!e9fNsxf{i}JN*2%Fsh(Q%X4MN z0!>4^7vpTlg?XZyhaMbIVOq;SlxpNAd3ndpb4g9v2M+HP;V&y`cd*WRhLzSA2)4+n z9-Zhfdrz$*k8k$&NFJdsH?(kVqhe?(lDR4qZ{jWeEAgArAEg4j*j%Xu{#+^`vAlr! zQJcA99BqKVL+QBoQ@8wE+4URVD@hLy9sscbCA%_+1=7VCCyq~0?s1^LJGzwe6-zzM z7&CHrwkejvb^$NHv@kfJPVDG2ZA;AV=(ezyjZ@wVLavkP;HGHpJMejbvG zHuE}F<4i?equFHxHO`CE{7cmui_`N33sj;q1U^b9pJ*;i|-W zsq^j~y}6u?=|&ze3vq0MM!6Tq8=JQJd1meMOB@i02Q_e=i*dP6yXEzw;3h$^t06p`HsMzW9PRpfd{qu5`~t4(G&K&!*_ zqpwab(OhxJ&V6=suOByYWHxamx3w<0#*Zy0u6xnqYh8jsYKU%!~Q9DZqLtJi`9 zb7C(pIVjnvH&M_8mMp!e7ewmiac`Ok11>sOtpYyJ-@~(VFEldTEN*U`Ngf!$8u<>- z?yQ+`Pw>r=Xl(2sVl&bnsPXa6N4t($yKs*8&)?mCqhV3(?7ub*V0-r%I(2Vo~v7i?Kalzgy z5En>+xZoX#3!dBrae-SZ6Nb7w!y-4ItRIdAWP?oG8L1!2exPF9!7j(ZeVc45Lo%40 z#ZmGGIg68IC^?I>G__@-OCgBz88q1K64 zUwid+&sExcM;I(4$apd(ACsTIT_MGJFogdE?;2|}N6k&Q_5?R7|H7&hueFxEx~H7> z`EeGVwG2U`i2Hwj6Rb`O0Ifd*2?TPk^3!fW0)ajd2(TC^Fa%{GkOu-`05pz3#R!B1 z0^}eNU@-=eC=v)1E$HmB4*O`KLmZ ze=|h+=Q?~_fBcyN>D2hn-Jl)lxeHQ(_%6z7C9VO20_Y58>p(&96Nv#N{;O&Pfc`xR z#D9_!(4ortGtfcA^rs++07y*#ONg;gNzx14LwbR=NEARvBKI#tgBsZHubhe?o%)@W zV0N7q2o4s@H-dygUZhkhsjnf#A&h7C@E+v;72N+$f&e;$zbSJ-BzmNUIEza8XHtTH zr#DD6N3w>%R-|8ee>q&$pF`m9nC09lryfyo$51NjI)K6enaqE~jFr~~Ey?EwkPJMX zEd$BGU(+}Ii3kFTD=d)ILI*t(HBq(vsq6mnWU-u==BFbG-%=NDlMdH z;WdgUFVmc57&U*TIotDTNA{bX*;@+PZx{z^pKBD=IYy>^tH=9wryKexV#v;n!7Hv4NhBW*y1zrnuL*j~c`;Ghx|jGI^pBCzY%t{s%v&$&_eVY8dE zliEo9fX%g~^4Aa~T>`r|6|@p?i5*O?LAxJHr73tY6vE+JPCFpB%OA!;n>3s}TR)O}zS zJ1Zd;?veA6qT8#YNos{Rpm;Ec?a?r>p{bWnkX2`mu4?cZN2H5Dp4niKFdV_gGZEz8 z*`Uv`Rh!`=FW|eb1J)gy>6?VGKz$Vrtl1O?TgeTY@PJst^u?Q)pfW23q?Q2P!v_B& zNEvanLM)Ll?3z`3jkfmV6K`l5=TAdBvZSJdAk~4h2g+SJw6<+1q6cdO-+2}hh(Y~O ze*YjUr3qC0VG?hiABswi$kU*T=(!48ul**7_(!A)v;!y5rJ(kDqIuD!f}sCdlhhJ4 znn8qVROO_qeS|W38X;gaF{Dy}g&Eih6ejtg7-(})f)XNS|0A$S$y!q3K~Z3th;mfj z!t1DVKO`;lySd@PidnX5`aN9n9(c535?0Nu$17g@q!p7ddBq%9H6K1%@ftmiCtVom z*gI3coBkSK#aN+B#6WX)%c7ccg614LhAK%AnsXgV1_8~vcQ>lRJm?!TBpC!F^o{GN zZ}dUmNF^y_^r3GYB55j6-%wf(W~%f(*#AO|@S6fcIlcyU1Q0(2HMpV@@SvPVpd2Zq zVt^jX3vC!$i1rEXMB9Vn(bk~^9@G*32^etUf5|Yx+Je*o%=A^WbJg6ExdM<`HEmYS z*j2N7)tp&1xwBRxXs(+6tLBT}OyfxD@nfpJh998q4&FkQp{vbVzn!FGfVLYa>0zv) zBcze;YXJ~;>_pWF>V+Quy{HCXLPxku5=Fp6BK!`jUQjhS3Xwz+D464Nuncun?I;*0 z>^S;e4}tbD>-@WiITifGl=i*x;$&j>E>%&nfp?#czx0gQohQO}=?M)RGn2xx6Ye(` zriD^(mSrD^=OP#sFFZUzRVQe>wbuccH(wrlLEg66Z??y$%@!tnk_TLx?IrrB-^$5e z%y)2Z)>QM$*_Dp7v9Gd}^~!cg4)^tPUm7WSyQ_F{+z0khUz|Vh?NH=#K#=(DQ}$3L z8`{aN!YHS#%+bmA=7pt;#A62pt>?GgX!tgt+&aTwFN$4sicuqYcsO^lYW6B8g*)Ev zRfwGktFnKYQ&(oU!*B7Kj-NKGIDRyz%p+)gZCp{F%*dcw$EcfePFJYk1^w>(2VOKP zwGj;DV8%^bB($jlkJ$Psmyw?M4pF z2wK@0GxymJc&3POGrTuSGt^D#Dws;rS(+_gTKbkKFK?SJHyPM#QS2of>n+S`Fola- z7_lHMPJJ14A%sRf#P(Vh;tXIm5 zb-j+0v)1zJrBiiF`s2pV&Mj;N_hgLS^wva-n~%556`db7ksY+#&L zKe1!+xo^%cyLqPyBg~S+g!|~UvCqul;5b`Z!$p?Su?`EIluv&9guVN$`?GKI1c{x3 z1+6#gi_2>)yIAVkMiWo8)jjib&XtyvrIMd*%zS8yNS=+|DU2 z`C=cI4;N=oCHgLnz3{W0!<}ij&q+U4)BSBIuJQBXC5xGx%@5s)jaEwzc@;HmwN^9j z9mY#4#W?*>>ICn_AgEhnnt4=L`ye5TVpdZRB_3(``rM2$8b)R{f@=Li!Jd> zwt;nqOWw1D-p|u6OBcm<`i+~2B&Y@2OC`wNCHT#h6?sZi6J{1B$|ustw=%}~79E#d zTo5Vg!o8Wo6I^tTWXh#AV5o_qT7d%sEWYVg-4C_C&%137p3qA0gDh9o49I)$mogeH zn^5$N)0a~}u_QL@#PSxl3#O^#k|AEUIFoR<(KaA!yS^Um3!Hr!X#TJz@JC)?`8P=( zsCc;_WB@jx8~8BJ|Lg+n?4K0N{u8 z0>|QSI9v#(*xK8}z^{H43p)tY2-=rSAIUAE=oRgy$dnT`WS>BWJQ(Z5z&MCOGJ(y8 z>^mnfGrrzf_=zG@0bI3jRSek=OolPO-d5O0k$D8;c}evhxb(yZC`67r8?xIV;}{rT zU~n9t5XNkSZ3#?tV8Y=hzY0uF#Fz)cEW-c~AV(-Y!Kd>{ij0jH3==r&0wz~o$@ zRD^T_df@Zj0|0xHP5{C?(q>#gd;<77Ze{LKSTwJSUkXbgc80Q4GxJOOkVQR}}VkSu`m5NHO05Vigb0{NWIww@{0 z0$ITNS7;~UYp-C3-b*kPMV9otHMnash80s64IQ{{wS{4gV9${Qr>+|7W~< zOKcMG?X#`lv~vH%f zl`j9+i0^-cBmW)xb0YlNf5VplPel0t$d>>69QpeNM9>5*)9L>|i19yi=>IY!9!Pt? zr_G}}NJHFuxUGpVP(^7XZawNAx~Mk!5CQ*RL3h%w1Kd`lyfxVz%TX^Uphpk5))Wwc z)MzR~+H78klBogWk)J@TaSf|bX%aL8L2sg{E~KcYDC#a0b+83RtwK?M4n=pn3(ENk zlyfAAkVZM@hMW%~>A+o7ygvcypd^|o0Mb`jA|b_}y6E-x6IG`3isFBr2wdltbn#rn zEML@_Ultt-&q;3{OvV8BeS3yq%JQ^pcxw!{5-xbfn{C^XB46ag4k-=G6CFVQqxB>3zBFs6rO0ViN;t{B1C z%%VfT-A0Ca^w$1uVV`sTHw!CK^Uy?m&JEgpN~vCq=FaEb8=D=KZXTqG{+xSz^KGRQ zsx+~mb0arrC{b%0$6pr4a}Mp@>cStLe6H53TCTd6ZS#8G9l(Y^`R)1Z%R!Wtz=4gB z(ak*f2toNcw?5#HetNFdtNKK>Dc|M*-smyI%(LHa)m(l`$wlJW(}LXj@}|-Lu(YrZ z=kM5R2$d9q-uYW@9cX8OtPc`t)_R>xjS@Nn2&JnZ%BW=XMmy=7WBW=HA8YUL2mb%? zYqprr@PFS`_6*)n$T+zBH)DR;$mRIWm`2>^KJ*C&*Z&(Wgy9_!@l1TulM0pt`v<&*V4EnBt0??(C z%b;W5K@gV@H9HL5g$=0Vq467^h58E&;_XD}exqn`|04{|u7O6NthkC;B+oh2I46_u zD?O4`H~lNyGwOwo*^qnHU%t-GM^=?txa-O$h!Z=;zxw*M%x8Ap{m_=%wWVxfq@UaO z%hu$&IwRPEBi&vCM`$2SE1cueQknxcZ-Hhdr(aj4y%(XTBrfi<1AIdq|WOWZ z=hJL8uYCb}%;yX+(i8$1g!DNgU$?ots83-mRy4+?ZAx7N*Zx8X

b2T^uSvORR55+>$Uqk#eoe(#ANwzB$-eM0#^n?+JGd@noL_kz1?q!>dq@si%b= zFLfsaJ8rt^#1QN-ZW$j&HQkMj#G6K4i|q7^TKVU!^yT!#D+cCe7ONgCWmv~rw_V5} zmWYiPx*GUY*VtX+_OipzOnx2uVCd4NKhK~!D}BH=*1f5&X1-`_&_}Vxx^dy~d|MmC zNP~Fn-3~WD`|BFcgULEVrrA?2!#h@V-!-!6c!Bn3x#)v0sjj(dTT^ zvHqE-PU1408QXi9f(p0k(QaS}4cP0uyWEs^iKATmlgjSOwMLtS8D{u`tF%AaD}+!K zF_`d=-PmS&sdzKE?^JB(AJe~<@d|_io4vUqg+H9a>%jX27J1;)21pN5g3a?PfLVI( z0d9eE?Q>xp_iILPB4IOiES-ml{^L*K{k#5>y63`w&!A9YHT5=&vMb0)i3{w1fne zL(oZ}|HG~cm*LkCs08W}Z9WTV^F6~ro0mki`G3G=s;N_tBmq)L5D1|@HD-3z~c{}B`q@D~IPD9kcaTn>txOd$ zy@>^~`*SYs{T3Js?5{gcJZV({*8Yp_@UDg^I8)B8z26wllpj3#+`80|QZs1${<)^B zg>jZ{8w%XouGbBvOL*=0 zq)SrHOupZw>9`#ZYNXQwfZ1;jSI8}abV(23hhs20grY+@Iz*vE96BVT!$WjPMh7f9 zq@zO?I^>`O4jqcop$r|W(4ht$8qlE;9h%Xh4IR4v^$=8Yz^6}qyO8>* zD_F5oAz$?Q_`}|eDvu?#?D>cYY|YRESrsNm?IxX^5f5@<))JSdY}vy*`S^QF+C4~e z0mHQG3wGfh{a9k!uAIdOZ4={nlVrDfB{bC)<)l*gJ68AdR8}1>Y*^a*$8T8YR0FeK zQjn45?j$1v*#Mb`Eym@%`33XuM`85kYD7ofzD=BNiTCPgn!u6`?XLnRRdzXC7jAj% zy7QUe3n5Tn}w+zg^#CoVu?A^QZ z)$R6D1MZW&oheO^Hq>Yveijb;)EW`IjW3$ASe#~tJmPBVhbPSkUT$lAeTarysX0&d z?&;8bw>1aN-fW=qRaE{;5gK$jEmoU${Q)VbDK@DnAFj8;76uzUxaQ4{ueB8L64N3V_bN2>YGe?4V%DNd)AGb!w{45w zt9xO_UQL0WZpB?06jZ!SZkpr)TH*)NIM-aE+;QWk<|pYa&+8(!5m|AMXSTeuH+y-j z%-UaBh3-g7%BX^OV(@M<)jJsvXiiT=t7dG-m7}h@Y*O}1&PG8Q_5irkFUNZZCJpPi|ql zzZb(tZg%QZ4x9YKR1}8yR?0Q+@uu*uL|M=ADN8@^rCh3FfwA0cZ0~LzcZrL?w~p0% zNqOIE?f6q>bmy#tK9Suse|?FPzi&j!;_)li3{wxSgL?ZEJEJ>thGnVBRo{v9rLn)b zu-jXmQ)91Y@E2X-#F-ht|A^w(J<72Jgf6u(f*f88J%QZtft>Lj@zd+0qA;g16;?bLR7CfUHNpPooh zxbvK{Y#(MjCBF~Duwcf;V9@ckVfPKg=2RwsJD+!{QL$6v1tl%g0{OHvY!_+|crc7? zH<)MinSFpUn(S{Lh9!5$&R=XQoL`>Wp~;$=9FcK&zonU0><58v9}%X~2QfSD51(Y) zAf!L0bI|CV=+VpA(5IBt>sZ!>+U)a=`8v&cJ@0DhrsUIkv*M3G73tVmvPFow+$tKF{`@%rP9vQl#Dd)a^MH zt?C3~;CW3XJyxE1`yMA=dJ-H^(mu|zaJ1Hek?GO>7dS=%x z{8q@vKkWu*l|RFseM-y;Y){sG-E-*v(9?t4GSg41cipQqaCz5lTUD0YJezxV-8BXR8kNJwoDe(by?k{^n zFrQv{rEL@cI8^+LY3?C~IYu!jUYR?ImyXSorI7Upp4eBdQhl3z@Ip*TXDInP?#{w@P=Z?@O& zpW>`5BUG1y#>nipl!P9krh6QJbmn8%@>8CSEbZQuZnyun*^g_;$k4x2@RWBjHnlOf zG{-obJGohznmc1In7bI88M_!`OzoY_1st609n76vtl)%%q?oCNu#||Tg|U#Bg~@&s zVRIp2V{tKaa}hC%{idRV4$c?MOdasJVi|cDE7;x4ot&-g?PNKG1%)`+&FxI>&8+M! zWjS13ECeJucZcXxL|cTrMc5g{RAjJBHU8B-YOj0LRhoL!9V zOwE6bzmme4blO=Es=^L(X<_el!Po^pLe`e64G+p6P`lQA9ME zB<$ykA!as^SlE zRs&yv+O@FyKSdT5`hDc(Kyosq9O9}yhvXN{dK&0SV?F)5=g04I zw4D0C_RRUM&i9K+nwg4=nu!XT3yX=EN|MTl`F($IUg^XeNl(K=F`D{}@FYCFfsBm# z`*+^&{rLASO6t>fO)7S!Lfh7V!fI#P$CGbdL(}3?cE@QAUyRHVlVj5-KiL{g9xqfd zxRr9ENm1fpYSqJCDw* zKX^LytlaWU!iHZbk3Dxu%hWEsHO1$^e)Em^af;VA4LFWODib66a|DgBUv4$t{_>&M zzNWB}W-#Jfa0YiX2d%qzRIyvV#HKy|?8-6c8Gbomd1Qj@h%=WiIlHdVDTZJ6nLaQl zd%(H9f6X-~E?o+C-EqG6^6HJZUpFY$=S8s^`HFIdnqpdOau>*#p9$Zq(`E6Ps~%LR z-^TAhA@mO0+dlnT)W8krBK>1=*-Euh5zB6jcGS~agq<~huT zLmuK7@4ZGPhlS5m-DclAYEkzgp^Na+;6q_?(UvNehrtwApTwsfk8(S{MpN?X@C%NK zvr+3rShpl5Vg*-X8(euuqh>s=R5+b(x2sG$Mc>_N!|73Km;L0Y2?SbKd)CgKe;A1 zWXnO3*w1&EpAG9!TO5dyW9FGRZfWp5)x9=C?wtK`${zb@GU>%Fmm@t@Z6lTxWO@uK zIPXV~-D1rxkqH)dPnBKvJQTIPk^I&i8E}>C9rO4 z#$M-UE3MAr-5ow;Cso$0r6Z$*Zv4G9SZ7ikilH@3p>uBq?;rpC@Ywn>vF|8@R|X^= zSx-i`?GGu3!TaMg<;T=awB#Wo7&0=}?zN;0tp=!BNBU*yeBRi}-0X~t6MQ9bM*ZT) z2-?xx4X?q_LQh3Twq-RrSQydo5nMcN&3~FyZrl4|Jz6rd^xNOxk++(3hCX)Kj!7f zxBjh0$u;|F6w*5Ye~j|uj^?XTI6QtDg|xrWr z3-$e5-~4?Wk+v%MG0Knp>(wYnpZqimiH-eZlpmLtR-v@kp{Xcliw?+T} From 48436e0314c8a071b4b44f261ac6db4a64bd83eb Mon Sep 17 00:00:00 2001 From: Michele Bastione Date: Sun, 27 Jul 2025 13:08:29 +0200 Subject: [PATCH 25/26] Adjusting legacy namespaces and adding old attributes signatures --- .../Attributes/MiniExcelColumnAttribute.cs | 4 +- .../MiniExcelColumnIndexAttribute.cs | 4 +- .../MiniExcelColumnNameAttribute.cs | 4 +- .../MiniExcelColumnWidthAttribute.cs | 4 +- .../Attributes/MiniExcelIgnoreAttribute.cs | 4 +- .../MiniExcelSheetAttribute.cs} | 6 +- .../OpenXml/OpenXmlConfiguration.cs | 4 +- .../OpenXml/Utils/MiniExcelPropertyHelper.cs | 4 +- .../Reflection/CustomPropertyHelper.cs | 4 +- src/MiniExcel.Csv/MiniExcel.Csv.csproj | 1 + src/MiniExcel/Legacy/Attributes.cs | 33 ++++++ src/MiniExcel/Legacy/Configuration.cs | 16 ++- src/MiniExcel/Legacy/ExcelType.cs | 3 +- src/MiniExcel/Legacy/ExcelTypeHelper.cs | 3 +- src/MiniExcel/Legacy/MiniExcel.cs | 112 +++++++++--------- .../MiniExcelIssueTests.cs | 2 +- .../MiniExcelOpenXmlMultipleSheetTests.cs | 15 ++- .../MiniExcel.Csv.Tests/MiniExcelCsvTests.cs | 4 +- 18 files changed, 134 insertions(+), 93 deletions(-) rename src/MiniExcel.Core/{OpenXml/Attributes/ExcelSheetAttribute.cs => Attributes/MiniExcelSheetAttribute.cs} (56%) create mode 100644 src/MiniExcel/Legacy/Attributes.cs diff --git a/src/MiniExcel.Core/Attributes/MiniExcelColumnAttribute.cs b/src/MiniExcel.Core/Attributes/MiniExcelColumnAttribute.cs index c7a2c287..2d6098a7 100644 --- a/src/MiniExcel.Core/Attributes/MiniExcelColumnAttribute.cs +++ b/src/MiniExcel.Core/Attributes/MiniExcelColumnAttribute.cs @@ -1,6 +1,4 @@ -using MiniExcelLib.Core.Helpers; - -namespace MiniExcelLib.Core.Attributes; +namespace MiniExcelLib.Core.Attributes; [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field)] public class MiniExcelColumnAttribute : Attribute diff --git a/src/MiniExcel.Core/Attributes/MiniExcelColumnIndexAttribute.cs b/src/MiniExcel.Core/Attributes/MiniExcelColumnIndexAttribute.cs index 73a44212..b0033b63 100644 --- a/src/MiniExcel.Core/Attributes/MiniExcelColumnIndexAttribute.cs +++ b/src/MiniExcel.Core/Attributes/MiniExcelColumnIndexAttribute.cs @@ -1,6 +1,4 @@ -using MiniExcelLib.Core.Helpers; - -namespace MiniExcelLib.Core.Attributes; +namespace MiniExcelLib.Core.Attributes; [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field)] public class MiniExcelColumnIndexAttribute : Attribute diff --git a/src/MiniExcel.Core/Attributes/MiniExcelColumnNameAttribute.cs b/src/MiniExcel.Core/Attributes/MiniExcelColumnNameAttribute.cs index ce38efeb..c1a3b657 100644 --- a/src/MiniExcel.Core/Attributes/MiniExcelColumnNameAttribute.cs +++ b/src/MiniExcel.Core/Attributes/MiniExcelColumnNameAttribute.cs @@ -1,8 +1,8 @@ namespace MiniExcelLib.Core.Attributes; [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field)] -public class MiniExcelColumnNameAttribute(string excelColumnName, string[]? aliases = null) : Attribute +public class MiniExcelColumnNameAttribute(string columnName, string[]? aliases = null) : Attribute { - public string ExcelColumnName { get; set; } = excelColumnName; + public string ExcelColumnName { get; set; } = columnName; public string[] Aliases { get; set; } = aliases ?? []; } \ No newline at end of file diff --git a/src/MiniExcel.Core/Attributes/MiniExcelColumnWidthAttribute.cs b/src/MiniExcel.Core/Attributes/MiniExcelColumnWidthAttribute.cs index 4f9a7b6e..38c1a9a2 100644 --- a/src/MiniExcel.Core/Attributes/MiniExcelColumnWidthAttribute.cs +++ b/src/MiniExcel.Core/Attributes/MiniExcelColumnWidthAttribute.cs @@ -1,7 +1,7 @@ namespace MiniExcelLib.Core.Attributes; [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field)] -public class MiniExcelColumnWidthAttribute(double excelColumnWidth) : Attribute +public class MiniExcelColumnWidthAttribute(double columnWidth) : Attribute { - public double ExcelColumnWidth { get; set; } = excelColumnWidth; + public double ExcelColumnWidth { get; set; } = columnWidth; } \ No newline at end of file diff --git a/src/MiniExcel.Core/Attributes/MiniExcelIgnoreAttribute.cs b/src/MiniExcel.Core/Attributes/MiniExcelIgnoreAttribute.cs index 8b2c0692..20aceb7e 100644 --- a/src/MiniExcel.Core/Attributes/MiniExcelIgnoreAttribute.cs +++ b/src/MiniExcel.Core/Attributes/MiniExcelIgnoreAttribute.cs @@ -1,7 +1,7 @@ namespace MiniExcelLib.Core.Attributes; [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field)] -public class MiniExcelIgnoreAttribute(bool excelIgnore = true) : Attribute +public class MiniExcelIgnoreAttribute(bool ignore = true) : Attribute { - public bool ExcelIgnore { get; set; } = excelIgnore; + public bool Ignore { get; set; } = ignore; } \ No newline at end of file diff --git a/src/MiniExcel.Core/OpenXml/Attributes/ExcelSheetAttribute.cs b/src/MiniExcel.Core/Attributes/MiniExcelSheetAttribute.cs similarity index 56% rename from src/MiniExcel.Core/OpenXml/Attributes/ExcelSheetAttribute.cs rename to src/MiniExcel.Core/Attributes/MiniExcelSheetAttribute.cs index fc2011f1..182c4ffa 100644 --- a/src/MiniExcel.Core/OpenXml/Attributes/ExcelSheetAttribute.cs +++ b/src/MiniExcel.Core/Attributes/MiniExcelSheetAttribute.cs @@ -1,15 +1,15 @@ using MiniExcelLib.Core.OpenXml.Models; -namespace MiniExcelLib.Core.OpenXml.Attributes; +namespace MiniExcelLib.Core.Attributes; [AttributeUsage(AttributeTargets.Class)] -public class ExcelSheetAttribute : Attribute +public class MiniExcelSheetAttribute : Attribute { public string? Name { get; set; } public SheetState State { get; set; } = SheetState.Visible; } -public class DynamicExcelSheet(string key) : ExcelSheetAttribute +public class DynamicExcelSheetAttribute(string key) : MiniExcelSheetAttribute { public string Key { get; set; } = key; } \ No newline at end of file diff --git a/src/MiniExcel.Core/OpenXml/OpenXmlConfiguration.cs b/src/MiniExcel.Core/OpenXml/OpenXmlConfiguration.cs index 4c0c3a00..b3de0395 100644 --- a/src/MiniExcel.Core/OpenXml/OpenXmlConfiguration.cs +++ b/src/MiniExcel.Core/OpenXml/OpenXmlConfiguration.cs @@ -1,4 +1,4 @@ -using MiniExcelLib.Core.OpenXml.Attributes; +using MiniExcelLib.Core.Attributes; using MiniExcelLib.Core.OpenXml.Styles; namespace MiniExcelLib.Core.OpenXml; @@ -21,7 +21,7 @@ public class OpenXmlConfiguration : MiniExcelBaseConfiguration public bool EnableSharedStringCache { get; set; } = true; public long SharedStringCacheSize { get; set; } = 5 * 1024 * 1024; public OpenXmlStyleOptions StyleOptions { get; set; } = new(); - public DynamicExcelSheet[]? DynamicSheets { get; set; } + public DynamicExcelSheetAttribute[]? DynamicSheets { get; set; } public bool EnableWriteFilePath{ get; set; } = true; ///

diff --git a/src/MiniExcel.Core/OpenXml/Utils/MiniExcelPropertyHelper.cs b/src/MiniExcel.Core/OpenXml/Utils/MiniExcelPropertyHelper.cs index f2cd8848..0e153d97 100644 --- a/src/MiniExcel.Core/OpenXml/Utils/MiniExcelPropertyHelper.cs +++ b/src/MiniExcel.Core/OpenXml/Utils/MiniExcelPropertyHelper.cs @@ -1,4 +1,4 @@ -using MiniExcelLib.Core.OpenXml.Attributes; +using MiniExcelLib.Core.Attributes; using MiniExcelLib.Core.OpenXml.Models; namespace MiniExcelLib.Core.OpenXml.Utils; @@ -16,7 +16,7 @@ internal static ExcellSheetInfo GetExcellSheetInfo(Type type, MiniExcelBaseConfi }; // options from ExcelSheetAttribute - if (type.GetCustomAttribute(typeof(ExcelSheetAttribute)) is ExcelSheetAttribute excelSheetAttr) + if (type.GetCustomAttribute(typeof(MiniExcelSheetAttribute)) is MiniExcelSheetAttribute excelSheetAttr) { sheetInfo.ExcelSheetName = excelSheetAttr.Name ?? type.Name; sheetInfo.ExcelSheetState = excelSheetAttr.State; diff --git a/src/MiniExcel.Core/Reflection/CustomPropertyHelper.cs b/src/MiniExcel.Core/Reflection/CustomPropertyHelper.cs index 9d88810a..06df7707 100644 --- a/src/MiniExcel.Core/Reflection/CustomPropertyHelper.cs +++ b/src/MiniExcel.Core/Reflection/CustomPropertyHelper.cs @@ -97,7 +97,7 @@ private static List GetSaveAsProperties(this Type type, Min const BindingFlags flags = BindingFlags.SetProperty | BindingFlags.Public | BindingFlags.Instance; var props = GetExcelPropertyInfo(type, flags, configuration) .Where(prop => prop?.Property.Info.GetSetMethod() is not null // why not .Property.CanWrite? because it will use private setter - && !prop.Property.Info.GetAttributeValue((MiniExcelIgnoreAttribute x) => x.ExcelIgnore) + && !prop.Property.Info.GetAttributeValue((MiniExcelIgnoreAttribute x) => x.Ignore) && !prop.Property.Info.GetAttributeValue((MiniExcelColumnAttribute x) => x.Ignore)) .ToList() /*ignore without set*/; @@ -145,7 +145,7 @@ private static List GetSaveAsProperties(this Type type, Min if (dynamicColumn is not null) excelColumn = dynamicColumn; - var ignore = p.GetAttributeValue((MiniExcelIgnoreAttribute x) => x.ExcelIgnore) || + var ignore = p.GetAttributeValue((MiniExcelIgnoreAttribute x) => x.Ignore) || p.GetAttributeValue((MiniExcelColumnAttribute x) => x.Ignore) || (excelColumn?.Ignore ?? false); if (ignore) diff --git a/src/MiniExcel.Csv/MiniExcel.Csv.csproj b/src/MiniExcel.Csv/MiniExcel.Csv.csproj index 4ce1cdb3..2d147dad 100644 --- a/src/MiniExcel.Csv/MiniExcel.Csv.csproj +++ b/src/MiniExcel.Csv/MiniExcel.Csv.csproj @@ -12,6 +12,7 @@ + diff --git a/src/MiniExcel/Legacy/Attributes.cs b/src/MiniExcel/Legacy/Attributes.cs new file mode 100644 index 00000000..8feba35f --- /dev/null +++ b/src/MiniExcel/Legacy/Attributes.cs @@ -0,0 +1,33 @@ +using MiniExcelLib.Core.Attributes; + +// ReSharper disable CheckNamespace +namespace MiniExcelLibs.Attributes; + + +[Obsolete("This is a legacy attribute that will be removed in a future version. Please use the corresponding one from MiniExcelLib.Core.Attributes instead.")] +public sealed class ExcelColumnAttribute : MiniExcelColumnAttribute; + +[Obsolete("This is a legacy attribute that will be removed in a future version. Please use the corresponding one from MiniExcelLib.Core.Attributes instead.")] +public sealed class ExcelColumnIndexAttribute : MiniExcelColumnIndexAttribute +{ + public ExcelColumnIndexAttribute(int excelColumnIndex) : base(excelColumnIndex) { } + public ExcelColumnIndexAttribute(string excelColumnName) : base(excelColumnName) { } +} + +[Obsolete("This is a legacy attribute that will be removed in a future version. Please use the corresponding one from MiniExcelLib.Core.Attributes instead.")] +public sealed class ExcelColumnNameAttribute(string excelColumnName) : MiniExcelColumnNameAttribute(columnName: excelColumnName); + +[Obsolete("This is a legacy attribute that will be removed in a future version. Please use the corresponding one from MiniExcelLib.Core.Attributes instead.")] +public sealed class ExcelColumnWidthAttribute(double width) : MiniExcelColumnWidthAttribute(width); + +[Obsolete("This is a legacy attribute that will be removed in a future version. Please use the corresponding one from MiniExcelLib.Core.Attributes instead.")] +public sealed class ExcelFormatAttribute(string format) : MiniExcelFormatAttribute(format); + +[Obsolete("This is a legacy attribute that will be removed in a future version. Please use the corresponding one from MiniExcelLib.Core.Attributes instead.")] +public sealed class ExcelIgnoreAttribute(bool excelIgnore = true) : MiniExcelIgnoreAttribute(excelIgnore); + +[Obsolete("This is a legacy attribute that will be removed in a future version. Please use the corresponding one from MiniExcelLib.Core.Attributes instead.")] +public sealed class ExcelSheetAttribute : MiniExcelSheetAttribute; + +[Obsolete("This is a legacy attribute that will be removed in a future version. Please use the corresponding one from MiniExcelLib.Core.Attributes instead.")] +public sealed class DynamicExcelSheetAttribute(string key) : MiniExcelLib.Core.Attributes.DynamicExcelSheetAttribute(key); \ No newline at end of file diff --git a/src/MiniExcel/Legacy/Configuration.cs b/src/MiniExcel/Legacy/Configuration.cs index afb592c6..3d8c396a 100644 --- a/src/MiniExcel/Legacy/Configuration.cs +++ b/src/MiniExcel/Legacy/Configuration.cs @@ -1,9 +1,17 @@ using MiniExcelLib.Core; -namespace MiniExcelLib.Legacy; +namespace MiniExcelLibs +{ + public interface IConfiguration : IMiniExcelConfiguration; +} -public interface IConfiguration : IMiniExcelConfiguration; +namespace MiniExcelLibs.OpenXml +{ + public sealed class OpenXmlConfiguration : MiniExcelLib.Core.OpenXml.OpenXmlConfiguration, IConfiguration; +} -public sealed class OpenXmlConfiguration : Core.OpenXml.OpenXmlConfiguration, IConfiguration; -public sealed class CsvConfiguration : MiniExcelLib.Csv.CsvConfiguration, IConfiguration; \ No newline at end of file +namespace MiniExcelLibs.Csv +{ + public sealed class CsvConfiguration : MiniExcelLib.Csv.CsvConfiguration, IConfiguration; +} diff --git a/src/MiniExcel/Legacy/ExcelType.cs b/src/MiniExcel/Legacy/ExcelType.cs index b8869acf..a0b2ee83 100644 --- a/src/MiniExcel/Legacy/ExcelType.cs +++ b/src/MiniExcel/Legacy/ExcelType.cs @@ -1,4 +1,5 @@ -namespace MiniExcelLib.Legacy; +// ReSharper disable CheckNamespace +namespace MiniExcelLibs; public enum ExcelType { XLSX, CSV, UNKNOWN } diff --git a/src/MiniExcel/Legacy/ExcelTypeHelper.cs b/src/MiniExcel/Legacy/ExcelTypeHelper.cs index cf5cd8d2..a4fd7f94 100644 --- a/src/MiniExcel/Legacy/ExcelTypeHelper.cs +++ b/src/MiniExcel/Legacy/ExcelTypeHelper.cs @@ -1,4 +1,5 @@ -namespace MiniExcelLib.Legacy; +// ReSharper disable CheckNamespace +namespace MiniExcelLibs; internal static class ExcelTypeHelper { diff --git a/src/MiniExcel/Legacy/MiniExcel.cs b/src/MiniExcel/Legacy/MiniExcel.cs index 638b1e49..8f8f191c 100644 --- a/src/MiniExcel/Legacy/MiniExcel.cs +++ b/src/MiniExcel/Legacy/MiniExcel.cs @@ -3,13 +3,15 @@ using MiniExcelLib.Core.OpenXml.Models; using MiniExcelLib.Core.OpenXml.Picture; using MiniExcelLib.Csv; +using MiniExcelLibs.OpenXml; using Zomp.SyncMethodGenerator; + using NewMiniExcel = MiniExcelLib.Core.MiniExcel; using OpenXmlExporter = MiniExcelLib.Core.OpenXmlExporter; using OpenXmlImporter = MiniExcelLib.Core.OpenXmlImporter; using OpenXmlTemplater = MiniExcelLib.Core.OpenXmlTemplater; -namespace MiniExcelLib.Legacy; +namespace MiniExcelLibs; public static partial class MiniExcel { @@ -22,139 +24,139 @@ public static partial class MiniExcel [CreateSyncVersion] - [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.MiniExcel.Exporter instead.")] + [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.Core.MiniExcel.Exporter instead.")] public static async Task AddPictureAsync(string path, CancellationToken cancellationToken = default, params MiniExcelPicture[] images) => await ExcelExporter.AddPictureAsync(path, cancellationToken, images).ConfigureAwait(false); [CreateSyncVersion] - [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.MiniExcel.Exporter instead.")] + [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.Core.MiniExcel.Exporter instead.")] public static async Task AddPictureAsync(Stream excelStream, CancellationToken cancellationToken = default, params MiniExcelPicture[] images) => await ExcelExporter.AddPictureAsync(excelStream, cancellationToken, images).ConfigureAwait(false); - [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.MiniExcel.Importer instead.")] + [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.Core.MiniExcel.Importer instead.")] public static MiniExcelDataReader GetReader(string path, bool useHeaderRow = false, string? sheetName = null, ExcelType excelType = ExcelType.UNKNOWN, string startCell = "A1", IConfiguration? configuration = null) { var type = path.GetExcelType(excelType); return type switch { ExcelType.XLSX => ExcelImporter.GetExcelDataReader(path, useHeaderRow, sheetName, startCell, configuration as OpenXmlConfiguration), - ExcelType.CSV => CsvImporter.GetDataReader(path, useHeaderRow, configuration as CsvConfiguration), + ExcelType.CSV => CsvImporter.GetDataReader(path, useHeaderRow, configuration as Csv.CsvConfiguration), _ => throw new NotSupportedException($"Excel type {type} is not a valid Excel type") }; } - [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.MiniExcel.Importer instead.")] + [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.Core.MiniExcel.Importer instead.")] public static MiniExcelDataReader GetReader(this Stream stream, bool useHeaderRow = false, string? sheetName = null, ExcelType excelType = ExcelType.UNKNOWN, string startCell = "A1", IConfiguration? configuration = null) { var type = stream.GetExcelType(excelType); return type switch { ExcelType.XLSX => ExcelImporter.GetExcelDataReader(stream, useHeaderRow, sheetName, startCell, configuration as OpenXmlConfiguration), - ExcelType.CSV => CsvImporter.GetDataReader(stream, useHeaderRow, configuration as CsvConfiguration), + ExcelType.CSV => CsvImporter.GetDataReader(stream, useHeaderRow, configuration as Csv.CsvConfiguration), _ => throw new NotSupportedException($"Excel type {type} is not a valid Excel type") }; } [CreateSyncVersion] - [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.MiniExcel.Exporter instead.")] + [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.Core.MiniExcel.Exporter instead.")] public static async Task InsertAsync(string path, object value, string sheetName = "Sheet1", ExcelType excelType = ExcelType.UNKNOWN, IConfiguration? configuration = null, bool printHeader = true, bool overwriteSheet = false, CancellationToken cancellationToken = default) { var type = path.GetExcelType(excelType); return type switch { ExcelType.XLSX => await ExcelExporter.InsertSheetAsync(path, value, sheetName, printHeader, overwriteSheet, configuration as OpenXmlConfiguration, cancellationToken).ConfigureAwait(false), - ExcelType.CSV => await CsvExporter.AppendToCsvAsync(path, value, printHeader, configuration as CsvConfiguration, cancellationToken).ConfigureAwait(false), + ExcelType.CSV => await CsvExporter.AppendToCsvAsync(path, value, printHeader, configuration as Csv.CsvConfiguration, cancellationToken).ConfigureAwait(false), _ => throw new InvalidDataException($"Excel type {type} is not a valid Excel type") }; } [CreateSyncVersion] - [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.MiniExcel.Exporter instead.")] + [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.Core.MiniExcel.Exporter instead.")] public static async Task InsertAsync(this Stream stream, object value, string sheetName = "Sheet1", ExcelType excelType = ExcelType.XLSX, IConfiguration? configuration = null, bool printHeader = true, bool overwriteSheet = false, CancellationToken cancellationToken = default) { var type = stream.GetExcelType(excelType); return type switch { ExcelType.XLSX => await ExcelExporter.InsertSheetAsync(stream, value, sheetName, printHeader, overwriteSheet, configuration as OpenXmlConfiguration, cancellationToken).ConfigureAwait(false), - ExcelType.CSV => await CsvExporter.AppendToCsvAsync(stream, value, configuration as CsvConfiguration, cancellationToken).ConfigureAwait(false), + ExcelType.CSV => await CsvExporter.AppendToCsvAsync(stream, value, configuration as Csv.CsvConfiguration, cancellationToken).ConfigureAwait(false), _ => throw new InvalidDataException($"Excel type {type} is not a valid Excel type") }; } [CreateSyncVersion] - [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.MiniExcel.Exporter instead.")] + [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.Core.MiniExcel.Exporter instead.")] public static async Task SaveAsAsync(string path, object value, bool printHeader = true, string sheetName = "Sheet1", ExcelType excelType = ExcelType.UNKNOWN, IConfiguration? configuration = null, bool overwriteFile = false, CancellationToken cancellationToken = default) { var type = path.GetExcelType(excelType); return type switch { ExcelType.XLSX => await ExcelExporter.ExportAsync(path, value, printHeader, sheetName, printHeader, configuration as OpenXmlConfiguration, cancellationToken).ConfigureAwait(false), - ExcelType.CSV => await CsvExporter.ExportAsync(path, value, printHeader, overwriteFile, configuration as CsvConfiguration, cancellationToken).ConfigureAwait(false), + ExcelType.CSV => await CsvExporter.ExportAsync(path, value, printHeader, overwriteFile, configuration as Csv.CsvConfiguration, cancellationToken).ConfigureAwait(false), _ => throw new InvalidDataException($"Excel type {type} is not a valid Excel type") }; } [CreateSyncVersion] - [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.MiniExcel.Exporter instead.")] + [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.Core.MiniExcel.Exporter instead.")] public static async Task SaveAsAsync(this Stream stream, object value, bool printHeader = true, string sheetName = "Sheet1", ExcelType excelType = ExcelType.XLSX, IConfiguration? configuration = null, CancellationToken cancellationToken = default) { var type = stream.GetExcelType(excelType); return type switch { ExcelType.XLSX => await ExcelExporter.ExportAsync(stream, value, printHeader, sheetName, configuration as OpenXmlConfiguration, cancellationToken).ConfigureAwait(false), - ExcelType.CSV => await CsvExporter.ExportAsync(stream, value, printHeader, configuration as CsvConfiguration, cancellationToken).ConfigureAwait(false), + ExcelType.CSV => await CsvExporter.ExportAsync(stream, value, printHeader, configuration as Csv.CsvConfiguration, cancellationToken).ConfigureAwait(false), _ => throw new InvalidDataException($"Excel type {type} is not a valid Excel type") }; } [CreateSyncVersion] - [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.MiniExcel.Importer instead.")] + [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.Core.MiniExcel.Importer instead.")] public static IAsyncEnumerable QueryAsync(string path, string? sheetName = null, ExcelType excelType = ExcelType.UNKNOWN, string startCell = "A1", IConfiguration? configuration = null, bool hasHeader = true, CancellationToken cancellationToken = default) where T : class, new() { var type = path.GetExcelType(excelType); return type switch { ExcelType.XLSX => ExcelImporter.QueryAsync(path, sheetName, startCell, hasHeader, configuration as OpenXmlConfiguration, cancellationToken), - ExcelType.CSV => CsvImporter.QueryAsync(path, hasHeader, configuration as CsvConfiguration, cancellationToken), + ExcelType.CSV => CsvImporter.QueryAsync(path, hasHeader, configuration as Csv.CsvConfiguration, cancellationToken), _ => throw new InvalidDataException($"Excel type {type} is not a valid Excel type") }; } [CreateSyncVersion] - [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.MiniExcel.Importer instead.")] + [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.Core.MiniExcel.Importer instead.")] public static IAsyncEnumerable QueryAsync(this Stream stream, string? sheetName = null, ExcelType excelType = ExcelType.UNKNOWN, string startCell = "A1", IConfiguration? configuration = null, bool hasHeader = true, CancellationToken cancellationToken = default) where T : class, new() { var type = stream.GetExcelType(excelType); return type switch { ExcelType.XLSX => ExcelImporter.QueryAsync(stream, sheetName, startCell, hasHeader, configuration as OpenXmlConfiguration, cancellationToken), - ExcelType.CSV => CsvImporter.QueryAsync(stream, hasHeader, configuration as CsvConfiguration, cancellationToken), + ExcelType.CSV => CsvImporter.QueryAsync(stream, hasHeader, configuration as Csv.CsvConfiguration, cancellationToken), _ => throw new InvalidDataException($"Excel type {type} is not a valid Excel type") }; } [CreateSyncVersion] - [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.MiniExcel.Importer instead.")] + [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.Core.MiniExcel.Importer instead.")] public static IAsyncEnumerable QueryAsync(string path, bool useHeaderRow = false, string? sheetName = null, ExcelType excelType = ExcelType.UNKNOWN, string startCell = "A1", IConfiguration? configuration = null, CancellationToken cancellationToken = default) { var type = path.GetExcelType(excelType); return type switch { ExcelType.XLSX => ExcelImporter.QueryAsync(path, useHeaderRow, sheetName, startCell, configuration as OpenXmlConfiguration, cancellationToken), - ExcelType.CSV => CsvImporter.QueryAsync(path, useHeaderRow, configuration as CsvConfiguration, cancellationToken), + ExcelType.CSV => CsvImporter.QueryAsync(path, useHeaderRow, configuration as Csv.CsvConfiguration, cancellationToken), _ => throw new InvalidDataException($"Excel type {type} is not a valid Excel type") }; } [CreateSyncVersion] - [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.MiniExcel.Importer instead.")] + [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.Core.MiniExcel.Importer instead.")] public static IAsyncEnumerable QueryAsync(this Stream stream, bool useHeaderRow = false, string? sheetName = null, ExcelType excelType = ExcelType.UNKNOWN, string startCell = "A1", IConfiguration? configuration = null, CancellationToken cancellationToken = default) { var type = stream.GetExcelType(excelType); return type switch { ExcelType.XLSX => ExcelImporter.QueryAsync(stream, useHeaderRow, sheetName, startCell, configuration as OpenXmlConfiguration, cancellationToken), - ExcelType.CSV => CsvImporter.QueryAsync(stream, useHeaderRow, configuration as CsvConfiguration, cancellationToken), + ExcelType.CSV => CsvImporter.QueryAsync(stream, useHeaderRow, configuration as Csv.CsvConfiguration, cancellationToken), _ => throw new InvalidDataException($"Excel type {type} is not a valid Excel type") }; } @@ -169,7 +171,7 @@ public static IAsyncEnumerable QueryAsync(this Stream stream, bool useH /// If you don't want to restrict rows, just don't include numbers /// [CreateSyncVersion] - [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.MiniExcel.Importer instead.")] + [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.Core.MiniExcel.Importer instead.")] public static IAsyncEnumerable QueryRangeAsync(string path, bool useHeaderRow = false, string? sheetName = null, ExcelType excelType = ExcelType.UNKNOWN, string startCell = "A1", string endCell = "", IConfiguration? configuration = null, CancellationToken cancellationToken = default) { var type = path.GetExcelType(excelType); @@ -182,20 +184,20 @@ public static IAsyncEnumerable QueryRangeAsync(string path, bool useHea } [CreateSyncVersion] - [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.MiniExcel.Importer instead.")] + [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.Core.MiniExcel.Importer instead.")] public static IAsyncEnumerable QueryRangeAsync(this Stream stream, bool useHeaderRow = false, string? sheetName = null, ExcelType excelType = ExcelType.UNKNOWN, string startCell = "A1", string endCell = "", IConfiguration? configuration = null, CancellationToken cancellationToken = default) { var type = stream.GetExcelType(excelType); return type switch { ExcelType.XLSX => ExcelImporter.QueryRangeAsync(stream, useHeaderRow, sheetName, startCell, endCell, configuration as OpenXmlConfiguration, cancellationToken), - ExcelType.CSV => CsvImporter.QueryAsync(stream, useHeaderRow, configuration as CsvConfiguration, cancellationToken), + ExcelType.CSV => CsvImporter.QueryAsync(stream, useHeaderRow, configuration as Csv.CsvConfiguration, cancellationToken), _ => throw new InvalidDataException($"Excel type {type} is not a valid Excel type") }; } [CreateSyncVersion] - [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.MiniExcel.Importer instead.")] + [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.Core.MiniExcel.Importer instead.")] public static IAsyncEnumerable QueryRangeAsync(string path, bool useHeaderRow = false, string? sheetName = null, ExcelType excelType = ExcelType.UNKNOWN, int startRowIndex = 1, int startColumnIndex = 1, int? endRowIndex = null, int? endColumnIndex = null, IConfiguration? configuration = null, CancellationToken cancellationToken = default) { var type = path.GetExcelType(excelType); @@ -208,7 +210,7 @@ public static IAsyncEnumerable QueryRangeAsync(string path, bool useHea } [CreateSyncVersion] - [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.MiniExcel.Importer instead.")] + [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.Core.MiniExcel.Importer instead.")] public static IAsyncEnumerable QueryRangeAsync(this Stream stream, bool useHeaderRow = false, string? sheetName = null, ExcelType excelType = ExcelType.UNKNOWN, int startRowIndex = 1, int startColumnIndex = 1, int? endRowIndex = null, int? endColumnIndex = null, IConfiguration? configuration = null, CancellationToken cancellationToken = default) { var type = stream.GetExcelType(excelType); @@ -223,39 +225,39 @@ public static IAsyncEnumerable QueryRangeAsync(this Stream stream, bool #endregion QueryRange [CreateSyncVersion] - [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.MiniExcel.Exporter instead.")] + [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.Core.MiniExcel.Exporter instead.")] public static async Task SaveAsByTemplateAsync(string path, string templatePath, object value, IConfiguration? configuration = null, CancellationToken cancellationToken = default) => await ExcelTemplater.ApplyTemplateAsync(path, templatePath, value, configuration as OpenXmlConfiguration, cancellationToken).ConfigureAwait(false); [CreateSyncVersion] - [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.MiniExcel.Templater instead.")] + [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.Core.MiniExcel.Templater instead.")] public static async Task SaveAsByTemplateAsync(string path, byte[] templateBytes, object value, IConfiguration? configuration = null) => await ExcelTemplater.ApplyTemplateAsync(path, templateBytes, value, configuration as OpenXmlConfiguration).ConfigureAwait(false); [CreateSyncVersion] - [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.MiniExcel.Templater instead.")] + [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.Core.MiniExcel.Templater instead.")] public static async Task SaveAsByTemplateAsync(this Stream stream, string templatePath, object value, IConfiguration? configuration = null) => await ExcelTemplater.ApplyTemplateAsync(stream, templatePath, value, configuration as OpenXmlConfiguration).ConfigureAwait(false); [CreateSyncVersion] - [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.MiniExcel.Templater instead.")] + [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.Core.MiniExcel.Templater instead.")] public static async Task SaveAsByTemplateAsync(this Stream stream, byte[] templateBytes, object value, IConfiguration? configuration = null) => await ExcelTemplater.ApplyTemplateAsync(stream, templateBytes, value, configuration as OpenXmlConfiguration).ConfigureAwait(false); [CreateSyncVersion] - [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.MiniExcel.Templater instead.")] + [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.Core.MiniExcel.Templater instead.")] public static async Task SaveAsByTemplateAsync(string path, Stream templateStream, object value, IConfiguration? configuration = null) => await ExcelTemplater.ApplyTemplateAsync(path, templateStream, value, configuration as OpenXmlConfiguration).ConfigureAwait(false); [CreateSyncVersion] - [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.MiniExcel.Templater instead.")] + [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.Core.MiniExcel.Templater instead.")] public static async Task SaveAsByTemplateAsync(this Stream stream, Stream templateStream, object value, IConfiguration? configuration = null) => await ExcelTemplater.ApplyTemplateAsync(stream, templateStream, value, configuration as OpenXmlConfiguration).ConfigureAwait(false); #region MergeCells [CreateSyncVersion] - [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.MiniExcel.Templater instead.")] + [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.Core.MiniExcel.Templater instead.")] public static async Task MergeSameCellsAsync(string mergedFilePath, string path, ExcelType excelType = ExcelType.XLSX, IConfiguration? configuration = null, CancellationToken cancellationToken = default) { if (excelType != ExcelType.XLSX) @@ -265,7 +267,7 @@ public static async Task MergeSameCellsAsync(string mergedFilePath, string path, } [CreateSyncVersion] - [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.MiniExcel.Templater instead.")] + [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.Core.MiniExcel.Templater instead.")] public static async Task MergeSameCellsAsync(this Stream stream, string path, ExcelType excelType = ExcelType.XLSX, IConfiguration? configuration = null, CancellationToken cancellationToken = default) { if (excelType != ExcelType.XLSX) @@ -275,7 +277,7 @@ public static async Task MergeSameCellsAsync(this Stream stream, string path, Ex } [CreateSyncVersion] - [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.MiniExcel.Templater instead.")] + [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.Core.MiniExcel.Templater instead.")] public static async Task MergeSameCellsAsync(this Stream stream, byte[] filePath, ExcelType excelType = ExcelType.XLSX, IConfiguration? configuration = null, CancellationToken cancellationToken = default) { if (excelType != ExcelType.XLSX) @@ -290,14 +292,14 @@ public static async Task MergeSameCellsAsync(this Stream stream, byte[] filePath /// The use of QueryAsDataTable is not recommended, because it'll load all data into memory. ///
[CreateSyncVersion] - [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.MiniExcel.Importer instead.")] + [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.Core.MiniExcel.Importer instead.")] public static async Task QueryAsDataTableAsync(string path, bool useHeaderRow = true, string? sheetName = null, ExcelType excelType = ExcelType.UNKNOWN, string startCell = "A1", IConfiguration? configuration = null, CancellationToken cancellationToken = default) { var type = path.GetExcelType(excelType); return type switch { ExcelType.XLSX => await ExcelImporter.QueryAsDataTableAsync(path, useHeaderRow, sheetName, startCell, configuration as OpenXmlConfiguration, cancellationToken).ConfigureAwait(false), - ExcelType.CSV => await CsvImporter.QueryAsDataTableAsync(path, useHeaderRow, configuration as CsvConfiguration, cancellationToken).ConfigureAwait(false), + ExcelType.CSV => await CsvImporter.QueryAsDataTableAsync(path, useHeaderRow, configuration as Csv.CsvConfiguration, cancellationToken).ConfigureAwait(false), _ => throw new InvalidDataException($"Excel type {type} is not a valid Excel type") }; } @@ -306,91 +308,91 @@ public static async Task QueryAsDataTableAsync(string path, bool useH /// The use of QueryAsDataTable is not recommended, because it'll load all data into memory. /// [CreateSyncVersion] - [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.MiniExcel.Importer instead.")] + [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.Core.MiniExcel.Importer instead.")] public static async Task QueryAsDataTableAsync(this Stream stream, bool useHeaderRow = true, string? sheetName = null, ExcelType excelType = ExcelType.UNKNOWN, string startCell = "A1", IConfiguration? configuration = null, CancellationToken cancellationToken = default) { var type = stream.GetExcelType(excelType); return type switch { ExcelType.XLSX => await ExcelImporter.QueryAsDataTableAsync(stream, useHeaderRow, sheetName, startCell, configuration as OpenXmlConfiguration, cancellationToken).ConfigureAwait(false), - ExcelType.CSV => await CsvImporter.QueryAsDataTableAsync(stream, useHeaderRow, configuration as CsvConfiguration, cancellationToken).ConfigureAwait(false), + ExcelType.CSV => await CsvImporter.QueryAsDataTableAsync(stream, useHeaderRow, configuration as Csv.CsvConfiguration, cancellationToken).ConfigureAwait(false), _ => throw new InvalidDataException($"Excel type {type} is not a valid Excel type") }; } [CreateSyncVersion] - [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.MiniExcel.Importer instead.")] + [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.Core.MiniExcel.Importer instead.")] public static async Task> GetSheetNamesAsync(string path, OpenXmlConfiguration? config = null, CancellationToken cancellationToken = default) => await ExcelImporter.GetSheetNamesAsync(path, config, cancellationToken).ConfigureAwait(false); [CreateSyncVersion] - [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.MiniExcel.Importer instead.")] + [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.Core.MiniExcel.Importer instead.")] public static async Task> GetSheetNamesAsync(this Stream stream, OpenXmlConfiguration? config = null, CancellationToken cancellationToken = default) => await ExcelImporter.GetSheetNamesAsync(stream, config, cancellationToken).ConfigureAwait(false); [CreateSyncVersion] - [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.MiniExcel.Importer instead.")] + [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.Core.MiniExcel.Importer instead.")] public static async Task> GetSheetInformationsAsync(string path, OpenXmlConfiguration? config = null, CancellationToken cancellationToken = default) => await ExcelImporter.GetSheetInformationsAsync(path, config, cancellationToken).ConfigureAwait(false); [CreateSyncVersion] - [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.MiniExcel.Importer instead.")] + [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.Core.MiniExcel.Importer instead.")] public static async Task> GetSheetInformationsAsync(this Stream stream, OpenXmlConfiguration? config = null, CancellationToken cancellationToken = default) => await ExcelImporter.GetSheetInformationsAsync(stream, config, cancellationToken).ConfigureAwait(false); [CreateSyncVersion] - [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.MiniExcel.Importer instead.")] + [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.Core.MiniExcel.Importer instead.")] public static async Task> GetColumnsAsync(string path, bool useHeaderRow = false, string? sheetName = null, ExcelType excelType = ExcelType.UNKNOWN, string startCell = "A1", IConfiguration? configuration = null, CancellationToken cancellationToken = default) { var type = path.GetExcelType(excelType); return type switch { ExcelType.XLSX => await ExcelImporter.GetColumnNamesAsync(path, useHeaderRow, sheetName, startCell, configuration as OpenXmlConfiguration, cancellationToken).ConfigureAwait(false), - ExcelType.CSV => await CsvImporter.GetColumnNamesAsync(path, useHeaderRow, configuration as CsvConfiguration, cancellationToken).ConfigureAwait(false), + ExcelType.CSV => await CsvImporter.GetColumnNamesAsync(path, useHeaderRow, configuration as Csv.CsvConfiguration, cancellationToken).ConfigureAwait(false), _ => throw new InvalidDataException($"Excel type {type} is not a valid Excel type") }; } [CreateSyncVersion] - [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.MiniExcel.Importer instead.")] + [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.Core.MiniExcel.Importer instead.")] public static async Task> GetColumnsAsync(this Stream stream, bool useHeaderRow = false, string? sheetName = null, ExcelType excelType = ExcelType.UNKNOWN, string startCell = "A1", IConfiguration? configuration = null, CancellationToken cancellationToken = default) { var type = stream.GetExcelType(excelType); return type switch { ExcelType.XLSX => await ExcelImporter.GetColumnNamesAsync(stream, useHeaderRow, sheetName, startCell, configuration as OpenXmlConfiguration, cancellationToken).ConfigureAwait(false), - ExcelType.CSV => await CsvImporter.GetColumnNamesAsync(stream, useHeaderRow, configuration as CsvConfiguration, cancellationToken).ConfigureAwait(false), + ExcelType.CSV => await CsvImporter.GetColumnNamesAsync(stream, useHeaderRow, configuration as Csv.CsvConfiguration, cancellationToken).ConfigureAwait(false), _ => throw new InvalidDataException($"Excel type {type} is not a valid Excel type") }; } [CreateSyncVersion] - [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.MiniExcel.Importer instead.")] + [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.Core.MiniExcel.Importer instead.")] public static async Task> GetSheetDimensionsAsync(string path, CancellationToken cancellationToken = default) => await ExcelImporter.GetSheetDimensionsAsync(path, cancellationToken).ConfigureAwait(false); [CreateSyncVersion] - [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.MiniExcel.Importer instead.")] + [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.Core.MiniExcel.Importer instead.")] public static async Task> GetSheetDimensionsAsync(this Stream stream, CancellationToken cancellationToken = default) => await ExcelImporter.GetSheetDimensionsAsync(stream, cancellationToken).ConfigureAwait(false); [CreateSyncVersion] - [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.MiniExcel.Exporter instead.")] + [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.Core.MiniExcel.Exporter instead.")] public static async Task ConvertCsvToXlsxAsync(string csv, string xlsx, CancellationToken cancellationToken = default) => await CsvExporter.ConvertCsvToXlsxAsync(csv, xlsx, cancellationToken: cancellationToken).ConfigureAwait(false); [CreateSyncVersion] - [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.MiniExcel.Exporter instead.")] + [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.Core.MiniExcel.Exporter instead.")] public static async Task ConvertCsvToXlsxAsync(Stream csv, Stream xlsx, CancellationToken cancellationToken = default) => await CsvExporter.ConvertCsvToXlsxAsync(csv, xlsx, cancellationToken: cancellationToken).ConfigureAwait(false); [CreateSyncVersion] - [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.MiniExcel.Exporter instead.")] + [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.Core.MiniExcel.Exporter instead.")] public static async Task ConvertXlsxToCsvAsync(string xlsx, string csv, CancellationToken cancellationToken = default) => await CsvExporter.ConvertXlsxToCsvAsync(xlsx, csv, cancellationToken: cancellationToken).ConfigureAwait(false); [CreateSyncVersion] - [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.MiniExcel.Exporter instead.")] + [Obsolete("This is a legacy method signature that will be removed in a future version. Please use the methods from one of the providers in MiniExcelLib.Core.MiniExcel.Exporter instead.")] public static async Task ConvertXlsxToCsvAsync(Stream xlsx, Stream csv, CancellationToken cancellationToken = default) => await CsvExporter.ConvertXlsxToCsvAsync(xlsx, csv, cancellationToken: cancellationToken).ConfigureAwait(false); diff --git a/tests/MiniExcel.Core.Tests/MiniExcelIssueTests.cs b/tests/MiniExcel.Core.Tests/MiniExcelIssueTests.cs index c59e9ba4..cde83ec5 100644 --- a/tests/MiniExcel.Core.Tests/MiniExcelIssueTests.cs +++ b/tests/MiniExcel.Core.Tests/MiniExcelIssueTests.cs @@ -1206,7 +1206,7 @@ public void TestIssueI40QA5() private class TestIssueI40QA5Dto { - [MiniExcelColumnName(excelColumnName: "EmployeeNo", aliases: new[] { "EmpNo", "No" })] + [MiniExcelColumnName(columnName: "EmployeeNo", aliases: new[] { "EmpNo", "No" })] public string Empno { get; set; } public string Name { get; set; } } diff --git a/tests/MiniExcel.Core.Tests/MiniExcelOpenXmlMultipleSheetTests.cs b/tests/MiniExcel.Core.Tests/MiniExcelOpenXmlMultipleSheetTests.cs index 6d35de6e..ed974576 100644 --- a/tests/MiniExcel.Core.Tests/MiniExcelOpenXmlMultipleSheetTests.cs +++ b/tests/MiniExcel.Core.Tests/MiniExcelOpenXmlMultipleSheetTests.cs @@ -1,5 +1,4 @@ -using MiniExcelLib.Core.OpenXml.Attributes; -using MiniExcelLib.Core.OpenXml.Models; +using MiniExcelLib.Core.OpenXml.Models; using MiniExcelLib.Tests.Common.Utils; namespace MiniExcelLib.Tests; @@ -97,14 +96,14 @@ public void MultiSheetsQueryTest() } } - [ExcelSheet(Name = "Users")] + [MiniExcelSheet(Name = "Users")] private class UserDto { public string Name { get; set; } public int Age { get; set; } } - [ExcelSheet(Name = "Departments", State = SheetState.Hidden)] + [MiniExcelSheet(Name = "Departments", State = SheetState.Hidden)] private class DepartmentDto { public string ID { get; set; } @@ -144,8 +143,8 @@ public void DynamicSheetConfigurationIsUsedWhenReadExcel() { DynamicSheets = [ - new DynamicExcelSheet("usersSheet") { Name = "Users" }, - new DynamicExcelSheet("departmentSheet") { Name = "Departments" } + new DynamicExcelSheetAttribute("usersSheet") { Name = "Users" }, + new DynamicExcelSheetAttribute("departmentSheet") { Name = "Departments" } ] }; @@ -231,12 +230,12 @@ public void WriteHiddenSheetTest() { DynamicSheets = [ - new DynamicExcelSheet("usersSheet") + new DynamicExcelSheetAttribute("usersSheet") { Name = "Users", State = SheetState.Visible }, - new DynamicExcelSheet("departmentSheet") + new DynamicExcelSheetAttribute("departmentSheet") { Name = "Departments", State = SheetState.Hidden diff --git a/tests/MiniExcel.Csv.Tests/MiniExcelCsvTests.cs b/tests/MiniExcel.Csv.Tests/MiniExcelCsvTests.cs index 2dd6f4e1..8105be36 100644 --- a/tests/MiniExcel.Csv.Tests/MiniExcelCsvTests.cs +++ b/tests/MiniExcel.Csv.Tests/MiniExcelCsvTests.cs @@ -305,9 +305,9 @@ private class Test private class TestWithAlias { - [MiniExcelColumnName(excelColumnName: "c1", aliases: ["column1", "col1"])] + [MiniExcelColumnName(columnName: "c1", aliases: ["column1", "col1"])] public string c1 { get; set; } - [MiniExcelColumnName(excelColumnName: "c2", aliases: ["column2", "col2"])] + [MiniExcelColumnName(columnName: "c2", aliases: ["column2", "col2"])] public string c2 { get; set; } } From 5d609c466d55aae736e1334480370f3b15fc5788 Mon Sep 17 00:00:00 2001 From: Michele Bastione Date: Mon, 28 Jul 2025 01:01:36 +0200 Subject: [PATCH 26/26] Renamed some methods and properties --- .../BenchmarkSections/CreateExcelBenchmark.cs | 2 +- .../BenchmarkSections/QueryExcelBenchmark.cs | 2 +- .../TemplateExcelBenchmark.cs | 2 +- .../BenchmarkSections/XlsxAsyncBenchmark.cs | 4 +-- src/MiniExcel.Core/Api/OpenXmlImporter.cs | 12 ++++----- src/MiniExcel.Core/Helpers/ListHelper.cs | 12 ++------- src/MiniExcel.Core/MiniExcel.cs | 6 ++--- src/MiniExcel.Csv/Api/CsvExporter.cs | 10 +++---- src/MiniExcel.Csv/Api/CsvImporter.cs | 8 +++--- src/MiniExcel/Legacy/MiniExcel.cs | 18 ++++++------- .../MiniExcelAutoAdjustWidthTests.cs | 2 +- .../MiniExcelIssueAsyncTests.cs | 6 ++--- .../MiniExcelIssueTests.cs | 12 ++++----- .../MiniExcelOpenXmlAsyncTests.cs | 27 +++++++++---------- .../MiniExcelOpenXmlConfigurationTest.cs | 4 +-- ...MiniExcelOpenXmlMultipleSheetAsyncTests.cs | 2 +- .../MiniExcelOpenXmlMultipleSheetTests.cs | 4 +-- .../MiniExcelOpenXmlTests.cs | 4 +-- .../MiniExcelTemplateAsyncTests.cs | 4 +-- .../SaveByTemplate/MiniExcelTemplateTests.cs | 6 ++--- tests/MiniExcel.Csv.Tests/AsyncIssueTests.cs | 8 +++--- tests/MiniExcel.Csv.Tests/IssueTests.cs | 12 ++++----- .../MiniExcelCsvAsycTests.cs | 4 +-- .../MiniExcel.Csv.Tests/MiniExcelCsvTests.cs | 10 +++---- 24 files changed, 86 insertions(+), 95 deletions(-) diff --git a/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/CreateExcelBenchmark.cs b/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/CreateExcelBenchmark.cs index 0e2bc057..0ac47cd6 100644 --- a/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/CreateExcelBenchmark.cs +++ b/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/CreateExcelBenchmark.cs @@ -21,7 +21,7 @@ public void SetUp() ExcelPackage.LicenseContext = LicenseContext.NonCommercial; Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); - _exporter = MiniExcel.Exporter.GetOpenXmlExporter(); + _exporter = MiniExcel.Exporters.GetOpenXmlExporter(); } [Benchmark(Description = "MiniExcel Create Xlsx")] diff --git a/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/QueryExcelBenchmark.cs b/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/QueryExcelBenchmark.cs index 94ec2eee..e0e18a30 100644 --- a/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/QueryExcelBenchmark.cs +++ b/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/QueryExcelBenchmark.cs @@ -20,7 +20,7 @@ public void SetUp() ExcelPackage.LicenseContext = LicenseContext.NonCommercial; Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); - _importer = MiniExcel.Importer.GetOpenXmlImporter(); + _importer = MiniExcel.Importers.GetOpenXmlImporter(); } [Benchmark(Description = "MiniExcel QueryFirst")] diff --git a/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/TemplateExcelBenchmark.cs b/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/TemplateExcelBenchmark.cs index 372c014a..c4fe16b7 100644 --- a/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/TemplateExcelBenchmark.cs +++ b/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/TemplateExcelBenchmark.cs @@ -12,7 +12,7 @@ public class TemplateExcelBenchmark : BenchmarkBase [GlobalSetup] public void Setup() { - _templater = MiniExcel.Templater.GetOpenXmlTemplater(); + _templater = MiniExcel.Templaters.GetOpenXmlTemplater(); } [Benchmark(Description = "MiniExcel Template Generate")] diff --git a/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/XlsxAsyncBenchmark.cs b/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/XlsxAsyncBenchmark.cs index 41e7ecbc..ed327bfa 100644 --- a/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/XlsxAsyncBenchmark.cs +++ b/benchmarks/MiniExcel.Benchmarks/BenchmarkSections/XlsxAsyncBenchmark.cs @@ -12,8 +12,8 @@ public class XlsxAsyncBenchmark : BenchmarkBase [GlobalSetup] public void Setup() { - _exporter = MiniExcel.Exporter.GetOpenXmlExporter(); - _templater = MiniExcel.Templater.GetOpenXmlTemplater(); + _exporter = MiniExcel.Exporters.GetOpenXmlExporter(); + _templater = MiniExcel.Templaters.GetOpenXmlTemplater(); } [Benchmark(Description = "MiniExcel Create Xlsx Async")] diff --git a/src/MiniExcel.Core/Api/OpenXmlImporter.cs b/src/MiniExcel.Core/Api/OpenXmlImporter.cs index 228271b1..8b30d3f7 100644 --- a/src/MiniExcel.Core/Api/OpenXmlImporter.cs +++ b/src/MiniExcel.Core/Api/OpenXmlImporter.cs @@ -269,23 +269,23 @@ public async Task> GetColumnNamesAsync(Stream stream, bool u #region DataReader - public MiniExcelDataReader GetExcelDataReader(string path, bool useHeaderRow = false, + public MiniExcelDataReader GetDataReader(string path, bool useHeaderRow = false, string? sheetName = null, string startCell = "A1", OpenXmlConfiguration? configuration = null) { var stream = FileHelper.OpenSharedRead(path); - var values = Enumerable.Cast>(Query(stream, useHeaderRow, sheetName, startCell, configuration)); + var values = Query(stream, useHeaderRow, sheetName, startCell, configuration).Cast>(); return MiniExcelDataReader.Create(stream, values); } - public MiniExcelDataReader GetExcelDataReader(Stream stream, bool useHeaderRow = false, + public MiniExcelDataReader GetDataReader(Stream stream, bool useHeaderRow = false, string? sheetName = null, string startCell = "A1", OpenXmlConfiguration? configuration = null) { - var values = Enumerable.Cast>(Query(stream, useHeaderRow, sheetName, startCell, configuration)); + var values = Query(stream, useHeaderRow, sheetName, startCell, configuration).Cast>(); return MiniExcelDataReader.Create(stream, values); } - public async Task GetAsyncXlsxDataReader(string path, bool useHeaderRow = false, + public async Task GetAsyncDataReader(string path, bool useHeaderRow = false, string? sheetName = null, string startCell = "A1", OpenXmlConfiguration? configuration = null, CancellationToken cancellationToken = default) { @@ -295,7 +295,7 @@ public async Task GetAsyncXlsxDataReader(string path, return await MiniExcelAsyncDataReader.CreateAsync(stream, CastAsync(values, cancellationToken)).ConfigureAwait(false); } - public async Task GetAsyncXlsxDataReader(Stream stream, bool useHeaderRow = false, + public async Task GetAsyncDataReader(Stream stream, bool useHeaderRow = false, string? sheetName = null, string startCell = "A1", OpenXmlConfiguration? configuration = null, CancellationToken cancellationToken = default) { diff --git a/src/MiniExcel.Core/Helpers/ListHelper.cs b/src/MiniExcel.Core/Helpers/ListHelper.cs index e6cc173b..f2f2182d 100644 --- a/src/MiniExcel.Core/Helpers/ListHelper.cs +++ b/src/MiniExcel.Core/Helpers/ListHelper.cs @@ -7,17 +7,9 @@ internal static bool StartsWith(this IList span, IList value) where T : if (value is []) return true; - var b = span.Take(value.Count); - var bCount = b.Count(); - if (bCount != value.Count) + if (span.Count < value.Count) return false; - for (int i = 0; i < bCount; i++) - { - if (!span[i].Equals(value[i])) - return false; - } - - return true; + return span.Take(value.Count).SequenceEqual(value); } } \ No newline at end of file diff --git a/src/MiniExcel.Core/MiniExcel.cs b/src/MiniExcel.Core/MiniExcel.cs index 34827555..29f2dfa6 100644 --- a/src/MiniExcel.Core/MiniExcel.cs +++ b/src/MiniExcel.Core/MiniExcel.cs @@ -2,7 +2,7 @@ namespace MiniExcelLib.Core; public static class MiniExcel { - public static readonly MiniExcelExporterProvider Exporter = new(); - public static readonly MiniExcelImporterProvider Importer = new(); - public static readonly MiniExcelTemplaterProvider Templater = new(); + public static readonly MiniExcelExporterProvider Exporters = new(); + public static readonly MiniExcelImporterProvider Importers = new(); + public static readonly MiniExcelTemplaterProvider Templaters = new(); } \ No newline at end of file diff --git a/src/MiniExcel.Csv/Api/CsvExporter.cs b/src/MiniExcel.Csv/Api/CsvExporter.cs index 56bd05cc..c4c71702 100644 --- a/src/MiniExcel.Csv/Api/CsvExporter.cs +++ b/src/MiniExcel.Csv/Api/CsvExporter.cs @@ -11,7 +11,7 @@ internal CsvExporter() { } #region Append / Export [CreateSyncVersion] - public async Task AppendToCsvAsync(string path, object value, bool printHeader = true, + public async Task AppendAsync(string path, object value, bool printHeader = true, CsvConfiguration? configuration = null, CancellationToken cancellationToken = default) { if (!File.Exists(path)) @@ -21,11 +21,11 @@ public async Task AppendToCsvAsync(string path, object value, bool printHea } using var stream = new FileStream(path, FileMode.Append, FileAccess.Write, FileShare.Read, 4096, FileOptions.SequentialScan); - return await AppendToCsvAsync(stream, value, configuration, cancellationToken).ConfigureAwait(false); + return await AppendAsync(stream, value, configuration, cancellationToken).ConfigureAwait(false); } [CreateSyncVersion] - public async Task AppendToCsvAsync(Stream stream, object value, CsvConfiguration? configuration = null, CancellationToken cancellationToken = default) + public async Task AppendAsync(Stream stream, object value, CsvConfiguration? configuration = null, CancellationToken cancellationToken = default) { stream.Seek(0, SeekOrigin.End); @@ -60,7 +60,7 @@ public async Task ConvertCsvToXlsxAsync(Stream csv, Stream xlsx, bool csvHasHead { var value = new CsvImporter().QueryAsync(csv, useHeaderRow: csvHasHeader, cancellationToken: cancellationToken); - await MiniExcel.Exporter + await MiniExcel.Exporters .GetOpenXmlExporter() .ExportAsync(xlsx, value, printHeader: csvHasHeader, cancellationToken: cancellationToken) .ConfigureAwait(false); @@ -87,7 +87,7 @@ public async Task ConvertXlsxToCsvAsync(string xlsx, string csvPath, bool xlsxHa [CreateSyncVersion] public async Task ConvertXlsxToCsvAsync(Stream xlsx, Stream csv, bool xlsxHasHeader = true, CancellationToken cancellationToken = default) { - var value = MiniExcel.Importer + var value = MiniExcel.Importers .GetOpenXmlImporter() .QueryAsync(xlsx, useHeaderRow: xlsxHasHeader, cancellationToken: cancellationToken) .ConfigureAwait(false); diff --git a/src/MiniExcel.Csv/Api/CsvImporter.cs b/src/MiniExcel.Csv/Api/CsvImporter.cs index c37527ac..a63048f2 100644 --- a/src/MiniExcel.Csv/Api/CsvImporter.cs +++ b/src/MiniExcel.Csv/Api/CsvImporter.cs @@ -155,18 +155,18 @@ public async Task> GetColumnNamesAsync(Stream stream, bool u public MiniExcelDataReader GetDataReader(string path, bool useHeaderRow = false, CsvConfiguration? configuration = null) { var stream = FileHelper.OpenSharedRead(path); - var values = Enumerable.Cast>(Query(stream, useHeaderRow, configuration)); + var values = Query(stream, useHeaderRow, configuration).Cast>(); return MiniExcelDataReader.Create(stream, values); } public MiniExcelDataReader GetDataReader(Stream stream, bool useHeaderRow = false, CsvConfiguration? configuration = null) { - var values = Enumerable.Cast>(Query(stream, useHeaderRow, configuration)); + var values = Query(stream, useHeaderRow, configuration).Cast>(); return MiniExcelDataReader.Create(stream, values); } - public async Task GetAsyncCsvDataReader(string path, bool useHeaderRow = false, + public async Task GetAsyncDataReader(string path, bool useHeaderRow = false, string? sheetName = null, string startCell = "A1", CsvConfiguration? configuration = null, CancellationToken cancellationToken = default) { @@ -176,7 +176,7 @@ public async Task GetAsyncCsvDataReader(string path, b return await MiniExcelAsyncDataReader.CreateAsync(stream, CastAsync(values, cancellationToken)).ConfigureAwait(false); } - public async Task GetAsyncCsvDataReader(Stream stream, bool useHeaderRow = false, + public async Task GetAsyncDataReader(Stream stream, bool useHeaderRow = false, string? sheetName = null, string startCell = "A1", CsvConfiguration? configuration = null, CancellationToken cancellationToken = default) { diff --git a/src/MiniExcel/Legacy/MiniExcel.cs b/src/MiniExcel/Legacy/MiniExcel.cs index 8f8f191c..b2ff870a 100644 --- a/src/MiniExcel/Legacy/MiniExcel.cs +++ b/src/MiniExcel/Legacy/MiniExcel.cs @@ -15,12 +15,12 @@ namespace MiniExcelLibs; public static partial class MiniExcel { - private static readonly OpenXmlExporter ExcelExporter = NewMiniExcel.Exporter.GetOpenXmlExporter(); - private static readonly OpenXmlImporter ExcelImporter = NewMiniExcel.Importer.GetOpenXmlImporter(); - private static readonly OpenXmlTemplater ExcelTemplater = NewMiniExcel.Templater.GetOpenXmlTemplater(); + private static readonly OpenXmlExporter ExcelExporter = NewMiniExcel.Exporters.GetOpenXmlExporter(); + private static readonly OpenXmlImporter ExcelImporter = NewMiniExcel.Importers.GetOpenXmlImporter(); + private static readonly OpenXmlTemplater ExcelTemplater = NewMiniExcel.Templaters.GetOpenXmlTemplater(); - private static readonly CsvExporter CsvExporter = NewMiniExcel.Exporter.GetCsvExporter(); - private static readonly CsvImporter CsvImporter = NewMiniExcel.Importer.GetCsvImporter(); + private static readonly CsvExporter CsvExporter = NewMiniExcel.Exporters.GetCsvExporter(); + private static readonly CsvImporter CsvImporter = NewMiniExcel.Importers.GetCsvImporter(); [CreateSyncVersion] @@ -39,7 +39,7 @@ public static MiniExcelDataReader GetReader(string path, bool useHeaderRow = fal var type = path.GetExcelType(excelType); return type switch { - ExcelType.XLSX => ExcelImporter.GetExcelDataReader(path, useHeaderRow, sheetName, startCell, configuration as OpenXmlConfiguration), + ExcelType.XLSX => ExcelImporter.GetDataReader(path, useHeaderRow, sheetName, startCell, configuration as OpenXmlConfiguration), ExcelType.CSV => CsvImporter.GetDataReader(path, useHeaderRow, configuration as Csv.CsvConfiguration), _ => throw new NotSupportedException($"Excel type {type} is not a valid Excel type") }; @@ -51,7 +51,7 @@ public static MiniExcelDataReader GetReader(this Stream stream, bool useHeaderRo var type = stream.GetExcelType(excelType); return type switch { - ExcelType.XLSX => ExcelImporter.GetExcelDataReader(stream, useHeaderRow, sheetName, startCell, configuration as OpenXmlConfiguration), + ExcelType.XLSX => ExcelImporter.GetDataReader(stream, useHeaderRow, sheetName, startCell, configuration as OpenXmlConfiguration), ExcelType.CSV => CsvImporter.GetDataReader(stream, useHeaderRow, configuration as Csv.CsvConfiguration), _ => throw new NotSupportedException($"Excel type {type} is not a valid Excel type") }; @@ -65,7 +65,7 @@ public static async Task InsertAsync(string path, object value, string shee return type switch { ExcelType.XLSX => await ExcelExporter.InsertSheetAsync(path, value, sheetName, printHeader, overwriteSheet, configuration as OpenXmlConfiguration, cancellationToken).ConfigureAwait(false), - ExcelType.CSV => await CsvExporter.AppendToCsvAsync(path, value, printHeader, configuration as Csv.CsvConfiguration, cancellationToken).ConfigureAwait(false), + ExcelType.CSV => await CsvExporter.AppendAsync(path, value, printHeader, configuration as Csv.CsvConfiguration, cancellationToken).ConfigureAwait(false), _ => throw new InvalidDataException($"Excel type {type} is not a valid Excel type") }; } @@ -78,7 +78,7 @@ public static async Task InsertAsync(this Stream stream, object value, stri return type switch { ExcelType.XLSX => await ExcelExporter.InsertSheetAsync(stream, value, sheetName, printHeader, overwriteSheet, configuration as OpenXmlConfiguration, cancellationToken).ConfigureAwait(false), - ExcelType.CSV => await CsvExporter.AppendToCsvAsync(stream, value, configuration as Csv.CsvConfiguration, cancellationToken).ConfigureAwait(false), + ExcelType.CSV => await CsvExporter.AppendAsync(stream, value, configuration as Csv.CsvConfiguration, cancellationToken).ConfigureAwait(false), _ => throw new InvalidDataException($"Excel type {type} is not a valid Excel type") }; } diff --git a/tests/MiniExcel.Core.Tests/MiniExcelAutoAdjustWidthTests.cs b/tests/MiniExcel.Core.Tests/MiniExcelAutoAdjustWidthTests.cs index db8fa764..84b6e6bc 100644 --- a/tests/MiniExcel.Core.Tests/MiniExcelAutoAdjustWidthTests.cs +++ b/tests/MiniExcel.Core.Tests/MiniExcelAutoAdjustWidthTests.cs @@ -7,7 +7,7 @@ namespace MiniExcelLib.Tests; public class MiniExcelAutoAdjustWidthTests { - private readonly OpenXmlExporter _excelExporter = MiniExcel.Exporter.GetOpenXmlExporter(); + private readonly OpenXmlExporter _excelExporter = MiniExcel.Exporters.GetOpenXmlExporter(); [Fact] public async Task AutoAdjustWidthThrowsExceptionWithoutFastMode_Async() diff --git a/tests/MiniExcel.Core.Tests/MiniExcelIssueAsyncTests.cs b/tests/MiniExcel.Core.Tests/MiniExcelIssueAsyncTests.cs index b62a7692..94dfde91 100644 --- a/tests/MiniExcel.Core.Tests/MiniExcelIssueAsyncTests.cs +++ b/tests/MiniExcel.Core.Tests/MiniExcelIssueAsyncTests.cs @@ -6,9 +6,9 @@ public class MiniExcelIssueAsyncTests(ITestOutputHelper output) { private readonly ITestOutputHelper _output = output; - private readonly OpenXmlImporter _excelImporter = MiniExcel.Importer.GetOpenXmlImporter(); - private readonly OpenXmlExporter _excelExporter = MiniExcel.Exporter.GetOpenXmlExporter(); - private readonly OpenXmlTemplater _excelTemplater = MiniExcel.Templater.GetOpenXmlTemplater(); + private readonly OpenXmlImporter _excelImporter = MiniExcel.Importers.GetOpenXmlImporter(); + private readonly OpenXmlExporter _excelExporter = MiniExcel.Exporters.GetOpenXmlExporter(); + private readonly OpenXmlTemplater _excelTemplater = MiniExcel.Templaters.GetOpenXmlTemplater(); /// /// [SaveAsByTemplate support DateTime custom format · Issue #255 · mini-software/MiniExcel] diff --git a/tests/MiniExcel.Core.Tests/MiniExcelIssueTests.cs b/tests/MiniExcel.Core.Tests/MiniExcelIssueTests.cs index cde83ec5..0bec8f51 100644 --- a/tests/MiniExcel.Core.Tests/MiniExcelIssueTests.cs +++ b/tests/MiniExcel.Core.Tests/MiniExcelIssueTests.cs @@ -12,9 +12,9 @@ public class MiniExcelIssueTests(ITestOutputHelper output) { private readonly ITestOutputHelper _output = output; - private readonly OpenXmlImporter _excelImporter = MiniExcel.Importer.GetOpenXmlImporter(); - private readonly OpenXmlExporter _excelExporter = MiniExcel.Exporter.GetOpenXmlExporter(); - private readonly OpenXmlTemplater _excelTemplater = MiniExcel.Templater.GetOpenXmlTemplater(); + private readonly OpenXmlImporter _excelImporter = MiniExcel.Importers.GetOpenXmlImporter(); + private readonly OpenXmlExporter _excelExporter = MiniExcel.Exporters.GetOpenXmlExporter(); + private readonly OpenXmlTemplater _excelTemplater = MiniExcel.Templaters.GetOpenXmlTemplater(); // private readonly OpenXmlImporter _csvImporter = MiniExcel.Importer.GetCsvImporter(); // private readonly OpenXmlExporter _csvExporter = MiniExcel.Exporter.GetCsvExporter(); @@ -773,7 +773,7 @@ public void TestIssue328() _excelExporter.Export(path.ToString(), value); var rowIndx = 0; - using var reader = _excelImporter.GetExcelDataReader(path.ToString(), true); + using var reader = _excelImporter.GetDataReader(path.ToString(), true); Assert.Equal("id", reader.GetName(0)); Assert.Equal("name", reader.GetName(1)); @@ -3126,13 +3126,13 @@ public void Issue_710() { var values = new[] { new { Column1 = "MiniExcel", Column2 = 1, Column3 = "Test" } }; using var memoryStream = new MemoryStream(); - _excelExporter.Export(memoryStream, values, configuration: new OpenXmlConfiguration + _excelExporter.Export(memoryStream, values, configuration: new OpenXmlConfiguration { FastMode = true }); memoryStream.Position = 0; - using var dataReader = _excelImporter.GetExcelDataReader(memoryStream, useHeaderRow: false); + using var dataReader = _excelImporter.GetDataReader(memoryStream, useHeaderRow: false); dataReader.Read(); for (int i = 0; i < dataReader.FieldCount; i++) diff --git a/tests/MiniExcel.Core.Tests/MiniExcelOpenXmlAsyncTests.cs b/tests/MiniExcel.Core.Tests/MiniExcelOpenXmlAsyncTests.cs index b0b5c241..d0aef62f 100644 --- a/tests/MiniExcel.Core.Tests/MiniExcelOpenXmlAsyncTests.cs +++ b/tests/MiniExcel.Core.Tests/MiniExcelOpenXmlAsyncTests.cs @@ -6,8 +6,8 @@ namespace MiniExcelLib.Tests; public class MiniExcelOpenXmlAsyncTests { - private readonly OpenXmlImporter _excelImporter = MiniExcel.Importer.GetOpenXmlImporter(); - private readonly OpenXmlExporter _excelExporter = MiniExcel.Exporter.GetOpenXmlExporter(); + private readonly OpenXmlImporter _excelImporter = MiniExcel.Importers.GetOpenXmlImporter(); + private readonly OpenXmlExporter _excelExporter = MiniExcel.Exporters.GetOpenXmlExporter(); [Fact] public async Task SaveAsControlChracter() @@ -1400,18 +1400,17 @@ public async Task SaveAsByMiniExcelDataReader() }; await _excelExporter.ExportAsync(path1.ToString(), values); - await using (IMiniExcelDataReader? reader = _excelImporter.GetExcelDataReader(path1.ToString(), true)) - { - using var path2 = AutoDeletingPath.Create(); - await _excelExporter.ExportAsync(path2.ToString(), reader); - var results = _excelImporter.QueryAsync(path2.ToString()).ToBlockingEnumerable().ToList(); - - Assert.True(results.Count == 2); - Assert.True(results.First().Column1 == "MiniExcel"); - Assert.True(results.First().Column2 == 1); - Assert.True(results.Last().Column1 == "Github"); - Assert.True(results.Last().Column2 == 2); - } + using var path2 = AutoDeletingPath.Create(); + await using IMiniExcelDataReader? reader = _excelImporter.GetDataReader(path1.ToString(), true); + + await _excelExporter.ExportAsync(path2.ToString(), reader); + var results = _excelImporter.QueryAsync(path2.ToString()).ToBlockingEnumerable().ToList(); + + Assert.True(results.Count == 2); + Assert.True(results.First().Column1 == "MiniExcel"); + Assert.True(results.First().Column2 == 1); + Assert.True(results.Last().Column1 == "Github"); + Assert.True(results.Last().Column2 == 2); } [Fact] diff --git a/tests/MiniExcel.Core.Tests/MiniExcelOpenXmlConfigurationTest.cs b/tests/MiniExcel.Core.Tests/MiniExcelOpenXmlConfigurationTest.cs index 0d358148..11ff90a9 100644 --- a/tests/MiniExcel.Core.Tests/MiniExcelOpenXmlConfigurationTest.cs +++ b/tests/MiniExcel.Core.Tests/MiniExcelOpenXmlConfigurationTest.cs @@ -5,8 +5,8 @@ namespace MiniExcelLib.Tests; public class MiniExcelOpenXmlConfigurationTest { - private readonly OpenXmlImporter _excelImporter = MiniExcel.Importer.GetOpenXmlImporter(); - private readonly OpenXmlExporter _excelExporter = MiniExcel.Exporter.GetOpenXmlExporter(); + private readonly OpenXmlImporter _excelImporter = MiniExcel.Importers.GetOpenXmlImporter(); + private readonly OpenXmlExporter _excelExporter = MiniExcel.Exporters.GetOpenXmlExporter(); [Fact] public async Task EnableWriteFilePathTest() { diff --git a/tests/MiniExcel.Core.Tests/MiniExcelOpenXmlMultipleSheetAsyncTests.cs b/tests/MiniExcel.Core.Tests/MiniExcelOpenXmlMultipleSheetAsyncTests.cs index 5efe4448..e204c564 100644 --- a/tests/MiniExcel.Core.Tests/MiniExcelOpenXmlMultipleSheetAsyncTests.cs +++ b/tests/MiniExcel.Core.Tests/MiniExcelOpenXmlMultipleSheetAsyncTests.cs @@ -2,7 +2,7 @@ public class MiniExcelOpenXmlMultipleSheetAsyncTests { - private readonly OpenXmlImporter _excelImporter = MiniExcel.Importer.GetOpenXmlImporter(); + private readonly OpenXmlImporter _excelImporter = MiniExcel.Importers.GetOpenXmlImporter(); [Fact] public async Task SpecifySheetNameQueryTest() diff --git a/tests/MiniExcel.Core.Tests/MiniExcelOpenXmlMultipleSheetTests.cs b/tests/MiniExcel.Core.Tests/MiniExcelOpenXmlMultipleSheetTests.cs index ed974576..9cd0870a 100644 --- a/tests/MiniExcel.Core.Tests/MiniExcelOpenXmlMultipleSheetTests.cs +++ b/tests/MiniExcel.Core.Tests/MiniExcelOpenXmlMultipleSheetTests.cs @@ -5,7 +5,7 @@ namespace MiniExcelLib.Tests; public class MiniExcelOpenXmlMultipleSheetTests { - private readonly OpenXmlImporter _excelImporter = MiniExcel.Importer.GetOpenXmlImporter(); + private readonly OpenXmlImporter _excelImporter = MiniExcel.Importers.GetOpenXmlImporter(); [Fact] public void SpecifySheetNameQueryTest() @@ -254,7 +254,7 @@ public void WriteHiddenSheetTest() using var file = AutoDeletingPath.Create(); var path = file.ToString(); - var rowsWritten = MiniExcel.Exporter.GetOpenXmlExporter().Export(path, sheets, configuration: configuration); + var rowsWritten = MiniExcel.Exporters.GetOpenXmlExporter().Export(path, sheets, configuration: configuration); Assert.Equal(2, rowsWritten.Length); Assert.Equal(2, rowsWritten[0]); diff --git a/tests/MiniExcel.Core.Tests/MiniExcelOpenXmlTests.cs b/tests/MiniExcel.Core.Tests/MiniExcelOpenXmlTests.cs index 9c533edc..64bd1e82 100644 --- a/tests/MiniExcel.Core.Tests/MiniExcelOpenXmlTests.cs +++ b/tests/MiniExcel.Core.Tests/MiniExcelOpenXmlTests.cs @@ -9,8 +9,8 @@ public class MiniExcelOpenXmlTests(ITestOutputHelper output) { private readonly ITestOutputHelper _output = output; - private readonly OpenXmlImporter _excelImporter = MiniExcel.Importer.GetOpenXmlImporter(); - private readonly OpenXmlExporter _excelExporter = MiniExcel.Exporter.GetOpenXmlExporter(); + private readonly OpenXmlImporter _excelImporter = MiniExcel.Importers.GetOpenXmlImporter(); + private readonly OpenXmlExporter _excelExporter = MiniExcel.Exporters.GetOpenXmlExporter(); [Fact] public void GetColumnsTest() diff --git a/tests/MiniExcel.Core.Tests/SaveByTemplate/MiniExcelTemplateAsyncTests.cs b/tests/MiniExcel.Core.Tests/SaveByTemplate/MiniExcelTemplateAsyncTests.cs index 7a946d07..90f894bb 100644 --- a/tests/MiniExcel.Core.Tests/SaveByTemplate/MiniExcelTemplateAsyncTests.cs +++ b/tests/MiniExcel.Core.Tests/SaveByTemplate/MiniExcelTemplateAsyncTests.cs @@ -4,8 +4,8 @@ namespace MiniExcelLib.Tests.SaveByTemplate; public class MiniExcelTemplateAsyncTests { - private readonly OpenXmlImporter _excelImporter = MiniExcel.Importer.GetOpenXmlImporter(); - private readonly OpenXmlTemplater _excelTemplater = MiniExcel.Templater.GetOpenXmlTemplater(); + private readonly OpenXmlImporter _excelImporter = MiniExcel.Importers.GetOpenXmlImporter(); + private readonly OpenXmlTemplater _excelTemplater = MiniExcel.Templaters.GetOpenXmlTemplater(); [Fact] public async Task DatatableTemptyRowTest() diff --git a/tests/MiniExcel.Core.Tests/SaveByTemplate/MiniExcelTemplateTests.cs b/tests/MiniExcel.Core.Tests/SaveByTemplate/MiniExcelTemplateTests.cs index 067427d4..47f7275e 100644 --- a/tests/MiniExcel.Core.Tests/SaveByTemplate/MiniExcelTemplateTests.cs +++ b/tests/MiniExcel.Core.Tests/SaveByTemplate/MiniExcelTemplateTests.cs @@ -7,9 +7,9 @@ namespace MiniExcelLib.Tests.SaveByTemplate; public class MiniExcelTemplateTests { - private readonly OpenXmlImporter _excelImporter = MiniExcel.Importer.GetOpenXmlImporter(); - private readonly OpenXmlExporter _excelExporter = MiniExcel.Exporter.GetOpenXmlExporter(); - private readonly OpenXmlTemplater _excelTemplater = MiniExcel.Templater.GetOpenXmlTemplater(); + private readonly OpenXmlImporter _excelImporter = MiniExcel.Importers.GetOpenXmlImporter(); + private readonly OpenXmlExporter _excelExporter = MiniExcel.Exporters.GetOpenXmlExporter(); + private readonly OpenXmlTemplater _excelTemplater = MiniExcel.Templaters.GetOpenXmlTemplater(); [Fact] public void TestImageType() diff --git a/tests/MiniExcel.Csv.Tests/AsyncIssueTests.cs b/tests/MiniExcel.Csv.Tests/AsyncIssueTests.cs index 083db91a..258654bc 100644 --- a/tests/MiniExcel.Csv.Tests/AsyncIssueTests.cs +++ b/tests/MiniExcel.Csv.Tests/AsyncIssueTests.cs @@ -2,11 +2,11 @@ public class AsyncIssueTests { - private readonly CsvExporter _csvExporter = MiniExcel.Exporter.GetCsvExporter(); - private readonly CsvImporter _csvImporter = MiniExcel.Importer.GetCsvImporter(); + private readonly CsvExporter _csvExporter = MiniExcel.Exporters.GetCsvExporter(); + private readonly CsvImporter _csvImporter = MiniExcel.Importers.GetCsvImporter(); - private readonly OpenXmlExporter _openXmlExporter = MiniExcel.Exporter.GetOpenXmlExporter(); - private readonly OpenXmlImporter _openXmlImporter = MiniExcel.Importer.GetOpenXmlImporter(); + private readonly OpenXmlExporter _openXmlExporter = MiniExcel.Exporters.GetOpenXmlExporter(); + private readonly OpenXmlImporter _openXmlImporter = MiniExcel.Importers.GetOpenXmlImporter(); /// /// Csv SaveAs by datareader with encoding default show messy code #253 /// diff --git a/tests/MiniExcel.Csv.Tests/IssueTests.cs b/tests/MiniExcel.Csv.Tests/IssueTests.cs index c1bd3245..4df8c500 100644 --- a/tests/MiniExcel.Csv.Tests/IssueTests.cs +++ b/tests/MiniExcel.Csv.Tests/IssueTests.cs @@ -2,11 +2,11 @@ public class IssueTests { - private readonly CsvExporter _csvExporter = MiniExcel.Exporter.GetCsvExporter(); - private readonly CsvImporter _csvImporter = MiniExcel.Importer.GetCsvImporter(); + private readonly CsvExporter _csvExporter = MiniExcel.Exporters.GetCsvExporter(); + private readonly CsvImporter _csvImporter = MiniExcel.Importers.GetCsvImporter(); - private readonly OpenXmlExporter _openXmlExporter = MiniExcel.Exporter.GetOpenXmlExporter(); - private readonly OpenXmlImporter _openXmlImporter = MiniExcel.Importer.GetOpenXmlImporter(); + private readonly OpenXmlExporter _openXmlExporter = MiniExcel.Exporters.GetOpenXmlExporter(); + private readonly OpenXmlImporter _openXmlImporter = MiniExcel.Importers.GetOpenXmlImporter(); [Fact] public void TestPR10() @@ -74,7 +74,7 @@ public void TestIssueI4X92G() } { var value = new { ID = 3, Name = "Mike", InDate = new DateTime(2021, 04, 23) }; - var rowsWritten = _csvExporter.AppendToCsv(path, value); + var rowsWritten = _csvExporter.Append(path, value); Assert.Equal(1, rowsWritten); var content = File.ReadAllText(path); @@ -94,7 +94,7 @@ public void TestIssueI4X92G() new { ID=4,Name ="Frank",InDate=new DateTime(2021,06,07)}, new { ID=5,Name ="Gloria",InDate=new DateTime(2022,05,03)}, }; - var rowsWritten = _csvExporter.AppendToCsv(path, value); + var rowsWritten = _csvExporter.Append(path, value); Assert.Equal(2, rowsWritten); var content = File.ReadAllText(path); diff --git a/tests/MiniExcel.Csv.Tests/MiniExcelCsvAsycTests.cs b/tests/MiniExcel.Csv.Tests/MiniExcelCsvAsycTests.cs index 032f3756..0231160a 100644 --- a/tests/MiniExcel.Csv.Tests/MiniExcelCsvAsycTests.cs +++ b/tests/MiniExcel.Csv.Tests/MiniExcelCsvAsycTests.cs @@ -2,8 +2,8 @@ public class MiniExcelCsvAsycTests { - private readonly CsvExporter _csvExporter = MiniExcel.Exporter.GetCsvExporter(); - private readonly CsvImporter _csvImporter = MiniExcel.Importer.GetCsvImporter(); + private readonly CsvExporter _csvExporter = MiniExcel.Exporters.GetCsvExporter(); + private readonly CsvImporter _csvImporter = MiniExcel.Importers.GetCsvImporter(); [Fact] public async Task Gb2312_Encoding_Read_Test() diff --git a/tests/MiniExcel.Csv.Tests/MiniExcelCsvTests.cs b/tests/MiniExcel.Csv.Tests/MiniExcelCsvTests.cs index 8105be36..4fe12e0b 100644 --- a/tests/MiniExcel.Csv.Tests/MiniExcelCsvTests.cs +++ b/tests/MiniExcel.Csv.Tests/MiniExcelCsvTests.cs @@ -2,8 +2,8 @@ public class MiniExcelCsvTests { - private readonly CsvExporter _csvExporter = MiniExcel.Exporter.GetCsvExporter(); - private readonly CsvImporter _csvImporter = MiniExcel.Importer.GetCsvImporter(); + private readonly CsvExporter _csvExporter = MiniExcel.Exporters.GetCsvExporter(); + private readonly CsvImporter _csvImporter = MiniExcel.Importers.GetCsvImporter(); [Fact] public void gb2312_Encoding_Read_Test() @@ -495,7 +495,7 @@ private static string MiniExcelGenerateCsv(string value) using (var stream = File.Create(path)) { IEnumerable records = [new { v1 = value, v2 = value }]; - var rowsWritten = MiniExcel.Exporter.GetCsvExporter().Export(stream, records); + var rowsWritten = MiniExcel.Exporters.GetCsvExporter().Export(stream, records); Assert.Equal(1, rowsWritten[0]); } @@ -528,7 +528,7 @@ public async Task InsertCsvTest() } { var value = new { ID = 3, Name = "Mike", InDate = new DateTime(2021, 04, 23) }; - await _csvExporter.AppendToCsvAsync(path, value); + await _csvExporter.AppendAsync(path, value); var content = await File.ReadAllTextAsync(path); Assert.Equal( """ @@ -546,7 +546,7 @@ public async Task InsertCsvTest() new { ID=5,Name ="Gloria",InDate=new DateTime(2022,05,03)}, }; - await _csvExporter.AppendToCsvAsync(path, value); + await _csvExporter.AppendAsync(path, value); var content = await File.ReadAllTextAsync(path); Assert.Equal( """