From 23f1d92c1ba1ffbb0e114a77f5c98a9af2d8ae63 Mon Sep 17 00:00:00 2001 From: dfinke Date: Sat, 10 Jun 2023 15:27:53 -0400 Subject: [PATCH 1/5] first pass --- ImportExcel.psd1 | 3 ++- Public/Get-ExcelFileSchema.ps1 | 47 ++++++++++++++++++++++++++++++++++ changelog.md | 5 ++++ 3 files changed, 54 insertions(+), 1 deletion(-) create mode 100644 Public/Get-ExcelFileSchema.ps1 diff --git a/ImportExcel.psd1 b/ImportExcel.psd1 index 0a1e9d9..cb27ce0 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 0000000..ad3d1fd --- /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/changelog.md b/changelog.md index 7fe0571..2a89d9a 100644 --- a/changelog.md +++ b/changelog.md @@ -1,3 +1,8 @@ +# 7.8.5 + +- Added `Get-ExcelFileSchema` to get the schema of an Excel file. + - `Get-ExcelFileSchema -Path $xlfile` + # 7.8.x Thanks to [Thomas Hofkens](https://github.com/thkn-hofa) From d99bd8fc9e7173561c8695185f04b4c938fd8daa Mon Sep 17 00:00:00 2001 From: dfinke Date: Sat, 10 Jun 2023 15:45:35 -0400 Subject: [PATCH 2/5] add tests --- __tests__/Get-ExcelFileSchema.tests.ps1 | 53 +++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 __tests__/Get-ExcelFileSchema.tests.ps1 diff --git a/__tests__/Get-ExcelFileSchema.tests.ps1 b/__tests__/Get-ExcelFileSchema.tests.ps1 new file mode 100644 index 0000000..c7e0f95 --- /dev/null +++ b/__tests__/Get-ExcelFileSchema.tests.ps1 @@ -0,0 +1,53 @@ +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 -Be "test.xlsx" + $actual.WorksheetName | Should -Be "Sheet1" + $actual.Visible | Should -Be $true + $actual.Rows | Should -Be 10 + $actual.Columns | Should -Be 4 + $actual.Address | Should -Be "A1:D10" + $actual.Path | Should -Be "TestDrive:\" + + $actual.PropertyNames.Count | Should -Be 4 + $actual.PropertyNames[0] | Should -Be "Region" + $actual.PropertyNames[1] | Should -Be "State" + $actual.PropertyNames[2] | Should -Be "Units" + $actual.PropertyNames[3] | Should -Be "Price" + } +} \ No newline at end of file From cd2a70197ce84693726278c5dcc21c792d1260cd Mon Sep 17 00:00:00 2001 From: dfinke Date: Sat, 10 Jun 2023 16:00:11 -0400 Subject: [PATCH 3/5] use -BeExactly --- __tests__/Get-ExcelFileSchema.tests.ps1 | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/__tests__/Get-ExcelFileSchema.tests.ps1 b/__tests__/Get-ExcelFileSchema.tests.ps1 index c7e0f95..925922b 100644 --- a/__tests__/Get-ExcelFileSchema.tests.ps1 +++ b/__tests__/Get-ExcelFileSchema.tests.ps1 @@ -34,20 +34,20 @@ South,Delaware,712,508.55 It "Test Get-ExcelFileSchema correct json" { $actual = Get-ExcelFileSchema -Path $excelFile - $actual = $actual | ConvertFrom-Json - $actual.ExcelFile | Should -Be "test.xlsx" - $actual.WorksheetName | Should -Be "Sheet1" + + $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 -Be "A1:D10" - $actual.Path | Should -Be "TestDrive:\" + $actual.Address | Should -BeExactly "A1:D10" + $actual.Path | Should -BeExactly "TestDrive:\" $actual.PropertyNames.Count | Should -Be 4 - $actual.PropertyNames[0] | Should -Be "Region" - $actual.PropertyNames[1] | Should -Be "State" - $actual.PropertyNames[2] | Should -Be "Units" - $actual.PropertyNames[3] | Should -Be "Price" + $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 From 637c11c2e6ca740ac50162b9649bbc28fe24de3d Mon Sep 17 00:00:00 2001 From: dfinke Date: Sat, 10 Jun 2023 16:40:25 -0400 Subject: [PATCH 4/5] needs to work xplat --- __tests__/Get-ExcelFileSchema.tests.ps1 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/__tests__/Get-ExcelFileSchema.tests.ps1 b/__tests__/Get-ExcelFileSchema.tests.ps1 index 925922b..c5ca5d8 100644 --- a/__tests__/Get-ExcelFileSchema.tests.ps1 +++ b/__tests__/Get-ExcelFileSchema.tests.ps1 @@ -42,7 +42,8 @@ South,Delaware,712,508.55 $actual.Rows | Should -Be 10 $actual.Columns | Should -Be 4 $actual.Address | Should -BeExactly "A1:D10" - $actual.Path | Should -BeExactly "TestDrive:\" + + $actual.Path | Should -BeExactly ("TestDrive:" + [System.IO.Path]::DirectorySeparatorChar) $actual.PropertyNames.Count | Should -Be 4 $actual.PropertyNames[0] | Should -BeExactly "Region" From 77ec946b8418b2742037d1425e9587245c597a28 Mon Sep 17 00:00:00 2001 From: dfinke Date: Wed, 14 Jun 2023 05:45:57 -0400 Subject: [PATCH 5/5] update changelog --- changelog.md | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/changelog.md b/changelog.md index 2a89d9a..db0afb1 100644 --- a/changelog.md +++ b/changelog.md @@ -1,7 +1,29 @@ # 7.8.5 - Added `Get-ExcelFileSchema` to get the schema of an Excel file. - - `Get-ExcelFileSchema -Path $xlfile` +- 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