mirror of
https://github.com/dfinke/ImportExcel.git
synced 2025-12-15 15:53:32 +00:00
Compare commits
63 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e486135c4f | ||
|
|
80d9cb1290 | ||
|
|
d82c01eabf | ||
|
|
2fcb7a57a2 | ||
|
|
afe7e545f6 | ||
|
|
88638a87a9 | ||
|
|
0f354be443 | ||
|
|
abebb9af11 | ||
|
|
d8ae8b1abc | ||
|
|
30fc53857d | ||
|
|
04b7895d1e | ||
|
|
7f72aa9e86 | ||
|
|
70ab9e46c7 | ||
|
|
49e355b702 | ||
|
|
82a8536e47 | ||
|
|
35246d51e7 | ||
|
|
9dafe170f1 | ||
|
|
0d29fd813d | ||
|
|
c685ad767c | ||
|
|
f283ada708 | ||
|
|
bb3923aabf | ||
|
|
fa0b3ca79b | ||
|
|
53f8acda90 | ||
|
|
ca586fc2d5 | ||
|
|
4c5f1a967e | ||
|
|
f237861e1a | ||
|
|
282d650072 | ||
|
|
6149442bc0 | ||
|
|
113bf2c95c | ||
|
|
27e8130e6c | ||
|
|
c19e219a44 | ||
|
|
795b2017b5 | ||
|
|
cb749dff07 | ||
|
|
fd6b847d77 | ||
|
|
c6d9104d52 | ||
|
|
df157b22ab | ||
|
|
95822ac2e9 | ||
|
|
c4d20a9a28 | ||
|
|
8a20963577 | ||
|
|
c30e03a47f | ||
|
|
0a77a83e35 | ||
|
|
66f6a5fa0b | ||
|
|
a3921f5298 | ||
|
|
1823f1dde0 | ||
|
|
5d5ca57f4b | ||
|
|
11d591aad6 | ||
|
|
9841ef9436 | ||
|
|
ae1fa04334 | ||
|
|
a7861ee57d | ||
|
|
24ca7a4d86 | ||
|
|
51b23323fa | ||
|
|
001aabf526 | ||
|
|
a5a98d5c92 | ||
|
|
070d40b5af | ||
|
|
c4b3556c5d | ||
|
|
8151ed4305 | ||
|
|
6959cffa24 | ||
|
|
6be2195680 | ||
|
|
ff77606430 | ||
|
|
a874e1385e | ||
|
|
f8b9cf7251 | ||
|
|
5588c0306c | ||
|
|
359f7453c5 |
17
.github/stale.yml
vendored
Normal file
17
.github/stale.yml
vendored
Normal 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
1
.gitignore
vendored
@@ -65,3 +65,4 @@ ImportExcel.zip
|
||||
~$*
|
||||
# InstallModule.ps1
|
||||
# PublishToGallery.ps1
|
||||
.vscode/*
|
||||
|
||||
28
CI/CI.ps1
28
CI/CI.ps1
@@ -13,7 +13,10 @@ param
|
||||
# AppVeyor and Azure - Upload module as AppVeyor Artifact.
|
||||
[Switch]$Artifact,
|
||||
# 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'
|
||||
if ($Initialize) {
|
||||
@@ -21,7 +24,7 @@ if ($Initialize) {
|
||||
$ModuleVersion = (. ([Scriptblock]::Create((Get-Content -Path $Psd1 | Out-String)))).ModuleVersion
|
||||
Update-AppveyorBuild -Version "$ModuleVersion ($env:APPVEYOR_BUILD_NUMBER) $env:APPVEYOR_REPO_BRANCH"
|
||||
}
|
||||
if ($Test) {
|
||||
if ($Test -or $TestImportOnly) {
|
||||
function Get-EnvironmentInfo {
|
||||
if ([environment]::OSVersion.Platform -like "win*") {
|
||||
# Get Windows Version
|
||||
@@ -97,7 +100,23 @@ if (-not $VersionFilePath) {
|
||||
'[Progress] Installing Module.'
|
||||
. .\CI\Install.ps1
|
||||
'[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) {
|
||||
'[Progress] Finalizing.'
|
||||
@@ -131,6 +150,7 @@ if ($Artifact) {
|
||||
"[Progress] Artifact Start for Module: $ModuleName, Version: $VersionLocal."
|
||||
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 = $ZipFileName -replace ("[{0}]" -f [RegEx]::Escape([IO.Path]::GetInvalidFileNameChars() -join ''))
|
||||
$ZipFileFullPath = Join-Path -Path $PSScriptRoot -ChildPath $ZipFileName
|
||||
"[Info] Artifact. $ModuleName, ZipFileName: $ZipFileName."
|
||||
#Compress-Archive -Path $ModulePath -DestinationPath $ZipFileFullPath
|
||||
@@ -205,4 +225,4 @@ if ($Analyzer) {
|
||||
else {
|
||||
"[Info] Invoke-ScriptAnalyzer didn't return any problems."
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
125
CI/PS-CI.ps1
125
CI/PS-CI.ps1
@@ -1,4 +1,4 @@
|
||||
[cmdletbinding(DefaultParameterSetName='Scope')]
|
||||
[cmdletbinding(DefaultParameterSetName = 'Scope')]
|
||||
Param(
|
||||
[Parameter(Mandatory = $true, ParameterSetName = 'ModulePath')]
|
||||
[ValidateNotNullOrEmpty()]
|
||||
@@ -10,7 +10,7 @@ Param(
|
||||
[string]
|
||||
$Scope = 'CurrentUser',
|
||||
|
||||
[Parameter(Mandatory=$true, ParameterSetName = 'PreCheckOnly')]
|
||||
[Parameter(Mandatory = $true, ParameterSetName = 'PreCheckOnly')]
|
||||
[switch]$PreCheckOnly,
|
||||
[Parameter(ParameterSetName = 'ModulePath')]
|
||||
[Parameter(ParameterSetName = 'Scope')]
|
||||
@@ -30,7 +30,7 @@ Param(
|
||||
)
|
||||
Function Show-Warning {
|
||||
param(
|
||||
[Parameter(Position=0,ValueFromPipeline=$true)]
|
||||
[Parameter(Position = 0, ValueFromPipeline = $true)]
|
||||
$message
|
||||
)
|
||||
process {
|
||||
@@ -49,11 +49,11 @@ if (-not $psdpath -or $psdpath.count -gt 1) {
|
||||
throw "Did not find a unique PSD file "
|
||||
}
|
||||
else {
|
||||
try {$null = Test-ModuleManifest -Path $psdpath -ErrorAction stop}
|
||||
catch {throw $_ ; return}
|
||||
$ModuleName = $psdpath.Name -replace '\.psd1$' , ''
|
||||
$Settings = $(& ([scriptblock]::Create(($psdpath | Get-Content -Raw))))
|
||||
$approvedVerbs = Get-Verb | Select-Object -ExpandProperty verb
|
||||
try { $null = Test-ModuleManifest -Path $psdpath -ErrorAction stop }
|
||||
catch { throw $_ ; return }
|
||||
$ModuleName = $psdpath.Name -replace '\.psd1$' , ''
|
||||
$Settings = $(& ([scriptblock]::Create(($psdpath | Get-Content -Raw))))
|
||||
$approvedVerbs = Get-Verb | Select-Object -ExpandProperty verb
|
||||
$script:warningfile = Join-Path -Path $pwd -ChildPath "warnings.txt"
|
||||
}
|
||||
|
||||
@@ -63,7 +63,7 @@ if (-not $SkipPreChecks) {
|
||||
#Check files in the manifest are present
|
||||
foreach ($file in $Settings.FileList) {
|
||||
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
|
||||
# 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
|
||||
$reg = [Regex]::new(@"
|
||||
$reg = [Regex]::new(@"
|
||||
function\s*[-\w]+\s*{ # The function name and opening '{'
|
||||
(?:
|
||||
[^{}]+ # Match all non-braces
|
||||
@@ -84,56 +84,56 @@ if (-not $SkipPreChecks) {
|
||||
} # Functions closing '}'
|
||||
"@, 57) # 57 = compile,multi-line ignore case and white space.
|
||||
foreach ($file in (Get-Item .\Public\*.ps1)) {
|
||||
$name = $file.name -replace(".ps1","")
|
||||
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"}
|
||||
if(-not ($Settings.FunctionsToExport -ceq $name)) {
|
||||
$name = $file.name -replace (".ps1", "")
|
||||
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" }
|
||||
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)
|
||||
}
|
||||
else {
|
||||
$fileContent = Get-Content $file -Raw
|
||||
$m = $reg.Matches($fileContent)
|
||||
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}
|
||||
$m = $reg.Matches($fileContent)
|
||||
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[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
|
||||
$m2 = [regex]::Match($m[0],"^.*?param",17) # 17 = multi-line, ignnore case
|
||||
if (-not $m2.Success) {Show-Warning "function $name has no param() block"}
|
||||
$m2 = [regex]::Match($m[0], "^.*?param", 17) # 17 = multi-line, ignnore case
|
||||
if (-not $m2.Success) { Show-Warning "function $name has no param() block" }
|
||||
else {
|
||||
if ($m2.value -match "(?<!#\s*)\[\s*Alias\(\s*.([\w-]+).\s*\)\s*\]") {
|
||||
foreach ($a in ($Matches[1] -split '\s*,\s*')) {
|
||||
$a = $a -replace "'","" -replace '"',''
|
||||
if (-not ($Settings.AliasesToExport -eq $a)) {
|
||||
$a = $a -replace "'", "" -replace '"', ''
|
||||
if (-not ($Settings.AliasesToExport -eq $a)) {
|
||||
Show-Warning "Function $name has alias $a which is not in the manifest"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
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
|
||||
$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 ', '))}
|
||||
$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 ($PreCheckOnly) {return}
|
||||
if ($PreCheckOnly) { return }
|
||||
|
||||
#region build, determine module path if necessary, create target directory if necessary, copy files based on manifest, build help
|
||||
try {
|
||||
try {
|
||||
if ($ModulePath) {
|
||||
$ModulePath = $ModulePath -replace "\\$|/$",""
|
||||
$ModulePath = $ModulePath -replace "\\$|/$", ""
|
||||
}
|
||||
else {
|
||||
if ($IsLinux -or $IsMacOS) {$ModulePathSeparator = ':' }
|
||||
else {$ModulePathSeparator = ';' }
|
||||
if ($Scope -eq 'CurrentUser') {$dir = [System.Environment]::GetFolderPath([System.Environment+SpecialFolder]::UserProfile) }
|
||||
else {$dir = [System.Environment]::GetFolderPath([System.Environment+SpecialFolder]::ProgramFiles) }
|
||||
$ModulePath = ($env:PSModulePath -split $ModulePathSeparator).where({$_ -like "$dir*"},"First",1)
|
||||
if ($IsLinux -or $IsMacOS) { $ModulePathSeparator = ':' }
|
||||
else { $ModulePathSeparator = ';' }
|
||||
if ($Scope -eq 'CurrentUser') { $dir = [System.Environment]::GetFolderPath([System.Environment+SpecialFolder]::UserProfile) }
|
||||
else { $dir = [System.Environment]::GetFolderPath([System.Environment+SpecialFolder]::ProgramFiles) }
|
||||
$ModulePath = ($env:PSModulePath -split $ModulePathSeparator).where( { $_ -like "$dir*" }, "First", 1)
|
||||
$ModulePath = Join-Path -Path $ModulePath -ChildPath $ModuleName
|
||||
$ModulePath = Join-Path -Path $ModulePath -ChildPath $Settings.ModuleVersion
|
||||
}
|
||||
@@ -150,13 +150,13 @@ try {
|
||||
$outputFile = $psdpath | Copy-Item -Destination $ModulePath -PassThru
|
||||
$outputFile.fullname
|
||||
foreach ($file in $Settings.FileList) {
|
||||
if ($file -like '.\*') {
|
||||
$dest = ($file -replace '\.\\',"$ModulePath\")
|
||||
if (-not (Test-Path -PathType Container (Split-Path -Parent $dest))) {
|
||||
if ($file -like '.\*') {
|
||||
$dest = ($file -replace '\.\\', "$ModulePath\")
|
||||
if (-not (Test-Path -PathType Container (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
|
||||
}
|
||||
|
||||
@@ -167,19 +167,19 @@ try {
|
||||
}
|
||||
$platypsInfo = Import-Module platyPS -PassThru -force
|
||||
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
|
||||
}
|
||||
}
|
||||
#Leave module path for things which follow.
|
||||
$env:PSNewBuildModule = $ModulePath
|
||||
}
|
||||
catch {
|
||||
catch {
|
||||
if ($PSScriptRoot) { Pop-Location }
|
||||
throw ('Failed installing module "{0}". Error: "{1}" in Line {2}' -f $ModuleName, $_, $_.InvocationInfo.ScriptLineNumber)
|
||||
}
|
||||
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
|
||||
|
||||
@@ -189,16 +189,16 @@ if ($env:Build_ArtifactStagingDirectory) {
|
||||
|
||||
#Check valid command names, help, run script analyzer over the files in the module directory
|
||||
if (-not $SkipPostChecks) {
|
||||
try {$outputFile | Import-Module -Force -ErrorAction stop }
|
||||
try { $outputFile | Import-Module -Force -ErrorAction stop }
|
||||
catch {
|
||||
if ($PSScriptRoot) { Pop-Location }
|
||||
throw "New module failed to load"
|
||||
if ($PSScriptRoot) { Pop-Location }
|
||||
throw "New module failed to load"
|
||||
}
|
||||
$commands = Get-Command -Module $ModuleName -CommandType function,Cmdlet
|
||||
$commands.where({$_.name -notmatch "(\w+)-\w+" -or $Matches[1] -notin $approvedVerbs}) | ForEach-Object {
|
||||
$commands = Get-Command -Module $ModuleName -CommandType function, Cmdlet
|
||||
$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)
|
||||
}
|
||||
$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 ) {
|
||||
Show-Warning ('On-line help is missing for {0}.' -f $command)
|
||||
}
|
||||
@@ -222,10 +222,12 @@ if (-not $SkipPostChecks) {
|
||||
AutoSize = $true
|
||||
Activate = $true
|
||||
PivotTableDefinition = @{BreakDown = @{
|
||||
PivotData = @{RuleName = 'Count' }
|
||||
PivotRows = 'Severity', 'RuleName'
|
||||
PivotTotals = 'Rows'
|
||||
PivotChartDefinition = $chartDef }}
|
||||
PivotData = @{RuleName = 'Count' }
|
||||
PivotRows = 'Severity', 'RuleName'
|
||||
PivotTotals = 'Rows'
|
||||
PivotChartDefinition = $chartDef
|
||||
}
|
||||
}
|
||||
}
|
||||
Remove-Item -Path $ExcelParams['Path'] -ErrorAction SilentlyContinue
|
||||
$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 (-not $SkipPesterTests -and (Get-ChildItem -Recurse *.tests.ps1)) {
|
||||
Import-Module -Force $outputFile
|
||||
if (-not (Get-Module -ListAvailable pester | Where-Object -Property version -ge ([version]::new(4,4,1)))) {
|
||||
Install-Module Pester -Force -SkipPublisherCheck
|
||||
if (-not (Get-Module -ListAvailable pester | Where-Object -Property version -ge ([version]::new(4, 4, 1)))) {
|
||||
Install-Module Pester -Force -SkipPublisherCheck -MaximumVersion 4.99.99
|
||||
}
|
||||
Import-Module Pester
|
||||
$PesterOutputPath = Join-Path $pwd -ChildPath ('TestResultsPS{0}.xml' -f $PSVersionTable.PSVersion)
|
||||
$pester = Import-Module Pester -PassThru
|
||||
$pester
|
||||
$pesterOutputPath = Join-Path $pwd -ChildPath ('TestResultsPS{0}.xml' -f $PSVersionTable.PSVersion)
|
||||
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 }
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
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
|
||||
|
||||
#Put some simple data in a worksheet and Get an excel package object to represent the file
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
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
|
||||
|
||||
#Put some simple data in a worksheet and Get an excel package object to represent the file
|
||||
|
||||
@@ -1,7 +1,10 @@
|
||||
# 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"
|
||||
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 @"
|
||||
Region,Item,TotalSold
|
||||
@@ -18,4 +21,4 @@ South,avocado,73
|
||||
"@
|
||||
|
||||
$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
|
||||
|
||||
@@ -1,6 +1,9 @@
|
||||
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
|
||||
|
||||
@@ -11,4 +14,4 @@ $c = New-ExcelChartDefinition -Title "ProcessStats" `
|
||||
-SeriesHeader "PM","VM"
|
||||
|
||||
$data |
|
||||
Export-Excel -Path temp.xlsx -AutoSize -TableName Processes -ExcelChartDefinition $c -Show
|
||||
Export-Excel -Path $xlSourcefile -AutoSize -TableName Processes -ExcelChartDefinition $c -Show
|
||||
|
||||
@@ -1,6 +1,9 @@
|
||||
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 = @"
|
||||
A,B,C,Date
|
||||
@@ -15,5 +18,5 @@ $c = New-ExcelChartDefinition -Title Impressions `
|
||||
-SeriesHeader 'B data','A data' `
|
||||
-Row 0 -Column 0
|
||||
|
||||
$data | ConvertFrom-Csv | Export-Excel -path temp.xlsx -AutoSize -TableName Impressions
|
||||
Export-Excel -path temp.xlsx -worksheetName chartPage -ExcelChartDefinition $c -show
|
||||
$data | ConvertFrom-Csv | Export-Excel -path $xlSourcefile -AutoSize -TableName Impressions
|
||||
Export-Excel -path $xlSourcefile -worksheetName chartPage -ExcelChartDefinition $c -show
|
||||
|
||||
@@ -1,6 +1,9 @@
|
||||
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 = @"
|
||||
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
|
||||
|
||||
$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
|
||||
BIN
Examples/Charts/Multiplecharts.png
Normal file
BIN
Examples/Charts/Multiplecharts.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 93 KiB |
@@ -1,5 +1,9 @@
|
||||
$xlfile = "$env:TEMP\visitors.xlsx"
|
||||
Remove-Item $xlfile -ErrorAction SilentlyContinue
|
||||
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 @"
|
||||
Week, TotalVisitors
|
||||
@@ -23,5 +27,5 @@ $cd = New-ExcelChartDefinition `
|
||||
-NoLegend `
|
||||
-ChartTrendLine Linear
|
||||
|
||||
$data | Export-Excel $xlfile -Show -AutoNameRange -AutoSize -TableName Visitors -ExcelChartDefinition $cd
|
||||
$data | Export-Excel $xlSourcefile -Show -AutoNameRange -AutoSize -TableName Visitors -ExcelChartDefinition $cd
|
||||
|
||||
|
||||
@@ -10,8 +10,10 @@ function plot {
|
||||
$minx=[math]::Round($minx,1)
|
||||
$maxx=[math]::Round($maxx,1)
|
||||
|
||||
$file = 'C:\temp\plot.xlsx'
|
||||
Remove-Item $file -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
|
||||
|
||||
# $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")
|
||||
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}
|
||||
|
||||
@@ -1,11 +1,13 @@
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
$file = "$env:temp\conditionalTextFormatting.xlsx"
|
||||
Remove-Item $file -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-Service |
|
||||
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 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
|
||||
|
||||
@@ -12,8 +12,10 @@ $data = $(
|
||||
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
|
||||
$data | Export-Excel $file -show -ConditionalText $ContainsBlanks
|
||||
$data | Export-Excel $xlSourcefile -show -ConditionalText $ContainsBlanks
|
||||
@@ -1,12 +1,14 @@
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
$path = "$env:temp\test.xlsx"
|
||||
Remove-Item -Path $path -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
|
||||
|
||||
#Export processes, and get an ExcelPackage object representing the file.
|
||||
$excel = Get-Process |
|
||||
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"]
|
||||
|
||||
@@ -15,10 +17,10 @@ $sheet.Column(1) | Set-ExcelRange -Bold -AutoFit
|
||||
$sheet.Column(2) | Set-ExcelRange -Width 29 -WrapText
|
||||
$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
|
||||
#In Set-ExcelRange "-Address" is an alias for "-Range"
|
||||
Set-ExcelRange -Range $sheet.Column(4) -HorizontalAlignment Right -NFormat "#,##0.0" -Bold
|
||||
#In Set-ExcelRange "-Address" is an alias for "-Range"
|
||||
Set-ExcelRange -Address $sheet.Row(1) -Bold -HorizontalAlignment Center
|
||||
|
||||
#Create a Red Data-bar for the values in Column D
|
||||
|
||||
@@ -1,8 +1,9 @@
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
$f = "$env:TEMP\testExport.xlsx"
|
||||
|
||||
Remove-Item $f -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 = $(
|
||||
|
||||
@@ -25,6 +26,6 @@ $data = $(
|
||||
# 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 $f -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 AboveAverage)
|
||||
$data | Export-Excel $xlSourcefile -Show -AutoSize -ConditionalText (New-ConditionalText -ConditionalType BelowAverage)
|
||||
#$data | Export-Excel $xlSourcefile -Show -AutoSize -ConditionalText (New-ConditionalText -ConditionalType TopPercent)
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
function Get-DateOffset {
|
||||
param($days=0)
|
||||
|
||||
|
||||
@@ -1,12 +1,15 @@
|
||||
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* |
|
||||
|
||||
#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 $(
|
||||
New-ConditionalFormattingIconSet -Range "C:C" `
|
||||
-ConditionalFormat ThreeIconSet -IconType Arrows
|
||||
|
||||
@@ -1,10 +1,11 @@
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
$f = ".\testExport.xlsx"
|
||||
|
||||
Remove-Item $f -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
|
||||
|
||||
.\GenDates.ps1 |
|
||||
Export-Excel $f -Show -AutoSize -ConditionalText $(
|
||||
Export-Excel $xlSourcefile -Show -AutoSize -ConditionalText $(
|
||||
New-ConditionalText -ConditionalType Last7Days
|
||||
)
|
||||
|
||||
@@ -1,10 +1,11 @@
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
$f = ".\testExport.xlsx"
|
||||
|
||||
Remove-Item $f -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
|
||||
|
||||
.\GenDates.ps1 |
|
||||
Export-Excel $f -Show -AutoSize -ConditionalText $(
|
||||
Export-Excel $xlSourcefile -Show -AutoSize -ConditionalText $(
|
||||
New-ConditionalText -ConditionalType LastMonth
|
||||
)
|
||||
|
||||
@@ -1,10 +1,11 @@
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
$f = ".\testExport.xlsx"
|
||||
|
||||
Remove-Item $f -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
|
||||
|
||||
.\GenDates.ps1 |
|
||||
Export-Excel $f -Show -AutoSize -ConditionalText $(
|
||||
Export-Excel $xlSourcefile -Show -AutoSize -ConditionalText $(
|
||||
New-ConditionalText -ConditionalType LastWeek
|
||||
)
|
||||
|
||||
@@ -1,10 +1,11 @@
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
$f = ".\testExport.xlsx"
|
||||
|
||||
Remove-Item $f -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
|
||||
|
||||
.\GenDates.ps1 |
|
||||
Export-Excel $f -Show -AutoSize -ConditionalText $(
|
||||
Export-Excel $xlSourcefile -Show -AutoSize -ConditionalText $(
|
||||
New-ConditionalText -ConditionalType NextMonth
|
||||
)
|
||||
|
||||
@@ -1,10 +1,11 @@
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
$f = ".\testExport.xlsx"
|
||||
|
||||
Remove-Item $f -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
|
||||
|
||||
.\GenDates.ps1 |
|
||||
Export-Excel $f -Show -AutoSize -ConditionalText $(
|
||||
Export-Excel $xlSourcefile -Show -AutoSize -ConditionalText $(
|
||||
New-ConditionalText -ConditionalType NextWeek
|
||||
)
|
||||
|
||||
@@ -1,10 +1,11 @@
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
$f = ".\testExport.xlsx"
|
||||
|
||||
Remove-Item $f -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
|
||||
|
||||
.\GenDates.ps1 |
|
||||
Export-Excel $f -Show -AutoSize -ConditionalText $(
|
||||
Export-Excel $xlSourcefile -Show -AutoSize -ConditionalText $(
|
||||
New-ConditionalText -ConditionalType ThisMonth
|
||||
)
|
||||
|
||||
@@ -1,10 +1,11 @@
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
$f = ".\testExport.xlsx"
|
||||
|
||||
Remove-Item $f -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
|
||||
|
||||
.\GenDates.ps1 |
|
||||
Export-Excel $f -Show -AutoSize -ConditionalText $(
|
||||
Export-Excel $xlSourcefile -Show -AutoSize -ConditionalText $(
|
||||
New-ConditionalText -ConditionalType ThisWeek
|
||||
)
|
||||
|
||||
@@ -1,10 +1,11 @@
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
$f = ".\testExport.xlsx"
|
||||
|
||||
Remove-Item $f -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
|
||||
|
||||
.\GenDates.ps1 |
|
||||
Export-Excel $f -Show -AutoSize -ConditionalText $(
|
||||
Export-Excel $xlSourcefile -Show -AutoSize -ConditionalText $(
|
||||
New-ConditionalText -ConditionalType Today
|
||||
)
|
||||
|
||||
@@ -1,10 +1,11 @@
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
$f = ".\testExport.xlsx"
|
||||
|
||||
Remove-Item $f -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
|
||||
|
||||
.\GenDates.ps1 |
|
||||
Export-Excel $f -Show -AutoSize -ConditionalText $(
|
||||
Export-Excel $xlSourcefile -Show -AutoSize -ConditionalText $(
|
||||
New-ConditionalText -ConditionalType Tomorrow
|
||||
)
|
||||
|
||||
@@ -1,10 +1,11 @@
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
$f = ".\testExport.xlsx"
|
||||
|
||||
Remove-Item $f -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
|
||||
|
||||
.\GenDates.ps1 |
|
||||
Export-Excel $f -Show -AutoSize -ConditionalText $(
|
||||
Export-Excel $xlSourcefile -Show -AutoSize -ConditionalText $(
|
||||
New-ConditionalText -ConditionalType Yesterday
|
||||
)
|
||||
|
||||
@@ -1,8 +1,9 @@
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
$f = ".\testExport.xlsx"
|
||||
|
||||
Remove-Item $f -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 = $(
|
||||
|
||||
@@ -22,4 +23,4 @@ $data = $(
|
||||
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)
|
||||
@@ -1,6 +1,9 @@
|
||||
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 = @"
|
||||
Month,New York City,Austin Texas,Portland Oregon
|
||||
@@ -17,7 +20,7 @@ Oct,65,82,63
|
||||
Nov,54,71,52
|
||||
Dec,44,63,46
|
||||
"@ | 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"]
|
||||
Add-ConditionalFormatting -Worksheet $sheet -Range "B1:D14" -DataBarColor CornflowerBlue
|
||||
|
||||
@@ -1,7 +1,9 @@
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
$f = ".\testExport.xlsx"
|
||||
Remove-Item $f -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
|
||||
|
||||
function Get-DateOffset ($days=0) {
|
||||
(Get-Date).AddDays($days).ToShortDateString()
|
||||
@@ -13,7 +15,7 @@ $(
|
||||
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 End -ConditionalType Yesterday -BackgroundColor Blue -ConditionalTextColor Red
|
||||
)
|
||||
@@ -1,6 +1,9 @@
|
||||
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 = @"
|
||||
Month,Sales
|
||||
@@ -11,7 +14,7 @@ Apr,952
|
||||
May,770
|
||||
Jun,621
|
||||
"@ | ConvertFrom-csv |
|
||||
Export-Excel -Path .\test.xlsx -WorkSheetname Sheet1 -AutoNameRange -PassThru
|
||||
Export-Excel -Path $xlSourcefile -WorkSheetname Sheet1 -AutoNameRange -PassThru
|
||||
|
||||
$sheet = $excel.Workbook.Worksheets["Sheet1"]
|
||||
Add-ConditionalFormatting -Worksheet $sheet -Range "B1:B7" -DataBarColor LawnGreen
|
||||
|
||||
@@ -1,25 +1,29 @@
|
||||
try {Import-Module ..\..\ImportExcel.psd1 -Force} catch {throw ; return}
|
||||
try {Import-Module ..\..\ImportExcel.psd1 -Force} catch {throw ; return}
|
||||
|
||||
$data = $(
|
||||
New-PSItem 100 @('test', 'testx')
|
||||
New-PSItem 200
|
||||
New-PSItem 300
|
||||
New-PSItem 400
|
||||
New-PSItem 500
|
||||
)
|
||||
$data = $(
|
||||
New-PSItem 100 @('test', 'testx')
|
||||
New-PSItem 200
|
||||
New-PSItem 300
|
||||
New-PSItem 400
|
||||
New-PSItem 500
|
||||
)
|
||||
|
||||
$file1 = "$env:Temp\tryComparison1.xlsx"
|
||||
$file2 = "$env:Temp\tryComparison2.xlsx"
|
||||
#Get rid of pre-exisiting sheet
|
||||
$xlSourcefile1 = "$env:TEMP\ImportExcelExample1.xlsx"
|
||||
$xlSourcefile2 = "$env:TEMP\ImportExcelExample2.xlsx"
|
||||
|
||||
Remove-Item -Path $file1 -ErrorAction Ignore
|
||||
Remove-Item -Path $file2 -ErrorAction Ignore
|
||||
Write-Verbose -Verbose -Message "Save location: $xlSourcefile1"
|
||||
Write-Verbose -Verbose -Message "Save location: $xlSourcefile2"
|
||||
|
||||
$data | Export-Excel $file1 -Show -ConditionalText $(
|
||||
New-ConditionalText -ConditionalType GreaterThan 300
|
||||
New-ConditionalText -ConditionalType LessThan 300 -BackgroundColor cyan
|
||||
)
|
||||
Remove-Item $xlSourcefile1 -ErrorAction Ignore
|
||||
Remove-Item $xlSourcefile2 -ErrorAction Ignore
|
||||
|
||||
$data | Export-Excel $file2 -Show -ConditionalText $(
|
||||
New-ConditionalText -ConditionalType GreaterThanOrEqual 275
|
||||
New-ConditionalText -ConditionalType LessThanOrEqual 250 -BackgroundColor cyan
|
||||
)
|
||||
$data | Export-Excel $xlSourcefile1 -Show -ConditionalText $(
|
||||
New-ConditionalText -ConditionalType GreaterThan 300
|
||||
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
|
||||
)
|
||||
|
||||
@@ -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
|
||||
@@ -1,7 +1,9 @@
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
$f = "$env:temp\dashboard.xlsx"
|
||||
Remove-Item $f -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 = @"
|
||||
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
|
||||
"@ | 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"]
|
||||
|
||||
|
||||
@@ -1,8 +1,11 @@
|
||||
# DSUM
|
||||
# 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"
|
||||
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 @"
|
||||
Color,Date,Sales
|
||||
@@ -14,7 +17,7 @@ Red,1/17/2018,150
|
||||
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
|
||||
Set-Format -Worksheet $xl.Sheet1 -Range C:C -NumberFormat '$##0'
|
||||
|
||||
@@ -1,5 +1,9 @@
|
||||
$xlfile = "$env:TEMP\test.xlsx"
|
||||
Remove-Item $xlfile -ErrorAction SilentlyContinue
|
||||
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 @"
|
||||
Fruit,Amount
|
||||
@@ -9,11 +13,11 @@ Bananas,60
|
||||
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
|
||||
|
||||
$Rows = $xl.Sheet1.Dimension.Rows
|
||||
Set-ExcelRange -Worksheet $xl.Sheet1 -Range E2 -Formula "=VLookup(D2,A2:B$($Rows),2,FALSE)"
|
||||
$rows = $xl.Sheet1.Dimension.Rows
|
||||
Set-ExcelRange -Worksheet $xl.Sheet1 -Range E2 -Formula "=VLookup(D2,A2:B$($rows),2,FALSE)"
|
||||
|
||||
Close-ExcelPackage $xl -Show
|
||||
@@ -15,8 +15,10 @@
|
||||
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
$path = "$Env:TEMP\DataValidation.xlsx"
|
||||
Remove-Item $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
|
||||
|
||||
$data = ConvertFrom-Csv -InputObject @"
|
||||
ID,Region,Product,Quantity,Price
|
||||
@@ -29,7 +31,7 @@ ID,Region,Product,Quantity,Price
|
||||
|
||||
# Export the raw 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
|
||||
$excelPackage = @('Chisel', 'Crowbar', 'Drill', 'Hammer', 'Nails', 'Saw', 'Screwdriver', 'Wrench') |
|
||||
|
||||
46
Examples/Experimental/Export-MultipleExcelSheets.ps1
Normal file
46
Examples/Experimental/Export-MultipleExcelSheets.ps1
Normal 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 }
|
||||
}
|
||||
19
Examples/Experimental/tryExportMultipleExcelSheets.ps1
Normal file
19
Examples/Experimental/tryExportMultipleExcelSheets.ps1
Normal 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
|
||||
@@ -2,8 +2,10 @@ param ($fibonacciDigits=10)
|
||||
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
$file = "fib.xlsx"
|
||||
Remove-Item "fib.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
|
||||
|
||||
$(
|
||||
New-PSItem 0
|
||||
@@ -15,4 +17,4 @@ $(
|
||||
New-PSItem ('=a{0}+a{1}' -f ($_+1),$_)
|
||||
}
|
||||
)
|
||||
) | Export-Excel $file -Show
|
||||
) | Export-Excel $xlSourcefile -Show
|
||||
|
||||
@@ -1,10 +1,13 @@
|
||||
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 |
|
||||
Select-Object Company,Handles,PM, NPM|
|
||||
Export-Excel $xlfile -Show -AutoSize -CellStyleSB {
|
||||
Export-Excel $xlSourcefile -Show -AutoSize -CellStyleSB {
|
||||
param(
|
||||
$workSheet,
|
||||
$totalRows,
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
$data = ConvertFrom-Csv @'
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
$data = ConvertFrom-Csv @'
|
||||
Item,Quantity,Price,Total Cost
|
||||
Footballs,9,21.95,197.55
|
||||
Cones,36,7.99,287.64
|
||||
|
||||
@@ -1,7 +1,9 @@
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
$xlfile = "$env:temp\testFmt.xlsx"
|
||||
Remove-Item $xlfile -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
|
||||
|
||||
$RandomStyle = {
|
||||
param(
|
||||
@@ -17,4 +19,4 @@ $RandomStyle = {
|
||||
|
||||
Get-Process |
|
||||
Select-Object Company,Handles,PM, NPM|
|
||||
Export-Excel $xlfile -Show -AutoSize -CellStyleSB $RandomStyle
|
||||
Export-Excel $xlSourcefile -Show -AutoSize -CellStyleSB $RandomStyle
|
||||
|
||||
@@ -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 `
|
||||
-PivotRows Driver, Date -PivotData @{Points = "SUM"} -GroupDateRow Date -GroupDatePart Years, Months
|
||||
|
||||
Import-Csv "$PSScriptRoot\First10Races.csv" |
|
||||
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
|
||||
Select-Object Race, @{n = "Date"; e = {[datetime]::ParseExact($_.date, "dd/MM/yyyy", (Get-Culture))}}, FinishPosition, Driver, GridPosition, Team, Points |
|
||||
Export-Excel $xlSourcefile -Show -AutoSize -PivotTableDefinition $PivotTableDefinition
|
||||
@@ -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 `
|
||||
-PivotRows Driver, FinishPosition -PivotData @{Date = "Count"} -GroupNumericRow FinishPosition -GroupNumericMin 1 -GroupNumericMax 25 -GroupNumericInterval 3
|
||||
|
||||
Import-Csv "$PSScriptRoot\First10Races.csv" |
|
||||
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
|
||||
@@ -1,3 +1,4 @@
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
$data = ConvertFrom-Csv @"
|
||||
Timestamp,Tenant
|
||||
10/29/2018 3:00:00.123,1
|
||||
@@ -15,8 +16,10 @@ Timestamp,Tenant
|
||||
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}}
|
||||
|
||||
$f = "$env:temp\pivottest.xlsx"
|
||||
Remove-Item $f -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
|
||||
|
||||
$pivotDefParams = @{
|
||||
PivotTableName = 'Timestamp Buckets'
|
||||
@@ -29,7 +32,7 @@ $pivotDefParams = @{
|
||||
|
||||
$excelParams = @{
|
||||
PivotTableDefinition = New-PivotTableDefinition @pivotDefParams
|
||||
Path = $f
|
||||
Path = $xlSourcefile
|
||||
WorkSheetname = "Log Data"
|
||||
AutoSize = $true
|
||||
AutoFilter = $true
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
#We will create links to each race in the first 10 rows of the spreadSheet
|
||||
#The next row will be column labels
|
||||
#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
|
||||
$scriptPath = Split-Path -Path $MyInvocation.MyCommand.path -Parent
|
||||
|
||||
@@ -1,6 +1,9 @@
|
||||
#Get rid of pre-exisiting sheet
|
||||
$path = "$Env:TEMP\test.xlsx"
|
||||
remove-item -Path $path -ErrorAction SilentlyContinue
|
||||
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
|
||||
|
||||
#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
|
||||
12010,Drill,20,8,160
|
||||
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
|
||||
@@ -20,7 +23,7 @@ ID,Product,Quantity,Price,Total
|
||||
12003,Saw,10,15.37,153.70
|
||||
12010,Drill,10,8,80
|
||||
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
|
||||
12010,Drill,11,8,88
|
||||
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
|
||||
$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
|
||||
#Add the Pivot table.
|
||||
#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
|
||||
|
||||
@@ -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.
|
||||
Get-CimInstance -ClassName Win32_LogicalDisk |
|
||||
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 |
|
||||
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
|
||||
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
|
||||
|
||||
@@ -1,15 +1,16 @@
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
$xlfile = "$env:temp\AllSales.xlsx"
|
||||
|
||||
Remove-Item $xlfile -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
|
||||
|
||||
$params = @{
|
||||
AutoSize = $true
|
||||
AutoFilter = $true
|
||||
AutoNameRange = $true
|
||||
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-Csv $PSScriptRoot\NorthSales.csv | Export-Excel -WorkSheetname North @params
|
||||
|
||||
@@ -1,8 +1,9 @@
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
$xlFile = "$env:TEMP\mw.xlsx"
|
||||
|
||||
Remove-Item $xlFile -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
|
||||
|
||||
$leftCsv = @"
|
||||
MyProp1,MyProp2,Length
|
||||
@@ -16,4 +17,4 @@ a,b,10
|
||||
c,d,21
|
||||
"@ | ConvertFrom-Csv
|
||||
|
||||
Merge-Worksheet -OutputFile $xlFile -ReferenceObject $leftCsv -DifferenceObject $rightCsv -Key Length -Show
|
||||
Merge-Worksheet -OutputFile $xlSourcefile -ReferenceObject $leftCsv -DifferenceObject $rightCsv -Key Length -Show
|
||||
@@ -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
|
||||
|
||||
#Get a subset of services into $s and export them
|
||||
|
||||
@@ -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
|
||||
|
||||
#Get a subset of services into $s and export them
|
||||
|
||||
@@ -7,7 +7,7 @@ param(
|
||||
$InterestRate = .065,
|
||||
$Term = 30
|
||||
)
|
||||
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
function New-CellData {
|
||||
[Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseShouldProcessForStateChangingFunctions', '', Justification='Does not change system state')]
|
||||
param(
|
||||
|
||||
225
Examples/PesterTestReport/Pester test report.ps1
Normal file
225
Examples/PesterTestReport/Pester test report.ps1
Normal 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'
|
||||
}
|
||||
}
|
||||
11
Examples/PesterTestReport/PesterConfiguration.json
Normal file
11
Examples/PesterTestReport/PesterConfiguration.json
Normal file
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"Run": {
|
||||
"Path": "."
|
||||
},
|
||||
"TestResult": {
|
||||
"Enabled": false,
|
||||
"OutputFormat": "NUnitXml",
|
||||
"OutputPath": "PesterTestResults.xml",
|
||||
"OutputEncoding": "UTF8"
|
||||
}
|
||||
}
|
||||
@@ -1,5 +1,9 @@
|
||||
$path = "$Env:TEMP\test.xlsx"
|
||||
remove-item -path $path -ErrorAction SilentlyContinue
|
||||
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
|
||||
|
||||
#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 @"
|
||||
@@ -10,7 +14,7 @@ Banana, London , 300, 200
|
||||
Orange, Paris, 600, 500
|
||||
Banana, Paris, 300, 200
|
||||
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.
|
||||
#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.
|
||||
|
||||
52
Examples/import-by-columns.ps1
Normal file
52
Examples/import-by-columns.ps1
Normal 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
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -6,7 +6,7 @@
|
||||
RootModule = 'ImportExcel.psm1'
|
||||
|
||||
# Version number of this module.
|
||||
ModuleVersion = '7.1.0'
|
||||
ModuleVersion = '7.1.2'
|
||||
|
||||
# ID used to uniquely identify this module
|
||||
GUID = '60dd4136-feff-401a-ba27-a84458c57ede'
|
||||
@@ -18,7 +18,7 @@
|
||||
CompanyName = 'Doug Finke'
|
||||
|
||||
# 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 = @'
|
||||
@@ -50,9 +50,9 @@ Check out the How To Videos https://www.youtube.com/watch?v=U3Ne_yX4tYo&list=PL5
|
||||
'DoChart',
|
||||
'Expand-NumberFormat',
|
||||
'Export-Excel',
|
||||
'Export-ExcelSheet',
|
||||
'Export-MultipleExcelSheets',
|
||||
'Export-ExcelSheet',
|
||||
'Get-ExcelColumnName',
|
||||
'Get-ExcelFileSummary',
|
||||
'Get-ExcelSheetInfo',
|
||||
'Get-ExcelWorkbookInfo',
|
||||
'Get-HtmlTable',
|
||||
|
||||
@@ -7,8 +7,8 @@ if (-not $Strings) {
|
||||
try { [void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") }
|
||||
catch { Write-Warning -Message $Strings.SystemDrawingAvailable }
|
||||
|
||||
foreach ($directory in @('Private', 'Public','Charting','InferData','Pivot')) {
|
||||
Get-ChildItem -Path "$PSScriptRoot\$directory\*.ps1" | ForEach-Object {. $_.FullName}
|
||||
foreach ($directory in @('Private', 'Public', 'Charting', 'InferData', 'Pivot')) {
|
||||
Get-ChildItem -Path "$PSScriptRoot\$directory\*.ps1" | ForEach-Object { . $_.FullName }
|
||||
}
|
||||
|
||||
if ($PSVersionTable.PSVersion.Major -ge 5) {
|
||||
@@ -53,8 +53,8 @@ brew install mono-libgdiplus
|
||||
"@
|
||||
Write-Warning -Message $msg
|
||||
}
|
||||
finally {
|
||||
$ExcelPackage | Close-ExcelPackage -NoSave
|
||||
}
|
||||
}
|
||||
}
|
||||
finally {
|
||||
$ExcelPackage | Close-ExcelPackage -NoSave
|
||||
}
|
||||
}
|
||||
|
||||
@@ -69,7 +69,7 @@
|
||||
$Address = "$($Address.Row):$($Address.Row)"
|
||||
}
|
||||
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 -is [string] -and $Address -match "!") {$Address = $Address -replace '^.*!',''}
|
||||
@@ -87,7 +87,7 @@
|
||||
if ($Reverse) {
|
||||
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}
|
||||
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
|
||||
#region set the rule conditions
|
||||
|
||||
@@ -11,7 +11,7 @@ function Add-ExcelName {
|
||||
$ws = $Range.Worksheet
|
||||
if (-not $RangeName) {
|
||||
$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') {
|
||||
Write-Warning -Message "Range name '$RangeName' contains illegal characters, they will be replaced with '_'."
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
[OfficeOpenXml.ExcelAddressBase]
|
||||
$Address,
|
||||
$ExcelPackage,
|
||||
$SourceWorkSheet,
|
||||
$SourceWorksheet,
|
||||
$SourceRange,
|
||||
$PivotRows,
|
||||
$PivotData,
|
||||
@@ -75,11 +75,11 @@
|
||||
if (-not $wsPivot.PivotTables[$pivotTableName] ) {
|
||||
try {
|
||||
#Accept a string or a worksheet object as $SourceWorksheet - we don't need a worksheet if we have a Rangebase .
|
||||
if ( $SourceWorkSheet -is [string]) {
|
||||
$SourceWorkSheet = $ExcelPackage.Workbook.Worksheets.where( {$_.name -Like $SourceWorkSheet})[0]
|
||||
if ( $SourceWorksheet -is [string]) {
|
||||
$SourceWorksheet = $ExcelPackage.Workbook.Worksheets.where( {$_.name -Like $SourceWorksheet})[0]
|
||||
}
|
||||
elseif ( $SourceWorkSheet -is [int] ) {
|
||||
$SourceWorkSheet = $ExcelPackage.Workbook.Worksheets[$SourceWorkSheet]
|
||||
elseif ( $SourceWorksheet -is [int] ) {
|
||||
$SourceWorksheet = $ExcelPackage.Workbook.Worksheets[$SourceWorksheet]
|
||||
}
|
||||
if ( $SourceRange -is [OfficeOpenXml.Table.ExcelTable]) {$SourceRange = $SourceRange.Address }
|
||||
if ( $sourceRange -is [OfficeOpenXml.ExcelRange] -or
|
||||
@@ -87,17 +87,17 @@
|
||||
$pivotTable = $wsPivot.PivotTables.Add($Address, $SourceRange, $pivotTableName)
|
||||
}
|
||||
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
|
||||
}
|
||||
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}
|
||||
foreach ($Row in $PivotRows) {
|
||||
try {$null = $pivotTable.RowFields.Add($pivotTable.Fields[$Row]) }
|
||||
foreach ($row in $PivotRows) {
|
||||
try {$null = $pivotTable.RowFields.Add($pivotTable.Fields[$row]) }
|
||||
catch {Write-Warning -message "Could not add '$row' to Rows in PivotTable $pivotTableName." }
|
||||
}
|
||||
foreach ($Column in $PivotColumns) {
|
||||
@@ -150,8 +150,8 @@
|
||||
else {
|
||||
Write-Warning -Message "PivotTable defined in $($pivotTableName) already exists, only the data range will be changed."
|
||||
$pivotTable = $wsPivot.PivotTables[$pivotTableName]
|
||||
if (-not $SourceRange) { $SourceRange = $SourceWorkSheet.Dimension.Address}
|
||||
$pivotTable.CacheDefinition.SourceRange = $SourceWorkSheet.cells[$SourceRange]
|
||||
if (-not $SourceRange) { $SourceRange = $SourceWorksheet.Dimension.Address}
|
||||
$pivotTable.CacheDefinition.SourceRange = $SourceWorksheet.cells[$SourceRange]
|
||||
#change for epPlus 4.5 - Previously needed to hack the xml
|
||||
# $pivotTable.CacheDefinition.CacheDefinitionXml.pivotCacheDefinition.cacheSource.worksheetSource.ref = $SourceRange
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@ function Add-Worksheet {
|
||||
param(
|
||||
[Parameter(Mandatory = $true, ValueFromPipeline = $true, ParameterSetName = "Package", Position = 0)]
|
||||
[OfficeOpenXml.ExcelPackage]$ExcelPackage,
|
||||
[Parameter(Mandatory = $true, ParameterSetName = "WorkBook")]
|
||||
[Parameter(Mandatory = $true, ParameterSetName = "Workbook")]
|
||||
[OfficeOpenXml.ExcelWorkbook]$ExcelWorkbook,
|
||||
[string]$WorksheetName ,
|
||||
[switch]$ClearSheet,
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
$Referencefile ,
|
||||
[parameter(Mandatory=$true,Position=1)]
|
||||
$Differencefile ,
|
||||
$WorkSheetName = "Sheet1",
|
||||
$WorksheetName = "Sheet1",
|
||||
$Property = "*" ,
|
||||
$ExcludeProperty ,
|
||||
[Parameter(ParameterSetName='B', Mandatory)]
|
||||
@@ -32,19 +32,19 @@
|
||||
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 ($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"
|
||||
return
|
||||
}
|
||||
if ($WorkSheetName.count -eq 2) {$worksheet1 = $WorkSheetName[0] ; $workSheet2 = $WorkSheetName[1]}
|
||||
elseif ($WorkSheetName -is [string]) {$worksheet1 = $workSheet2 = $WorkSheetName}
|
||||
if ($WorksheetName.count -eq 2) {$worksheet1 = $WorksheetName[0] ; $worksheet2 = $WorksheetName[1]}
|
||||
elseif ($WorksheetName -is [string]) {$worksheet1 = $worksheet2 = $WorksheetName}
|
||||
else {Write-Warning -Message "You must provide either a single worksheet name or two names." ; return }
|
||||
|
||||
$params= @{ ErrorAction = [System.Management.Automation.ActionPreference]::Stop }
|
||||
foreach ($p in @("HeaderName","NoHeader","StartRow")) {if ($PSBoundParameters[$p]) {$params[$p] = $PSBoundParameters[$p]}}
|
||||
try {
|
||||
$sheet1 = Import-Excel -Path $Referencefile -WorksheetName $WorkSheet1 @params
|
||||
$sheet2 = Import-Excel -Path $Differencefile -WorksheetName $WorkSheet2 @Params
|
||||
$sheet1 = Import-Excel -Path $Referencefile -WorksheetName $worksheet1 @params
|
||||
$sheet2 = Import-Excel -Path $Differencefile -WorksheetName $worksheet2 @Params
|
||||
}
|
||||
catch {Write-Warning -Message "Could not read the worksheet from $Referencefile and/or $Differencefile." ; return }
|
||||
|
||||
@@ -57,7 +57,7 @@
|
||||
$propList = @()
|
||||
foreach ($p in $Property) {$propList += ($headings.where({$_ -like $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
|
||||
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 ($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}
|
||||
if ($updates) {
|
||||
$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." }
|
||||
|
||||
#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) {
|
||||
Start-Process -FilePath $Referencefile
|
||||
if (-not $oneFile) { Start-Process -FilePath $Differencefile }
|
||||
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) {
|
||||
$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.
|
||||
$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 .
|
||||
|
||||
#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
|
||||
$Sheet2 | ForEach-Object -Begin {$Rowhash = @{} } -Process {$Rowhash[$_.$key] = $_._row }
|
||||
$Sheet2 | ForEach-Object -Begin {$rowHash = @{} } -Process {$rowHash[$_.$Key] = $_._row }
|
||||
|
||||
$ExpandedDiff = ForEach ($g in $GroupedRows) {
|
||||
#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 ($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.
|
||||
$hash[">Row"] = $Rowhash[$g.Name]
|
||||
$hash[">Row"] = $rowHash[$g.Name]
|
||||
#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
|
||||
foreach ($p in $propList.Where({$_ -ne $key})) {
|
||||
foreach ($p in $propList.Where({$_ -ne $Key})) {
|
||||
if ($result.SideIndicator -eq "==") {$hash[("=>$P")] = $hash[("<=$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" }
|
||||
elseif ( $IncludeEqual) {$ExpandedDiff = $ExpandedDiff | 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 (-not $PassThru) {return ($diff | Select-Object -Property (@(@{n="_Side";e={$_.SideIndicator}},"_File" ,"_Sheet","_Row") + $propList))}
|
||||
|
||||
@@ -3,56 +3,56 @@
|
||||
param (
|
||||
[parameter(Mandatory=$true)]
|
||||
$Path,
|
||||
$workSheetname = "Sheet1" ,
|
||||
$WorksheetName = "Sheet1" ,
|
||||
[parameter(Mandatory=$true)]
|
||||
$range,
|
||||
$destination = "$pwd\temp.png",
|
||||
[switch]$show
|
||||
$Range,
|
||||
$Destination = "$pwd\temp.png",
|
||||
[switch]$Show
|
||||
)
|
||||
$extension = $destination -replace '^.*\.(\w+)$' ,'$1'
|
||||
$extension = $Destination -replace '^.*\.(\w+)$' ,'$1'
|
||||
if ($extension -in @('JPEG','BMP','PNG')) {
|
||||
$Format = [system.Drawing.Imaging.ImageFormat]$extension
|
||||
} #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}
|
||||
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"
|
||||
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.Worksheets($workSheetname).Select()
|
||||
$null = $xlWbk.ActiveSheet.Range($range).Select()
|
||||
$xlWbk.Worksheets($WorksheetName).Select()
|
||||
$null = $xlWbk.ActiveSheet.Range($Range).Select()
|
||||
$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.
|
||||
$image = Get-Clipboard -Format Image
|
||||
$image.Save($destination, $Format)
|
||||
Write-Progress -Activity "Exporting $range of $workSheetname in $Path" -Status "Closing Excel"
|
||||
$image.Save($Destination, $Format)
|
||||
Write-Progress -Activity "Exporting $Range of $WorksheetName in $Path" -Status "Closing Excel"
|
||||
$null = $xlWbk.ActiveSheet.Range("a1").Select()
|
||||
$null = $xlApp.Selection.Copy()
|
||||
$xlApp.Quit()
|
||||
Write-Progress -Activity "Exporting $range of $workSheetname in $Path" -Completed
|
||||
if ($show) {Start-Process -FilePath $destination}
|
||||
else {Get-Item -Path $destination}
|
||||
Write-Progress -Activity "Exporting $Range of $WorksheetName in $Path" -Completed
|
||||
if ($Show) {Start-Process -FilePath $Destination}
|
||||
else {Get-Item -Path $Destination}
|
||||
}
|
||||
<#
|
||||
del demo*.xlsx
|
||||
|
||||
$workSheetname = 'Processes'
|
||||
$worksheetName = 'Processes'
|
||||
$Path = "$pwd\demo.xlsx"
|
||||
$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
|
||||
$workSheet = $excelPackage.Workbook.Worksheets[$workSheetname]
|
||||
$range = $workSheet.Dimension.Address
|
||||
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 "F:F" -NumberFormat "dd MMMM HH:mm:ss" -AutoFit
|
||||
Add-ConditionalFormatting -Worksheet $workSheet -Range "c2:c1000" -DataBarColor Blue
|
||||
Add-ConditionalFormatting -Worksheet $workSheet -Range "b2:B1000" -RuleType GreaterThan -ConditionValue '104857600' -ForeGroundColor "Red" -Bold
|
||||
$excelPackage = $myData | Export-Excel -KillExcel -Path $Path -WorksheetName $worksheetName -ClearSheet -AutoSize -AutoFilter -BoldTopRow -FreezeTopRow -PassThru
|
||||
$worksheet = $excelPackage.Workbook.Worksheets[$worksheetName]
|
||||
$range = $worksheet.Dimension.Address
|
||||
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 "F:F" -NumberFormat "dd MMMM HH:mm:ss" -AutoFit
|
||||
Add-ConditionalFormatting -Worksheet $worksheet -Range "c2:c1000" -DataBarColor Blue
|
||||
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
|
||||
@@ -5,16 +5,16 @@ function ConvertFrom-ExcelData {
|
||||
[Parameter(ValueFromPipelineByPropertyName = $true, ValueFromPipeline = $true, Mandatory = $true)]
|
||||
[ValidateScript( { Test-Path $_ -PathType Leaf })]
|
||||
$Path,
|
||||
[ScriptBlock]$scriptBlock,
|
||||
[ScriptBlock]$ScriptBlock,
|
||||
[Alias("Sheet")]
|
||||
$WorkSheetname = 1,
|
||||
$WorksheetName = 1,
|
||||
[int]$HeaderRow = 1,
|
||||
[string[]]$Header,
|
||||
[switch]$NoHeader,
|
||||
[switch]$DataOnly
|
||||
)
|
||||
|
||||
$null = $PSBoundParameters.Remove('scriptBlock')
|
||||
$null = $PSBoundParameters.Remove('ScriptBlock')
|
||||
$params = @{} + $PSBoundParameters
|
||||
|
||||
$data = Import-Excel @params
|
||||
@@ -24,6 +24,6 @@ function ConvertFrom-ExcelData {
|
||||
Select-Object -ExpandProperty name
|
||||
|
||||
foreach ($record in $data) {
|
||||
& $scriptBlock $PropertyNames $record
|
||||
& $ScriptBlock $PropertyNames $record
|
||||
}
|
||||
}
|
||||
@@ -8,7 +8,7 @@ function ConvertFrom-ExcelToSQLInsert {
|
||||
[ValidateScript( { Test-Path $_ -PathType Leaf })]
|
||||
$Path,
|
||||
[Alias("Sheet")]
|
||||
$WorkSheetname = 1,
|
||||
$WorksheetName = 1,
|
||||
[Alias('HeaderRow', 'TopRow')]
|
||||
[ValidateRange(1, 9999)]
|
||||
[Int]$StartRow,
|
||||
@@ -16,12 +16,12 @@ function ConvertFrom-ExcelToSQLInsert {
|
||||
[switch]$NoHeader,
|
||||
[switch]$DataOnly,
|
||||
[switch]$ConvertEmptyStringsToNull,
|
||||
[switch]$UseMSSQLSyntax
|
||||
[switch]$UseMsSqlSyntax
|
||||
)
|
||||
|
||||
$null = $PSBoundParameters.Remove('TableName')
|
||||
$null = $PSBoundParameters.Remove('ConvertEmptyStringsToNull')
|
||||
$null = $PSBoundParameters.Remove('UseMSSQLSyntax')
|
||||
$null = $PSBoundParameters.Remove('UseMsSqlSyntax')
|
||||
|
||||
$params = @{} + $PSBoundParameters
|
||||
|
||||
@@ -29,7 +29,7 @@ function ConvertFrom-ExcelToSQLInsert {
|
||||
param($propertyNames, $record)
|
||||
|
||||
$ColumnNames = "'" + ($PropertyNames -join "', '") + "'"
|
||||
if($UseMSSQLSyntax) {
|
||||
if($UseMsSqlSyntax) {
|
||||
$ColumnNames = "[" + ($PropertyNames -join "], [") + "]"
|
||||
}
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
[Parameter(Mandatory = $true,ValueFromPipeline=$true)]
|
||||
[Alias('SourceWorkbook')]
|
||||
$SourceObject,
|
||||
$SourceWorkSheet = 1 ,
|
||||
$SourceWorksheet = 1 ,
|
||||
[Parameter(Mandatory = $true)]
|
||||
$DestinationWorkbook,
|
||||
$DestinationWorksheet,
|
||||
@@ -39,7 +39,7 @@
|
||||
return
|
||||
}
|
||||
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
|
||||
return
|
||||
}
|
||||
@@ -47,15 +47,15 @@
|
||||
}
|
||||
else {
|
||||
if ($SourceObject -is [OfficeOpenXml.ExcelWorksheet]) {$sourceWs = $SourceObject}
|
||||
elseif ($SourceObject -is [OfficeOpenXml.ExcelWorkbook]) {$sourceWs = $SourceObject.Worksheets[$SourceWorkSheet]}
|
||||
elseif ($SourceObject -is [OfficeOpenXml.ExcelPackage] ) {$sourceWs = $SourceObject.Workbook.Worksheets[$SourceWorkSheet]}
|
||||
elseif ($SourceObject -is [OfficeOpenXml.ExcelWorkbook]) {$sourceWs = $SourceObject.Worksheets[$SourceWorksheet]}
|
||||
elseif ($SourceObject -is [OfficeOpenXml.ExcelPackage] ) {$sourceWs = $SourceObject.Workbook.Worksheets[$SourceWorksheet]}
|
||||
else {
|
||||
$SourceObject = (Resolve-Path $SourceObject).ProviderPath
|
||||
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'
|
||||
$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}
|
||||
}
|
||||
@@ -76,7 +76,7 @@
|
||||
$DestinationWorkbook.Worksheets.Delete($DestinationWorksheet)
|
||||
}
|
||||
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
|
||||
if ($stream) {$stream.Close() }
|
||||
if ($package1) {Close-ExcelPackage -ExcelPackage $package1 -NoSave }
|
||||
|
||||
@@ -132,7 +132,7 @@
|
||||
$WorksheetName = $ws.Name
|
||||
}
|
||||
}
|
||||
catch {throw "Could not get worksheet $worksheetname"}
|
||||
catch {throw "Could not get worksheet $WorksheetName"}
|
||||
try {
|
||||
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
|
||||
@@ -176,23 +176,23 @@
|
||||
}
|
||||
elseif ($Title) {
|
||||
#Can only add a title if not appending!
|
||||
$Row = $StartRow
|
||||
$ws.Cells[$Row, $StartColumn].Value = $Title
|
||||
$ws.Cells[$Row, $StartColumn].Style.Font.Size = $TitleSize
|
||||
$row = $StartRow
|
||||
$ws.Cells[$row, $StartColumn].Value = $Title
|
||||
$ws.Cells[$row, $StartColumn].Style.Font.Size = $TitleSize
|
||||
|
||||
if ($PSBoundParameters.ContainsKey("TitleBold")) {
|
||||
#Set title to Bold face font if -TitleBold was specified.
|
||||
#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 -is [string]) {$TitleBackgroundColor = [System.Drawing.Color]::$TitleBackgroundColor }
|
||||
$ws.Cells[$Row, $StartColumn].Style.Fill.PatternType = $TitleFillPattern
|
||||
$ws.Cells[$Row, $StartColumn].Style.Fill.BackgroundColor.SetColor($TitleBackgroundColor)
|
||||
$ws.Cells[$row, $StartColumn].Style.Fill.PatternType = $TitleFillPattern
|
||||
$ws.Cells[$row, $StartColumn].Style.Fill.BackgroundColor.SetColor($TitleBackgroundColor)
|
||||
}
|
||||
$Row ++ ; $startRow ++
|
||||
$row ++ ; $startRow ++
|
||||
}
|
||||
else { $Row = $StartRow }
|
||||
else { $row = $StartRow }
|
||||
$ColumnIndex = $StartColumn
|
||||
$Numberformat = Expand-NumberFormat -NumberFormat $Numberformat
|
||||
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}
|
||||
if ($NoHeader) {
|
||||
# Don't push the headers to the spreadsheet
|
||||
$Row -= 1
|
||||
$row -= 1
|
||||
}
|
||||
else {
|
||||
$ColumnIndex = $StartColumn
|
||||
foreach ($Name in $script:Header) {
|
||||
$ws.Cells[$Row, $ColumnIndex].Value = $Name
|
||||
Write-Verbose "Cell '$Row`:$ColumnIndex' add header '$Name'"
|
||||
$ws.Cells[$row, $ColumnIndex].Value = $Name
|
||||
Write-Verbose "Cell '$row`:$ColumnIndex' add header '$Name'"
|
||||
$ColumnIndex += 1
|
||||
}
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
#region Add non header values
|
||||
$Row += 1
|
||||
$row += 1
|
||||
$ColumnIndex = $StartColumn
|
||||
<#
|
||||
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}
|
||||
try {
|
||||
if ($v -is [DateTime]) {
|
||||
$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].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.
|
||||
}
|
||||
elseif ($v -is [TimeSpan]) {
|
||||
$ws.Cells[$Row, $ColumnIndex].Value = $v
|
||||
$ws.Cells[$Row, $ColumnIndex].Style.Numberformat.Format = '[h]:mm:ss'
|
||||
$ws.Cells[$row, $ColumnIndex].Value = $v
|
||||
$ws.Cells[$row, $ColumnIndex].Style.Numberformat.Format = '[h]:mm:ss'
|
||||
}
|
||||
elseif ($v -is [System.ValueType]) {
|
||||
$ws.Cells[$Row, $ColumnIndex].Value = $v
|
||||
if ($setNumformat) {$ws.Cells[$Row, $ColumnIndex].Style.Numberformat.Format = $Numberformat }
|
||||
$ws.Cells[$row, $ColumnIndex].Value = $v
|
||||
if ($setNumformat) {$ws.Cells[$row, $ColumnIndex].Style.Numberformat.Format = $Numberformat }
|
||||
}
|
||||
elseif ($v -is [uri] ) {
|
||||
$ws.Cells[$Row, $ColumnIndex].HyperLink = $v
|
||||
$ws.Cells[$Row, $ColumnIndex].Style.Font.Color.SetColor([System.Drawing.Color]::Blue)
|
||||
$ws.Cells[$Row, $ColumnIndex].Style.Font.UnderLine = $true
|
||||
$ws.Cells[$row, $ColumnIndex].HyperLink = $v
|
||||
$ws.Cells[$row, $ColumnIndex].Style.Font.Color.SetColor([System.Drawing.Color]::Blue)
|
||||
$ws.Cells[$row, $ColumnIndex].Style.Font.UnderLine = $true
|
||||
}
|
||||
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 '=') {
|
||||
$ws.Cells[$Row, $ColumnIndex].Formula = ($v -replace '^=','')
|
||||
if ($setNumformat) {$ws.Cells[$Row, $ColumnIndex].Style.Numberformat.Format = $Numberformat }
|
||||
$ws.Cells[$row, $ColumnIndex].Formula = ($v -replace '^=','')
|
||||
if ($setNumformat) {$ws.Cells[$row, $ColumnIndex].Style.Numberformat.Format = $Numberformat }
|
||||
}
|
||||
elseif ( [System.Uri]::IsWellFormedUriString($v , [System.UriKind]::Absolute) ) {
|
||||
if ($v -match "^xl://internal/") {
|
||||
$referenceAddress = $v -replace "^xl://internal/" , ""
|
||||
$display = $referenceAddress -replace "!A1$" , ""
|
||||
$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
|
||||
$ws.Cells[$Row, $ColumnIndex].Style.Font.Color.SetColor([System.Drawing.Color]::Blue)
|
||||
$ws.Cells[$Row, $ColumnIndex].Style.Font.UnderLine = $true
|
||||
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.UnderLine = $true
|
||||
}
|
||||
else {
|
||||
$number = $null
|
||||
@@ -346,15 +346,15 @@
|
||||
$NoNumberConversion -notcontains $Name -and
|
||||
[Double]::TryParse($v, [System.Globalization.NumberStyles]::Any, [System.Globalization.NumberFormatInfo]::CurrentInfo, [Ref]$number)
|
||||
) {
|
||||
$ws.Cells[$Row, $ColumnIndex].Value = $number
|
||||
if ($setNumformat) {$ws.Cells[$Row, $ColumnIndex].Style.Numberformat.Format = $Numberformat }
|
||||
$ws.Cells[$row, $ColumnIndex].Value = $number
|
||||
if ($setNumformat) {$ws.Cells[$row, $ColumnIndex].Style.Numberformat.Format = $Numberformat }
|
||||
}
|
||||
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 # column index will be the last column whether isDataTypeValueType was true or false
|
||||
@@ -371,7 +371,7 @@
|
||||
$endAddress = $ws.Dimension.End.Address
|
||||
}
|
||||
else {
|
||||
$LastRow = $Row
|
||||
$LastRow = $row
|
||||
$LastCol = $ColumnIndex
|
||||
$endAddress = [OfficeOpenXml.ExcelAddress]::GetAddress($LastRow , $LastCol)
|
||||
}
|
||||
@@ -435,8 +435,8 @@
|
||||
$params = $item.value
|
||||
if ($Activate) {$params.Activate = $true }
|
||||
if ($params.keys -notcontains 'SourceRange' -and
|
||||
($params.Keys -notcontains 'SourceWorkSheet' -or $params.SourceWorkSheet -eq $WorksheetName)) {$params.SourceRange = $dataRange}
|
||||
if ($params.Keys -notcontains 'SourceWorkSheet') {$params.SourceWorkSheet = $ws }
|
||||
($params.Keys -notcontains 'SourceWorksheet' -or $params.SourceWorksheet -eq $WorksheetName)) {$params.SourceRange = $dataRange}
|
||||
if ($params.Keys -notcontains 'SourceWorksheet') {$params.SourceWorksheet = $ws }
|
||||
if ($params.Keys -notcontains 'NoTotalsInPivot' -and $NoTotalsInPivot ) {$params.PivotTotals = 'None'}
|
||||
if ($params.Keys -notcontains 'PivotTotals' -and $PivotTotals ) {$params.PivotTotals = $PivotTotals}
|
||||
if ($params.Keys -notcontains 'PivotDataToColumn' -and $PivotDataToColumn) {$params.PivotDataToColumn = $true}
|
||||
@@ -471,7 +471,7 @@
|
||||
if ($ShowPercent) {$params.ShowPercent = $true}
|
||||
if ($NoLegend) {$params.NoLegend = $true}
|
||||
}
|
||||
Add-PivotTable -ExcelPackage $pkg -SourceWorkSheet $ws @params
|
||||
Add-PivotTable -ExcelPackage $pkg -SourceWorksheet $ws @params
|
||||
}
|
||||
|
||||
try {
|
||||
@@ -544,7 +544,7 @@
|
||||
|
||||
foreach ($Sheet in $HideSheet) {
|
||||
try {
|
||||
$pkg.Workbook.WorkSheets.Where({$_.Name -like $sheet}) | ForEach-Object {
|
||||
$pkg.Workbook.Worksheets.Where({$_.Name -like $sheet}) | ForEach-Object {
|
||||
$_.Hidden = 'Hidden'
|
||||
Write-verbose -Message "Sheet '$($_.Name)' Hidden."
|
||||
}
|
||||
@@ -553,7 +553,7 @@
|
||||
}
|
||||
foreach ($Sheet in $UnHideSheet) {
|
||||
try {
|
||||
$pkg.Workbook.WorkSheets.Where({$_.Name -like $sheet}) | ForEach-Object {
|
||||
$pkg.Workbook.Worksheets.Where({$_.Name -like $sheet}) | ForEach-Object {
|
||||
$_.Hidden = 'Visible'
|
||||
Write-verbose -Message "Sheet '$($_.Name)' shown"
|
||||
}
|
||||
|
||||
@@ -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
|
||||
@@ -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 }
|
||||
}
|
||||
@@ -1,11 +1,11 @@
|
||||
function Get-ExcelColumnName {
|
||||
param(
|
||||
[Parameter(ValueFromPipeline=$true)]
|
||||
$columnNumber=1
|
||||
$ColumnNumber=1
|
||||
)
|
||||
|
||||
Process {
|
||||
$dividend = $columnNumber
|
||||
$dividend = $ColumnNumber
|
||||
$columnName = New-Object System.Collections.ArrayList($null)
|
||||
|
||||
while($dividend -gt 0) {
|
||||
@@ -19,7 +19,7 @@ function Get-ExcelColumnName {
|
||||
}
|
||||
|
||||
[PSCustomObject] @{
|
||||
ColumnNumber = $columnNumber
|
||||
ColumnNumber = $ColumnNumber
|
||||
ColumnName = $columnName -join ''
|
||||
}
|
||||
|
||||
|
||||
28
Public/Get-ExcelFileSummary.ps1
Normal file
28
Public/Get-ExcelFileSummary.ps1
Normal 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
|
||||
}
|
||||
}
|
||||
@@ -3,16 +3,16 @@
|
||||
function Get-HtmlTable {
|
||||
param(
|
||||
[Parameter(Mandatory=$true)]
|
||||
$url,
|
||||
$tableIndex=0,
|
||||
$Url,
|
||||
$TableIndex=0,
|
||||
$Header,
|
||||
[int]$FirstDataRow=0,
|
||||
[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
|
||||
$totalRows=@($table.rows).count
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
function Get-Range {
|
||||
[CmdletBinding()]
|
||||
param($start=0,$stop,$step=1)
|
||||
for ($idx = $start; $idx -lt $stop; $idx+=$step) {$idx}
|
||||
param($Start=0,$Stop,$Step=1)
|
||||
for ($idx = $Start; $idx -lt $Stop; $idx+=$Step) {$idx}
|
||||
}
|
||||
@@ -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
|
||||
@@ -1,8 +1,8 @@
|
||||
function Get-XYRange {
|
||||
[CmdletBinding()]
|
||||
param($targetData)
|
||||
param($TargetData)
|
||||
|
||||
$record = $targetData | Select-Object -First 1
|
||||
$record = $TargetData | Select-Object -First 1
|
||||
$p=$record.psobject.Properties.name
|
||||
|
||||
$infer = for ($idx = 0; $idx -lt $p.Count; $idx++) {
|
||||
|
||||
@@ -115,7 +115,7 @@
|
||||
try {
|
||||
#Select worksheet
|
||||
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
|
||||
}
|
||||
|
||||
@@ -142,12 +142,12 @@
|
||||
}
|
||||
else {
|
||||
$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." } }
|
||||
elseif ($HeaderName) { $Rows = $StartRow..$EndRow }
|
||||
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 }
|
||||
else {
|
||||
$Rows = (1 + $StartRow)..$EndRow
|
||||
$rows = (1 + $StartRow)..$EndRow
|
||||
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
|
||||
}
|
||||
#endregion
|
||||
if (-not $Rows) {
|
||||
if (-not $rows) {
|
||||
Write-Warning "Worksheet '$WorksheetName' in workbook '$Path' contains no data in the rows after top row '$StartRow'"
|
||||
}
|
||||
else {
|
||||
@@ -186,7 +186,7 @@
|
||||
$TextColRegEx = New-Object -TypeName regex -ArgumentList $TextColExpression , 9
|
||||
}
|
||||
else {$TextColRegEx = $null}
|
||||
foreach ($R in $Rows) {
|
||||
foreach ($R in $rows) {
|
||||
#Disabled write-verbose for speed
|
||||
# Write-Verbose "Import row '$R'"
|
||||
$NewRow = [Ordered]@{ }
|
||||
@@ -213,7 +213,7 @@
|
||||
#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 {
|
||||
if ($Path) { $stream.close(); $ExcelPackage.Dispose() }
|
||||
}
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
function Import-Html {
|
||||
[CmdletBinding()]
|
||||
param(
|
||||
$url,
|
||||
$index,
|
||||
$Url,
|
||||
$Index,
|
||||
$Header,
|
||||
[int]$FirstDataRow=0,
|
||||
[Switch]$UseDefaultCredentials
|
||||
@@ -14,7 +14,7 @@ function Import-Html {
|
||||
|
||||
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
|
||||
}
|
||||
@@ -1,17 +1,17 @@
|
||||
function Invoke-Sum {
|
||||
[CmdletBinding()]
|
||||
param(
|
||||
$data,
|
||||
$dimension,
|
||||
$measure
|
||||
$Data,
|
||||
$Dimension,
|
||||
$Measure
|
||||
)
|
||||
|
||||
if(!$measure) {$measure = $dimension}
|
||||
if(!$Measure) {$Measure = $Dimension}
|
||||
|
||||
$h=@{}
|
||||
|
||||
foreach ($item in $data){
|
||||
$key=$item.$dimension
|
||||
foreach ($item in $Data){
|
||||
$key=$item.$Dimension
|
||||
|
||||
if(!$key) {$key="[missing]"}
|
||||
|
||||
@@ -19,7 +19,7 @@ function Invoke-Sum {
|
||||
$h.$key=[ordered]@{}
|
||||
}
|
||||
|
||||
foreach($m in $measure) {
|
||||
foreach($m in $Measure) {
|
||||
$value = $item.$m
|
||||
if($value -is [string] -or $value -is [System.Enum]) {
|
||||
$value = 1
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
[Parameter(Mandatory = $true, ParameterSetName = "PackageDefault")]
|
||||
[Parameter(Mandatory = $true, ParameterSetName = "PackageTable")]
|
||||
[OfficeOpenXml.ExcelPackage]$ExcelPackage,
|
||||
$WorkSheetName = 'Combined',
|
||||
$WorksheetName = 'Combined',
|
||||
[switch]$Clearsheet,
|
||||
[switch]$NoHeader,
|
||||
[string]$FromLabel = "From" ,
|
||||
@@ -55,10 +55,10 @@
|
||||
)
|
||||
#region get target worksheet, select it and move it to the end.
|
||||
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}
|
||||
$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 = (1 + $destinationSheet.Dimension.End.Row )
|
||||
#endregion
|
||||
@@ -123,7 +123,7 @@
|
||||
'Title', 'TitleFillPattern', 'TitleBackgroundColor', 'TitleBold', 'TitleSize' | ForEach-Object {$null = $params.Remove($_)}
|
||||
if ($params.Keys.Count) {
|
||||
if ($Title) { $params.StartRow = 2}
|
||||
$params.WorkSheetName = $WorkSheetName
|
||||
$params.WorksheetName = $WorksheetName
|
||||
$params.ExcelPackage = $ExcelPackage
|
||||
Export-Excel @Params
|
||||
}
|
||||
|
||||
@@ -75,7 +75,7 @@
|
||||
$orderByProperties = $merged[0].psobject.properties.where({$_.name -match "row$"}).name
|
||||
Write-Progress -Activity "Merging sheets" -CurrentOperation "creating output sheet '$OutputSheetName' in $OutputFile"
|
||||
$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]
|
||||
|
||||
#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
|
||||
#headers prefixed with the ref file name, $colnames is the basis of a regular expression to identify what should have $refPrefix appended
|
||||
$colNames = @("^_Row$")
|
||||
if ($key -ne "*")
|
||||
if ($Key -ne "*")
|
||||
{$colnames += "^$Key$"}
|
||||
if ($filesToProcess.Count -ge 2) {
|
||||
$refPrefix = (Split-Path -Path $filestoProcess[0] -Leaf) -replace "\.xlsx$"," "
|
||||
|
||||
@@ -122,8 +122,8 @@
|
||||
foreach ($p in $Property) { $propList += ($headings.where({$_ -like $p}) )}
|
||||
foreach ($p in $ExcludeProperty) { $propList = $propList.where({$_ -notlike $p}) }
|
||||
if (($propList -notcontains $Key) -and
|
||||
('*' -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
|
||||
('*' -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
|
||||
|
||||
#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 " + ")
|
||||
@@ -131,12 +131,12 @@
|
||||
#Build the list of the properties to output, in order.
|
||||
$diffpart = @()
|
||||
$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
|
||||
$FirstDiffColNo = $lastRefColNo + 1
|
||||
|
||||
if ($key -ne '*') {
|
||||
$outputProps = @($key) + $refpart + $diffpart
|
||||
if ($Key -ne '*') {
|
||||
$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
|
||||
$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
|
||||
#If we have "*" as the key ad the script property to concatenate the [selected] properties.
|
||||
|
||||
$Rowhash = @{}
|
||||
$rowHash = @{}
|
||||
$rowNo = $firstDataRow
|
||||
foreach ($row in $ReferenceObject) {
|
||||
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
|
||||
if ($Key -eq '*' ) {
|
||||
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 ++
|
||||
}
|
||||
if ($DifferenceObject.count -gt $Rowhash.Keys.Count) {
|
||||
Write-Warning -Message "Difference object has $($DifferenceObject.Count) rows; but only $($Rowhash.keys.count) unique keys"
|
||||
if ($DifferenceObject.count -gt $rowHash.Keys.Count) {
|
||||
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
|
||||
#We need to know all the properties we've met on the objects we've diffed
|
||||
$eDiffProps = [ordered]@{}
|
||||
#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 |
|
||||
Group-Object -Property $key | ForEach-Object {
|
||||
Group-Object -Property $Key | ForEach-Object {
|
||||
#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.
|
||||
$hash = [ordered]@{}
|
||||
foreach ($result in $_.Group) {
|
||||
@@ -187,7 +187,7 @@
|
||||
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 ($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 = "<>"
|
||||
}
|
||||
else {$hash["Side"] = $result.SideIndicator}
|
||||
@@ -204,10 +204,10 @@
|
||||
'<=' { $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.
|
||||
$hash["$DiffPrefix Row"] = $Rowhash[$keyval]
|
||||
$hash[$key] = $keyval
|
||||
$hash["$DiffPrefix Row"] = $rowHash[$keyVal]
|
||||
$hash[$Key] = $keyVal
|
||||
#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)
|
||||
{$hash[("$p")] = $hash[("$DiffPrefix $p")] = $result.$P}
|
||||
elseif ($result.SideIndicator -eq "==" -or $result.SideIndicator -eq "<=")
|
||||
@@ -233,7 +233,7 @@
|
||||
elseif ($PSCmdlet.ShouldProcess($OutputFile,"Write Output to Excel file")) {
|
||||
$expandedDiff = $expandedDiff | Sort-Object -Property "_row", "$DiffPrefix Row"
|
||||
$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]
|
||||
for ($i = 0; $i -lt $expandedDiff.Count; $i++ ) {
|
||||
if ( $expandedDiff[$i].side -ne "==" ) {
|
||||
|
||||
@@ -5,7 +5,7 @@ function New-PivotTableDefinition {
|
||||
[Parameter(Mandatory)]
|
||||
[Alias("PivtoTableName")]#Previous typo - use alias to avoid breaking scripts
|
||||
$PivotTableName,
|
||||
$SourceWorkSheet,
|
||||
$SourceWorksheet,
|
||||
$SourceRange,
|
||||
$PivotRows,
|
||||
[hashtable]$PivotData,
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
[Parameter(ParameterSetName="ExistingSession", Mandatory=$true)]
|
||||
$Session,
|
||||
[Parameter(ParameterSetName="SQLConnection", Mandatory=$true)]
|
||||
[switch]$MsSQLserver,
|
||||
[switch]$MsSqlServer,
|
||||
[Parameter(ParameterSetName="SQLConnection")]
|
||||
[String]$DataBase,
|
||||
[Parameter(ParameterSetName="SQLConnection", Mandatory=$true)]
|
||||
@@ -46,10 +46,10 @@
|
||||
$null = $PSBoundParameters.Remove('AutoFilter')
|
||||
}
|
||||
#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 {
|
||||
#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 we got -MsSqlServer, create a SQL connection, if we didn't but we got -Connection create an ODBC connection
|
||||
if ($MsSqlServer -and $Connection) {
|
||||
if ($Connection -notmatch '=') {$Connection = "server=$Connection;trusted_connection=true;timeout=60"}
|
||||
$Session = New-Object -TypeName System.Data.SqlClient.SqlConnection -ArgumentList $Connection
|
||||
if ($Session.State -ne 'Open') {$Session.Open()}
|
||||
@@ -90,7 +90,7 @@
|
||||
#endregion
|
||||
#region send the table to 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($_) }
|
||||
#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) {
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
[Parameter(ParameterSetName="Package",Mandatory=$true)]
|
||||
[OfficeOpenXml.ExcelPackage]$ExcelPackage,
|
||||
[Parameter(ParameterSetName="Package")]
|
||||
[String]$Worksheetname = "Sheet1",
|
||||
[String]$WorksheetName = "Sheet1",
|
||||
[Parameter(ParameterSetName="sheet",Mandatory=$true)]
|
||||
[OfficeOpenXml.ExcelWorksheet]$Worksheet,
|
||||
[Parameter(ValueFromPipeline=$true)]
|
||||
@@ -52,10 +52,10 @@
|
||||
begin {
|
||||
#if we were passed a package object and a worksheet name , get the worksheet.
|
||||
if ($ExcelPackage) {
|
||||
if ($ExcelPackage.Workbook.Worksheets.Name -notcontains $Worksheetname) {
|
||||
throw "The Workbook does not contain a sheet named '$Worksheetname'"
|
||||
if ($ExcelPackage.Workbook.Worksheets.Name -notcontains $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,
|
||||
@@ -66,7 +66,7 @@
|
||||
$endRow = $Worksheet.Dimension.End.Row
|
||||
}
|
||||
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 }
|
||||
$columnName = (New-Object 'OfficeOpenXml.ExcelCellAddress' @(1, $column)).Address -replace "1",""
|
||||
Write-Verbose -Message "Updating Column $columnName"
|
||||
@@ -120,7 +120,7 @@
|
||||
Set-ExcelRange -Worksheet $Worksheet -Range $theRange @params
|
||||
}
|
||||
#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.
|
||||
if ($PassThru) { $Worksheet.Column($Column)}
|
||||
elseif ($ReturnRange) { $theRange}
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
[Parameter(ParameterSetName="Package",Mandatory=$true)]
|
||||
[OfficeOpenXml.ExcelPackage]$ExcelPackage,
|
||||
[Parameter(ParameterSetName="Package")]
|
||||
$Worksheetname = "Sheet1",
|
||||
$WorksheetName = "Sheet1",
|
||||
[Parameter(ParameterSetName="Sheet",Mandatory=$true)]
|
||||
[OfficeOpenXml.Excelworksheet] $Worksheet,
|
||||
[Parameter(ValueFromPipeline = $true)]
|
||||
@@ -53,10 +53,10 @@
|
||||
begin {
|
||||
#if we were passed a package object and a worksheet name , get the worksheet.
|
||||
if ($ExcelPackage) {
|
||||
if ($ExcelPackage.Workbook.Worksheets.Name -notcontains $Worksheetname) {
|
||||
throw "The Workbook does not contain a sheet named '$Worksheetname'"
|
||||
if ($ExcelPackage.Workbook.Worksheets.Name -notcontains $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,
|
||||
#if row and start column aren't specified assume first unused row, and first column
|
||||
@@ -66,7 +66,7 @@
|
||||
$endRow = $Worksheet.Dimension.End.Row
|
||||
}
|
||||
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 }
|
||||
Write-Verbose -Message "Updating Row $Row"
|
||||
#Add a row label
|
||||
@@ -117,7 +117,7 @@
|
||||
Set-ExcelRange -Worksheet $Worksheet -Range $theRange @params
|
||||
}
|
||||
#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.
|
||||
if ($passThru) {$Worksheet.Row($Row)}
|
||||
elseif ($ReturnRange) {$theRange}
|
||||
|
||||
74
SUMMARY.md
Normal file
74
SUMMARY.md
Normal 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)
|
||||
|
||||
@@ -12,6 +12,9 @@ Describe "Compare Worksheet" {
|
||||
}
|
||||
}
|
||||
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"
|
||||
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
|
||||
@@ -196,6 +199,9 @@ Describe "Compare Worksheet" {
|
||||
|
||||
Describe "Merge Worksheet" {
|
||||
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
|
||||
[System.Collections.ArrayList]$s = Get-service | Select-Object -first 25 -Property *
|
||||
|
||||
@@ -261,6 +267,11 @@ Describe "Merge Worksheet" {
|
||||
}
|
||||
}
|
||||
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" {
|
||||
BeforeAll {
|
||||
Remove-Item -Path "TestDrive:\server*.xlsx" , "TestDrive:\combined*.xlsx" -ErrorAction SilentlyContinue
|
||||
|
||||
@@ -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' {
|
||||
BeforeAll {
|
||||
$scriptPath = $PSScriptRoot
|
||||
$dataPath = Join-Path -Path $scriptPath -ChildPath "First10Races.xlsx"
|
||||
|
||||
$Outpath = "TestDrive:\"
|
||||
ConvertFrom-ExcelSheet -Path $dataPath -OutputPath $Outpath
|
||||
$firstText = Get-Content (Join-path -Path $Outpath -ChildPath "First10Races.csv")
|
||||
ConvertFrom-ExcelSheet -Path $dataPath -OutputPath $Outpath -AsText GridPosition,date
|
||||
$SecondText = 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
|
||||
$script:SecondText = Get-Content (Join-path -Path $Outpath -ChildPath "First10Races.csv")
|
||||
ConvertFrom-ExcelSheet -Path $dataPath -OutputPath $Outpath -AsText "GridPosition" -Property driver,
|
||||
@{n="date"; e={[datetime]::FromOADate($_.Date).tostring("#MM/dd/yyyy#")}} , FinishPosition, GridPosition
|
||||
$ThirdText = Get-Content (Join-path -Path $Outpath -ChildPath "First10Races.csv")
|
||||
@{n = "date"; e = { [datetime]::FromOADate($_.Date).tostring("#MM/dd/yyyy#") } } , FinishPosition, GridPosition
|
||||
$script:ThirdText = Get-Content (Join-path -Path $Outpath -ChildPath "First10Races.csv")
|
||||
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" {
|
||||
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 " {
|
||||
$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")
|
||||
$secondText[1] | Should -Belike "*$date*"
|
||||
$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]/)'
|
||||
}
|
||||
}
|
||||
Context "Export aliased to ConvertFrom" {
|
||||
Context "Export aliased to ConvertFrom" {
|
||||
it "Definded the alias name with " {
|
||||
(Get-Alias Export-ExcelSheet).source | Should -Be "ImportExcel"
|
||||
(Get-Alias Export-ExcelSheet).Definition | Should -Be "ConvertFrom-ExcelSheet"
|
||||
|
||||
@@ -1,32 +1,34 @@
|
||||
if (-not (Get-command Import-Excel -ErrorAction SilentlyContinue)) {
|
||||
Import-Module $PSScriptRoot\..\ImportExcel.psd1
|
||||
}
|
||||
$xlFile = "TestDrive:\testSQL.xlsx"
|
||||
|
||||
Describe "ConvertFrom-ExcelToSQLInsert" {
|
||||
BeforeAll {
|
||||
$script:xlFile = "TestDrive:\testSQL.xlsx"
|
||||
}
|
||||
|
||||
BeforeEach {
|
||||
|
||||
$([PSCustomObject]@{
|
||||
Name="John"
|
||||
Age=$null
|
||||
}) | Export-Excel $xlFile
|
||||
Name = "John"
|
||||
Age = $null
|
||||
}) | Export-Excel $xlFile
|
||||
}
|
||||
|
||||
AfterAll {
|
||||
Remove-Item $xlFile -Recurse -Force -ErrorAction Ignore
|
||||
}
|
||||
|
||||
It "Should be empty double single quotes".PadRight(90) {
|
||||
$expected="INSERT INTO Sheet1 ('Name', 'Age') Values('John', '');"
|
||||
It "Should be empty double single quotes".PadRight(90) {
|
||||
$expected = "INSERT INTO Sheet1 ('Name', 'Age') Values('John', '');"
|
||||
|
||||
$actual = ConvertFrom-ExcelToSQLInsert -Path $xlFile Sheet1
|
||||
|
||||
$actual | Should -Be $expected
|
||||
}
|
||||
|
||||
It "Should have NULL".PadRight(90) {
|
||||
$expected="INSERT INTO Sheet1 ('Name', 'Age') Values('John', NULL);"
|
||||
It "Should have NULL".PadRight(90) {
|
||||
$expected = "INSERT INTO Sheet1 ('Name', 'Age') Values('John', NULL);"
|
||||
|
||||
$actual = ConvertFrom-ExcelToSQLInsert -Path $xlFile Sheet1 -ConvertEmptyStringsToNull
|
||||
|
||||
|
||||
@@ -1,41 +1,46 @@
|
||||
[Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseDeclaredVarsMoreThanAssignments','',Justification='False Positives')]
|
||||
[Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseDeclaredVarsMoreThanAssignments', '', Justification = 'False Positives')]
|
||||
param()
|
||||
|
||||
Describe "Copy-Worksheet" {
|
||||
$path1 = "TestDrive:\Test1.xlsx"
|
||||
$path2 = "TestDrive:\Test2.xlsx"
|
||||
Remove-Item -Path $path1, $path2 -ErrorAction SilentlyContinue
|
||||
BeforeAll {
|
||||
$path1 = "TestDrive:\Test1.xlsx"
|
||||
$path2 = "TestDrive:\Test2.xlsx"
|
||||
Remove-Item -Path $path1, $path2 -ErrorAction SilentlyContinue
|
||||
|
||||
$ProcRange = Get-Process | Export-Excel $path1 -DisplayPropertySet -WorkSheetname Processes -ReturnRange
|
||||
$ProcRange = Get-Process | Export-Excel $path1 -DisplayPropertySet -WorkSheetname Processes -ReturnRange
|
||||
|
||||
if ((Get-Culture).NumberFormat.CurrencySymbol -eq "£") { $OtherCurrencySymbol = "$" }
|
||||
else { $OtherCurrencySymbol = "£" }
|
||||
[PSCustOmobject][Ordered]@{
|
||||
Date = Get-Date
|
||||
Formula1 = '=SUM(F2:G2)'
|
||||
String1 = 'My String'
|
||||
Float = [math]::pi
|
||||
IPAddress = '10.10.25.5'
|
||||
StrLeadZero = '07670'
|
||||
StrComma = '0,26'
|
||||
StrEngThousand = '1,234.56'
|
||||
StrEuroThousand = '1.555,83'
|
||||
StrDot = '1.2'
|
||||
StrNegInt = '-31'
|
||||
StrTrailingNeg = '31-'
|
||||
StrParens = '(123)'
|
||||
strLocalCurrency = ('{0}123.45' -f (Get-Culture).NumberFormat.CurrencySymbol )
|
||||
strOtherCurrency = ('{0}123.45' -f $OtherCurrencySymbol )
|
||||
StrE164Phone = '+32 (444) 444 4444'
|
||||
StrAltPhone1 = '+32 4 4444 444'
|
||||
StrAltPhone2 = '+3244444444'
|
||||
StrLeadSpace = ' 123'
|
||||
StrTrailSpace = '123 '
|
||||
Link1 = [uri]"https://github.com/dfinke/ImportExcel"
|
||||
Link2 = "https://github.com/dfinke/ImportExcel" # Links are not copied correctly, hopefully this will be fixed at some future date
|
||||
} | Export-Excel -NoNumberConversion IPAddress, StrLeadZero, StrAltPhone2 -WorkSheetname MixedTypes -Path $path2
|
||||
if ((Get-Culture).NumberFormat.CurrencySymbol -eq "£") { $OtherCurrencySymbol = "$" }
|
||||
else { $OtherCurrencySymbol = "£" }
|
||||
[PSCustOmobject][Ordered]@{
|
||||
Date = Get-Date
|
||||
Formula1 = '=SUM(F2:G2)'
|
||||
String1 = 'My String'
|
||||
Float = [math]::pi
|
||||
IPAddress = '10.10.25.5'
|
||||
StrLeadZero = '07670'
|
||||
StrComma = '0,26'
|
||||
StrEngThousand = '1,234.56'
|
||||
StrEuroThousand = '1.555,83'
|
||||
StrDot = '1.2'
|
||||
StrNegInt = '-31'
|
||||
StrTrailingNeg = '31-'
|
||||
StrParens = '(123)'
|
||||
strLocalCurrency = ('{0}123.45' -f (Get-Culture).NumberFormat.CurrencySymbol )
|
||||
strOtherCurrency = ('{0}123.45' -f $OtherCurrencySymbol )
|
||||
StrE164Phone = '+32 (444) 444 4444'
|
||||
StrAltPhone1 = '+32 4 4444 444'
|
||||
StrAltPhone2 = '+3244444444'
|
||||
StrLeadSpace = ' 123'
|
||||
StrTrailSpace = '123 '
|
||||
Link1 = [uri]"https://github.com/dfinke/ImportExcel"
|
||||
Link2 = "https://github.com/dfinke/ImportExcel" # Links are not copied correctly, hopefully this will be fixed at some future date
|
||||
} | Export-Excel -NoNumberConversion IPAddress, StrLeadZero, StrAltPhone2 -WorkSheetname MixedTypes -Path $path2
|
||||
}
|
||||
Context "Simplest copy" {
|
||||
BeforeAll {
|
||||
$path1 = "TestDrive:\Test1.xlsx"
|
||||
$path2 = "TestDrive:\Test2.xlsx"
|
||||
|
||||
Copy-ExcelWorksheet -SourceWorkbook $path1 -DestinationWorkbook $path2
|
||||
$excel = Open-ExcelPackage -Path $path2
|
||||
$ws = $excel.Workbook.Worksheets["Processes"]
|
||||
@@ -46,8 +51,9 @@ Describe "Copy-Worksheet" {
|
||||
$ws.Dimension.Address | Should -Be $ProcRange
|
||||
}
|
||||
}
|
||||
Context "Mixed types using a package object" {
|
||||
Context "Mixed types using a package object" {
|
||||
BeforeAll {
|
||||
$excel = Open-ExcelPackage -Path $path2
|
||||
Copy-ExcelWorksheet -SourceWorkbook $excel -DestinationWorkbook $excel -DestinationWorkSheet "CopyOfMixedTypes"
|
||||
Close-ExcelPackage -ExcelPackage $excel
|
||||
$excel = Open-ExcelPackage -Path $path2
|
||||
@@ -66,26 +72,26 @@ Describe "Copy-Worksheet" {
|
||||
$ws.Cells[2, 5].Value.GetType().name | Should -Be 'String'
|
||||
$ws.Cells[2, 6].Value.GetType().name | Should -Be 'String'
|
||||
$ws.Cells[2, 18].Value.GetType().name | Should -Be 'String'
|
||||
($ws.Cells[2, 11].Value -is [valuetype] ) | Should -Be $true
|
||||
($ws.Cells[2, 12].Value -is [valuetype] ) | Should -Be $true
|
||||
($ws.Cells[2, 13].Value -is [valuetype] ) | Should -Be $true
|
||||
($ws.Cells[2, 11].Value -is [valuetype] ) | Should -Be $true
|
||||
($ws.Cells[2, 12].Value -is [valuetype] ) | Should -Be $true
|
||||
($ws.Cells[2, 13].Value -is [valuetype] ) | Should -Be $true
|
||||
$ws.Cells[2, 11].Value | Should -BeLessThan 0
|
||||
$ws.Cells[2, 12].Value | Should -BeLessThan 0
|
||||
$ws.Cells[2, 13].Value | Should -BeLessThan 0
|
||||
if ((Get-Culture).NumberFormat.NumberGroupSeparator -EQ ",") {
|
||||
($ws.Cells[2, 8].Value -is [valuetype] ) | Should -Be $true
|
||||
($ws.Cells[2, 8].Value -is [valuetype] ) | Should -Be $true
|
||||
$ws.Cells[2, 9].Value.GetType().name | Should -Be 'String'
|
||||
}
|
||||
elseif ((Get-Culture).NumberFormat.NumberGroupSeparator -EQ ".") {
|
||||
($ws.Cells[2, 9].Value -is [valuetype] ) | Should -Be $true
|
||||
($ws.Cells[2, 9].Value -is [valuetype] ) | Should -Be $true
|
||||
$ws.Cells[2, 8].Value.GetType().name | Should -Be 'String'
|
||||
}
|
||||
($ws.Cells[2, 14].Value -is [valuetype] ) | Should -Be $true
|
||||
($ws.Cells[2, 14].Value -is [valuetype] ) | Should -Be $true
|
||||
$ws.Cells[2, 15].Value.GetType().name | Should -Be 'String'
|
||||
$ws.Cells[2, 16].Value.GetType().name | Should -Be 'String'
|
||||
$ws.Cells[2, 17].Value.GetType().name | Should -Be 'String'
|
||||
($ws.Cells[2, 19].Value -is [valuetype] ) | Should -Be $true
|
||||
($ws.Cells[2, 20].Value -is [valuetype] ) | Should -Be $true
|
||||
($ws.Cells[2, 19].Value -is [valuetype] ) | Should -Be $true
|
||||
($ws.Cells[2, 20].Value -is [valuetype] ) | Should -Be $true
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,9 +1,10 @@
|
||||
|
||||
|
||||
Describe "Creating workbook with a single line" {
|
||||
$path = "TestDrive:\test.xlsx"
|
||||
remove-item -path $path -ErrorAction SilentlyContinue
|
||||
ConvertFrom-Csv @"
|
||||
BeforeAll {
|
||||
$path = "TestDrive:\test.xlsx"
|
||||
remove-item -path $path -ErrorAction SilentlyContinue
|
||||
ConvertFrom-Csv @"
|
||||
Product, City, Gross, Net
|
||||
Apple, London , 300, 250
|
||||
Orange, London , 400, 350
|
||||
@@ -12,14 +13,17 @@ Orange, Paris, 600, 500
|
||||
Banana, Paris, 300, 200
|
||||
Apple, New York, 1200,700
|
||||
|
||||
"@ | Export-Excel -Path $path -TableStyle Medium13 -tablename "RawData" -ConditionalFormat @{Range="C2:C7"; DataBarColor="Green"} -ExcelChartDefinition @{ChartType="Doughnut";XRange="A2:B7"; YRange="C2:C7"; width=800; } -PivotTableDefinition @{Sales=@{
|
||||
PivotRows="City"; PivotColumns="Product"; PivotData=@{Gross="Sum";Net="Sum"}; PivotNumberFormat="$#,##0.00"; PivotTotals="Both"; PivotTableStyle="Medium12"; Activate=$true
|
||||
"@ | Export-Excel -Path $path -TableStyle Medium13 -tablename "RawData" -ConditionalFormat @{Range = "C2:C7"; DataBarColor = "Green" } -ExcelChartDefinition @{ChartType = "Doughnut"; XRange = "A2:B7"; YRange = "C2:C7"; width = 800; } -PivotTableDefinition @{Sales = @{
|
||||
PivotRows = "City"; PivotColumns = "Product"; PivotData = @{Gross = "Sum"; Net = "Sum" }; PivotNumberFormat = "$#,##0.00"; PivotTotals = "Both"; PivotTableStyle = "Medium12"; Activate = $true
|
||||
|
||||
PivotChartDefinition=@{Title="Gross and net by city and product"; ChartType="ColumnClustered"; Column=6; Width=600; Height=360; YMajorUnit=500; YMinorUnit=100; YAxisNumberformat="$#,##0"; LegendPosition="Bottom"}}}
|
||||
PivotChartDefinition = @{Title = "Gross and net by city and product"; ChartType = "ColumnClustered"; Column = 6; Width = 600; Height = 360; YMajorUnit = 500; YMinorUnit = 100; YAxisNumberformat = "$#,##0"; LegendPosition = "Bottom" }
|
||||
}
|
||||
}
|
||||
|
||||
$excel = Open-ExcelPackage $path
|
||||
$ws1 = $excel.Workbook.Worksheets[1]
|
||||
$ws2 = $excel.Workbook.Worksheets[2]
|
||||
$excel = Open-ExcelPackage $path
|
||||
$ws1 = $excel.Workbook.Worksheets[1]
|
||||
$ws2 = $excel.Workbook.Worksheets[2]
|
||||
}
|
||||
Context "Data Page" {
|
||||
It "Inserted the data and created the table " {
|
||||
$ws1.Tables[0] | Should -Not -BeNullOrEmpty
|
||||
@@ -39,7 +43,7 @@ Apple, New York, 1200,700
|
||||
$ws1.Drawings[0].Series[0].Series | Should -Be "'Sheet1'!C2:C7"
|
||||
}
|
||||
}
|
||||
Context "PivotTable" {
|
||||
Context "PivotTable" {
|
||||
it "Created the PivotTable on a new page " {
|
||||
$ws2 | Should -Not -BeNullOrEmpty
|
||||
$ws2.PivotTables[0] | Should -Not -BeNullOrEmpty
|
||||
|
||||
@@ -1,17 +1,15 @@
|
||||
[Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseDeclaredVarsMoreThanAssignments','',Justification='False Positives')]
|
||||
param()
|
||||
$scriptPath = Split-Path -Path $MyInvocation.MyCommand.path -Parent
|
||||
$dataPath = Join-Path -Path $scriptPath -ChildPath "First10Races.csv"
|
||||
$WarningAction = "SilentlyContinue"
|
||||
|
||||
|
||||
Describe "Creating small named ranges with hyperlinks" {
|
||||
BeforeAll {
|
||||
$scriptPath = $PSScriptRoot
|
||||
$dataPath = Join-Path -Path $scriptPath -ChildPath "First10Races.csv"
|
||||
$WarningAction = "SilentlyContinue"
|
||||
$path = "TestDrive:\Results.xlsx"
|
||||
Remove-Item -Path $path -ErrorAction SilentlyContinue
|
||||
#Read race results, and group by race name : export 1 row to get headers, leaving enough rows aboce to put in a link for each race
|
||||
$results = Import-Csv -Path $dataPath |
|
||||
Select-Object Race, @{n = "Date"; e = {[datetime]::ParseExact($_.date, "dd/MM/yyyy", (Get-Culture))}}, FinishPosition, Driver, GridPosition, Team, Points |
|
||||
Group-Object -Property RACE
|
||||
Select-Object Race, @{n = "Date"; e = { [datetime]::ParseExact($_.date, "dd/MM/yyyy", (Get-Culture)) } }, FinishPosition, Driver, GridPosition, Team, Points |
|
||||
Group-Object -Property RACE
|
||||
$topRow = $lastDataRow = 1 + $results.Count
|
||||
$excel = $results[0].Group[0] | Export-Excel -Path $path -StartRow $TopRow -BoldTopRow -PassThru
|
||||
|
||||
@@ -23,7 +21,7 @@ Describe "Creating small named ranges with hyperlinks" {
|
||||
$worksheet = $excel.Workbook.Worksheets[1]
|
||||
$columns = $worksheet.Dimension.Columns
|
||||
|
||||
1..$columns | ForEach-Object {Add-ExcelName -Range $worksheet.cells[$topRow, $_, $lastDataRow, $_]} #Test Add-Excel Name on its own (outside Export-Excel)
|
||||
1..$columns | ForEach-Object { Add-ExcelName -Range $worksheet.cells[$topRow, $_, $lastDataRow, $_] } #Test Add-Excel Name on its own (outside Export-Excel)
|
||||
|
||||
$scwarnVar = $null
|
||||
Set-ExcelColumn -Worksheet $worksheet -StartRow $topRow -Heading "PlacesGained/Lost" `
|
||||
@@ -33,7 +31,7 @@ Describe "Creating small named ranges with hyperlinks" {
|
||||
#create a table which covers all the data. And define a pivot table which uses the same address range.
|
||||
$table = Add-ExcelTable -PassThru -Range $worksheet.cells[$topRow, 1, $lastDataRow, $columns] -TableName "AllResults" -TableStyle Light4 `
|
||||
-ShowHeader -ShowFilter -ShowColumnStripes -ShowRowStripes:$false -ShowFirstColumn:$false -ShowLastColumn:$false -ShowTotal:$false #Test Add-ExcelTable outside Export-Excel with as many options as possible.
|
||||
$pt = New-PivotTableDefinition -PivotTableName Analysis -SourceWorkSheet $worksheet -SourceRange $table.address.address -PivotRows Driver -PivotData @{Points = "SUM"} -PivotTotals None
|
||||
$pt = New-PivotTableDefinition -PivotTableName Analysis -SourceWorkSheet $worksheet -SourceRange $table.address.address -PivotRows Driver -PivotData @{Points = "SUM" } -PivotTotals None
|
||||
|
||||
$cf = Add-ConditionalFormatting -Address $worksheet.cells[$topRow, $columns, $lastDataRow, $columns] -ThreeIconsSet Arrows -Passthru #Test using cells[r1,c1,r2,c2]
|
||||
$cf.Icon2.Type = $cf.Icon3.Type = "Num"
|
||||
@@ -44,14 +42,14 @@ Describe "Creating small named ranges with hyperlinks" {
|
||||
$ct = New-ConditionalText -Text "Ferrari"
|
||||
$ct2 = New-ConditionalText -Range $worksheet.Names["FinishPosition"].Address -ConditionalType LessThanOrEqual -Text 3 -ConditionalText ([System.Drawing.Color]::Red) -Background ([System.Drawing.Color]::White) #Test New-ConditionalText in shortest and longest forms.
|
||||
#Create links for each group name (race) and Export them so they start at Cell A1; create a pivot table with definition just created, save the file and open in Excel
|
||||
$excel = $results | ForEach-Object {(New-Object -TypeName OfficeOpenXml.ExcelHyperLink -ArgumentList "Sheet1!$($_.Name)" , "$($_.name) GP")} | #Test Exporting Hyperlinks with display property.
|
||||
Export-Excel -ExcelPackage $excel -AutoSize -PivotTableDefinition $pt -Calculate -ConditionalFormat $ct, $ct2 -PassThru #Test conditional text rules in conditional format (orignally icon sets only )
|
||||
$excel = $results | ForEach-Object { (New-Object -TypeName OfficeOpenXml.ExcelHyperLink -ArgumentList "Sheet1!$($_.Name)" , "$($_.name) GP") } | #Test Exporting Hyperlinks with display property.
|
||||
Export-Excel -ExcelPackage $excel -AutoSize -PivotTableDefinition $pt -Calculate -ConditionalFormat $ct, $ct2 -PassThru #Test conditional text rules in conditional format (orignally icon sets only )
|
||||
|
||||
$null = Add-Worksheet -ExcelPackage $excel -WorksheetName "Points1"
|
||||
Add-PivotTable -PivotTableName "Points1" -Address $excel.Points1.Cells["A1"] -ExcelPackage $excel -SourceWorkSheet sheet1 -SourceRange $excel.Sheet1.Tables[0].Address.Address -PivotRows Driver, Date -PivotData @{Points = "SUM"} -GroupDateRow Date -GroupDatePart Years, Months
|
||||
Add-PivotTable -PivotTableName "Points1" -Address $excel.Points1.Cells["A1"] -ExcelPackage $excel -SourceWorkSheet sheet1 -SourceRange $excel.Sheet1.Tables[0].Address.Address -PivotRows Driver, Date -PivotData @{Points = "SUM" } -GroupDateRow Date -GroupDatePart Years, Months
|
||||
|
||||
$null = Add-Worksheet -ExcelPackage $excel -WorksheetName "Places1"
|
||||
$newpt = Add-PivotTable -PivotTableName "Places1" -Address $excel.Places1.Cells["A1"] -ExcelPackage $excel -SourceWorkSheet sheet1 -SourceRange $excel.Sheet1.Tables[0].Address.Address -PivotRows Driver, FinishPosition -PivotData @{Date = "Count"} -GroupNumericRow FinishPosition -GroupNumericMin 1 -GroupNumericMax 25 -GroupNumericInterval 3 -PassThru
|
||||
$newpt = Add-PivotTable -PivotTableName "Places1" -Address $excel.Places1.Cells["A1"] -ExcelPackage $excel -SourceWorkSheet sheet1 -SourceRange $excel.Sheet1.Tables[0].Address.Address -PivotRows Driver, FinishPosition -PivotData @{Date = "Count" } -GroupNumericRow FinishPosition -GroupNumericMin 1 -GroupNumericMax 25 -GroupNumericInterval 3 -PassThru
|
||||
$newpt.RowFields[0].SubTotalFunctions = [OfficeOpenXml.Table.PivotTable.eSubTotalFunctions]::None
|
||||
Close-ExcelPackage -ExcelPackage $excel
|
||||
|
||||
|
||||
@@ -19,7 +19,7 @@ $map = @{
|
||||
|
||||
(Get-ExcelColumnName 26).columnName | Should -Be 'Z'
|
||||
(Get-ExcelColumnName 27).columnName | Should -Be 'AA'
|
||||
(Get-ExcelColumnName 28).columnNamee | Should -Be 'AB'
|
||||
(Get-ExcelColumnName 28).columnName | Should -Be 'AB'
|
||||
(Get-ExcelColumnName 30).columnName | Should -Be 'AD'
|
||||
(Get-ExcelColumnName 48).columnName | Should -Be 'AV'
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user