diff --git a/ImportExcel.psd1 b/ImportExcel.psd1 index 0a1e9d9f..cb27ce02 100644 --- a/ImportExcel.psd1 +++ b/ImportExcel.psd1 @@ -6,7 +6,7 @@ RootModule = 'ImportExcel.psm1' # Version number of this module. - ModuleVersion = '7.8.4' + ModuleVersion = '7.8.5' # ID used to uniquely identify this module GUID = '60dd4136-feff-401a-ba27-a84458c57ede' @@ -54,6 +54,7 @@ Check out the How To Videos https://www.youtube.com/watch?v=U3Ne_yX4tYo&list=PL5 'Export-Excel', 'Export-ExcelSheet', 'Get-ExcelColumnName', + 'Get-ExcelFileSchema', 'Get-ExcelFileSummary', 'Get-ExcelSheetDimensionAddress', 'Get-ExcelSheetInfo', diff --git a/Public/Get-ExcelFileSchema.ps1 b/Public/Get-ExcelFileSchema.ps1 new file mode 100644 index 00000000..ad3d1fdb --- /dev/null +++ b/Public/Get-ExcelFileSchema.ps1 @@ -0,0 +1,47 @@ +function Get-ExcelFileSchema { + <# + .SYNOPSIS + Gets the schema of an Excel file. + + .DESCRIPTION + The Get-ExcelFileSchema function gets the schema of an Excel file by returning the property names of the first row of each worksheet in the file. + + .PARAMETER Path + Specifies the path to the Excel file. + + .PARAMETER Compress + Indicates whether to compress the json output. + + .OUTPUTS + Json + + .EXAMPLE + Get-ExcelFileSchema -Path .\example.xlsx + #> + + [CmdletBinding()] + param( + [Parameter(ValueFromPipelineByPropertyName, Mandatory)] + [Alias('FullName')] + $Path, + [Switch]$Compress + ) + + Begin { + $result = @() + } + + Process { + $excelFiles = Get-ExcelFileSummary $Path + + foreach ($excelFile in $excelFiles) { + $data = Import-Excel $Path -WorksheetName $excelFile.WorksheetName | Select-Object -First 1 + $names = $data[0].PSObject.Properties.name + $result += $excelFile | Add-Member -MemberType NoteProperty -Name "PropertyNames" -Value $names -PassThru + } + } + + End { + $result | ConvertTo-Json -Compress:$Compress + } +} \ No newline at end of file diff --git a/__tests__/Get-ExcelFileSchema.tests.ps1 b/__tests__/Get-ExcelFileSchema.tests.ps1 new file mode 100644 index 00000000..c5ca5d81 --- /dev/null +++ b/__tests__/Get-ExcelFileSchema.tests.ps1 @@ -0,0 +1,54 @@ +if (-not (Get-command Import-Excel -ErrorAction SilentlyContinue)) { + Import-Module $PSScriptRoot\..\ImportExcel.psd1 +} + +Describe "Test getting the schema of an Excel file" -Tag GetExcelFileSchema { + + BeforeAll { + $script:excelFile = "TestDrive:\test.xlsx" + $data = ConvertFrom-Csv @" +Region,State,Units,Price +West,Texas,927,923.71 +North,Tennessee,466,770.67 +East,Florida,520,458.68 +East,Maine,828,661.24 +West,Virginia,465,053.58 +North,Missouri,436,235.67 +South,Kansas,214,992.47 +North,North Dakota,789,640.72 +South,Delaware,712,508.55 +"@ + $data | Export-Excel $excelFile + } + + It "Test Get-ExcelFileSchema function exists" { + $function = Get-Command Get-ExcelFileSchema -ErrorAction SilentlyContinue + $function | Should -Not -Be $null + } + + It "Test Get-ExcelFileSchema returns json" { + $actual = Get-ExcelFileSchema -Path $excelFile + $actual | Should -Not -Be $null + $actual | Should -BeOfType [string] + } + + It "Test Get-ExcelFileSchema correct json" { + $actual = Get-ExcelFileSchema -Path $excelFile + $actual = $actual | ConvertFrom-Json + + $actual.ExcelFile | Should -BeExactly "test.xlsx" + $actual.WorksheetName | Should -BeExactly "Sheet1" + $actual.Visible | Should -Be $true + $actual.Rows | Should -Be 10 + $actual.Columns | Should -Be 4 + $actual.Address | Should -BeExactly "A1:D10" + + $actual.Path | Should -BeExactly ("TestDrive:" + [System.IO.Path]::DirectorySeparatorChar) + + $actual.PropertyNames.Count | Should -Be 4 + $actual.PropertyNames[0] | Should -BeExactly "Region" + $actual.PropertyNames[1] | Should -BeExactly "State" + $actual.PropertyNames[2] | Should -BeExactly "Units" + $actual.PropertyNames[3] | Should -BeExactly "Price" + } +} \ No newline at end of file diff --git a/changelog.md b/changelog.md index 7fe0571f..db0afb14 100644 --- a/changelog.md +++ b/changelog.md @@ -1,3 +1,30 @@ +# 7.8.5 + +- Added `Get-ExcelFileSchema` to get the schema of an Excel file. +- This was added to support interacting with `ChatGPT`. Passing the schema to the `ChatGPT` via `PowerShellAI` let's you ask questions about the data including generating code based on the schema. + +```powershell +Get-ExcelFileSchema .\salesData.xlsx +``` + +```json +{ + "ExcelFile": "salesData.xlsx", + "WorksheetName": "Sheet1", + "Visible": true, + "Rows": 10, + "Columns": 4, + "Address": "A1:D10", + "Path": ".", + "PropertyNames": [ + "Region", + "State", + "Units", + "Price" + ] +} +``` + # 7.8.x Thanks to [Thomas Hofkens](https://github.com/thkn-hofa)