Compare commits

..

85 Commits

Author SHA1 Message Date
Doug Finke
09f35b5fd5 Merge pull request #1078 from dfinke/Add-Checks-And-Warnings-for-Add-Member-Open-Excel-Package
Add-Checks-And-Warnings-for-Add-Member-Open-Excel-Package
2021-09-14 18:15:47 -04:00
dfinke
23a2ac394f Add try/catch, warning, and tests 2021-09-14 15:44:32 -04:00
dfinke
50928e8e3b Update 2021-09-14 15:44:11 -04:00
dfinke
26827b0764 bump version 2021-09-14 15:44:03 -04:00
Doug Finke
6c35d5b018 Updated 2021-09-10 18:41:03 -04:00
Doug Finke
ab5600c9ba bump version 2021-09-10 18:40:57 -04:00
Doug Finke
47dcc636d9 Merge pull request #1077 from stahler/Open-ExcelPackage
Update open-excelpackage.md
2021-09-10 18:39:00 -04:00
Stahler
1768c0ac92 Update open-excelpackage.md 2021-09-10 14:17:44 -04:00
Doug Finke
694fcdd8c1 Merge pull request #1059 from dfinke/add-test-for-ps-5-to-7-and-linux
Improved checks for Linux, Mac and PS 5.1 - #1056, #1057
2021-07-30 19:27:06 -04:00
dfinke
0192f4d822 Improved checks for Linux, Mac and PS 5.1 - #1056, #1057 2021-07-30 19:21:37 -04:00
dfinke
c641eea10a Improve auto-detection of data on the clipboard 2021-07-24 19:41:57 -04:00
dfinke
99de9a9854 Pass parameters from Read-Clipboard to implementation 2021-07-24 13:48:18 -04:00
Doug Finke
3121c5eaed Merge pull request #1054 from dfinke/Add-new-function-Read-Clipboard
Added Read-Clipboard
2021-07-24 13:37:32 -04:00
dfinke
d02f757568 add change log 2021-07-24 13:26:06 -04:00
dfinke
a693725949 Add Tests 2021-07-24 13:01:51 -04:00
dfinke
5e19d0ca1a Add ReadClipboardImpl function 2021-07-24 13:01:48 -04:00
dfinke
204b82144f Refactor for testing 2021-07-24 13:01:32 -04:00
dfinke
91eefbd48b Added Read-Clipboard 2021-07-24 11:20:04 -04:00
dfinke
f86556a89d Updated, added Open in VS Code badge 2021-07-10 08:46:36 -04:00
dfinke
14e1dfd8db Bump version. Use ProviderPath 2021-06-20 12:11:14 -04:00
Doug Finke
1d961c679e Merge pull request #1031 from sporkabob/master
Fix UNC paths for ConvertFrom-ExcelSheet
2021-05-13 15:54:39 -04:00
sporkabob
7026803415 Fix UNC paths for ConvertFrom-ExcelSheet 2021-05-13 15:22:15 -04:00
Doug Finke
e486135c4f Merge pull request #1029 from MikeyBronowski/patch-2
Removed duplicate entry for the version
2021-05-08 19:05:55 -04:00
Mikey Bronowski
80d9cb1290 Removed duplicate entry for the version
The What's new for 7.1.2 starts at line 58
2021-05-08 23:43:42 +01:00
dfinke
d82c01eabf Updated readme #1014 2021-04-06 20:22:55 -04:00
dfinke
2fcb7a57a2 tweak tests for path returned #1014 2021-04-06 19:37:07 -04:00
dfinke
afe7e545f6 Add unit tests for Get-ExcelFileSummary #1014 2021-04-06 19:32:37 -04:00
dfinke
88638a87a9 Added Get-ExcelFileSummary 2021-02-28 15:59:42 -05:00
Doug Finke
0f354be443 Merge pull request #998 from DarkLite1/master
Added example for exporting data to Excel for Pester 5.1
2021-02-12 09:54:32 -05:00
DarkLite1
abebb9af11 Added example for exporting data to Excel for Pester 5.1 2021-02-12 13:21:59 +01:00
dfinke
d8ae8b1abc change to testdrive 2021-02-07 11:19:43 -05:00
dfinke
30fc53857d Swapped out Get-CimInstance tests 2021-02-07 11:14:08 -05:00
dfinke
04b7895d1e Remove .gitbook 2020-11-28 11:41:44 -05:00
Doug Finke
7f72aa9e86 GitBook: [master] 133 pages and 8 assets modified 2020-11-28 13:13:00 +00:00
Doug Finke
70ab9e46c7 Merge pull request #959 from MikeyBronowski/ExampleDatabar
Example: Removed a duplicate parameter Range/Address
2020-11-27 12:47:24 -05:00
MikeyBronowski
49e355b702 Removed a duplicate parameter Range/Address 2020-11-24 22:24:40 +00:00
Doug Finke
82a8536e47 Merge pull request #954 from jhoneill/master
Fixed the pester issues. (Locally and in AzDo pipelines)
2020-11-23 18:38:51 -05:00
dfinke
35246d51e7 Remove -MaximumVersion 4.99.99 2020-11-23 18:33:17 -05:00
jhoneill
9dafe170f1 Suppress bogus analyzer warnings. 2020-11-23 09:34:14 +00:00
jhoneill
0d29fd813d Merge branch 'master' of https://github.com/jhoneill/ImportExcel 2020-11-23 09:27:54 +00:00
jhoneill
c685ad767c More pester fixing 2020-11-23 09:27:14 +00:00
jhoneill
f283ada708 More pester fixing 2020-11-23 09:12:50 +00:00
jhoneill
bb3923aabf Merge remote-tracking branch 'upstream/master' 2020-11-23 00:43:11 +00:00
Doug Finke
fa0b3ca79b Update Multiplecharts.md 2020-11-13 18:52:53 -05:00
Doug Finke
53f8acda90 Update Multiplecharts.md 2020-11-13 18:50:27 -05:00
Doug Finke
ca586fc2d5 Update Multiplecharts.md 2020-11-13 18:50:14 -05:00
Doug Finke
4c5f1a967e Update Multiplecharts.md 2020-11-13 18:49:58 -05:00
dfinke
f237861e1a added md and png 2020-11-13 18:49:14 -05:00
jhoneill
282d650072 De-skipped some tests. Fixed a tiny bug in Add-Conditional formatting. 2020-11-02 18:01:23 +00:00
dfinke
6149442bc0 First pass. All code must be in a script block 2020-10-31 17:47:07 -04:00
Doug Finke
113bf2c95c Merge pull request #908 from SQLvariant/small-typo
Update ImportExcel-help.xml
2020-08-28 09:11:45 -04:00
Aaron Nelson
27e8130e6c Update ImportExcel-help.xml
Corrected the location of the period.
2020-08-28 08:07:41 -04:00
Doug Finke
c19e219a44 Update README.md 2020-07-11 18:38:54 -04:00
dfinke
795b2017b5 Update readme 2020-07-11 18:20:50 -04:00
Doug Finke
cb749dff07 Merge pull request #835 from scrthq:hotfix/issue_832
fixes #832
2020-07-11 17:49:54 -04:00
dfinke
fd6b847d77 update readme 2020-07-03 12:11:59 -04:00
dfinke
c6d9104d52 Merge branch 'master' of https://github.com/dfinke/ImportExcel 2020-07-03 12:10:34 -04:00
Doug Finke
df157b22ab Merge pull request #885 from MikeyBronowski/Examples1
Standardise examples: loading module + file cleanup
2020-07-03 11:39:52 -04:00
MikeyBronowski
95822ac2e9 Standardise file cleanup 2020-07-01 22:19:42 +02:00
MikeyBronowski
c4d20a9a28 Standardise file cleanup 2020-07-01 22:10:00 +02:00
MikeyBronowski
8a20963577 Standardising examples 2020-07-01 22:04:37 +02:00
dfinke
c30e03a47f updated 2020-06-26 19:38:55 -04:00
Doug Finke
0a77a83e35 Merge pull request #875 from MikeyBronowski/VariableCasing
Variable casing
2020-06-26 19:30:00 -04:00
MikeyBronowski
66f6a5fa0b typo 2020-06-21 22:53:35 +02:00
MikeyBronowski
a3921f5298 Parameters with casing not following standard 2020-06-21 22:34:46 +02:00
dfinke
1823f1dde0 updated readme 2020-06-20 17:44:46 -04:00
Doug Finke
5d5ca57f4b Merge pull request #873 from MikeyBronowski:VariableCasing
Standardising casing of parameter names
2020-06-20 17:36:27 -04:00
MikeyBronowski
11d591aad6 Standardising casing of parameter names 2020-06-20 23:03:27 +02:00
dfinke
9841ef9436 delete appveyor.yml, update badges in readme 2020-05-24 12:23:22 -04:00
dfinke
ae1fa04334 stop appveyor builds 2020-05-24 12:14:41 -04:00
dfinke
a7861ee57d bump version, update readme 2020-05-24 11:50:19 -04:00
Doug Finke
24ca7a4d86 Merge pull request #856 from dfinke/dfinke/issue855
Dfinke/issue855
2020-05-24 11:20:52 -04:00
dfinke
51b23323fa Scrub invalid chars from the filename 2020-05-24 10:59:57 -04:00
dfinke
001aabf526 Added synopsis, and tests the value is a scriptblock 2020-05-23 17:32:22 -04:00
dfinke
a5a98d5c92 Used to drive the Export-MultipleExcelSheets 2020-05-23 17:32:03 -04:00
dfinke
070d40b5af Move to Examples/Experimental 2020-05-23 17:10:54 -04:00
dfinke
c4b3556c5d Don't source the Export-Multiplesheets ps1 2020-05-23 17:06:45 -04:00
dfinke
8151ed4305 Remove help file 2020-05-23 17:06:12 -04:00
Nate Ferrell
6959cffa24 added ImportOnly test and added additional macOS stage on azure-pipelines.yml 2020-05-05 02:22:53 -05:00
Nate Ferrell
6be2195680 Merge remote-tracking branch 'upstream/master' into hotfix/issue_832 2020-05-05 02:21:00 -05:00
Doug Finke
ff77606430 Merge pull request #837 from dfinke/UpdatePesterInstall
Prevent install of Pester v5
2020-05-04 18:52:27 -04:00
dfinke
a874e1385e Prevent install of Pester v5 2020-05-04 09:43:19 -04:00
dfinke
f8b9cf7251 Add Stale bot config 2020-05-03 14:58:02 -04:00
dfinke
5588c0306c added custom formatting example 2020-05-02 16:47:36 -04:00
Nate Ferrell
359f7453c5 fixes #832 2020-05-01 13:34:46 -05:00
200 changed files with 32486 additions and 3153 deletions

17
.github/stale.yml vendored Normal file
View File

@@ -0,0 +1,17 @@
# Number of days of inactivity before an issue becomes stale
daysUntilStale: 30
# Number of days of inactivity before a stale issue is closed
daysUntilClose: 7
# Issues with these labels will never be considered stale
exemptLabels:
- pinned
- security
# Label to use when marking an issue as stale
staleLabel: wontfix
# Comment to post when marking an issue as stale. Set to `false` to disable
markComment: >
This issue has been automatically marked as stale because it has not had
recent activity. It will be closed if no further activity occurs. Thank you
for your contributions.
# Comment to post when closing a stale issue. Set to `false` to disable
closeComment: false

1
.gitignore vendored
View File

