├── .config └── dotnet-tools.json ├── .editorconfig ├── .fantomasignore ├── .gitattributes ├── .github └── ISSUE_TEMPLATE.md ├── .gitignore ├── .paket └── Paket.Restore.targets ├── DEVGUIDE.md ├── Directory.Build.props ├── ExcelProvider.sln ├── LICENSE.txt ├── README.md ├── RELEASE_NOTES.md ├── appveyor.yml ├── build.cmd ├── build.fsx ├── build.shell ├── docs ├── DataTypes.xlsx ├── DataTypesNoHeader.xlsx ├── MultipleRegions.xlsx ├── MultipleSheets.xlsx ├── cells.fsx ├── getting-started.fsx ├── headers.fsx ├── images │ ├── DataTypes.png │ ├── DataTypesNoHeader.png │ ├── Excel.png │ ├── MultSheets.png │ ├── TypedExcel.png │ ├── logo-template.pdn │ └── logo.png ├── index.fsx ├── ranges.fsx ├── rows.fsx └── sheets.fsx ├── global.json ├── lib └── README.md ├── nuget └── paket.template ├── paket.dependencies ├── paket.lock ├── src ├── ExcelProvider.DesignTime │ ├── AssemblyInfo.fs │ ├── ExcelProvider.DesignTime.fs │ ├── ExcelProvider.DesignTime.fsproj │ └── paket.references └── ExcelProvider.Runtime │ ├── AssemblyInfo.fs │ ├── ExcelProvider.Runtime.fs │ ├── ExcelProvider.Runtime.fsproj │ └── paket.references └── tests └── ExcelProvider.Tests ├── App.config ├── BookTest.xls ├── BookTestDifferentData.xls ├── BookTestWithHeader.xls ├── DataTypes.xlsx ├── DataTypesNoHeader.xlsx ├── DifferentMainSheet.xlsx ├── ExcelProvider.Tests.fs ├── ExcelProvider.Tests.fsproj ├── MixedDataTypes.xlsx ├── MultilineHeader.xlsx ├── MultipleRegions.xlsx ├── MultipleSheets.xlsx └── paket.references /.config/dotnet-tools.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": 1, 3 | "isRoot": true, 4 | "tools": { 5 | "fake-cli": { 6 | "version": "6.1.1", 7 | "commands": [ 8 | "fake" 9 | ] 10 | }, 11 | "paket": { 12 | "version": "8.0.3", 13 | "commands": [ 14 | "paket" 15 | ] 16 | }, 17 | "fsdocs-tool": { 18 | "version": "20.0.1", 19 | "commands": [ 20 | "fsdocs" 21 | ] 22 | }, 23 | "fantomas": { 24 | "version": "6.3.13", 25 | "commands": [ 26 | "fantomas" 27 | ] 28 | } 29 | } 30 | } -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # http://editorconfig.org 2 | root = true 3 | 4 | [*] 5 | indent_style = space 6 | indent_size = 4 7 | end_of_line = lf 8 | charset = utf-8 9 | trim_trailing_whitespace = true 10 | insert_final_newline = true 11 | 12 | [*.fsproj] 13 | indent_size = 2 14 | 15 | [*.md] 16 | trim_trailing_whitespace = false 17 | -------------------------------------------------------------------------------- /.fantomasignore: -------------------------------------------------------------------------------- 1 | paket-files/ 2 | tests/ 3 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files 2 | * text=auto 3 | 4 | # Custom for Visual Studio 5 | *.cs diff=csharp text=auto eol=lf 6 | *.vb diff=csharp text=auto eol=lf 7 | *.fs diff=csharp text=auto eol=lf 8 | *.fsi diff=csharp text=auto eol=lf 9 | *.fsx diff=csharp text=auto eol=lf 10 | *.sln text eol=crlf merge=union 11 | *.csproj merge=union 12 | *.vbproj merge=union 13 | *.fsproj merge=union 14 | *.dbproj merge=union 15 | 16 | # Standard to msysgit 17 | *.doc diff=astextplain 18 | *.DOC diff=astextplain 19 | *.docx diff=astextplain 20 | *.DOCX diff=astextplain 21 | *.dot diff=astextplain 22 | *.DOT diff=astextplain 23 | *.pdf diff=astextplain 24 | *.PDF diff=astextplain 25 | *.rtf diff=astextplain 26 | *.RTF diff=astextplain 27 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | ### Description 2 | 3 | Please provide a succinct description of your issue. 4 | 5 | ### Repro steps 6 | 7 | Please provide the steps required to reproduce the problem 8 | 9 | 1. Step A 10 | 11 | 2. Step B 12 | 13 | ### Expected behavior 14 | 15 | Please provide a description of the behavior you expect. 16 | 17 | ### Actual behavior 18 | 19 | Please provide a description of the actual behavior you observe. 20 | 21 | ### Known workarounds 22 | 23 | Please provide a description of any known workarounds. 24 | 25 | ### Related information 26 | 27 | * Operating system 28 | * Branch 29 | * .NET Runtime, CoreCLR or Mono Version 30 | * Performance information, links to performance testing scripts 31 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | ## Ignore Visual Studio temporary files, build results, and 2 | ## files generated by popular Visual Studio add-ons. 3 | 4 | # User-specific files 5 | *.suo 6 | *.user 7 | *.sln.docstates 8 | 9 | # Xamarin Studio / monodevelop user-specific 10 | *.userprefs 11 | *.dll.mdb 12 | *.exe.mdb 13 | 14 | # Build results 15 | 16 | [Dd]ebug/ 17 | [Rr]elease/ 18 | x64/ 19 | build/ 20 | [Bb]in/ 21 | [Oo]bj/ 22 | 23 | # MSTest test Results 24 | [Tt]est[Rr]esult*/ 25 | [Bb]uild[Ll]og.* 26 | 27 | *_i.c 28 | *_p.c 29 | *.ilk 30 | *.meta 31 | *.obj 32 | *.pch 33 | *.pdb 34 | *.pgc 35 | *.pgd 36 | *.rsp 37 | *.sbr 38 | *.tlb 39 | *.tli 40 | *.tlh 41 | *.tmp 42 | *.tmp_proj 43 | *.log 44 | *.vspscc 45 | *.vssscc 46 | .builds 47 | *.pidb 48 | *.log 49 | *.scc 50 | 51 | # Visual C++ cache files 52 | ipch/ 53 | *.aps 54 | *.ncb 55 | *.opensdf 56 | *.sdf 57 | *.cachefile 58 | 59 | # Visual Studio profiler 60 | *.psess 61 | *.vsp 62 | *.vspx 63 | 64 | # Other Visual Studio data 65 | .vs/ 66 | 67 | # Guidance Automation Toolkit 68 | *.gpState 69 | 70 | # ReSharper is a .NET coding add-in 71 | _ReSharper*/ 72 | *.[Rr]e[Ss]harper 73 | 74 | # TeamCity is a build add-in 75 | _TeamCity* 76 | 77 | # DotCover is a Code Coverage Tool 78 | *.dotCover 79 | 80 | # NCrunch 81 | *.ncrunch* 82 | .*crunch*.local.xml 83 | 84 | # Installshield output folder 85 | [Ee]xpress/ 86 | 87 | # DocProject is a documentation generator add-in 88 | DocProject/buildhelp/ 89 | DocProject/Help/*.HxT 90 | DocProject/Help/*.HxC 91 | DocProject/Help/*.hhc 92 | DocProject/Help/*.hhk 93 | DocProject/Help/*.hhp 94 | DocProject/Help/Html2 95 | DocProject/Help/html 96 | 97 | # Click-Once directory 98 | publish/ 99 | 100 | # Publish Web Output 101 | *.Publish.xml 102 | 103 | # Enable nuget.exe in the .nuget folder (though normally executables are not tracked) 104 | !.nuget/NuGet.exe 105 | 106 | # Windows Azure Build Output 107 | csx 108 | *.build.csdef 109 | 110 | # Windows Store app package directory 111 | AppPackages/ 112 | 113 | # Others 114 | sql/ 115 | *.Cache 116 | ClientBin/ 117 | [Ss]tyle[Cc]op.* 118 | ~$* 119 | *~ 120 | *.dbmdl 121 | *.[Pp]ublish.xml 122 | *.pfx 123 | *.publishsettings 124 | 125 | # RIA/Silverlight projects 126 | Generated_Code/ 127 | 128 | # Backup & report files from converting an old project file to a newer 129 | # Visual Studio version. Backup files are not needed, because we have git ;-) 130 | _UpgradeReport_Files/ 131 | Backup*/ 132 | UpgradeLog*.XML 133 | UpgradeLog*.htm 134 | 135 | # SQL Server files 136 | App_Data/*.mdf 137 | App_Data/*.ldf 138 | 139 | 140 | #LightSwitch generated files 141 | GeneratedArtifacts/ 142 | _Pvt_Extensions/ 143 | ModelManifest.xml 144 | 145 | # ========================= 146 | # Windows detritus 147 | # ========================= 148 | 149 | # Windows image file caches 150 | Thumbs.db 151 | ehthumbs.db 152 | 153 | # Folder config file 154 | Desktop.ini 155 | 156 | # Recycle Bin used on file shares 157 | $RECYCLE.BIN/ 158 | 159 | # Mac desktop service store files 160 | .DS_Store 161 | 162 | # =================================================== 163 | # Exclude F# project specific directories and files 164 | # =================================================== 165 | 166 | # NuGet Packages Directory 167 | packages/ 168 | 169 | # Generated documentation items from fsdocs 170 | docs/output/ 171 | output/ 172 | tmp/ 173 | .fsdocs/ 174 | 175 | # Temp folder used for publishing docs 176 | temp/ 177 | 178 | # Test results produced by build 179 | TestResult.xml 180 | 181 | # Nuget outputs 182 | nuget/*.nupkg 183 | release.cmd 184 | release.sh 185 | localpackages/ 186 | paket-files 187 | *.orig 188 | docs/content/license.md 189 | docs/content/release-notes.md 190 | .fake 191 | docs/tools/FSharp.Formatting.svclog 192 | *.bak 193 | 194 | # Ionide is a plugin for Fsharp for VSCODE 195 | .ionide/ 196 | 197 | # IDEA is the extension for Jetbrains IDE's 198 | /.idea/.idea.ExcelProvider/.idea 199 | -------------------------------------------------------------------------------- /.paket/Paket.Restore.targets: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | $(MSBuildAllProjects);$(MSBuildThisFileFullPath) 8 | 9 | $(MSBuildVersion) 10 | 15.0.0 11 | false 12 | true 13 | 14 | true 15 | $(MSBuildThisFileDirectory) 16 | $(MSBuildThisFileDirectory)..\ 17 | $(PaketRootPath)paket-files\paket.restore.cached 18 | $(PaketRootPath)paket.lock 19 | classic 20 | proj 21 | assembly 22 | native 23 | /Library/Frameworks/Mono.framework/Commands/mono 24 | mono 25 | 26 | 27 | $(PaketRootPath)paket.bootstrapper.exe 28 | $(PaketToolsPath)paket.bootstrapper.exe 29 | $([System.IO.Path]::GetDirectoryName("$(PaketBootStrapperExePath)"))\ 30 | 31 | "$(PaketBootStrapperExePath)" 32 | $(MonoPath) --runtime=v4.0.30319 "$(PaketBootStrapperExePath)" 33 | 34 | 35 | 36 | 37 | true 38 | true 39 | 40 | 41 | True 42 | 43 | 44 | False 45 | 46 | $(BaseIntermediateOutputPath.TrimEnd('\').TrimEnd('\/')) 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | $(PaketRootPath)paket 56 | $(PaketToolsPath)paket 57 | 58 | 59 | 60 | 61 | 62 | $(PaketRootPath)paket.exe 63 | $(PaketToolsPath)paket.exe 64 | 65 | 66 | 67 | 68 | 69 | <_DotnetToolsJson Condition="Exists('$(PaketRootPath)/.config/dotnet-tools.json')">$([System.IO.File]::ReadAllText("$(PaketRootPath)/.config/dotnet-tools.json")) 70 | <_ConfigContainsPaket Condition=" '$(_DotnetToolsJson)' != ''">$(_DotnetToolsJson.Contains('"paket"')) 71 | <_ConfigContainsPaket Condition=" '$(_ConfigContainsPaket)' == ''">false 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | <_PaketCommand>dotnet paket 83 | 84 | 85 | 86 | 87 | 88 | $(PaketToolsPath)paket 89 | $(PaketBootStrapperExeDir)paket 90 | 91 | 92 | paket 93 | 94 | 95 | 96 | 97 | <_PaketExeExtension>$([System.IO.Path]::GetExtension("$(PaketExePath)")) 98 | <_PaketCommand Condition=" '$(_PaketCommand)' == '' AND '$(_PaketExeExtension)' == '.dll' ">dotnet "$(PaketExePath)" 99 | <_PaketCommand Condition=" '$(_PaketCommand)' == '' AND '$(OS)' != 'Windows_NT' AND '$(_PaketExeExtension)' == '.exe' ">$(MonoPath) --runtime=v4.0.30319 "$(PaketExePath)" 100 | <_PaketCommand Condition=" '$(_PaketCommand)' == '' ">"$(PaketExePath)" 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | true 122 | $(NoWarn);NU1603;NU1604;NU1605;NU1608 123 | false 124 | true 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | $([System.IO.File]::ReadAllText('$(PaketRestoreCacheFile)')) 134 | 135 | 136 | 137 | 138 | 139 | 141 | $([System.Text.RegularExpressions.Regex]::Split(`%(Identity)`, `": "`)[0].Replace(`"`, ``).Replace(` `, ``)) 142 | $([System.Text.RegularExpressions.Regex]::Split(`%(Identity)`, `": "`)[1].Replace(`"`, ``).Replace(` `, ``)) 143 | 144 | 145 | 146 | 147 | %(PaketRestoreCachedKeyValue.Value) 148 | %(PaketRestoreCachedKeyValue.Value) 149 | 150 | 151 | 152 | 153 | true 154 | false 155 | true 156 | 157 | 158 | 162 | 163 | true 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | $(PaketIntermediateOutputPath)\$(MSBuildProjectFile).paket.references.cached 183 | 184 | $(MSBuildProjectFullPath).paket.references 185 | 186 | $(MSBuildProjectDirectory)\$(MSBuildProjectName).paket.references 187 | 188 | $(MSBuildProjectDirectory)\paket.references 189 | 190 | false 191 | true 192 | true 193 | references-file-or-cache-not-found 194 | 195 | 196 | 197 | 198 | $([System.IO.File]::ReadAllText('$(PaketReferencesCachedFilePath)')) 199 | $([System.IO.File]::ReadAllText('$(PaketOriginalReferencesFilePath)')) 200 | references-file 201 | false 202 | 203 | 204 | 205 | 206 | false 207 | 208 | 209 | 210 | 211 | true 212 | target-framework '$(TargetFramework)' or '$(TargetFrameworks)' files @(PaketResolvedFilePaths) 213 | 214 | 215 | 216 | 217 | 218 | 219 | 220 | 221 | 222 | 223 | false 224 | true 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | 233 | 234 | 235 | $([System.String]::Copy('%(PaketReferencesFileLines.Identity)').Split(',').Length) 236 | $([System.String]::Copy('%(PaketReferencesFileLines.Identity)').Split(',')[0]) 237 | $([System.String]::Copy('%(PaketReferencesFileLines.Identity)').Split(',')[1]) 238 | $([System.String]::Copy('%(PaketReferencesFileLines.Identity)').Split(',')[4]) 239 | $([System.String]::Copy('%(PaketReferencesFileLines.Identity)').Split(',')[5]) 240 | $([System.String]::Copy('%(PaketReferencesFileLines.Identity)').Split(',')[6]) 241 | $([System.String]::Copy('%(PaketReferencesFileLines.Identity)').Split(',')[7]) 242 | $([System.String]::Copy('%(PaketReferencesFileLines.Identity)').Split(',')[8]) 243 | 244 | 245 | %(PaketReferencesFileLinesInfo.PackageVersion) 246 | All 247 | runtime 248 | $(ExcludeAssets);contentFiles 249 | $(ExcludeAssets);build;buildMultitargeting;buildTransitive 250 | %(PaketReferencesFileLinesInfo.Aliases) 251 | true 252 | true 253 | 254 | 255 | 256 | 257 | 258 | $(PaketIntermediateOutputPath)/$(MSBuildProjectFile).paket.clitools 259 | 260 | 261 | 262 | 263 | 264 | 265 | 266 | 267 | $([System.String]::Copy('%(PaketCliToolFileLines.Identity)').Split(',')[0]) 268 | $([System.String]::Copy('%(PaketCliToolFileLines.Identity)').Split(',')[1]) 269 | 270 | 271 | %(PaketCliToolFileLinesInfo.PackageVersion) 272 | 273 | 274 | 275 | 279 | 280 | 281 | 282 | 283 | 284 | false 285 | 286 | 287 | 288 | 289 | 290 | <_NuspecFilesNewLocation Include="$(PaketIntermediateOutputPath)\$(Configuration)\*.nuspec"/> 291 | 292 | 293 | 294 | 295 | 296 | $(MSBuildProjectDirectory)/$(MSBuildProjectFile) 297 | true 298 | false 299 | true 300 | false 301 | true 302 | false 303 | true 304 | false 305 | true 306 | false 307 | true 308 | $(PaketIntermediateOutputPath)\$(Configuration) 309 | $(PaketIntermediateOutputPath) 310 | 311 | 312 | 313 | <_NuspecFiles Include="$(AdjustedNuspecOutputPath)\*.$(PackageVersion.Split(`+`)[0]).nuspec"/> 314 | 315 | 316 | 317 | 318 | 319 | 320 | 321 | 322 | 323 | 324 | 325 | 373 | 374 | 423 | 424 | 469 | 470 | 514 | 515 | 558 | 559 | 560 | 561 | -------------------------------------------------------------------------------- /DEVGUIDE.md: -------------------------------------------------------------------------------- 1 | ### Manual push of packages 2 | 3 | You can push the packages if you have permissions, either automatically using ``build Release`` or manually 4 | 5 | .\Build BuildPackage 6 | set APIKEY=... 7 | ..\fsharp\.nuget\nuget.exe push bin\ExcelProvider.1.0.1.nupkg %APIKEY% -Source https://nuget.org 8 | 9 | git tag 1.0.1 10 | git push https://github.com/fsprojects/ExcelProvider --tags 11 | -------------------------------------------------------------------------------- /Directory.Build.props: -------------------------------------------------------------------------------- 1 | 2 | 3 | https://github.com/fsprojects/ExcelProvider 4 | https://fsprojects.github.io/ExcelProvider/ 5 | 6 | 7 | 8 | true 9 | all 10 | low 11 | 12 | 13 | 14 | https://github.com/fsprojects/ExcelProvider/blob/master/LICENSE.txt 15 | https://github.com/fsprojects/ExcelProvider/blob/master/RELEASE_NOTES.md 16 | images/logo.png 17 | 18 | 19 | -------------------------------------------------------------------------------- /ExcelProvider.sln: -------------------------------------------------------------------------------- 1 | Microsoft Visual Studio Solution File, Format Version 12.00 2 | # Visual Studio 2013 3 | VisualStudioVersion = 12.0.31101.0 4 | MinimumVisualStudioVersion = 10.0.40219.1 5 | Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".paket", ".paket", "{63297B98-5CED-492C-A5B7-A5B4F73CF142}" 6 | ProjectSection(SolutionItems) = preProject 7 | paket.dependencies = paket.dependencies 8 | paket.lock = paket.lock 9 | EndProjectSection 10 | EndProject 11 | Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "docs", "docs", "{A6A6AF7D-D6E3-442D-9B1E-58CC91879BE1}" 12 | EndProject 13 | Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "ExcelProvider.Runtime", "src\ExcelProvider.Runtime\ExcelProvider.Runtime.fsproj", "{7E90D6CE-A10B-4858-A5BC-41DF7250CBCA}" 14 | EndProject 15 | Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "ExcelProvider.DesignTime", "src\ExcelProvider.DesignTime\ExcelProvider.DesignTime.fsproj", "{7E90D6CE-A10B-4858-A5BC-41DF7250CBCB}" 16 | EndProject 17 | Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "project", "project", "{BF60BC93-E09B-4E5F-9D85-95A519479D54}" 18 | ProjectSection(SolutionItems) = preProject 19 | build.fsx = build.fsx 20 | README.md = README.md 21 | RELEASE_NOTES.md = RELEASE_NOTES.md 22 | EndProjectSection 23 | EndProject 24 | Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tools", "tools", "{83F16175-43B1-4C90-A1EE-8E351C33435D}" 25 | ProjectSection(SolutionItems) = preProject 26 | docs\tools\generate.fsx = docs\tools\generate.fsx 27 | docs\tools\templates\template.cshtml = docs\tools\templates\template.cshtml 28 | EndProjectSection 29 | EndProject 30 | Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "content", "content", "{8E6D5255-776D-4B61-85F9-73C37AA1FB9A}" 31 | ProjectSection(SolutionItems) = preProject 32 | docs\content\cells.fsx = docs\content\cells.fsx 33 | docs\content\DataTypes.xlsx = docs\content\DataTypes.xlsx 34 | docs\content\DataTypesNoHeader.xlsx = docs\content\DataTypesNoHeader.xlsx 35 | docs\content\getting-started.fsx = docs\content\getting-started.fsx 36 | docs\content\headers.fsx = docs\content\headers.fsx 37 | docs\content\index.fsx = docs\content\index.fsx 38 | docs\content\license.md = docs\content\license.md 39 | docs\content\MultipleRegions.xlsx = docs\content\MultipleRegions.xlsx 40 | docs\content\MultipleSheets.xlsx = docs\content\MultipleSheets.xlsx 41 | docs\content\ranges.fsx = docs\content\ranges.fsx 42 | docs\content\release-notes.md = docs\content\release-notes.md 43 | docs\content\rows.fsx = docs\content\rows.fsx 44 | docs\content\sheets.fsx = docs\content\sheets.fsx 45 | EndProjectSection 46 | EndProject 47 | Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{ED8079DD-2B06-4030-9F0F-DC548F98E1C4}" 48 | EndProject 49 | Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "ExcelProvider.Tests", "tests\ExcelProvider.Tests\ExcelProvider.Tests.fsproj", "{E789C72A-5CFD-436B-8EF1-61AA2852A89F}" 50 | EndProject 51 | Global 52 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 53 | Debug|Any CPU = Debug|Any CPU 54 | Release|Any CPU = Release|Any CPU 55 | EndGlobalSection 56 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 57 | {7E90D6CE-A10B-4858-A5BC-41DF7250CBCA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 58 | {7E90D6CE-A10B-4858-A5BC-41DF7250CBCA}.Debug|Any CPU.Build.0 = Debug|Any CPU 59 | {7E90D6CE-A10B-4858-A5BC-41DF7250CBCA}.Release|Any CPU.ActiveCfg = Release|Any CPU 60 | {7E90D6CE-A10B-4858-A5BC-41DF7250CBCA}.Release|Any CPU.Build.0 = Release|Any CPU 61 | {7E90D6CE-A10B-4858-A5BC-41DF7250CBCB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 62 | {7E90D6CE-A10B-4858-A5BC-41DF7250CBCB}.Debug|Any CPU.Build.0 = Debug|Any CPU 63 | {7E90D6CE-A10B-4858-A5BC-41DF7250CBCB}.Release|Any CPU.ActiveCfg = Release|Any CPU 64 | {7E90D6CE-A10B-4858-A5BC-41DF7250CBCB}.Release|Any CPU.Build.0 = Release|Any CPU 65 | {E789C72A-5CFD-436B-8EF1-61AA2852A89F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 66 | {E789C72A-5CFD-436B-8EF1-61AA2852A89F}.Debug|Any CPU.Build.0 = Debug|Any CPU 67 | {E789C72A-5CFD-436B-8EF1-61AA2852A89F}.Release|Any CPU.ActiveCfg = Release|Any CPU 68 | {E789C72A-5CFD-436B-8EF1-61AA2852A89F}.Release|Any CPU.Build.0 = Release|Any CPU 69 | EndGlobalSection 70 | GlobalSection(SolutionProperties) = preSolution 71 | HideSolutionNode = FALSE 72 | EndGlobalSection 73 | GlobalSection(NestedProjects) = preSolution 74 | {83F16175-43B1-4C90-A1EE-8E351C33435D} = {A6A6AF7D-D6E3-442D-9B1E-58CC91879BE1} 75 | {8E6D5255-776D-4B61-85F9-73C37AA1FB9A} = {A6A6AF7D-D6E3-442D-9B1E-58CC91879BE1} 76 | {E789C72A-5CFD-436B-8EF1-61AA2852A89F} = {ED8079DD-2B06-4030-9F0F-DC548F98E1C4} 77 | EndGlobalSection 78 | EndGlobal 79 | -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | This is free and unencumbered software released into the public domain. 2 | 3 | Anyone is free to copy, modify, publish, use, compile, sell, or 4 | distribute this software, either in source code form or as a compiled 5 | binary, for any purpose, commercial or non-commercial, and by any 6 | means. 7 | 8 | In jurisdictions that recognize copyright laws, the author or authors 9 | of this software dedicate any and all copyright interest in the 10 | software to the public domain. We make this dedication for the benefit 11 | of the public at large and to the detriment of our heirs and 12 | successors. We intend this dedication to be an overt act of 13 | relinquishment in perpetuity of all present and future rights to this 14 | software under copyright law. 15 | 16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 17 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 18 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 19 | IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR 20 | OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 21 | ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 22 | OTHER DEALINGS IN THE SOFTWARE. 23 | 24 | For more information, please refer to 25 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ExcelProvider [![NuGet Status](http://img.shields.io/nuget/v/ExcelProvider.svg?style=flat)](https://www.nuget.org/packages/ExcelProvider/) 2 | 3 | ## Overview 4 | 5 | This library is for the .NET platform implementing a read-only Excel type provider. Documentation available here. 6 | 7 | ## Building 8 | 9 | * Windows: Run ./build.cmd -t "Build" (see build.fsx for more options to pass in as arguments after -t) 10 | * Requires dotnet core 6.0.425 or higher 6.0 level sdk to be installed. 11 | * See DEVGUIDE.md for more information 12 | 13 | ## Maintainer(s) 14 | 15 | * [@JohnDoeKyrgyz](https://github.com/JohnDoeKyrgyz) 16 | * [@quintusm](https://github.com/quintusm) 17 | 18 | The default maintainer account for projects under "fsprojects" is [@fsprojectsgit](https://github.com/fsprojectsgit) - F# Community Project Incubation Space (repo management) 19 | -------------------------------------------------------------------------------- /RELEASE_NOTES.md: -------------------------------------------------------------------------------- 1 | ### 3.0.0 2 | 3 | * Fix issue [#41](https://github.com/fsprojects/ExcelProvider/issues/41). The type provider should no longer return an extra blank row with the data as it did before. 4 | * Fix issue [#14](https://github.com/fsprojects/ExcelProvider/issues/41) and related behaviour. We are now better at handling casting of data to the detected data type if there are rows which have data of different data types. 5 | * Both of the above fixes where contributed by new contributor [Matthew Dupont](https://github.com/mjdupont). His contributions are very much appreciated. 6 | * Both fixes, but especially for #41, can break existing code logic. Please test your code after upgrading to this version. 7 | 8 | ### 2.1.0 9 | 10 | * Fix issue [#77](https://github.com/fsprojects/ExcelProvider/issues/77). The type provider will no longer revert to the first sheet if the sheet name provided does not exist. Instead, the code will not compile. 11 | * The documentation site has been updated and a number of small issues fixed. 12 | * Dependencies have been updated to the latest versions. 13 | * Started using Fantomas. All files now formatted with Fantomas. 14 | * Some build targets in build.fsx have been updated/restored i.e. Format, CheckFormat, Nuget, CleanDocs, GenerateDocs 15 | 16 | 17 | 18 | #### 2.1.0-rc2 19 | 20 | * Remove included System.Runtime.CompilerServices and related packages that somehow got included in the nuget package 21 | 22 | 23 | #### 2.1.0-rc1 24 | 25 | * Fix issue [#77](https://github.com/fsprojects/ExcelProvider/issues/77). The type provider will no longer revert to the first sheet if the sheet name is not provided. Instead, it will throw an exception. 26 | 27 | #### 2.0.0 28 | 29 | * See the changes for the various release candidates below. 30 | 31 | #### 2.0.0-rc3 32 | 33 | * Add ability to read from stream instead of file 34 | 35 | #### 2.0.0-rc2 36 | 37 | * Add improved error messages when an invalid cast is attempted 38 | 39 | #### 2.0.0-rc1 40 | 41 | * Only build for NetStandard 2.0. (reason for bump to V2) 42 | * Convert paket to use dotnet tools infrastructure. 43 | * Update FSharp.Formatting to version 11.4.2 and using dotnet tools (fsdocs command line). 44 | * Update to dotnet 5.0 which is newest version of dotnet at time of writing. 45 | * Update to FSharp.Core to 4.7.2. 46 | * Fix issue when file locked by another process. 47 | 48 | Still to be done in modernising the build infrastructure: 49 | * Update the documentation generation and publishing. 50 | * Update the publishing of nuget package to Nuget. 51 | * Update the generation of releases on GitHub. 52 | 53 | #### 1.0.1 54 | * Fix bug in nuget package 55 | 56 | #### 1.0.0 57 | * Support .NET Core output 58 | * Support .NET Standard output 59 | * Support running in .NET SDK tools (.NET Core tools) 60 | * Rename primary namespace to `FSharp.Interop.Excel` 61 | 62 | #### 0.9.2 63 | * Update ExcelDataReader 64 | 65 | #### 0.9.1 66 | * Correct dependencies 67 | 68 | #### 0.9.0 69 | * Upgrading ProvidedTypes.fs to latest FSharp.TypeProviders.SDK for https://github.com/fsprojects/ExcelProvider/issues/52 70 | * Give better release notes 71 | 72 | #### 0.8.2 - 05.16.2017 73 | * Upgrading ProvidedTypes.fs from FSharp.TypeProviders.SDK to fix a Mono5 compatibility issue. 74 | 75 | #### 0.8.1 - 02.02.2017 76 | * Clean up created temp folders by disposing ExcelDataReader - https://github.com/fsprojects/ExcelProvider/pull/37 77 | * Upgrade to latest versions of dependencies 78 | ProvidedTypes.fs 79 | ProvidedTypes.fsi 80 | FAKE (4.50) 81 | Octokit (0.24) 82 | 83 | #### 0.8.0 - 14.06.2016 84 | * Support Row.GetValue("column") and handle of out-of-range column indexes explicitly - https://github.com/fsprojects/ExcelProvider/pull/27 85 | 86 | #### 0.7.0 - 20.01.2016 87 | * HasHeaders type provider parameter - https://github.com/fsprojects/ExcelProvider/pull/26 88 | 89 | #### 0.6.0 - 19.01.2016 90 | * BREAKING CHANGE: Update handling of parameters - https://github.com/fsprojects/ExcelProvider/pull/25 91 | 92 | #### 0.5.0 - 09.01.2016 93 | * Using ProjectScaffold infrastructure 94 | * Allow range parameter to take a sheet name - https://github.com/fsprojects/ExcelProvider/pull/18 95 | * BUGFIX: Case insensitive ends with on EndsWith - https://github.com/fsprojects/ExcelProvider/pull/21 96 | * Added unique property name generator for duplicated columns - https://github.com/fsprojects/ExcelProvider/pull/13 97 | * Added support to multiline column names - https://github.com/fsprojects/ExcelProvider/pull/20 98 | * Fixing handling of blank cells. Blank cells are treated as the default value for the inferred column type. 99 | * Upgrading to the latest version of the ExcelDataReader library (2.1.2.3) 100 | * Include nuget package dependencies 101 | 102 | #### 0.1.0 - 20.03.2014 103 | * Upgrading to the latest version of the ExcelDataReader library. 104 | * Handling loading higher version of ICSharpCode.SharpZipLib. 105 | * Defaulting to the first sheet in the spreadsheet if a sheet is not specifically indicated. 106 | * Using a Row type, with a ToString() method 107 | 108 | #### 0.0.1-alpha - 21.02.2014 109 | * Initial release of ExcelProvider 110 | -------------------------------------------------------------------------------- /appveyor.yml: -------------------------------------------------------------------------------- 1 | init: 2 | - git config --global core.autocrlf input 3 | build_script: 4 | - cmd: build.cmd 5 | test: off 6 | image: Visual Studio 2019 7 | version: 0.0.1.{build} 8 | artifacts: 9 | - path: bin 10 | name: bin 11 | -------------------------------------------------------------------------------- /build.cmd: -------------------------------------------------------------------------------- 1 | @echo off 2 | cls 3 | 4 | dotnet tool restore 5 | if errorlevel 1 ( 6 | exit /b %errorlevel% 7 | ) 8 | 9 | dotnet paket restore 10 | if errorlevel 1 ( 11 | exit /b %errorlevel% 12 | ) 13 | 14 | dotnet fake run build.fsx %* -------------------------------------------------------------------------------- /build.fsx: -------------------------------------------------------------------------------- 1 | #r "paket: groupref Build //" 2 | #load ".fake/build.fsx/intellisense.fsx" 3 | 4 | #if !Fake 5 | #r "netstandard" 6 | #endif 7 | 8 | open Fake.Core 9 | open Fake.Core.TargetOperators 10 | open Fake.DotNet 11 | open Fake.IO 12 | open Fake.IO.FileSystemOperators 13 | open Fake.IO.Globbing.Operators 14 | 15 | //open Fake.Git 16 | //open Fake.Testing.NUnit3 17 | //open Fake.ReleaseNotesHelper 18 | //open Fake.UserInputHelper 19 | open System 20 | open System.IO 21 | 22 | Target.initEnvironment () 23 | 24 | 25 | 26 | // -------------------------------------------------------------------------------------- 27 | // START TODO: Provide project-specific details below 28 | // -------------------------------------------------------------------------------------- 29 | 30 | // Information about the project are used 31 | // - for version and project name in generated AssemblyInfo file 32 | // - by the generated NuGet package 33 | // - to run tests and to publish documentation on GitHub gh-pages 34 | // - for documentation, you also need to edit info in "docs/tools/generate.fsx" 35 | 36 | // The name of the project 37 | // (used by attributes in AssemblyInfo, name of a NuGet package and directory in 'src') 38 | let project = "ExcelProvider" 39 | 40 | // Short summary of the project 41 | // (used as description in AssemblyInfo and as a short summary for NuGet package) 42 | let summary = 43 | "This library implements a read-only Excel type provider for Net Standard 2.0." 44 | 45 | 46 | //// Git configuration (used for publishing documentation in gh-pages branch) 47 | //// The profile where the project is posted 48 | //let gitOwner = "fsprojects" 49 | //let gitHome = "https://github.com/" + gitOwner 50 | 51 | //// The name of the project on GitHub 52 | //let gitName = "ExcelProvider" 53 | 54 | //// The url for the raw files hosted 55 | //let gitRaw = environVarOrDefault "gitRaw" "https://raw.github.com/fsprojects" 56 | 57 | Trace.log "--Installing DotNet Core SDK if necessary" 58 | let install = lazy DotNet.install DotNet.Versions.FromGlobalJson 59 | let getSdkPath () = install.Value 60 | Trace.log $"Value of getSdkPath = %A{getSdkPath}" 61 | 62 | 63 | //let exec p args = 64 | // printfn "Executing %s %s" p args 65 | // Shell.Exec(p, args) |> function 0 -> () | d -> failwithf "%s %s exited with error %d" p args d 66 | 67 | // Read additional information from the release notes document 68 | let release = ReleaseNotes.load "RELEASE_NOTES.md" 69 | 70 | // Helper active pattern for project types 71 | let (|Fsproj|) (projFileName: string) = 72 | match projFileName with 73 | | f when f.EndsWith("fsproj") -> Fsproj 74 | | _ -> failwith (sprintf "Project file %s not supported. Unknown project type." projFileName) 75 | 76 | // Generate assembly info files with the right version & up-to-date information 77 | Target.create "AssemblyInfo" (fun _ -> 78 | Trace.log "--Creating new assembly files with appropriate version number and info" 79 | 80 | let getAssemblyInfoAttributes projectName = 81 | [ AssemblyInfo.Title(projectName) 82 | AssemblyInfo.Product project 83 | AssemblyInfo.Description summary 84 | AssemblyInfo.Version release.AssemblyVersion 85 | AssemblyInfo.FileVersion release.AssemblyVersion ] 86 | 87 | let getProjectDetails (projectPath: string) = 88 | let projectName = Path.GetFileNameWithoutExtension(projectPath) 89 | 90 | let directoryName = Path.GetDirectoryName(projectPath) 91 | let assemblyInfoAttributes = getAssemblyInfoAttributes projectName 92 | (projectPath, projectName, directoryName, assemblyInfoAttributes) 93 | 94 | !! "src/**/*.??proj" 95 | |> Seq.map getProjectDetails 96 | |> Seq.iter (fun (projFileName, _, folderName, attributes) -> 97 | match projFileName with 98 | | Fsproj -> 99 | let fileName = folderName + @"/" + "AssemblyInfo.fs" 100 | AssemblyInfoFile.createFSharp fileName attributes)) 101 | 102 | // Copies binaries from default VS location to expected bin folder 103 | // But keeps a subdirectory structure for each project in the 104 | // src folder to support multiple project outputs 105 | Target.create "CopyBinaries" (fun _ -> 106 | Trace.log "-- Copy binaries to desired location" 107 | 108 | !! "src/**/*.??proj" -- "src/**/*.shproj" 109 | |> Seq.map (fun f -> 110 | (let source = (Path.GetDirectoryName f) "bin/Release" 111 | 112 | let target = "bin" (Path.GetFileNameWithoutExtension f) 113 | 114 | source, target)) 115 | |> Seq.iter (fun (fromDir, toDir) -> Shell.copyDir toDir fromDir (fun _ -> true))) 116 | 117 | 118 | // -------------------------------------------------------------------------------------- 119 | // Clean build results 120 | Target.create "Clean" (fun _ -> 121 | Trace.log "--Cleaning various directories" 122 | 123 | !! "bin" 124 | ++ "temp" 125 | ++ "tmp" 126 | ++ "test/bin" 127 | ++ "test/obj" 128 | ++ "src/**/bin" 129 | ++ "src/**/obj" 130 | |> Shell.cleanDirs) 131 | 132 | 133 | 134 | 135 | // -------------------------------------------------------------------------------------- 136 | // Clean the folders created by fsdocs when generating documentation 137 | Target.create "CleanDocs" (fun _ -> !! "output" ++ ".fsdocs" |> Shell.cleanDirs) 138 | 139 | // -------------------------------------------------------------------------------------- 140 | // Build library & test project 141 | 142 | Target.create "Build" (fun _ -> 143 | Trace.log "--Building the binary files for distribution and the test project" 144 | 145 | let setParams (p: DotNet.BuildOptions) = 146 | { p with 147 | Configuration = DotNet.BuildConfiguration.Release } 148 | 149 | DotNet.build setParams "ExcelProvider.sln") 150 | 151 | // -------------------------------------------------------------------------------------- 152 | // Generate the documentation 153 | Target.create "GenerateDocs" (fun _ -> 154 | 155 | let result = 156 | DotNet.exec 157 | id 158 | "fsdocs" 159 | ("build --properties Configuration=Release --strict --eval --clean --parameters fsdocs-package-version " 160 | + release.NugetVersion) 161 | 162 | if not result.OK then 163 | printfn "Errors while generating docs: %A" result.Messages 164 | failwith "Failed to generate docs") 165 | 166 | 167 | 168 | // -------------------------------------------------------------------------------------- 169 | // Run the unit tests using test runner 170 | Target.create "RunTests" (fun _ -> 171 | Trace.log "-- Run the unit tests using test runner" 172 | let testProj = "./tests/ExcelProvider.Tests/ExcelProvider.Tests.fsproj" 173 | 174 | let testOptions (defaults: DotNet.TestOptions) = 175 | { defaults with 176 | Configuration = DotNet.BuildConfiguration.Release } 177 | 178 | DotNet.test testOptions testProj) 179 | 180 | // -------------------------------------------------------------------------------------- 181 | // Build a NuGet package 182 | Target.create "Nuget" (fun _ -> 183 | Trace.log "--Create the Nuget package using Paket pack" 184 | let inline dotnetSimple arg = DotNet.Options.lift install.Value arg 185 | 186 | let exitCode = 187 | DotNet.exec dotnetSimple "paket" "pack --template ./nuget/paket.template ./bin" 188 | 189 | if not exitCode.OK then 190 | failwithf "Process exit code '%d' <> 0. " exitCode.ExitCode) 191 | 192 | //Target "PublishNuget" (fun _ -> 193 | // Paket.Push(fun p -> 194 | // { p with 195 | // WorkingDir = "bin" }) 196 | //) 197 | 198 | 199 | //// -------------------------------------------------------------------------------------- 200 | //// Generate the documentation 201 | 202 | 203 | //let fakePath = "packages" "build" "FAKE" "tools" "FAKE.exe" 204 | //let fakeStartInfo script workingDirectory args fsiargs environmentVars = 205 | // (fun (info: System.Diagnostics.ProcessStartInfo) -> 206 | // info.FileName <- System.IO.Path.GetFullPath fakePath 207 | // info.Arguments <- sprintf "%s --fsiargs -d:FAKE %s \"%s\"" args fsiargs script 208 | // info.WorkingDirectory <- workingDirectory 209 | // let setVar k v = 210 | // info.EnvironmentVariables.[k] <- v 211 | // for (k, v) in environmentVars do 212 | // setVar k v 213 | // setVar "MSBuild" msBuildExe 214 | // setVar "GIT" Git.CommandHelper.gitPath 215 | // setVar "FSI" fsiPath) 216 | 217 | ///// Run the given buildscript with FAKE.exe 218 | //let executeFAKEWithOutput workingDirectory script fsiargs envArgs = 219 | // let exitCode = 220 | // ExecProcessWithLambdas 221 | // (fakeStartInfo script workingDirectory "" fsiargs envArgs) 222 | // TimeSpan.MaxValue false ignore ignore 223 | // System.Threading.Thread.Sleep 1000 224 | // exitCode 225 | 226 | //// Documentation 227 | //let buildDocumentationTarget fsiargs target = 228 | // trace (sprintf "Building documentation (%s), this could take some time, please wait..." target) 229 | // let exit = executeFAKEWithOutput "docs/tools" "generate.fsx" fsiargs ["target", target] 230 | // if exit <> 0 then 231 | // failwith "generating reference documentation failed" 232 | // () 233 | 234 | //Target "GenerateReferenceDocs" (fun _ -> 235 | // buildDocumentationTarget "-d:RELEASE -d:REFERENCE" "Default" 236 | //) 237 | 238 | //let generateHelp' fail debug = 239 | // let args = 240 | // if debug then "--define:HELP" 241 | // else "--define:RELEASE --define:HELP" 242 | // try 243 | // buildDocumentationTarget args "Default" 244 | // traceImportant "Help generated" 245 | // with 246 | // | e when not fail -> 247 | // traceImportant "generating help documentation failed" 248 | 249 | //let generateHelp fail = 250 | // generateHelp' fail false 251 | 252 | //Target "GenerateHelp" (fun _ -> 253 | // DeleteFile "docs/content/release-notes.md" 254 | // CopyFile "docs/content/" "RELEASE_NOTES.md" 255 | // Rename "docs/content/release-notes.md" "docs/content/RELEASE_NOTES.md" 256 | 257 | // DeleteFile "docs/content/license.md" 258 | // CopyFile "docs/content/" "LICENSE.txt" 259 | // Rename "docs/content/license.md" "docs/content/LICENSE.txt" 260 | 261 | // generateHelp true 262 | //) 263 | 264 | //Target "GenerateDocs" DoNothing 265 | 266 | //let createIndexFsx lang = 267 | // let content = """(*** hide ***) 268 | //// This block of code is omitted in the generated HTML documentation. Use 269 | //// it to define helpers that you do not want to show in the documentation. 270 | //#I "../../../bin" 271 | 272 | //(** 273 | //F# Project Scaffold ({0}) 274 | //========================= 275 | //*) 276 | //""" 277 | // let targetDir = "docs/content" lang 278 | // let targetFile = targetDir "index.fsx" 279 | // ensureDirectory targetDir 280 | // System.IO.File.WriteAllText(targetFile, System.String.Format(content, lang)) 281 | 282 | //Target "AddLangDocs" (fun _ -> 283 | // let args = System.Environment.GetCommandLineArgs() 284 | // if args.Length < 4 then 285 | // failwith "Language not specified." 286 | 287 | // args.[3..] 288 | // |> Seq.iter (fun lang -> 289 | // if lang.Length <> 2 && lang.Length <> 3 then 290 | // failwithf "Language must be 2 or 3 characters (ex. 'de', 'fr', 'ja', 'gsw', etc.): %s" lang 291 | 292 | // let templateFileName = "template.cshtml" 293 | // let templateDir = "docs/tools/templates" 294 | // let langTemplateDir = templateDir lang 295 | // let langTemplateFileName = langTemplateDir templateFileName 296 | 297 | // if System.IO.File.Exists(langTemplateFileName) then 298 | // failwithf "Documents for specified language '%s' have already been added." lang 299 | 300 | // ensureDirectory langTemplateDir 301 | // Copy langTemplateDir [ templateDir templateFileName ] 302 | 303 | // createIndexFsx lang) 304 | //) 305 | 306 | //// -------------------------------------------------------------------------------------- 307 | //// Release Scripts 308 | 309 | //Target "ReleaseDocs" (fun _ -> 310 | // let tempDocsDir = "temp/gh-pages" 311 | // CleanDir tempDocsDir 312 | // Repository.cloneSingleBranch "" (gitHome + "/" + gitName + ".git") "gh-pages" tempDocsDir 313 | 314 | // CopyRecursive "docs/output" tempDocsDir true |> tracefn "%A" 315 | // StageAll tempDocsDir 316 | // Git.Commit.Commit tempDocsDir (sprintf "Update generated documentation for version %s" release.NugetVersion) 317 | // Branches.push tempDocsDir 318 | //) 319 | 320 | //#load "paket-files/build/fsharp/FAKE/modules/Octokit/Octokit.fsx" 321 | //open Octokit 322 | 323 | //Target "Release" (fun _ -> 324 | // let user = 325 | // match getBuildParam "github-user" with 326 | // | s when not (String.IsNullOrWhiteSpace s) -> s 327 | // | _ -> getUserInput "Username: " 328 | // let pw = 329 | // match getBuildParam "github-pw" with 330 | // | s when not (String.IsNullOrWhiteSpace s) -> s 331 | // | _ -> getUserPassword "Password: " 332 | // let remote = 333 | // Git.CommandHelper.getGitResult "" "remote -v" 334 | // |> Seq.filter (fun (s: string) -> s.EndsWith("(push)")) 335 | // |> Seq.tryFind (fun (s: string) -> s.Contains(gitOwner + "/" + gitName)) 336 | // |> function None -> gitHome + "/" + gitName | Some (s: string) -> s.Split().[0] 337 | 338 | // StageAll "" 339 | // Git.Commit.Commit "" (sprintf "Bump version to %s" release.NugetVersion) 340 | // Branches.pushBranch "" remote (Information.getBranchName "") 341 | 342 | // Branches.tag "" release.NugetVersion 343 | // Branches.pushTag "" remote release.NugetVersion 344 | 345 | // // release on github 346 | // createClient user pw 347 | // |> createDraft gitOwner gitName release.NugetVersion (release.SemVer.PreRelease <> None) release.Notes 348 | // // TODO: |> uploadFile "PATH_TO_FILE" 349 | // |> releaseDraft 350 | // |> Async.RunSynchronously 351 | //) 352 | 353 | 354 | let sourceFiles = 355 | !! "src/**/*.fs" ++ "src/**/*.fsi" ++ "build.fsx" 356 | -- "src/**/obj/**/*.fs" 357 | -- "src/AssemblyInfo*.fs" 358 | 359 | Target.create "Format" (fun _ -> 360 | let result = 361 | sourceFiles 362 | |> Seq.map (sprintf "\"%s\"") 363 | |> String.concat " " 364 | |> DotNet.exec id "fantomas" 365 | 366 | if not result.OK then 367 | printfn "Errors while formatting all files: %A" result.Messages) 368 | 369 | Target.create "CheckFormat" (fun _ -> 370 | let result = 371 | sourceFiles 372 | |> Seq.map (sprintf "\"%s\"") 373 | |> String.concat " " 374 | |> sprintf "%s --check" 375 | |> DotNet.exec id "fantomas" 376 | 377 | if result.ExitCode = 0 then 378 | Trace.log "No files need formatting" 379 | elif result.ExitCode = 99 then 380 | failwith "Some files need formatting, run `dotnet fake build -t Format` to format them" 381 | else 382 | Trace.logf "Errors while formatting: %A" result.Errors 383 | failwith "Unknown errors while formatting") 384 | 385 | 386 | 387 | Target.create "BuildPackage" ignore 388 | 389 | //// -------------------------------------------------------------------------------------- 390 | //// Run all targets by default. Invoke 'build ' to override 391 | 392 | Target.create "All" ignore 393 | 394 | "Clean" 395 | ==> "AssemblyInfo" 396 | ==> "Format" 397 | ==> "Build" 398 | ==> "RunTests" 399 | ==> "CopyBinaries" 400 | ==> "GenerateDocs" 401 | ==> "All" 402 | // =?> ("ReleaseDocs",isLocalBuild) 403 | 404 | "All" ==> "NuGet" ==> "BuildPackage" 405 | 406 | //"CleanDocs" 407 | // ==> "GenerateHelp" 408 | // ==> "GenerateReferenceDocs" 409 | // ==> "GenerateDocs" 410 | 411 | //"ReleaseDocs" 412 | // ==> "Release" 413 | 414 | //"BuildPackage" 415 | // ==> "PublishNuget" 416 | // ==> "Release" 417 | 418 | Target.runOrDefaultWithArguments "All" 419 | -------------------------------------------------------------------------------- /build.shell: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | dotnet tool restore 3 | dotnet paket restore 4 | dotnet fake build -t Build 5 | -------------------------------------------------------------------------------- /docs/DataTypes.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fsprojects/ExcelProvider/bb1008eb6d1353009b133a88338d45cb96af2952/docs/DataTypes.xlsx -------------------------------------------------------------------------------- /docs/DataTypesNoHeader.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fsprojects/ExcelProvider/bb1008eb6d1353009b133a88338d45cb96af2952/docs/DataTypesNoHeader.xlsx -------------------------------------------------------------------------------- /docs/MultipleRegions.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fsprojects/ExcelProvider/bb1008eb6d1353009b133a88338d45cb96af2952/docs/MultipleRegions.xlsx -------------------------------------------------------------------------------- /docs/MultipleSheets.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fsprojects/ExcelProvider/bb1008eb6d1353009b133a88338d45cb96af2952/docs/MultipleSheets.xlsx -------------------------------------------------------------------------------- /docs/cells.fsx: -------------------------------------------------------------------------------- 1 | (** 2 | --- 3 | title: Accessing Cells 4 | category: Documentation 5 | categoryindex: 2 6 | index: 4 7 | --- 8 | *) 9 | 10 | 11 | (*** hide ***) 12 | #r "nuget: ExcelProvider" 13 | 14 | (** 15 | Accessing Cells 16 | =========================== 17 | 18 | To access a particular cell you need to access the relevant row and use the field name which is the value in the first row of the relevant column. 19 | 20 | 21 | Example 22 | ------- 23 | 24 | ![alt text](images/MultSheets.png "Excel sample file with multiple sheets") 25 | 26 | This example demonstrates referencing the first column (with name `Fourth`) on row 4: 27 | 28 | *) 29 | 30 | // reference the type provider 31 | open FSharp.Interop.Excel 32 | 33 | // Let the type provider do it's work 34 | type MultipleSheetsSecond = ExcelFile<"MultipleSheets.xlsx", "B"> 35 | let file = new MultipleSheetsSecond() 36 | let rows = file.Data |> Seq.toArray 37 | let test = rows.[2].Fourth 38 | (** And the variable `test` has the following value: *) 39 | (*** include-value: test ***) 40 | 41 | (** Cells can be accessed dynamically using the zero-based column index or case-sensitive header name: *) 42 | let testByIndex = rows.[2].GetValue 0 43 | let testByHeader = rows.[2].GetValue "Fourth" 44 | (** The variables `testByIndex` and `testByHeader` have the respective values: *) 45 | (*** include-value: testByIndex ***) 46 | (*** include-value: testByHeader ***) 47 | 48 | (** Accessing cell values by index or string header sacrifices type safety; the result signature is `obj`. *) 49 | -------------------------------------------------------------------------------- /docs/getting-started.fsx: -------------------------------------------------------------------------------- 1 | (** 2 | --- 3 | title: Getting Started 4 | category: Documentation 5 | categoryindex: 2 6 | index: 1 7 | --- 8 | *) 9 | 10 | 11 | (*** hide ***) 12 | #r "nuget: ExcelProvider" 13 | 14 | 15 | (** 16 | Getting Started 17 | =========================== 18 | 19 | To start using ExcelProvider simply reference the ExcelProvider NuGet Package. 20 | 21 |
22 |
23 |
24 |
25 |