@@ -65,3 +65,4 @@ ImportExcel.zip
~$* ~$*
# InstallModule.ps1 # InstallModule.ps1
# PublishToGallery.ps1 # PublishToGallery.ps1
.vscode/*

56
.vscode/launch.json vendored
View File

@@ -1,56 +0,0 @@
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"type": "PowerShell",
"request": "launch",
"name": "PowerShell Pester Tests",
"script": "Import-Module -Name '.\\' -Force ; Invoke-Pester", // Change to '.\\ModuleName.psd1' if Git name different
"args": [""],
"cwd": "${workspaceFolder}"
},
{
"type": "PowerShell",
"request": "launch",
"name": "PowerShell Launch Current File",
"script": "${file}",
"args": [],
"cwd": "${file}"
},
{
"type": "PowerShell",
"request": "launch",
"name": "PowerShell Launch Current File in Temporary Console",
"script": "${file}",
"args": [],
"cwd": "${file}",
"createTemporaryIntegratedConsole": true
},
{
"type": "PowerShell",
"request": "launch",
"name": "PowerShell Launch Current File w/Args Prompt",
"script": "${file}",
"args": [
"${command:SpecifyScriptArgs}"
],
"cwd": "${file}"
},
{
"type": "PowerShell",
"request": "attach",
"name": "PowerShell Attach to Host Process",
"processId": "${command:PickPSHostProcess}",
"runspaceId": 1
},
{
"type": "PowerShell",
"request": "launch",
"name": "PowerShell Interactive Session",
"cwd": ""
}
]
}

View File

@@ -13,7 +13,10 @@ param
# AppVeyor and Azure - Upload module as AppVeyor Artifact. # AppVeyor and Azure - Upload module as AppVeyor Artifact.
[Switch]$Artifact, [Switch]$Artifact,
# Azure - Runs PsScriptAnalyzer against one or more folders and pivots the results to form a report. # Azure - Runs PsScriptAnalyzer against one or more folders and pivots the results to form a report.
[Switch]$Analyzer [Switch]$Analyzer,
# Installs the module and invokes only the ModuleImport test.
# Used for validating that the module imports still when external dependencies are missing, e.g. mono-libgdiplus on macOS.
[Switch]$TestImportOnly
) )
$ErrorActionPreference = 'Stop' $ErrorActionPreference = 'Stop'
if ($Initialize) { if ($Initialize) {
@@ -21,7 +24,7 @@ if ($Initialize) {
$ModuleVersion = (. ([Scriptblock]::Create((Get-Content -Path $Psd1 | Out-String)))).ModuleVersion $ModuleVersion = (. ([Scriptblock]::Create((Get-Content -Path $Psd1 | Out-String)))).ModuleVersion
Update-AppveyorBuild -Version "$ModuleVersion ($env:APPVEYOR_BUILD_NUMBER) $env:APPVEYOR_REPO_BRANCH" Update-AppveyorBuild -Version "$ModuleVersion ($env:APPVEYOR_BUILD_NUMBER) $env:APPVEYOR_REPO_BRANCH"
} }
if ($Test) { if ($Test -or $TestImportOnly) {
function Get-EnvironmentInfo { function Get-EnvironmentInfo {
if ([environment]::OSVersion.Platform -like "win*") { if ([environment]::OSVersion.Platform -like "win*") {
# Get Windows Version # Get Windows Version
@@ -97,7 +100,23 @@ if (-not $VersionFilePath) {
'[Progress] Installing Module.' '[Progress] Installing Module.'
. .\CI\Install.ps1 . .\CI\Install.ps1
'[Progress] Invoking Pester.' '[Progress] Invoking Pester.'
Invoke-Pester -OutputFile ('TestResultsPS{0}.xml' -f $PSVersionTable.PSVersion) $pesterParams = @{
OutputFile = ('TestResultsPS{0}.xml' -f $PSVersionTable.PSVersion)
PassThru = $true
}
if ($TestImportOnly) {
$pesterParams['Tag'] = 'TestImportOnly'
}
else {
$pesterParams['ExcludeTag'] = 'TestImportOnly'
}
$testResults = Invoke-Pester @pesterParams
'Pester invocation complete!'
if ($testResults.FailedCount -gt 0) {
"Test failures:"
$testResults.TestResult | Where-Object {-not $_.Passed} | Format-List
Write-Error "$($testResults.FailedCount) Pester tests failed. Build cannot continue!"
}
} }
if ($Finalize) { if ($Finalize) {
'[Progress] Finalizing.' '[Progress] Finalizing.'
@@ -131,6 +150,7 @@ if ($Artifact) {
"[Progress] Artifact Start for Module: $ModuleName, Version: $VersionLocal." "[Progress] Artifact Start for Module: $ModuleName, Version: $VersionLocal."
if ($env:APPVEYOR) { if ($env:APPVEYOR) {
$ZipFileName = "{0} {1} {2} {3:yyyy-MM-dd HH-mm-ss}.zip" -f $ModuleName, $VersionLocal, $env:APPVEYOR_REPO_BRANCH, (Get-Date) $ZipFileName = "{0} {1} {2} {3:yyyy-MM-dd HH-mm-ss}.zip" -f $ModuleName, $VersionLocal, $env:APPVEYOR_REPO_BRANCH, (Get-Date)
$ZipFileName = $ZipFileName -replace ("[{0}]" -f [RegEx]::Escape([IO.Path]::GetInvalidFileNameChars() -join ''))
$ZipFileFullPath = Join-Path -Path $PSScriptRoot -ChildPath $ZipFileName $ZipFileFullPath = Join-Path -Path $PSScriptRoot -ChildPath $ZipFileName
"[Info] Artifact. $ModuleName, ZipFileName: $ZipFileName." "[Info] Artifact. $ModuleName, ZipFileName: $ZipFileName."
#Compress-Archive -Path $ModulePath -DestinationPath $ZipFileFullPath #Compress-Archive -Path $ModulePath -DestinationPath $ZipFileFullPath
@@ -205,4 +225,4 @@ if ($Analyzer) {
else { else {
"[Info] Invoke-ScriptAnalyzer didn't return any problems." "[Info] Invoke-ScriptAnalyzer didn't return any problems."
} }
} }

View File

@@ -1,4 +1,4 @@
[cmdletbinding(DefaultParameterSetName='Scope')] [cmdletbinding(DefaultParameterSetName = 'Scope')]
Param( Param(
[Parameter(Mandatory = $true, ParameterSetName = 'ModulePath')] [Parameter(Mandatory = $true, ParameterSetName = 'ModulePath')]
[ValidateNotNullOrEmpty()] [ValidateNotNullOrEmpty()]
@@ -10,7 +10,7 @@ Param(
[string] [string]
$Scope = 'CurrentUser', $Scope = 'CurrentUser',
[Parameter(Mandatory=$true, ParameterSetName = 'PreCheckOnly')] [Parameter(Mandatory = $true, ParameterSetName = 'PreCheckOnly')]
[switch]$PreCheckOnly, [switch]$PreCheckOnly,
[Parameter(ParameterSetName = 'ModulePath')] [Parameter(ParameterSetName = 'ModulePath')]
[Parameter(ParameterSetName = 'Scope')] [Parameter(ParameterSetName = 'Scope')]
@@ -30,7 +30,7 @@ Param(
) )
Function Show-Warning { Function Show-Warning {
param( param(
[Parameter(Position=0,ValueFromPipeline=$true)] [Parameter(Position = 0, ValueFromPipeline = $true)]
$message $message
) )
process { process {
@@ -49,11 +49,11 @@ if (-not $psdpath -or $psdpath.count -gt 1) {
throw "Did not find a unique PSD file " throw "Did not find a unique PSD file "
} }
else { else {
try {$null = Test-ModuleManifest -Path $psdpath -ErrorAction stop} try { $null = Test-ModuleManifest -Path $psdpath -ErrorAction stop }
catch {throw $_ ; return} catch { throw $_ ; return }
$ModuleName = $psdpath.Name -replace '\.psd1$' , '' $ModuleName = $psdpath.Name -replace '\.psd1$' , ''
$Settings = $(& ([scriptblock]::Create(($psdpath | Get-Content -Raw)))) $Settings = $(& ([scriptblock]::Create(($psdpath | Get-Content -Raw))))
$approvedVerbs = Get-Verb | Select-Object -ExpandProperty verb $approvedVerbs = Get-Verb | Select-Object -ExpandProperty verb
$script:warningfile = Join-Path -Path $pwd -ChildPath "warnings.txt" $script:warningfile = Join-Path -Path $pwd -ChildPath "warnings.txt"
} }
@@ -63,7 +63,7 @@ if (-not $SkipPreChecks) {
#Check files in the manifest are present #Check files in the manifest are present
foreach ($file in $Settings.FileList) { foreach ($file in $Settings.FileList) {
if (-not (Test-Path $file)) { if (-not (Test-Path $file)) {
Show-Warning "File $file in the manifest file list is not present" Show-Warning "File $file in the manifest file list is not present"
} }
} }
@@ -71,7 +71,7 @@ if (-not $SkipPreChecks) {
# its name and any alias names in the manifest; function should have a param block and help should be in an MD file # its name and any alias names in the manifest; function should have a param block and help should be in an MD file
# We will want a regex which captures from "function verb-noun {" to its closing "}" # We will want a regex which captures from "function verb-noun {" to its closing "}"
# need to match each { to a } - $reg is based on https://stackoverflow.com/questions/7898310/using-regex-to-balance-match-parenthesis # need to match each { to a } - $reg is based on https://stackoverflow.com/questions/7898310/using-regex-to-balance-match-parenthesis
$reg = [Regex]::new(@" $reg = [Regex]::new(@"
function\s*[-\w]+\s*{ # The function name and opening '{' function\s*[-\w]+\s*{ # The function name and opening '{'
(?: (?:
[^{}]+ # Match all non-braces [^{}]+ # Match all non-braces
@@ -84,56 +84,56 @@ if (-not $SkipPreChecks) {
} # Functions closing '}' } # Functions closing '}'
"@, 57) # 57 = compile,multi-line ignore case and white space. "@, 57) # 57 = compile,multi-line ignore case and white space.
foreach ($file in (Get-Item .\Public\*.ps1)) { foreach ($file in (Get-Item .\Public\*.ps1)) {
$name = $file.name -replace(".ps1","") $name = $file.name -replace (".ps1", "")
if ($name -notmatch ("(\w+)-\w+")) {Show-Warning "$name in the public folder is not a verb-noun name"} if ($name -notmatch ("(\w+)-\w+")) { Show-Warning "$name in the public folder is not a verb-noun name" }
elseif ($Matches[1] -notin $approvedVerbs) {Show-Warning "$name in the public folder does not start with an approved verb"} elseif ($Matches[1] -notin $approvedVerbs) { Show-Warning "$name in the public folder does not start with an approved verb" }
if(-not ($Settings.FunctionsToExport -ceq $name)) { if (-not ($Settings.FunctionsToExport -ceq $name)) {
Show-Warning ('File {0} in the public folder does not match an exported function in the manifest' -f $file.name) Show-Warning ('File {0} in the public folder does not match an exported function in the manifest' -f $file.name)
} }
else { else {
$fileContent = Get-Content $file -Raw $fileContent = Get-Content $file -Raw
$m = $reg.Matches($fileContent) $m = $reg.Matches($fileContent)
if ($m.Count -eq 0) {Show-Warning ('Could not find {0} function in {1}' -f $name, $file.name); continue} if ($m.Count -eq 0) { Show-Warning ('Could not find {0} function in {1}' -f $name, $file.name); continue }
elseif ($m.Count -ge 2) {Show-Warning ('Multiple functions in {0}' -f $item.name) ; Continue} elseif ($m.Count -ge 2) { Show-Warning ('Multiple functions in {0}' -f $item.name) ; Continue }
elseif ($m[0] -imatch "^\function\s" -and elseif ($m[0] -imatch "^\function\s" -and
$m[0] -cnotmatch "^\w+\s+$name") {Show-Warning ('function name does not match file name for {0}' -f $file.name)} $m[0] -cnotmatch "^\w+\s+$name") { Show-Warning ('function name does not match file name for {0}' -f $file.name) }
#$m[0] runs form the f of function to its final } -find the section up to param, check for aliases & comment-based help #$m[0] runs form the f of function to its final } -find the section up to param, check for aliases & comment-based help
$m2 = [regex]::Match($m[0],"^.*?param",17) # 17 = multi-line, ignnore case $m2 = [regex]::Match($m[0], "^.*?param", 17) # 17 = multi-line, ignnore case
if (-not $m2.Success) {Show-Warning "function $name has no param() block"} if (-not $m2.Success) { Show-Warning "function $name has no param() block" }
else { else {
if ($m2.value -match "(?<!#\s*)\[\s*Alias\(\s*.([\w-]+).\s*\)\s*\]") { if ($m2.value -match "(?<!#\s*)\[\s*Alias\(\s*.([\w-]+).\s*\)\s*\]") {
foreach ($a in ($Matches[1] -split '\s*,\s*')) { foreach ($a in ($Matches[1] -split '\s*,\s*')) {
$a = $a -replace "'","" -replace '"','' $a = $a -replace "'", "" -replace '"', ''
if (-not ($Settings.AliasesToExport -eq $a)) { if (-not ($Settings.AliasesToExport -eq $a)) {
Show-Warning "Function $name has alias $a which is not in the manifest" Show-Warning "Function $name has alias $a which is not in the manifest"
} }
} }
} }
if ($m2.value -match "\.syopsis|\.Description|\.Example") { if ($m2.value -match "\.syopsis|\.Description|\.Example") {
Show-Warning "Function $name appears to have comment based help." Show-Warning "Function $name appears to have comment based help."
} }
} }
} }
} }
#Warn about functions which are exported but not found in public #Warn about functions which are exported but not found in public
$notFromPublic = $Settings.FunctionsToExport.Where({-not (Test-Path ".\public\$_.ps1")}) $notFromPublic = $Settings.FunctionsToExport.Where( { -not (Test-Path ".\public\$_.ps1") })
If ($notFromPublic) {Show-Warning ('Exported function(s) {0} are not loaded from the Public folder' -f ($notFromPublic -join ', '))} If ($notFromPublic) { Show-Warning ('Exported function(s) {0} are not loaded from the Public folder' -f ($notFromPublic -join ', ')) }
} }
if ($PreCheckOnly) {return} if ($PreCheckOnly) { return }
#region build, determine module path if necessary, create target directory if necessary, copy files based on manifest, build help #region build, determine module path if necessary, create target directory if necessary, copy files based on manifest, build help
try { try {
if ($ModulePath) { if ($ModulePath) {
$ModulePath = $ModulePath -replace "\\$|/$","" $ModulePath = $ModulePath -replace "\\$|/$", ""
} }
else { else {
if ($IsLinux -or $IsMacOS) {$ModulePathSeparator = ':' } if ($IsLinux -or $IsMacOS) { $ModulePathSeparator = ':' }
else {$ModulePathSeparator = ';' } else { $ModulePathSeparator = ';' }
if ($Scope -eq 'CurrentUser') {$dir = [System.Environment]::GetFolderPath([System.Environment+SpecialFolder]::UserProfile) } if ($Scope -eq 'CurrentUser') { $dir = [System.Environment]::GetFolderPath([System.Environment+SpecialFolder]::UserProfile) }
else {$dir = [System.Environment]::GetFolderPath([System.Environment+SpecialFolder]::ProgramFiles) } else { $dir = [System.Environment]::GetFolderPath([System.Environment+SpecialFolder]::ProgramFiles) }
$ModulePath = ($env:PSModulePath -split $ModulePathSeparator).where({$_ -like "$dir*"},"First",1) $ModulePath = ($env:PSModulePath -split $ModulePathSeparator).where( { $_ -like "$dir*" }, "First", 1)
$ModulePath = Join-Path -Path $ModulePath -ChildPath $ModuleName $ModulePath = Join-Path -Path $ModulePath -ChildPath $ModuleName
$ModulePath = Join-Path -Path $ModulePath -ChildPath $Settings.ModuleVersion $ModulePath = Join-Path -Path $ModulePath -ChildPath $Settings.ModuleVersion
} }
@@ -150,13 +150,13 @@ try {
$outputFile = $psdpath | Copy-Item -Destination $ModulePath -PassThru $outputFile = $psdpath | Copy-Item -Destination $ModulePath -PassThru
$outputFile.fullname $outputFile.fullname
foreach ($file in $Settings.FileList) { foreach ($file in $Settings.FileList) {
if ($file -like '.\*') { if ($file -like '.\*') {
$dest = ($file -replace '\.\\',"$ModulePath\") $dest = ($file -replace '\.\\', "$ModulePath\")
if (-not (Test-Path -PathType Container (Split-Path -Parent $dest))) { if (-not (Test-Path -PathType Container (Split-Path -Parent $dest))) {
$null = New-item -Type Directory -Path (Split-Path -Parent $dest) $null = New-item -Type Directory -Path (Split-Path -Parent $dest)
} }
} }
else {$dest = $ModulePath } else { $dest = $ModulePath }
Copy-Item -Path $file -Destination $dest -Force -Recurse Copy-Item -Path $file -Destination $dest -Force -Recurse
} }
@@ -167,19 +167,19 @@ try {
} }
$platypsInfo = Import-Module platyPS -PassThru -force $platypsInfo = Import-Module platyPS -PassThru -force
Get-ChildItem .\mdHelp -Directory | ForEach-Object { Get-ChildItem .\mdHelp -Directory | ForEach-Object {
'Building help for language ''{0}'', using {1} V{2}.' -f $_.Name,$platypsInfo.Name, $platypsInfo.Version 'Building help for language ''{0}'', using {1} V{2}.' -f $_.Name, $platypsInfo.Name, $platypsInfo.Version
$Null = New-ExternalHelp -Path $_.FullName -OutputPath (Join-Path $ModulePath $_.Name) -Force $Null = New-ExternalHelp -Path $_.FullName -OutputPath (Join-Path $ModulePath $_.Name) -Force
} }
} }
#Leave module path for things which follow. #Leave module path for things which follow.
$env:PSNewBuildModule = $ModulePath $env:PSNewBuildModule = $ModulePath
} }
catch { catch {
if ($PSScriptRoot) { Pop-Location } if ($PSScriptRoot) { Pop-Location }
throw ('Failed installing module "{0}". Error: "{1}" in Line {2}' -f $ModuleName, $_, $_.InvocationInfo.ScriptLineNumber) throw ('Failed installing module "{0}". Error: "{1}" in Line {2}' -f $ModuleName, $_, $_.InvocationInfo.ScriptLineNumber)
} }
finally { finally {
if (-not $outputFile -or -not (Test-Path $outputFile)) { throw "Failed to create module"} if (-not $outputFile -or -not (Test-Path $outputFile)) { throw "Failed to create module" }
} }
#endregion #endregion
@@ -189,16 +189,16 @@ if ($env:Build_ArtifactStagingDirectory) {
#Check valid command names, help, run script analyzer over the files in the module directory #Check valid command names, help, run script analyzer over the files in the module directory
if (-not $SkipPostChecks) { if (-not $SkipPostChecks) {
try {$outputFile | Import-Module -Force -ErrorAction stop } try { $outputFile | Import-Module -Force -ErrorAction stop }
catch { catch {
if ($PSScriptRoot) { Pop-Location } if ($PSScriptRoot) { Pop-Location }
throw "New module failed to load" throw "New module failed to load"
} }
$commands = Get-Command -Module $ModuleName -CommandType function,Cmdlet $commands = Get-Command -Module $ModuleName -CommandType function, Cmdlet
$commands.where({$_.name -notmatch "(\w+)-\w+" -or $Matches[1] -notin $approvedVerbs}) | ForEach-Object { $commands.where( { $_.name -notmatch "(\w+)-\w+" -or $Matches[1] -notin $approvedVerbs }) | ForEach-Object {
Show-Warning ('{0} does not meet the ApprovedVerb-Noun naming rules' -f $_.name) Show-Warning ('{0} does not meet the ApprovedVerb-Noun naming rules' -f $_.name)
} }
$helpless = $commands | Get-Help | Where-Object {$_.Synopsis -match "^\s+$($_.name)\s+\["} | Select-Object -ExpandProperty name $helpless = $commands | Get-Help | Where-Object { $_.Synopsis -match "^\s+$($_.name)\s+\[" } | Select-Object -ExpandProperty name
foreach ($command in $helpless ) { foreach ($command in $helpless ) {
Show-Warning ('On-line help is missing for {0}.' -f $command) Show-Warning ('On-line help is missing for {0}.' -f $command)
} }
@@ -222,10 +222,12 @@ if (-not $SkipPostChecks) {
AutoSize = $true AutoSize = $true
Activate = $true Activate = $true
PivotTableDefinition = @{BreakDown = @{ PivotTableDefinition = @{BreakDown = @{
PivotData = @{RuleName = 'Count' } PivotData = @{RuleName = 'Count' }
PivotRows = 'Severity', 'RuleName' PivotRows = 'Severity', 'RuleName'
PivotTotals = 'Rows' PivotTotals = 'Rows'
PivotChartDefinition = $chartDef }} PivotChartDefinition = $chartDef
}
}
} }
Remove-Item -Path $ExcelParams['Path'] -ErrorAction SilentlyContinue Remove-Item -Path $ExcelParams['Path'] -ErrorAction SilentlyContinue
$AnalyzerResults | Export-Excel @ExcelParams $AnalyzerResults | Export-Excel @ExcelParams
@@ -244,12 +246,21 @@ if (Test-Path $script:warningfile) {
#if there are test files, run pester (unless told not to) #if there are test files, run pester (unless told not to)
if (-not $SkipPesterTests -and (Get-ChildItem -Recurse *.tests.ps1)) { if (-not $SkipPesterTests -and (Get-ChildItem -Recurse *.tests.ps1)) {
Import-Module -Force $outputFile Import-Module -Force $outputFile
if (-not (Get-Module -ListAvailable pester | Where-Object -Property version -ge ([version]::new(4,4,1)))) { if (-not (Get-Module -ListAvailable pester | Where-Object -Property version -ge ([version]::new(4, 4, 1)))) {
Install-Module Pester -Force -SkipPublisherCheck Install-Module Pester -Force -SkipPublisherCheck -MaximumVersion 4.99.99
} }
Import-Module Pester $pester = Import-Module Pester -PassThru
$PesterOutputPath = Join-Path $pwd -ChildPath ('TestResultsPS{0}.xml' -f $PSVersionTable.PSVersion) $pester
$pesterOutputPath = Join-Path $pwd -ChildPath ('TestResultsPS{0}.xml' -f $PSVersionTable.PSVersion)
if ($PSScriptRoot) { Pop-Location } if ($PSScriptRoot) { Pop-Location }
Invoke-Pester -OutputFile $PesterOutputPath if ($pester.Version.Major -lt 5) {Invoke-Pester -OutputFile $pesterOutputPath}
else {
$pesterArgs = [PesterConfiguration]::Default
$pesterArgs.Run.Exit = $true
$pesterArgs.Output.Verbosity = "Normal"
$pesterArgs.TestResult.Enabled = $true
$pesterArgs.TestResult.OutputPath = $pesterOutputPath
Invoke-Pester -Configuration $pesterArgs
}
} }
elseif ($PSScriptRoot) { Pop-Location } elseif ($PSScriptRoot) { Pop-Location }

View File

@@ -1,8 +1,8 @@
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return} try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
$xlSourcefile = "$env:TEMP\Source.xlsx" #Get rid of pre-exisiting sheet
$xlSourcefile = "$env:TEMP\ImportExcelExample.xlsx"
Write-Verbose -Verbose -Message "Save location: $xlSourcefile" Write-Verbose -Verbose -Message "Save location: $xlSourcefile"
Remove-Item $xlSourcefile -ErrorAction Ignore Remove-Item $xlSourcefile -ErrorAction Ignore
#Put some simple data in a worksheet and Get an excel package object to represent the file #Put some simple data in a worksheet and Get an excel package object to represent the file

View File

@@ -1,7 +1,8 @@
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return} try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
$xlSourcefile = "$env:TEMP\Source.xlsx" #Get rid of pre-exisiting sheet
$xlSourcefile = "$env:TEMP\ImportExcelExample.xlsx"
Write-Verbose -Verbose -Message "Save location: $xlSourcefile"
Remove-Item $xlSourcefile -ErrorAction Ignore Remove-Item $xlSourcefile -ErrorAction Ignore
#Put some simple data in a worksheet and Get an excel package object to represent the file #Put some simple data in a worksheet and Get an excel package object to represent the file

View File

@@ -1,7 +1,10 @@
# Creates a worksheet, addes a chart and then a Linear trendline # Creates a worksheet, addes a chart and then a Linear trendline
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
$xlfile = "$env:TEMP\trendLine.xlsx" #Get rid of pre-exisiting sheet
Remove-Item $xlfile -ErrorAction SilentlyContinue $xlSourcefile = "$env:TEMP\ImportExcelExample.xlsx"
Write-Verbose -Verbose -Message "Save location: $xlSourcefile"
Remove-Item $xlSourcefile -ErrorAction Ignore
$data = ConvertFrom-Csv @" $data = ConvertFrom-Csv @"
Region,Item,TotalSold Region,Item,TotalSold
@@ -18,4 +21,4 @@ South,avocado,73
"@ "@
$cd = New-ExcelChartDefinition -XRange Region -YRange TotalSold -ChartType ColumnClustered -ChartTrendLine Linear $cd = New-ExcelChartDefinition -XRange Region -YRange TotalSold -ChartType ColumnClustered -ChartTrendLine Linear
$data | Export-Excel $xlfile -ExcelChartDefinition $cd -AutoNameRange -Show $data | Export-Excel $xlSourcefile -ExcelChartDefinition $cd -AutoNameRange -Show

View File

@@ -1,6 +1,9 @@
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return} try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
Remove-Item temp.xlsx -ErrorAction Ignore #Get rid of pre-exisiting sheet
$xlSourcefile = "$env:TEMP\ImportExcelExample.xlsx"
Write-Verbose -Verbose -Message "Save location: $xlSourcefile"
Remove-Item $xlSourcefile -ErrorAction Ignore
$data = Invoke-Sum -data (Get-Process) -dimension Company -measure Handles, PM, VirtualMemorySize $data = Invoke-Sum -data (Get-Process) -dimension Company -measure Handles, PM, VirtualMemorySize
@@ -11,4 +14,4 @@ $c = New-ExcelChartDefinition -Title "ProcessStats" `
-SeriesHeader "PM","VM" -SeriesHeader "PM","VM"
$data | $data |
Export-Excel -Path temp.xlsx -AutoSize -TableName Processes -ExcelChartDefinition $c -Show Export-Excel -Path $xlSourcefile -AutoSize -TableName Processes -ExcelChartDefinition $c -Show

View File

@@ -1,6 +1,9 @@
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return} try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
Remove-Item temp.xlsx -ErrorAction Ignore #Get rid of pre-exisiting sheet
$xlSourcefile = "$env:TEMP\ImportExcelExample.xlsx"
Write-Verbose -Verbose -Message "Save location: $xlSourcefile"
Remove-Item $xlSourcefile -ErrorAction Ignore
$data = @" $data = @"
A,B,C,Date A,B,C,Date
@@ -15,5 +18,5 @@ $c = New-ExcelChartDefinition -Title Impressions `
-SeriesHeader 'B data','A data' ` -SeriesHeader 'B data','A data' `
-Row 0 -Column 0 -Row 0 -Column 0
$data | ConvertFrom-Csv | Export-Excel -path temp.xlsx -AutoSize -TableName Impressions $data | ConvertFrom-Csv | Export-Excel -path $xlSourcefile -AutoSize -TableName Impressions
Export-Excel -path temp.xlsx -worksheetName chartPage -ExcelChartDefinition $c -show Export-Excel -path $xlSourcefile -worksheetName chartPage -ExcelChartDefinition $c -show

View File

@@ -1,6 +1,9 @@
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return} try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
Remove-Item -Path Tools.xlsx #Get rid of pre-exisiting sheet
$xlSourcefile = "$env:TEMP\ImportExcelExample.xlsx"
Write-Verbose -Verbose -Message "Save location: $xlSourcefile"
Remove-Item $xlSourcefile -ErrorAction Ignore
$data = @" $data = @"
ID,Product,Quantity,Price,Total ID,Product,Quantity,Price,Total
@@ -16,4 +19,4 @@ $c2 = New-ExcelChartDefinition -YRange "Total "-XRange "Product" -Title "Total
$c3 = New-ExcelChartDefinition -YRange "Quantity"-XRange "Product" -Title "Sales volume" -NoLegend -Height 225 -Row 15 $c3 = New-ExcelChartDefinition -YRange "Quantity"-XRange "Product" -Title "Sales volume" -NoLegend -Height 225 -Row 15
$data | ConvertFrom-Csv | $data | ConvertFrom-Csv |
Export-Excel -Path "Tools.xlsx" -AutoFilter -AutoNameRange -AutoSize -ExcelChartDefinition $c1,$c2,$c3 -Show Export-Excel -Path $xlSourcefile -AutoFilter -AutoNameRange -AutoSize -ExcelChartDefinition $c1,$c2,$c3 -Show

Binary file not shown.

After

Width:  |  Height:  |  Size: 93 KiB

View File

@@ -1,5 +1,9 @@
$xlfile = "$env:TEMP\visitors.xlsx" try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
Remove-Item $xlfile -ErrorAction SilentlyContinue
#Get rid of pre-exisiting sheet
$xlSourcefile = "$env:TEMP\ImportExcelExample.xlsx"
Write-Verbose -Verbose -Message "Save location: $xlSourcefile"
Remove-Item $xlSourcefile -ErrorAction Ignore
$data = ConvertFrom-Csv @" $data = ConvertFrom-Csv @"
Week, TotalVisitors Week, TotalVisitors
@@ -23,5 +27,5 @@ $cd = New-ExcelChartDefinition `
-NoLegend ` -NoLegend `
-ChartTrendLine Linear -ChartTrendLine Linear
$data | Export-Excel $xlfile -Show -AutoNameRange -AutoSize -TableName Visitors -ExcelChartDefinition $cd $data | Export-Excel $xlSourcefile -Show -AutoNameRange -AutoSize -TableName Visitors -ExcelChartDefinition $cd

View File

@@ -10,8 +10,10 @@ function plot {
$minx=[math]::Round($minx,1) $minx=[math]::Round($minx,1)
$maxx=[math]::Round($maxx,1) $maxx=[math]::Round($maxx,1)
$file = 'C:\temp\plot.xlsx' #Get rid of pre-exisiting sheet
Remove-Item $file -ErrorAction Ignore $xlSourcefile = "$env:TEMP\ImportExcelExample.xlsx"
Write-Verbose -Verbose -Message "Save location: $xlSourcefile"
Remove-Item $xlSourcefile -ErrorAction Ignore
# $c = New-ExcelChart -XRange X -YRange Y -ChartType Line -NoLegend -Title Plot -Column 2 -ColumnOffSetPixels 35 # $c = New-ExcelChart -XRange X -YRange Y -ChartType Line -NoLegend -Title Plot -Column 2 -ColumnOffSetPixels 35
@@ -20,7 +22,7 @@ function plot {
X=$i.ToString("N1") X=$i.ToString("N1")
Y=(&$f $i) Y=(&$f $i)
} }
}) | Export-Excel $file -Show -AutoNameRange -LineChart -NoLegend #-ExcelChartDefinition $c }) | Export-Excel $xlSourcefile -Show -AutoNameRange -LineChart -NoLegend #-ExcelChartDefinition $c
} }
function pi {[math]::pi} function pi {[math]::pi}

View File

@@ -1,11 +1,13 @@
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return} try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
$file = "$env:temp\conditionalTextFormatting.xlsx" #Get rid of pre-exisiting sheet
Remove-Item $file -ErrorAction Ignore $xlSourcefile = "$env:TEMP\ImportExcelExample.xlsx"
Write-Verbose -Verbose -Message "Save location: $xlSourcefile"
Remove-Item $xlSourcefile -ErrorAction Ignore
Get-Service | Get-Service |
Select-Object Status, Name, DisplayName, ServiceName | Select-Object Status, Name, DisplayName, ServiceName |
Export-Excel $file -Show -AutoSize -AutoFilter -ConditionalText $( Export-Excel $xlSourcefile -Show -AutoSize -AutoFilter -ConditionalText $(
New-ConditionalText stop #Stop is the condition value, the rule is defaults to 'Contains text' and the default Colors are used New-ConditionalText stop #Stop is the condition value, the rule is defaults to 'Contains text' and the default Colors are used
New-ConditionalText runn darkblue cyan #runn is the condition value, the rule is defaults to 'Contains text'; the foregroundColur is darkblue and the background is cyan New-ConditionalText runn darkblue cyan #runn is the condition value, the rule is defaults to 'Contains text'; the foregroundColur is darkblue and the background is cyan
New-ConditionalText -ConditionalType EndsWith svc wheat green #the rule here is 'Ends with' and the value is 'svc' the forground is wheat and the background dark green New-ConditionalText -ConditionalType EndsWith svc wheat green #the rule here is 'Ends with' and the value is 'svc' the forground is wheat and the background dark green

View File

@@ -12,8 +12,10 @@ $data = $(
New-PSItem g h i New-PSItem g h i
) )
$file ="$env:temp\testblanks.xlsx" #Get rid of pre-exisiting sheet
$xlSourcefile = "$env:TEMP\ImportExcelExample.xlsx"
Write-Verbose -Verbose -Message "Save location: $xlSourcefile"
Remove-Item $xlSourcefile -ErrorAction Ignore
Remove-Item $file -ErrorAction Ignore
#use the conditional format definition created above #use the conditional format definition created above
$data | Export-Excel $file -show -ConditionalText $ContainsBlanks $data | Export-Excel $xlSourcefile -show -ConditionalText $ContainsBlanks

View File

@@ -1,12 +1,14 @@
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return} try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
$path = "$env:temp\test.xlsx" #Get rid of pre-exisiting sheet
Remove-Item -Path $path -ErrorAction Ignore $xlSourcefile = "$env:TEMP\ImportExcelExample.xlsx"
Write-Verbose -Verbose -Message "Save location: $xlSourcefile"
Remove-Item $xlSourcefile -ErrorAction Ignore
#Export processes, and get an ExcelPackage object representing the file. #Export processes, and get an ExcelPackage object representing the file.
$excel = Get-Process | $excel = Get-Process |
Select-Object -Property Name,Company,Handles,CPU,PM,NPM,WS | Select-Object -Property Name,Company,Handles,CPU,PM,NPM,WS |
Export-Excel -Path $path -ClearSheet -WorkSheetname "Processes" -PassThru Export-Excel -Path $xlSourcefile -ClearSheet -WorkSheetname "Processes" -PassThru
$sheet = $excel.Workbook.Worksheets["Processes"] $sheet = $excel.Workbook.Worksheets["Processes"]
@@ -15,10 +17,10 @@ $sheet.Column(1) | Set-ExcelRange -Bold -AutoFit
$sheet.Column(2) | Set-ExcelRange -Width 29 -WrapText $sheet.Column(2) | Set-ExcelRange -Width 29 -WrapText
$sheet.Column(3) | Set-ExcelRange -HorizontalAlignment Right -NFormat "#,###" $sheet.Column(3) | Set-ExcelRange -HorizontalAlignment Right -NFormat "#,###"
Set-ExcelRange -Range -Address $sheet.Cells["E1:H1048576"] -HorizontalAlignment Right -NFormat "#,###" Set-ExcelRange -Range $sheet.Cells["E1:H1048576"] -HorizontalAlignment Right -NFormat "#,###"
Set-ExcelRange -Range $sheet.Column(4) -HorizontalAlignment Right -NFormat "#,##0.0" -Bold Set-ExcelRange -Range $sheet.Column(4) -HorizontalAlignment Right -NFormat "#,##0.0" -Bold
#In Set-ExcelRange "-Address" is an alias for "-Range" #In Set-ExcelRange "-Address" is an alias for "-Range"
Set-ExcelRange -Address $sheet.Row(1) -Bold -HorizontalAlignment Center Set-ExcelRange -Address $sheet.Row(1) -Bold -HorizontalAlignment Center
#Create a Red Data-bar for the values in Column D #Create a Red Data-bar for the values in Column D

View File

@@ -1,8 +1,9 @@
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return} try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
$f = "$env:TEMP\testExport.xlsx" #Get rid of pre-exisiting sheet
$xlSourcefile = "$env:TEMP\ImportExcelExample.xlsx"
Remove-Item $f -ErrorAction Ignore Write-Verbose -Verbose -Message "Save location: $xlSourcefile"
Remove-Item $xlSourcefile -ErrorAction Ignore
$data = $( $data = $(
@@ -25,6 +26,6 @@ $data = $(
# the syntax is used is Export-excel -ConditionalText (New-Conditional text <parameters>) <other parameters> # the syntax is used is Export-excel -ConditionalText (New-Conditional text <parameters>) <other parameters>
#$data | Export-Excel $f -Show -AutoSize -ConditionalText (New-ConditionalText -ConditionalType AboveAverage) #$data | Export-Excel $xlSourcefile -Show -AutoSize -ConditionalText (New-ConditionalText -ConditionalType AboveAverage)
$data | Export-Excel $f -Show -AutoSize -ConditionalText (New-ConditionalText -ConditionalType BelowAverage) $data | Export-Excel $xlSourcefile -Show -AutoSize -ConditionalText (New-ConditionalText -ConditionalType BelowAverage)
#$data | Export-Excel $f -Show -AutoSize -ConditionalText (New-ConditionalText -ConditionalType TopPercent) #$data | Export-Excel $xlSourcefile -Show -AutoSize -ConditionalText (New-ConditionalText -ConditionalType TopPercent)

View File

@@ -1,3 +1,5 @@
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
function Get-DateOffset { function Get-DateOffset {
param($days=0) param($days=0)

View File

@@ -1,12 +1,15 @@
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return} try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
Remove-Item "$env:TEMP\testExport.xlsx" -ErrorAction Ignore #Get rid of pre-exisiting sheet
$xlSourcefile = "$env:TEMP\ImportExcelExample.xlsx"
Write-Verbose -Verbose -Message "Save location: $xlSourcefile"
Remove-Item $xlSourcefile -ErrorAction Ignore
Get-Process | Where-Object Company | Select-Object Company, Name, PM, Handles, *mem* | Get-Process | Where-Object Company | Select-Object Company, Name, PM, Handles, *mem* |
#This example creates a 3 Icon set for the values in the "PM column, and Highlights company names (anywhere in the data) with different colors #This example creates a 3 Icon set for the values in the "PM column, and Highlights company names (anywhere in the data) with different colors
Export-Excel "$env:TEMP\testExport.xlsx" -Show -AutoSize -AutoNameRange ` Export-Excel -Path $xlSourcefile -Show -AutoSize -AutoNameRange `
-ConditionalFormat $( -ConditionalFormat $(
New-ConditionalFormattingIconSet -Range "C:C" ` New-ConditionalFormattingIconSet -Range "C:C" `
-ConditionalFormat ThreeIconSet -IconType Arrows -ConditionalFormat ThreeIconSet -IconType Arrows

View File

@@ -1,10 +1,11 @@
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return} try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
$f = ".\testExport.xlsx" #Get rid of pre-exisiting sheet
$xlSourcefile = "$env:TEMP\ImportExcelExample.xlsx"
Remove-Item $f -ErrorAction Ignore Write-Verbose -Verbose -Message "Save location: $xlSourcefile"
Remove-Item $xlSourcefile -ErrorAction Ignore
.\GenDates.ps1 | .\GenDates.ps1 |
Export-Excel $f -Show -AutoSize -ConditionalText $( Export-Excel $xlSourcefile -Show -AutoSize -ConditionalText $(
New-ConditionalText -ConditionalType Last7Days New-ConditionalText -ConditionalType Last7Days
) )

View File

@@ -1,10 +1,11 @@
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return} try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
$f = ".\testExport.xlsx" #Get rid of pre-exisiting sheet
$xlSourcefile = "$env:TEMP\ImportExcelExample.xlsx"
Remove-Item $f -ErrorAction Ignore Write-Verbose -Verbose -Message "Save location: $xlSourcefile"
Remove-Item $xlSourcefile -ErrorAction Ignore
.\GenDates.ps1 | .\GenDates.ps1 |
Export-Excel $f -Show -AutoSize -ConditionalText $( Export-Excel $xlSourcefile -Show -AutoSize -ConditionalText $(
New-ConditionalText -ConditionalType LastMonth New-ConditionalText -ConditionalType LastMonth
) )

View File

@@ -1,10 +1,11 @@
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return} try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
$f = ".\testExport.xlsx" #Get rid of pre-exisiting sheet
$xlSourcefile = "$env:TEMP\ImportExcelExample.xlsx"
Remove-Item $f -ErrorAction Ignore Write-Verbose -Verbose -Message "Save location: $xlSourcefile"
Remove-Item $xlSourcefile -ErrorAction Ignore
.\GenDates.ps1 | .\GenDates.ps1 |
Export-Excel $f -Show -AutoSize -ConditionalText $( Export-Excel $xlSourcefile -Show -AutoSize -ConditionalText $(
New-ConditionalText -ConditionalType LastWeek New-ConditionalText -ConditionalType LastWeek
) )

View File

@@ -1,10 +1,11 @@
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return} try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
$f = ".\testExport.xlsx" #Get rid of pre-exisiting sheet
$xlSourcefile = "$env:TEMP\ImportExcelExample.xlsx"
Remove-Item $f -ErrorAction Ignore Write-Verbose -Verbose -Message "Save location: $xlSourcefile"
Remove-Item $xlSourcefile -ErrorAction Ignore
.\GenDates.ps1 | .\GenDates.ps1 |
Export-Excel $f -Show -AutoSize -ConditionalText $( Export-Excel $xlSourcefile -Show -AutoSize -ConditionalText $(
New-ConditionalText -ConditionalType NextMonth New-ConditionalText -ConditionalType NextMonth
) )

View File

@@ -1,10 +1,11 @@
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return} try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
$f = ".\testExport.xlsx" #Get rid of pre-exisiting sheet
$xlSourcefile = "$env:TEMP\ImportExcelExample.xlsx"
Remove-Item $f -ErrorAction Ignore Write-Verbose -Verbose -Message "Save location: $xlSourcefile"
Remove-Item $xlSourcefile -ErrorAction Ignore
.\GenDates.ps1 | .\GenDates.ps1 |
Export-Excel $f -Show -AutoSize -ConditionalText $( Export-Excel $xlSourcefile -Show -AutoSize -ConditionalText $(
New-ConditionalText -ConditionalType NextWeek New-ConditionalText -ConditionalType NextWeek
) )

View File

@@ -1,10 +1,11 @@
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return} try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
$f = ".\testExport.xlsx" #Get rid of pre-exisiting sheet
$xlSourcefile = "$env:TEMP\ImportExcelExample.xlsx"
Remove-Item $f -ErrorAction Ignore Write-Verbose -Verbose -Message "Save location: $xlSourcefile"
Remove-Item $xlSourcefile -ErrorAction Ignore
.\GenDates.ps1 | .\GenDates.ps1 |
Export-Excel $f -Show -AutoSize -ConditionalText $( Export-Excel $xlSourcefile -Show -AutoSize -ConditionalText $(
New-ConditionalText -ConditionalType ThisMonth New-ConditionalText -ConditionalType ThisMonth
) )

View File

@@ -1,10 +1,11 @@
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return} try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
$f = ".\testExport.xlsx" #Get rid of pre-exisiting sheet
$xlSourcefile = "$env:TEMP\ImportExcelExample.xlsx"
Remove-Item $f -ErrorAction Ignore Write-Verbose -Verbose -Message "Save location: $xlSourcefile"
Remove-Item $xlSourcefile -ErrorAction Ignore
.\GenDates.ps1 | .\GenDates.ps1 |
Export-Excel $f -Show -AutoSize -ConditionalText $( Export-Excel $xlSourcefile -Show -AutoSize -ConditionalText $(
New-ConditionalText -ConditionalType ThisWeek New-ConditionalText -ConditionalType ThisWeek
) )

View File

@@ -1,10 +1,11 @@
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return} try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
$f = ".\testExport.xlsx" #Get rid of pre-exisiting sheet
$xlSourcefile = "$env:TEMP\ImportExcelExample.xlsx"
Remove-Item $f -ErrorAction Ignore Write-Verbose -Verbose -Message "Save location: $xlSourcefile"
Remove-Item $xlSourcefile -ErrorAction Ignore
.\GenDates.ps1 | .\GenDates.ps1 |
Export-Excel $f -Show -AutoSize -ConditionalText $( Export-Excel $xlSourcefile -Show -AutoSize -ConditionalText $(
New-ConditionalText -ConditionalType Today New-ConditionalText -ConditionalType Today
) )

View File

@@ -1,10 +1,11 @@
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return} try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
$f = ".\testExport.xlsx" #Get rid of pre-exisiting sheet
$xlSourcefile = "$env:TEMP\ImportExcelExample.xlsx"
Remove-Item $f -ErrorAction Ignore Write-Verbose -Verbose -Message "Save location: $xlSourcefile"
Remove-Item $xlSourcefile -ErrorAction Ignore
.\GenDates.ps1 | .\GenDates.ps1 |
Export-Excel $f -Show -AutoSize -ConditionalText $( Export-Excel $xlSourcefile -Show -AutoSize -ConditionalText $(
New-ConditionalText -ConditionalType Tomorrow New-ConditionalText -ConditionalType Tomorrow
) )

View File

@@ -1,10 +1,11 @@
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return} try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
$f = ".\testExport.xlsx" #Get rid of pre-exisiting sheet
$xlSourcefile = "$env:TEMP\ImportExcelExample.xlsx"
Remove-Item $f -ErrorAction Ignore Write-Verbose -Verbose -Message "Save location: $xlSourcefile"
Remove-Item $xlSourcefile -ErrorAction Ignore
.\GenDates.ps1 | .\GenDates.ps1 |
Export-Excel $f -Show -AutoSize -ConditionalText $( Export-Excel $xlSourcefile -Show -AutoSize -ConditionalText $(
New-ConditionalText -ConditionalType Yesterday New-ConditionalText -ConditionalType Yesterday
) )

View File

@@ -1,8 +1,9 @@
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return} try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
$f = ".\testExport.xlsx" #Get rid of pre-exisiting sheet
$xlSourcefile = "$env:TEMP\ImportExcelExample.xlsx"
Remove-Item $f -ErrorAction Ignore Write-Verbose -Verbose -Message "Save location: $xlSourcefile"
Remove-Item $xlSourcefile -ErrorAction Ignore
$data = $( $data = $(
@@ -22,4 +23,4 @@ $data = $(
New-PSItem SouthWest 11 New-PSItem SouthWest 11
) )
$data | Export-Excel $f -Show -AutoSize -ConditionalText (New-ConditionalText -ConditionalType DuplicateValues) $data | Export-Excel $xlSourcefile -Show -AutoSize -ConditionalText (New-ConditionalText -ConditionalType DuplicateValues)

View File

@@ -1,6 +1,9 @@
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return} try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
Remove-Item -Path .\test.xlsx -ErrorAction Ignore #Get rid of pre-exisiting sheet
$xlSourcefile = "$env:TEMP\ImportExcelExample.xlsx"
Write-Verbose -Verbose -Message "Save location: $xlSourcefile"
Remove-Item $xlSourcefile -ErrorAction Ignore
$excel = @" $excel = @"
Month,New York City,Austin Texas,Portland Oregon Month,New York City,Austin Texas,Portland Oregon
@@ -17,7 +20,7 @@ Oct,65,82,63
Nov,54,71,52 Nov,54,71,52
Dec,44,63,46 Dec,44,63,46
"@ | ConvertFrom-csv | "@ | ConvertFrom-csv |
Export-Excel -Path .\test.xlsx -WorkSheetname Sheet1 -AutoNameRange -AutoSize -Title "Monthly Temperatures" -PassThru Export-Excel -Path $xlSourcefile -WorkSheetname Sheet1 -AutoNameRange -AutoSize -Title "Monthly Temperatures" -PassThru
$sheet = $excel.Workbook.Worksheets["Sheet1"] $sheet = $excel.Workbook.Worksheets["Sheet1"]
Add-ConditionalFormatting -Worksheet $sheet -Range "B1:D14" -DataBarColor CornflowerBlue Add-ConditionalFormatting -Worksheet $sheet -Range "B1:D14" -DataBarColor CornflowerBlue

View File

@@ -1,7 +1,9 @@
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return} try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
$f = ".\testExport.xlsx" #Get rid of pre-exisiting sheet
Remove-Item $f -ErrorAction Ignore $xlSourcefile = "$env:TEMP\ImportExcelExample.xlsx"
Write-Verbose -Verbose -Message "Save location: $xlSourcefile"
Remove-Item $xlSourcefile -ErrorAction Ignore
function Get-DateOffset ($days=0) { function Get-DateOffset ($days=0) {
(Get-Date).AddDays($days).ToShortDateString() (Get-Date).AddDays($days).ToShortDateString()
@@ -13,7 +15,7 @@ $(
New-PSItem (Get-DateOffset -10) (Get-DateOffset -1) New-PSItem (Get-DateOffset -10) (Get-DateOffset -1)
) | ) |
Export-Excel $f -Show -AutoSize -AutoNameRange -ConditionalText $( Export-Excel $xlSourcefile -Show -AutoSize -AutoNameRange -ConditionalText $(
New-ConditionalText -Range Start -ConditionalType Yesterday -ConditionalTextColor Red New-ConditionalText -Range Start -ConditionalType Yesterday -ConditionalTextColor Red
New-ConditionalText -Range End -ConditionalType Yesterday -BackgroundColor Blue -ConditionalTextColor Red New-ConditionalText -Range End -ConditionalType Yesterday -BackgroundColor Blue -ConditionalTextColor Red
) )

View File

@@ -1,6 +1,9 @@
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return} try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
Remove-Item -Path .\test.xlsx -ErrorAction Ignore #Get rid of pre-exisiting sheet
$xlSourcefile = "$env:TEMP\ImportExcelExample.xlsx"
Write-Verbose -Verbose -Message "Save location: $xlSourcefile"
Remove-Item $xlSourcefile -ErrorAction Ignore
$excel = @" $excel = @"
Month,Sales Month,Sales
@@ -11,7 +14,7 @@ Apr,952
May,770 May,770
Jun,621 Jun,621
"@ | ConvertFrom-csv | "@ | ConvertFrom-csv |
Export-Excel -Path .\test.xlsx -WorkSheetname Sheet1 -AutoNameRange -PassThru Export-Excel -Path $xlSourcefile -WorkSheetname Sheet1 -AutoNameRange -PassThru
$sheet = $excel.Workbook.Worksheets["Sheet1"] $sheet = $excel.Workbook.Worksheets["Sheet1"]
Add-ConditionalFormatting -Worksheet $sheet -Range "B1:B7" -DataBarColor LawnGreen Add-ConditionalFormatting -Worksheet $sheet -Range "B1:B7" -DataBarColor LawnGreen

View File

@@ -1,25 +1,29 @@
try {Import-Module ..\..\ImportExcel.psd1 -Force} catch {throw ; return} try {Import-Module ..\..\ImportExcel.psd1 -Force} catch {throw ; return}
$data = $( $data = $(
New-PSItem 100 @('test', 'testx') New-PSItem 100 @('test', 'testx')
New-PSItem 200 New-PSItem 200
New-PSItem 300 New-PSItem 300
New-PSItem 400 New-PSItem 400
New-PSItem 500 New-PSItem 500
) )
$file1 = "$env:Temp\tryComparison1.xlsx" #Get rid of pre-exisiting sheet
$file2 = "$env:Temp\tryComparison2.xlsx" $xlSourcefile1 = "$env:TEMP\ImportExcelExample1.xlsx"
$xlSourcefile2 = "$env:TEMP\ImportExcelExample2.xlsx"
Remove-Item -Path $file1 -ErrorAction Ignore Write-Verbose -Verbose -Message "Save location: $xlSourcefile1"
Remove-Item -Path $file2 -ErrorAction Ignore Write-Verbose -Verbose -Message "Save location: $xlSourcefile2"
$data | Export-Excel $file1 -Show -ConditionalText $( Remove-Item $xlSourcefile1 -ErrorAction Ignore
New-ConditionalText -ConditionalType GreaterThan 300 Remove-Item $xlSourcefile2 -ErrorAction Ignore
New-ConditionalText -ConditionalType LessThan 300 -BackgroundColor cyan
)
$data | Export-Excel $file2 -Show -ConditionalText $( $data | Export-Excel $xlSourcefile1 -Show -ConditionalText $(
New-ConditionalText -ConditionalType GreaterThanOrEqual 275 New-ConditionalText -ConditionalType GreaterThan 300
New-ConditionalText -ConditionalType LessThanOrEqual 250 -BackgroundColor cyan New-ConditionalText -ConditionalType LessThan 300 -BackgroundColor cyan
) )
$data | Export-Excel $xlSourcefile2 -Show -ConditionalText $(
New-ConditionalText -ConditionalType GreaterThanOrEqual 275
New-ConditionalText -ConditionalType LessThanOrEqual 250 -BackgroundColor cyan
)

View File

@@ -0,0 +1,37 @@
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
#Get rid of pre-exisiting sheet
$xlSourcefile = "$env:TEMP\ImportExcelExample.xlsx"
Write-Verbose -Verbose -Message "Save location: $xlSourcefile"
Remove-Item $xlSourcefile -ErrorAction Ignore
$data = ConvertFrom-csv @"
Store,January,February,March,April,May,June
store27,99511,64582,45216,48690,64921,54066
store82,22275,23708,28223,26699,41388,31648
store41,24683,22583,97947,31999,39092,41201
store16,16568,48040,68589,20394,63202,26197
store21,99353,23470,28398,21788,94101,88608
store86,66662,83321,27489,92627,54084,24278
store07,92692,53300,29284,39643,33556,53885
store58,68875,83705,66635,81025,30207,75570
store01,21292,82341,81339,12505,29516,41634
store82,74047,93325,25002,40113,76278,45707
"@
Export-Excel -InputObject $data -Path $xlSourcefile -TableName RawData -WorksheetName RawData
Export-Excel -InputObject $data -Path $xlSourcefile -TableName TopData -WorksheetName StoresTop10Sales
Export-Excel -InputObject $data -Path $xlSourcefile -TableName Databar -WorksheetName StoresSalesDataBar
Export-Excel -InputObject $data -Path $xlSourcefile -TableName TwoColorScale -WorksheetName StoresSalesTwoColorScale
$xl = Open-ExcelPackage -Path $xlSourcefile
Set-ExcelRange -Worksheet $xl.StoresTop10Sales -Range $xl.StoresTop10Sales.dimension.address -NumberFormat 'Currency' -AutoSize
Set-ExcelRange -Worksheet $xl.StoresSalesDataBar -Range $xl.StoresSalesDataBar.dimension.address -NumberFormat 'Currency' -AutoSize
Set-ExcelRange -Worksheet $xl.StoresSalesTwoColorScale -Range $xl.StoresSalesDataBar.dimension.address -NumberFormat 'Currency' -AutoSize
Add-ConditionalFormatting -Worksheet $xl.StoresTop10Sales -Address $xl.StoresTop10Sales.dimension.address -RuleType Top -ForegroundColor white -BackgroundColor green -ConditionValue 10
Add-ConditionalFormatting -Worksheet $xl.StoresSalesDataBar -Address $xl.StoresSalesDataBar.dimension.address -DataBarColor Red
Add-ConditionalFormatting -Worksheet $xl.StoresSalesTwoColorScale -Address $xl.StoresSalesDataBar.dimension.address -RuleType TwoColorScale
Close-ExcelPackage $xl -Show

View File

@@ -1,7 +1,9 @@
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return} try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
$f = "$env:temp\dashboard.xlsx" #Get rid of pre-exisiting sheet
Remove-Item $f -ErrorAction Ignore $xlSourcefile = "$env:TEMP\ImportExcelExample.xlsx"
Write-Verbose -Verbose -Message "Save location: $xlSourcefile"
Remove-Item $xlSourcefile -ErrorAction Ignore
$data = @" $data = @"
From,To,RDollars,RPercent,MDollars,MPercent,Revenue,Margin From,To,RDollars,RPercent,MDollars,MPercent,Revenue,Margin
@@ -13,9 +15,9 @@ New York,San Francisco,3221000,.0629,1088000,.04,436,21
New York,Phoneix,2782000,.0723,467000,.10,674,33 New York,Phoneix,2782000,.0723,467000,.10,674,33
"@ | ConvertFrom-Csv "@ | ConvertFrom-Csv
$data | Export-Excel $f -AutoSize $data | Export-Excel $xlSourcefile -AutoSize
$excel = Open-ExcelPackage $f $excel = Open-ExcelPackage $xlSourcefile
$sheet1 = $excel.Workbook.Worksheets["sheet1"] $sheet1 = $excel.Workbook.Worksheets["sheet1"]

View File

@@ -1,8 +1,11 @@
# DSUM # DSUM
# Adds the numbers in a field (column) of records in a list or database that match conditions that you specify. # Adds the numbers in a field (column) of records in a list or database that match conditions that you specify.
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
$xlfile = "$env:TEMP\test.xlsx" #Get rid of pre-exisiting sheet
Remove-Item $xlfile -ErrorAction SilentlyContinue $xlSourcefile = "$env:TEMP\ImportExcelExample.xlsx"
Write-Verbose -Verbose -Message "Save location: $xlSourcefile"
Remove-Item $xlSourcefile -ErrorAction Ignore
$data = ConvertFrom-Csv @" $data = ConvertFrom-Csv @"
Color,Date,Sales Color,Date,Sales
@@ -14,7 +17,7 @@ Red,1/17/2018,150
Blue,1/17/2018,300 Blue,1/17/2018,300
"@ "@
$xl = Export-Excel -InputObject $data -Path $xlfile -AutoSize -AutoFilter -TableName SalesInfo -AutoNameRange -PassThru $xl = Export-Excel -InputObject $data -Path $xlSourcefile -AutoSize -AutoFilter -TableName SalesInfo -AutoNameRange -PassThru
$databaseAddress = $xl.Sheet1.Dimension.Address $databaseAddress = $xl.Sheet1.Dimension.Address
Set-Format -Worksheet $xl.Sheet1 -Range C:C -NumberFormat '$##0' Set-Format -Worksheet $xl.Sheet1 -Range C:C -NumberFormat '$##0'

View File

@@ -1,5 +1,9 @@
$xlfile = "$env:TEMP\test.xlsx" try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
Remove-Item $xlfile -ErrorAction SilentlyContinue
#Get rid of pre-exisiting sheet
$xlSourcefile = "$env:TEMP\ImportExcelExample.xlsx"
Write-Verbose -Verbose -Message "Save location: $xlSourcefile"
Remove-Item $xlSourcefile -ErrorAction Ignore
$data = ConvertFrom-Csv @" $data = ConvertFrom-Csv @"
Fruit,Amount Fruit,Amount
@@ -9,11 +13,11 @@ Bananas,60
Lemons,40 Lemons,40
"@ "@
$xl = Export-Excel -InputObject $data -Path $xlfile -PassThru -AutoSize $xl = Export-Excel -InputObject $data -Path $xlSourcefile -PassThru -AutoSize
Set-ExcelRange -Worksheet $xl.Sheet1 -Range D2 -BackgroundColor LightBlue -Value Apples Set-ExcelRange -Worksheet $xl.Sheet1 -Range D2 -BackgroundColor LightBlue -Value Apples
$Rows = $xl.Sheet1.Dimension.Rows $rows = $xl.Sheet1.Dimension.Rows
Set-ExcelRange -Worksheet $xl.Sheet1 -Range E2 -Formula "=VLookup(D2,A2:B$($Rows),2,FALSE)" Set-ExcelRange -Worksheet $xl.Sheet1 -Range E2 -Formula "=VLookup(D2,A2:B$($rows),2,FALSE)"
Close-ExcelPackage $xl -Show Close-ExcelPackage $xl -Show

View File

@@ -15,8 +15,10 @@
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return} try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
$path = "$Env:TEMP\DataValidation.xlsx" #Get rid of pre-exisiting sheet
Remove-Item $path -ErrorAction SilentlyContinue $xlSourcefile = "$env:TEMP\ImportExcelExample.xlsx"
Write-Verbose -Verbose -Message "Save location: $xlSourcefile"
Remove-Item $xlSourcefile -ErrorAction Ignore
$data = ConvertFrom-Csv -InputObject @" $data = ConvertFrom-Csv -InputObject @"
ID,Region,Product,Quantity,Price ID,Region,Product,Quantity,Price
@@ -29,7 +31,7 @@ ID,Region,Product,Quantity,Price
# Export the raw data # Export the raw data
$excelPackage = $Data | $excelPackage = $Data |
Export-Excel -WorksheetName "Sales" -Path $path -PassThru Export-Excel -WorksheetName "Sales" -Path $xlSourcefile -PassThru
# Creates a sheet with data that will be used in a validation rule # Creates a sheet with data that will be used in a validation rule
$excelPackage = @('Chisel', 'Crowbar', 'Drill', 'Hammer', 'Nails', 'Saw', 'Screwdriver', 'Wrench') | $excelPackage = @('Chisel', 'Crowbar', 'Drill', 'Hammer', 'Nails', 'Saw', 'Screwdriver', 'Wrench') |

View File

@@ -0,0 +1,46 @@
function Export-MultipleExcelSheets {
<#
.Synopsis
Takes a hash table of scriptblocks and exports each as a sheet in an Excel file
.Example
$p = Get-Process
$InfoMap = @{
PM = { $p | Select-Object company, pm }
Handles = { $p | Select-Object company, handles }
Services = { Get-Service }
}
Export-MultipleExcelSheets -Path $xlfile -InfoMap $InfoMap -Show -AutoSize
#>
param(
[Parameter(Mandatory = $true)]
$Path,
[Parameter(Mandatory = $true)]
[hashtable]$InfoMap,
[string]$Password,
[Switch]$Show,
[Switch]$AutoSize
)
$parameters = @{ } + $PSBoundParameters
$parameters.Remove("InfoMap")
$parameters.Remove("Show")
$parameters.Path = $ExecutionContext.SessionState.Path.GetUnresolvedProviderPathFromPSPath($Path)
foreach ($entry in $InfoMap.GetEnumerator()) {
if ($entry.Value -is [scriptblock]) {
Write-Progress -Activity "Exporting" -Status "$($entry.Key)"
$parameters.WorkSheetname = $entry.Key
& $entry.Value | Export-Excel @parameters
}
else {
Write-Warning "$($entry.Key) not exported, needs to be a scriptblock"
}
}
if ($Show) { Invoke-Item $Path }
}

View File

@@ -0,0 +1,19 @@
. "$PSScriptRoot\Export-MultipleExcelSheets.ps1"
#Get rid of pre-exisiting sheet
$xlSourcefile = "$env:TEMP\ImportExcelExample.xlsx"
Write-Verbose -Verbose -Message "Save location: $xlSourcefile"
Remove-Item $xlSourcefile -ErrorAction Ignore
$p = Get-Process
$InfoMap = @{
PM = { $p | Select-Object company, pm }
Handles = { $p | Select-Object company, handles }
Services = { Get-Service }
Files = { Get-ChildItem -File }
Albums = { ConvertFrom-Csv (Invoke-RestMethod https://raw.githubusercontent.com/dfinke/powershell-for-developers/master/chapter05/BeaverMusic/BeaverMusic.UI.Shell/albums.csv) }
WillNotGetExported = "Hello World"
}
Export-MultipleExcelSheets -Path $xlSourcefile -InfoMap $InfoMap -Show -AutoSize

View File

@@ -2,8 +2,10 @@ param ($fibonacciDigits=10)
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return} try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
$file = "fib.xlsx" #Get rid of pre-exisiting sheet
Remove-Item "fib.xlsx" -ErrorAction Ignore $xlSourcefile = "$env:TEMP\ImportExcelExample.xlsx"
Write-Verbose -Verbose -Message "Save location: $xlSourcefile"
Remove-Item $xlSourcefile -ErrorAction Ignore
$( $(
New-PSItem 0 New-PSItem 0
@@ -15,4 +17,4 @@ $(
New-PSItem ('=a{0}+a{1}' -f ($_+1),$_) New-PSItem ('=a{0}+a{1}' -f ($_+1),$_)
} }
) )
) | Export-Excel $file -Show ) | Export-Excel $xlSourcefile -Show

View File

@@ -1,10 +1,13 @@
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return} try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
$xlfile = "$env:temp\testFmt.xlsx" #Get rid of pre-exisiting sheet
$xlSourcefile = "$env:TEMP\ImportExcelExample.xlsx"
Write-Verbose -Verbose -Message "Save location: $xlSourcefile"
Remove-Item $xlSourcefile -ErrorAction Ignore
Get-Process | Get-Process |
Select-Object Company,Handles,PM, NPM| Select-Object Company,Handles,PM, NPM|
Export-Excel $xlfile -Show -AutoSize -CellStyleSB { Export-Excel $xlSourcefile -Show -AutoSize -CellStyleSB {
param( param(
$workSheet, $workSheet,
$totalRows, $totalRows,

View File

@@ -1,4 +1,6 @@
$data = ConvertFrom-Csv @' try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
$data = ConvertFrom-Csv @'
Item,Quantity,Price,Total Cost Item,Quantity,Price,Total Cost
Footballs,9,21.95,197.55 Footballs,9,21.95,197.55
Cones,36,7.99,287.64 Cones,36,7.99,287.64

View File

@@ -1,7 +1,9 @@
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return} try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
$xlfile = "$env:temp\testFmt.xlsx" #Get rid of pre-exisiting sheet
Remove-Item $xlfile -ErrorAction Ignore $xlSourcefile = "$env:TEMP\ImportExcelExample.xlsx"
Write-Verbose -Verbose -Message "Save location: $xlSourcefile"
Remove-Item $xlSourcefile -ErrorAction Ignore
$RandomStyle = { $RandomStyle = {
param( param(
@@ -17,4 +19,4 @@ $RandomStyle = {
Get-Process | Get-Process |
Select-Object Company,Handles,PM, NPM| Select-Object Company,Handles,PM, NPM|
Export-Excel $xlfile -Show -AutoSize -CellStyleSB $RandomStyle Export-Excel $xlSourcefile -Show -AutoSize -CellStyleSB $RandomStyle

View File

@@ -1,10 +1,13 @@
$xlfile = "$env:TEMP\Points.xlsx" try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
Remove-Item $xlfile -ErrorAction SilentlyContinue #Get rid of pre-exisiting sheet
$xlSourcefile = "$env:TEMP\ImportExcelExample.xlsx"
Write-Verbose -Verbose -Message "Save location: $xlSourcefile"
Remove-Item $xlSourcefile -ErrorAction Ignore
$PivotTableDefinition = New-PivotTableDefinition -Activate -PivotTableName Points ` $PivotTableDefinition = New-PivotTableDefinition -Activate -PivotTableName Points `
-PivotRows Driver, Date -PivotData @{Points = "SUM"} -GroupDateRow Date -GroupDatePart Years, Months -PivotRows Driver, Date -PivotData @{Points = "SUM"} -GroupDateRow Date -GroupDatePart Years, Months
Import-Csv "$PSScriptRoot\First10Races.csv" | Import-Csv "$PSScriptRoot\First10Races.csv" |
Select-Object Race, @{n = "Date"; e = {[datetime]::ParseExact($_.date, "dd/MM/yyyy", (Get-Culture))}}, FinishPosition, Driver, GridPosition, Team, Points | Select-Object Race, @{n = "Date"; e = {[datetime]::ParseExact($_.date, "dd/MM/yyyy", (Get-Culture))}}, FinishPosition, Driver, GridPosition, Team, Points |
Export-Excel $xlfile -Show -AutoSize -PivotTableDefinition $PivotTableDefinition Export-Excel $xlSourcefile -Show -AutoSize -PivotTableDefinition $PivotTableDefinition

View File

@@ -1,10 +1,13 @@
$xlfile = "$env:TEMP\Places.xlsx" try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
Remove-Item $xlfile -ErrorAction SilentlyContinue #Get rid of pre-exisiting sheet
$xlSourcefile = "$env:TEMP\ImportExcelExample.xlsx"
Write-Verbose -Verbose -Message "Save location: $xlSourcefile"
Remove-Item $xlSourcefile -ErrorAction Ignore
$PivotTableDefinition = New-PivotTableDefinition -Activate -PivotTableName Places ` $PivotTableDefinition = New-PivotTableDefinition -Activate -PivotTableName Places `
-PivotRows Driver, FinishPosition -PivotData @{Date = "Count"} -GroupNumericRow FinishPosition -GroupNumericMin 1 -GroupNumericMax 25 -GroupNumericInterval 3 -PivotRows Driver, FinishPosition -PivotData @{Date = "Count"} -GroupNumericRow FinishPosition -GroupNumericMin 1 -GroupNumericMax 25 -GroupNumericInterval 3
Import-Csv "$PSScriptRoot\First10Races.csv" | Import-Csv "$PSScriptRoot\First10Races.csv" |
Select-Object Race, @{n = "Date"; e = {[datetime]::ParseExact($_.date, "dd/MM/yyyy", (Get-Culture))}}, FinishPosition, Driver, GridPosition, Team, Points | Select-Object Race, @{n = "Date"; e = {[datetime]::ParseExact($_.date, "dd/MM/yyyy", (Get-Culture))}}, FinishPosition, Driver, GridPosition, Team, Points |
Export-Excel $xlfile -Show -AutoSize -PivotTableDefinition $PivotTableDefinition Export-Excel $xlSourcefile -Show -AutoSize -PivotTableDefinition $PivotTableDefinition

View File

@@ -1,3 +1,4 @@
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
$data = ConvertFrom-Csv @" $data = ConvertFrom-Csv @"
Timestamp,Tenant Timestamp,Tenant
10/29/2018 3:00:00.123,1 10/29/2018 3:00:00.123,1
@@ -15,8 +16,10 @@ Timestamp,Tenant
10/29/2018 3:02:00.999,1 10/29/2018 3:02:00.999,1
"@ | Select-Object @{n = 'Timestamp'; e = {Get-date $_.timestamp}}, tenant, @{n = 'Bucket'; e = { - (Get-date $_.timestamp).Second % 30}} "@ | Select-Object @{n = 'Timestamp'; e = {Get-date $_.timestamp}}, tenant, @{n = 'Bucket'; e = { - (Get-date $_.timestamp).Second % 30}}
$f = "$env:temp\pivottest.xlsx" #Get rid of pre-exisiting sheet
Remove-Item $f -ErrorAction SilentlyContinue $xlSourcefile = "$env:TEMP\ImportExcelExample.xlsx"
Write-Verbose -Verbose -Message "Save location: $xlSourcefile"
Remove-Item $xlSourcefile -ErrorAction Ignore
$pivotDefParams = @{ $pivotDefParams = @{
PivotTableName = 'Timestamp Buckets' PivotTableName = 'Timestamp Buckets'
@@ -29,7 +32,7 @@ $pivotDefParams = @{
$excelParams = @{ $excelParams = @{
PivotTableDefinition = New-PivotTableDefinition @pivotDefParams PivotTableDefinition = New-PivotTableDefinition @pivotDefParams
Path = $f Path = $xlSourcefile
WorkSheetname = "Log Data" WorkSheetname = "Log Data"
AutoSize = $true AutoSize = $true
AutoFilter = $true AutoFilter = $true

View File

@@ -3,6 +3,7 @@
#We will create links to each race in the first 10 rows of the spreadSheet #We will create links to each race in the first 10 rows of the spreadSheet
#The next row will be column labels #The next row will be column labels
#After that will come a block for each race. #After that will come a block for each race.
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
#Read the data, and decide how much space to leave for the hyperlinks #Read the data, and decide how much space to leave for the hyperlinks
$scriptPath = Split-Path -Path $MyInvocation.MyCommand.path -Parent $scriptPath = Split-Path -Path $MyInvocation.MyCommand.path -Parent

View File

@@ -1,6 +1,9 @@
#Get rid of pre-exisiting sheet try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
$path = "$Env:TEMP\test.xlsx"
remove-item -Path $path -ErrorAction SilentlyContinue #Get rid of pre-exisiting sheet
$xlSourcefile = "$env:TEMP\ImportExcelExample.xlsx"
Write-Verbose -Verbose -Message "Save location: $xlSourcefile"
Remove-Item $xlSourcefile -ErrorAction Ignore
#Create simple pages for 3 stores with product ID, Product Name, quanity price and total #Create simple pages for 3 stores with product ID, Product Name, quanity price and total
@@ -11,7 +14,7 @@ ID,Product,Quantity,Price,Total
12003,Saw,12,15.37,184.44 12003,Saw,12,15.37,184.44
12010,Drill,20,8,160 12010,Drill,20,8,160
12011,Crowbar,7,23.48,164.36 12011,Crowbar,7,23.48,164.36
"@ | ConvertFrom-Csv| Export-Excel -Path $path -WorkSheetname Oxford "@ | ConvertFrom-Csv| Export-Excel -Path $xlSourcefile -WorkSheetname Oxford
@" @"
ID,Product,Quantity,Price,Total ID,Product,Quantity,Price,Total
@@ -20,7 +23,7 @@ ID,Product,Quantity,Price,Total
12003,Saw,10,15.37,153.70 12003,Saw,10,15.37,153.70
12010,Drill,10,8,80 12010,Drill,10,8,80
12012,Pliers,2,14.99,29.98 12012,Pliers,2,14.99,29.98
"@ | ConvertFrom-Csv| Export-Excel -Path $path -WorkSheetname Abingdon "@ | ConvertFrom-Csv| Export-Excel -Path $xlSourcefile -WorkSheetname Abingdon
@" @"
@@ -29,7 +32,7 @@ ID,Product,Quantity,Price,Total
12002,Hammer,2,12.10,24.20 12002,Hammer,2,12.10,24.20
12010,Drill,11,8,88 12010,Drill,11,8,88
12012,Pliers,3,14.99,44.97 12012,Pliers,3,14.99,44.97
"@ | ConvertFrom-Csv| Export-Excel -Path $path -WorkSheetname Banbury "@ | ConvertFrom-Csv| Export-Excel -Path $xlSourcefile -WorkSheetname Banbury
#define a pivot table with a chart to show a sales by store, broken down by product #define a pivot table with a chart to show a sales by store, broken down by product
$ptdef = New-PivotTableDefinition -PivotTableName "Summary" -PivotRows "Store" -PivotColumns "Product" -PivotData @{"Total"="SUM"} -IncludePivotChart -ChartTitle "Sales Breakdown" -ChartType ColumnStacked -ChartColumn 10 $ptdef = New-PivotTableDefinition -PivotTableName "Summary" -PivotRows "Store" -PivotColumns "Product" -PivotData @{"Total"="SUM"} -IncludePivotChart -ChartTitle "Sales Breakdown" -ChartType ColumnStacked -ChartColumn 10
@@ -40,4 +43,4 @@ $ptdef = New-PivotTableDefinition -PivotTableName "Summary" -PivotRows "Store" -
#Put in a title and freeze to top of the sheet including title and colmun headings #Put in a title and freeze to top of the sheet including title and colmun headings
#Add the Pivot table. #Add the Pivot table.
#Show the result #Show the result
Join-Worksheet -Path $path -WorkSheetName "Total" -Clearsheet -FromLabel "Store" -TableName "Combined" -TableStyle Light1 -AutoSize -BoldTopRow -FreezePane 2,1 -Title "Store Sales Summary" -TitleBold -TitleSize 14 -PivotTableDefinition $ptdef -show Join-Worksheet -Path $xlSourcefile -WorkSheetName "Total" -Clearsheet -FromLabel "Store" -TableName "Combined" -TableStyle Light1 -AutoSize -BoldTopRow -FreezePane 2,1 -Title "Store Sales Summary" -TitleBold -TitleSize 14 -PivotTableDefinition $ptdef -show

View File

@@ -1,13 +1,17 @@
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
#Get rid of pre-exisiting sheet
$xlSourcefile = "$env:TEMP\ImportExcelExample.xlsx"
Write-Verbose -Verbose -Message "Save location: $xlSourcefile"
Remove-Item $xlSourcefile -ErrorAction Ignore
$path = "$env:TEMP\Test.xlsx"
Remove-item -Path $path -ErrorAction SilentlyContinue
#Export disk volume, and Network adapter to their own sheets. #Export disk volume, and Network adapter to their own sheets.
Get-CimInstance -ClassName Win32_LogicalDisk | Get-CimInstance -ClassName Win32_LogicalDisk |
Select-Object -Property DeviceId,VolumeName, Size,Freespace | Select-Object -Property DeviceId,VolumeName, Size,Freespace |
Export-Excel -Path $path -WorkSheetname Volumes -NumberFormat "0,000" Export-Excel -Path $xlSourcefile -WorkSheetname Volumes -NumberFormat "0,000"
Get-NetAdapter | Get-NetAdapter |
Select-Object -Property Name,InterfaceDescription,MacAddress,LinkSpeed | Select-Object -Property Name,InterfaceDescription,MacAddress,LinkSpeed |
Export-Excel -Path $path -WorkSheetname NetAdapters Export-Excel -Path $xlSourcefile -WorkSheetname NetAdapters
#Create a summary page with a title of Summary, label the blocks with the name of the sheet they came from and hide the source sheets #Create a summary page with a title of Summary, label the blocks with the name of the sheet they came from and hide the source sheets
Join-Worksheet -Path $path -HideSource -WorkSheetName Summary -NoHeader -LabelBlocks -AutoSize -Title "Summary" -TitleBold -TitleSize 22 -show Join-Worksheet -Path $xlSourcefile -HideSource -WorkSheetName Summary -NoHeader -LabelBlocks -AutoSize -Title "Summary" -TitleBold -TitleSize 22 -show

View File

@@ -1,15 +1,16 @@
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return} try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
$xlfile = "$env:temp\AllSales.xlsx" #Get rid of pre-exisiting sheet
$xlSourcefile = "$env:TEMP\ImportExcelExample.xlsx"
Remove-Item $xlfile -ErrorAction Ignore Write-Verbose -Verbose -Message "Save location: $xlSourcefile"
Remove-Item $xlSourcefile -ErrorAction Ignore
$params = @{ $params = @{
AutoSize = $true AutoSize = $true
AutoFilter = $true AutoFilter = $true
AutoNameRange = $true AutoNameRange = $true
ExcelChartDefinition = New-ExcelChartDefinition -XRange Item -YRange UnitSold -Title 'Units Sold' ExcelChartDefinition = New-ExcelChartDefinition -XRange Item -YRange UnitSold -Title 'Units Sold'
Path = $xlfile Path = $xlSourcefile
} }
#Import 4 sets of sales data from 4 CSV files, using the parameters above. #Import 4 sets of sales data from 4 CSV files, using the parameters above.
Import-Csv $PSScriptRoot\NorthSales.csv | Export-Excel -WorkSheetname North @params Import-Csv $PSScriptRoot\NorthSales.csv | Export-Excel -WorkSheetname North @params

View File

@@ -1,8 +1,9 @@
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return} try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
$xlFile = "$env:TEMP\mw.xlsx" #Get rid of pre-exisiting sheet
$xlSourcefile = "$env:TEMP\ImportExcelExample.xlsx"
Remove-Item $xlFile -ErrorAction Ignore Write-Verbose -Verbose -Message "Save location: $xlSourcefile"
Remove-Item $xlSourcefile -ErrorAction Ignore
$leftCsv = @" $leftCsv = @"
MyProp1,MyProp2,Length MyProp1,MyProp2,Length
@@ -16,4 +17,4 @@ a,b,10
c,d,21 c,d,21
"@ | ConvertFrom-Csv "@ | ConvertFrom-Csv
Merge-Worksheet -OutputFile $xlFile -ReferenceObject $leftCsv -DifferenceObject $rightCsv -Key Length -Show Merge-Worksheet -OutputFile $xlSourcefile -ReferenceObject $leftCsv -DifferenceObject $rightCsv -Key Length -Show

View File

@@ -1,3 +1,5 @@
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
Remove-Item -Path "$env:temp\server*.xlsx" , "$env:temp\Combined*.xlsx" -ErrorAction SilentlyContinue Remove-Item -Path "$env:temp\server*.xlsx" , "$env:temp\Combined*.xlsx" -ErrorAction SilentlyContinue
#Get a subset of services into $s and export them #Get a subset of services into $s and export them

View File

@@ -1,3 +1,5 @@
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
Remove-Item -Path "$env:temp\server*.xlsx" , "$env:temp\Combined*.xlsx" -ErrorAction SilentlyContinue Remove-Item -Path "$env:temp\server*.xlsx" , "$env:temp\Combined*.xlsx" -ErrorAction SilentlyContinue
#Get a subset of services into $s and export them #Get a subset of services into $s and export them

View File

@@ -7,7 +7,7 @@ param(
$InterestRate = .065, $InterestRate = .065,
$Term = 30 $Term = 30
) )
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
function New-CellData { function New-CellData {
[Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseShouldProcessForStateChangingFunctions', '', Justification='Does not change system state')] [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseShouldProcessForStateChangingFunctions', '', Justification='Does not change system state')]
param( param(

View File

@@ -0,0 +1,225 @@
#Requires -Modules @{ ModuleName='Pester'; ModuleVersion='5.1' }
<#
.SYNOPSIS
Run Pester tests and export the results to an Excel file.
.DESCRIPTION
Use the `PesterConfigurationFile` to configure Pester to your requirements.
(Set the Path to the folder containing the tests, ...). Pester will be
invoked with the configuration you defined.
Each Pester 'it' clause will be exported to a row in an Excel file
containing the details of the test (Path, Duration, Result, ...).
.EXAMPLE
$params = @{
PesterConfigurationFile = 'C:\TestResults\PesterConfiguration.json'
ExcelFilePath = 'C:\TestResults\Tests.xlsx'
WorkSheetName = 'Tests'
}
& 'Pester test report.ps1' @params
# Content 'C:\TestResults\PesterConfiguration.json':
{
"Run": {
"Path": "C:\Scripts"
}
Executing the script with this configuration file will generate 1 file:
- 'C:\TestResults\Tests.xlsx' created by this script with Export-Excel
.EXAMPLE
$params = @{
PesterConfigurationFile = 'C:\TestResults\PesterConfiguration.json'
ExcelFilePath = 'C:\TestResults\Tests.xlsx'
WorkSheetName = 'Tests'
}
& 'Pester test report.ps1' @params
# Content 'C:\TestResults\PesterConfiguration.json':
{
"Run": {
"Path": "C:\Scripts"
},
"TestResult": {
"Enabled": true,
"OutputFormat": "NUnitXml",
"OutputPath": "C:/TestResults/PesterTestResults.xml",
"OutputEncoding": "UTF8"
}
}
Executing the script with this configuration file will generate 2 files:
- 'C:\TestResults\PesterTestResults.xml' created by Pester
- 'C:\TestResults\Tests.xlsx' created by this script with Export-Excel
.LINK
https://pester-docs.netlify.app/docs/commands/Invoke-Pester#-configuration
#>
[CmdletBinding()]
Param (
[String]$PesterConfigurationFile = 'PesterConfiguration.json',
[String]$WorkSheetName = 'PesterTestResults',
[String]$ExcelFilePath = 'PesterTestResults.xlsx'
)
Begin {
Function Get-PesterTests {
[CmdLetBinding()]
Param (
$Container
)
if ($testCaseResults = $Container.Tests) {
foreach ($result in $testCaseResults) {
Write-Verbose "Result '$($result.result)' duration '$($result.time)' name '$($result.name)'"
$result
}
}
if ($containerResults = $Container.Blocks) {
foreach ($result in $containerResults) {
Get-PesterTests -Container $result
}
}
}
#region Import Pester configuration file
Try {
Write-Verbose 'Import Pester configuration file'
$getParams = @{
Path = $PesterConfigurationFile
Raw = $true
}
[PesterConfiguration]$pesterConfiguration = Get-Content @getParams |
ConvertFrom-Json
}
Catch {
throw "Failed importing the Pester configuration file '$PesterConfigurationFile': $_"
}
#endregion
}
Process {
#region Execute Pester tests
Try {
Write-Verbose 'Execute Pester tests'
$pesterConfiguration.Run.PassThru = $true
$invokePesterParams = @{
Configuration = $pesterConfiguration
ErrorAction = 'Stop'
}
$invokePesterResult = Invoke-Pester @invokePesterParams
}
Catch {
throw "Failed to execute the Pester tests: $_ "
}
#endregion
#region Get Pester test results for the it clauses
$pesterTestResults = foreach (
$container in $invokePesterResult.Containers
) {
Get-PesterTests -Container $container |
Select-Object -Property *,
@{name = 'Container'; expression = { $container } }
}
#endregion
}
End {
if ($pesterTestResults) {
#region Export Pester test results to an Excel file
$exportExcelParams = @{
Path = $ExcelFilePath
WorksheetName = $WorkSheetName
ClearSheet = $true
PassThru = $true
BoldTopRow = $true
FreezeTopRow = $true
AutoSize = $true
AutoFilter = $true
AutoNameRange = $true
}
Write-Verbose "Export Pester test results to Excel file '$($exportExcelParams.Path)'"
$excel = $pesterTestResults | Select-Object -Property @{
name = 'FilePath'; expression = { $_.container.Item.FullName }
},
@{name = 'FileName'; expression = { $_.container.Item.Name } },
@{name = 'Path'; expression = { $_.ExpandedPath } },
@{name = 'Name'; expression = { $_.ExpandedName } },
@{name = 'Date'; expression = { $_.ExecutedAt } },
@{name = 'Time'; expression = { $_.ExecutedAt } },
Result,
Passed,
Skipped,
@{name = 'Duration'; expression = { $_.Duration.TotalSeconds } },
@{name = 'TotalDuration'; expression = { $_.container.Duration } },
@{name = 'Tag'; expression = { $_.Tag -join ', ' } },
@{name = 'Error'; expression = { $_.ErrorRecord -join ', ' } } |
Export-Excel @exportExcelParams
#endregion
#region Format the Excel worksheet
$ws = $excel.Workbook.Worksheets[$WorkSheetName]
# Display ExecutedAt in Date and Time format
Set-Column -Worksheet $ws -Column 5 -NumberFormat 'Short Date'
Set-Column -Worksheet $ws -Column 6 -NumberFormat 'hh:mm:ss'
# Display Duration in seconds with 3 decimals
Set-Column -Worksheet $ws -Column 10 -NumberFormat '0.000'
# Add comment to Duration column title
$comment = $ws.Cells['J1:J1'].AddComment('Total seconds', $env:USERNAME)
$comment.AutoFit = $true
# Set the width for column Path
$ws.Column(3) | Set-ExcelRange -Width 29
# Center the column titles
Set-ExcelRange -Address $ws.Row(1) -Bold -HorizontalAlignment Center
# Hide columns FilePath, Name, Passed and Skipped
(1, 4, 8, 9) | ForEach-Object {
Set-ExcelColumn -Worksheet $ws -Column $_ -Hide
}
# Set the color to red when 'Result' is 'Failed'
$endRow = $ws.Dimension.End.Row
$formattingParams = @{
Worksheet = $ws
range = "G2:L$endRow"
RuleType = 'ContainsText'
ConditionValue = "Failed"
BackgroundPattern = 'None'
ForegroundColor = 'Red'
Bold = $true
}
Add-ConditionalFormatting @formattingParams
# Set the color to green when 'Result' is 'Passed'
$endRow = $ws.Dimension.End.Row
$formattingParams = @{
Worksheet = $ws
range = "G2:L$endRow"
RuleType = 'ContainsText'
ConditionValue = "Passed"
BackgroundPattern = 'None'
ForegroundColor = 'Green'
}
Add-ConditionalFormatting @formattingParams
#endregion
#region Save the formatted Excel file
Close-ExcelPackage -ExcelPackage $excel
#endregion
}
else {
Write-Warning 'No Pester test results to export'
}
}

View File

@@ -0,0 +1,11 @@
{
"Run": {
"Path": "."
},
"TestResult": {
"Enabled": false,
"OutputFormat": "NUnitXml",
"OutputPath": "PesterTestResults.xml",
"OutputEncoding": "UTF8"
}
}

View File

@@ -1,5 +1,9 @@
$path = "$Env:TEMP\test.xlsx" try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
remove-item -path $path -ErrorAction SilentlyContinue
#Get rid of pre-exisiting sheet
$xlSourcefile = "$env:TEMP\ImportExcelExample.xlsx"
Write-Verbose -Verbose -Message "Save location: $xlSourcefile"
Remove-Item $xlSourcefile -ErrorAction Ignore
#Export some sales data to Excel, format it as a table and put a data-bar in. For this example we won't create the pivot table during the export #Export some sales data to Excel, format it as a table and put a data-bar in. For this example we won't create the pivot table during the export
$excel = ConvertFrom-Csv @" $excel = ConvertFrom-Csv @"
@@ -10,7 +14,7 @@ Banana, London , 300, 200
Orange, Paris, 600, 500 Orange, Paris, 600, 500
Banana, Paris, 300, 200 Banana, Paris, 300, 200
Apple, New York, 1200,700 Apple, New York, 1200,700
"@ | Export-Excel -PassThru -Path $path -TableStyle Medium13 -tablename "RawData" -ConditionalFormat @{Range="C2:C7"; DataBarColor="Green"} "@ | Export-Excel -PassThru -Path $xlSourcefile -TableStyle Medium13 -tablename "RawData" -ConditionalFormat @{Range="C2:C7"; DataBarColor="Green"}
#Add a pivot table, specify its address to put it on the same sheet, use the data that was just exported set the table style and number format. #Add a pivot table, specify its address to put it on the same sheet, use the data that was just exported set the table style and number format.
#Use the "City" for the row names, and "Product" for the columnnames, and sum both the gross and net values for each City/Product combination; add grand totals to rows and columns. #Use the "City" for the row names, and "Product" for the columnnames, and sum both the gross and net values for each City/Product combination; add grand totals to rows and columns.

View File

@@ -0,0 +1,52 @@
Function Import-Bycolumns {
Param(
[Parameter(Mandatory=$true)]
[OfficeOpenXml.ExcelPackage]$ExcelPackage,
[Int]$StartRow = 1,
[String]$WorksheetName,
[Int]$EndRow ,
[Int]$StartColumn = 1,
[Int]$EndColumn
)
Function Get-RowNames {
[Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseSingularNouns', '', Justification = "Name would be incorrect, and command is not exported")]
param(
[Parameter(Mandatory)]
[Int[]]$Rows,
[Parameter(Mandatory)]
[Int]$StartColumn
)
foreach ($R in $Rows) {
#allow "False" or "0" to be headings
$Worksheet.Cells[$R, $StartColumn] | Where-Object {-not [string]::IsNullOrEmpty($_.Value) } | Select-Object @{N = 'Row'; E = { $R } }, Value
}
}
if (-not $WorksheetName) { $Worksheet = $ExcelPackage.Workbook.Worksheets[1] }
elseif (-not ($Worksheet = $ExcelPackage.Workbook.Worksheets[$WorkSheetName])) {
throw "Worksheet '$WorksheetName' not found, the workbook only contains the worksheets '$($ExcelPackage.Workbook.Worksheets)'. If you only wish to select the first worksheet, please remove the '-WorksheetName' parameter." ; return
}
if (-not $EndRow ) { $EndRow = $Worksheet.Dimension.End.Row }
if (-not $EndColumn) { $EndColumn = $Worksheet.Dimension.End.Column }
$Rows = $Startrow .. $EndRow ;
$Columns = (1 + $StartColumn)..$EndColumn
if ((-not $rows) -or (-not ($PropertyNames = Get-RowNames -Rows $Rows -StartColumn $StartColumn))) {
throw "No headers found in left coulmn '$Startcolumn'. "; return
}
if (-not $Columns) {
Write-Warning "Worksheet '$WorksheetName' in workbook contains no data in the rows after left column '$StartColumn'"
}
else {
foreach ($c in $Columns) {
$NewColumn = [Ordered]@{ }
foreach ($p in $PropertyNames) {
$NewColumn[$p.Value] = $Worksheet.Cells[$p.row,$c].text
}
[PSCustomObject]$NewColumn
}
}
}

View File

@@ -6,7 +6,7 @@
RootModule = 'ImportExcel.psm1' RootModule = 'ImportExcel.psm1'
# Version number of this module. # Version number of this module.
ModuleVersion = '7.1.0' ModuleVersion = '7.3.0'
# ID used to uniquely identify this module # ID used to uniquely identify this module
GUID = '60dd4136-feff-401a-ba27-a84458c57ede' GUID = '60dd4136-feff-401a-ba27-a84458c57ede'
@@ -18,7 +18,7 @@
CompanyName = 'Doug Finke' CompanyName = 'Doug Finke'
# Copyright statement for this module # Copyright statement for this module
Copyright = 'c 2019 All rights reserved.' Copyright = 'c 2020 All rights reserved.'
# Description of the functionality provided by this module # Description of the functionality provided by this module
Description = @' Description = @'
@@ -50,9 +50,9 @@ Check out the How To Videos https://www.youtube.com/watch?v=U3Ne_yX4tYo&list=PL5
'DoChart', 'DoChart',
'Expand-NumberFormat', 'Expand-NumberFormat',
'Export-Excel', 'Export-Excel',
'Export-ExcelSheet', 'Export-ExcelSheet',
'Export-MultipleExcelSheets',
'Get-ExcelColumnName', 'Get-ExcelColumnName',
'Get-ExcelFileSummary',
'Get-ExcelSheetInfo', 'Get-ExcelSheetInfo',
'Get-ExcelWorkbookInfo', 'Get-ExcelWorkbookInfo',
'Get-HtmlTable', 'Get-HtmlTable',
@@ -78,7 +78,9 @@ Check out the How To Videos https://www.youtube.com/watch?v=U3Ne_yX4tYo&list=PL5
'Open-ExcelPackage', 'Open-ExcelPackage',
'PieChart', 'PieChart',
'Pivot', 'Pivot',
'Remove-Worksheet' 'Read-Clipboard',
'ReadClipboardImpl',
'Remove-Worksheet',
'Select-Worksheet', 'Select-Worksheet',
'Send-SQLDataToExcel', 'Send-SQLDataToExcel',
'Set-CellStyle', 'Set-CellStyle',

View File

@@ -7,8 +7,8 @@ if (-not $Strings) {
try { [void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") } try { [void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") }
catch { Write-Warning -Message $Strings.SystemDrawingAvailable } catch { Write-Warning -Message $Strings.SystemDrawingAvailable }
foreach ($directory in @('Private', 'Public','Charting','InferData','Pivot')) { foreach ($directory in @('Private', 'Public', 'Charting', 'InferData', 'Pivot')) {
Get-ChildItem -Path "$PSScriptRoot\$directory\*.ps1" | ForEach-Object {. $_.FullName} Get-ChildItem -Path "$PSScriptRoot\$directory\*.ps1" | ForEach-Object { . $_.FullName }
} }
if ($PSVersionTable.PSVersion.Major -ge 5) { if ($PSVersionTable.PSVersion.Major -ge 5) {
@@ -53,8 +53,8 @@ brew install mono-libgdiplus
"@ "@
Write-Warning -Message $msg Write-Warning -Message $msg
} }
finally {
$ExcelPackage | Close-ExcelPackage -NoSave
}
} }
} finally {
$ExcelPackage | Close-ExcelPackage -NoSave
}
}

View File

@@ -69,7 +69,7 @@
$Address = "$($Address.Row):$($Address.Row)" $Address = "$($Address.Row):$($Address.Row)"
} }
elseif ($Address -is [OfficeOpenXml.ExcelColumn]) { elseif ($Address -is [OfficeOpenXml.ExcelColumn]) {
$Address = (New-Object 'OfficeOpenXml.ExcelAddress' @(1, $address.ColumnMin, 1, $address.ColumnMax).Address) -replace '1','' $Address = (New-Object 'OfficeOpenXml.ExcelAddress' @(1, $address.ColumnMin, 1, $address.ColumnMax)).Address -replace '1',''
if ($Address -notmatch ':') {$Address = "$Address`:$Address"} if ($Address -notmatch ':') {$Address = "$Address`:$Address"}
} }
if ( $Address -is [string] -and $Address -match "!") {$Address = $Address -replace '^.*!',''} if ( $Address -is [string] -and $Address -match "!") {$Address = $Address -replace '^.*!',''}
@@ -87,7 +87,7 @@
if ($Reverse) { if ($Reverse) {
if ($rule.type -match 'IconSet$' ) {$rule.reverse = $true} if ($rule.type -match 'IconSet$' ) {$rule.reverse = $true}
elseif ($rule.type -match 'ColorScale$') {$temp =$rule.LowValue.Color ; $rule.LowValue.Color = $rule.HighValue.Color; $rule.HighValue.Color = $temp} elseif ($rule.type -match 'ColorScale$') {$temp =$rule.LowValue.Color ; $rule.LowValue.Color = $rule.HighValue.Color; $rule.HighValue.Color = $temp}
else {Write-Warning -Message "-Reverse was ignored because $ruletype does not support it."} else {Write-Warning -Message "-Reverse was ignored because $RuleType does not support it."}
} }
#endregion #endregion
#region set the rule conditions #region set the rule conditions

View File

@@ -11,7 +11,7 @@ function Add-ExcelName {
$ws = $Range.Worksheet $ws = $Range.Worksheet
if (-not $RangeName) { if (-not $RangeName) {
$RangeName = $ws.Cells[$Range.Start.Address].Value $RangeName = $ws.Cells[$Range.Start.Address].Value
$Range = ($Range.Worksheet.cells[($range.start.row +1), $range.start.Column , $range.end.row, $range.end.column]) $Range = ($Range.Worksheet.cells[($Range.start.row +1), $Range.start.Column , $Range.end.row, $Range.end.column])
} }
if ($RangeName -match '\W') { if ($RangeName -match '\W') {
Write-Warning -Message "Range name '$RangeName' contains illegal characters, they will be replaced with '_'." Write-Warning -Message "Range name '$RangeName' contains illegal characters, they will be replaced with '_'."

View File

@@ -7,7 +7,7 @@
[OfficeOpenXml.ExcelAddressBase] [OfficeOpenXml.ExcelAddressBase]
$Address, $Address,
$ExcelPackage, $ExcelPackage,
$SourceWorkSheet, $SourceWorksheet,
$SourceRange, $SourceRange,
$PivotRows, $PivotRows,
$PivotData, $PivotData,
@@ -75,11 +75,11 @@
if (-not $wsPivot.PivotTables[$pivotTableName] ) { if (-not $wsPivot.PivotTables[$pivotTableName] ) {
try { try {
#Accept a string or a worksheet object as $SourceWorksheet - we don't need a worksheet if we have a Rangebase . #Accept a string or a worksheet object as $SourceWorksheet - we don't need a worksheet if we have a Rangebase .
if ( $SourceWorkSheet -is [string]) { if ( $SourceWorksheet -is [string]) {
$SourceWorkSheet = $ExcelPackage.Workbook.Worksheets.where( {$_.name -Like $SourceWorkSheet})[0] $SourceWorksheet = $ExcelPackage.Workbook.Worksheets.where( {$_.name -Like $SourceWorksheet})[0]
} }
elseif ( $SourceWorkSheet -is [int] ) { elseif ( $SourceWorksheet -is [int] ) {
$SourceWorkSheet = $ExcelPackage.Workbook.Worksheets[$SourceWorkSheet] $SourceWorksheet = $ExcelPackage.Workbook.Worksheets[$SourceWorksheet]
} }
if ( $SourceRange -is [OfficeOpenXml.Table.ExcelTable]) {$SourceRange = $SourceRange.Address } if ( $SourceRange -is [OfficeOpenXml.Table.ExcelTable]) {$SourceRange = $SourceRange.Address }
if ( $sourceRange -is [OfficeOpenXml.ExcelRange] -or if ( $sourceRange -is [OfficeOpenXml.ExcelRange] -or
@@ -87,17 +87,17 @@
$pivotTable = $wsPivot.PivotTables.Add($Address, $SourceRange, $pivotTableName) $pivotTable = $wsPivot.PivotTables.Add($Address, $SourceRange, $pivotTableName)
} }
elseif (-not $SourceRange) { elseif (-not $SourceRange) {
$pivotTable = $wsPivot.PivotTables.Add($Address, $SourceWorkSheet.cells[$SourceWorkSheet.Dimension.Address], $pivotTableName) $pivotTable = $wsPivot.PivotTables.Add($Address, $SourceWorksheet.cells[$SourceWorksheet.Dimension.Address], $pivotTableName)
} }
elseif ($SourceWorkSheet -isnot [OfficeOpenXml.ExcelWorksheet] ) { elseif ($SourceWorksheet -isnot [OfficeOpenXml.ExcelWorksheet] ) {
Write-Warning -Message "Could not find source Worksheet for pivot-table '$pivotTableName'." ; return Write-Warning -Message "Could not find source Worksheet for pivot-table '$pivotTableName'." ; return
} }
elseif ( $SourceRange -is [String] -or $SourceRange -is [OfficeOpenXml.ExcelAddress]) { elseif ( $SourceRange -is [String] -or $SourceRange -is [OfficeOpenXml.ExcelAddress]) {
$pivotTable = $wsPivot.PivotTables.Add($Address, $SourceWorkSheet.Cells[$SourceRange], $pivotTableName) $pivotTable = $wsPivot.PivotTables.Add($Address, $SourceWorksheet.Cells[$SourceRange], $pivotTableName)
} }
else {Write-warning "Could not create a PivotTable with the Source Range provided."; return} else {Write-warning "Could not create a PivotTable with the Source Range provided."; return}
foreach ($Row in $PivotRows) { foreach ($row in $PivotRows) {
try {$null = $pivotTable.RowFields.Add($pivotTable.Fields[$Row]) } try {$null = $pivotTable.RowFields.Add($pivotTable.Fields[$row]) }
catch {Write-Warning -message "Could not add '$row' to Rows in PivotTable $pivotTableName." } catch {Write-Warning -message "Could not add '$row' to Rows in PivotTable $pivotTableName." }
} }
foreach ($Column in $PivotColumns) { foreach ($Column in $PivotColumns) {
@@ -150,8 +150,8 @@
else { else {
Write-Warning -Message "PivotTable defined in $($pivotTableName) already exists, only the data range will be changed." Write-Warning -Message "PivotTable defined in $($pivotTableName) already exists, only the data range will be changed."
$pivotTable = $wsPivot.PivotTables[$pivotTableName] $pivotTable = $wsPivot.PivotTables[$pivotTableName]
if (-not $SourceRange) { $SourceRange = $SourceWorkSheet.Dimension.Address} if (-not $SourceRange) { $SourceRange = $SourceWorksheet.Dimension.Address}
$pivotTable.CacheDefinition.SourceRange = $SourceWorkSheet.cells[$SourceRange] $pivotTable.CacheDefinition.SourceRange = $SourceWorksheet.cells[$SourceRange]
#change for epPlus 4.5 - Previously needed to hack the xml #change for epPlus 4.5 - Previously needed to hack the xml
# $pivotTable.CacheDefinition.CacheDefinitionXml.pivotCacheDefinition.cacheSource.worksheetSource.ref = $SourceRange # $pivotTable.CacheDefinition.CacheDefinitionXml.pivotCacheDefinition.cacheSource.worksheetSource.ref = $SourceRange

View File

@@ -4,7 +4,7 @@ function Add-Worksheet {
param( param(
[Parameter(Mandatory = $true, ValueFromPipeline = $true, ParameterSetName = "Package", Position = 0)] [Parameter(Mandatory = $true, ValueFromPipeline = $true, ParameterSetName = "Package", Position = 0)]
[OfficeOpenXml.ExcelPackage]$ExcelPackage, [OfficeOpenXml.ExcelPackage]$ExcelPackage,
[Parameter(Mandatory = $true, ParameterSetName = "WorkBook")] [Parameter(Mandatory = $true, ParameterSetName = "Workbook")]
[OfficeOpenXml.ExcelWorkbook]$ExcelWorkbook, [OfficeOpenXml.ExcelWorkbook]$ExcelWorkbook,
[string]$WorksheetName , [string]$WorksheetName ,
[switch]$ClearSheet, [switch]$ClearSheet,

View File

@@ -7,7 +7,7 @@
$Referencefile , $Referencefile ,
[parameter(Mandatory=$true,Position=1)] [parameter(Mandatory=$true,Position=1)]
$Differencefile , $Differencefile ,
$WorkSheetName = "Sheet1", $WorksheetName = "Sheet1",
$Property = "*" , $Property = "*" ,
$ExcludeProperty , $ExcludeProperty ,
[Parameter(ParameterSetName='B', Mandatory)] [Parameter(ParameterSetName='B', Mandatory)]
@@ -32,19 +32,19 @@
catch { Write-Warning -Message "Could not Resolve the filenames." ; return } catch { Write-Warning -Message "Could not Resolve the filenames." ; return }
#If we have one file , we must have two different worksheet names. If we have two files we can have a single string or two strings. #If we have one file , we must have two different worksheet names. If we have two files we can have a single string or two strings.
if ($onefile -and ( ($WorkSheetName.count -ne 2) -or $WorkSheetName[0] -eq $WorkSheetName[1] ) ) { if ($onefile -and ( ($WorksheetName.count -ne 2) -or $WorksheetName[0] -eq $WorksheetName[1] ) ) {
Write-Warning -Message "If both the Reference and difference file are the same then worksheet name must provide 2 different names" Write-Warning -Message "If both the Reference and difference file are the same then worksheet name must provide 2 different names"
return return
} }
if ($WorkSheetName.count -eq 2) {$worksheet1 = $WorkSheetName[0] ; $workSheet2 = $WorkSheetName[1]} if ($WorksheetName.count -eq 2) {$worksheet1 = $WorksheetName[0] ; $worksheet2 = $WorksheetName[1]}
elseif ($WorkSheetName -is [string]) {$worksheet1 = $workSheet2 = $WorkSheetName} elseif ($WorksheetName -is [string]) {$worksheet1 = $worksheet2 = $WorksheetName}
else {Write-Warning -Message "You must provide either a single worksheet name or two names." ; return } else {Write-Warning -Message "You must provide either a single worksheet name or two names." ; return }
$params= @{ ErrorAction = [System.Management.Automation.ActionPreference]::Stop } $params= @{ ErrorAction = [System.Management.Automation.ActionPreference]::Stop }
foreach ($p in @("HeaderName","NoHeader","StartRow")) {if ($PSBoundParameters[$p]) {$params[$p] = $PSBoundParameters[$p]}} foreach ($p in @("HeaderName","NoHeader","StartRow")) {if ($PSBoundParameters[$p]) {$params[$p] = $PSBoundParameters[$p]}}
try { try {
$sheet1 = Import-Excel -Path $Referencefile -WorksheetName $WorkSheet1 @params $sheet1 = Import-Excel -Path $Referencefile -WorksheetName $worksheet1 @params
$sheet2 = Import-Excel -Path $Differencefile -WorksheetName $WorkSheet2 @Params $sheet2 = Import-Excel -Path $Differencefile -WorksheetName $worksheet2 @Params
} }
catch {Write-Warning -Message "Could not read the worksheet from $Referencefile and/or $Differencefile." ; return } catch {Write-Warning -Message "Could not read the worksheet from $Referencefile and/or $Differencefile." ; return }
@@ -57,7 +57,7 @@
$propList = @() $propList = @()
foreach ($p in $Property) {$propList += ($headings.where({$_ -like $p}) )} foreach ($p in $Property) {$propList += ($headings.where({$_ -like $p}) )}
foreach ($p in $ExcludeProperty) {$propList = $propList.where({$_ -notlike $p}) } foreach ($p in $ExcludeProperty) {$propList = $propList.where({$_ -notlike $p}) }
if (($headings -contains $key) -and ($propList -notcontains $Key)) {$propList += $Key} if (($headings -contains $Key) -and ($propList -notcontains $Key)) {$propList += $Key}
$propList = $propList | Select-Object -Unique $propList = $propList | Select-Object -Unique
if ($propList.Count -eq 0) {Write-Warning -Message "No Columns are selected with -Property = '$Property' and -excludeProperty = '$ExcludeProperty'." ; return} if ($propList.Count -eq 0) {Write-Warning -Message "No Columns are selected with -Property = '$Property' and -excludeProperty = '$ExcludeProperty'." ; return}
@@ -106,7 +106,7 @@
} }
} }
#if font color was specified, set it on changed properties where the same key appears in both sheets. #if font color was specified, set it on changed properties where the same key appears in both sheets.
if ($diff -and $FontColor -and (($propList -contains $Key) -or ($key -is [hashtable])) ) { if ($diff -and $FontColor -and (($propList -contains $Key) -or ($Key -is [hashtable])) ) {
$updates = $diff.where({$_.SideIndicator -ne "=="}) | Group-object -Property $Key | Where-Object {$_.count -eq 2} $updates = $diff.where({$_.SideIndicator -ne "=="}) | Group-object -Property $Key | Where-Object {$_.count -eq 2}
if ($updates) { if ($updates) {
$XL1 = Open-ExcelPackage -path $Referencefile $XL1 = Open-ExcelPackage -path $Referencefile
@@ -135,28 +135,28 @@
elseif ($diff -and $FontColor) {Write-Warning -Message "To match rows to set changed cells, you must specify -Key and it must match one of the included properties." } elseif ($diff -and $FontColor) {Write-Warning -Message "To match rows to set changed cells, you must specify -Key and it must match one of the included properties." }
#if nothing was found write a message which will not be redirected #if nothing was found write a message which will not be redirected
if (-not $diff) {Write-Host "Comparison of $Referencefile::$worksheet1 and $Differencefile::$WorkSheet2 returned no results." } if (-not $diff) {Write-Host "Comparison of $Referencefile::$worksheet1 and $Differencefile::$worksheet2 returned no results." }
if ($Show) { if ($Show) {
Start-Process -FilePath $Referencefile Start-Process -FilePath $Referencefile
if (-not $oneFile) { Start-Process -FilePath $Differencefile } if (-not $oneFile) { Start-Process -FilePath $Differencefile }
if ($GridView) { Write-Warning -Message "-GridView is ignored when -Show is specified" } if ($GridView) { Write-Warning -Message "-GridView is ignored when -Show is specified" }
} }
elseif ($GridView -and $propList -contains $key) { elseif ($GridView -and $propList -contains $Key) {
if ($IncludeEqual -and -not $ExcludeDifferent) { if ($IncludeEqual -and -not $ExcludeDifferent) {
$GroupedRows = $diff | Group-Object -Property $key $GroupedRows = $diff | Group-Object -Property $Key
} }
else { #to get the right now numbers on the grid we need to have all the rows. else { #to get the right now numbers on the grid we need to have all the rows.
$GroupedRows = Compare-Object -ReferenceObject $Sheet1 -DifferenceObject $Sheet2 -Property $propList -PassThru -IncludeEqual | $GroupedRows = Compare-Object -ReferenceObject $Sheet1 -DifferenceObject $Sheet2 -Property $propList -PassThru -IncludeEqual |
Group-Object -Property $key Group-Object -Property $Key
} }
#Additions, deletions and unchanged rows will give a group of 1; changes will give a group of 2 . #Additions, deletions and unchanged rows will give a group of 1; changes will give a group of 2 .
#If one sheet has extra rows we can get a single "==" result from compare, but with the row from the reference sheet #If one sheet has extra rows we can get a single "==" result from compare, but with the row from the reference sheet
#but the row in the other sheet might so we will look up the row number from the key field build a hash table for that #but the row in the other sheet might so we will look up the row number from the key field build a hash table for that
$Sheet2 | ForEach-Object -Begin {$Rowhash = @{} } -Process {$Rowhash[$_.$key] = $_._row } $Sheet2 | ForEach-Object -Begin {$rowHash = @{} } -Process {$rowHash[$_.$Key] = $_._row }
$ExpandedDiff = ForEach ($g in $GroupedRows) { $ExpandedDiff = ForEach ($g in $GroupedRows) {
#we're going to create a custom object from a hash table. We want the fields to be ordered #we're going to create a custom object from a hash table. We want the fields to be ordered
@@ -168,11 +168,11 @@
#if we have already set the side, this is the second record, so set side to indicate "changed" #if we have already set the side, this is the second record, so set side to indicate "changed"
if ($hash.Side) {$hash.side = "<>"} else {$hash["Side"] = $result.sideindicator} if ($hash.Side) {$hash.side = "<>"} else {$hash["Side"] = $result.sideindicator}
#if result is "in reference" and we don't have a matching "in difference" (meaning a change) the lookup will be blank. Which we want. #if result is "in reference" and we don't have a matching "in difference" (meaning a change) the lookup will be blank. Which we want.
$hash[">Row"] = $Rowhash[$g.Name] $hash[">Row"] = $rowHash[$g.Name]
#position the key as the next field (only appears once) #position the key as the next field (only appears once)
$Hash[$key] = $g.Name $Hash[$Key] = $g.Name
#For all the other fields we care about create <=FieldName and/or =>FieldName #For all the other fields we care about create <=FieldName and/or =>FieldName
foreach ($p in $propList.Where({$_ -ne $key})) { foreach ($p in $propList.Where({$_ -ne $Key})) {
if ($result.SideIndicator -eq "==") {$hash[("=>$P")] = $hash[("<=$P")] =$result.$P} if ($result.SideIndicator -eq "==") {$hash[("=>$P")] = $hash[("<=$P")] =$result.$P}
else {$hash[($result.SideIndicator+$P)] =$result.$P} else {$hash[($result.SideIndicator+$P)] =$result.$P}
} }
@@ -191,7 +191,7 @@
if ( $ExcludeDifferent) {$ExpandedDiff = $ExpandedDiff.where({$_.side -eq "=="}) | Sort-Object -Property "<row" ,">row" } if ( $ExcludeDifferent) {$ExpandedDiff = $ExpandedDiff.where({$_.side -eq "=="}) | Sort-Object -Property "<row" ,">row" }
elseif ( $IncludeEqual) {$ExpandedDiff = $ExpandedDiff | Sort-Object -Property "<row" ,">row" } elseif ( $IncludeEqual) {$ExpandedDiff = $ExpandedDiff | Sort-Object -Property "<row" ,">row" }
else {$ExpandedDiff = $ExpandedDiff.where({$_.side -ne "=="}) | Sort-Object -Property "<row" ,">row" } else {$ExpandedDiff = $ExpandedDiff.where({$_.side -ne "=="}) | Sort-Object -Property "<row" ,">row" }
$ExpandedDiff | Update-FirstObjectProperties | Out-GridView -Title "Comparing $Referencefile::$worksheet1 (<=) with $Differencefile::$WorkSheet2 (=>)" $ExpandedDiff | Update-FirstObjectProperties | Out-GridView -Title "Comparing $Referencefile::$worksheet1 (<=) with $Differencefile::$worksheet2 (=>)"
} }
elseif ($GridView ) {Write-Warning -Message "To use -GridView you must specify -Key and it must match one of the included properties." } elseif ($GridView ) {Write-Warning -Message "To use -GridView you must specify -Key and it must match one of the included properties." }
elseif (-not $PassThru) {return ($diff | Select-Object -Property (@(@{n="_Side";e={$_.SideIndicator}},"_File" ,"_Sheet","_Row") + $propList))} elseif (-not $PassThru) {return ($diff | Select-Object -Property (@(@{n="_Side";e={$_.SideIndicator}},"_File" ,"_Sheet","_Row") + $propList))}

View File

@@ -3,56 +3,56 @@
param ( param (
[parameter(Mandatory=$true)] [parameter(Mandatory=$true)]
$Path, $Path,
$workSheetname = "Sheet1" , $WorksheetName = "Sheet1" ,
[parameter(Mandatory=$true)] [parameter(Mandatory=$true)]
$range, $Range,
$destination = "$pwd\temp.png", $Destination = "$pwd\temp.png",
[switch]$show [switch]$Show
) )
$extension = $destination -replace '^.*\.(\w+)$' ,'$1' $extension = $Destination -replace '^.*\.(\w+)$' ,'$1'
if ($extension -in @('JPEG','BMP','PNG')) { if ($extension -in @('JPEG','BMP','PNG')) {
$Format = [system.Drawing.Imaging.ImageFormat]$extension $Format = [system.Drawing.Imaging.ImageFormat]$extension
} #if we don't recognise the extension OR if it is JPG with an E, use JPEG format } #if we don't recognise the extension OR if it is JPG with an E, use JPEG format
else { $Format = [system.Drawing.Imaging.ImageFormat]::Jpeg} else { $Format = [system.Drawing.Imaging.ImageFormat]::Jpeg}
Write-Progress -Activity "Exporting $range of $workSheetname in $Path" -Status "Starting Excel" Write-Progress -Activity "Exporting $Range of $WorksheetName in $Path" -Status "Starting Excel"
$xlApp = New-Object -ComObject "Excel.Application" $xlApp = New-Object -ComObject "Excel.Application"
Write-Progress -Activity "Exporting $range of $workSheetname in $Path" -Status "Opening Workbook and copying data" Write-Progress -Activity "Exporting $Range of $WorksheetName in $Path" -Status "Opening Workbook and copying data"
$xlWbk = $xlApp.Workbooks.Open($Path) $xlWbk = $xlApp.Workbooks.Open($Path)
$xlWbk.Worksheets($workSheetname).Select() $xlWbk.Worksheets($WorksheetName).Select()
$null = $xlWbk.ActiveSheet.Range($range).Select() $null = $xlWbk.ActiveSheet.Range($Range).Select()
$null = $xlApp.Selection.Copy() $null = $xlApp.Selection.Copy()
Write-Progress -Activity "Exporting $range of $workSheetname in $Path" -Status "Saving copied data" Write-Progress -Activity "Exporting $Range of $WorksheetName in $Path" -Status "Saving copied data"
# Get-Clipboard came in with PS5. Older versions can use [System.Windows.Clipboard] but it is ugly. # Get-Clipboard came in with PS5. Older versions can use [System.Windows.Clipboard] but it is ugly.
$image = Get-Clipboard -Format Image $image = Get-Clipboard -Format Image
$image.Save($destination, $Format) $image.Save($Destination, $Format)
Write-Progress -Activity "Exporting $range of $workSheetname in $Path" -Status "Closing Excel" Write-Progress -Activity "Exporting $Range of $WorksheetName in $Path" -Status "Closing Excel"
$null = $xlWbk.ActiveSheet.Range("a1").Select() $null = $xlWbk.ActiveSheet.Range("a1").Select()
$null = $xlApp.Selection.Copy() $null = $xlApp.Selection.Copy()
$xlApp.Quit() $xlApp.Quit()
Write-Progress -Activity "Exporting $range of $workSheetname in $Path" -Completed Write-Progress -Activity "Exporting $Range of $WorksheetName in $Path" -Completed
if ($show) {Start-Process -FilePath $destination} if ($Show) {Start-Process -FilePath $Destination}
else {Get-Item -Path $destination} else {Get-Item -Path $Destination}
} }
<# <#
del demo*.xlsx del demo*.xlsx
$workSheetname = 'Processes' $worksheetName = 'Processes'
$Path = "$pwd\demo.xlsx" $Path = "$pwd\demo.xlsx"
$myData = Get-Process | Select-Object -Property Name,WS,CPU,Description,company,startTime $myData = Get-Process | Select-Object -Property Name,WS,CPU,Description,company,startTime
$excelPackage = $myData | Export-Excel -KillExcel -Path $Path -WorkSheetname $workSheetname -ClearSheet -AutoSize -AutoFilter -BoldTopRow -FreezeTopRow -PassThru $excelPackage = $myData | Export-Excel -KillExcel -Path $Path -WorksheetName $worksheetName -ClearSheet -AutoSize -AutoFilter -BoldTopRow -FreezeTopRow -PassThru
$workSheet = $excelPackage.Workbook.Worksheets[$workSheetname] $worksheet = $excelPackage.Workbook.Worksheets[$worksheetName]
$range = $workSheet.Dimension.Address $range = $worksheet.Dimension.Address
Set-ExcelRange -Worksheet $workSheet -Range "b:b" -NumberFormat "#,###" -AutoFit Set-ExcelRange -Worksheet $worksheet -Range "b:b" -NumberFormat "#,###" -AutoFit
Set-ExcelRange -Worksheet $workSheet -Range "C:C" -NumberFormat "#,##0.00" -AutoFit Set-ExcelRange -Worksheet $worksheet -Range "C:C" -NumberFormat "#,##0.00" -AutoFit
Set-ExcelRange -Worksheet $workSheet -Range "F:F" -NumberFormat "dd MMMM HH:mm:ss" -AutoFit Set-ExcelRange -Worksheet $worksheet -Range "F:F" -NumberFormat "dd MMMM HH:mm:ss" -AutoFit
Add-ConditionalFormatting -Worksheet $workSheet -Range "c2:c1000" -DataBarColor Blue Add-ConditionalFormatting -Worksheet $worksheet -Range "c2:c1000" -DataBarColor Blue
Add-ConditionalFormatting -Worksheet $workSheet -Range "b2:B1000" -RuleType GreaterThan -ConditionValue '104857600' -ForeGroundColor "Red" -Bold Add-ConditionalFormatting -Worksheet $worksheet -Range "b2:B1000" -RuleType GreaterThan -ConditionValue '104857600' -ForeGroundColor "Red" -Bold
Export-Excel -ExcelPackage $excelPackage -WorkSheetname $workSheetname Export-Excel -ExcelPackage $excelPackage -WorksheetName $worksheetName
Convert-ExcelRangeToImage -Path $Path -workSheetname $workSheetname -range $range -destination "$pwd\temp.png" -show Convert-ExcelRangeToImage -Path $Path -WorksheetName $worksheetName -range $range -destination "$pwd\temp.png" -show
#> #>
#Convert-ExcelRangeToImage -Path $Path -workSheetname $workSheetname -range $range -destination "$pwd\temp.png" -show #Convert-ExcelRangeToImage -Path $Path -WorksheetName $worksheetName -range $range -destination "$pwd\temp.png" -show

View File

@@ -5,16 +5,16 @@ function ConvertFrom-ExcelData {
[Parameter(ValueFromPipelineByPropertyName = $true, ValueFromPipeline = $true, Mandatory = $true)] [Parameter(ValueFromPipelineByPropertyName = $true, ValueFromPipeline = $true, Mandatory = $true)]
[ValidateScript( { Test-Path $_ -PathType Leaf })] [ValidateScript( { Test-Path $_ -PathType Leaf })]
$Path, $Path,
[ScriptBlock]$scriptBlock, [ScriptBlock]$ScriptBlock,
[Alias("Sheet")] [Alias("Sheet")]
$WorkSheetname = 1, $WorksheetName = 1,
[int]$HeaderRow = 1, [int]$HeaderRow = 1,
[string[]]$Header, [string[]]$Header,
[switch]$NoHeader, [switch]$NoHeader,
[switch]$DataOnly [switch]$DataOnly
) )
$null = $PSBoundParameters.Remove('scriptBlock') $null = $PSBoundParameters.Remove('ScriptBlock')
$params = @{} + $PSBoundParameters $params = @{} + $PSBoundParameters
$data = Import-Excel @params $data = Import-Excel @params
@@ -24,6 +24,6 @@ function ConvertFrom-ExcelData {
Select-Object -ExpandProperty name Select-Object -ExpandProperty name
foreach ($record in $data) { foreach ($record in $data) {
& $scriptBlock $PropertyNames $record & $ScriptBlock $PropertyNames $record
} }
} }

View File

@@ -19,7 +19,7 @@ function ConvertFrom-ExcelSheet {
[string[]]$AsDate = @() [string[]]$AsDate = @()
) )
$Path = (Resolve-Path $Path).Path $Path = (Resolve-Path $Path).ProviderPath
$xl = New-Object -TypeName OfficeOpenXml.ExcelPackage -ArgumentList $Path $xl = New-Object -TypeName OfficeOpenXml.ExcelPackage -ArgumentList $Path
$workbook = $xl.Workbook $workbook = $xl.Workbook

View File

@@ -8,7 +8,7 @@ function ConvertFrom-ExcelToSQLInsert {
[ValidateScript( { Test-Path $_ -PathType Leaf })] [ValidateScript( { Test-Path $_ -PathType Leaf })]
$Path, $Path,
[Alias("Sheet")] [Alias("Sheet")]
$WorkSheetname = 1, $WorksheetName = 1,
[Alias('HeaderRow', 'TopRow')] [Alias('HeaderRow', 'TopRow')]
[ValidateRange(1, 9999)] [ValidateRange(1, 9999)]
[Int]$StartRow, [Int]$StartRow,
@@ -16,12 +16,12 @@ function ConvertFrom-ExcelToSQLInsert {
[switch]$NoHeader, [switch]$NoHeader,
[switch]$DataOnly, [switch]$DataOnly,
[switch]$ConvertEmptyStringsToNull, [switch]$ConvertEmptyStringsToNull,
[switch]$UseMSSQLSyntax [switch]$UseMsSqlSyntax
) )
$null = $PSBoundParameters.Remove('TableName') $null = $PSBoundParameters.Remove('TableName')
$null = $PSBoundParameters.Remove('ConvertEmptyStringsToNull') $null = $PSBoundParameters.Remove('ConvertEmptyStringsToNull')
$null = $PSBoundParameters.Remove('UseMSSQLSyntax') $null = $PSBoundParameters.Remove('UseMsSqlSyntax')
$params = @{} + $PSBoundParameters $params = @{} + $PSBoundParameters
@@ -29,7 +29,7 @@ function ConvertFrom-ExcelToSQLInsert {
param($propertyNames, $record) param($propertyNames, $record)
$ColumnNames = "'" + ($PropertyNames -join "', '") + "'" $ColumnNames = "'" + ($PropertyNames -join "', '") + "'"
if($UseMSSQLSyntax) { if($UseMsSqlSyntax) {
$ColumnNames = "[" + ($PropertyNames -join "], [") + "]" $ColumnNames = "[" + ($PropertyNames -join "], [") + "]"
} }

View File

@@ -4,7 +4,7 @@
[Parameter(Mandatory = $true,ValueFromPipeline=$true)] [Parameter(Mandatory = $true,ValueFromPipeline=$true)]
[Alias('SourceWorkbook')] [Alias('SourceWorkbook')]
$SourceObject, $SourceObject,
$SourceWorkSheet = 1 , $SourceWorksheet = 1 ,
[Parameter(Mandatory = $true)] [Parameter(Mandatory = $true)]
$DestinationWorkbook, $DestinationWorkbook,
$DestinationWorksheet, $DestinationWorksheet,
@@ -39,7 +39,7 @@
return return
} }
else { else {
$null = Add-Worksheet -ExcelPackage $excel -WorkSheetname $DestinationWorksheet -CopySource ($excel.Workbook.Worksheets[$SourceWorkSheet]) $null = Add-Worksheet -ExcelPackage $excel -WorksheetName $DestinationWorksheet -CopySource ($excel.Workbook.Worksheets[$SourceWorksheet])
Close-ExcelPackage -ExcelPackage $excel -Show:$Show Close-ExcelPackage -ExcelPackage $excel -Show:$Show
return return
} }
@@ -47,15 +47,15 @@
} }
else { else {
if ($SourceObject -is [OfficeOpenXml.ExcelWorksheet]) {$sourceWs = $SourceObject} if ($SourceObject -is [OfficeOpenXml.ExcelWorksheet]) {$sourceWs = $SourceObject}
elseif ($SourceObject -is [OfficeOpenXml.ExcelWorkbook]) {$sourceWs = $SourceObject.Worksheets[$SourceWorkSheet]} elseif ($SourceObject -is [OfficeOpenXml.ExcelWorkbook]) {$sourceWs = $SourceObject.Worksheets[$SourceWorksheet]}
elseif ($SourceObject -is [OfficeOpenXml.ExcelPackage] ) {$sourceWs = $SourceObject.Workbook.Worksheets[$SourceWorkSheet]} elseif ($SourceObject -is [OfficeOpenXml.ExcelPackage] ) {$sourceWs = $SourceObject.Workbook.Worksheets[$SourceWorksheet]}
else { else {
$SourceObject = (Resolve-Path $SourceObject).ProviderPath $SourceObject = (Resolve-Path $SourceObject).ProviderPath
try { try {
Write-Verbose "Opening worksheet '$Worksheetname' in Excel workbook '$SourceObject'." Write-Verbose "Opening worksheet '$WorksheetName' in Excel workbook '$SourceObject'."
$stream = New-Object -TypeName System.IO.FileStream -ArgumentList $SourceObject, 'Open', 'Read' , 'ReadWrite' $stream = New-Object -TypeName System.IO.FileStream -ArgumentList $SourceObject, 'Open', 'Read' , 'ReadWrite'
$package1 = New-Object -TypeName OfficeOpenXml.ExcelPackage -ArgumentList $stream $package1 = New-Object -TypeName OfficeOpenXml.ExcelPackage -ArgumentList $stream
$sourceWs = $Package1.Workbook.Worksheets[$SourceWorkSheet] $sourceWs = $Package1.Workbook.Worksheets[$SourceWorksheet]
} }
catch {Write-Warning -Message "Could not open $SourceObject - the error was '$($_.exception.message)' " ; return} catch {Write-Warning -Message "Could not open $SourceObject - the error was '$($_.exception.message)' " ; return}
} }
@@ -76,7 +76,7 @@
$DestinationWorkbook.Worksheets.Delete($DestinationWorksheet) $DestinationWorkbook.Worksheets.Delete($DestinationWorksheet)
} }
Write-Verbose "Copying '$($sourcews.name)' from $($SourceObject) to '$($DestinationWorksheet)' in $($PSBoundParameters['DestinationWorkbook'])" Write-Verbose "Copying '$($sourcews.name)' from $($SourceObject) to '$($DestinationWorksheet)' in $($PSBoundParameters['DestinationWorkbook'])"
$null = Add-Worksheet -ExcelWorkbook $DestinationWorkbook -WorkSheetname $DestinationWorksheet -CopySource $sourceWs $null = Add-Worksheet -ExcelWorkbook $DestinationWorkbook -WorksheetName $DestinationWorksheet -CopySource $sourceWs
#Leave the destination open but close the source - if we're copying more than one sheet we'll re-open it and live with the inefficiency #Leave the destination open but close the source - if we're copying more than one sheet we'll re-open it and live with the inefficiency
if ($stream) {$stream.Close() } if ($stream) {$stream.Close() }
if ($package1) {Close-ExcelPackage -ExcelPackage $package1 -NoSave } if ($package1) {Close-ExcelPackage -ExcelPackage $package1 -NoSave }

View File

@@ -132,7 +132,7 @@
$WorksheetName = $ws.Name $WorksheetName = $ws.Name
} }
} }
catch {throw "Could not get worksheet $worksheetname"} catch {throw "Could not get worksheet $WorksheetName"}
try { try {
if ($Append -and $ws.Dimension) { if ($Append -and $ws.Dimension) {
#if there is a title or anything else above the header row, append needs to be combined wih a suitable startrow parameter #if there is a title or anything else above the header row, append needs to be combined wih a suitable startrow parameter
@@ -176,23 +176,23 @@
} }
elseif ($Title) { elseif ($Title) {
#Can only add a title if not appending! #Can only add a title if not appending!
$Row = $StartRow $row = $StartRow
$ws.Cells[$Row, $StartColumn].Value = $Title $ws.Cells[$row, $StartColumn].Value = $Title
$ws.Cells[$Row, $StartColumn].Style.Font.Size = $TitleSize $ws.Cells[$row, $StartColumn].Style.Font.Size = $TitleSize
if ($PSBoundParameters.ContainsKey("TitleBold")) { if ($PSBoundParameters.ContainsKey("TitleBold")) {
#Set title to Bold face font if -TitleBold was specified. #Set title to Bold face font if -TitleBold was specified.
#Otherwise the default will be unbolded. #Otherwise the default will be unbolded.
$ws.Cells[$Row, $StartColumn].Style.Font.Bold = [boolean]$TitleBold $ws.Cells[$row, $StartColumn].Style.Font.Bold = [boolean]$TitleBold
} }
if ($TitleBackgroundColor ) { if ($TitleBackgroundColor ) {
if ($TitleBackgroundColor -is [string]) {$TitleBackgroundColor = [System.Drawing.Color]::$TitleBackgroundColor } if ($TitleBackgroundColor -is [string]) {$TitleBackgroundColor = [System.Drawing.Color]::$TitleBackgroundColor }
$ws.Cells[$Row, $StartColumn].Style.Fill.PatternType = $TitleFillPattern $ws.Cells[$row, $StartColumn].Style.Fill.PatternType = $TitleFillPattern
$ws.Cells[$Row, $StartColumn].Style.Fill.BackgroundColor.SetColor($TitleBackgroundColor) $ws.Cells[$row, $StartColumn].Style.Fill.BackgroundColor.SetColor($TitleBackgroundColor)
} }
$Row ++ ; $startRow ++ $row ++ ; $startRow ++
} }
else { $Row = $StartRow } else { $row = $StartRow }
$ColumnIndex = $StartColumn $ColumnIndex = $StartColumn
$Numberformat = Expand-NumberFormat -NumberFormat $Numberformat $Numberformat = Expand-NumberFormat -NumberFormat $Numberformat
if ((-not $ws.Dimension) -and ($Numberformat -ne $ws.Cells.Style.Numberformat.Format)) { if ((-not $ws.Dimension) -and ($Numberformat -ne $ws.Cells.Style.Numberformat.Format)) {
@@ -278,20 +278,20 @@
foreach ($exclusion in $ExcludeProperty) {$script:Header = $script:Header -notlike $exclusion} foreach ($exclusion in $ExcludeProperty) {$script:Header = $script:Header -notlike $exclusion}
if ($NoHeader) { if ($NoHeader) {
# Don't push the headers to the spreadsheet # Don't push the headers to the spreadsheet
$Row -= 1 $row -= 1
} }
else { else {
$ColumnIndex = $StartColumn $ColumnIndex = $StartColumn
foreach ($Name in $script:Header) { foreach ($Name in $script:Header) {
$ws.Cells[$Row, $ColumnIndex].Value = $Name $ws.Cells[$row, $ColumnIndex].Value = $Name
Write-Verbose "Cell '$Row`:$ColumnIndex' add header '$Name'" Write-Verbose "Cell '$row`:$ColumnIndex' add header '$Name'"
$ColumnIndex += 1 $ColumnIndex += 1
} }
} }
} }
#endregion #endregion
#region Add non header values #region Add non header values
$Row += 1 $row += 1
$ColumnIndex = $StartColumn $ColumnIndex = $StartColumn
<# <#
For each item in the header OR for the Data item if this is a simple Type or data table : For each item in the header OR for the Data item if this is a simple Type or data table :
@@ -305,39 +305,39 @@
else {$v = $TargetData.$Name} else {$v = $TargetData.$Name}
try { try {
if ($v -is [DateTime]) { if ($v -is [DateTime]) {
$ws.Cells[$Row, $ColumnIndex].Value = $v $ws.Cells[$row, $ColumnIndex].Value = $v
$ws.Cells[$Row, $ColumnIndex].Style.Numberformat.Format = 'm/d/yy h:mm' # This is not a custom format, but a preset recognized as date and localized. $ws.Cells[$row, $ColumnIndex].Style.Numberformat.Format = 'm/d/yy h:mm' # This is not a custom format, but a preset recognized as date and localized.
} }
elseif ($v -is [TimeSpan]) { elseif ($v -is [TimeSpan]) {
$ws.Cells[$Row, $ColumnIndex].Value = $v $ws.Cells[$row, $ColumnIndex].Value = $v
$ws.Cells[$Row, $ColumnIndex].Style.Numberformat.Format = '[h]:mm:ss' $ws.Cells[$row, $ColumnIndex].Style.Numberformat.Format = '[h]:mm:ss'
} }
elseif ($v -is [System.ValueType]) { elseif ($v -is [System.ValueType]) {
$ws.Cells[$Row, $ColumnIndex].Value = $v $ws.Cells[$row, $ColumnIndex].Value = $v
if ($setNumformat) {$ws.Cells[$Row, $ColumnIndex].Style.Numberformat.Format = $Numberformat } if ($setNumformat) {$ws.Cells[$row, $ColumnIndex].Style.Numberformat.Format = $Numberformat }
} }
elseif ($v -is [uri] ) { elseif ($v -is [uri] ) {
$ws.Cells[$Row, $ColumnIndex].HyperLink = $v $ws.Cells[$row, $ColumnIndex].HyperLink = $v
$ws.Cells[$Row, $ColumnIndex].Style.Font.Color.SetColor([System.Drawing.Color]::Blue) $ws.Cells[$row, $ColumnIndex].Style.Font.Color.SetColor([System.Drawing.Color]::Blue)
$ws.Cells[$Row, $ColumnIndex].Style.Font.UnderLine = $true $ws.Cells[$row, $ColumnIndex].Style.Font.UnderLine = $true
} }
elseif ($v -isnot [String] ) { #Other objects or null. elseif ($v -isnot [String] ) { #Other objects or null.
if ($null -ne $v) { $ws.Cells[$Row, $ColumnIndex].Value = $v.toString()} if ($null -ne $v) { $ws.Cells[$row, $ColumnIndex].Value = $v.toString()}
} }
elseif ($v[0] -eq '=') { elseif ($v[0] -eq '=') {
$ws.Cells[$Row, $ColumnIndex].Formula = ($v -replace '^=','') $ws.Cells[$row, $ColumnIndex].Formula = ($v -replace '^=','')
if ($setNumformat) {$ws.Cells[$Row, $ColumnIndex].Style.Numberformat.Format = $Numberformat } if ($setNumformat) {$ws.Cells[$row, $ColumnIndex].Style.Numberformat.Format = $Numberformat }
} }
elseif ( [System.Uri]::IsWellFormedUriString($v , [System.UriKind]::Absolute) ) { elseif ( [System.Uri]::IsWellFormedUriString($v , [System.UriKind]::Absolute) ) {
if ($v -match "^xl://internal/") { if ($v -match "^xl://internal/") {
$referenceAddress = $v -replace "^xl://internal/" , "" $referenceAddress = $v -replace "^xl://internal/" , ""
$display = $referenceAddress -replace "!A1$" , "" $display = $referenceAddress -replace "!A1$" , ""
$h = New-Object -TypeName OfficeOpenXml.ExcelHyperLink -ArgumentList $referenceAddress , $display $h = New-Object -TypeName OfficeOpenXml.ExcelHyperLink -ArgumentList $referenceAddress , $display
$ws.Cells[$Row, $ColumnIndex].HyperLink = $h $ws.Cells[$row, $ColumnIndex].HyperLink = $h
} }
else {$ws.Cells[$Row, $ColumnIndex].HyperLink = $v } #$ws.Cells[$Row, $ColumnIndex].Value = $v.AbsoluteUri else {$ws.Cells[$row, $ColumnIndex].HyperLink = $v } #$ws.Cells[$row, $ColumnIndex].Value = $v.AbsoluteUri
$ws.Cells[$Row, $ColumnIndex].Style.Font.Color.SetColor([System.Drawing.Color]::Blue) $ws.Cells[$row, $ColumnIndex].Style.Font.Color.SetColor([System.Drawing.Color]::Blue)
$ws.Cells[$Row, $ColumnIndex].Style.Font.UnderLine = $true $ws.Cells[$row, $ColumnIndex].Style.Font.UnderLine = $true
} }
else { else {
$number = $null $number = $null
@@ -346,15 +346,15 @@
$NoNumberConversion -notcontains $Name -and $NoNumberConversion -notcontains $Name -and
[Double]::TryParse($v, [System.Globalization.NumberStyles]::Any, [System.Globalization.NumberFormatInfo]::CurrentInfo, [Ref]$number) [Double]::TryParse($v, [System.Globalization.NumberStyles]::Any, [System.Globalization.NumberFormatInfo]::CurrentInfo, [Ref]$number)
) { ) {
$ws.Cells[$Row, $ColumnIndex].Value = $number $ws.Cells[$row, $ColumnIndex].Value = $number
if ($setNumformat) {$ws.Cells[$Row, $ColumnIndex].Style.Numberformat.Format = $Numberformat } if ($setNumformat) {$ws.Cells[$row, $ColumnIndex].Style.Numberformat.Format = $Numberformat }
} }
else { else {
$ws.Cells[$Row, $ColumnIndex].Value = $v $ws.Cells[$row, $ColumnIndex].Value = $v
} }
} }
} }
catch {Write-Warning -Message "Could not insert the '$Name' property at Row $Row, Column $ColumnIndex"} catch {Write-Warning -Message "Could not insert the '$Name' property at Row $row, Column $ColumnIndex"}
$ColumnIndex += 1 $ColumnIndex += 1
} }
$ColumnIndex -= 1 # column index will be the last column whether isDataTypeValueType was true or false $ColumnIndex -= 1 # column index will be the last column whether isDataTypeValueType was true or false
@@ -371,7 +371,7 @@
$endAddress = $ws.Dimension.End.Address $endAddress = $ws.Dimension.End.Address
} }
else { else {
$LastRow = $Row $LastRow = $row
$LastCol = $ColumnIndex $LastCol = $ColumnIndex
$endAddress = [OfficeOpenXml.ExcelAddress]::GetAddress($LastRow , $LastCol) $endAddress = [OfficeOpenXml.ExcelAddress]::GetAddress($LastRow , $LastCol)
} }
@@ -435,8 +435,8 @@
$params = $item.value $params = $item.value
if ($Activate) {$params.Activate = $true } if ($Activate) {$params.Activate = $true }
if ($params.keys -notcontains 'SourceRange' -and if ($params.keys -notcontains 'SourceRange' -and
($params.Keys -notcontains 'SourceWorkSheet' -or $params.SourceWorkSheet -eq $WorksheetName)) {$params.SourceRange = $dataRange} ($params.Keys -notcontains 'SourceWorksheet' -or $params.SourceWorksheet -eq $WorksheetName)) {$params.SourceRange = $dataRange}
if ($params.Keys -notcontains 'SourceWorkSheet') {$params.SourceWorkSheet = $ws } if ($params.Keys -notcontains 'SourceWorksheet') {$params.SourceWorksheet = $ws }
if ($params.Keys -notcontains 'NoTotalsInPivot' -and $NoTotalsInPivot ) {$params.PivotTotals = 'None'} if ($params.Keys -notcontains 'NoTotalsInPivot' -and $NoTotalsInPivot ) {$params.PivotTotals = 'None'}
if ($params.Keys -notcontains 'PivotTotals' -and $PivotTotals ) {$params.PivotTotals = $PivotTotals} if ($params.Keys -notcontains 'PivotTotals' -and $PivotTotals ) {$params.PivotTotals = $PivotTotals}
if ($params.Keys -notcontains 'PivotDataToColumn' -and $PivotDataToColumn) {$params.PivotDataToColumn = $true} if ($params.Keys -notcontains 'PivotDataToColumn' -and $PivotDataToColumn) {$params.PivotDataToColumn = $true}
@@ -471,7 +471,7 @@
if ($ShowPercent) {$params.ShowPercent = $true} if ($ShowPercent) {$params.ShowPercent = $true}
if ($NoLegend) {$params.NoLegend = $true} if ($NoLegend) {$params.NoLegend = $true}
} }
Add-PivotTable -ExcelPackage $pkg -SourceWorkSheet $ws @params Add-PivotTable -ExcelPackage $pkg -SourceWorksheet $ws @params
} }
try { try {
@@ -544,7 +544,7 @@
foreach ($Sheet in $HideSheet) { foreach ($Sheet in $HideSheet) {
try { try {
$pkg.Workbook.WorkSheets.Where({$_.Name -like $sheet}) | ForEach-Object { $pkg.Workbook.Worksheets.Where({$_.Name -like $sheet}) | ForEach-Object {
$_.Hidden = 'Hidden' $_.Hidden = 'Hidden'
Write-verbose -Message "Sheet '$($_.Name)' Hidden." Write-verbose -Message "Sheet '$($_.Name)' Hidden."
} }
@@ -553,7 +553,7 @@
} }
foreach ($Sheet in $UnHideSheet) { foreach ($Sheet in $UnHideSheet) {
try { try {
$pkg.Workbook.WorkSheets.Where({$_.Name -like $sheet}) | ForEach-Object { $pkg.Workbook.Worksheets.Where({$_.Name -like $sheet}) | ForEach-Object {
$_.Hidden = 'Visible' $_.Hidden = 'Visible'
Write-verbose -Message "Sheet '$($_.Name)' shown" Write-verbose -Message "Sheet '$($_.Name)' shown"
} }

View File

@@ -1,120 +0,0 @@
---
external help file: ImportExcel-help.xml
Module Name: ImportExcel
online version: https://github.com/dfinke/ImportExcel
schema: 2.0.0
---
# Export-MultipleExcelSheets
## SYNOPSIS
{{ Fill in the Synopsis }}
## SYNTAX
```
Export-MultipleExcelSheets [-Path] <Object> [-InfoMap] <Hashtable> [[-Password] <String>] [-Show] [-AutoSize] [<CommonParameters>]
```
## DESCRIPTION
{{ Fill in the Description }}
## EXAMPLES
### Example 1
```powershell
PS C:\> {{ Add example code here }}
```
{{ Add example description here }}
## PARAMETERS
### -AutoSize
{{ Fill AutoSize Description }}
```yaml
Type: SwitchParameter
Parameter Sets: (All)
Aliases:
Required: False
Position: Named
Default value: None
Accept pipeline input: False
Accept wildcard characters: False
```
### -InfoMap
{{ Fill InfoMap Description }}
```yaml
Type: Hashtable
Parameter Sets: (All)
Aliases:
Required: True
Position: 1
Default value: None
Accept pipeline input: False
Accept wildcard characters: False
```
### -Password
{{ Fill Password Description }}
```yaml
Type: String
Parameter Sets: (All)
Aliases:
Required: False
Position: 2
Default value: None
Accept pipeline input: False
Accept wildcard characters: False
```
### -Path
{{ Fill Path Description }}
```yaml
Type: Object
Parameter Sets: (All)
Aliases:
Required: True
Position: 0
Default value: None
Accept pipeline input: False
Accept wildcard characters: False
```
### -Show
{{ Fill Show Description }}
```yaml
Type: SwitchParameter
Parameter Sets: (All)
Aliases:
Required: False
Position: Named
Default value: None
Accept pipeline input: False
Accept wildcard characters: False
```
### CommonParameters
This cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see [about_CommonParameters](http://go.microsoft.com/fwlink/?LinkID=113216).
## INPUTS
### None
## OUTPUTS
### System.Object
## NOTES
## RELATED LINKS

View File

@@ -1,28 +0,0 @@
function Export-MultipleExcelSheets {
[Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSAvoidUsingPlainTextForPassword", "")]
[Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSUseSingularNouns", "", Justification="No suitable singular")]
param(
[Parameter(Mandatory = $true)]
$Path,
[Parameter(Mandatory = $true)]
[hashtable]$InfoMap,
[string]$Password,
[Switch]$Show,
[Switch]$AutoSize
)
$parameters = @{ } + $PSBoundParameters
$parameters.Remove("InfoMap")
$parameters.Remove("Show")
$parameters.Path = $ExecutionContext.SessionState.Path.GetUnresolvedProviderPathFromPSPath($Path)
foreach ($entry in $InfoMap.GetEnumerator()) {
Write-Progress -Activity "Exporting" -Status "$($entry.Key)"
$parameters.WorkSheetname = $entry.Key
& $entry.Value | Export-Excel @parameters
}
if ($Show) { Invoke-Item $Path }
}

View File

@@ -1,11 +1,11 @@
function Get-ExcelColumnName { function Get-ExcelColumnName {
param( param(
[Parameter(ValueFromPipeline=$true)] [Parameter(ValueFromPipeline=$true)]
$columnNumber=1 $ColumnNumber=1
) )
Process { Process {
$dividend = $columnNumber $dividend = $ColumnNumber
$columnName = New-Object System.Collections.ArrayList($null) $columnName = New-Object System.Collections.ArrayList($null)
while($dividend -gt 0) { while($dividend -gt 0) {
@@ -19,7 +19,7 @@ function Get-ExcelColumnName {
} }
[PSCustomObject] @{ [PSCustomObject] @{
ColumnNumber = $columnNumber ColumnNumber = $ColumnNumber
ColumnName = $columnName -join '' ColumnName = $columnName -join ''
} }

View File

@@ -0,0 +1,28 @@
function Get-ExcelFileSummary {
<#
.Synopsis
Gets summary information on an Excel file like number of rows, columns, and more
#>
param(
[Parameter(ValueFromPipelineByPropertyName, Mandatory)]
[Alias('FullName')]
$Path
)
Process {
$excel = Open-ExcelPackage -Path $Path
foreach ($workSheet in $excel.Workbook.Worksheets) {
[PSCustomObject][Ordered]@{
ExcelFile = Split-Path -Leaf $Path
WorksheetName = $workSheet.Name
Rows = $workSheet.Dimension.Rows
Columns = $workSheet.Dimension.Columns
Address = $workSheet.Dimension.Address
Path = Split-Path $Path
}
}
Close-ExcelPackage -ExcelPackage $excel -NoSave
}
}

View File

@@ -3,16 +3,16 @@
function Get-HtmlTable { function Get-HtmlTable {
param( param(
[Parameter(Mandatory=$true)] [Parameter(Mandatory=$true)]
$url, $Url,
$tableIndex=0, $TableIndex=0,
$Header, $Header,
[int]$FirstDataRow=0, [int]$FirstDataRow=0,
[Switch]$UseDefaultCredentials [Switch]$UseDefaultCredentials
) )
$r = Invoke-WebRequest $url -UseDefaultCredentials: $UseDefaultCredentials $r = Invoke-WebRequest $Url -UseDefaultCredentials: $UseDefaultCredentials
$table = $r.ParsedHtml.getElementsByTagName("table")[$tableIndex] $table = $r.ParsedHtml.getElementsByTagName("table")[$TableIndex]
$propertyNames=$Header $propertyNames=$Header
$totalRows=@($table.rows).count $totalRows=@($table.rows).count

View File

@@ -1,5 +1,5 @@
function Get-Range { function Get-Range {
[CmdletBinding()] [CmdletBinding()]
param($start=0,$stop,$step=1) param($Start=0,$Stop,$Step=1)
for ($idx = $start; $idx -lt $stop; $idx+=$step) {$idx} for ($idx = $Start; $idx -lt $Stop; $idx+=$Step) {$idx}
} }

View File

@@ -1,57 +0,0 @@
---
external help file: ImportExcel-help.xml
Module Name: ImportExcel
online version: https://github.com/dfinke/ImportExcel
schema: 2.0.0
---
# Get-XYRange
## SYNOPSIS
{{ Fill in the Synopsis }}
## SYNTAX
```
Get-XYRange [[-targetData] <Object>]
```
## DESCRIPTION
{{ Fill in the Description }}
## EXAMPLES
### Example 1
```powershell
PS C:\> {{ Add example code here }}
```
{{ Add example description here }}
## PARAMETERS
### -targetData
{{ Fill targetData Description }}
```yaml
Type: Object
Parameter Sets: (All)
Aliases:
Required: False
Position: 0
Default value: None
Accept pipeline input: False
Accept wildcard characters: False
```
## INPUTS
### None
## OUTPUTS
### System.Object
## NOTES
## RELATED LINKS

View File

@@ -1,8 +1,8 @@
function Get-XYRange { function Get-XYRange {
[CmdletBinding()] [CmdletBinding()]
param($targetData) param($TargetData)
$record = $targetData | Select-Object -First 1 $record = $TargetData | Select-Object -First 1
$p=$record.psobject.Properties.name $p=$record.psobject.Properties.name
$infer = for ($idx = 0; $idx -lt $p.Count; $idx++) { $infer = for ($idx = 0; $idx -lt $p.Count; $idx++) {

View File

@@ -115,7 +115,7 @@
try { try {
#Select worksheet #Select worksheet
if (-not $WorksheetName) { $Worksheet = $ExcelPackage.Workbook.Worksheets[1] } if (-not $WorksheetName) { $Worksheet = $ExcelPackage.Workbook.Worksheets[1] }
elseif (-not ($Worksheet = $ExcelPackage.Workbook.Worksheets[$WorkSheetName])) { elseif (-not ($Worksheet = $ExcelPackage.Workbook.Worksheets[$WorksheetName])) {
throw "Worksheet '$WorksheetName' not found, the workbook only contains the worksheets '$($ExcelPackage.Workbook.Worksheets)'. If you only wish to select the first worksheet, please remove the '-WorksheetName' parameter." ; return throw "Worksheet '$WorksheetName' not found, the workbook only contains the worksheets '$($ExcelPackage.Workbook.Worksheets)'. If you only wish to select the first worksheet, please remove the '-WorksheetName' parameter." ; return
} }
@@ -142,12 +142,12 @@
} }
else { else {
$Columns = $StartColumn .. $EndColumn ; if ($StartColumn -gt $EndColumn) { Write-Warning -Message "Selecting columns $StartColumn to $EndColumn might give odd results." } $Columns = $StartColumn .. $EndColumn ; if ($StartColumn -gt $EndColumn) { Write-Warning -Message "Selecting columns $StartColumn to $EndColumn might give odd results." }
if ($NoHeader) { $Rows = $StartRow..$EndRow ; if ($StartRow -gt $EndRow) { Write-Warning -Message "Selecting rows $StartRow to $EndRow might give odd results." } } if ($NoHeader) { $rows = $StartRow..$EndRow ; if ($StartRow -gt $EndRow) { Write-Warning -Message "Selecting rows $StartRow to $EndRow might give odd results." } }
elseif ($HeaderName) { $Rows = $StartRow..$EndRow } elseif ($HeaderName) { $rows = $StartRow..$EndRow }
else { else {
$Rows = (1 + $StartRow)..$EndRow $rows = (1 + $StartRow)..$EndRow
if ($StartRow -eq 1 -and $EndRow -eq 1) { if ($StartRow -eq 1 -and $EndRow -eq 1) {
$Rows = 0 $rows = 0
} }
} }
@@ -162,7 +162,7 @@
throw "Duplicate column headers found on row '$StartRow' in columns '$($Duplicates.Group.Column)'. Column headers must be unique, if this is not a requirement please use the '-NoHeader' or '-HeaderName' parameter."; return throw "Duplicate column headers found on row '$StartRow' in columns '$($Duplicates.Group.Column)'. Column headers must be unique, if this is not a requirement please use the '-NoHeader' or '-HeaderName' parameter."; return
} }
#endregion #endregion
if (-not $Rows) { if (-not $rows) {
Write-Warning "Worksheet '$WorksheetName' in workbook '$Path' contains no data in the rows after top row '$StartRow'" Write-Warning "Worksheet '$WorksheetName' in workbook '$Path' contains no data in the rows after top row '$StartRow'"
} }
else { else {
@@ -186,7 +186,7 @@
$TextColRegEx = New-Object -TypeName regex -ArgumentList $TextColExpression , 9 $TextColRegEx = New-Object -TypeName regex -ArgumentList $TextColExpression , 9
} }
else {$TextColRegEx = $null} else {$TextColRegEx = $null}
foreach ($R in $Rows) { foreach ($R in $rows) {
#Disabled write-verbose for speed #Disabled write-verbose for speed
# Write-Verbose "Import row '$R'" # Write-Verbose "Import row '$R'"
$NewRow = [Ordered]@{ } $NewRow = [Ordered]@{ }
@@ -213,7 +213,7 @@
#endregion #endregion
} }
} }
catch { throw "Failed importing the Excel workbook '$Path' with worksheet '$Worksheetname': $_"; return } catch { throw "Failed importing the Excel workbook '$Path' with worksheet '$WorksheetName': $_"; return }
finally { finally {
if ($Path) { $stream.close(); $ExcelPackage.Dispose() } if ($Path) { $stream.close(); $ExcelPackage.Dispose() }
} }

View File

@@ -2,8 +2,8 @@
function Import-Html { function Import-Html {
[CmdletBinding()] [CmdletBinding()]
param( param(
$url, $Url,
$index, $Index,
$Header, $Header,
[int]$FirstDataRow=0, [int]$FirstDataRow=0,
[Switch]$UseDefaultCredentials [Switch]$UseDefaultCredentials
@@ -14,7 +14,7 @@ function Import-Html {
Write-Verbose "Exporting to Excel file $($xlFile)" Write-Verbose "Exporting to Excel file $($xlFile)"
$data = Get-HtmlTable -url $url -tableIndex $index -Header $Header -FirstDataRow $FirstDataRow -UseDefaultCredentials: $UseDefaultCredentials $data = Get-HtmlTable -Url $Url -TableIndex $Index -Header $Header -FirstDataRow $FirstDataRow -UseDefaultCredentials: $UseDefaultCredentials
$data | Export-Excel $xlFile -Show -AutoSize $data | Export-Excel $xlFile -Show -AutoSize
} }

View File

@@ -1,17 +1,17 @@
function Invoke-Sum { function Invoke-Sum {
[CmdletBinding()] [CmdletBinding()]
param( param(
$data, $Data,
$dimension, $Dimension,
$measure $Measure
) )
if(!$measure) {$measure = $dimension} if(!$Measure) {$Measure = $Dimension}
$h=@{} $h=@{}
foreach ($item in $data){ foreach ($item in $Data){
$key=$item.$dimension $key=$item.$Dimension
if(!$key) {$key="[missing]"} if(!$key) {$key="[missing]"}
@@ -19,7 +19,7 @@ function Invoke-Sum {
$h.$key=[ordered]@{} $h.$key=[ordered]@{}
} }
foreach($m in $measure) { foreach($m in $Measure) {
$value = $item.$m $value = $item.$m
if($value -is [string] -or $value -is [System.Enum]) { if($value -is [string] -or $value -is [System.Enum]) {
$value = 1 $value = 1

View File

@@ -7,7 +7,7 @@
[Parameter(Mandatory = $true, ParameterSetName = "PackageDefault")] [Parameter(Mandatory = $true, ParameterSetName = "PackageDefault")]
[Parameter(Mandatory = $true, ParameterSetName = "PackageTable")] [Parameter(Mandatory = $true, ParameterSetName = "PackageTable")]
[OfficeOpenXml.ExcelPackage]$ExcelPackage, [OfficeOpenXml.ExcelPackage]$ExcelPackage,
$WorkSheetName = 'Combined', $WorksheetName = 'Combined',
[switch]$Clearsheet, [switch]$Clearsheet,
[switch]$NoHeader, [switch]$NoHeader,
[string]$FromLabel = "From" , [string]$FromLabel = "From" ,
@@ -55,10 +55,10 @@
) )
#region get target worksheet, select it and move it to the end. #region get target worksheet, select it and move it to the end.
if ($Path -and -not $ExcelPackage) {$ExcelPackage = Open-ExcelPackage -path $Path } if ($Path -and -not $ExcelPackage) {$ExcelPackage = Open-ExcelPackage -path $Path }
$destinationSheet = Add-Worksheet -ExcelPackage $ExcelPackage -WorkSheetname $WorkSheetName -ClearSheet:$Clearsheet $destinationSheet = Add-Worksheet -ExcelPackage $ExcelPackage -WorksheetName $WorksheetName -ClearSheet:$Clearsheet
foreach ($w in $ExcelPackage.Workbook.Worksheets) {$w.view.TabSelected = $false} foreach ($w in $ExcelPackage.Workbook.Worksheets) {$w.view.TabSelected = $false}
$destinationSheet.View.TabSelected = $true $destinationSheet.View.TabSelected = $true
$ExcelPackage.Workbook.Worksheets.MoveToEnd($WorkSheetName) $ExcelPackage.Workbook.Worksheets.MoveToEnd($WorksheetName)
#row to insert at will be 1 on a blank sheet and lastrow + 1 on populated one #row to insert at will be 1 on a blank sheet and lastrow + 1 on populated one
$row = (1 + $destinationSheet.Dimension.End.Row ) $row = (1 + $destinationSheet.Dimension.End.Row )
#endregion #endregion
@@ -123,7 +123,7 @@
'Title', 'TitleFillPattern', 'TitleBackgroundColor', 'TitleBold', 'TitleSize' | ForEach-Object {$null = $params.Remove($_)} 'Title', 'TitleFillPattern', 'TitleBackgroundColor', 'TitleBold', 'TitleSize' | ForEach-Object {$null = $params.Remove($_)}
if ($params.Keys.Count) { if ($params.Keys.Count) {
if ($Title) { $params.StartRow = 2} if ($Title) { $params.StartRow = 2}
$params.WorkSheetName = $WorkSheetName $params.WorksheetName = $WorksheetName
$params.ExcelPackage = $ExcelPackage $params.ExcelPackage = $ExcelPackage
Export-Excel @Params Export-Excel @Params
} }

View File

@@ -75,7 +75,7 @@
$orderByProperties = $merged[0].psobject.properties.where({$_.name -match "row$"}).name $orderByProperties = $merged[0].psobject.properties.where({$_.name -match "row$"}).name
Write-Progress -Activity "Merging sheets" -CurrentOperation "creating output sheet '$OutputSheetName' in $OutputFile" Write-Progress -Activity "Merging sheets" -CurrentOperation "creating output sheet '$OutputSheetName' in $OutputFile"
$excel = $merged | Sort-Object -Property $orderByProperties | $excel = $merged | Sort-Object -Property $orderByProperties |
Export-Excel -Path $OutputFile -Worksheetname $OutputSheetName -ClearSheet -BoldTopRow -AutoFilter -PassThru Export-Excel -Path $OutputFile -WorksheetName $OutputSheetName -ClearSheet -BoldTopRow -AutoFilter -PassThru
$sheet = $excel.Workbook.Worksheets[$OutputSheetName] $sheet = $excel.Workbook.Worksheets[$OutputSheetName]
#We will put in a conditional format for "if all the others are not flagged as 'same'" to mark rows where something is added, removed or changed #We will put in a conditional format for "if all the others are not flagged as 'same'" to mark rows where something is added, removed or changed
@@ -84,7 +84,7 @@
#All the 'difference' columns in the sheet are labeled with the file they came from, 'reference' columns need their #All the 'difference' columns in the sheet are labeled with the file they came from, 'reference' columns need their
#headers prefixed with the ref file name, $colnames is the basis of a regular expression to identify what should have $refPrefix appended #headers prefixed with the ref file name, $colnames is the basis of a regular expression to identify what should have $refPrefix appended
$colNames = @("^_Row$") $colNames = @("^_Row$")
if ($key -ne "*") if ($Key -ne "*")
{$colnames += "^$Key$"} {$colnames += "^$Key$"}
if ($filesToProcess.Count -ge 2) { if ($filesToProcess.Count -ge 2) {
$refPrefix = (Split-Path -Path $filestoProcess[0] -Leaf) -replace "\.xlsx$"," " $refPrefix = (Split-Path -Path $filestoProcess[0] -Leaf) -replace "\.xlsx$"," "

View File

@@ -122,8 +122,8 @@
foreach ($p in $Property) { $propList += ($headings.where({$_ -like $p}) )} foreach ($p in $Property) { $propList += ($headings.where({$_ -like $p}) )}
foreach ($p in $ExcludeProperty) { $propList = $propList.where({$_ -notlike $p}) } foreach ($p in $ExcludeProperty) { $propList = $propList.where({$_ -notlike $p}) }
if (($propList -notcontains $Key) -and if (($propList -notcontains $Key) -and
('*' -ne $Key)) { $propList += $Key} #If $key isn't one of the headings we will have bailed by now ('*' -ne $Key)) { $propList += $Key} #If $Key isn't one of the headings we will have bailed by now
$propList = $propList | Select-Object -Unique #so, prolist must contain at least $key if nothing else $propList = $propList | Select-Object -Unique #so, prolist must contain at least $Key if nothing else
#If key is "*" we treat it differently , and we will create a script property which concatenates all the Properties in $Proplist #If key is "*" we treat it differently , and we will create a script property which concatenates all the Properties in $Proplist
$ConCatblock = [scriptblock]::Create( ($proplist | ForEach-Object {'$this."' + $_ + '"'}) -join " + ") $ConCatblock = [scriptblock]::Create( ($proplist | ForEach-Object {'$this."' + $_ + '"'}) -join " + ")
@@ -131,12 +131,12 @@
#Build the list of the properties to output, in order. #Build the list of the properties to output, in order.
$diffpart = @() $diffpart = @()
$refpart = @() $refpart = @()
foreach ($p in $proplist.Where({$key -ne $_}) ) {$refPart += $p ; $diffPart += "$DiffPrefix $p" } foreach ($p in $proplist.Where({$Key -ne $_}) ) {$refPart += $p ; $diffPart += "$DiffPrefix $p" }
$lastRefColNo = $proplist.count $lastRefColNo = $proplist.count
$FirstDiffColNo = $lastRefColNo + 1 $FirstDiffColNo = $lastRefColNo + 1
if ($key -ne '*') { if ($Key -ne '*') {
$outputProps = @($key) + $refpart + $diffpart $outputProps = @($Key) + $refpart + $diffpart
#If we are using a single column as the key, don't duplicate it, so the last difference column will be A if there is one property, C if there are two, E if there are 3 #If we are using a single column as the key, don't duplicate it, so the last difference column will be A if there is one property, C if there are two, E if there are 3
$lastDiffColNo = (2 * $proplist.count) - 1 $lastDiffColNo = (2 * $proplist.count) - 1
} }
@@ -151,7 +151,7 @@
#the row in the other sheet might be different so we will look up the row number from the key field - build a hash table for that here #the row in the other sheet might be different so we will look up the row number from the key field - build a hash table for that here
#If we have "*" as the key ad the script property to concatenate the [selected] properties. #If we have "*" as the key ad the script property to concatenate the [selected] properties.
$Rowhash = @{} $rowHash = @{}
$rowNo = $firstDataRow $rowNo = $firstDataRow
foreach ($row in $ReferenceObject) { foreach ($row in $ReferenceObject) {
if ($null -eq $row._row) {Add-Member -InputObject $row -MemberType NoteProperty -Value ($rowNo ++) -Name "_Row" } if ($null -eq $row._row) {Add-Member -InputObject $row -MemberType NoteProperty -Value ($rowNo ++) -Name "_Row" }
@@ -163,23 +163,23 @@
Add-Member -InputObject $row -MemberType NoteProperty -Value $rowNo -Name "$DiffPrefix Row" -Force Add-Member -InputObject $row -MemberType NoteProperty -Value $rowNo -Name "$DiffPrefix Row" -Force
if ($Key -eq '*' ) { if ($Key -eq '*' ) {
Add-Member -InputObject $row -MemberType ScriptProperty -Value $ConCatblock -Name "_All" Add-Member -InputObject $row -MemberType ScriptProperty -Value $ConCatblock -Name "_All"
$Rowhash[$row._All] = $rowNo $rowHash[$row._All] = $rowNo
} }
else {$Rowhash[$row.$key] = $rowNo } else {$rowHash[$row.$Key] = $rowNo }
$rowNo ++ $rowNo ++
} }
if ($DifferenceObject.count -gt $Rowhash.Keys.Count) { if ($DifferenceObject.count -gt $rowHash.Keys.Count) {
Write-Warning -Message "Difference object has $($DifferenceObject.Count) rows; but only $($Rowhash.keys.count) unique keys" Write-Warning -Message "Difference object has $($DifferenceObject.Count) rows; but only $($rowHash.keys.count) unique keys"
} }
if ($Key -eq '*') {$key = "_ALL"} if ($Key -eq '*') {$Key = "_ALL"}
#endregion #endregion
#We need to know all the properties we've met on the objects we've diffed #We need to know all the properties we've met on the objects we've diffed
$eDiffProps = [ordered]@{} $eDiffProps = [ordered]@{}
#When we do a compare object changes will result in two rows so we group them and join them together. #When we do a compare object changes will result in two rows so we group them and join them together.
$expandedDiff = Compare-Object -ReferenceObject $ReferenceObject -DifferenceObject $DifferenceObject -Property $propList -PassThru -IncludeEqual | $expandedDiff = Compare-Object -ReferenceObject $ReferenceObject -DifferenceObject $DifferenceObject -Property $propList -PassThru -IncludeEqual |
Group-Object -Property $key | ForEach-Object { Group-Object -Property $Key | ForEach-Object {
#The value of the key column is the name of the Group. #The value of the key column is the name of the Group.
$keyval = $_.name $keyVal = $_.name
#we're going to create a custom object from a hash table. #we're going to create a custom object from a hash table.
$hash = [ordered]@{} $hash = [ordered]@{}
foreach ($result in $_.Group) { foreach ($result in $_.Group) {
@@ -187,7 +187,7 @@
elseif (-not $hash["$DiffPrefix Row"]) {$hash["_Row"] = "" } elseif (-not $hash["$DiffPrefix Row"]) {$hash["_Row"] = "" }
#if we have already set the side, this must be the second record, so set side to indicate "changed"; if we got two "Same" indicators we may have a classh of keys #if we have already set the side, this must be the second record, so set side to indicate "changed"; if we got two "Same" indicators we may have a classh of keys
if ($hash.Side) { if ($hash.Side) {
if ($hash.Side -eq $result.SideIndicator) {Write-Warning -Message "'$keyval' may be a duplicate."} if ($hash.Side -eq $result.SideIndicator) {Write-Warning -Message "'$keyVal' may be a duplicate."}
$hash.Side = "<>" $hash.Side = "<>"
} }
else {$hash["Side"] = $result.SideIndicator} else {$hash["Side"] = $result.SideIndicator}
@@ -204,10 +204,10 @@
'<=' { $hash["$DiffPrefix is"] = 'Removed'} '<=' { $hash["$DiffPrefix is"] = 'Removed'}
} }
#find the number of the row in the the "difference" object which has this key. If it is the object is only in the reference this will be blank. #find the number of the row in the the "difference" object which has this key. If it is the object is only in the reference this will be blank.
$hash["$DiffPrefix Row"] = $Rowhash[$keyval] $hash["$DiffPrefix Row"] = $rowHash[$keyVal]
$hash[$key] = $keyval $hash[$Key] = $keyVal
#Create FieldName and/or =>FieldName columns #Create FieldName and/or =>FieldName columns
foreach ($p in $result.psobject.Properties.name.where({$_ -ne $key -and $_ -ne "SideIndicator" -and $_ -ne "$DiffPrefix Row" })) { foreach ($p in $result.psobject.Properties.name.where({$_ -ne $Key -and $_ -ne "SideIndicator" -and $_ -ne "$DiffPrefix Row" })) {
if ($result.SideIndicator -eq "==" -and $p -in $propList) if ($result.SideIndicator -eq "==" -and $p -in $propList)
{$hash[("$p")] = $hash[("$DiffPrefix $p")] = $result.$P} {$hash[("$p")] = $hash[("$DiffPrefix $p")] = $result.$P}
elseif ($result.SideIndicator -eq "==" -or $result.SideIndicator -eq "<=") elseif ($result.SideIndicator -eq "==" -or $result.SideIndicator -eq "<=")
@@ -233,7 +233,7 @@
elseif ($PSCmdlet.ShouldProcess($OutputFile,"Write Output to Excel file")) { elseif ($PSCmdlet.ShouldProcess($OutputFile,"Write Output to Excel file")) {
$expandedDiff = $expandedDiff | Sort-Object -Property "_row", "$DiffPrefix Row" $expandedDiff = $expandedDiff | Sort-Object -Property "_row", "$DiffPrefix Row"
$xl = $expandedDiff | Select-Object -Property $OutputProps | Update-FirstObjectProperties | $xl = $expandedDiff | Select-Object -Property $OutputProps | Update-FirstObjectProperties |
Export-Excel -Path $OutputFile -Worksheetname $OutputSheetName -FreezeTopRow -BoldTopRow -AutoSize -AutoFilter -PassThru Export-Excel -Path $OutputFile -WorksheetName $OutputSheetName -FreezeTopRow -BoldTopRow -AutoSize -AutoFilter -PassThru
$ws = $xl.Workbook.Worksheets[$OutputSheetName] $ws = $xl.Workbook.Worksheets[$OutputSheetName]
for ($i = 0; $i -lt $expandedDiff.Count; $i++ ) { for ($i = 0; $i -lt $expandedDiff.Count; $i++ ) {
if ( $expandedDiff[$i].side -ne "==" ) { if ( $expandedDiff[$i].side -ne "==" ) {

View File

@@ -5,7 +5,7 @@ function New-PivotTableDefinition {
[Parameter(Mandatory)] [Parameter(Mandatory)]
[Alias("PivtoTableName")]#Previous typo - use alias to avoid breaking scripts [Alias("PivtoTableName")]#Previous typo - use alias to avoid breaking scripts
$PivotTableName, $PivotTableName,
$SourceWorkSheet, $SourceWorksheet,
$SourceRange, $SourceRange,
$PivotRows, $PivotRows,
[hashtable]$PivotData, [hashtable]$PivotData,

View File

@@ -1,10 +1,10 @@
function Open-ExcelPackage { function Open-ExcelPackage {
[CmdLetBinding()] [CmdLetBinding()]
[Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSAvoidUsingPlainTextForPassword","")] [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSAvoidUsingPlainTextForPassword", "")]
[OutputType([OfficeOpenXml.ExcelPackage])] [OutputType([OfficeOpenXml.ExcelPackage])]
param( param(
#The path to the file to open. #The path to the file to open.
[Parameter(Mandatory=$true)]$Path, [Parameter(Mandatory = $true)]$Path,
#If specified, any running instances of Excel will be terminated before opening the file. #If specified, any running instances of Excel will be terminated before opening the file.
[switch]$KillExcel, [switch]$KillExcel,
#The password for a protected worksheet, as a [normal] string (not a secure string). #The password for a protected worksheet, as a [normal] string (not a secure string).
@@ -13,7 +13,7 @@
[switch]$Create [switch]$Create
) )
if($KillExcel) { if ($KillExcel) {
Get-Process -Name "excel" -ErrorAction Ignore | Stop-Process Get-Process -Name "excel" -ErrorAction Ignore | Stop-Process
while (Get-Process -Name "excel" -ErrorAction Ignore) {} while (Get-Process -Name "excel" -ErrorAction Ignore) {}
} }
@@ -24,21 +24,26 @@
#Create the directory if required. #Create the directory if required.
$targetPath = Split-Path -Parent -Path $Path $targetPath = Split-Path -Parent -Path $Path
if (!(Test-Path -Path $targetPath)) { if (!(Test-Path -Path $targetPath)) {
Write-Debug "Base path $($targetPath) does not exist, creating" Write-Debug "Base path $($targetPath) does not exist, creating"
$null = New-item -ItemType Directory -Path $targetPath -ErrorAction Ignore $null = New-item -ItemType Directory -Path $targetPath -ErrorAction Ignore
} }
New-Object -TypeName OfficeOpenXml.ExcelPackage -ArgumentList $Path New-Object -TypeName OfficeOpenXml.ExcelPackage -ArgumentList $Path
} }
elseif (Test-Path -Path $path) { elseif (Test-Path -Path $path) {
if ($Password) {$pkgobj = New-Object -TypeName OfficeOpenXml.ExcelPackage -ArgumentList $Path , $Password } if ($Password) { $pkgobj = New-Object -TypeName OfficeOpenXml.ExcelPackage -ArgumentList $Path , $Password }
else {$pkgobj = New-Object -TypeName OfficeOpenXml.ExcelPackage -ArgumentList $Path } else { $pkgobj = New-Object -TypeName OfficeOpenXml.ExcelPackage -ArgumentList $Path }
if ($pkgobj) { if ($pkgobj) {
foreach ($w in $pkgobj.Workbook.Worksheets) { foreach ($w in $pkgobj.Workbook.Worksheets) {
$sb = [scriptblock]::Create(('$this.workbook.Worksheets["{0}"]' -f $w.name)) $sb = [scriptblock]::Create(('$this.workbook.Worksheets["{0}"]' -f $w.name))
Add-Member -InputObject $pkgobj -MemberType ScriptProperty -Name $w.name -Value $sb try {
Add-Member -InputObject $pkgobj -MemberType ScriptProperty -Name $w.name -Value $sb -ErrorAction Stop
}
catch {
Write-Warning "Could not add sheet $($w.name) as 'short cut', you need to access it via `$wb.Worksheets['$($w.name)'] "
}
} }
return $pkgobj return $pkgobj
} }
} }
else {Write-Warning "Could not find $path" } else { Write-Warning "Could not find $path" }
} }

85
Public/Read-Clipboard.ps1 Normal file
View File

@@ -0,0 +1,85 @@
#Requires -Version 5
function Read-Clipboard {
<#
.SYNOPSIS
Read text from clipboard and pass to either ConvertFrom-Csv or ConvertFrom-Json.
Check out the how to video - https://youtu.be/dv2GOH5sbpA
.DESCRIPTION
Read text from clipboard. It can read CSV or JSON. Plus, you can specify the delimiter and headers.
.EXAMPLE
Read-Clipboard # Detects if the clipboard contains CSV, JSON, or Tab delimited data.
.EXAMPLE
Read-Clipboard -Delimiter '|' # Converts data using a pipe delimiter
.EXAMPLE
Read-Clipboard -Header 'P1', 'P2', 'P3' # Specify the header columns to be used
#>
param(
$Delimiter,
$Header
)
if ($IsLinux -or $IsMacOS) {
Write-Error "Read-Clipboard only runs on Windows"
return
}
$cvtParams = @{
Data = Get-Clipboard -Raw
}
if ($Delimiter) {
$cvtParams.Delimiter = $Delimiter
}
if ($Header) {
$cvtParams.Header = $Header
}
ReadClipboardImpl @cvtParams
}
function ReadClipboardImpl {
param(
[Parameter(Mandatory)]
[ValidateNotNullOrEmpty()]
[String] $data,
$Delimiter,
$Header
)
if (!$PSBoundParameters.ContainsKey('Delimiter') -and !$PSBoundParameters.ContainsKey('Header')) {
try {
ConvertFrom-Json $data
}
catch {
$dataLines = @($data -split "`r`n?" | Select-Object -First 1)
if ($dataLines[0].indexOf(',') -gt -1) {
ConvertFrom-Csv $data
}
else {
ConvertFrom-Csv $data -Delimiter "`t"
}
}
}
else {
$cvtParams = @{
InputObject = $data
}
if ($Delimiter) {
$cvtParams.Delimiter = $Delimiter
}
if ($Header) {
$cvtParams.Header = $Header
}
ConvertFrom-Csv @cvtParams
}
}

View File

@@ -9,7 +9,7 @@
[Parameter(ParameterSetName="ExistingSession", Mandatory=$true)] [Parameter(ParameterSetName="ExistingSession", Mandatory=$true)]
$Session, $Session,
[Parameter(ParameterSetName="SQLConnection", Mandatory=$true)] [Parameter(ParameterSetName="SQLConnection", Mandatory=$true)]
[switch]$MsSQLserver, [switch]$MsSqlServer,
[Parameter(ParameterSetName="SQLConnection")] [Parameter(ParameterSetName="SQLConnection")]
[String]$DataBase, [String]$DataBase,
[Parameter(ParameterSetName="SQLConnection", Mandatory=$true)] [Parameter(ParameterSetName="SQLConnection", Mandatory=$true)]
@@ -46,10 +46,10 @@
$null = $PSBoundParameters.Remove('AutoFilter') $null = $PSBoundParameters.Remove('AutoFilter')
} }
#endregion #endregion
#region if we were either given a session object or a connection string (& optionally -MSSQLServer) make sure we can connect #region if we were either given a session object or a connection string (& optionally -MsSqlServer) make sure we can connect
try { try {
#If we got -MSSQLServer, create a SQL connection, if we didn't but we got -Connection create an ODBC connection #If we got -MsSqlServer, create a SQL connection, if we didn't but we got -Connection create an ODBC connection
if ($MsSQLserver -and $Connection) { if ($MsSqlServer -and $Connection) {
if ($Connection -notmatch '=') {$Connection = "server=$Connection;trusted_connection=true;timeout=60"} if ($Connection -notmatch '=') {$Connection = "server=$Connection;trusted_connection=true;timeout=60"}
$Session = New-Object -TypeName System.Data.SqlClient.SqlConnection -ArgumentList $Connection $Session = New-Object -TypeName System.Data.SqlClient.SqlConnection -ArgumentList $Connection
if ($Session.State -ne 'Open') {$Session.Open()} if ($Session.State -ne 'Open') {$Session.Open()}
@@ -90,7 +90,7 @@
#endregion #endregion
#region send the table to Excel #region send the table to Excel
#remove parameters which relate to querying SQL, leaving the ones used by Export-Excel #remove parameters which relate to querying SQL, leaving the ones used by Export-Excel
'Connection' , 'Database' , 'Session' , 'MsSQLserver' , 'SQL' , 'DataTable' , 'QueryTimeout' , 'Force' | 'Connection' , 'Database' , 'Session' , 'MsSqlServer' , 'SQL' , 'DataTable' , 'QueryTimeout' , 'Force' |
ForEach-Object {$null = $PSBoundParameters.Remove($_) } ForEach-Object {$null = $PSBoundParameters.Remove($_) }
#if force was specified export even if there are no rows. If there are no columns, the query failed and export "null" if forced #if force was specified export even if there are no rows. If there are no columns, the query failed and export "null" if forced
if ($DataTable.Rows.Count) { if ($DataTable.Rows.Count) {

View File

@@ -8,7 +8,7 @@
[Parameter(ParameterSetName="Package",Mandatory=$true)] [Parameter(ParameterSetName="Package",Mandatory=$true)]
[OfficeOpenXml.ExcelPackage]$ExcelPackage, [OfficeOpenXml.ExcelPackage]$ExcelPackage,
[Parameter(ParameterSetName="Package")] [Parameter(ParameterSetName="Package")]
[String]$Worksheetname = "Sheet1", [String]$WorksheetName = "Sheet1",
[Parameter(ParameterSetName="sheet",Mandatory=$true)] [Parameter(ParameterSetName="sheet",Mandatory=$true)]
[OfficeOpenXml.ExcelWorksheet]$Worksheet, [OfficeOpenXml.ExcelWorksheet]$Worksheet,
[Parameter(ValueFromPipeline=$true)] [Parameter(ValueFromPipeline=$true)]
@@ -52,10 +52,10 @@
begin { begin {
#if we were passed a package object and a worksheet name , get the worksheet. #if we were passed a package object and a worksheet name , get the worksheet.
if ($ExcelPackage) { if ($ExcelPackage) {
if ($ExcelPackage.Workbook.Worksheets.Name -notcontains $Worksheetname) { if ($ExcelPackage.Workbook.Worksheets.Name -notcontains $WorksheetName) {
throw "The Workbook does not contain a sheet named '$Worksheetname'" throw "The Workbook does not contain a sheet named '$WorksheetName'"
} }
else {$Worksheet = $ExcelPackage.Workbook.Worksheets[$Worksheetname] } else {$Worksheet = $ExcelPackage.Workbook.Worksheets[$WorksheetName] }
} }
#In a script block to build a formula, we may want any of corners or the column name, #In a script block to build a formula, we may want any of corners or the column name,
@@ -66,7 +66,7 @@
$endRow = $Worksheet.Dimension.End.Row $endRow = $Worksheet.Dimension.End.Row
} }
process { process {
if ($null -eq $workSheet.Dimension) {Write-Warning "Can't format an empty worksheet."; return} if ($null -eq $Worksheet.Dimension) {Write-Warning "Can't format an empty worksheet."; return}
if ($Column -eq 0 ) {$Column = $endColumn + 1 } if ($Column -eq 0 ) {$Column = $endColumn + 1 }
$columnName = (New-Object 'OfficeOpenXml.ExcelCellAddress' @(1, $column)).Address -replace "1","" $columnName = (New-Object 'OfficeOpenXml.ExcelCellAddress' @(1, $column)).Address -replace "1",""
Write-Verbose -Message "Updating Column $columnName" Write-Verbose -Message "Updating Column $columnName"
@@ -120,7 +120,7 @@
Set-ExcelRange -Worksheet $Worksheet -Range $theRange @params Set-ExcelRange -Worksheet $Worksheet -Range $theRange @params
} }
#endregion #endregion
if ($PSBoundParameters.ContainsKey('Hide')) {$workSheet.Column($Column).Hidden = [bool]$Hide} if ($PSBoundParameters.ContainsKey('Hide')) {$Worksheet.Column($Column).Hidden = [bool]$Hide}
#return the new data if -passthru was specified. #return the new data if -passthru was specified.
if ($PassThru) { $Worksheet.Column($Column)} if ($PassThru) { $Worksheet.Column($Column)}
elseif ($ReturnRange) { $theRange} elseif ($ReturnRange) { $theRange}

View File

@@ -8,7 +8,7 @@
[Parameter(ParameterSetName="Package",Mandatory=$true)] [Parameter(ParameterSetName="Package",Mandatory=$true)]
[OfficeOpenXml.ExcelPackage]$ExcelPackage, [OfficeOpenXml.ExcelPackage]$ExcelPackage,
[Parameter(ParameterSetName="Package")] [Parameter(ParameterSetName="Package")]
$Worksheetname = "Sheet1", $WorksheetName = "Sheet1",
[Parameter(ParameterSetName="Sheet",Mandatory=$true)] [Parameter(ParameterSetName="Sheet",Mandatory=$true)]
[OfficeOpenXml.Excelworksheet] $Worksheet, [OfficeOpenXml.Excelworksheet] $Worksheet,
[Parameter(ValueFromPipeline = $true)] [Parameter(ValueFromPipeline = $true)]
@@ -53,10 +53,10 @@
begin { begin {
#if we were passed a package object and a worksheet name , get the worksheet. #if we were passed a package object and a worksheet name , get the worksheet.
if ($ExcelPackage) { if ($ExcelPackage) {
if ($ExcelPackage.Workbook.Worksheets.Name -notcontains $Worksheetname) { if ($ExcelPackage.Workbook.Worksheets.Name -notcontains $WorksheetName) {
throw "The Workbook does not contain a sheet named '$Worksheetname'" throw "The Workbook does not contain a sheet named '$WorksheetName'"
} }
else {$Worksheet = $ExcelPackage.Workbook.Worksheets[$Worksheetname] } else {$Worksheet = $ExcelPackage.Workbook.Worksheets[$WorksheetName] }
} }
#In a script block to build a formula, we may want any of corners or the columnname, #In a script block to build a formula, we may want any of corners or the columnname,
#if row and start column aren't specified assume first unused row, and first column #if row and start column aren't specified assume first unused row, and first column
@@ -66,7 +66,7 @@
$endRow = $Worksheet.Dimension.End.Row $endRow = $Worksheet.Dimension.End.Row
} }
process { process {
if ($null -eq $workSheet.Dimension) {Write-Warning "Can't format an empty worksheet."; return} if ($null -eq $Worksheet.Dimension) {Write-Warning "Can't format an empty worksheet."; return}
if ($Row -eq 0 ) {$Row = $endRow + 1 } if ($Row -eq 0 ) {$Row = $endRow + 1 }
Write-Verbose -Message "Updating Row $Row" Write-Verbose -Message "Updating Row $Row"
#Add a row label #Add a row label
@@ -117,7 +117,7 @@
Set-ExcelRange -Worksheet $Worksheet -Range $theRange @params Set-ExcelRange -Worksheet $Worksheet -Range $theRange @params
} }
#endregion #endregion
if ($PSBoundParameters.ContainsKey('Hide')) {$workSheet.Row($Row).Hidden = [bool]$Hide} if ($PSBoundParameters.ContainsKey('Hide')) {$Worksheet.Row($Row).Hidden = [bool]$Hide}
#return the new data if -passthru was specified. #return the new data if -passthru was specified.
if ($passThru) {$Worksheet.Row($Row)} if ($passThru) {$Worksheet.Row($Row)}
elseif ($ReturnRange) {$theRange} elseif ($ReturnRange) {$theRange}

6
PublishToGallery.ps1 Normal file
View File

@@ -0,0 +1,6 @@
$p = @{
Name = "ImportExcel"
NuGetApiKey = $NuGetApiKey
}
Publish-Module @p

1082
README.md

File diff suppressed because it is too large Load Diff

74
SUMMARY.md Normal file
View File

@@ -0,0 +1,74 @@
# Table of contents
* [README](README.md)
* [InferData](inferdata/README.md)
* [Test-Boolean](inferdata/test-boolean.md)
* [Invoke-AllTests](inferdata/invoke-alltests.md)
* [Test-Integer](inferdata/test-integer.md)
* [Test-String](inferdata/test-string.md)
* [Test-Date](inferdata/test-date.md)
* [Test-Number](inferdata/test-number.md)
* [mdHelp](mdhelp/README.md)
* [en](mdhelp/en/README.md)
* [Expand-NumberFormat](mdhelp/en/expand-numberformat.md)
* [Open-ExcelPackage](mdhelp/en/open-excelpackage.md)
* [Add-ExcelChart](mdhelp/en/add-excelchart.md)
* [Copy-ExcelWorkSheet](mdhelp/en/copy-excelworksheet.md)
* [Set-ExcelRange](mdhelp/en/set-excelrange.md)
* [Import-Excel](mdhelp/en/import-excel.md)
* [Set-ExcelRow](mdhelp/en/set-excelrow.md)
* [Get-ExcelSheetInfo](mdhelp/en/get-excelsheetinfo.md)
* [New-PivotTableDefinition](mdhelp/en/new-pivottabledefinition.md)
* [Add-ExcelDataValidationRule](mdhelp/en/add-exceldatavalidationrule.md)
* [Join-Worksheet](mdhelp/en/join-worksheet.md)
* [New-ConditionalFormattingIconSet](mdhelp/en/new-conditionalformattingiconset.md)
* [Send-SQLDataToExcel](mdhelp/en/send-sqldatatoexcel.md)
* [Get-ExcelWorkbookInfo](mdhelp/en/get-excelworkbookinfo.md)
* [New-ConditionalText](mdhelp/en/new-conditionaltext.md)
* [Compare-WorkSheet](mdhelp/en/compare-worksheet.md)
* [New-ExcelChartDefinition](mdhelp/en/new-excelchartdefinition.md)
* [Remove-WorkSheet](mdhelp/en/remove-worksheet.md)
* [ConvertFrom-ExcelToSQLInsert](mdhelp/en/convertfrom-exceltosqlinsert.md)
* [Close-ExcelPackage](mdhelp/en/close-excelpackage.md)
* [Set-ExcelColumn](mdhelp/en/set-excelcolumn.md)
* [Add-WorkSheet](mdhelp/en/add-worksheet.md)
* [Add-ExcelTable](mdhelp/en/add-exceltable.md)
* [Convert-ExcelRangeToImage](mdhelp/en/convert-excelrangetoimage.md)
* [Add-ConditionalFormatting](mdhelp/en/add-conditionalformatting.md)
* [Update-FirstObjectProperties](mdhelp/en/update-firstobjectproperties.md)
* [Export-Excel](mdhelp/en/export-excel.md)
* [Select-Worksheet](mdhelp/en/select-worksheet.md)
* [Merge-Worksheet](mdhelp/en/merge-worksheet.md)
* [Merge-MultipleSheets](mdhelp/en/merge-multiplesheets.md)
* [Add-ExcelName](mdhelp/en/add-excelname.md)
* [ConvertFrom-ExcelSheet](mdhelp/en/convertfrom-excelsheet.md)
* [Add-PivotTable](mdhelp/en/add-pivottable.md)
* [Public](public/README.md)
* [Import-USPS](public/import-usps.md)
* [Get-Range](public/get-range.md)
* [Get-XYRange](public/get-xyrange.md)
* [Set-CellStyle](public/set-cellstyle.md)
* [Invoke-Sum](public/invoke-sum.md)
* [Get-ExcelColumnName](public/get-excelcolumnname.md)
* [Import-UPS](public/import-ups.md)
* [Set-WorksheetProtection](public/set-worksheetprotection.md)
* [New-Plot](public/new-plot.md)
* [Import-Html](public/import-html.md)
* [New-ExcelStyle](public/new-excelstyle.md)
* [ConvertFrom-ExcelData](public/convertfrom-exceldata.md)
* [ConvertTo-ExcelXlsx](public/convertto-excelxlsx.md)
* [New-PSItem](public/new-psitem.md)
* [Get-HtmlTable](public/get-htmltable.md)
* [Charting](charting/README.md)
* [LineChart](charting/linechart.md)
* [PieChart](charting/piechart.md)
* [ColumnChart](charting/columnchart.md)
* [BarChart](charting/barchart.md)
* [DoChart](charting/dochart.md)
* [Examples](examples/README.md)
* [Untitled](examples/untitled.md)
* [Charts](examples/charts/README.md)
* [Multiplecharts](examples/charts/multiplecharts.md)
* [Pivot](pivot/README.md)
* [Pivot](pivot/pivot.md)

View File

@@ -12,6 +12,9 @@ Describe "Compare Worksheet" {
} }
} }
else { Add-Type -AssemblyName System.Windows.Forms } #> else { Add-Type -AssemblyName System.Windows.Forms } #>
if (-not (Get-command Get-Service -ErrorAction SilentlyContinue)) {
Function Get-Service {Import-Clixml $PSScriptRoot\Mockservices.xml}
}
. "$PSScriptRoot\Samples\Samples.ps1" . "$PSScriptRoot\Samples\Samples.ps1"
Remove-Item -Path "TestDrive:\server*.xlsx" Remove-Item -Path "TestDrive:\server*.xlsx"
[System.Collections.ArrayList]$s = Get-Service | Select-Object -first 25 -Property Name, RequiredServices, CanPauseAndContinue, CanShutdown, CanStop, DisplayName, DependentServices, MachineName [System.Collections.ArrayList]$s = Get-Service | Select-Object -first 25 -Property Name, RequiredServices, CanPauseAndContinue, CanShutdown, CanStop, DisplayName, DependentServices, MachineName
@@ -196,6 +199,9 @@ Describe "Compare Worksheet" {
Describe "Merge Worksheet" { Describe "Merge Worksheet" {
BeforeAll { BeforeAll {
if (-not (Get-command Get-Service -ErrorAction SilentlyContinue)) {
Function Get-Service {Import-Clixml $PSScriptRoot\Mockservices.xml}
}
Remove-Item -Path "TestDrive:\server*.xlsx" , "TestDrive:\combined*.xlsx" -ErrorAction SilentlyContinue Remove-Item -Path "TestDrive:\server*.xlsx" , "TestDrive:\combined*.xlsx" -ErrorAction SilentlyContinue
[System.Collections.ArrayList]$s = Get-service | Select-Object -first 25 -Property * [System.Collections.ArrayList]$s = Get-service | Select-Object -first 25 -Property *
@@ -261,6 +267,11 @@ Describe "Merge Worksheet" {
} }
} }
Describe "Merge Multiple sheets" { Describe "Merge Multiple sheets" {
BeforeAll {
if (-not (Get-command Get-Service -ErrorAction SilentlyContinue)) {
Function Get-Service {Import-Clixml $PSScriptRoot\Mockservices.xml}
}
}
Context "Merge 3 sheets with 3 properties" { Context "Merge 3 sheets with 3 properties" {
BeforeAll { BeforeAll {
Remove-Item -Path "TestDrive:\server*.xlsx" , "TestDrive:\combined*.xlsx" -ErrorAction SilentlyContinue Remove-Item -Path "TestDrive:\server*.xlsx" , "TestDrive:\combined*.xlsx" -ErrorAction SilentlyContinue

View File

@@ -1,19 +1,18 @@
[Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseDeclaredVarsMoreThanAssignments','',Justification='False Positives')]
$scriptPath = Split-Path -Path $MyInvocation.MyCommand.path -Parent
$dataPath = Join-Path -Path $scriptPath -ChildPath "First10Races.xlsx"
$Outpath = "TestDrive:\"
Describe 'ConvertFrom-ExcelSheet / Export-ExcelSheet' { Describe 'ConvertFrom-ExcelSheet / Export-ExcelSheet' {
BeforeAll { BeforeAll {
$scriptPath = $PSScriptRoot
$dataPath = Join-Path -Path $scriptPath -ChildPath "First10Races.xlsx"
$Outpath = "TestDrive:\"
ConvertFrom-ExcelSheet -Path $dataPath -OutputPath $Outpath ConvertFrom-ExcelSheet -Path $dataPath -OutputPath $Outpath
$firstText = Get-Content (Join-path -Path $Outpath -ChildPath "First10Races.csv") $script:firstText = Get-Content (Join-path -Path $Outpath -ChildPath "First10Races.csv")
ConvertFrom-ExcelSheet -Path $dataPath -OutputPath $Outpath -AsText GridPosition,date ConvertFrom-ExcelSheet -Path $dataPath -OutputPath $Outpath -AsText GridPosition, date
$SecondText = Get-Content (Join-path -Path $Outpath -ChildPath "First10Races.csv") $script:SecondText = Get-Content (Join-path -Path $Outpath -ChildPath "First10Races.csv")
ConvertFrom-ExcelSheet -Path $dataPath -OutputPath $Outpath -AsText "GridPosition" -Property driver, ConvertFrom-ExcelSheet -Path $dataPath -OutputPath $Outpath -AsText "GridPosition" -Property driver,
@{n="date"; e={[datetime]::FromOADate($_.Date).tostring("#MM/dd/yyyy#")}} , FinishPosition, GridPosition @{n = "date"; e = { [datetime]::FromOADate($_.Date).tostring("#MM/dd/yyyy#") } } , FinishPosition, GridPosition
$ThirdText = Get-Content (Join-path -Path $Outpath -ChildPath "First10Races.csv") $script:ThirdText = Get-Content (Join-path -Path $Outpath -ChildPath "First10Races.csv")
ConvertFrom-ExcelSheet -Path $dataPath -OutputPath $Outpath -AsDate "date" ConvertFrom-ExcelSheet -Path $dataPath -OutputPath $Outpath -AsDate "date"
$FourthText = Get-Content (Join-path -Path $Outpath -ChildPath "First10Races.csv") $script:FourthText = Get-Content (Join-path -Path $Outpath -ChildPath "First10Races.csv")
} }
Context "Exporting to CSV" { Context "Exporting to CSV" {
it "Exported the expected columns to a CSV file " { it "Exported the expected columns to a CSV file " {
@@ -24,7 +23,7 @@ Describe 'ConvertFrom-ExcelSheet / Export-ExcelSheet' {
} }
it "Applied AsText, AsDate and Properties correctly " { it "Applied AsText, AsDate and Properties correctly " {
$firstText[1] | Should -Match '^"\w+","\d{5}","\d{1,2}","\w+ \w+","[1-9]\d?","\w+","\d{1,2}"$' $firstText[1] | Should -Match '^"\w+","\d{5}","\d{1,2}","\w+ \w+","[1-9]\d?","\w+","\d{1,2}"$'
$date = $firstText[1] -replace '^.*(\d{5}).*$', '$1' $date = $firstText[1] -replace '^.*(\d{5}).*$', '$1'
$date = [datetime]::FromOADate($date).toString("D") $date = [datetime]::FromOADate($date).toString("D")
$secondText[1] | Should -Belike "*$date*" $secondText[1] | Should -Belike "*$date*"
$secondText[1] | Should -Match '"0\d","\w+","\d{1,2}"$' $secondText[1] | Should -Match '"0\d","\w+","\d{1,2}"$'
@@ -32,7 +31,7 @@ Describe 'ConvertFrom-ExcelSheet / Export-ExcelSheet' {
$FourthText[1] | Should -Match '^"\w+","([012]\d/|[1-9]/)' $FourthText[1] | Should -Match '^"\w+","([012]\d/|[1-9]/)'
} }
} }
Context "Export aliased to ConvertFrom" { Context "Export aliased to ConvertFrom" {
it "Definded the alias name with " { it "Definded the alias name with " {
(Get-Alias Export-ExcelSheet).source | Should -Be "ImportExcel" (Get-Alias Export-ExcelSheet).source | Should -Be "ImportExcel"
(Get-Alias Export-ExcelSheet).Definition | Should -Be "ConvertFrom-ExcelSheet" (Get-Alias Export-ExcelSheet).Definition | Should -Be "ConvertFrom-ExcelSheet"

View File

@@ -1,32 +1,34 @@
if (-not (Get-command Import-Excel -ErrorAction SilentlyContinue)) { if (-not (Get-command Import-Excel -ErrorAction SilentlyContinue)) {
Import-Module $PSScriptRoot\..\ImportExcel.psd1 Import-Module $PSScriptRoot\..\ImportExcel.psd1
} }
$xlFile = "TestDrive:\testSQL.xlsx"
Describe "ConvertFrom-ExcelToSQLInsert" { Describe "ConvertFrom-ExcelToSQLInsert" {
BeforeAll {
$script:xlFile = "TestDrive:\testSQL.xlsx"
}
BeforeEach { BeforeEach {
$([PSCustomObject]@{ $([PSCustomObject]@{
Name="John" Name = "John"
Age=$null Age = $null
}) | Export-Excel $xlFile }) | Export-Excel $xlFile
} }
AfterAll { AfterAll {
Remove-Item $xlFile -Recurse -Force -ErrorAction Ignore Remove-Item $xlFile -Recurse -Force -ErrorAction Ignore
} }
It "Should be empty double single quotes".PadRight(90) { It "Should be empty double single quotes".PadRight(90) {
$expected="INSERT INTO Sheet1 ('Name', 'Age') Values('John', '');" $expected = "INSERT INTO Sheet1 ('Name', 'Age') Values('John', '');"
$actual = ConvertFrom-ExcelToSQLInsert -Path $xlFile Sheet1 $actual = ConvertFrom-ExcelToSQLInsert -Path $xlFile Sheet1
$actual | Should -Be $expected $actual | Should -Be $expected
} }
It "Should have NULL".PadRight(90) { It "Should have NULL".PadRight(90) {
$expected="INSERT INTO Sheet1 ('Name', 'Age') Values('John', NULL);" $expected = "INSERT INTO Sheet1 ('Name', 'Age') Values('John', NULL);"
$actual = ConvertFrom-ExcelToSQLInsert -Path $xlFile Sheet1 -ConvertEmptyStringsToNull $actual = ConvertFrom-ExcelToSQLInsert -Path $xlFile Sheet1 -ConvertEmptyStringsToNull

Some files were not shown because too many files have changed in this diff Show More