For use in a project, use the following command in the Package Manager Console:

26 |
PM> Install-Package ExcelProvider
27 |

For use in an F# script, use the following directive:

28 |
#r "nuget: ExcelProvider"
29 |
30 |
31 |
32 |
33 | 34 | 35 | After referencing the package, open `FSharp.Interop.Excel` and you will have access to the Type Provider functionality. 36 | 37 | You can create a type for an individual workbook. The simplest option is to specify just the name of the workbook. 38 | You will then be given typed access to the data held in the first sheet. 39 | The first row of the sheet will be treated as field names and the subsequent rows will be treated as values for these fields. 40 | 41 | Parameters 42 | ---------- 43 | 44 | When creating the type you can specify the following parameters: 45 | 46 | * `FileName` Location of the Excel file. 47 | * `SheetName` Name of sheet containing data. Defaults to first sheet. 48 | * `Range` Specification using `A1:D3` type addresses of one or more ranges. Defaults to use whole sheet. 49 | * `HasHeaders` Whether the range contains the names of the columns as its first line. 50 | * `ForceString` Specifies forcing data to be processed as strings. Defaults to `false`. 51 | 52 | All but the first are optional. 53 | 54 | The parameters can be specified by position or by using the name - for example the following are equivalent: 55 | *) 56 | open FSharp.Interop.Excel 57 | 58 | type MultipleSheets1 = ExcelFile<"MultipleSheets.xlsx", "B"> 59 | type MultipleSheets2 = ExcelFile<"MultipleSheets.xlsx", SheetName="B"> 60 | 61 | 62 | (** 63 | Example 64 | ------- 65 | 66 | This example shows the use of the type provider in an F# script on a sheet containing three rows of data: 67 | 68 | ![alt text](images/DataTypes.png "Excel sample file with different types") 69 | 70 | *) 71 | 72 | // reference the type provider 73 | open FSharp.Interop.Excel 74 | 75 | // Let the type provider do it's work 76 | type DataTypesTest = ExcelFile<"DataTypes.xlsx"> 77 | let file = new DataTypesTest() 78 | let row = file.Data |> Seq.head 79 | let test = row.Float 80 | (** And the variable `test` has the following value: *) 81 | (*** include-value: test ***) 82 | -------------------------------------------------------------------------------- /docs/headers.fsx: -------------------------------------------------------------------------------- 1 | (** 2 | --- 3 | title: Without Headers 4 | category: Documentation 5 | categoryindex: 2 6 | index: 6 7 | --- 8 | *) 9 | 10 | 11 | 12 | (*** hide ***) 13 | #r "nuget: ExcelProvider" 14 | 15 | 16 | (** 17 | Without Headers 18 | =========================== 19 | 20 | To process a sheet which does not include headers you can use the `HasHeaders` parameter. 21 | 22 | This parameter defaults to `true`. 23 | 24 | If you set it to `false`, then all rows are treated as data. 25 | 26 | 27 | Example 28 | ------- 29 | 30 | This example shows the use of the type provider in an F# script on a sheet containing no headers: 31 | 32 | ![alt text](images/DataTypesNoHeader.png "Excel sample file with different types and no headers") 33 | 34 | *) 35 | 36 | // reference the type provider 37 | open FSharp.Interop.Excel 38 | 39 | // Let the type provider do it's work 40 | type DataTypesTest = ExcelFile<"DataTypesNoHeader.xlsx", HasHeaders=false> 41 | let file = new DataTypesTest() 42 | let row = file.Data |> Seq.head 43 | let test = row.Column2 44 | (** And the variable `test` has the following value: *) 45 | (*** include-value: test ***) 46 | -------------------------------------------------------------------------------- /docs/images/DataTypes.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fsprojects/ExcelProvider/bb1008eb6d1353009b133a88338d45cb96af2952/docs/images/DataTypes.png -------------------------------------------------------------------------------- /docs/images/DataTypesNoHeader.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fsprojects/ExcelProvider/bb1008eb6d1353009b133a88338d45cb96af2952/docs/images/DataTypesNoHeader.png -------------------------------------------------------------------------------- /docs/images/Excel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fsprojects/ExcelProvider/bb1008eb6d1353009b133a88338d45cb96af2952/docs/images/Excel.png -------------------------------------------------------------------------------- /docs/images/MultSheets.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fsprojects/ExcelProvider/bb1008eb6d1353009b133a88338d45cb96af2952/docs/images/MultSheets.png -------------------------------------------------------------------------------- /docs/images/TypedExcel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fsprojects/ExcelProvider/bb1008eb6d1353009b133a88338d45cb96af2952/docs/images/TypedExcel.png -------------------------------------------------------------------------------- /docs/images/logo-template.pdn: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fsprojects/ExcelProvider/bb1008eb6d1353009b133a88338d45cb96af2952/docs/images/logo-template.pdn -------------------------------------------------------------------------------- /docs/images/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fsprojects/ExcelProvider/bb1008eb6d1353009b133a88338d45cb96af2952/docs/images/logo.png -------------------------------------------------------------------------------- /docs/index.fsx: -------------------------------------------------------------------------------- 1 | (*** hide ***) 2 | #r "nuget: ExcelProvider" 3 | 4 | (** 5 | # ExcelProvider 6 | 7 | ## Introduction 8 | 9 | ExcelProvider is a library for F# that is designed to make importing or processing data from Excel files easy. It provides a type provider which provides type-safe read-only access to the contents of Excel files. The provider can access data organized in rows and columns in specified sheets or ranges. 10 | 11 |
12 |
13 |
14 |
15 | The library can be installed from NuGet in the usual ways: 16 |

For use in a project, use the following command in the Package Manager Console:

17 |
PM> Install-Package ExcelProvider
18 |

For use in an F# script, use the following directive:

19 |
#r "nuget: ExcelProvider"
20 |
21 |
22 |
23 |
24 | 25 | ## Example 26 | This example demonstrates the use of the type provider: 27 | 28 | ![alt text](images/DataTypes.png "Excel sample file with different types") 29 | 30 | *) 31 | // reference the type provider dll 32 | open FSharp.Interop.Excel 33 | 34 | // Let the type provider do it's work 35 | type DataTypesTest = ExcelFile<"DataTypes.xlsx"> 36 | let file = new DataTypesTest() 37 | let row = file.Data |> Seq.head 38 | 39 | (** 40 | 41 | Now we have strongly typed access to the Excel rows: 42 | 43 | ![alt text](images/TypedExcel.png "Typed Excel sample file") 44 | 45 | *) 46 | 47 | row.String 48 | // [fsi:val it : string = "A"] 49 | row.Float 50 | // [fsi:val it : float = 1.0] 51 | row.Boolean 52 | // [fsi:val it : bool = true] 53 | 54 | 55 | (** 56 | 57 | Documentation 58 | ----------------------- 59 | 60 | For more information see the Documentation pages: 61 | 62 | * [Getting Started](getting-started.html) contains an overview of the library. 63 | * [Accessing Sheets](sheets.html) shows how to access different sheets in a workbook. 64 | * [Accessing Rows](rows.html) shows how to access individual rows in a worksheet. 65 | * [Accessing Cells](cells.html) shows how to access individual cells within a row of a worksheet. 66 | * [Accessing Ranges](ranges.html) shows how to access multiple ranges of data within a worksheet. 67 | * [Without Headers](headers.html) shows how to process sheets which do not include headers. 68 | 69 | 70 | Contributing and copyright 71 | -------------------------- 72 | 73 | The project is hosted on [GitHub][gh] where you can [report issues][issues], fork 74 | the project and submit pull requests. If you're adding new public API, please also 75 | consider adding [samples][content] that can be turned into a documentation. You might 76 | also want to read [library design notes][readme] to understand how it works. 77 | 78 | The library is available under Public Domain license, which allows modification and 79 | redistribution for both commercial and non-commercial purposes. For more information see the 80 | [License file][license] in the GitHub repository. 81 | 82 | [content]: https://github.com/fsprojects/ExcelProvider/tree/master/docs/content 83 | [gh]: https://github.com/fsprojects/ExcelProvider 84 | [issues]: https://github.com/fsprojects/ExcelProvider/issues 85 | [readme]: https://github.com/fsprojects/ExcelProvider/blob/master/README.md 86 | [license]: https://github.com/fsprojects/ExcelProvider/blob/master/LICENSE.txt 87 | *) 88 | -------------------------------------------------------------------------------- /docs/ranges.fsx: -------------------------------------------------------------------------------- 1 | (** 2 | --- 3 | title: Accessing Ranges 4 | category: Documentation 5 | categoryindex: 2 6 | index: 5 7 | --- 8 | *) 9 | 10 | 11 | (*** hide ***) 12 | #r "nuget: ExcelProvider" 13 | 14 | 15 | (** 16 | Accessing Ranges 17 | =========================== 18 | 19 | To access a range you need to specify the range (or ranges) to be used. 20 | 21 | You can either specify this as the second parameter or the named `Range` parameter. 22 | 23 | 24 | Example 25 | ------- 26 | 27 | ![alt text](images/Excel.png "Excel sample file with multiple ranges") 28 | 29 | This example demonstrates referencing multiple ranges: 30 | 31 | *) 32 | 33 | // reference the type provider 34 | open FSharp.Interop.Excel 35 | 36 | // Let the type provider do it's work 37 | type MultipleRegions = ExcelFile<"MultipleRegions.xlsx", Range="A1:C5,E3:G5", ForceString=true> 38 | let file = new MultipleRegions() 39 | let rows = file.Data |> Seq.toArray 40 | 41 | let test1 = rows.[0].First 42 | let test2 = rows.[0].Fourth 43 | (** And the variables `test1` and `test2` have the following values: *) 44 | (*** include-value: test1 ***) 45 | (*** include-value: test2 ***) 46 | -------------------------------------------------------------------------------- /docs/rows.fsx: -------------------------------------------------------------------------------- 1 | (** 2 | --- 3 | title: Accessing Rows 4 | category: Documentation 5 | categoryindex: 2 6 | index: 3 7 | --- 8 | *) 9 | 10 | (*** hide ***) 11 | #r "nuget: ExcelProvider" 12 | 13 | 14 | (** 15 | Accessing Rows 16 | =========================== 17 | 18 | Rows are returned as a sequence from the `Data` element of the ExcelFile type. 19 | 20 | Example 21 | ------- 22 | 23 | ![alt text](images/MultSheets.png "Excel sample file with multiple sheets") 24 | 25 | This example demonstrates loading the second row (with index 1) into the variable test: 26 | 27 | *) 28 | 29 | // reference the type provider 30 | open FSharp.Interop.Excel 31 | 32 | // Let the type provider do it's work 33 | type MultipleSheetsSecond = ExcelFile<"MultipleSheets.xlsx", "B"> 34 | let file = new MultipleSheetsSecond() 35 | let rows = file.Data |> Seq.toArray 36 | let test = rows.[1] 37 | (** And the variable `test` has the following value: *) 38 | (*** include-value: test ***) 39 | -------------------------------------------------------------------------------- /docs/sheets.fsx: -------------------------------------------------------------------------------- 1 | (** 2 | --- 3 | title: Accessing Sheets 4 | category: Documentation 5 | categoryindex: 2 6 | index: 2 7 | --- 8 | *) 9 | (*** hide ***) 10 | #r "nuget: ExcelProvider" 11 | 12 | 13 | (** 14 | Accessing Sheets 15 | =========================== 16 | 17 | To access a particular sheet you need to specify the sheet name as the second parameter when creating the ExcelProvider type. 18 | 19 | If you do not include a second parameter then the first sheet in the workbook is used. 20 | 21 | Example 22 | ------- 23 | 24 | ![alt text](images/MultSheets.png "Excel sample file with multiple sheets") 25 | 26 | This example demonstrates referencing the second sheet (with name `B`): 27 | 28 | *) 29 | 30 | // reference the type provider 31 | open FSharp.Interop.Excel 32 | 33 | // Let the type provider do it's work 34 | type MultipleSheetsSecond = ExcelFile<"MultipleSheets.xlsx", "B"> 35 | let file = new MultipleSheetsSecond() 36 | let rows = file.Data |> Seq.toArray 37 | let test = rows.[0].Fourth 38 | (** And the variable `test` has the following value: *) 39 | (*** include-value: test ***) 40 | -------------------------------------------------------------------------------- /global.json: -------------------------------------------------------------------------------- 1 | { 2 | "sdk": { 3 | "version": "6.0.425", 4 | "rollForward": "minor" 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /lib/README.md: -------------------------------------------------------------------------------- 1 | This file is in the `lib` directory. 2 | 3 | Any **libraries** on which your project depends and which are **NOT managed via NuGet** should be kept **in this directory**. 4 | This typically includes custom builds of third-party software, private (i.e. to a company) codebases, and native libraries. 5 | 6 | --- 7 | NOTE: 8 | 9 | This file is a placeholder, used to preserve directory structure in Git. 10 | 11 | This file does not need to be edited. 12 | -------------------------------------------------------------------------------- /nuget/paket.template: -------------------------------------------------------------------------------- 1 | type file 2 | id ExcelProvider 3 | version 4 | 3.0.0 5 | authors 6 | Contributors on Github 7 | owners 8 | sforkmann, JohnDoeKyrgyz, fsprojects, qmarais 9 | projectUrl 10 | http://github.com/fsprojects/ExcelProvider 11 | iconUrl 12 | https://raw.githubusercontent.com/fsprojects/ExcelProvider/master/docs/files/img/logo.png 13 | licenseUrl 14 | http://github.com/fsprojects/ExcelProvider/blob/master/LICENSE.txt 15 | requireLicenseAcceptance 16 | false 17 | tags 18 | F# fsharp typeproviders Excel 19 | summary 20 | This library implements a read-only Excel type provider for Net Standard 2.0. 21 | description 22 | Generate typed read-only access for a sheet in an Excel workbook containing data in columns 23 | tags 24 | F# fsharp typeproviders Excel 25 | releaseNotes 26 | Fix issue #14 and issue #41. These are breaking changes. 27 | 28 | 29 | files 30 | ../bin/ExcelProvider.Runtime/netstandard2.0/ExcelProvider.Runtime.* ==> lib/netstandard2.0 31 | ../bin/ExcelProvider.Runtime/typeproviders/fsharp41/netstandard2.0/*.dll ==> typeproviders/fsharp41/netstandard2.0 32 | references 33 | ExcelProvider.Runtime.dll 34 | dependencies 35 | framework: netstandard2.0 36 | FSharp.Core >= LOCKEDVERSION 37 | ExcelDataReader >= LOCKEDVERSION 38 | ExcelDataReader.DataSet >= LOCKEDVERSION 39 | System.Text.Encoding.CodePages >= LOCKEDVERSION 40 | -------------------------------------------------------------------------------- /paket.dependencies: -------------------------------------------------------------------------------- 1 | source https://api.nuget.org/v3/index.json 2 | 3 | frameworks: netstandard2.0 4 | 5 | nuget ExcelDataReader.DataSet 6 | nuget FSharp.Core 6.0.7 7 | nuget NetStandard.Library 8 | nuget Microsoft.NET.Test.Sdk 9 | nuget System.Text.Encoding.CodePages 6.0.0 10 | 11 | github fsprojects/FSharp.TypeProviders.SDK src/ProvidedTypes.fsi 12 | github fsprojects/FSharp.TypeProviders.SDK src/ProvidedTypes.fs 13 | 14 | group Build 15 | source https://api.nuget.org/v3/index.json 16 | frameworks: net6.0, netstandard2.0 17 | generate_load_scripts:true 18 | nuget FSharp.Core 6.0.7 19 | nuget Fake.Api.Github 20 | nuget Fake.Core.Environment 21 | nuget Fake.Core.UserInput 22 | nuget Fake.Core.Target 23 | nuget Fake.Core.ReleaseNotes 24 | nuget Fake.DotNet.AssemblyInfoFile 25 | nuget Fake.DotNet.Cli 26 | nuget Fake.DotNet.Testing.NUnit 27 | nuget Fake.DotNet.Paket 28 | nuget Fake.IO.FileSystem 29 | nuget Fake.Tools.Git 30 | nuget FSharp.Compiler.Service 31 | nuget Microsoft.Build 17.3.2 32 | nuget Microsoft.Build.Framework 17.3.2 33 | nuget Microsoft.Build.Tasks.Core 17.3.2 34 | 35 | 36 | group Test 37 | source https://api.nuget.org/v3/index.json 38 | frameworks: net6.0 39 | nuget Microsoft.NET.Test.Sdk 40 | nuget NUnit 41 | nuget NUnit.Console 42 | nuget NUnit3TestAdapter version_in_path: true 43 | nuget FsUnit 44 | nuget FSharp.Compiler.Service 41.0.7 45 | -------------------------------------------------------------------------------- /paket.lock: -------------------------------------------------------------------------------- 1 | RESTRICTION: == netstandard2.0 2 | NUGET 3 | remote: https://api.nuget.org/v3/index.json 4 | ExcelDataReader (3.7) 5 | ExcelDataReader.DataSet (3.7) 6 | ExcelDataReader (>= 3.7) 7 | FSharp.Core (6.0.7) 8 | Microsoft.NET.Test.Sdk (17.11.1) 9 | Microsoft.NETCore.Platforms (7.0.4) 10 | NETStandard.Library (2.0.3) 11 | Microsoft.NETCore.Platforms (>= 1.1) 12 | System.Buffers (4.5.1) 13 | System.Memory (4.5.5) 14 | System.Buffers (>= 4.5.1) 15 | System.Numerics.Vectors (>= 4.4) 16 | System.Runtime.CompilerServices.Unsafe (>= 4.5.3) 17 | System.Numerics.Vectors (4.5) 18 | System.Runtime.CompilerServices.Unsafe (6.0) 19 | System.Text.Encoding.CodePages (6.0) 20 | System.Memory (>= 4.5.4) 21 | System.Runtime.CompilerServices.Unsafe (>= 6.0) 22 | GITHUB 23 | remote: fsprojects/FSharp.TypeProviders.SDK 24 | src/ProvidedTypes.fs (3a9510e466cb8ab04e0b86841dc777994909f881) 25 | src/ProvidedTypes.fsi (3a9510e466cb8ab04e0b86841dc777994909f881) 26 | GROUP Build 27 | GENERATE-LOAD-SCRIPTS: ON 28 | RESTRICTION: || (== net6.0) (== netstandard2.0) 29 | NUGET 30 | remote: https://api.nuget.org/v3/index.json 31 | BlackFox.VsWhere (1.1) 32 | FSharp.Core (>= 4.2.3) 33 | Microsoft.Win32.Registry (>= 4.7) 34 | Fake.Api.GitHub (6.0) 35 | FSharp.Core (>= 6.0.3) 36 | Octokit (>= 0.50) 37 | Fake.Core.CommandLineParsing (6.0) 38 | FParsec (>= 1.1.1) 39 | FSharp.Core (>= 6.0.3) 40 | Fake.Core.Context (6.0) 41 | FSharp.Core (>= 6.0.3) 42 | Fake.Core.Environment (6.0) 43 | FSharp.Core (>= 6.0.3) 44 | Fake.Core.FakeVar (6.0) 45 | Fake.Core.Context (>= 6.0) 46 | FSharp.Core (>= 6.0.3) 47 | Fake.Core.Process (6.0) 48 | Fake.Core.Environment (>= 6.0) 49 | Fake.Core.FakeVar (>= 6.0) 50 | Fake.Core.String (>= 6.0) 51 | Fake.Core.Trace (>= 6.0) 52 | Fake.IO.FileSystem (>= 6.0) 53 | FSharp.Core (>= 6.0.3) 54 | System.Collections.Immutable (>= 6.0) 55 | Fake.Core.ReleaseNotes (6.0) 56 | Fake.Core.SemVer (>= 6.0) 57 | Fake.Core.String (>= 6.0) 58 | FSharp.Core (>= 6.0.3) 59 | Fake.Core.SemVer (6.0) 60 | FSharp.Core (>= 6.0.3) 61 | Fake.Core.String (6.0) 62 | FSharp.Core (>= 6.0.3) 63 | Fake.Core.Target (6.0) 64 | Fake.Core.CommandLineParsing (>= 6.0) 65 | Fake.Core.Context (>= 6.0) 66 | Fake.Core.Environment (>= 6.0) 67 | Fake.Core.FakeVar (>= 6.0) 68 | Fake.Core.Process (>= 6.0) 69 | Fake.Core.String (>= 6.0) 70 | Fake.Core.Trace (>= 6.0) 71 | FSharp.Control.Reactive (>= 5.0.2) 72 | FSharp.Core (>= 6.0.3) 73 | Fake.Core.Tasks (6.0) 74 | Fake.Core.Trace (>= 6.0) 75 | FSharp.Core (>= 6.0.3) 76 | Fake.Core.Trace (6.0) 77 | Fake.Core.Environment (>= 6.0) 78 | Fake.Core.FakeVar (>= 6.0) 79 | FSharp.Core (>= 6.0.3) 80 | Fake.Core.UserInput (6.0) 81 | FSharp.Core (>= 6.0.3) 82 | Fake.Core.Xml (6.0) 83 | Fake.Core.String (>= 6.0) 84 | FSharp.Core (>= 6.0.3) 85 | Fake.DotNet.AssemblyInfoFile (6.0) 86 | Fake.Core.Environment (>= 6.0) 87 | Fake.Core.String (>= 6.0) 88 | Fake.Core.Trace (>= 6.0) 89 | Fake.IO.FileSystem (>= 6.0) 90 | FSharp.Core (>= 6.0.3) 91 | Fake.DotNet.Cli (6.0) 92 | Fake.Core.Environment (>= 6.0) 93 | Fake.Core.Process (>= 6.0) 94 | Fake.Core.String (>= 6.0) 95 | Fake.Core.Trace (>= 6.0) 96 | Fake.DotNet.MSBuild (>= 6.0) 97 | Fake.DotNet.NuGet (>= 6.0) 98 | Fake.IO.FileSystem (>= 6.0) 99 | FSharp.Core (>= 6.0.3) 100 | Mono.Posix.NETStandard (>= 1.0) 101 | Newtonsoft.Json (>= 13.0.1) 102 | Fake.DotNet.MSBuild (6.0) 103 | BlackFox.VsWhere (>= 1.1) 104 | Fake.Core.Environment (>= 6.0) 105 | Fake.Core.Process (>= 6.0) 106 | Fake.Core.String (>= 6.0) 107 | Fake.Core.Trace (>= 6.0) 108 | Fake.IO.FileSystem (>= 6.0) 109 | FSharp.Core (>= 6.0.3) 110 | MSBuild.StructuredLogger (>= 2.1.545) 111 | Fake.DotNet.NuGet (6.0) 112 | Fake.Core.Environment (>= 6.0) 113 | Fake.Core.Process (>= 6.0) 114 | Fake.Core.SemVer (>= 6.0) 115 | Fake.Core.String (>= 6.0) 116 | Fake.Core.Tasks (>= 6.0) 117 | Fake.Core.Trace (>= 6.0) 118 | Fake.Core.Xml (>= 6.0) 119 | Fake.IO.FileSystem (>= 6.0) 120 | Fake.Net.Http (>= 6.0) 121 | FSharp.Core (>= 6.0.3) 122 | Newtonsoft.Json (>= 13.0.1) 123 | NuGet.Protocol (>= 6.0) 124 | Fake.DotNet.Paket (6.0) 125 | Fake.Core.Process (>= 6.0) 126 | Fake.Core.String (>= 6.0) 127 | Fake.Core.Trace (>= 6.0) 128 | Fake.DotNet.Cli (>= 6.0) 129 | Fake.IO.FileSystem (>= 6.0) 130 | FSharp.Core (>= 6.0.3) 131 | Fake.DotNet.Testing.NUnit (6.0) 132 | Fake.Core.Environment (>= 6.0) 133 | Fake.Core.Process (>= 6.0) 134 | Fake.Core.String (>= 6.0) 135 | Fake.Core.Trace (>= 6.0) 136 | Fake.IO.FileSystem (>= 6.0) 137 | Fake.Testing.Common (>= 6.0) 138 | FSharp.Core (>= 6.0.3) 139 | Fake.IO.FileSystem (6.0) 140 | Fake.Core.String (>= 6.0) 141 | Fake.Core.Trace (>= 6.0) 142 | FSharp.Core (>= 6.0.3) 143 | Fake.Net.Http (6.0) 144 | Fake.Core.Trace (>= 6.0) 145 | FSharp.Core (>= 6.0.3) 146 | Fake.Testing.Common (6.0) 147 | Fake.Core.Trace (>= 6.0) 148 | FSharp.Core (>= 6.0.3) 149 | Fake.Tools.Git (6.0) 150 | Fake.Core.Environment (>= 6.0) 151 | Fake.Core.Process (>= 6.0) 152 | Fake.Core.SemVer (>= 6.0) 153 | Fake.Core.String (>= 6.0) 154 | Fake.Core.Trace (>= 6.0) 155 | Fake.IO.FileSystem (>= 6.0) 156 | FSharp.Core (>= 6.0.3) 157 | FParsec (1.1.1) 158 | FSharp.Core (>= 4.3.4) 159 | FSharp.Compiler.Service (41.0.7) 160 | FSharp.Core (6.0.7) 161 | Microsoft.Build.Framework (>= 17.0) 162 | Microsoft.Build.Tasks.Core (>= 17.0) 163 | Microsoft.Build.Utilities.Core (>= 17.0) 164 | System.Buffers (>= 4.5.1) 165 | System.Collections.Immutable (>= 5.0) 166 | System.Diagnostics.Process (>= 4.3) 167 | System.Diagnostics.TraceSource (>= 4.3) 168 | System.Linq.Expressions (>= 4.3) 169 | System.Linq.Queryable (>= 4.3) 170 | System.Memory (>= 4.5.4) 171 | System.Net.Requests (>= 4.3) 172 | System.Net.Security (>= 4.3.1) 173 | System.Reflection.Emit (>= 4.3) 174 | System.Reflection.Metadata (>= 5.0) 175 | System.Reflection.TypeExtensions (>= 4.3) 176 | System.Runtime (>= 4.3) 177 | System.Runtime.CompilerServices.Unsafe (>= 6.0) 178 | System.Runtime.InteropServices (>= 4.3) 179 | System.Runtime.Loader (>= 4.3) 180 | System.Security.Claims (>= 4.3) 181 | System.Security.Cryptography.Algorithms (>= 4.3) 182 | System.Security.Principal (>= 4.3) 183 | System.Threading.Tasks.Parallel (>= 4.3) 184 | System.Threading.Thread (>= 4.3) 185 | System.Threading.ThreadPool (>= 4.3) 186 | FSharp.Control.Reactive (5.0.5) 187 | FSharp.Core (>= 4.7.2) 188 | System.Reactive (>= 5.0 < 6.0) 189 | FSharp.Core (6.0.7) 190 | Microsoft.Build (17.3.2) 191 | Microsoft.Build.Framework (>= 17.3.2) - restriction: || (== net6.0) (&& (== netstandard2.0) (>= net472)) (&& (== netstandard2.0) (>= net6.0)) 192 | Microsoft.NET.StringTools (>= 17.3.2) - restriction: || (== net6.0) (&& (== netstandard2.0) (>= net472)) (&& (== netstandard2.0) (>= net6.0)) 193 | System.Collections.Immutable (>= 6.0) - restriction: || (== net6.0) (&& (== netstandard2.0) (>= net472)) (&& (== netstandard2.0) (>= net6.0)) 194 | System.Configuration.ConfigurationManager (>= 6.0) - restriction: || (== net6.0) (&& (== netstandard2.0) (>= net472)) (&& (== netstandard2.0) (>= net6.0)) 195 | System.Reflection.Metadata (>= 6.0) - restriction: || (== net6.0) (&& (== netstandard2.0) (>= net6.0)) 196 | System.Reflection.MetadataLoadContext (>= 6.0) - restriction: || (== net6.0) (&& (== netstandard2.0) (>= net472)) (&& (== netstandard2.0) (>= net6.0)) 197 | System.Security.Principal.Windows (>= 5.0) - restriction: || (== net6.0) (&& (== netstandard2.0) (>= net6.0)) 198 | System.Text.Encoding.CodePages (>= 6.0) - restriction: || (== net6.0) (&& (== netstandard2.0) (>= net6.0)) 199 | System.Text.Json (>= 6.0) - restriction: || (== net6.0) (&& (== netstandard2.0) (>= net472)) (&& (== netstandard2.0) (>= net6.0)) 200 | System.Threading.Tasks.Dataflow (>= 6.0) - restriction: || (== net6.0) (&& (== netstandard2.0) (>= net472)) (&& (== netstandard2.0) (>= net6.0)) 201 | Microsoft.Build.Framework (17.3.2) 202 | System.Security.Permissions (>= 6.0) 203 | Microsoft.Build.Tasks.Core (17.3.2) 204 | Microsoft.Build.Framework (>= 17.3.2) 205 | Microsoft.Build.Utilities.Core (>= 17.3.2) 206 | Microsoft.NET.StringTools (>= 17.3.2) 207 | Microsoft.Win32.Registry (>= 5.0) - restriction: == netstandard2.0 208 | System.CodeDom (>= 6.0) 209 | System.Collections.Immutable (>= 6.0) 210 | System.Reflection.Metadata (>= 6.0) 211 | System.Resources.Extensions (>= 6.0) 212 | System.Security.Cryptography.Pkcs (>= 6.0.1) 213 | System.Security.Cryptography.Xml (>= 6.0) 214 | System.Security.Permissions (>= 6.0) 215 | System.Threading.Tasks.Dataflow (>= 6.0) 216 | Microsoft.Build.Utilities.Core (17.3.2) 217 | Microsoft.Build.Framework (>= 17.3.2) 218 | Microsoft.NET.StringTools (>= 17.3.2) 219 | Microsoft.Win32.Registry (>= 5.0) - restriction: == netstandard2.0 220 | System.Collections.Immutable (>= 6.0) 221 | System.Configuration.ConfigurationManager (>= 6.0) 222 | System.Security.Permissions (>= 6.0) - restriction: == netstandard2.0 223 | System.Text.Encoding.CodePages (>= 6.0) - restriction: == netstandard2.0 224 | Microsoft.NET.StringTools (17.11.4) 225 | System.Memory (>= 4.5.5) 226 | System.Runtime.CompilerServices.Unsafe (>= 6.0) 227 | Microsoft.NETCore.Platforms (7.0.4) 228 | Microsoft.NETCore.Targets (5.0) 229 | Microsoft.Win32.Primitives (4.3) 230 | Microsoft.NETCore.Platforms (>= 1.1) 231 | Microsoft.NETCore.Targets (>= 1.1) 232 | System.Runtime (>= 4.3) 233 | Microsoft.Win32.Registry (5.0) 234 | System.Buffers (>= 4.5.1) - restriction: || (&& (== net6.0) (>= monoandroid) (< netstandard1.3)) (&& (== net6.0) (>= monotouch)) (&& (== net6.0) (< netcoreapp2.0)) (&& (== net6.0) (>= xamarinios)) (&& (== net6.0) (>= xamarinmac)) (&& (== net6.0) (>= xamarintvos)) (&& (== net6.0) (>= xamarinwatchos)) (== netstandard2.0) 235 | System.Memory (>= 4.5.4) - restriction: || (&& (== net6.0) (< netcoreapp2.0)) (&& (== net6.0) (< netcoreapp2.1)) (&& (== net6.0) (>= uap10.1)) (== netstandard2.0) 236 | System.Security.AccessControl (>= 5.0) 237 | System.Security.Principal.Windows (>= 5.0) 238 | Mono.Posix.NETStandard (1.0) 239 | MSBuild.StructuredLogger (2.1.815) 240 | Microsoft.Build.Framework (>= 16.10) 241 | Microsoft.Build.Utilities.Core (>= 16.10) 242 | Newtonsoft.Json (13.0.3) 243 | NuGet.Common (6.11) 244 | NuGet.Frameworks (>= 6.11) 245 | NuGet.Configuration (6.11) 246 | NuGet.Common (>= 6.11) 247 | System.Security.Cryptography.ProtectedData (>= 4.4) 248 | NuGet.Frameworks (6.11) 249 | NuGet.Packaging (6.11) 250 | Newtonsoft.Json (>= 13.0.3) 251 | NuGet.Configuration (>= 6.11) 252 | NuGet.Versioning (>= 6.11) 253 | System.Security.Cryptography.Pkcs (>= 6.0.4) 254 | NuGet.Protocol (6.11) 255 | NuGet.Packaging (>= 6.11) 256 | System.Text.Json (>= 7.0.3) - restriction: || (&& (== net6.0) (>= net472)) (&& (== net6.0) (< net5.0)) (== netstandard2.0) 257 | NuGet.Versioning (6.11) 258 | Octokit (13.0.1) 259 | runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl (4.3.3) 260 | runtime.debian.9-x64.runtime.native.System.Security.Cryptography.OpenSsl (4.3.3) 261 | runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl (4.3.3) 262 | runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl (4.3.3) 263 | runtime.fedora.27-x64.runtime.native.System.Security.Cryptography.OpenSsl (4.3.3) 264 | runtime.fedora.28-x64.runtime.native.System.Security.Cryptography.OpenSsl (4.3.3) 265 | runtime.native.System (4.3.1) 266 | Microsoft.NETCore.Platforms (>= 1.1.1) 267 | Microsoft.NETCore.Targets (>= 1.1.3) 268 | runtime.native.System.Net.Http (4.3.1) 269 | Microsoft.NETCore.Platforms (>= 1.1.1) 270 | Microsoft.NETCore.Targets (>= 1.1.3) 271 | runtime.native.System.Net.Security (4.3.1) 272 | Microsoft.NETCore.Platforms (>= 1.1.1) 273 | Microsoft.NETCore.Targets (>= 1.1.3) 274 | runtime.native.System.Security.Cryptography.Apple (4.3.1) 275 | runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple (>= 4.3.1) 276 | runtime.native.System.Security.Cryptography.OpenSsl (4.3.3) 277 | runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl (>= 4.3.3) 278 | runtime.debian.9-x64.runtime.native.System.Security.Cryptography.OpenSsl (>= 4.3.3) 279 | runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl (>= 4.3.3) 280 | runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl (>= 4.3.3) 281 | runtime.fedora.27-x64.runtime.native.System.Security.Cryptography.OpenSsl (>= 4.3.3) 282 | runtime.fedora.28-x64.runtime.native.System.Security.Cryptography.OpenSsl (>= 4.3.3) 283 | runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl (>= 4.3.3) 284 | runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl (>= 4.3.3) 285 | runtime.opensuse.42.3-x64.runtime.native.System.Security.Cryptography.OpenSsl (>= 4.3.3) 286 | runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl (>= 4.3.3) 287 | runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl (>= 4.3.3) 288 | runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl (>= 4.3.3) 289 | runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl (>= 4.3.3) 290 | runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl (>= 4.3.3) 291 | runtime.ubuntu.18.04-x64.runtime.native.System.Security.Cryptography.OpenSsl (>= 4.3.3) 292 | runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl (4.3.3) 293 | runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl (4.3.3) 294 | runtime.opensuse.42.3-x64.runtime.native.System.Security.Cryptography.OpenSsl (4.3.3) 295 | runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple (4.3.1) 296 | runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl (4.3.3) 297 | runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl (4.3.3) 298 | runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl (4.3.3) 299 | runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl (4.3.3) 300 | runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl (4.3.3) 301 | runtime.ubuntu.18.04-x64.runtime.native.System.Security.Cryptography.OpenSsl (4.3.3) 302 | System.Buffers (4.5.1) 303 | System.CodeDom (8.0) 304 | System.Collections (4.3) 305 | Microsoft.NETCore.Platforms (>= 1.1) 306 | Microsoft.NETCore.Targets (>= 1.1) 307 | System.Runtime (>= 4.3) 308 | System.Collections.Concurrent (4.3) 309 | System.Collections (>= 4.3) 310 | System.Diagnostics.Debug (>= 4.3) 311 | System.Diagnostics.Tracing (>= 4.3) 312 | System.Globalization (>= 4.3) 313 | System.Reflection (>= 4.3) 314 | System.Resources.ResourceManager (>= 4.3) 315 | System.Runtime (>= 4.3) 316 | System.Runtime.Extensions (>= 4.3) 317 | System.Threading (>= 4.3) 318 | System.Threading.Tasks (>= 4.3) 319 | System.Collections.Immutable (8.0) 320 | System.Runtime.CompilerServices.Unsafe (>= 6.0) 321 | System.Configuration.ConfigurationManager (8.0) 322 | System.Security.Cryptography.ProtectedData (>= 8.0) 323 | System.Diagnostics.Debug (4.3) 324 | Microsoft.NETCore.Platforms (>= 1.1) 325 | Microsoft.NETCore.Targets (>= 1.1) 326 | System.Runtime (>= 4.3) 327 | System.Diagnostics.DiagnosticSource (8.0.1) 328 | System.Memory (>= 4.5.5) - restriction: || (&& (== net6.0) (>= net462)) (== netstandard2.0) 329 | System.Runtime.CompilerServices.Unsafe (>= 6.0) 330 | System.Diagnostics.Process (4.3) 331 | Microsoft.NETCore.Platforms (>= 1.1) 332 | Microsoft.Win32.Primitives (>= 4.3) 333 | Microsoft.Win32.Registry (>= 4.3) 334 | runtime.native.System (>= 4.3) 335 | System.Collections (>= 4.3) 336 | System.Diagnostics.Debug (>= 4.3) 337 | System.Globalization (>= 4.3) 338 | System.IO (>= 4.3) 339 | System.IO.FileSystem (>= 4.3) 340 | System.IO.FileSystem.Primitives (>= 4.3) 341 | System.Resources.ResourceManager (>= 4.3) 342 | System.Runtime (>= 4.3) 343 | System.Runtime.Extensions (>= 4.3) 344 | System.Runtime.Handles (>= 4.3) 345 | System.Runtime.InteropServices (>= 4.3) 346 | System.Text.Encoding (>= 4.3) 347 | System.Text.Encoding.Extensions (>= 4.3) 348 | System.Threading (>= 4.3) 349 | System.Threading.Tasks (>= 4.3) 350 | System.Threading.Thread (>= 4.3) 351 | System.Threading.ThreadPool (>= 4.3) 352 | System.Diagnostics.TraceSource (4.3) 353 | Microsoft.NETCore.Platforms (>= 1.1) 354 | runtime.native.System (>= 4.3) 355 | System.Collections (>= 4.3) 356 | System.Diagnostics.Debug (>= 4.3) 357 | System.Globalization (>= 4.3) 358 | System.Resources.ResourceManager (>= 4.3) 359 | System.Runtime (>= 4.3) 360 | System.Runtime.Extensions (>= 4.3) 361 | System.Threading (>= 4.3) 362 | System.Diagnostics.Tracing (4.3) 363 | Microsoft.NETCore.Platforms (>= 1.1) 364 | Microsoft.NETCore.Targets (>= 1.1) 365 | System.Runtime (>= 4.3) 366 | System.Formats.Asn1 (8.0.1) 367 | System.Buffers (>= 4.5.1) - restriction: || (&& (== net6.0) (>= net462)) (== netstandard2.0) 368 | System.Memory (>= 4.5.5) - restriction: || (&& (== net6.0) (>= net462)) (== netstandard2.0) 369 | System.Globalization (4.3) 370 | Microsoft.NETCore.Platforms (>= 1.1) 371 | Microsoft.NETCore.Targets (>= 1.1) 372 | System.Runtime (>= 4.3) 373 | System.Globalization.Calendars (4.3) 374 | Microsoft.NETCore.Platforms (>= 1.1) 375 | Microsoft.NETCore.Targets (>= 1.1) 376 | System.Globalization (>= 4.3) 377 | System.Runtime (>= 4.3) 378 | System.Globalization.Extensions (4.3) 379 | Microsoft.NETCore.Platforms (>= 1.1) 380 | System.Globalization (>= 4.3) 381 | System.Resources.ResourceManager (>= 4.3) 382 | System.Runtime (>= 4.3) 383 | System.Runtime.Extensions (>= 4.3) 384 | System.Runtime.InteropServices (>= 4.3) 385 | System.IO (4.3) 386 | Microsoft.NETCore.Platforms (>= 1.1) 387 | Microsoft.NETCore.Targets (>= 1.1) 388 | System.Runtime (>= 4.3) 389 | System.Text.Encoding (>= 4.3) 390 | System.Threading.Tasks (>= 4.3) 391 | System.IO.FileSystem (4.3) 392 | Microsoft.NETCore.Platforms (>= 1.1) 393 | Microsoft.NETCore.Targets (>= 1.1) 394 | System.IO (>= 4.3) 395 | System.IO.FileSystem.Primitives (>= 4.3) 396 | System.Runtime (>= 4.3) 397 | System.Runtime.Handles (>= 4.3) 398 | System.Text.Encoding (>= 4.3) 399 | System.Threading.Tasks (>= 4.3) 400 | System.IO.FileSystem.Primitives (4.3) 401 | System.Runtime (>= 4.3) 402 | System.Linq (4.3) 403 | System.Collections (>= 4.3) 404 | System.Diagnostics.Debug (>= 4.3) 405 | System.Resources.ResourceManager (>= 4.3) 406 | System.Runtime (>= 4.3) 407 | System.Runtime.Extensions (>= 4.3) 408 | System.Linq.Expressions (4.3) 409 | System.Collections (>= 4.3) 410 | System.Diagnostics.Debug (>= 4.3) 411 | System.Globalization (>= 4.3) 412 | System.IO (>= 4.3) 413 | System.Linq (>= 4.3) 414 | System.ObjectModel (>= 4.3) 415 | System.Reflection (>= 4.3) 416 | System.Reflection.Emit (>= 4.3) 417 | System.Reflection.Emit.ILGeneration (>= 4.3) 418 | System.Reflection.Emit.Lightweight (>= 4.3) 419 | System.Reflection.Extensions (>= 4.3) 420 | System.Reflection.Primitives (>= 4.3) 421 | System.Reflection.TypeExtensions (>= 4.3) 422 | System.Resources.ResourceManager (>= 4.3) 423 | System.Runtime (>= 4.3) 424 | System.Runtime.Extensions (>= 4.3) 425 | System.Threading (>= 4.3) 426 | System.Linq.Queryable (4.3) 427 | System.Collections (>= 4.3) 428 | System.Diagnostics.Debug (>= 4.3) 429 | System.Linq (>= 4.3) 430 | System.Linq.Expressions (>= 4.3) 431 | System.Reflection (>= 4.3) 432 | System.Reflection.Extensions (>= 4.3) 433 | System.Resources.ResourceManager (>= 4.3) 434 | System.Runtime (>= 4.3) 435 | System.Memory (4.5.5) 436 | System.Buffers (>= 4.5.1) - restriction: || (&& (== net6.0) (>= monotouch)) (&& (== net6.0) (>= net461)) (&& (== net6.0) (< netcoreapp2.0)) (&& (== net6.0) (< netstandard1.1)) (&& (== net6.0) (< netstandard2.0)) (&& (== net6.0) (>= xamarinios)) (&& (== net6.0) (>= xamarinmac)) (&& (== net6.0) (>= xamarintvos)) (&& (== net6.0) (>= xamarinwatchos)) (== netstandard2.0) 437 | System.Numerics.Vectors (>= 4.4) - restriction: || (&& (== net6.0) (< netcoreapp2.0)) (== netstandard2.0) 438 | System.Runtime.CompilerServices.Unsafe (>= 4.5.3) - restriction: || (&& (== net6.0) (>= monotouch)) (&& (== net6.0) (>= net461)) (&& (== net6.0) (< netcoreapp2.0)) (&& (== net6.0) (< netcoreapp2.1)) (&& (== net6.0) (< netstandard1.1)) (&& (== net6.0) (< netstandard2.0)) (&& (== net6.0) (>= uap10.1)) (&& (== net6.0) (>= xamarinios)) (&& (== net6.0) (>= xamarinmac)) (&& (== net6.0) (>= xamarintvos)) (&& (== net6.0) (>= xamarinwatchos)) (== netstandard2.0) 439 | System.Net.Http (4.3.4) 440 | Microsoft.NETCore.Platforms (>= 1.1.1) 441 | runtime.native.System (>= 4.3) 442 | runtime.native.System.Net.Http (>= 4.3) 443 | runtime.native.System.Security.Cryptography.OpenSsl (>= 4.3.2) 444 | System.Collections (>= 4.3) 445 | System.Diagnostics.Debug (>= 4.3) 446 | System.Diagnostics.DiagnosticSource (>= 4.3) 447 | System.Diagnostics.Tracing (>= 4.3) 448 | System.Globalization (>= 4.3) 449 | System.Globalization.Extensions (>= 4.3) 450 | System.IO (>= 4.3) 451 | System.IO.FileSystem (>= 4.3) 452 | System.Net.Primitives (>= 4.3) 453 | System.Resources.ResourceManager (>= 4.3) 454 | System.Runtime (>= 4.3) 455 | System.Runtime.Extensions (>= 4.3) 456 | System.Runtime.Handles (>= 4.3) 457 | System.Runtime.InteropServices (>= 4.3) 458 | System.Security.Cryptography.Algorithms (>= 4.3) 459 | System.Security.Cryptography.Encoding (>= 4.3) 460 | System.Security.Cryptography.OpenSsl (>= 4.3) 461 | System.Security.Cryptography.Primitives (>= 4.3) 462 | System.Security.Cryptography.X509Certificates (>= 4.3) 463 | System.Text.Encoding (>= 4.3) 464 | System.Threading (>= 4.3) 465 | System.Threading.Tasks (>= 4.3) 466 | System.Net.Primitives (4.3.1) 467 | Microsoft.NETCore.Platforms (>= 1.1.1) 468 | Microsoft.NETCore.Targets (>= 1.1.3) 469 | System.Runtime (>= 4.3.1) 470 | System.Runtime.Handles (>= 4.3) 471 | System.Net.Requests (4.3) 472 | Microsoft.NETCore.Platforms (>= 1.1) 473 | System.Collections (>= 4.3) 474 | System.Diagnostics.Debug (>= 4.3) 475 | System.Diagnostics.Tracing (>= 4.3) 476 | System.Globalization (>= 4.3) 477 | System.IO (>= 4.3) 478 | System.Net.Http (>= 4.3) 479 | System.Net.Primitives (>= 4.3) 480 | System.Net.WebHeaderCollection (>= 4.3) 481 | System.Resources.ResourceManager (>= 4.3) 482 | System.Runtime (>= 4.3) 483 | System.Threading (>= 4.3) 484 | System.Threading.Tasks (>= 4.3) 485 | System.Net.Security (4.3.2) 486 | Microsoft.NETCore.Platforms (>= 1.1) 487 | Microsoft.Win32.Primitives (>= 4.3) 488 | runtime.native.System (>= 4.3) 489 | runtime.native.System.Net.Security (>= 4.3) 490 | runtime.native.System.Security.Cryptography.OpenSsl (>= 4.3.2) 491 | System.Collections (>= 4.3) 492 | System.Collections.Concurrent (>= 4.3) 493 | System.Diagnostics.Tracing (>= 4.3) 494 | System.Globalization (>= 4.3) 495 | System.Globalization.Extensions (>= 4.3) 496 | System.IO (>= 4.3) 497 | System.Net.Primitives (>= 4.3) 498 | System.Resources.ResourceManager (>= 4.3) 499 | System.Runtime (>= 4.3) 500 | System.Runtime.Extensions (>= 4.3) 501 | System.Runtime.Handles (>= 4.3) 502 | System.Runtime.InteropServices (>= 4.3) 503 | System.Security.Claims (>= 4.3) 504 | System.Security.Cryptography.Algorithms (>= 4.3) 505 | System.Security.Cryptography.Encoding (>= 4.3) 506 | System.Security.Cryptography.OpenSsl (>= 4.3) 507 | System.Security.Cryptography.Primitives (>= 4.3) 508 | System.Security.Cryptography.X509Certificates (>= 4.3) 509 | System.Security.Principal (>= 4.3) 510 | System.Text.Encoding (>= 4.3) 511 | System.Threading (>= 4.3) 512 | System.Threading.Tasks (>= 4.3) 513 | System.Threading.ThreadPool (>= 4.3) 514 | System.Net.WebHeaderCollection (4.3) 515 | System.Collections (>= 4.3) 516 | System.Resources.ResourceManager (>= 4.3) 517 | System.Runtime (>= 4.3) 518 | System.Runtime.Extensions (>= 4.3) 519 | System.Numerics.Vectors (4.5) - restriction: || (&& (== net6.0) (< netcoreapp2.0)) (== netstandard2.0) 520 | System.ObjectModel (4.3) 521 | System.Collections (>= 4.3) 522 | System.Diagnostics.Debug (>= 4.3) 523 | System.Resources.ResourceManager (>= 4.3) 524 | System.Runtime (>= 4.3) 525 | System.Threading (>= 4.3) 526 | System.Reactive (5.0) 527 | System.Runtime.InteropServices.WindowsRuntime (>= 4.3) - restriction: || (&& (== net6.0) (< netcoreapp3.1)) (== netstandard2.0) 528 | System.Threading.Tasks.Extensions (>= 4.5.4) - restriction: || (&& (== net6.0) (>= net472)) (&& (== net6.0) (< netcoreapp3.1)) (&& (== net6.0) (>= uap10.1)) (== netstandard2.0) 529 | System.Reflection (4.3) 530 | Microsoft.NETCore.Platforms (>= 1.1) 531 | Microsoft.NETCore.Targets (>= 1.1) 532 | System.IO (>= 4.3) 533 | System.Reflection.Primitives (>= 4.3) 534 | System.Runtime (>= 4.3) 535 | System.Reflection.Emit (4.7) 536 | System.Reflection.Emit.ILGeneration (>= 4.7) - restriction: || (&& (== net6.0) (< netcoreapp2.0) (< netstandard2.1)) (&& (== net6.0) (< netstandard1.1)) (&& (== net6.0) (< netstandard2.0)) (&& (== net6.0) (>= uap10.1)) (== netstandard2.0) 537 | System.Reflection.Emit.ILGeneration (4.7) 538 | System.Reflection.Emit.Lightweight (4.7) 539 | System.Reflection.Emit.ILGeneration (>= 4.7) - restriction: || (&& (== net6.0) (< netcoreapp2.0) (< netstandard2.1)) (&& (== net6.0) (< netstandard2.0)) (&& (== net6.0) (< portable-net45+wp8)) (&& (== net6.0) (>= uap10.1)) (== netstandard2.0) 540 | System.Reflection.Extensions (4.3) 541 | Microsoft.NETCore.Platforms (>= 1.1) 542 | Microsoft.NETCore.Targets (>= 1.1) 543 | System.Reflection (>= 4.3) 544 | System.Runtime (>= 4.3) 545 | System.Reflection.Metadata (8.0) 546 | System.Collections.Immutable (>= 8.0) 547 | System.Reflection.MetadataLoadContext (8.0) - restriction: || (== net6.0) (&& (== netstandard2.0) (>= net472)) (&& (== netstandard2.0) (>= net6.0)) 548 | System.Collections.Immutable (>= 8.0) 549 | System.Reflection.Metadata (>= 8.0) 550 | System.Reflection.Primitives (4.3) 551 | Microsoft.NETCore.Platforms (>= 1.1) 552 | Microsoft.NETCore.Targets (>= 1.1) 553 | System.Runtime (>= 4.3) 554 | System.Reflection.TypeExtensions (4.7) 555 | System.Resources.Extensions (8.0) 556 | System.Memory (>= 4.5.5) - restriction: || (&& (== net6.0) (>= net462)) (== netstandard2.0) 557 | System.Resources.ResourceManager (4.3) 558 | Microsoft.NETCore.Platforms (>= 1.1) 559 | Microsoft.NETCore.Targets (>= 1.1) 560 | System.Globalization (>= 4.3) 561 | System.Reflection (>= 4.3) 562 | System.Runtime (>= 4.3) 563 | System.Runtime (4.3.1) 564 | Microsoft.NETCore.Platforms (>= 1.1.1) 565 | Microsoft.NETCore.Targets (>= 1.1.3) 566 | System.Runtime.CompilerServices.Unsafe (6.0) 567 | System.Runtime.Extensions (4.3.1) 568 | Microsoft.NETCore.Platforms (>= 1.1.1) 569 | Microsoft.NETCore.Targets (>= 1.1.3) 570 | System.Runtime (>= 4.3.1) 571 | System.Runtime.Handles (4.3) 572 | Microsoft.NETCore.Platforms (>= 1.1) 573 | Microsoft.NETCore.Targets (>= 1.1) 574 | System.Runtime (>= 4.3) 575 | System.Runtime.InteropServices (4.3) 576 | Microsoft.NETCore.Platforms (>= 1.1) 577 | Microsoft.NETCore.Targets (>= 1.1) 578 | System.Reflection (>= 4.3) 579 | System.Reflection.Primitives (>= 4.3) 580 | System.Runtime (>= 4.3) 581 | System.Runtime.Handles (>= 4.3) 582 | System.Runtime.InteropServices.WindowsRuntime (4.3) - restriction: || (&& (== net6.0) (< netcoreapp3.1)) (== netstandard2.0) 583 | System.Runtime (>= 4.3) 584 | System.Runtime.Loader (4.3) 585 | System.IO (>= 4.3) 586 | System.Reflection (>= 4.3) 587 | System.Runtime (>= 4.3) 588 | System.Runtime.Numerics (4.3) 589 | System.Globalization (>= 4.3) 590 | System.Resources.ResourceManager (>= 4.3) 591 | System.Runtime (>= 4.3) 592 | System.Runtime.Extensions (>= 4.3) 593 | System.Security.AccessControl (6.0.1) - restriction: || (&& (== net6.0) (>= net462)) (== netstandard2.0) 594 | System.Security.Principal.Windows (>= 5.0) - restriction: || (&& (== net6.0) (>= net461)) (== netstandard2.0) 595 | System.Security.Claims (4.3) 596 | System.Collections (>= 4.3) 597 | System.Globalization (>= 4.3) 598 | System.IO (>= 4.3) 599 | System.Resources.ResourceManager (>= 4.3) 600 | System.Runtime (>= 4.3) 601 | System.Runtime.Extensions (>= 4.3) 602 | System.Security.Principal (>= 4.3) 603 | System.Security.Cryptography.Algorithms (4.3.1) 604 | Microsoft.NETCore.Platforms (>= 1.1) 605 | runtime.native.System.Security.Cryptography.Apple (>= 4.3.1) 606 | runtime.native.System.Security.Cryptography.OpenSsl (>= 4.3.2) 607 | System.Collections (>= 4.3) 608 | System.IO (>= 4.3) 609 | System.Resources.ResourceManager (>= 4.3) 610 | System.Runtime (>= 4.3) 611 | System.Runtime.Extensions (>= 4.3) 612 | System.Runtime.Handles (>= 4.3) 613 | System.Runtime.InteropServices (>= 4.3) 614 | System.Runtime.Numerics (>= 4.3) 615 | System.Security.Cryptography.Encoding (>= 4.3) 616 | System.Security.Cryptography.Primitives (>= 4.3) 617 | System.Text.Encoding (>= 4.3) 618 | System.Security.Cryptography.Cng (5.0) 619 | System.Security.Cryptography.Csp (4.3) 620 | Microsoft.NETCore.Platforms (>= 1.1) 621 | System.IO (>= 4.3) 622 | System.Reflection (>= 4.3) 623 | System.Resources.ResourceManager (>= 4.3) 624 | System.Runtime (>= 4.3) 625 | System.Runtime.Extensions (>= 4.3) 626 | System.Runtime.Handles (>= 4.3) 627 | System.Runtime.InteropServices (>= 4.3) 628 | System.Security.Cryptography.Algorithms (>= 4.3) 629 | System.Security.Cryptography.Encoding (>= 4.3) 630 | System.Security.Cryptography.Primitives (>= 4.3) 631 | System.Text.Encoding (>= 4.3) 632 | System.Threading (>= 4.3) 633 | System.Security.Cryptography.Encoding (4.3) 634 | Microsoft.NETCore.Platforms (>= 1.1) 635 | runtime.native.System.Security.Cryptography.OpenSsl (>= 4.3) 636 | System.Collections (>= 4.3) 637 | System.Collections.Concurrent (>= 4.3) 638 | System.Linq (>= 4.3) 639 | System.Resources.ResourceManager (>= 4.3) 640 | System.Runtime (>= 4.3) 641 | System.Runtime.Extensions (>= 4.3) 642 | System.Runtime.Handles (>= 4.3) 643 | System.Runtime.InteropServices (>= 4.3) 644 | System.Security.Cryptography.Primitives (>= 4.3) 645 | System.Text.Encoding (>= 4.3) 646 | System.Security.Cryptography.OpenSsl (5.0) 647 | System.Formats.Asn1 (>= 5.0) - restriction: || (== net6.0) (&& (== netstandard2.0) (>= netcoreapp3.0)) 648 | System.Security.Cryptography.Pkcs (8.0) 649 | System.Buffers (>= 4.5.1) - restriction: || (&& (== net6.0) (< netstandard2.1)) (== netstandard2.0) 650 | System.Formats.Asn1 (>= 8.0) 651 | System.Memory (>= 4.5.5) - restriction: || (&& (== net6.0) (< netstandard2.1)) (== netstandard2.0) 652 | System.Security.Cryptography.Cng (>= 5.0) - restriction: || (&& (== net6.0) (< netstandard2.1)) (== netstandard2.0) 653 | System.Security.Cryptography.Primitives (4.3) 654 | System.Diagnostics.Debug (>= 4.3) 655 | System.Globalization (>= 4.3) 656 | System.IO (>= 4.3) 657 | System.Resources.ResourceManager (>= 4.3) 658 | System.Runtime (>= 4.3) 659 | System.Threading (>= 4.3) 660 | System.Threading.Tasks (>= 4.3) 661 | System.Security.Cryptography.ProtectedData (8.0) 662 | System.Security.Cryptography.X509Certificates (4.3.2) 663 | Microsoft.NETCore.Platforms (>= 1.1) 664 | runtime.native.System (>= 4.3) 665 | runtime.native.System.Net.Http (>= 4.3) 666 | runtime.native.System.Security.Cryptography.OpenSsl (>= 4.3.2) 667 | System.Collections (>= 4.3) 668 | System.Diagnostics.Debug (>= 4.3) 669 | System.Globalization (>= 4.3) 670 | System.Globalization.Calendars (>= 4.3) 671 | System.IO (>= 4.3) 672 | System.IO.FileSystem (>= 4.3) 673 | System.IO.FileSystem.Primitives (>= 4.3) 674 | System.Resources.ResourceManager (>= 4.3) 675 | System.Runtime (>= 4.3) 676 | System.Runtime.Extensions (>= 4.3) 677 | System.Runtime.Handles (>= 4.3) 678 | System.Runtime.InteropServices (>= 4.3) 679 | System.Runtime.Numerics (>= 4.3) 680 | System.Security.Cryptography.Algorithms (>= 4.3) 681 | System.Security.Cryptography.Cng (>= 4.3) 682 | System.Security.Cryptography.Csp (>= 4.3) 683 | System.Security.Cryptography.Encoding (>= 4.3) 684 | System.Security.Cryptography.OpenSsl (>= 4.3) 685 | System.Security.Cryptography.Primitives (>= 4.3) 686 | System.Text.Encoding (>= 4.3) 687 | System.Threading (>= 4.3) 688 | System.Security.Cryptography.Xml (8.0.1) 689 | System.Memory (>= 4.5.5) - restriction: == netstandard2.0 690 | System.Security.AccessControl (>= 6.0) - restriction: == netstandard2.0 691 | System.Security.Cryptography.Pkcs (>= 8.0) 692 | System.Security.Permissions (8.0) 693 | System.Security.AccessControl (>= 6.0) - restriction: || (&& (== net6.0) (>= net462)) (== netstandard2.0) 694 | System.Windows.Extensions (>= 8.0) - restriction: || (== net6.0) (&& (== netstandard2.0) (>= net6.0)) 695 | System.Security.Principal (4.3) 696 | System.Runtime (>= 4.3) 697 | System.Security.Principal.Windows (5.0) 698 | System.Text.Encoding (4.3) 699 | Microsoft.NETCore.Platforms (>= 1.1) 700 | Microsoft.NETCore.Targets (>= 1.1) 701 | System.Runtime (>= 4.3) 702 | System.Text.Encoding.CodePages (8.0) 703 | System.Runtime.CompilerServices.Unsafe (>= 6.0) 704 | System.Text.Encoding.Extensions (4.3) 705 | Microsoft.NETCore.Platforms (>= 1.1) 706 | Microsoft.NETCore.Targets (>= 1.1) 707 | System.Runtime (>= 4.3) 708 | System.Text.Encoding (>= 4.3) 709 | System.Text.Encodings.Web (8.0) - restriction: || (== net6.0) (&& (== netstandard2.0) (>= net472)) (&& (== netstandard2.0) (>= net6.0)) 710 | System.Runtime.CompilerServices.Unsafe (>= 6.0) 711 | System.Text.Json (8.0.4) 712 | System.Runtime.CompilerServices.Unsafe (>= 6.0) 713 | System.Text.Encodings.Web (>= 8.0) 714 | System.Threading (4.3) 715 | System.Runtime (>= 4.3) 716 | System.Threading.Tasks (>= 4.3) 717 | System.Threading.Tasks (4.3) 718 | Microsoft.NETCore.Platforms (>= 1.1) 719 | Microsoft.NETCore.Targets (>= 1.1) 720 | System.Runtime (>= 4.3) 721 | System.Threading.Tasks.Dataflow (8.0.1) 722 | System.Threading.Tasks.Extensions (4.5.4) - restriction: || (&& (== net6.0) (>= net472)) (&& (== net6.0) (< netcoreapp3.1)) (&& (== net6.0) (>= uap10.1)) (== netstandard2.0) 723 | System.Runtime.CompilerServices.Unsafe (>= 4.5.3) - restriction: || (&& (== net6.0) (>= net461)) (&& (== net6.0) (< netcoreapp2.1)) (&& (== net6.0) (< netstandard1.0)) (&& (== net6.0) (< netstandard2.0)) (&& (== net6.0) (>= wp8)) (== netstandard2.0) 724 | System.Threading.Tasks.Parallel (4.3) 725 | System.Collections.Concurrent (>= 4.3) 726 | System.Diagnostics.Debug (>= 4.3) 727 | System.Diagnostics.Tracing (>= 4.3) 728 | System.Resources.ResourceManager (>= 4.3) 729 | System.Runtime (>= 4.3) 730 | System.Runtime.Extensions (>= 4.3) 731 | System.Threading (>= 4.3) 732 | System.Threading.Tasks (>= 4.3) 733 | System.Threading.Thread (4.3) 734 | System.Runtime (>= 4.3) 735 | System.Threading.ThreadPool (4.3) 736 | System.Runtime (>= 4.3) 737 | System.Runtime.Handles (>= 4.3) 738 | System.Windows.Extensions (8.0) - restriction: || (== net6.0) (&& (== netstandard2.0) (>= net6.0)) 739 | 740 | GROUP Test 741 | RESTRICTION: == net6.0 742 | NUGET 743 | remote: https://api.nuget.org/v3/index.json 744 | FSharp.Compiler.Service (41.0.7) 745 | FSharp.Core (6.0.7) 746 | Microsoft.Build.Framework (>= 17.0) 747 | Microsoft.Build.Tasks.Core (>= 17.0) 748 | Microsoft.Build.Utilities.Core (>= 17.0) 749 | System.Buffers (>= 4.5.1) 750 | System.Collections.Immutable (>= 5.0) 751 | System.Diagnostics.Process (>= 4.3) 752 | System.Diagnostics.TraceSource (>= 4.3) 753 | System.Linq.Expressions (>= 4.3) 754 | System.Linq.Queryable (>= 4.3) 755 | System.Memory (>= 4.5.4) 756 | System.Net.Requests (>= 4.3) 757 | System.Net.Security (>= 4.3.1) 758 | System.Reflection.Emit (>= 4.3) 759 | System.Reflection.Metadata (>= 5.0) 760 | System.Reflection.TypeExtensions (>= 4.3) 761 | System.Runtime (>= 4.3) 762 | System.Runtime.CompilerServices.Unsafe (>= 6.0) 763 | System.Runtime.InteropServices (>= 4.3) 764 | System.Runtime.Loader (>= 4.3) 765 | System.Security.Claims (>= 4.3) 766 | System.Security.Cryptography.Algorithms (>= 4.3) 767 | System.Security.Principal (>= 4.3) 768 | System.Threading.Tasks.Parallel (>= 4.3) 769 | System.Threading.Thread (>= 4.3) 770 | System.Threading.ThreadPool (>= 4.3) 771 | FSharp.Core (6.0.7) 772 | FsUnit (6.0) 773 | FSharp.Core (>= 5.0.2) 774 | NUnit (>= 4.0.1) 775 | Microsoft.Build.Framework (17.11.4) 776 | Microsoft.Win32.Registry (>= 5.0) 777 | System.Memory (>= 4.5.5) 778 | System.Runtime.CompilerServices.Unsafe (>= 6.0) 779 | System.Security.Principal.Windows (>= 5.0) 780 | Microsoft.Build.Tasks.Core (17.11.4) 781 | Microsoft.Build.Framework (>= 17.11.4) 782 | Microsoft.Build.Utilities.Core (>= 17.11.4) 783 | Microsoft.NET.StringTools (>= 17.11.4) 784 | Microsoft.Win32.Registry (>= 5.0) 785 | System.CodeDom (>= 8.0) 786 | System.Collections.Immutable (>= 8.0) 787 | System.Configuration.ConfigurationManager (>= 8.0) 788 | System.Memory (>= 4.5.5) 789 | System.Reflection.Metadata (>= 8.0) 790 | System.Resources.Extensions (>= 8.0) 791 | System.Runtime.CompilerServices.Unsafe (>= 6.0) 792 | System.Security.Cryptography.Pkcs (>= 8.0) 793 | System.Security.Cryptography.Xml (>= 8.0) 794 | System.Security.Principal.Windows (>= 5.0) 795 | System.Text.Encoding.CodePages (>= 7.0) 796 | System.Threading.Tasks.Dataflow (>= 8.0) 797 | Microsoft.Build.Utilities.Core (17.11.4) 798 | Microsoft.Build.Framework (>= 17.11.4) 799 | Microsoft.NET.StringTools (>= 17.11.4) 800 | Microsoft.Win32.Registry (>= 5.0) 801 | System.Collections.Immutable (>= 8.0) 802 | System.Configuration.ConfigurationManager (>= 8.0) 803 | System.Memory (>= 4.5.5) 804 | System.Runtime.CompilerServices.Unsafe (>= 6.0) 805 | System.Security.Principal.Windows (>= 5.0) 806 | System.Text.Encoding.CodePages (>= 7.0) 807 | Microsoft.CodeCoverage (17.11.1) 808 | Microsoft.NET.StringTools (17.11.4) 809 | System.Memory (>= 4.5.5) 810 | System.Runtime.CompilerServices.Unsafe (>= 6.0) 811 | Microsoft.NET.Test.Sdk (17.11.1) 812 | Microsoft.CodeCoverage (>= 17.11.1) 813 | Microsoft.TestPlatform.TestHost (>= 17.11.1) 814 | Microsoft.NETCore.Platforms (7.0.4) 815 | Microsoft.NETCore.Targets (5.0) 816 | Microsoft.TestPlatform.ObjectModel (17.11.1) 817 | System.Reflection.Metadata (>= 1.6) 818 | Microsoft.TestPlatform.TestHost (17.11.1) 819 | Microsoft.TestPlatform.ObjectModel (>= 17.11.1) 820 | Newtonsoft.Json (>= 13.0.1) 821 | Microsoft.Win32.Primitives (4.3) 822 | Microsoft.NETCore.Platforms (>= 1.1) 823 | Microsoft.NETCore.Targets (>= 1.1) 824 | System.Runtime (>= 4.3) 825 | Microsoft.Win32.Registry (5.0) 826 | System.Security.AccessControl (>= 5.0) 827 | System.Security.Principal.Windows (>= 5.0) 828 | Newtonsoft.Json (13.0.3) 829 | NUnit (4.2.2) 830 | NUnit.Console (3.18.1) 831 | NUnit.ConsoleRunner (>= 3.18.1) 832 | NUnit.Extension.NUnitProjectLoader (>= 3.6) 833 | NUnit.Extension.NUnitV2Driver (>= 3.8) 834 | NUnit.Extension.NUnitV2ResultWriter (>= 3.6) 835 | NUnit.Extension.TeamCityEventListener (>= 1.0.7) 836 | NUnit.Extension.VSProjectLoader (>= 3.8) 837 | NUnit.ConsoleRunner (3.18.1) 838 | NUnit.Extension.NUnitProjectLoader (3.8) 839 | NUnit.Extension.NUnitV2Driver (3.9) 840 | NUnit.Extension.NUnitV2ResultWriter (3.8) 841 | NUnit.Extension.TeamCityEventListener (1.0.9) 842 | NUnit.Extension.VSProjectLoader (3.9) 843 | NUnit3TestAdapter (4.6.0) - version_in_path: true 844 | runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl (4.3.3) 845 | runtime.debian.9-x64.runtime.native.System.Security.Cryptography.OpenSsl (4.3.3) 846 | runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl (4.3.3) 847 | runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl (4.3.3) 848 | runtime.fedora.27-x64.runtime.native.System.Security.Cryptography.OpenSsl (4.3.3) 849 | runtime.fedora.28-x64.runtime.native.System.Security.Cryptography.OpenSsl (4.3.3) 850 | runtime.native.System (4.3.1) 851 | Microsoft.NETCore.Platforms (>= 1.1.1) 852 | Microsoft.NETCore.Targets (>= 1.1.3) 853 | runtime.native.System.Net.Http (4.3.1) 854 | Microsoft.NETCore.Platforms (>= 1.1.1) 855 | Microsoft.NETCore.Targets (>= 1.1.3) 856 | runtime.native.System.Net.Security (4.3.1) 857 | Microsoft.NETCore.Platforms (>= 1.1.1) 858 | Microsoft.NETCore.Targets (>= 1.1.3) 859 | runtime.native.System.Security.Cryptography.Apple (4.3.1) 860 | runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple (>= 4.3.1) 861 | runtime.native.System.Security.Cryptography.OpenSsl (4.3.3) 862 | runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl (>= 4.3.3) 863 | runtime.debian.9-x64.runtime.native.System.Security.Cryptography.OpenSsl (>= 4.3.3) 864 | runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl (>= 4.3.3) 865 | runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl (>= 4.3.3) 866 | runtime.fedora.27-x64.runtime.native.System.Security.Cryptography.OpenSsl (>= 4.3.3) 867 | runtime.fedora.28-x64.runtime.native.System.Security.Cryptography.OpenSsl (>= 4.3.3) 868 | runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl (>= 4.3.3) 869 | runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl (>= 4.3.3) 870 | runtime.opensuse.42.3-x64.runtime.native.System.Security.Cryptography.OpenSsl (>= 4.3.3) 871 | runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl (>= 4.3.3) 872 | runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl (>= 4.3.3) 873 | runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl (>= 4.3.3) 874 | runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl (>= 4.3.3) 875 | runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl (>= 4.3.3) 876 | runtime.ubuntu.18.04-x64.runtime.native.System.Security.Cryptography.OpenSsl (>= 4.3.3) 877 | runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl (4.3.3) 878 | runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl (4.3.3) 879 | runtime.opensuse.42.3-x64.runtime.native.System.Security.Cryptography.OpenSsl (4.3.3) 880 | runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple (4.3.1) 881 | runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl (4.3.3) 882 | runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl (4.3.3) 883 | runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl (4.3.3) 884 | runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl (4.3.3) 885 | runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl (4.3.3) 886 | runtime.ubuntu.18.04-x64.runtime.native.System.Security.Cryptography.OpenSsl (4.3.3) 887 | System.Buffers (4.5.1) 888 | System.CodeDom (8.0) 889 | System.Collections (4.3) 890 | Microsoft.NETCore.Platforms (>= 1.1) 891 | Microsoft.NETCore.Targets (>= 1.1) 892 | System.Runtime (>= 4.3) 893 | System.Collections.Concurrent (4.3) 894 | System.Collections (>= 4.3) 895 | System.Diagnostics.Debug (>= 4.3) 896 | System.Diagnostics.Tracing (>= 4.3) 897 | System.Globalization (>= 4.3) 898 | System.Reflection (>= 4.3) 899 | System.Resources.ResourceManager (>= 4.3) 900 | System.Runtime (>= 4.3) 901 | System.Runtime.Extensions (>= 4.3) 902 | System.Threading (>= 4.3) 903 | System.Threading.Tasks (>= 4.3) 904 | System.Collections.Immutable (8.0) 905 | System.Runtime.CompilerServices.Unsafe (>= 6.0) 906 | System.Configuration.ConfigurationManager (8.0) 907 | System.Security.Cryptography.ProtectedData (>= 8.0) 908 | System.Diagnostics.Debug (4.3) 909 | Microsoft.NETCore.Platforms (>= 1.1) 910 | Microsoft.NETCore.Targets (>= 1.1) 911 | System.Runtime (>= 4.3) 912 | System.Diagnostics.DiagnosticSource (8.0.1) 913 | System.Runtime.CompilerServices.Unsafe (>= 6.0) 914 | System.Diagnostics.Process (4.3) 915 | Microsoft.NETCore.Platforms (>= 1.1) 916 | Microsoft.Win32.Primitives (>= 4.3) 917 | Microsoft.Win32.Registry (>= 4.3) 918 | runtime.native.System (>= 4.3) 919 | System.Collections (>= 4.3) 920 | System.Diagnostics.Debug (>= 4.3) 921 | System.Globalization (>= 4.3) 922 | System.IO (>= 4.3) 923 | System.IO.FileSystem (>= 4.3) 924 | System.IO.FileSystem.Primitives (>= 4.3) 925 | System.Resources.ResourceManager (>= 4.3) 926 | System.Runtime (>= 4.3) 927 | System.Runtime.Extensions (>= 4.3) 928 | System.Runtime.Handles (>= 4.3) 929 | System.Runtime.InteropServices (>= 4.3) 930 | System.Text.Encoding (>= 4.3) 931 | System.Text.Encoding.Extensions (>= 4.3) 932 | System.Threading (>= 4.3) 933 | System.Threading.Tasks (>= 4.3) 934 | System.Threading.Thread (>= 4.3) 935 | System.Threading.ThreadPool (>= 4.3) 936 | System.Diagnostics.TraceSource (4.3) 937 | Microsoft.NETCore.Platforms (>= 1.1) 938 | runtime.native.System (>= 4.3) 939 | System.Collections (>= 4.3) 940 | System.Diagnostics.Debug (>= 4.3) 941 | System.Globalization (>= 4.3) 942 | System.Resources.ResourceManager (>= 4.3) 943 | System.Runtime (>= 4.3) 944 | System.Runtime.Extensions (>= 4.3) 945 | System.Threading (>= 4.3) 946 | System.Diagnostics.Tracing (4.3) 947 | Microsoft.NETCore.Platforms (>= 1.1) 948 | Microsoft.NETCore.Targets (>= 1.1) 949 | System.Runtime (>= 4.3) 950 | System.Formats.Asn1 (8.0.1) 951 | System.Globalization (4.3) 952 | Microsoft.NETCore.Platforms (>= 1.1) 953 | Microsoft.NETCore.Targets (>= 1.1) 954 | System.Runtime (>= 4.3) 955 | System.Globalization.Calendars (4.3) 956 | Microsoft.NETCore.Platforms (>= 1.1) 957 | Microsoft.NETCore.Targets (>= 1.1) 958 | System.Globalization (>= 4.3) 959 | System.Runtime (>= 4.3) 960 | System.Globalization.Extensions (4.3) 961 | Microsoft.NETCore.Platforms (>= 1.1) 962 | System.Globalization (>= 4.3) 963 | System.Resources.ResourceManager (>= 4.3) 964 | System.Runtime (>= 4.3) 965 | System.Runtime.Extensions (>= 4.3) 966 | System.Runtime.InteropServices (>= 4.3) 967 | System.IO (4.3) 968 | Microsoft.NETCore.Platforms (>= 1.1) 969 | Microsoft.NETCore.Targets (>= 1.1) 970 | System.Runtime (>= 4.3) 971 | System.Text.Encoding (>= 4.3) 972 | System.Threading.Tasks (>= 4.3) 973 | System.IO.FileSystem (4.3) 974 | Microsoft.NETCore.Platforms (>= 1.1) 975 | Microsoft.NETCore.Targets (>= 1.1) 976 | System.IO (>= 4.3) 977 | System.IO.FileSystem.Primitives (>= 4.3) 978 | System.Runtime (>= 4.3) 979 | System.Runtime.Handles (>= 4.3) 980 | System.Text.Encoding (>= 4.3) 981 | System.Threading.Tasks (>= 4.3) 982 | System.IO.FileSystem.Primitives (4.3) 983 | System.Runtime (>= 4.3) 984 | System.Linq (4.3) 985 | System.Collections (>= 4.3) 986 | System.Diagnostics.Debug (>= 4.3) 987 | System.Resources.ResourceManager (>= 4.3) 988 | System.Runtime (>= 4.3) 989 | System.Runtime.Extensions (>= 4.3) 990 | System.Linq.Expressions (4.3) 991 | System.Collections (>= 4.3) 992 | System.Diagnostics.Debug (>= 4.3) 993 | System.Globalization (>= 4.3) 994 | System.IO (>= 4.3) 995 | System.Linq (>= 4.3) 996 | System.ObjectModel (>= 4.3) 997 | System.Reflection (>= 4.3) 998 | System.Reflection.Emit (>= 4.3) 999 | System.Reflection.Emit.ILGeneration (>= 4.3) 1000 | System.Reflection.Emit.Lightweight (>= 4.3) 1001 | System.Reflection.Extensions (>= 4.3) 1002 | System.Reflection.Primitives (>= 4.3) 1003 | System.Reflection.TypeExtensions (>= 4.3) 1004 | System.Resources.ResourceManager (>= 4.3) 1005 | System.Runtime (>= 4.3) 1006 | System.Runtime.Extensions (>= 4.3) 1007 | System.Threading (>= 4.3) 1008 | System.Linq.Queryable (4.3) 1009 | System.Collections (>= 4.3) 1010 | System.Diagnostics.Debug (>= 4.3) 1011 | System.Linq (>= 4.3) 1012 | System.Linq.Expressions (>= 4.3) 1013 | System.Reflection (>= 4.3) 1014 | System.Reflection.Extensions (>= 4.3) 1015 | System.Resources.ResourceManager (>= 4.3) 1016 | System.Runtime (>= 4.3) 1017 | System.Memory (4.5.5) 1018 | System.Net.Http (4.3.4) 1019 | Microsoft.NETCore.Platforms (>= 1.1.1) 1020 | runtime.native.System (>= 4.3) 1021 | runtime.native.System.Net.Http (>= 4.3) 1022 | runtime.native.System.Security.Cryptography.OpenSsl (>= 4.3.2) 1023 | System.Collections (>= 4.3) 1024 | System.Diagnostics.Debug (>= 4.3) 1025 | System.Diagnostics.DiagnosticSource (>= 4.3) 1026 | System.Diagnostics.Tracing (>= 4.3) 1027 | System.Globalization (>= 4.3) 1028 | System.Globalization.Extensions (>= 4.3) 1029 | System.IO (>= 4.3) 1030 | System.IO.FileSystem (>= 4.3) 1031 | System.Net.Primitives (>= 4.3) 1032 | System.Resources.ResourceManager (>= 4.3) 1033 | System.Runtime (>= 4.3) 1034 | System.Runtime.Extensions (>= 4.3) 1035 | System.Runtime.Handles (>= 4.3) 1036 | System.Runtime.InteropServices (>= 4.3) 1037 | System.Security.Cryptography.Algorithms (>= 4.3) 1038 | System.Security.Cryptography.Encoding (>= 4.3) 1039 | System.Security.Cryptography.OpenSsl (>= 4.3) 1040 | System.Security.Cryptography.Primitives (>= 4.3) 1041 | System.Security.Cryptography.X509Certificates (>= 4.3) 1042 | System.Text.Encoding (>= 4.3) 1043 | System.Threading (>= 4.3) 1044 | System.Threading.Tasks (>= 4.3) 1045 | System.Net.Primitives (4.3.1) 1046 | Microsoft.NETCore.Platforms (>= 1.1.1) 1047 | Microsoft.NETCore.Targets (>= 1.1.3) 1048 | System.Runtime (>= 4.3.1) 1049 | System.Runtime.Handles (>= 4.3) 1050 | System.Net.Requests (4.3) 1051 | Microsoft.NETCore.Platforms (>= 1.1) 1052 | System.Collections (>= 4.3) 1053 | System.Diagnostics.Debug (>= 4.3) 1054 | System.Diagnostics.Tracing (>= 4.3) 1055 | System.Globalization (>= 4.3) 1056 | System.IO (>= 4.3) 1057 | System.Net.Http (>= 4.3) 1058 | System.Net.Primitives (>= 4.3) 1059 | System.Net.WebHeaderCollection (>= 4.3) 1060 | System.Resources.ResourceManager (>= 4.3) 1061 | System.Runtime (>= 4.3) 1062 | System.Threading (>= 4.3) 1063 | System.Threading.Tasks (>= 4.3) 1064 | System.Net.Security (4.3.2) 1065 | Microsoft.NETCore.Platforms (>= 1.1) 1066 | Microsoft.Win32.Primitives (>= 4.3) 1067 | runtime.native.System (>= 4.3) 1068 | runtime.native.System.Net.Security (>= 4.3) 1069 | runtime.native.System.Security.Cryptography.OpenSsl (>= 4.3.2) 1070 | System.Collections (>= 4.3) 1071 | System.Collections.Concurrent (>= 4.3) 1072 | System.Diagnostics.Tracing (>= 4.3) 1073 | System.Globalization (>= 4.3) 1074 | System.Globalization.Extensions (>= 4.3) 1075 | System.IO (>= 4.3) 1076 | System.Net.Primitives (>= 4.3) 1077 | System.Resources.ResourceManager (>= 4.3) 1078 | System.Runtime (>= 4.3) 1079 | System.Runtime.Extensions (>= 4.3) 1080 | System.Runtime.Handles (>= 4.3) 1081 | System.Runtime.InteropServices (>= 4.3) 1082 | System.Security.Claims (>= 4.3) 1083 | System.Security.Cryptography.Algorithms (>= 4.3) 1084 | System.Security.Cryptography.Encoding (>= 4.3) 1085 | System.Security.Cryptography.OpenSsl (>= 4.3) 1086 | System.Security.Cryptography.Primitives (>= 4.3) 1087 | System.Security.Cryptography.X509Certificates (>= 4.3) 1088 | System.Security.Principal (>= 4.3) 1089 | System.Text.Encoding (>= 4.3) 1090 | System.Threading (>= 4.3) 1091 | System.Threading.Tasks (>= 4.3) 1092 | System.Threading.ThreadPool (>= 4.3) 1093 | System.Net.WebHeaderCollection (4.3) 1094 | System.Collections (>= 4.3) 1095 | System.Resources.ResourceManager (>= 4.3) 1096 | System.Runtime (>= 4.3) 1097 | System.Runtime.Extensions (>= 4.3) 1098 | System.ObjectModel (4.3) 1099 | System.Collections (>= 4.3) 1100 | System.Diagnostics.Debug (>= 4.3) 1101 | System.Resources.ResourceManager (>= 4.3) 1102 | System.Runtime (>= 4.3) 1103 | System.Threading (>= 4.3) 1104 | System.Reflection (4.3) 1105 | Microsoft.NETCore.Platforms (>= 1.1) 1106 | Microsoft.NETCore.Targets (>= 1.1) 1107 | System.IO (>= 4.3) 1108 | System.Reflection.Primitives (>= 4.3) 1109 | System.Runtime (>= 4.3) 1110 | System.Reflection.Emit (4.7) 1111 | System.Reflection.Emit.ILGeneration (4.7) 1112 | System.Reflection.Emit.Lightweight (4.7) 1113 | System.Reflection.Extensions (4.3) 1114 | Microsoft.NETCore.Platforms (>= 1.1) 1115 | Microsoft.NETCore.Targets (>= 1.1) 1116 | System.Reflection (>= 4.3) 1117 | System.Runtime (>= 4.3) 1118 | System.Reflection.Metadata (8.0) 1119 | System.Collections.Immutable (>= 8.0) 1120 | System.Reflection.Primitives (4.3) 1121 | Microsoft.NETCore.Platforms (>= 1.1) 1122 | Microsoft.NETCore.Targets (>= 1.1) 1123 | System.Runtime (>= 4.3) 1124 | System.Reflection.TypeExtensions (4.7) 1125 | System.Resources.Extensions (8.0) 1126 | System.Resources.ResourceManager (4.3) 1127 | Microsoft.NETCore.Platforms (>= 1.1) 1128 | Microsoft.NETCore.Targets (>= 1.1) 1129 | System.Globalization (>= 4.3) 1130 | System.Reflection (>= 4.3) 1131 | System.Runtime (>= 4.3) 1132 | System.Runtime (4.3.1) 1133 | Microsoft.NETCore.Platforms (>= 1.1.1) 1134 | Microsoft.NETCore.Targets (>= 1.1.3) 1135 | System.Runtime.CompilerServices.Unsafe (6.0) 1136 | System.Runtime.Extensions (4.3.1) 1137 | Microsoft.NETCore.Platforms (>= 1.1.1) 1138 | Microsoft.NETCore.Targets (>= 1.1.3) 1139 | System.Runtime (>= 4.3.1) 1140 | System.Runtime.Handles (4.3) 1141 | Microsoft.NETCore.Platforms (>= 1.1) 1142 | Microsoft.NETCore.Targets (>= 1.1) 1143 | System.Runtime (>= 4.3) 1144 | System.Runtime.InteropServices (4.3) 1145 | Microsoft.NETCore.Platforms (>= 1.1) 1146 | Microsoft.NETCore.Targets (>= 1.1) 1147 | System.Reflection (>= 4.3) 1148 | System.Reflection.Primitives (>= 4.3) 1149 | System.Runtime (>= 4.3) 1150 | System.Runtime.Handles (>= 4.3) 1151 | System.Runtime.Loader (4.3) 1152 | System.IO (>= 4.3) 1153 | System.Reflection (>= 4.3) 1154 | System.Runtime (>= 4.3) 1155 | System.Runtime.Numerics (4.3) 1156 | System.Globalization (>= 4.3) 1157 | System.Resources.ResourceManager (>= 4.3) 1158 | System.Runtime (>= 4.3) 1159 | System.Runtime.Extensions (>= 4.3) 1160 | System.Security.AccessControl (6.0.1) 1161 | System.Security.Claims (4.3) 1162 | System.Collections (>= 4.3) 1163 | System.Globalization (>= 4.3) 1164 | System.IO (>= 4.3) 1165 | System.Resources.ResourceManager (>= 4.3) 1166 | System.Runtime (>= 4.3) 1167 | System.Runtime.Extensions (>= 4.3) 1168 | System.Security.Principal (>= 4.3) 1169 | System.Security.Cryptography.Algorithms (4.3.1) 1170 | Microsoft.NETCore.Platforms (>= 1.1) 1171 | runtime.native.System.Security.Cryptography.Apple (>= 4.3.1) 1172 | runtime.native.System.Security.Cryptography.OpenSsl (>= 4.3.2) 1173 | System.Collections (>= 4.3) 1174 | System.IO (>= 4.3) 1175 | System.Resources.ResourceManager (>= 4.3) 1176 | System.Runtime (>= 4.3) 1177 | System.Runtime.Extensions (>= 4.3) 1178 | System.Runtime.Handles (>= 4.3) 1179 | System.Runtime.InteropServices (>= 4.3) 1180 | System.Runtime.Numerics (>= 4.3) 1181 | System.Security.Cryptography.Encoding (>= 4.3) 1182 | System.Security.Cryptography.Primitives (>= 4.3) 1183 | System.Text.Encoding (>= 4.3) 1184 | System.Security.Cryptography.Cng (5.0) 1185 | System.Formats.Asn1 (>= 5.0) 1186 | System.Security.Cryptography.Csp (4.3) 1187 | Microsoft.NETCore.Platforms (>= 1.1) 1188 | System.IO (>= 4.3) 1189 | System.Reflection (>= 4.3) 1190 | System.Resources.ResourceManager (>= 4.3) 1191 | System.Runtime (>= 4.3) 1192 | System.Runtime.Extensions (>= 4.3) 1193 | System.Runtime.Handles (>= 4.3) 1194 | System.Runtime.InteropServices (>= 4.3) 1195 | System.Security.Cryptography.Algorithms (>= 4.3) 1196 | System.Security.Cryptography.Encoding (>= 4.3) 1197 | System.Security.Cryptography.Primitives (>= 4.3) 1198 | System.Text.Encoding (>= 4.3) 1199 | System.Threading (>= 4.3) 1200 | System.Security.Cryptography.Encoding (4.3) 1201 | Microsoft.NETCore.Platforms (>= 1.1) 1202 | runtime.native.System.Security.Cryptography.OpenSsl (>= 4.3) 1203 | System.Collections (>= 4.3) 1204 | System.Collections.Concurrent (>= 4.3) 1205 | System.Linq (>= 4.3) 1206 | System.Resources.ResourceManager (>= 4.3) 1207 | System.Runtime (>= 4.3) 1208 | System.Runtime.Extensions (>= 4.3) 1209 | System.Runtime.Handles (>= 4.3) 1210 | System.Runtime.InteropServices (>= 4.3) 1211 | System.Security.Cryptography.Primitives (>= 4.3) 1212 | System.Text.Encoding (>= 4.3) 1213 | System.Security.Cryptography.OpenSsl (5.0) 1214 | System.Formats.Asn1 (>= 5.0) 1215 | System.Security.Cryptography.Pkcs (8.0) 1216 | System.Formats.Asn1 (>= 8.0) 1217 | System.Security.Cryptography.Primitives (4.3) 1218 | System.Diagnostics.Debug (>= 4.3) 1219 | System.Globalization (>= 4.3) 1220 | System.IO (>= 4.3) 1221 | System.Resources.ResourceManager (>= 4.3) 1222 | System.Runtime (>= 4.3) 1223 | System.Threading (>= 4.3) 1224 | System.Threading.Tasks (>= 4.3) 1225 | System.Security.Cryptography.ProtectedData (8.0) 1226 | System.Security.Cryptography.X509Certificates (4.3.2) 1227 | Microsoft.NETCore.Platforms (>= 1.1) 1228 | runtime.native.System (>= 4.3) 1229 | runtime.native.System.Net.Http (>= 4.3) 1230 | runtime.native.System.Security.Cryptography.OpenSsl (>= 4.3.2) 1231 | System.Collections (>= 4.3) 1232 | System.Diagnostics.Debug (>= 4.3) 1233 | System.Globalization (>= 4.3) 1234 | System.Globalization.Calendars (>= 4.3) 1235 | System.IO (>= 4.3) 1236 | System.IO.FileSystem (>= 4.3) 1237 | System.IO.FileSystem.Primitives (>= 4.3) 1238 | System.Resources.ResourceManager (>= 4.3) 1239 | System.Runtime (>= 4.3) 1240 | System.Runtime.Extensions (>= 4.3) 1241 | System.Runtime.Handles (>= 4.3) 1242 | System.Runtime.InteropServices (>= 4.3) 1243 | System.Runtime.Numerics (>= 4.3) 1244 | System.Security.Cryptography.Algorithms (>= 4.3) 1245 | System.Security.Cryptography.Cng (>= 4.3) 1246 | System.Security.Cryptography.Csp (>= 4.3) 1247 | System.Security.Cryptography.Encoding (>= 4.3) 1248 | System.Security.Cryptography.OpenSsl (>= 4.3) 1249 | System.Security.Cryptography.Primitives (>= 4.3) 1250 | System.Text.Encoding (>= 4.3) 1251 | System.Threading (>= 4.3) 1252 | System.Security.Cryptography.Xml (8.0.1) 1253 | System.Security.Cryptography.Pkcs (>= 8.0) 1254 | System.Security.Principal (4.3) 1255 | System.Runtime (>= 4.3) 1256 | System.Security.Principal.Windows (5.0) 1257 | System.Text.Encoding (4.3) 1258 | Microsoft.NETCore.Platforms (>= 1.1) 1259 | Microsoft.NETCore.Targets (>= 1.1) 1260 | System.Runtime (>= 4.3) 1261 | System.Text.Encoding.CodePages (8.0) 1262 | System.Runtime.CompilerServices.Unsafe (>= 6.0) 1263 | System.Text.Encoding.Extensions (4.3) 1264 | Microsoft.NETCore.Platforms (>= 1.1) 1265 | Microsoft.NETCore.Targets (>= 1.1) 1266 | System.Runtime (>= 4.3) 1267 | System.Text.Encoding (>= 4.3) 1268 | System.Threading (4.3) 1269 | System.Runtime (>= 4.3) 1270 | System.Threading.Tasks (>= 4.3) 1271 | System.Threading.Tasks (4.3) 1272 | Microsoft.NETCore.Platforms (>= 1.1) 1273 | Microsoft.NETCore.Targets (>= 1.1) 1274 | System.Runtime (>= 4.3) 1275 | System.Threading.Tasks.Dataflow (8.0.1) 1276 | System.Threading.Tasks.Parallel (4.3) 1277 | System.Collections.Concurrent (>= 4.3) 1278 | System.Diagnostics.Debug (>= 4.3) 1279 | System.Diagnostics.Tracing (>= 4.3) 1280 | System.Resources.ResourceManager (>= 4.3) 1281 | System.Runtime (>= 4.3) 1282 | System.Runtime.Extensions (>= 4.3) 1283 | System.Threading (>= 4.3) 1284 | System.Threading.Tasks (>= 4.3) 1285 | System.Threading.Thread (4.3) 1286 | System.Runtime (>= 4.3) 1287 | System.Threading.ThreadPool (4.3) 1288 | System.Runtime (>= 4.3) 1289 | System.Runtime.Handles (>= 4.3) 1290 | -------------------------------------------------------------------------------- /src/ExcelProvider.DesignTime/AssemblyInfo.fs: -------------------------------------------------------------------------------- 1 | // Auto-Generated by FAKE; do not edit 2 | namespace System 3 | 4 | open System.Reflection 5 | 6 | [] 7 | [] 8 | [] 9 | [] 10 | [] 11 | do () 12 | 13 | module internal AssemblyVersionInformation = 14 | [] 15 | let AssemblyTitle = "ExcelProvider.DesignTime" 16 | 17 | [] 18 | let AssemblyProduct = "ExcelProvider" 19 | 20 | [] 21 | let AssemblyDescription = 22 | "This library implements a read-only Excel type provider for Net Standard 2.0." 23 | 24 | [] 25 | let AssemblyVersion = "3.0.0" 26 | 27 | [] 28 | let AssemblyFileVersion = "3.0.0" 29 | -------------------------------------------------------------------------------- /src/ExcelProvider.DesignTime/ExcelProvider.DesignTime.fs: -------------------------------------------------------------------------------- 1 | module FSharp.Interop.Excel.ExcelProvider.ProviderImplementation 2 | 3 | open System 4 | open System.Collections.Generic 5 | open System.IO 6 | open FSharp.Interop.Excel 7 | open FSharp.Interop.Excel.ExcelProvider 8 | open Microsoft.FSharp.Core.CompilerServices 9 | open ProviderImplementation.ProvidedTypes 10 | 11 | [] 12 | module internal Helpers = 13 | 14 | // Active patterns & operators for parsing strings 15 | let (@?) (s: string) i = 16 | if i >= s.Length then None else Some s.[i] 17 | 18 | let inline satisfies predicate (charOption: option) = 19 | match charOption with 20 | | Some c when predicate c -> charOption 21 | | _ -> None 22 | 23 | let (|EOF|_|) = 24 | function 25 | | Some _ -> None 26 | | _ -> Some() 27 | 28 | let (|LetterDigit|_|) = satisfies Char.IsLetterOrDigit 29 | let (|Upper|_|) = satisfies Char.IsUpper 30 | let (|Lower|_|) = satisfies Char.IsLower 31 | 32 | /// Turns a string into a nice PascalCase identifier 33 | let niceName (set: System.Collections.Generic.HashSet<_>) (s: string) = 34 | if s = s.ToUpper() then 35 | s 36 | else 37 | // Starting to parse a new segment 38 | let rec restart i = 39 | seq { 40 | match s @? i with 41 | | EOF -> () 42 | | LetterDigit _ & Upper _ -> yield! upperStart i (i + 1) 43 | | LetterDigit _ -> yield! consume i false (i + 1) 44 | | _ -> yield! restart (i + 1) 45 | } 46 | 47 | // Parsed first upper case letter, continue either all lower or all upper 48 | and upperStart from i = 49 | seq { 50 | match s @? i with 51 | | Upper _ -> yield! consume from true (i + 1) 52 | | Lower _ -> yield! consume from false (i + 1) 53 | | _ -> yield! restart (i + 1) 54 | } 55 | 56 | // Consume are letters of the same kind (either all lower or all upper) 57 | and consume from takeUpper i = 58 | seq { 59 | match s @? i with 60 | | Lower _ when not takeUpper -> yield! consume from takeUpper (i + 1) 61 | | Upper _ when takeUpper -> yield! consume from takeUpper (i + 1) 62 | | _ -> 63 | yield from, i 64 | yield! restart i 65 | } 66 | 67 | // Split string into segments and turn them to PascalCase 68 | let mutable name = 69 | seq { 70 | for i1, i2 in restart 0 do 71 | let sub = s.Substring(i1, i2 - i1) 72 | 73 | if Seq.forall Char.IsLetterOrDigit sub then 74 | yield sub.[0].ToString().ToUpper() + sub.ToLower().Substring(1) 75 | } 76 | |> String.concat "" 77 | 78 | while set.Contains name do 79 | let mutable lastLetterPos = String.length name - 1 80 | 81 | while Char.IsDigit name.[lastLetterPos] && lastLetterPos > 0 do 82 | lastLetterPos <- lastLetterPos - 1 83 | 84 | if lastLetterPos = name.Length - 1 then 85 | name <- name + "2" 86 | elif lastLetterPos = 0 then 87 | name <- (UInt64.Parse name + 1UL).ToString() 88 | else 89 | let number = name.Substring(lastLetterPos + 1) 90 | name <- name.Substring(0, lastLetterPos + 1) + (UInt64.Parse number + 1UL).ToString() 91 | 92 | set.Add name |> ignore 93 | name 94 | 95 | 96 | let failInvalidCast fromObj (fromType: Type) (toType: Type) columnName rowIndex filename sheetname = 97 | sprintf 98 | "ExcelProvider: Cannot cast '%A' a '%s' to '%s'.\nFile: '%s'. Sheet: '%s'\nColumn '%s'. Row %i." 99 | fromObj 100 | fromType.FullName 101 | toType.FullName 102 | filename 103 | sheetname 104 | columnName 105 | rowIndex 106 | |> InvalidCastException 107 | |> raise 108 | 109 | // Avoids "warning FS0025: Incomplete pattern matches on this expression" 110 | // when using: (fun [row] -> <@@ ... @@>) 111 | let singleItemOrFail func items = 112 | match items with 113 | | [ item ] -> func item 114 | | _ -> failwith "ExcelProvider: Expected single item list." 115 | 116 | // Avoids "warning FS0025: Incomplete pattern matches on this expression" 117 | // when using: (fun [row] -> <@@ ... @@>) 118 | let twoItemsOrFail func items = 119 | match items with 120 | | [ a; b ] -> func a b 121 | | _ -> failwith "ExcelProvider: Expected two item list." 122 | 123 | // Avoids "warning FS0025: Incomplete pattern matches on this expression" 124 | // when using: (fun [row] -> <@@ ... @@>) 125 | let threeItemsOrFail func items = 126 | match items with 127 | | [ a; b; c ] -> func a b c 128 | | _ -> failwith "ExcelProvider: Expected two item list." 129 | 130 | // Avoids "warning FS0025: Incomplete pattern matches on this expression" 131 | // when using: (fun [] -> <@@ ... @@>) 132 | let emptyListOrFail func items = 133 | match items with 134 | | [] -> func () 135 | | _ -> failwith "ExcelProvider: Expected empty list" 136 | 137 | 138 | // get the type, and implementation of a getter property based on a template value 139 | let propertyImplementation columnIndex columnName (value: obj) = 140 | match value with 141 | | :? float -> 142 | typeof, (fun row -> <@@ (%%row: Row).TryGetNullableValue columnIndex columnName @@>) 143 | | :? bool -> typeof, (fun row -> <@@ (%%row: Row).TryGetNullableValue columnIndex columnName @@>) 144 | | :? DateTime -> 145 | typeof, (fun row -> <@@ (%%row: Row).TryGetNullableValue columnIndex columnName @@>) 146 | | :? string -> typeof, (fun row -> <@@ (%%row: Row).TryGetValue columnIndex columnName @@>) 147 | | _ -> typeof, (fun row -> <@@ (%%row: Row).GetValue columnIndex @@>) 148 | |> fun (cellType, getter) -> cellType, singleItemOrFail getter 149 | 150 | // gets a list of column definition information for the columns in a view 151 | let getColumnDefinitions (data: View) hasheaders forcestring = 152 | let getCell = getCellValue data 153 | 154 | [ for columnIndex in 0 .. data.ColumnMappings.Count - 1 do 155 | let rawColumnName = 156 | if hasheaders then 157 | getCell 0 columnIndex |> string 158 | else 159 | "Column" + (columnIndex + 1).ToString() 160 | 161 | if not (String.IsNullOrWhiteSpace(rawColumnName)) then 162 | let processedColumnName = rawColumnName.Replace("\n", "\\n") 163 | 164 | let cellType, getter = 165 | if forcestring then 166 | let getter = 167 | (fun row -> 168 | <@@ 169 | let value = (%%row: Row).GetValue columnIndex |> string 170 | if String.IsNullOrEmpty value then null else value 171 | @@>) 172 | |> singleItemOrFail 173 | 174 | typedefof, getter 175 | else 176 | let cellValue = getCell (if hasheaders then 1 else 0) columnIndex 177 | propertyImplementation columnIndex processedColumnName cellValue 178 | 179 | yield (processedColumnName, (columnIndex, cellType, getter)) ] 180 | 181 | 182 | let rootNamespace = "FSharp.Interop.Excel" 183 | 184 | [] 185 | type public ExcelProvider(cfg: TypeProviderConfig) as this = 186 | inherit 187 | TypeProviderForNamespaces( 188 | cfg, 189 | addDefaultProbingLocation = true, 190 | assemblyReplacementMap = [ ("ExcelProvider.DesignTime", "ExcelProvider.Runtime") ] 191 | ) 192 | 193 | static let dict = Dictionary<_, _>() 194 | let executingAssembly = System.Reflection.Assembly.GetExecutingAssembly() 195 | 196 | // Create the main provided type 197 | let excelFileProvidedType = 198 | ProvidedTypeDefinition(executingAssembly, rootNamespace, "ExcelFile", Some(typeof)) 199 | 200 | /// Given a function to format names (such as `niceCamelName` or `nicePascalName`) 201 | /// returns a name generator that never returns duplicate name (by appending an 202 | /// index to already used names) 203 | /// 204 | /// This function is curried and should be used with partial function application: 205 | /// 206 | /// let makeUnique = uniqueGenerator nicePascalName 207 | /// let n1 = makeUnique "sample-name" 208 | /// let n2 = makeUnique "sample-name" 209 | /// 210 | let uniqueGenerator niceName = 211 | let set = new HashSet<_>() 212 | 213 | fun name -> 214 | let mutable name = niceName name 215 | 216 | while set.Contains name do 217 | let mutable lastLetterPos = String.length name - 1 218 | 219 | while Char.IsDigit name.[lastLetterPos] && lastLetterPos > 0 do 220 | lastLetterPos <- lastLetterPos - 1 221 | 222 | if lastLetterPos = name.Length - 1 then 223 | if name.Contains " " then 224 | name <- name + " 2" 225 | else 226 | name <- name + "2" 227 | elif lastLetterPos = 0 && name.Length = 1 then 228 | name <- (UInt64.Parse name + 1UL).ToString() 229 | else 230 | let number = name.Substring(lastLetterPos + 1) 231 | name <- name.Substring(0, lastLetterPos + 1) + (UInt64.Parse number + 1UL).ToString() 232 | 233 | set.Add name |> ignore 234 | name 235 | 236 | let buildTypes (typeName: string) (args: obj[]) = 237 | let filename = args.[0] :?> string 238 | let sheetname = args.[1] :?> string 239 | let range = args.[2] :?> string 240 | let hasheaders = args.[3] :?> bool 241 | let forcestring = args.[4] :?> bool 242 | 243 | // resolve the filename relative to the resolution folder 244 | let resolvedFilename = Path.Combine(cfg.ResolutionFolder, filename) 245 | 246 | let ProvidedTypeDefinitionExcelCall (filename, sheetname, range, hasheaders, forcestring) = 247 | let gen = uniqueGenerator id 248 | let data = openWorkbookView resolvedFilename sheetname range 249 | 250 | // define a provided type for each row, erasing to a int -> obj 251 | let providedRowType = ProvidedTypeDefinition("Row", Some(typeof)) 252 | 253 | // add one property per Excel field 254 | let columnProperties = getColumnDefinitions data hasheaders forcestring 255 | 256 | for (columnName, (columnIndex, propertyType, getter)) in columnProperties do 257 | 258 | let prop = ProvidedProperty(columnName |> gen, propertyType, getterCode = getter) 259 | // Add metadata defining the property's location in the referenced file 260 | prop.AddDefinitionLocation((if hasheaders then 1 else 0), columnIndex, filename) 261 | providedRowType.AddMember(prop) 262 | 263 | // define the provided type, erasing to an seq obj> 264 | let providedExcelFileType = 265 | ProvidedTypeDefinition(executingAssembly, rootNamespace, typeName, Some(typeof)) 266 | 267 | // add a parameterless constructor which loads the file that was used to define the schema 268 | providedExcelFileType.AddMember( 269 | ProvidedConstructor( 270 | [], 271 | invokeCode = 272 | emptyListOrFail (fun () -> 273 | <@@ ExcelFileInternal(resolvedFilename, sheetname, range, hasheaders) @@>) 274 | ) 275 | ) 276 | 277 | // add a constructor taking the filename to load 278 | providedExcelFileType.AddMember( 279 | ProvidedConstructor( 280 | [ ProvidedParameter("filename", typeof) ], 281 | invokeCode = 282 | singleItemOrFail (fun filename -> 283 | <@@ ExcelFileInternal(%%filename, sheetname, range, hasheaders) @@>) 284 | ) 285 | ) 286 | 287 | // add a constructor taking the filename and sheetname to load 288 | providedExcelFileType.AddMember( 289 | ProvidedConstructor( 290 | [ ProvidedParameter("filename", typeof) 291 | ProvidedParameter("sheetname", typeof) ], 292 | invokeCode = 293 | twoItemsOrFail (fun fileName sheetname -> 294 | <@@ ExcelFileInternal(%%fileName, %%sheetname, range, hasheaders) @@>) 295 | ) 296 | ) 297 | 298 | // add a constructor taking the stream to load 299 | providedExcelFileType.AddMember( 300 | ProvidedConstructor( 301 | [ ProvidedParameter("stream", typeof) 302 | ProvidedParameter("format", typeof) ], 303 | invokeCode = 304 | twoItemsOrFail (fun stream format -> 305 | <@@ ExcelFileInternal(%%stream, %%format, sheetname, range, hasheaders) @@>) 306 | ) 307 | ) 308 | 309 | // add a constructor taking the stream and sheetname to load 310 | providedExcelFileType.AddMember( 311 | ProvidedConstructor( 312 | [ ProvidedParameter("stream", typeof) 313 | ProvidedParameter("format", typeof) 314 | ProvidedParameter("sheetname", typeof) ], 315 | invokeCode = 316 | threeItemsOrFail (fun stream format sheetname -> 317 | <@@ ExcelFileInternal(%%stream, %%format, %%sheetname, range, hasheaders) @@>) 318 | ) 319 | ) 320 | 321 | // add a new, more strongly typed Data property (which uses the existing property at runtime) 322 | providedExcelFileType.AddMember( 323 | ProvidedProperty( 324 | "Data", 325 | typedefof>.MakeGenericType(providedRowType), 326 | getterCode = singleItemOrFail (fun excFile -> <@@ (%%excFile: ExcelFileInternal).Data @@>) 327 | ) 328 | ) 329 | 330 | // add the row type as a nested type 331 | providedExcelFileType.AddMember(providedRowType) 332 | 333 | providedExcelFileType 334 | 335 | let key = (filename, sheetname, range, hasheaders, forcestring) 336 | 337 | if dict.ContainsKey(key) then 338 | dict.[key] 339 | else 340 | let res = ProvidedTypeDefinitionExcelCall key 341 | dict.[key] <- res 342 | res 343 | 344 | let parameters = 345 | [ ProvidedStaticParameter("FileName", typeof) 346 | ProvidedStaticParameter("SheetName", typeof, parameterDefaultValue = "") 347 | ProvidedStaticParameter("Range", typeof, parameterDefaultValue = "") 348 | ProvidedStaticParameter("HasHeaders", typeof, parameterDefaultValue = true) 349 | ProvidedStaticParameter("ForceString", typeof, parameterDefaultValue = false) ] 350 | 351 | let helpText = 352 | """Typed representation of data in an Excel file. 353 | Location of the Excel file. 354 | Name of sheet containing data. Defaults to first sheet. 355 | Specification using `A1:D3` type addresses of one or more ranges. Defaults to use whole sheet. 356 | Whether the range contains the names of the columns as its first line. 357 | Specifies forcing data to be processed as strings. Defaults to `false`.""" 358 | 359 | do excelFileProvidedType.AddXmlDoc helpText 360 | do excelFileProvidedType.DefineStaticParameters(parameters, buildTypes) 361 | 362 | // add the type to the namespace 363 | do this.AddNamespace(rootNamespace, [ excelFileProvidedType ]) 364 | 365 | [] 366 | do () 367 | -------------------------------------------------------------------------------- /src/ExcelProvider.DesignTime/ExcelProvider.DesignTime.fsproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Library 5 | netstandard2.0 6 | portable 7 | true 8 | true 9 | true 10 | PackageReference 11 | true 12 | false 13 | false 14 | 15 | 16 | 17 | True 18 | paket-files/ProvidedTypes.fsi 19 | 20 | 21 | True 22 | paket-files/ProvidedTypes.fs 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /src/ExcelProvider.DesignTime/paket.references: -------------------------------------------------------------------------------- 1 | FSharp.Core 2 | ExcelDataReader 3 | ExcelDataReader.DataSet 4 | System.Text.Encoding.CodePages restriction: == netstandard2.0 5 | File:ProvidedTypes.fsi 6 | File:ProvidedTypes.fs 7 | -------------------------------------------------------------------------------- /src/ExcelProvider.Runtime/AssemblyInfo.fs: -------------------------------------------------------------------------------- 1 | // Auto-Generated by FAKE; do not edit 2 | namespace System 3 | 4 | open System.Reflection 5 | 6 | [] 7 | [] 8 | [] 9 | [] 10 | [] 11 | do () 12 | 13 | module internal AssemblyVersionInformation = 14 | [] 15 | let AssemblyTitle = "ExcelProvider.Runtime" 16 | 17 | [] 18 | let AssemblyProduct = "ExcelProvider" 19 | 20 | [] 21 | let AssemblyDescription = 22 | "This library implements a read-only Excel type provider for Net Standard 2.0." 23 | 24 | [] 25 | let AssemblyVersion = "3.0.0" 26 | 27 | [] 28 | let AssemblyFileVersion = "3.0.0" 29 | -------------------------------------------------------------------------------- /src/ExcelProvider.Runtime/ExcelProvider.Runtime.fs: -------------------------------------------------------------------------------- 1 | namespace FSharp.Interop.Excel 2 | 3 | type ExcelFormat = 4 | | Xlsx 5 | | Csv 6 | | Binary 7 | 8 | namespace FSharp.Interop.Excel.ExcelProvider 9 | 10 | open System 11 | open System.IO 12 | open System.Data 13 | open System.Text.RegularExpressions 14 | open ExcelDataReader 15 | open FSharp.Core.CompilerServices 16 | open FSharp.Interop.Excel 17 | 18 | [] 19 | module internal ExcelAddressing = 20 | 21 | type Address = 22 | { Sheet: string; Row: int; Column: int } 23 | 24 | type Range = 25 | | Bounded of Address * Address 26 | | Unbounded of Address 27 | 28 | type RangeView = 29 | { StartColumn: int 30 | EndColumn: int 31 | StartRow: int 32 | EndRow: int 33 | Sheet: DataTable } 34 | 35 | type View = 36 | { RowCount: int 37 | ColumnMappings: Map } 38 | 39 | ///Parses an excel row column address of the form into a zero based row, column address. 40 | ///For example the address A1 would be parsed as 0, 0 41 | let parseCellAddress cellAddress = 42 | 43 | if String.IsNullOrWhiteSpace cellAddress then 44 | 0, 0 45 | else 46 | let convertToBase radix digits = 47 | let digitValue i digit = 48 | float digit * Math.Pow(float radix, float i) 49 | 50 | digits |> List.rev |> List.mapi digitValue |> Seq.sum |> int 51 | 52 | let charToDigit char = ((int) (Char.ToUpper(char))) - 64 53 | 54 | let column = 55 | cellAddress 56 | |> Seq.filter Char.IsLetter 57 | |> Seq.map charToDigit 58 | |> Seq.toList 59 | |> convertToBase 26 60 | 61 | let row = 62 | cellAddress 63 | |> Seq.filter Char.IsNumber 64 | |> Seq.map (string >> Int32.Parse) 65 | |> Seq.toList 66 | |> convertToBase 10 67 | 68 | (row - 1), (column - 1) 69 | 70 | let addressParser = new Regex("((?[^!]*)!)?(?\w+\d+)?") 71 | 72 | ///Parses an excel address from a string 73 | ///Valid inputs look like: 74 | ///Sheet!A1 75 | ///B3 76 | let parseExcelAddress sheetContext address = 77 | if address <> sheetContext then 78 | let regexMatch = addressParser.Match(address) 79 | let sheetGroup = regexMatch.Groups.Item("sheet") 80 | let cellGroup = regexMatch.Groups.Item("cell") 81 | 82 | let sheet = 83 | if sheetGroup.Success then 84 | sheetGroup.Value 85 | else 86 | sheetContext 87 | 88 | let row, column = parseCellAddress cellGroup.Value 89 | 90 | { Sheet = sheet 91 | Row = row 92 | Column = column } 93 | else 94 | { Sheet = sheetContext 95 | Row = 0 96 | Column = 0 } 97 | 98 | ///Parses an excel range of the form 99 | ///
:
|
100 | ///ADDRESS is parsed with the parseExcelAddress function 101 | let parseExcelRange sheetContext (range: string) = 102 | let addresses = range.Split(':') |> Array.map (parseExcelAddress sheetContext) 103 | 104 | match addresses with 105 | | [| a; b |] -> Bounded(a, b) 106 | | [| a |] -> Unbounded a 107 | | _ -> failwith (sprintf "ExcelProvider: A range can contain only one or two address [%s]" range) 108 | 109 | ///Parses a potential sequence of excel ranges, seperated by commas 110 | let parseExcelRanges sheetContext (range: string) = 111 | range.Split(',') |> Array.map (parseExcelRange sheetContext) |> Array.toList 112 | 113 | ///Gets the start and end offsets of a range 114 | let getRangeView (workbook: DataSet) range = 115 | let topLeft, bottomRight, sheet = 116 | match range with 117 | | Bounded(topLeft, bottomRight) -> 118 | let sheet = workbook.Tables.[topLeft.Sheet] 119 | topLeft, bottomRight, sheet 120 | | Unbounded(topLeft) -> 121 | let sheet = workbook.Tables.[topLeft.Sheet] 122 | 123 | topLeft, 124 | { topLeft with 125 | Row = sheet.Rows.Count - 1 126 | Column = sheet.Columns.Count - 1 }, 127 | sheet 128 | 129 | { StartColumn = topLeft.Column 130 | StartRow = topLeft.Row 131 | EndColumn = bottomRight.Column 132 | EndRow = bottomRight.Row 133 | Sheet = sheet } 134 | 135 | ///Gets a View object which can be used to read data from the given range in the DataSet 136 | let public getView (workbook: DataSet) sheetname range = 137 | let worksheets = workbook.Tables 138 | 139 | let workSheetName = 140 | if worksheets.Contains sheetname then 141 | sheetname 142 | else if sheetname = null || sheetname = "" then 143 | worksheets.[0].TableName //accept TypeProvider without specific SheetName... 144 | else 145 | failwithf "ExcelProvider: Sheet [%s] does not exist." sheetname 146 | 147 | let ranges = 148 | parseExcelRanges workSheetName range |> List.map (getRangeView workbook) 149 | 150 | let minRow = ranges |> Seq.map (fun range -> range.StartRow) |> Seq.min 151 | let maxRow = ranges |> Seq.map (fun range -> range.EndRow) |> Seq.max 152 | let rowCount = (maxRow - minRow) + 1 153 | 154 | let rangeViewOffsetRecord rangeView = 155 | seq { rangeView.StartColumn .. rangeView.EndColumn } 156 | |> Seq.map (fun i -> i, rangeView) 157 | |> Seq.toList 158 | 159 | let rangeViewsByColumn = 160 | ranges |> Seq.map rangeViewOffsetRecord |> Seq.concat |> Seq.toList 161 | 162 | if rangeViewsByColumn |> Seq.distinctBy fst |> Seq.length < rangeViewsByColumn.Length then 163 | failwith "ExcelProvider: Ranges cannot overlap" 164 | 165 | let columns = 166 | rangeViewsByColumn |> Seq.mapi (fun index entry -> (index, entry)) |> Map.ofSeq 167 | 168 | { RowCount = rowCount 169 | ColumnMappings = columns } 170 | 171 | ///Reads the value of a cell from a view 172 | let getCellValue view row column = 173 | if column < 0 then 174 | failwith "ExcelProvider: Column index must be nonnegative" 175 | 176 | let columns = view.ColumnMappings 177 | 178 | match columns.TryFind column with 179 | | Some(sheetColumn, rangeView) -> 180 | let row = rangeView.StartRow + row 181 | let sheet = rangeView.Sheet 182 | 183 | if row < sheet.Rows.Count && sheetColumn < sheet.Columns.Count then 184 | match rangeView.Sheet.Rows.[row].Item(sheetColumn) with 185 | | :? System.DBNull -> null 186 | | nonNullValue -> nonNullValue 187 | else 188 | null 189 | | _ -> null 190 | 191 | ///Reads the contents of an excel file into a DataSet 192 | let public openWorkbookView filename sheetname range = 193 | 194 | #if NETSTANDARD || NETCOREAPP 195 | // Register encodings 196 | do System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance) 197 | #endif 198 | let fail action (ex: exn) = 199 | let exceptionTypeName = ex.GetType().Name 200 | 201 | let message = 202 | sprintf "ExcelProvider: Could not %s. %s - %s" action exceptionTypeName (ex.Message) 203 | 204 | failwith message 205 | 206 | use stream = 207 | try 208 | new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.ReadWrite) 209 | with ex -> 210 | let action = sprintf "open file '%s'" filename 211 | fail action ex 212 | 213 | let excelReader = 214 | let action = "create ExcelDataReader" 215 | 216 | try 217 | let reader = 218 | if filename.EndsWith(".xlsx", StringComparison.OrdinalIgnoreCase) then 219 | ExcelDataReader.ExcelReaderFactory.CreateOpenXmlReader(stream) 220 | elif filename.EndsWith(".csv", StringComparison.OrdinalIgnoreCase) then 221 | ExcelDataReader.ExcelReaderFactory.CreateCsvReader(stream) 222 | else 223 | ExcelDataReader.ExcelReaderFactory.CreateBinaryReader(stream) 224 | 225 | if reader.IsClosed then 226 | fail 227 | action 228 | (Exception 229 | "ExcelProvider: The reader was closed on startup without raising a specific exception") 230 | 231 | reader 232 | with ex -> 233 | fail action ex 234 | 235 | let workbook = 236 | excelReader.AsDataSet( 237 | new ExcelDataSetConfiguration( 238 | ConfigureDataTable = (fun _ -> new ExcelDataTableConfiguration(UseHeaderRow = false)) 239 | ) 240 | ) 241 | 242 | let range = 243 | if String.IsNullOrWhiteSpace range then 244 | sheetname //workbook.Tables.[0].TableName <== maybe the root cause of https://github.com/fsprojects/ExcelProvider/issues/77 245 | else 246 | range 247 | 248 | let view = getView workbook sheetname range 249 | (excelReader :> IDisposable).Dispose() 250 | view 251 | 252 | ///Reads the contents of an excel file into a DataSet 253 | let public openWorkbookViewFromStream (stream: Stream, format: ExcelFormat) sheetname range = 254 | 255 | #if NETSTANDARD || NETCOREAPP 256 | // Register encodings 257 | do System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance) 258 | #endif 259 | let fail action (ex: exn) = 260 | let exceptionTypeName = ex.GetType().Name 261 | 262 | let message = 263 | sprintf "ExcelProvider: Could not %s. %s - %s" action exceptionTypeName (ex.Message) 264 | 265 | failwith message 266 | 267 | let excelReader = 268 | let action = "create ExcelDataReader" 269 | 270 | try 271 | let reader = 272 | match format with 273 | | Xlsx -> ExcelDataReader.ExcelReaderFactory.CreateOpenXmlReader(stream) 274 | | Csv -> ExcelDataReader.ExcelReaderFactory.CreateCsvReader(stream) 275 | | Binary -> ExcelDataReader.ExcelReaderFactory.CreateBinaryReader(stream) 276 | 277 | if reader.IsClosed then 278 | fail action (Exception "The reader was closed on startup without raising a specific exception") 279 | 280 | reader 281 | with ex -> 282 | fail action ex 283 | 284 | let workbook = 285 | excelReader.AsDataSet( 286 | new ExcelDataSetConfiguration( 287 | ConfigureDataTable = (fun _ -> new ExcelDataTableConfiguration(UseHeaderRow = false)) 288 | ) 289 | ) 290 | 291 | let range = 292 | if String.IsNullOrWhiteSpace range then 293 | sheetname //workbook.Tables.[0].TableName <== maybe the root cause of https://github.com/fsprojects/ExcelProvider/issues/77 294 | else 295 | range 296 | 297 | let view = getView workbook sheetname range 298 | (excelReader :> IDisposable).Dispose() 299 | view 300 | 301 | let failInvalidCast fromObj (fromType: Type) (toType: Type) columnName rowIndex filename sheetname = 302 | sprintf 303 | "ExcelProvider: Cannot cast '%A' a '%s' to '%s'.\nFile: '%s'. Sheet: '%s'\nColumn '%s'. Row %i." 304 | fromObj 305 | fromType.FullName 306 | toType.FullName 307 | filename 308 | sheetname 309 | columnName 310 | rowIndex 311 | |> InvalidCastException 312 | |> raise 313 | 314 | // gets a list of column definition information for the columns in a view 315 | let internal getColumnDefinitions (data: View) hasheaders = 316 | let getCell = getCellValue data 317 | 318 | [ for columnIndex in 0 .. data.ColumnMappings.Count - 1 do 319 | let rawColumnName = 320 | if hasheaders then 321 | getCell 0 columnIndex |> string 322 | else 323 | "Column" + (columnIndex + 1).ToString() 324 | 325 | if not (String.IsNullOrWhiteSpace(rawColumnName)) then 326 | let processedColumnName = rawColumnName.Replace("\n", "\\n") 327 | yield (processedColumnName, columnIndex) ] 328 | 329 | // Represents a row in a provided ExcelFileInternal 330 | type Row(documentId, sheetname, rowIndex, getCellValue: int -> int -> obj, columns: Map) = 331 | member this.GetValue columnIndex = getCellValue rowIndex columnIndex 332 | 333 | member this.GetValue columnName = 334 | match columns.TryFind columnName with 335 | | Some(columnIndex) -> this.GetValue columnIndex 336 | | None -> 337 | columns 338 | |> Seq.map (fun kvp -> kvp.Key) 339 | |> Seq.tryFind (fun header -> String.Equals(header, columnName, StringComparison.OrdinalIgnoreCase)) 340 | |> function 341 | | Some header -> 342 | sprintf "ExcelProvider: Column \"%s\" was not found. Did you mean \"%s\"?" columnName header 343 | | None -> sprintf "ExcelProvider: Column \"%s\" was not found." columnName 344 | |> failwith 345 | 346 | member this.TryGetValue<'a> (columnIndex: int) columnName = 347 | let value = this.GetValue columnIndex 348 | 349 | try 350 | match value with 351 | | null -> value :?> 'a 352 | | _ when typeof<'a> = typeof -> (box (string value)) :?> 'a 353 | //| :? string as valueStr when typeof<'a> = typeof -> (box (Double.Parse valueStr)) :?> 'a 354 | | :? double as valueDbl when typeof<'a> = typeof -> (box (DateTime.FromOADate valueDbl)) :?> 'a 355 | | :? string as valueStr when typeof<'a> = typeof -> (box (DateTime.Parse valueStr)) :?> 'a 356 | | _ -> value :?> 'a 357 | with 358 | | :? InvalidCastException 359 | | :? ArgumentException 360 | | :? ArgumentNullException 361 | | :? InvalidCastException -> 362 | failInvalidCast value (value.GetType()) typeof<'a> columnName rowIndex documentId sheetname 363 | 364 | member this.TryGetNullableValue<'a when 'a: (new: unit -> 'a) and 'a: struct and 'a :> ValueType> 365 | (columnIndex: int) 366 | columnName 367 | = 368 | let value = this.GetValue columnIndex 369 | 370 | try 371 | match value with 372 | | null -> (value :?> Nullable<'a>).GetValueOrDefault() 373 | | _ when typeof<'a> = typeof -> (box (string value)) :?> 'a 374 | //| :? string as valueStr when typeof<'a> = typeof -> (box (Double.Parse valueStr)) :?> 'a 375 | | :? double as valueDbl when typeof<'a> = typeof -> (box (DateTime.FromOADate valueDbl)) :?> 'a 376 | | :? string as valueStr when typeof<'a> = typeof -> (box (DateTime.Parse valueStr)) :?> 'a 377 | | _ -> value :?> 'a 378 | 379 | with 380 | | :? InvalidCastException 381 | | :? ArgumentException 382 | | :? ArgumentNullException 383 | | :? FormatException -> 384 | failInvalidCast value (value.GetType()) typeof<'a> columnName rowIndex documentId sheetname 385 | 386 | 387 | override this.ToString() = 388 | let columnValueList = 389 | [ for column in columns do 390 | let value = getCellValue rowIndex column.Value 391 | let columnName, value = column.Key, string value 392 | yield sprintf "\t%s = %s" columnName value ] 393 | |> String.concat Environment.NewLine 394 | 395 | sprintf "Row %d%s%s" rowIndex Environment.NewLine columnValueList 396 | 397 | // Simple type wrapping Excel data 398 | type ExcelFileInternal private (view, documentId, sheetname, hasheaders) = 399 | 400 | let data = 401 | let columns = 402 | [ for (columnName, columnIndex) in getColumnDefinitions view hasheaders -> columnName, columnIndex ] 403 | |> Map.ofList 404 | 405 | let buildRow rowIndex = 406 | new Row(documentId, sheetname, rowIndex, getCellValue view, columns) 407 | 408 | let zeroBasedLastIndex = view.RowCount - 1 409 | 410 | seq { (if hasheaders then 1 else 0) .. zeroBasedLastIndex } |> Seq.map buildRow 411 | 412 | new(filename, sheetname, range, hasheaders) = 413 | let view = openWorkbookView filename sheetname range 414 | ExcelFileInternal(view, filename, sheetname, hasheaders) 415 | 416 | new(stream, format, sheetname, range, hasheaders) = 417 | let view = openWorkbookViewFromStream (stream, format) sheetname range 418 | ExcelFileInternal(view, "stream", sheetname, hasheaders) 419 | 420 | member __.Data = data 421 | 422 | 423 | module Attributes = 424 | 425 | [] 426 | do () 427 | -------------------------------------------------------------------------------- /src/ExcelProvider.Runtime/ExcelProvider.Runtime.fsproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | Library 7 | netstandard2.0; 8 | true 9 | $(OtherFlags) --warnon:1182 10 | portable 11 | false 12 | false 13 | typeproviders 14 | typeproviders 15 | 16 | 17 | 18 | 19 | True 20 | paket-files/ProvidedTypes.fsi 21 | 22 | 23 | True 24 | paket-files/ProvidedTypes.fs 25 | 26 | 27 | 28 | 29 | True 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 47 | 48 | 49 | 51 | 52 | 53 | 54 | -------------------------------------------------------------------------------- /src/ExcelProvider.Runtime/paket.references: -------------------------------------------------------------------------------- 1 | File:ProvidedTypes.fsi 2 | File:ProvidedTypes.fs 3 | 4 | FSharp.Core 5 | ExcelDataReader 6 | ExcelDataReader.DataSet 7 | System.Text.Encoding.CodePages framework: netstandard2.0 8 | -------------------------------------------------------------------------------- /tests/ExcelProvider.Tests/App.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | -------------------------------------------------------------------------------- /tests/ExcelProvider.Tests/BookTest.xls: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fsprojects/ExcelProvider/bb1008eb6d1353009b133a88338d45cb96af2952/tests/ExcelProvider.Tests/BookTest.xls -------------------------------------------------------------------------------- /tests/ExcelProvider.Tests/BookTestDifferentData.xls: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fsprojects/ExcelProvider/bb1008eb6d1353009b133a88338d45cb96af2952/tests/ExcelProvider.Tests/BookTestDifferentData.xls -------------------------------------------------------------------------------- /tests/ExcelProvider.Tests/BookTestWithHeader.xls: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fsprojects/ExcelProvider/bb1008eb6d1353009b133a88338d45cb96af2952/tests/ExcelProvider.Tests/BookTestWithHeader.xls -------------------------------------------------------------------------------- /tests/ExcelProvider.Tests/DataTypes.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fsprojects/ExcelProvider/bb1008eb6d1353009b133a88338d45cb96af2952/tests/ExcelProvider.Tests/DataTypes.xlsx -------------------------------------------------------------------------------- /tests/ExcelProvider.Tests/DataTypesNoHeader.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fsprojects/ExcelProvider/bb1008eb6d1353009b133a88338d45cb96af2952/tests/ExcelProvider.Tests/DataTypesNoHeader.xlsx -------------------------------------------------------------------------------- /tests/ExcelProvider.Tests/DifferentMainSheet.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fsprojects/ExcelProvider/bb1008eb6d1353009b133a88338d45cb96af2952/tests/ExcelProvider.Tests/DifferentMainSheet.xlsx -------------------------------------------------------------------------------- /tests/ExcelProvider.Tests/ExcelProvider.Tests.fs: -------------------------------------------------------------------------------- 1 | module FSharp.Interop.Excel.Tests.ExcelProviderTests 2 | 3 | open NUnit.Framework 4 | open FSharp.Interop.Excel 5 | open FsUnit 6 | 7 | open System 8 | open System.Collections.Generic 9 | open System.IO 10 | 11 | open FSharp.Compiler.Interactive.Shell 12 | open FSharp.Compiler.Tokenization 13 | 14 | module FsiTestContext = 15 | open System.Text 16 | 17 | // Initialize output and input streams 18 | let sbOut = new StringBuilder() 19 | let sbErr = new StringBuilder() 20 | let inStream = new StringReader("") 21 | let outStream = new StringWriter(sbOut) 22 | let errStream = new StringWriter(sbErr) 23 | 24 | // Build command line arguments & start FSI session 25 | let argv = [| "C:\\fsi.exe" |] 26 | 27 | let fi = 28 | 29 | #if DEBUG 30 | FileInfo (__SOURCE_DIRECTORY__ + "/../../src/ExcelProvider.Runtime/bin/Debug/netstandard2.0/ExcelProvider.Runtime.dll") 31 | #else 32 | FileInfo (__SOURCE_DIRECTORY__ + "/../../src/ExcelProvider.Runtime/bin/Release/netstandard2.0/ExcelProvider.Runtime.dll") 33 | 34 | #endif 35 | let allArgs = Array.append argv [| "--noninteractive"; $"-r:{fi.FullName}" |] 36 | 37 | let fsiConfig = 38 | FsiEvaluationSession.GetDefaultConfiguration() 39 | 40 | let fsiSession = 41 | FsiEvaluationSession.Create(fsiConfig, allArgs, inStream, outStream, errStream) 42 | 43 | 44 | //let a = 123 45 | 46 | 47 | type BookTest = ExcelFile<"BookTest.xls", "Sheet1", ForceString=true> 48 | type HeaderTest = ExcelFile<"BookTestWithHeader.xls", Range="A2", ForceString=true> 49 | type MultipleRegions = ExcelFile<"MultipleRegions.xlsx", Range="A1:C5,E3:G5", ForceString=true> 50 | type DifferentMainSheet = ExcelFile<"DifferentMainSheet.xlsx"> 51 | type DataTypes = ExcelFile<"DataTypes.xlsx"> 52 | type DataTypesWithEmptyRow = ExcelFile<"DataTypes.xlsx", Range="A1:F3"> 53 | type DataTypesHeaderTrue = ExcelFile<"DataTypes.xlsx", HasHeaders=true> 54 | type DataTypesHeaderFalse = ExcelFile<"DataTypes.xlsx", HasHeaders=false, ForceString=true> 55 | type DataTypesNoHeader = ExcelFile<"DataTypesNoHeader.xlsx", HasHeaders=false> 56 | type CaseInsensitiveWithEmptyRow = ExcelFile<"DataTypes.XLSX", Range="A1:F3"> 57 | type MultiLine = ExcelFile<"MultilineHeader.xlsx"> 58 | type MultipleSheetsFirst = ExcelFile<"MultipleSheets.xlsx", "A"> 59 | type MultipleSheetsSecond = ExcelFile<"MultipleSheets.xlsx", "B"> 60 | type MultipleSheetsSecondRange = ExcelFile<"MultipleSheets.xlsx", "B", "A2"> 61 | 62 | [] 63 | let ``Read Text as String``() = 64 | let file = DataTypes() 65 | let row = file.Data |> Seq.head 66 | row.String |> should equal "A" 67 | 68 | [] 69 | let ``Read General as Boolean if value is TRUE``() = 70 | let file = DataTypes() 71 | let row = file.Data |> Seq.head 72 | Assert.That(row.Boolean, Is.True) 73 | 74 | [] 75 | let ``Read Number as Float``() = 76 | let file = DataTypes() 77 | let row = file.Data |> Seq.head 78 | row.Float |> should equal 1.0 79 | 80 | [] 81 | let ``Read Date as DateTime``() = 82 | let file = DataTypes() 83 | let row = file.Data |> Seq.head 84 | row.Date |> should equal (new DateTime(2014,1,1)) 85 | 86 | [] 87 | let ``Read Time as DateTime``() = 88 | let file = DataTypes() 89 | let row = file.Data |> Seq.head 90 | let expectedTime = new DateTime(1899, 12, 31, 8, 0, 0) 91 | row.Time |> should equal expectedTime 92 | 93 | [] 94 | let ``Read Currency as Decimal``() = 95 | let file = DataTypes() 96 | let row = file.Data |> Seq.head 97 | row.Currency |> should equal 100.0M 98 | 99 | [] 100 | let ``Empty Text cell should be null``() = 101 | let file = DataTypesWithEmptyRow() 102 | let blankRow = file.Data |> Seq.skip 1 |> Seq.head 103 | blankRow.String |> should be Null 104 | 105 | [] 106 | let ``Read blank General as false if column is boolean``() = 107 | let file = DataTypesWithEmptyRow() 108 | let row = file.Data |> Seq.skip 1 |> Seq.head 109 | Assert.That(row.Boolean, Is.False) 110 | 111 | [] 112 | let ``Empty Number cell should be zero``() = 113 | let file = DataTypesWithEmptyRow() 114 | let blankRow = file.Data |> Seq.skip 1 |> Seq.head 115 | let defaultValue = blankRow.Float 116 | defaultValue |> should equal 0.0f 117 | 118 | [] 119 | let ``Empty Currency cell should be zero``() = 120 | let file = DataTypesWithEmptyRow() 121 | let blankRow = file.Data |> Seq.skip 1 |> Seq.head 122 | let defaultValue = blankRow.Currency 123 | defaultValue |> should equal 0.0M 124 | 125 | [] 126 | let ``Empty date cell should be BOT``() = 127 | let file = DataTypesWithEmptyRow() 128 | let blankRow = file.Data |> Seq.skip 1 |> Seq.head 129 | let defaultValue = blankRow.Date 130 | defaultValue |> should equal DateTime.MinValue 131 | 132 | 133 | [] 134 | let ``Empty time cell should be today``() = 135 | let file = DataTypesWithEmptyRow() 136 | let blankRow = file.Data |> Seq.skip 1 |> Seq.head 137 | let defaultValue = blankRow.Time 138 | defaultValue |> should equal DateTime.MinValue 139 | 140 | [] 141 | let ``Default Sheet not named Sheet1``() = 142 | let file = DifferentMainSheet() 143 | let firstRow = file.Data |> Seq.head 144 | firstRow.Animal |> should equal "Daisy" 145 | firstRow.``Pounds of Milk`` |> should equal 12 146 | 147 | let expectedToString = 148 | String.Join ( 149 | Environment.NewLine, 150 | [ @"Row 1"; " Animal = Daisy"; " Pounds of Milk = 12" ]) 151 | 152 | [] 153 | let ``ToString format``() = 154 | let file = DifferentMainSheet() 155 | let firstRow = file.Data |> Seq.head 156 | 157 | printfn "%O" firstRow 158 | 159 | string firstRow |> should equal expectedToString 160 | 161 | [] 162 | let ``Can get row cell value by column header``() = 163 | let file = BookTest() 164 | let row = file.Data |> Seq.head 165 | row.GetValue "SEC" |> should equal "ASI" 166 | 167 | [] 168 | let ``GetValue with column header is case-sensitive``() = 169 | let file = BookTest() 170 | let row = file.Data |> Seq.head 171 | row.GetValue "SEC" |> should equal "ASI" 172 | (fun () -> row.GetValue "SeC" |> ignore) |> should throw typeof 173 | 174 | [] 175 | let ``GetValue with negative column index should fail``() = 176 | let file = BookTest() 177 | let row = file.Data |> Seq.head 178 | (fun () -> row.GetValue -1 |> ignore) |> should throw typeof 179 | 180 | [] 181 | let ``GetValue with column index out of range should be null`` () = 182 | let file = BookTest() 183 | let row = file.Data |> Seq.head 184 | row.GetValue (Int32.MaxValue) |> should equal null 185 | 186 | [] 187 | let ``GetValue with nonexistent column header should fail``() = 188 | let file = BookTest() 189 | let row = file.Data |> Seq.head 190 | (fun () -> row.GetValue "bad header" |> ignore) |> should throw typeof 191 | 192 | [] 193 | let ``Can access first row in typed excel data``() = 194 | let file = BookTest() 195 | let row = file.Data |> Seq.head 196 | row.SEC |> should equal "ASI" 197 | row.BROKER |> should equal "TFS Derivatives HK" 198 | 199 | [] 200 | let ``Can pick an arbitrary header row``() = 201 | let file = HeaderTest() 202 | let row = file.Data |> Seq.head 203 | row.SEC |> should equal "ASI" 204 | row.BROKER |> should equal "TFS Derivatives HK" 205 | 206 | [] 207 | let ``Can load data from spreadsheet``() = 208 | let file = Path.Combine(Environment.CurrentDirectory, "BookTestDifferentData.xls") 209 | 210 | printfn "%s" file 211 | 212 | let otherBook = BookTest(file) 213 | let row = otherBook.Data |> Seq.head 214 | 215 | row.SEC |> should equal "TASI" 216 | row.STYLE |> should equal "B" 217 | row.``STRIKE 1`` |> should equal "3" 218 | row.``STRIKE 2`` |> should equal "4" 219 | row.``STRIKE 3`` |> should equal "5" 220 | row.VOL |> should equal "322" 221 | 222 | [] 223 | let ``Can load data from stream``() = 224 | let file = Path.Combine(Environment.CurrentDirectory, "BookTestDifferentData.xls") 225 | 226 | printfn "%s" file 227 | 228 | use stream = new FileStream(file, FileMode.Open) 229 | let otherBook = BookTest(stream, ExcelFormat.Binary) 230 | let row = otherBook.Data |> Seq.head 231 | 232 | row.SEC |> should equal "TASI" 233 | row.STYLE |> should equal "B" 234 | row.``STRIKE 1`` |> should equal "3" 235 | row.``STRIKE 2`` |> should equal "4" 236 | row.``STRIKE 3`` |> should equal "5" 237 | row.VOL |> should equal "322" 238 | 239 | [] 240 | let ``Can load from multiple ranges``() = 241 | let file = MultipleRegions() 242 | let rows = file.Data |> Seq.toArray 243 | 244 | rows.[0].First |> should equal "A1" 245 | rows.[0].Second |> should equal "A2" 246 | rows.[0].Third |> should equal "A3" 247 | rows.[0].Fourth |> should equal "B1" 248 | rows.[0].Fifth |> should equal "B2" 249 | rows.[0].Sixth |> should equal "B3" 250 | 251 | rows.[1].First |> should equal "A4" 252 | rows.[1].Second |> should equal "A5" 253 | rows.[1].Third |> should equal "A6" 254 | rows.[1].Fourth |> should equal "B4" 255 | rows.[1].Fifth |> should equal "B5" 256 | rows.[1].Sixth |> should equal "B6" 257 | 258 | rows.[2].First |> should equal "A7" 259 | rows.[2].Second |> should equal "A8" 260 | rows.[2].Third |> should equal "A9" 261 | rows.[2].Fourth |> should equal null 262 | rows.[2].Fifth |> should equal null 263 | rows.[2].Sixth |> should equal null 264 | 265 | rows.[3].First |> should equal "A10" 266 | rows.[3].Second |> should equal "A11" 267 | rows.[3].Third |> should equal "A12" 268 | rows.[3].Fourth |> should equal null 269 | rows.[3].Fifth |> should equal null 270 | rows.[3].Sixth |> should equal null 271 | 272 | rows |> Array.length |> should equal 4 273 | 274 | [] 275 | let ``Can load from multiple sheets - first``() = 276 | let file = MultipleSheetsFirst() 277 | let rows = file.Data |> Seq.toArray 278 | 279 | rows.[0].First |> should equal 1.0 280 | rows.[0].Second |> should equal false 281 | rows.[0].Third |> should equal "a" 282 | 283 | rows.[1].First |> should equal 2.0 284 | rows.[1].Second |> should equal true 285 | rows.[1].Third |> should equal "b" 286 | 287 | [] 288 | let ``Can load from multiple sheets - second``() = 289 | let file = MultipleSheetsSecond() 290 | let rows = file.Data |> Seq.toArray 291 | 292 | rows.[0].Fourth |> should equal 2.2 293 | rows.[0].Fifth |> should equal (new DateTime(2013,1,1)) 294 | 295 | rows.[1].Fourth |> should equal 3.2 296 | rows.[1].Fifth |> should equal (new DateTime(2013,2,1)) 297 | 298 | [] 299 | let ``Can load data with schema B from specified file and specified sheetname (invalid type data should throw exception)``() = 300 | let file = MultipleSheetsSecond(__SOURCE_DIRECTORY__ + "/MultipleSheets.xlsx", "A") 301 | let rows = file.Data |> Seq.toArray 302 | 303 | rows.[0].Fourth |> should equal 1.0 304 | try 305 | let _ = rows.[0].Fifth 306 | failwith "should not run to here." 307 | with 308 | | exn -> 309 | exn.Message.Split("\n")[0] |> should equal "ExcelProvider: Cannot cast 'false' a 'System.Boolean' to 'System.DateTime'." 310 | 311 | 312 | [] 313 | let ``Cannot create a type referring to a non-existant sheet at runtime``() = 314 | // This test is testing runtime behavior, so we need to use the FSI session to run the code 315 | //printfn "__SOURCE_DIRECTORY__ %s" __SOURCE_DIRECTORY__ 316 | let multiSheet = __SOURCE_DIRECTORY__.Replace(@"\", "/") + "/MultipleSheets.xlsx" 317 | let result, diag = 318 | FsiTestContext.fsiSession.EvalInteractionNonThrowing $""" 319 | open FSharp.Interop.Excel 320 | type MultipleSheetsThird = ExcelFile<"{multiSheet}", "C"> 321 | //let file = MultipleSheetsThird() 322 | () 323 | """ 324 | //match result with 325 | //| Choice1Of2 v -> printfn "1 %A" v 326 | //| Choice2Of2 v -> printfn "2 %A" v 327 | //printfn "%A" diag 328 | let dstr = diag[0].ToString() 329 | dstr.Substring(dstr.IndexOf "typecheck") |> should equal "typecheck error The type provider 'FSharp.Interop.Excel.ExcelProvider.ProviderImplementation+ExcelProvider' reported an error: ExcelProvider: Sheet [C] does not exist." 330 | 331 | 332 | [] 333 | let ``Can load from multiple sheets with range``() = 334 | let file = MultipleSheetsSecondRange() 335 | let rows = file.Data |> Seq.toArray 336 | 337 | rows.[0].``2.2`` |> should equal 3.2 338 | 339 | [] 340 | let ``Can load file with different casing``() = 341 | let file = CaseInsensitiveWithEmptyRow() 342 | // just do one of the same tests as was done for the book we are basing this off of 343 | let blankRow = file.Data |> Seq.skip 1 |> Seq.head 344 | let defaultValue = blankRow.Time 345 | defaultValue |> should equal DateTime.MinValue 346 | 347 | [] 348 | let ``Multiline column name should be converted to a single line``() = 349 | let file = MultiLine() 350 | let rows = file.Data |> Seq.toArray 351 | rows.[0].``Multiline\nheader`` |> should equal "foo" 352 | 353 | [] 354 | let ``HashHeader defaults true``() = 355 | let file = DataTypesHeaderTrue() 356 | let row = file.Data |> Seq.head 357 | row.String |> should equal "A" 358 | Assert.That(row.Boolean, Is.True) 359 | row.Float |> should equal 1.0 360 | row.Date |> should equal (new DateTime(2014,1,1)) 361 | let expectedTime = new DateTime(1899, 12, 31, 8, 0, 0) 362 | row.Time |> should equal expectedTime 363 | row.Currency |> should equal 100.0M 364 | 365 | [] 366 | let ``HashHeader false - first row as data``() = 367 | let file = DataTypesHeaderFalse() 368 | let row = file.Data |> Seq.head 369 | let row2 = file.Data |> Seq.skip 1 |> Seq.head 370 | row.Column1 |> should equal "String" 371 | row.Column2 |> should equal "Float" 372 | row2.Column1 |> should equal "A" 373 | row2.Column2 |> should equal "1" 374 | 375 | [] 376 | let ``HashHeader false with header removed``() = 377 | let file = DataTypesNoHeader() 378 | let row = file.Data |> Seq.head 379 | row.Column1 |> should equal "A" 380 | row.Column2 |> should equal 1.0 381 | Assert.That(row.Column3, Is.True) 382 | row.Column4 |> should equal (new DateTime(2014,1,1)) 383 | let expectedTime = new DateTime(1899, 12, 31, 8, 0, 0) 384 | row.Column5 |> should equal expectedTime 385 | row.Column6 |> should equal 100.0M 386 | 387 | [] 388 | let ``Reading all rows in a well-formed excel file does not return empty rows``() = 389 | let fileWithUnboundRange = DifferentMainSheet() 390 | // For reference, DifferentMainSheet has 1 header row and 6 data rows. 391 | fileWithUnboundRange.Data |> Seq.length |> should equal 6 392 | 393 | let fileWithBoundRange = MultipleRegions() 394 | fileWithBoundRange.Data |> Seq.length |> should equal 4 395 | 396 | 397 | module AutomaticCoercion = 398 | type MixedDataTypes = ExcelFile<"MixedDataTypes.xlsx", "ValidDataTypes"> 399 | 400 | type DateTimeFromTextNumeric = ExcelFile<"MixedDataTypes.xlsx", "ValidDataTypes", Range="H2:H3", HasHeaders=false> 401 | type DateTimeFromTextString = ExcelFile<"MixedDataTypes.xlsx", "ValidDataTypes", Range="H4:H5", HasHeaders=false> 402 | type DateTimeFromNumeric = ExcelFile<"MixedDataTypes.xlsx", "ValidDataTypes", Range="H6:H7", HasHeaders=false> 403 | type DateTimeFromGeneralNumeric = ExcelFile<"MixedDataTypes.xlsx", "ValidDataTypes", Range="H8:H9", HasHeaders=false> 404 | 405 | type DoubleCoercionErrorFromNumberWords = ExcelFile<"MixedDataTypes.xlsx", "InvalidDataTypes", Range="B2:B3", HasHeaders=false> 406 | type DoubleCoercionErrorFromString = ExcelFile<"MixedDataTypes.xlsx", "InvalidDataTypes", Range="B4:B5", HasHeaders=false> 407 | type DoubleCoercionErrorFromCurrencyNumber = ExcelFile<"MixedDataTypes.xlsx", "InvalidDataTypes", Range="B6:B7", HasHeaders=false> 408 | 409 | type DateCoercionErrorFromDateWords = ExcelFile<"MixedDataTypes.xlsx", "InvalidDataTypes", Range="H2:H3", HasHeaders=false> 410 | type DateCoercionErrorFromString = ExcelFile<"MixedDataTypes.xlsx", "InvalidDataTypes", Range="H4:H5", HasHeaders=false> 411 | type DateCoercionErrorFromNegativeNumber = ExcelFile<"MixedDataTypes.xlsx", "InvalidDataTypes", Range="H6:H7", HasHeaders=false> 412 | 413 | 414 | // See https://github.com/fsprojects/ExcelProvider/issues/14 415 | type MixedStringTypes = ExcelFile<"MixedDataTypes.xlsx", "ValidDataTypes", Range="A1:A10"> 416 | [] 417 | let ``Automatically coerces non-string data in string columns to strings`` () = 418 | 419 | 420 | let file = MixedStringTypes() 421 | let writeTitles data = 422 | for (row:MixedStringTypes.Row) in data do 423 | (sprintf "%s" row.Title) |> ignore 424 | (fun () -> writeTitles file.Data) |> should (not' << throw) typeof 425 | 426 | type MixedDoubleTypes = ExcelFile<"MixedDataTypes.xlsx", "ValidDataTypes", Range="B1:B10"> 427 | [] 428 | let ``Coerces valid string data in numeric columns to double`` () = 429 | let file = MixedDoubleTypes() 430 | let getYear data = 431 | for (row:MixedDoubleTypes.Row) in data do 432 | sprintf "%f" (row.Year) |> ignore 433 | (fun () -> getYear file.Data) |> should (not' << throw) typeof 434 | 435 | type MixedDateTimeTypes = ExcelFile<"MixedDataTypes.xlsx", "ValidDataTypes", Range="H1:H10"> 436 | [] 437 | let ``Coerces valid data in datetime columns to double`` () = 438 | let file = MixedDateTimeTypes() 439 | let getYear data = 440 | for (row:MixedDateTimeTypes.Row) in data do 441 | sprintf "%A" (row.``Date Watched``) |> ignore 442 | (fun () -> getYear file.Data) |> should (not' << throw) typeof 443 | 444 | [] 445 | let ``Throws when coercing invalid data to double`` () = 446 | let filenw = DoubleCoercionErrorFromNumberWords() 447 | let files = DoubleCoercionErrorFromString() 448 | let filecn = DoubleCoercionErrorFromCurrencyNumber() 449 | let getYear data = 450 | for (row: DoubleCoercionErrorFromNumberWords.Row) in data do 451 | sprintf "%f" (row.``Column1``) |> ignore 452 | (fun () -> getYear filenw.Data) |> should throw typeof 453 | 454 | let getYear data = 455 | for (row: DoubleCoercionErrorFromString.Row) in data do 456 | sprintf "%f" (row.``Column1``) |> ignore 457 | (fun () -> getYear files.Data) |> should throw typeof 458 | 459 | let getYear data = 460 | for (row: DoubleCoercionErrorFromCurrencyNumber.Row) in data do 461 | sprintf "%f" (row.``Column1``) |> ignore 462 | (fun () -> getYear filecn.Data) |> should throw typeof 463 | 464 | 465 | [] 466 | let ``Throws when coercing invalid data to datetime`` () = 467 | let filedw = DateCoercionErrorFromDateWords() 468 | let files = DateCoercionErrorFromString() 469 | let filenn = DateCoercionErrorFromNegativeNumber() 470 | let getYear data = 471 | for (row: DateCoercionErrorFromDateWords.Row) in data do 472 | sprintf "%A" (row.``Column1``) |> ignore 473 | (fun () -> getYear filedw.Data) |> should throw typeof 474 | 475 | let getYear data = 476 | for (row: DateCoercionErrorFromString.Row) in data do 477 | sprintf "%A" (row.``Column1``) |> ignore 478 | (fun () -> getYear files.Data) |> should throw typeof 479 | 480 | let getYear data = 481 | for (row: DateCoercionErrorFromNegativeNumber.Row) in data do 482 | sprintf "%A" (row.``Column1``) |> ignore 483 | (fun () -> getYear filenn.Data) |> should throw typeof 484 | 485 | 486 | [] 487 | let ``Automatic conversions do not cause InvalidCastExceptions`` () = 488 | let file = MixedDataTypes() 489 | let printTitles data = 490 | for (row:MixedDataTypes.Row) in data do 491 | sprintf "%s (%f) %i" row.Title (row.Year) (row.``Date Watched``.Year) |> ignore 492 | (fun () -> printTitles file.Data) |> should (not' << throw) typeof 493 | 494 | // See https://github.com/fsprojects/ExcelProvider/issues/14 495 | [] 496 | let ``Can automatically coerce non-string cells in a column of string data to their string form`` () = 497 | let file = MixedDataTypes() 498 | let printTitles data = 499 | for (row:MixedDataTypes.Row) in data do 500 | sprintf "%s (%i)" row.Title ((int) row.Year) |> ignore 501 | (fun () -> printTitles file.Data) |> should (not' << throw) typeof 502 | 503 | -------------------------------------------------------------------------------- /tests/ExcelProvider.Tests/ExcelProvider.Tests.fsproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | net6.0; 5 | true 6 | true 7 | 8 | 9 | 10 | 11 | PreserveNewest 12 | 13 | 14 | PreserveNewest 15 | 16 | 17 | PreserveNewest 18 | 19 | 20 | PreserveNewest 21 | 22 | 23 | PreserveNewest 24 | 25 | 26 | PreserveNewest 27 | 28 | 29 | PreserveNewest 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | ExcelProvider.Runtime 38 | {7e90d6ce-a10b-4858-a5bc-41df7250cbca} 39 | True 40 | 41 | 42 | 43 | 44 | -------------------------------------------------------------------------------- /tests/ExcelProvider.Tests/MixedDataTypes.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fsprojects/ExcelProvider/bb1008eb6d1353009b133a88338d45cb96af2952/tests/ExcelProvider.Tests/MixedDataTypes.xlsx -------------------------------------------------------------------------------- /tests/ExcelProvider.Tests/MultilineHeader.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fsprojects/ExcelProvider/bb1008eb6d1353009b133a88338d45cb96af2952/tests/ExcelProvider.Tests/MultilineHeader.xlsx -------------------------------------------------------------------------------- /tests/ExcelProvider.Tests/MultipleRegions.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fsprojects/ExcelProvider/bb1008eb6d1353009b133a88338d45cb96af2952/tests/ExcelProvider.Tests/MultipleRegions.xlsx -------------------------------------------------------------------------------- /tests/ExcelProvider.Tests/MultipleSheets.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fsprojects/ExcelProvider/bb1008eb6d1353009b133a88338d45cb96af2952/tests/ExcelProvider.Tests/MultipleSheets.xlsx -------------------------------------------------------------------------------- /tests/ExcelProvider.Tests/paket.references: -------------------------------------------------------------------------------- 1 | FSharp.Core 2 | group Test 3 | Microsoft.NET.Test.Sdk 4 | FSharp.Compiler.Service 5 | NUnit 6 | NUnit.Console 7 | NUnit3TestAdapter 8 | FsUnit --------------------------------------------------------------------------------