mirror of
https://github.com/dfinke/ImportExcel.git
synced 2025-12-06 00:23:20 +00:00
Compare commits
428 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
fa907da4a4 | ||
|
|
24c205e65d | ||
|
|
a1418a336e | ||
|
|
63683db543 | ||
|
|
36b5495bd5 | ||
|
|
722516de7c | ||
|
|
57bb049111 | ||
|
|
74cbca8b2f | ||
|
|
53712d4f7f | ||
|
|
98e2ac96ea | ||
|
|
efa73b37a0 | ||
|
|
c1b395fac6 | ||
|
|
0d8d125222 | ||
|
|
f77ee7b060 | ||
|
|
8ff1757c06 | ||
|
|
ab526558a3 | ||
|
|
61744012cd | ||
|
|
2cb4712bc5 | ||
|
|
6847a49baa | ||
|
|
b8a8f4c565 | ||
|
|
edf25cf946 | ||
|
|
77ec946b84 | ||
|
|
637c11c2e6 | ||
|
|
cd2a70197c | ||
|
|
d99bd8fc9e | ||
|
|
23f1d92c1b | ||
|
|
ab4d03c984 | ||
|
|
ca4dfb7040 | ||
|
|
a9eca05303 | ||
|
|
195efdea54 | ||
|
|
24e5fccafe | ||
|
|
840870df11 | ||
|
|
0fe6654233 | ||
|
|
7598b75538 | ||
|
|
ed6c87e8de | ||
|
|
2642211e12 | ||
|
|
9373765e10 | ||
|
|
16820a30c4 | ||
|
|
438d7e2b03 | ||
|
|
c617d96322 | ||
|
|
15679a0d82 | ||
|
|
3c23a064bc | ||
|
|
c848497f53 | ||
|
|
ba374ec558 | ||
|
|
3f772ce726 | ||
|
|
3ea6fde928 | ||
|
|
81ece62494 | ||
|
|
828b2caf9f | ||
|
|
f760b63818 | ||
|
|
fe016f732d | ||
|
|
c719cc3d32 | ||
|
|
5558f48732 | ||
|
|
4dfd211bb6 | ||
|
|
90bc047267 | ||
|
|
4c0e7970cf | ||
|
|
b191f16e3e | ||
|
|
ce49038b75 | ||
|
|
652a611137 | ||
|
|
3b73ce24ae | ||
|
|
5e8afa48fc | ||
|
|
f494635b48 | ||
|
|
dcb67b4518 | ||
|
|
06c00cb0b2 | ||
|
|
d987437ad6 | ||
|
|
fe27ff81c8 | ||
|
|
9f4307f6c0 | ||
|
|
a1fccf914f | ||
|
|
0b4c2b81db | ||
|
|
8ee34217a4 | ||
|
|
c01601910d | ||
|
|
63f6543784 | ||
|
|
306e10c348 | ||
|
|
970febd6d3 | ||
|
|
e703a21dec | ||
|
|
c1be6a8d82 | ||
|
|
201b9cd984 | ||
|
|
559bfa2a7f | ||
|
|
4bd3efa1ef | ||
|
|
926042e5b6 | ||
|
|
be1e55cf8d | ||
|
|
a86c55b3ac | ||
|
|
fa14695fb9 | ||
|
|
6322bafaed | ||
|
|
c7a6f4ba35 | ||
|
|
49a6805727 | ||
|
|
c124ee199d | ||
|
|
858cf60a2f | ||
|
|
fcde64780e | ||
|
|
be5d270f44 | ||
|
|
f9fb49ad04 | ||
|
|
4727bb3b2b | ||
|
|
ac435fc1e1 | ||
|
|
340ffc560b | ||
|
|
069c227391 | ||
|
|
fa4f3a23cd | ||
|
|
f54db0e2d9 | ||
|
|
8c1388a799 | ||
|
|
7c473d1fb6 | ||
|
|
31366057df | ||
|
|
f102ece700 | ||
|
|
950b9ab078 | ||
|
|
869ab59a8a | ||
|
|
1e9a73d176 | ||
|
|
37e6896741 | ||
|
|
c39e6cc24c | ||
|
|
5ab9d6f23f | ||
|
|
81e60be51d | ||
|
|
943ca7e6d1 | ||
|
|
513ff59ba8 | ||
|
|
45fc5a2631 | ||
|
|
8b30fce81a | ||
|
|
0990c0ef09 | ||
|
|
724ed6b197 | ||
|
|
087feedde6 | ||
|
|
b92ea56fe9 | ||
|
|
c4eed8c25d | ||
|
|
9051ffc0e5 | ||
|
|
050613eede | ||
|
|
84f51c4823 | ||
|
|
f2544ed1ec | ||
|
|
5b4857d7a0 | ||
|
|
45449650c7 | ||
|
|
d7348250fc | ||
|
|
b53881fd02 | ||
|
|
632bb263cc | ||
|
|
658a6b543a | ||
|
|
0f301ff619 | ||
|
|
115fbb23a7 | ||
|
|
2b30537c20 | ||
|
|
22f50d2659 | ||
|
|
f0a2d076e3 | ||
|
|
835a11bbb3 | ||
|
|
701b8e2062 | ||
|
|
6f2bfaff4e | ||
|
|
ba6cee12d9 | ||
|
|
5d36945708 | ||
|
|
6cbf4efd1d | ||
|
|
4feaee46d2 | ||
|
|
89f90b77fb | ||
|
|
98256c61e8 | ||
|
|
ebde9269aa | ||
|
|
e3149b7b40 | ||
|
|
64ff97b486 | ||
|
|
12f1f23d51 | ||
|
|
e279cd785e | ||
|
|
04b5a9a096 | ||
|
|
c6a06cc325 | ||
|
|
a4bed31e1e | ||
|
|
c385ca9012 | ||
|
|
2a8cbbba7c | ||
|
|
b789db9ba3 | ||
|
|
89a4cfde0d | ||
|
|
ab56ae4409 | ||
|
|
ef35c4fca8 | ||
|
|
9fad33c7a6 | ||
|
|
8bb3d50052 | ||
|
|
d5b807d3cb | ||
|
|
e2053e4998 | ||
|
|
8c6c7eeaf6 | ||
|
|
31abd215dc | ||
|
|
cafaafd53d | ||
|
|
ee3c8e7680 | ||
|
|
0b207548e0 | ||
|
|
6628b55ce5 | ||
|
|
f6bfabd96a | ||
|
|
980631df8b | ||
|
|
4f9b83f0e6 | ||
|
|
59cf89b451 | ||
|
|
5777d907c4 | ||
|
|
d7c516d35e | ||
|
|
27d69e7531 | ||
|
|
8ae92fba54 | ||
|
|
aa0f0cf4e2 | ||
|
|
6e38d97498 | ||
|
|
ef7c8331f5 | ||
|
|
267d15f99a | ||
|
|
390aca0496 | ||
|
|
4fa34ae257 | ||
|
|
0b3b382c4e | ||
|
|
415be5bca3 | ||
|
|
79e5bdf8ba | ||
|
|
b03d9b048a | ||
|
|
aea90aa8d6 | ||
|
|
d4ebc9e95d | ||
|
|
6ece4483e2 | ||
|
|
ba14511254 | ||
|
|
964cf9e9c6 | ||
|
|
8d56a351ff | ||
|
|
b2119f08f5 | ||
|
|
634aaacc55 | ||
|
|
61b44f826d | ||
|
|
9273261b34 | ||
|
|
e55dfdd10e | ||
|
|
59e40d62d0 | ||
|
|
f478e8a134 | ||
|
|
b634bf9d93 | ||
|
|
a10ade898a | ||
|
|
eb10364722 | ||
|
|
b0024cf2c4 | ||
|
|
91b0e8b0ed | ||
|
|
b997e90e78 | ||
|
|
4d8710d017 | ||
|
|
7f36b44fa8 | ||
|
|
483f761016 | ||
|
|
d55f0e64d4 | ||
|
|
f83f654c4a | ||
|
|
6a956dbd7e | ||
|
|
0929a442a5 | ||
|
|
895a5c0cb2 | ||
|
|
d7901af8f3 | ||
|
|
34f55a3659 | ||
|
|
606988bcf6 | ||
|
|
441f2ada22 | ||
|
|
29ea7012d7 | ||
|
|
67ac63ddcf | ||
|
|
c939c6ecb0 | ||
|
|
96493e059b | ||
|
|
cb7f2a06f4 | ||
|
|
99beda7a10 | ||
|
|
0c8bb2300a | ||
|
|
c09083d350 | ||
|
|
556f0ac51e | ||
|
|
1e4fc59a25 | ||
|
|
5ab6a9116d | ||
|
|
f33215382a | ||
|
|
cf5d3f83d6 | ||
|
|
91da711635 | ||
|
|
eec5e343d4 | ||
|
|
d69b640edc | ||
|
|
2ca870a889 | ||
|
|
a320cfd28c | ||
|
|
aa1b042767 | ||
|
|
7e8416d67c | ||
|
|
229b60b25d | ||
|
|
5700989321 | ||
|
|
56e1704e7e | ||
|
|
8268bbc2e1 | ||
|
|
5657659331 | ||
|
|
0d4a32e266 | ||
|
|
1c8f8d2a3d | ||
|
|
f6a65677df | ||
|
|
86a7865fb2 | ||
|
|
8b3bf4f14f | ||
|
|
4d6193f549 | ||
|
|
6ebac7b6dc | ||
|
|
d71dd36d56 | ||
|
|
3697cdfeee | ||
|
|
1e172cf21f | ||
|
|
6da7553c98 | ||
|
|
5a444c620b | ||
|
|
4a09fc3570 | ||
|
|
d706a10276 | ||
|
|
1fd2f422cd | ||
|
|
283e50547d | ||
|
|
15211a6297 | ||
|
|
8905b8d401 | ||
|
|
e9b437af4e | ||
|
|
330e237727 | ||
|
|
c56b2cd33a | ||
|
|
1aa5c6da45 | ||
|
|
9eb894cf59 | ||
|
|
3a4c2d7bd9 | ||
|
|
42cb5a316a | ||
|
|
536cdaa841 | ||
|
|
6cd9fad7ba | ||
|
|
829d854c3d | ||
|
|
b33a282740 | ||
|
|
73fc96166c | ||
|
|
00f7278115 | ||
|
|
956cf5aa49 | ||
|
|
877310e015 | ||
|
|
08bf877535 | ||
|
|
88e28a1d6c | ||
|
|
eb63fe259a | ||
|
|
6d97efc5c2 | ||
|
|
c567526eac | ||
|
|
ed210cc730 | ||
|
|
72f44ebcb9 | ||
|
|
f1d20ed163 | ||
|
|
02cf6bb3f3 | ||
|
|
5cd3897dfa | ||
|
|
fe4f2848ad | ||
|
|
4e89b3321a | ||
|
|
43b6ebf84f | ||
|
|
1ee9493bc0 | ||
|
|
8f0fc7397d | ||
|
|
4fa6fbda01 | ||
|
|
7177623104 | ||
|
|
487cf51abc | ||
|
|
ae31e9d39b | ||
|
|
9ba20b8ec8 | ||
|
|
9daefc2925 | ||
|
|
f0b4cb28f6 | ||
|
|
5f00f5cbbc | ||
|
|
d41fbf8a05 | ||
|
|
ebe49f1650 | ||
|
|
a3dced10e4 | ||
|
|
1e522c562b | ||
|
|
5ec299ff2d | ||
|
|
676ecc17e0 | ||
|
|
aa1b0018ab | ||
|
|
eabaab79c5 | ||
|
|
7a8bbb9771 | ||
|
|
85f2433ffc | ||
|
|
62c8d74a59 | ||
|
|
5e7b404daf | ||
|
|
91a1240408 | ||
|
|
e8c3d96f43 | ||
|
|
9417b25af1 | ||
|
|
a942f2133d | ||
|
|
533ed07ac8 | ||
|
|
09f35b5fd5 | ||
|
|
23a2ac394f | ||
|
|
50928e8e3b | ||
|
|
26827b0764 | ||
|
|
6c35d5b018 | ||
|
|
ab5600c9ba | ||
|
|
47dcc636d9 | ||
|
|
1768c0ac92 | ||
|
|
f348088b62 | ||
|
|
694fcdd8c1 | ||
|
|
0192f4d822 | ||
|
|
c641eea10a | ||
|
|
99de9a9854 | ||
|
|
3121c5eaed | ||
|
|
d02f757568 | ||
|
|
a693725949 | ||
|
|
5e19d0ca1a | ||
|
|
204b82144f | ||
|
|
91eefbd48b | ||
|
|
f86556a89d | ||
|
|
14e1dfd8db | ||
|
|
1d961c679e | ||
|
|
7026803415 | ||
|
|
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 | ||
|
|
933abf6539 | ||
|
|
6a32da7f92 | ||
|
|
c3ac68ea2c | ||
|
|
5ea9b1d082 | ||
|
|
ae64a884fc | ||
|
|
b584b22f5f | ||
|
|
eb3a7d3f2d | ||
|
|
3130020e20 | ||
|
|
fe68ddbb0d | ||
|
|
1ce65a0758 | ||
|
|
13454cce8e | ||
|
|
96b61d38f1 | ||
|
|
59e31d54a7 | ||
|
|
6bf16f75f7 | ||
|
|
c547713ee9 | ||
|
|
f0ec5f4a96 | ||
|
|
7ded94e225 | ||
|
|
4141ba690e | ||
|
|
08ecadddb2 | ||
|
|
e42f42fde9 | ||
|
|
12fa49e314 | ||
|
|
98ce564929 | ||
|
|
7e75ecd0fb | ||
|
|
17ec040055 | ||
|
|
e65210e378 | ||
|
|
7bfb28d10f | ||
|
|
08fbfc35a3 | ||
|
|
4315ddc702 | ||
|
|
97611fc57c | ||
|
|
118330ea47 | ||
|
|
6f48219819 |
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
|
||||
30
.github/workflows/ci.yml
vendored
Normal file
30
.github/workflows/ci.yml
vendored
Normal file
@@ -0,0 +1,30 @@
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- master
|
||||
- Set-up-GHA-CI/CD
|
||||
paths-ignore:
|
||||
- 'Examples/**'
|
||||
|
||||
pull_request:
|
||||
|
||||
|
||||
jobs:
|
||||
validate:
|
||||
runs-on: ${{ matrix.os }}
|
||||
strategy:
|
||||
matrix:
|
||||
os: [windows-latest, ubuntu-latest, macos-latest]
|
||||
steps:
|
||||
- uses: actions/checkout@v1
|
||||
- name: Run Continuous Integration
|
||||
shell: pwsh
|
||||
run : |
|
||||
if($PSVersionTable.Platform -eq 'Win32NT') {
|
||||
$null = mkdir ./ace
|
||||
Invoke-Restmethod https://download.microsoft.com/download/3/5/C/35C84C36-661A-44E6-9324-8786B8DBE231/accessdatabaseengine_X64.exe -OutFile ./ace/ace.exe
|
||||
Start-Process ./ace/ace.exe -Wait -ArgumentList "/quiet /passive /norestart"
|
||||
}
|
||||
|
||||
cd ./__tests__
|
||||
Invoke-Pester -Output Detailed
|
||||
1
.gitignore
vendored
1
.gitignore
vendored
@@ -65,3 +65,4 @@ ImportExcel.zip
|
||||
~$*
|
||||
# InstallModule.ps1
|
||||
# PublishToGallery.ps1
|
||||
.vscode/*
|
||||
|
||||
56
.vscode/launch.json
vendored
56
.vscode/launch.json
vendored
@@ -1,56 +0,0 @@
|
||||
{
|
||||
// Use IntelliSense to learn about possible attributes.
|
||||
// Hover to view descriptions of existing attributes.
|
||||
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
|
||||
"version": "0.2.0",
|
||||
"configurations": [
|
||||
{
|
||||
"type": "PowerShell",
|
||||
"request": "launch",
|
||||
"name": "PowerShell Pester Tests",
|
||||
"script": "Import-Module -Name '.\\' -Force ; Invoke-Pester", // Change to '.\\ModuleName.psd1' if Git name different
|
||||
"args": [""],
|
||||
"cwd": "${workspaceFolder}"
|
||||
},
|
||||
{
|
||||
"type": "PowerShell",
|
||||
"request": "launch",
|
||||
"name": "PowerShell Launch Current File",
|
||||
"script": "${file}",
|
||||
"args": [],
|
||||
"cwd": "${file}"
|
||||
},
|
||||
{
|
||||
"type": "PowerShell",
|
||||
"request": "launch",
|
||||
"name": "PowerShell Launch Current File in Temporary Console",
|
||||
"script": "${file}",
|
||||
"args": [],
|
||||
"cwd": "${file}",
|
||||
"createTemporaryIntegratedConsole": true
|
||||
},
|
||||
{
|
||||
"type": "PowerShell",
|
||||
"request": "launch",
|
||||
"name": "PowerShell Launch Current File w/Args Prompt",
|
||||
"script": "${file}",
|
||||
"args": [
|
||||
"${command:SpecifyScriptArgs}"
|
||||
],
|
||||
"cwd": "${file}"
|
||||
},
|
||||
{
|
||||
"type": "PowerShell",
|
||||
"request": "attach",
|
||||
"name": "PowerShell Attach to Host Process",
|
||||
"processId": "${command:PickPSHostProcess}",
|
||||
"runspaceId": 1
|
||||
},
|
||||
{
|
||||
"type": "PowerShell",
|
||||
"request": "launch",
|
||||
"name": "PowerShell Interactive Session",
|
||||
"cwd": ""
|
||||
}
|
||||
]
|
||||
}
|
||||
133
Add-Subtotals.ps1
Normal file
133
Add-Subtotals.ps1
Normal file
@@ -0,0 +1,133 @@
|
||||
Function Add-Subtotals {
|
||||
param(
|
||||
[Parameter(Mandatory=$true, Position=0)]
|
||||
$ChangeColumnName , # = "Location"
|
||||
|
||||
[Parameter(Mandatory=$true, Position=1)]
|
||||
[hashtable]$AggregateColumn , #= @{"Sales" = "SUM" }
|
||||
|
||||
[Parameter(Position=2)]
|
||||
$ExcelPath = ([System.IO.Path]::GetTempFileName() -replace "\.tmp", ".xlsx") ,
|
||||
|
||||
[Parameter(Position=3)]
|
||||
$WorksheetName = "Sheet1",
|
||||
|
||||
[Parameter(ValueFromPipeline=$true)]
|
||||
$InputObject, #$DataToPivot | Sort location, product
|
||||
|
||||
[switch]$HideSingleRows,
|
||||
[switch]$NoSort,
|
||||
[switch]$NoOutLine,
|
||||
[switch]$Show
|
||||
|
||||
)
|
||||
begin {
|
||||
if (-not $PSBoundParameters.ContainsKey('ExcelPath')) {$Show = $true}
|
||||
$data = @()
|
||||
$aggFunctions = [ordered]@{
|
||||
"AVERAGE" = 1; "COUNT" = 2; "COUNTA" = 3 #(non empty cells) f
|
||||
"MAX" = 4; "MIN" = 5; "PRODUCT" = 6; "STDEV" = 7 # (sample)
|
||||
"STDEVP" = 8 # (whole population);
|
||||
"SUM" = 9; "VAR" = 10 # (Variance sample)
|
||||
"VARP" = 11 # (whole population) #add 100 to ignore hidden cells
|
||||
}
|
||||
}
|
||||
process {
|
||||
$data += $InputObject
|
||||
}
|
||||
end {
|
||||
if (-not $NoSort) {$data = $data | Sort-Object $changeColumnName}
|
||||
$Header = $data[0].PSObject.Properties.Name
|
||||
#region turn each entry in $AggregateColumn "=SUBTOTAL(a,x{0}}:x{1})" where a is the aggregate function number and x is the column letter
|
||||
$aggFormulas = @{}
|
||||
foreach ($k in $AggregateColumn.Keys) {
|
||||
$columnNo = 0 ;
|
||||
while ($columnNo -lt $header.count -and $header[$columnNo] -ne $k) {$columnNo ++}
|
||||
if ($columnNo -eq $header.count) {
|
||||
throw "'$k' isn't a property of the first row of data."; return
|
||||
}
|
||||
if ($AggregateColumn[$k] -is [string]) {
|
||||
$aggfn = $aggFunctions[$AggregateColumn[$k]]
|
||||
if (-not $aggfn) {
|
||||
throw "$($AggregateColumn[$k]) is not a valid aggregation function - these are $($aggFunctions.keys -join ', ')" ; return
|
||||
}
|
||||
}
|
||||
else {$aggfn = $AggregateColumn[$k]}
|
||||
$aggFormulas[$k] = "=SUBTOTAL({0},{1}{{0}}:{1}{{1}})" -f $aggfn , (Get-ExcelColumnName ($columnNo+1) ).ColumnName
|
||||
}
|
||||
if ($aggformulas.count -lt 1) {throw "We didn't get any aggregation formulas"}
|
||||
$aggFormulas | out-string -Stream | Write-Verbose -Verbose
|
||||
#endregion
|
||||
$insertedRows = @()
|
||||
$singleRows = @()
|
||||
$previousValue = $data[0].$changeColumnName
|
||||
$currentRow = $lastChangeRow = 2
|
||||
#region insert subtotals and send to excel:
|
||||
#each time there is a change in the column we're intetersted in.
|
||||
#either Add a row with the value and subtotal(s) function(s) if there is more than one row to total
|
||||
#or note the row if there was only one row with that value (we may hide it later.)
|
||||
$excel = $data |
|
||||
ForEach-Object -process {
|
||||
if ($_.$changeColumnName -ne $previousValue) {
|
||||
if ($lastChangeRow -lt ($currentrow - 1)) {
|
||||
$NewObj = @{$changeColumnName = $previousValue}
|
||||
foreach ($k in $aggFormulas.Keys) {
|
||||
$newobj[$k] = $aggformulas[$k] -f $lastChangeRow, ($currentRow - 1)
|
||||
}
|
||||
$insertedRows += $currentRow
|
||||
[pscustomobject]$newobj
|
||||
$currentRow += 1
|
||||
}
|
||||
else {$singleRows += $currentRow }
|
||||
$lastChangeRow = $currentRow
|
||||
$previousValue = $_.$changeColumnName
|
||||
}
|
||||
$_
|
||||
$currentRow += 1
|
||||
} -end { # the process block won't output the last row
|
||||
if ($lastChangeRow -lt ($currentrow - 1)) {
|
||||
$NewObj = @{$changeColumnName = $previousValue}
|
||||
foreach ($k in $aggFormulas.Keys) {
|
||||
$newobj[$k] = $aggformulas[$k] -f $lastChangeRow, ($currentRow - 1)
|
||||
}
|
||||
$insertedRows += $currentRow
|
||||
[pscustomobject]$newobj
|
||||
}
|
||||
else {$singleRows += $currentRow }
|
||||
} | Export-Excel -Path $ExcelPath -PassThru -AutoSize -AutoFilter -AutoNameRange -BoldTopRow -WorksheetName $WorksheetName -Activate -ClearSheet #-MaxAutoSizeRows 10000
|
||||
#endregion
|
||||
#Put the subtotal rows in bold optionally hide rows where only one has the value of interest.
|
||||
$ws = $excel.$WorksheetName
|
||||
#We kept lists of the total rows Since 1 rows won't get expand/collapse we can hide them.
|
||||
foreach ($r in $insertedrows) {$ws.Row($r).style.font.bold = $true }
|
||||
if ($HideSingleRows) {
|
||||
foreach ($r in $hideRows) { $ws.Row($r).hidden = $true}
|
||||
}
|
||||
$range = $ws.Dimension.Address
|
||||
$ExcelPath = $excel.File.FullName
|
||||
$SheetIndex = $ws.index
|
||||
if ($NoOutline) {
|
||||
Close-ExcelPackage $excel -show:$Show
|
||||
return
|
||||
}
|
||||
else {
|
||||
Close-ExcelPackage $excel
|
||||
|
||||
try { $excelApp = New-Object -ComObject "Excel.Application" }
|
||||
catch { Write-Warning "Could not start Excel application - which usually means it is not installed." ; return }
|
||||
|
||||
try { $excelWorkBook = $excelApp.Workbooks.Open($ExcelPath) }
|
||||
catch { Write-Warning -Message "Could not Open $ExcelPath." ; return }
|
||||
$ws = $excelWorkBook.Worksheets.item($SheetIndex)
|
||||
$null = $ws.Range($range).Select()
|
||||
$null = $excelapp.ActiveCell.AutoOutline()
|
||||
$null = $ws.Outline.ShowLevels(1,$null)
|
||||
$excelWorkBook.Save()
|
||||
if ($show) {$excelApp.Visible = $true}
|
||||
else {
|
||||
[void]$excelWorkBook.close()
|
||||
$excelapp.Quit()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
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 }
|
||||
|
||||
119
Examples/AddImage/Add-ExcelImage.ps1
Normal file
119
Examples/AddImage/Add-ExcelImage.ps1
Normal file
@@ -0,0 +1,119 @@
|
||||
function Add-ExcelImage {
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Adds an image to a worksheet in an Excel package.
|
||||
.DESCRIPTION
|
||||
Adds an image to a worksheet in an Excel package using the
|
||||
`WorkSheet.Drawings.AddPicture(name, image)` method, and places the
|
||||
image at the location specified by the Row and Column parameters.
|
||||
|
||||
Additional position adjustment can be made by providing RowOffset and
|
||||
ColumnOffset values in pixels.
|
||||
.EXAMPLE
|
||||
$image = [System.Drawing.Image]::FromFile($octocat)
|
||||
$xlpkg = $data | Export-Excel -Path $path -PassThru
|
||||
$xlpkg.Sheet1 | Add-ExcelImage -Image $image -Row 4 -Column 6 -ResizeCell
|
||||
|
||||
Where $octocat is a path to an image file, and $data is a collection of
|
||||
data to be exported, and $path is the output path for the Excel document,
|
||||
Add-Excel places the image at row 4 and column 6, resizing the column
|
||||
and row as needed to fit the image.
|
||||
.INPUTS
|
||||
[OfficeOpenXml.ExcelWorksheet]
|
||||
.OUTPUTS
|
||||
None
|
||||
#>
|
||||
[CmdletBinding()]
|
||||
param(
|
||||
# Specifies the worksheet to add the image to.
|
||||
[Parameter(Mandatory, ValueFromPipeline)]
|
||||
[OfficeOpenXml.ExcelWorksheet]
|
||||
$WorkSheet,
|
||||
|
||||
# Specifies the Image to be added to the worksheet.
|
||||
[Parameter(Mandatory)]
|
||||
[System.Drawing.Image]
|
||||
$Image,
|
||||
|
||||
# Specifies the row where the image will be placed. Rows are counted from 1.
|
||||
[Parameter(Mandatory)]
|
||||
[ValidateRange(1, [int]::MaxValue)]
|
||||
[int]
|
||||
$Row,
|
||||
|
||||
# Specifies the column where the image will be placed. Columns are counted from 1.
|
||||
[Parameter(Mandatory)]
|
||||
[ValidateRange(1, [int]::MaxValue)]
|
||||
[int]
|
||||
$Column,
|
||||
|
||||
# Specifies the name to associate with the image. Names must be unique per sheet.
|
||||
# Omit the name and a GUID will be used instead.
|
||||
[Parameter()]
|
||||
[string]
|
||||
$Name,
|
||||
|
||||
# Specifies the number of pixels to offset the image on the Y-axis. A
|
||||
# positive number moves the image down by the specified number of pixels
|
||||
# from the top border of the cell.
|
||||
[Parameter()]
|
||||
[int]
|
||||
$RowOffset = 1,
|
||||
|
||||
# Specifies the number of pixels to offset the image on the X-axis. A
|
||||
# positive number moves the image to the right by the specified number
|
||||
# of pixels from the left border of the cell.
|
||||
[Parameter()]
|
||||
[int]
|
||||
$ColumnOffset = 1,
|
||||
|
||||
# Increase the column width and row height to fit the image if the current
|
||||
# dimensions are smaller than the image provided.
|
||||
[Parameter()]
|
||||
[switch]
|
||||
$ResizeCell
|
||||
)
|
||||
|
||||
begin {
|
||||
if ($IsWindows -eq $false) {
|
||||
throw "This only works on Windows and won't run on $([environment]::OSVersion)"
|
||||
}
|
||||
|
||||
<#
|
||||
These ratios work on my machine but it feels fragile. Need to better
|
||||
understand how row and column sizing works in Excel and what the
|
||||
width and height units represent.
|
||||
#>
|
||||
$widthFactor = 1 / 7
|
||||
$heightFactor = 3 / 4
|
||||
}
|
||||
|
||||
process {
|
||||
if ([string]::IsNullOrWhiteSpace($Name)) {
|
||||
$Name = (New-Guid).ToString()
|
||||
}
|
||||
if ($null -ne $WorkSheet.Drawings[$Name]) {
|
||||
Write-Error "A picture with the name `"$Name`" already exists in worksheet $($WorkSheet.Name)."
|
||||
return
|
||||
}
|
||||
|
||||
<#
|
||||
The row and column offsets of 1 ensures that the image lands just
|
||||
inside the gray cell borders at the top left.
|
||||
#>
|
||||
$picture = $WorkSheet.Drawings.AddPicture($Name, $Image)
|
||||
$picture.SetPosition($Row - 1, $RowOffset, $Column - 1, $ColumnOffset)
|
||||
|
||||
if ($ResizeCell) {
|
||||
<#
|
||||
Adding 1 to the image height and width ensures that when the
|
||||
row and column are resized, the bottom right of the image lands
|
||||
just inside the gray cell borders at the bottom right.
|
||||
#>
|
||||
$width = $widthFactor * ($Image.Width + 1)
|
||||
$height = $heightFactor * ($Image.Height + 1)
|
||||
$WorkSheet.Column($Column).Width = [Math]::Max($width, $WorkSheet.Column($Column).Width)
|
||||
$WorkSheet.Row($Row).Height = [Math]::Max($height, $WorkSheet.Row($Row).Height)
|
||||
}
|
||||
}
|
||||
}
|
||||
39
Examples/AddImage/AddImage.ps1
Normal file
39
Examples/AddImage/AddImage.ps1
Normal file
@@ -0,0 +1,39 @@
|
||||
if ($IsWindows -eq $false) {
|
||||
throw "This only works on Windows and won't run on $([environment]::OSVersion)"
|
||||
}
|
||||
|
||||
Add-Type -AssemblyName System.Drawing
|
||||
|
||||
. $PSScriptRoot\Add-ExcelImage.ps1
|
||||
|
||||
$data = ConvertFrom-Csv @"
|
||||
Region,State,Units,Price
|
||||
West,Texas,927,923.71
|
||||
North,Tennessee,466,770.67
|
||||
East,Florida,520,458.68
|
||||
East,Maine,828,661.24
|
||||
West,Virginia,465,053.58
|
||||
North,Missouri,436,235.67
|
||||
South,Kansas,214,992.47
|
||||
North,North Dakota,789,640.72
|
||||
South,Delaware,712,508.55
|
||||
"@
|
||||
|
||||
$path = "$PSScriptRoot/Add-Picture-test.xlsx"
|
||||
Remove-Item $path -ErrorAction SilentlyContinue
|
||||
|
||||
|
||||
try {
|
||||
$octocat = "$PSScriptRoot/Octocat.jpg"
|
||||
$image = [System.Drawing.Image]::FromFile($octocat)
|
||||
$xlpkg = $data | Export-Excel -Path $path -PassThru
|
||||
$xlpkg.Sheet1 | Add-ExcelImage -Image $image -Row 4 -Column 6 -ResizeCell
|
||||
}
|
||||
finally {
|
||||
if ($image) {
|
||||
$image.Dispose()
|
||||
}
|
||||
if ($xlpkg) {
|
||||
Close-ExcelPackage -ExcelPackage $xlpkg -Show
|
||||
}
|
||||
}
|
||||
BIN
Examples/AddImage/Octocat.jpg
Normal file
BIN
Examples/AddImage/Octocat.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 6.1 KiB |
33
Examples/AddImage/README.md
Normal file
33
Examples/AddImage/README.md
Normal file
@@ -0,0 +1,33 @@
|
||||
# Add-ExcelImage Example
|
||||
|
||||
Adding pictures to an Excel worksheet is possible by calling the `AddPicture(name, image)`
|
||||
method on the `Drawings` property of an `ExcelWorksheet` object.
|
||||
|
||||
The `Add-ExcelImage` example here demonstrates how to add a picture at a given
|
||||
cell location, and optionally resize the row and column to fit the image.
|
||||
|
||||
## Running the example
|
||||
|
||||
To try this example, run the script `AddImage.ps1`. The `Add-ExcelImage`
|
||||
function will be dot-sourced, and an Excel document will be created in the same
|
||||
folder with a sample data set. The Octocat image will then be embedded into
|
||||
Sheet1.
|
||||
|
||||
The creation of the Excel document and the `System.Drawing.Image` object
|
||||
representing Octocat are properly disposed within a `finally` block to ensure
|
||||
that the resources are released, even if an error occurs in the `try` block.
|
||||
|
||||
## Note about column and row sizing
|
||||
|
||||
Care has been taken in this example to get the image placement to be just inside
|
||||
the cell border, and if the `-ResizeCell` switch is present, the height and width
|
||||
of the row and column will be increased, if needed, so that the bottom right of
|
||||
the image also lands just inside the cell border.
|
||||
|
||||
The Excel row and column sizes are measured in "point" units rather than pixels,
|
||||
and a fixed multiplication factor is used to convert the size of the image in
|
||||
pixels, to the corresponding height and width values in Excel.
|
||||
|
||||
It's possible that different DPI or text scaling options could result in
|
||||
imperfect column and row sizing and if a better strategy is found for converting
|
||||
the image dimensions to column and row sizes, this example will be updated.
|
||||
@@ -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
|
||||
|
||||
35
Examples/Charts/ChartDataSeparatePage.ps1
Normal file
35
Examples/Charts/ChartDataSeparatePage.ps1
Normal file
@@ -0,0 +1,35 @@
|
||||
$data = ConvertFrom-Csv @"
|
||||
Region,State,Units,Price
|
||||
West,Texas,927,923.71
|
||||
North,Tennessee,466,770.67
|
||||
East,Florida,520,458.68
|
||||
East,Maine,828,661.24
|
||||
West,Virginia,465,053.58
|
||||
North,Missouri,436,235.67
|
||||
South,Kansas,214,992.47
|
||||
North,North Dakota,789,640.72
|
||||
South,Delaware,712,508.55
|
||||
"@
|
||||
|
||||
$xlfile = "$PSScriptRoot\spike.xlsx"
|
||||
Remove-Item $xlfile -ErrorAction SilentlyContinue
|
||||
|
||||
$xlpkg = $data | Export-Excel $xlfile -WorksheetName Data -AutoNameRange -PassThru
|
||||
|
||||
$null = Add-Worksheet -ExcelPackage $xlpkg -WorksheetName Summary -Activate
|
||||
|
||||
$params = @{
|
||||
Worksheet = $xlpkg.Summary
|
||||
Title = "Sales by Region"
|
||||
ChartType = 'ColumnClustered'
|
||||
|
||||
# XRange = "Data!A2:A10"
|
||||
# YRange = "Data!C2:C10"
|
||||
|
||||
XRange = 'Data!Region'
|
||||
YRange = 'Data!Units'
|
||||
}
|
||||
|
||||
Add-ExcelChart @params
|
||||
|
||||
Close-ExcelPackage $xlpkg -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}
|
||||
|
||||
27
Examples/CommunityContributions/MultipleWorksheets.ps1
Normal file
27
Examples/CommunityContributions/MultipleWorksheets.ps1
Normal file
@@ -0,0 +1,27 @@
|
||||
<#
|
||||
To see this written up with example screenshots, head over to the IT Splat blog
|
||||
URL: http://bit.ly/2SxieeM
|
||||
#>
|
||||
|
||||
## Create an Excel file with multiple worksheets
|
||||
# Get a list of processes on the system
|
||||
$processes = Get-Process | Sort-Object -Property ProcessName | Group-Object -Property ProcessName | Where-Object {$_.Count -gt 2}
|
||||
|
||||
# Export the processes to Excel, each process on its own sheet
|
||||
$processes | ForEach-Object { $_.Group | Export-Excel -Path MultiSheetExample.xlsx -WorksheetName $_.Name -AutoSize -AutoFilter }
|
||||
|
||||
# Show the completed file
|
||||
Invoke-Item .\MultiSheetExample.xlsx
|
||||
|
||||
## Add an additional sheet to the new workbook
|
||||
# Use Open-ExcelPackage to open the workbook
|
||||
$excelPackage = Open-ExcelPackage -Path .\MultiSheetExample.xlsx
|
||||
|
||||
# Create a new worksheet and give it a name, set MoveToStart to make it the first sheet
|
||||
$ws = Add-Worksheet -ExcelPackage $excelPackage -WorksheetName 'All Services' -MoveToStart
|
||||
|
||||
# Get all the running services on the system
|
||||
Get-Service | Export-Excel -ExcelPackage $excelPackage -WorksheetName $ws -AutoSize -AutoFilter
|
||||
|
||||
# Close the package and show the final result
|
||||
Close-ExcelPackage -ExcelPackage $excelPackage -Show
|
||||
@@ -0,0 +1,22 @@
|
||||
try { Import-Module $PSScriptRoot\..\..\ImportExcel.psd1 } catch { throw ; return }
|
||||
|
||||
$data = ConvertFrom-Csv @"
|
||||
Region,State,Other,Units,Price,InStock
|
||||
West,Texas,1,927,923.71,1
|
||||
North,Tennessee,3,466,770.67,0
|
||||
East,Florida,0,1520,458.68,1
|
||||
East,Maine,1,1828,661.24,0
|
||||
West,Virginia,1,465,053.58,1
|
||||
North,Missouri,1,436,235.67,1
|
||||
South,Kansas,0,214,992.47,1
|
||||
North,North Dakota,1,789,640.72,0
|
||||
South,Delaware,-1,712,508.55,1
|
||||
"@
|
||||
|
||||
$xlfile = "$PSScriptRoot\test.xlsx"
|
||||
Remove-Item $xlfile -ErrorAction SilentlyContinue
|
||||
|
||||
$cfi1 = New-ConditionalFormattingIconSet -Range C:C -ConditionalFormat ThreeIconSet -IconType Symbols -ShowIconOnly
|
||||
$cfi2 = New-ConditionalFormattingIconSet -Range F:F -ConditionalFormat ThreeIconSet -IconType Symbols2 -ShowIconOnly
|
||||
|
||||
$data | Export-Excel $xlfile -AutoSize -ConditionalFormat $cfi1, $cfi2 -Show
|
||||
@@ -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)
|
||||
|
||||
|
||||
21
Examples/ConditionalFormatting/GetConditionalFormatting.ps1
Normal file
21
Examples/ConditionalFormatting/GetConditionalFormatting.ps1
Normal file
@@ -0,0 +1,21 @@
|
||||
try { Import-Module $PSScriptRoot\..\..\ImportExcel.psd1 } catch { throw ; return}
|
||||
|
||||
# This example is using Excel generated by Highlight-DiffCells.ps1
|
||||
# The displayed rule should be the same as in the PS script
|
||||
|
||||
function Get-ConditionalFormatting {
|
||||
param (
|
||||
[string] $xlSourcefile
|
||||
)
|
||||
$excel = Open-ExcelPackage -Path $xlSourcefile
|
||||
|
||||
$excel.Workbook.Worksheets | ForEach-Object {
|
||||
$wsNme = $_.Name
|
||||
$_.ConditionalFormatting | ForEach-Object {
|
||||
"Add-ConditionalFormatting -Worksheet `$excel[""$wsNme""] -Range '$($_.Address)' -ConditionValue '=$($_.Formula)' -RuleType $($_.Type) "
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$xlSourcefile = "$PSScriptRoot\GetConditionalFormatting.xlsx"
|
||||
Get-ConditionalFormatting -xlSourcefile $xlSourcefile
|
||||
BIN
Examples/ConditionalFormatting/GetConditionalFormatting.xlsx
Normal file
BIN
Examples/ConditionalFormatting/GetConditionalFormatting.xlsx
Normal file
Binary file not shown.
@@ -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
|
||||
|
||||
26
Examples/ConditionalFormatting/Highlight-DiffCells.ps1
Normal file
26
Examples/ConditionalFormatting/Highlight-DiffCells.ps1
Normal file
@@ -0,0 +1,26 @@
|
||||
try { Import-Module $PSScriptRoot\..\..\ImportExcel.psd1 } catch { throw ; return }
|
||||
|
||||
$xlSourcefile = "$env:TEMP\ImportExcelExample.xlsx"
|
||||
|
||||
Write-Verbose -Verbose -Message "Save location: $xlSourcefile"
|
||||
Remove-Item $xlSourcefile -ErrorAction Ignore
|
||||
|
||||
$data = ConvertFrom-Csv @"
|
||||
Region,State,Units2021,Units2022
|
||||
West,Texas,927,925
|
||||
North,Tennessee,466,466
|
||||
East,Florida,520,458
|
||||
East,Maine,828,661
|
||||
West,Virginia,465,465
|
||||
North,Missouri,436,235
|
||||
South,Kansas,214,214
|
||||
North,North Dakota,789,640
|
||||
South,Delaware,712,508
|
||||
"@
|
||||
|
||||
$excel = $data | Export-Excel $xlSourcefile -AutoSize -PassThru
|
||||
|
||||
Add-ConditionalFormatting -Worksheet $excel.sheet1 -Range "C2:D10" -ConditionValue '=$C2=$D2' -RuleType Expression -BackgroundColor ([System.Drawing.Color]::Thistle) -Bold
|
||||
Add-ConditionalFormatting -Worksheet $excel.sheet1 -Range "A2:D10" -ConditionValue '=$C2=$D2' -RuleType Expression -BackgroundColor ([System.Drawing.Color]::LavenderBlush)
|
||||
|
||||
Close-ExcelPackage $excel -Show
|
||||
@@ -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
|
||||
23
Examples/CustomNumbers/ShortenNumbers.ps1
Normal file
23
Examples/CustomNumbers/ShortenNumbers.ps1
Normal file
@@ -0,0 +1,23 @@
|
||||
# How to convert abbreviate or shorten long numbers in Excel
|
||||
|
||||
Remove-Item .\custom.xlsx -ErrorAction SilentlyContinue
|
||||
|
||||
$data = $(
|
||||
12000
|
||||
1000
|
||||
2000
|
||||
3000
|
||||
2400
|
||||
3600
|
||||
6000
|
||||
13000
|
||||
40000
|
||||
400000
|
||||
1000000
|
||||
)
|
||||
|
||||
$excel = $data | Export-Excel .\custom.xlsx -PassThru
|
||||
|
||||
Set-ExcelRange -Worksheet $excel.Sheet1 -Range "A:A" -NumberFormat '[>999999]#,,"M";#,"K"'
|
||||
|
||||
Close-ExcelPackage $excel -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"]
|
||||
|
||||
|
||||
BIN
Examples/ExcelBuiltIns/DSUM.png
Normal file
BIN
Examples/ExcelBuiltIns/DSUM.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 58 KiB |
34
Examples/ExcelBuiltIns/DSUM.ps1
Normal file
34
Examples/ExcelBuiltIns/DSUM.ps1
Normal file
@@ -0,0 +1,34 @@
|
||||
# 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}
|
||||
|
||||
#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
|
||||
Red,1/15/2018,250
|
||||
Blue,1/15/2018,200
|
||||
Red,1/16/2018,175
|
||||
Blue,1/16/2018,325
|
||||
Red,1/17/2018,150
|
||||
Blue,1/17/2018,300
|
||||
"@
|
||||
|
||||
$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'
|
||||
|
||||
Set-Format -Worksheet $xl.Sheet1 -Range E1 -Value Color
|
||||
Set-Format -Worksheet $xl.Sheet1 -Range F1 -Value Date
|
||||
Set-Format -Worksheet $xl.Sheet1 -Range G1 -Value Sales
|
||||
|
||||
Set-Format -Worksheet $xl.Sheet1 -Range E2 -Value Red
|
||||
|
||||
Set-Format -Worksheet $xl.Sheet1 -Range E4 -Value Sales
|
||||
Set-Format -Worksheet $xl.Sheet1 -Range F4 -Formula ('=DSUM({0},"Sales",E1:G2)' -f $databaseAddress) -NumberFormat '$##0'
|
||||
|
||||
Close-ExcelPackage $xl -Show
|
||||
23
Examples/ExcelBuiltIns/VLOOKUP.ps1
Normal file
23
Examples/ExcelBuiltIns/VLOOKUP.ps1
Normal file
@@ -0,0 +1,23 @@
|
||||
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
|
||||
Apples,50
|
||||
Oranges,20
|
||||
Bananas,60
|
||||
Lemons,40
|
||||
"@
|
||||
|
||||
$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)"
|
||||
|
||||
Close-ExcelPackage $xl -Show
|
||||
BIN
Examples/ExcelBuiltIns/VLookUp.png
Normal file
BIN
Examples/ExcelBuiltIns/VLookUp.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 27 KiB |
@@ -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
|
||||
@@ -6,15 +6,16 @@
|
||||
#>
|
||||
|
||||
param(
|
||||
[Parameter(Mandatory=$true)]
|
||||
$moduleName,
|
||||
$moduleName = "ImportExcel",
|
||||
[ValidateSet('Column','Bar','Line','Pie')]
|
||||
$chartType="Line"
|
||||
)
|
||||
|
||||
$galleryUrl = "https://www.powershellgallery.com/packages/$moduleName"
|
||||
$nolegend = '-nolegend'
|
||||
if($chartType -eq 'pie') {$nolegend = $null}
|
||||
$code = "$($chartType)Chart (Get-HtmlTable $galleryUrl 0 | sort lastupdated -desc) -title 'Download stats for $moduleName' $nolegend"
|
||||
$download = Get-HtmlTable "https://www.powershellgallery.com/packages/$moduleName" -FirstDataRow 1 |
|
||||
Select-Object @{n="Version";e={$v = $Null ; if ($_.version -is [valuetype]) {[string][version]($_.version.tostring("0.0")) }
|
||||
elseif ($_.version -is [string] -and [version]::TryParse($_.version.trim(),[ref]$v)) {$v}
|
||||
else {$_.Version.trim() -replace "\s+"," " } }},
|
||||
Downloads, @{n="LastUpdated";e={[datetime]$_.last_updated}} |
|
||||
Sort-Object lastupdated -Descending
|
||||
|
||||
$code | Invoke-Expression
|
||||
& "$($chartType)Chart" $download "Download stats for $moduleName" -nolegend:($chartype -ne 'pie')
|
||||
|
||||
@@ -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
|
||||
|
||||
10
Examples/FormatResults/GetAsMarkdownTable.ps1
Normal file
10
Examples/FormatResults/GetAsMarkdownTable.ps1
Normal file
@@ -0,0 +1,10 @@
|
||||
param(
|
||||
[Alias('FullName')]
|
||||
[String[]]$Path
|
||||
)
|
||||
|
||||
if ($PSVersionTable.PSVersion.Major -gt 5 -and -not (Get-Command Format-Markdown -ErrorAction SilentlyContinue)) {
|
||||
throw "This requires EZOut. Install-Module EZOut -AllowClobber -Scope CurrentUser"
|
||||
}
|
||||
|
||||
Import-Excel $Path | Format-Markdown
|
||||
10
Examples/FormatResults/GetAsYaml.ps1
Normal file
10
Examples/FormatResults/GetAsYaml.ps1
Normal file
@@ -0,0 +1,10 @@
|
||||
param(
|
||||
[Alias('FullName')]
|
||||
[String[]]$Path
|
||||
)
|
||||
|
||||
if ($PSVersionTable.PSVersion.Major -gt 5 -and -not (Get-Command Format-YAML -ErrorAction SilentlyContinue)) {
|
||||
throw "This requires EZOut. Install-Module EZOut -AllowClobber -Scope CurrentUser"
|
||||
}
|
||||
|
||||
Import-Excel $Path | Format-YAML
|
||||
11
Examples/FormatResults/Sample.csv
Normal file
11
Examples/FormatResults/Sample.csv
Normal file
@@ -0,0 +1,11 @@
|
||||
"OrderId","Category","Sales","Quantity","Discount"
|
||||
"1","Cosmetics","744.01","7","0.7"
|
||||
"2","Grocery","349.13","25","0.3"
|
||||
"3","Apparels","535.11","88","0.2"
|
||||
"4","Electronics","524.69","60","0.1"
|
||||
"5","Electronics","439.1","41","0"
|
||||
"6","Apparels","56.84","54","0.8"
|
||||
"7","Electronics","326.66","97","0.7"
|
||||
"8","Cosmetics","17.25","74","0.6"
|
||||
"9","Grocery","199.96","39","0.4"
|
||||
"10","Grocery","731.77","20","0.3"
|
||||
|
BIN
Examples/FormatResults/Sample.xlsx
Normal file
BIN
Examples/FormatResults/Sample.xlsx
Normal file
Binary file not shown.
54
Examples/Freeze/FreezePane.ps1
Normal file
54
Examples/Freeze/FreezePane.ps1
Normal file
@@ -0,0 +1,54 @@
|
||||
# Freeze the columns/rows to left and above the cell
|
||||
|
||||
$data = ConvertFrom-Csv @"
|
||||
Region,State,Units,Price,Name,NA,EU,JP,Other
|
||||
West,Texas,927,923.71,Wii Sports,41.49,29.02,3.77,8.46
|
||||
West,Texas,927,923.71,Wii Sports,41.49,29.02,3.77,8.46
|
||||
West,Texas,927,923.71,Wii Sports,41.49,29.02,3.77,8.46
|
||||
West,Texas,927,923.71,Wii Sports,41.49,29.02,3.77,8.46
|
||||
West,Texas,927,923.71,Wii Sports,41.49,29.02,3.77,8.46
|
||||
West,Texas,927,923.71,Wii Sports,41.49,29.02,3.77,8.46
|
||||
West,Texas,927,923.71,Wii Sports,41.49,29.02,3.77,8.46
|
||||
West,Texas,927,923.71,Wii Sports,41.49,29.02,3.77,8.46
|
||||
West,Texas,927,923.71,Wii Sports,41.49,29.02,3.77,8.46
|
||||
West,Texas,927,923.71,Wii Sports,41.49,29.02,3.77,8.46
|
||||
West,Texas,927,923.71,Wii Sports,41.49,29.02,3.77,8.46
|
||||
West,Texas,927,923.71,Wii Sports,41.49,29.02,3.77,8.46
|
||||
West,Texas,927,923.71,Wii Sports,41.49,29.02,3.77,8.46
|
||||
West,Texas,927,923.71,Wii Sports,41.49,29.02,3.77,8.46
|
||||
West,Texas,927,923.71,Wii Sports,41.49,29.02,3.77,8.46
|
||||
West,Texas,927,923.71,Wii Sports,41.49,29.02,3.77,8.46
|
||||
West,Texas,927,923.71,Wii Sports,41.49,29.02,3.77,8.46
|
||||
West,Texas,927,923.71,Wii Sports,41.49,29.02,3.77,8.46
|
||||
West,Texas,927,923.71,Wii Sports,41.49,29.02,3.77,8.46
|
||||
West,Texas,927,923.71,Wii Sports,41.49,29.02,3.77,8.46
|
||||
West,Texas,927,923.71,Wii Sports,41.49,29.02,3.77,8.46
|
||||
West,Texas,927,923.71,Wii Sports,41.49,29.02,3.77,8.46
|
||||
West,Texas,927,923.71,Wii Sports,41.49,29.02,3.77,8.46
|
||||
West,Texas,927,923.71,Wii Sports,41.49,29.02,3.77,8.46
|
||||
West,Texas,927,923.71,Wii Sports,41.49,29.02,3.77,8.46
|
||||
West,Texas,927,923.71,Wii Sports,41.49,29.02,3.77,8.46
|
||||
West,Texas,927,923.71,Wii Sports,41.49,29.02,3.77,8.46
|
||||
West,Texas,927,923.71,Wii Sports,41.49,29.02,3.77,8.46
|
||||
West,Texas,927,923.71,Wii Sports,41.49,29.02,3.77,8.46
|
||||
West,Texas,927,923.71,Wii Sports,41.49,29.02,3.77,8.46
|
||||
West,Texas,927,923.71,Wii Sports,41.49,29.02,3.77,8.46
|
||||
West,Texas,927,923.71,Wii Sports,41.49,29.02,3.77,8.46
|
||||
West,Texas,927,923.71,Wii Sports,41.49,29.02,3.77,8.46
|
||||
West,Texas,927,923.71,Wii Sports,41.49,29.02,3.77,8.46
|
||||
West,Texas,927,923.71,Wii Sports,41.49,29.02,3.77,8.46
|
||||
West,Texas,927,923.71,Wii Sports,41.49,29.02,3.77,8.46
|
||||
West,Texas,927,923.71,Wii Sports,41.49,29.02,3.77,8.46
|
||||
West,Texas,927,923.71,Wii Sports,41.49,29.02,3.77,8.46
|
||||
West,Texas,927,923.71,Wii Sports,41.49,29.02,3.77,8.46
|
||||
West,Texas,927,923.71,Wii Sports,41.49,29.02,3.77,8.46
|
||||
"@
|
||||
|
||||
$xlfilename = "test.xlsx"
|
||||
Remove-Item $xlfilename -ErrorAction SilentlyContinue
|
||||
|
||||
<#
|
||||
Freezes the top two rows and the two leftmost column
|
||||
#>
|
||||
|
||||
$data | Export-Excel $xlfilename -Show -Title 'Sales Data' -FreezePane 3, 3
|
||||
@@ -1,10 +0,0 @@
|
||||
$xlfile = "$env:TEMP\Points.xlsx"
|
||||
|
||||
Remove-Item $xlfile -ErrorAction SilentlyContinue
|
||||
|
||||
$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
|
||||
13
Examples/Grouping/GroupDateColumn.ps1
Normal file
13
Examples/Grouping/GroupDateColumn.ps1
Normal file
@@ -0,0 +1,13 @@
|
||||
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
|
||||
|
||||
$PivotTableDefinition = New-PivotTableDefinition -Activate -PivotTableName Points `
|
||||
-PivotRows Driver -PivotColumns Date -PivotData @{Points = "SUM"} -GroupDateColumn 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 $xlSourcefile -Show -AutoSize -PivotTableDefinition $PivotTableDefinition
|
||||
13
Examples/Grouping/GroupDateRow.ps1
Normal file
13
Examples/Grouping/GroupDateRow.ps1
Normal file
@@ -0,0 +1,13 @@
|
||||
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
|
||||
|
||||
$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 $xlSourcefile -Show -AutoSize -PivotTableDefinition $PivotTableDefinition
|
||||
13
Examples/Grouping/GroupNumericColumn.ps1
Normal file
13
Examples/Grouping/GroupNumericColumn.ps1
Normal file
@@ -0,0 +1,13 @@
|
||||
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
|
||||
|
||||
$PivotTableDefinition = New-PivotTableDefinition -Activate -PivotTableName Places `
|
||||
-PivotRows Driver -PivotColumns FinishPosition -PivotData @{Date = "Count"} -GroupNumericColumn 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 $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
|
||||
|
||||
7
Examples/Import-Excel/ImportMultipleSheetsAsArray.ps1
Normal file
7
Examples/Import-Excel/ImportMultipleSheetsAsArray.ps1
Normal file
@@ -0,0 +1,7 @@
|
||||
Import-Module $PSScriptRoot\..\..\ImportExcel.psd1 -Force
|
||||
|
||||
$xlfile = "$PSScriptRoot\yearlySales.xlsx"
|
||||
|
||||
$result = Import-Excel -Path $xlfile -WorksheetName * -Raw
|
||||
|
||||
$result | Measure-Object
|
||||
@@ -0,0 +1,9 @@
|
||||
Import-Module $PSScriptRoot\..\..\ImportExcel.psd1 -Force
|
||||
|
||||
$xlfile = "$PSScriptRoot\yearlySales.xlsx"
|
||||
|
||||
$result = Import-Excel -Path $xlfile -WorksheetName *
|
||||
|
||||
foreach ($sheet in $result.Values) {
|
||||
$sheet
|
||||
}
|
||||
BIN
Examples/Import-Excel/yearlySales.xlsx
Normal file
BIN
Examples/Import-Excel/yearlySales.xlsx
Normal file
Binary file not shown.
BIN
Examples/ImportByColumns/FruitCity.xlsx
Normal file
BIN
Examples/ImportByColumns/FruitCity.xlsx
Normal file
Binary file not shown.
BIN
Examples/ImportByColumns/VM_Build_Example.xlsx
Normal file
BIN
Examples/ImportByColumns/VM_Build_Example.xlsx
Normal file
Binary file not shown.
146
Examples/ImportByColumns/import-by-columns.ps1
Normal file
146
Examples/ImportByColumns/import-by-columns.ps1
Normal file
@@ -0,0 +1,146 @@
|
||||
function Import-ByColumns {
|
||||
<#
|
||||
.synopsis
|
||||
Works like Import-Excel but with data in columns instead of the conventional rows.
|
||||
.Description.
|
||||
Import-excel will read the sample file in this folder like this
|
||||
> Import-excel FruitCity.xlsx | ft *
|
||||
GroupAs Apple Orange Banana
|
||||
------- ----- ------ ------
|
||||
London 1 4 9
|
||||
Paris 2 4 10
|
||||
NewYork 6 5 11
|
||||
Munich 7 8 12
|
||||
Import-ByColumns transposes it
|
||||
> Import-Bycolumns FruitCity.xlsx | ft *
|
||||
GroupAs London Paris NewYork Munich
|
||||
------- ------ ----- ------- ------
|
||||
Apple 1 2 6 7
|
||||
Orange 4 4 5 8
|
||||
Banana 9 10 11 12
|
||||
.Example
|
||||
C:\> Import-Bycolumns -path .\VM_Build_Example.xlsx -StartRow 7 -EndRow 21 -EndColumn 7 -HeaderName Desc,size,type,
|
||||
cpu,ram,NetAcc,OS,OSDiskSize,DataDiskSize,LogDiskSize,TempDbDiskSize,BackupDiskSize,ImageDiskDize,AzureBackup,AzureReplication | ft -a *
|
||||
|
||||
This reads a spreadsheet which has a block from row 7 to 21 containing 14 properties of virtual machines.
|
||||
The properties names are in column A and the 6 VMS are in columns B-G
|
||||
Because the property names are written for easy reading by the person completing the spreadsheet, they are replaced with new names.
|
||||
All the parameters work as they would for Import-Excel
|
||||
#>
|
||||
|
||||
[Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSAvoidUsingPlainTextForPassword", "")]
|
||||
param(
|
||||
[Alias('FullName')]
|
||||
[Parameter(ParameterSetName = "PathA", Mandatory, ValueFromPipelineByPropertyName, ValueFromPipeline, Position = 0 )]
|
||||
[Parameter(ParameterSetName = "PathB", Mandatory, ValueFromPipelineByPropertyName, ValueFromPipeline, Position = 0 )]
|
||||
[Parameter(ParameterSetName = "PathC", Mandatory, ValueFromPipelineByPropertyName, ValueFromPipeline, Position = 0 )]
|
||||
[String]$Path,
|
||||
|
||||
[Parameter(ParameterSetName = "PackageA", Mandatory)]
|
||||
[Parameter(ParameterSetName = "PackageB", Mandatory)]
|
||||
[Parameter(ParameterSetName = "PackageC", Mandatory)]
|
||||
[OfficeOpenXml.ExcelPackage]$ExcelPackage,
|
||||
|
||||
[Alias('Sheet')]
|
||||
[Parameter(Position = 1)]
|
||||
[ValidateNotNullOrEmpty()]
|
||||
[String]$WorksheetName,
|
||||
|
||||
[Parameter(ParameterSetName = 'PathB' , Mandatory)]
|
||||
[Parameter(ParameterSetName = 'PackageB', Mandatory)]
|
||||
[String[]]$HeaderName ,
|
||||
[Parameter(ParameterSetName = 'PathC' , Mandatory)]
|
||||
[Parameter(ParameterSetName = 'PackageC', Mandatory)]
|
||||
[Switch]$NoHeader,
|
||||
|
||||
[Alias('TopRow')]
|
||||
[ValidateRange(1, 9999)]
|
||||
[Int]$StartRow = 1,
|
||||
|
||||
[Alias('StopRow', 'BottomRow')]
|
||||
[Int]$EndRow ,
|
||||
|
||||
[Alias('LeftColumn','LabelColumn')]
|
||||
[Int]$StartColumn = 1,
|
||||
|
||||
[Int]$EndColumn,
|
||||
[switch]$DataOnly,
|
||||
[switch]$AsHash,
|
||||
|
||||
[ValidateNotNullOrEmpty()]
|
||||
[String]$Password
|
||||
)
|
||||
function Get-PropertyNames {
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Create objects containing the row number and the row name for each of the different header types.
|
||||
#>
|
||||
[Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseSingularNouns', '', Justification = "Name would be incorrect, and command is not exported")]
|
||||
param(
|
||||
[Parameter(Mandatory)]
|
||||
[Int[]]$Rows,
|
||||
[Parameter(Mandatory)]
|
||||
[Int]$StartColumn
|
||||
)
|
||||
if ($HeaderName) {
|
||||
$i = 0
|
||||
foreach ($h in $HeaderName) {
|
||||
$h | Select-Object @{n='Row'; e={$rows[$i]}}, @{n='Value'; e={$h} }
|
||||
$i++
|
||||
}
|
||||
}
|
||||
elseif ($NoHeader) {
|
||||
$i = 0
|
||||
foreach ($r in $rows) {
|
||||
$i++
|
||||
$r | Select-Object @{n='Row'; e={$_}}, @{n='Value'; e={"P$i"} }
|
||||
}
|
||||
}
|
||||
else {
|
||||
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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#region open file if necessary, find worksheet and ensure we have start/end row/columns
|
||||
if ($Path -and -not $ExcelPackage -and $Password) {
|
||||
$ExcelPackage = Open-ExcelPackage -Path $Path -Password $Password
|
||||
}
|
||||
elseif ($Path -and -not $ExcelPackage ) {
|
||||
$ExcelPackage = Open-ExcelPackage -Path $Path
|
||||
}
|
||||
if (-not $ExcelPackage) {
|
||||
throw 'Could not get an Excel workbook to work on' ; return
|
||||
}
|
||||
|
||||
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 }
|
||||
#endregion
|
||||
|
||||
$Rows = $Startrow .. $EndRow ;
|
||||
$Columns = (1 + $StartColumn)..$EndColumn
|
||||
|
||||
if ((-not $rows) -or (-not ($PropertyNames = Get-PropertyNames -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
|
||||
}
|
||||
if ($AsHash) {$NewColumn}
|
||||
elseif (($NewColumn.Values -ne "") -or -not $dataonly) {[PSCustomObject]$NewColumn}
|
||||
}
|
||||
}
|
||||
}
|
||||
9
Examples/ImportColumns/ImportColumns.ps1
Normal file
9
Examples/ImportColumns/ImportColumns.ps1
Normal file
@@ -0,0 +1,9 @@
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
# Create example file
|
||||
$xlFile = "$PSScriptRoot\ImportColumns.xlsx"
|
||||
Get-Process | Export-Excel -Path $xlFile
|
||||
# -ImportColumns will also arrange columns
|
||||
Import-Excel -Path $xlFile -ImportColumns @(1,3,2) -NoHeader -StartRow 1
|
||||
# Get only pm, npm, cpu, id, processname
|
||||
Import-Excel -Path $xlFile -ImportColumns @(6,7,12,25,46) | Format-Table -AutoSize
|
||||
14
Examples/InvokeExcelQuery/Examples.ps1
Normal file
14
Examples/InvokeExcelQuery/Examples.ps1
Normal file
@@ -0,0 +1,14 @@
|
||||
try { Import-Module $PSScriptRoot\..\..\ImportExcel.psd1 } catch { throw ; return }
|
||||
|
||||
$queries =
|
||||
'select * from [sheet1$A:A]',
|
||||
'select * from [sheet1$]',
|
||||
'select * from [sheet1$A2:E11]',
|
||||
'select F2,F5 from [sheet1$A2:E11]',
|
||||
'select * from [sheet1$A2:E11] where F2 = "Grocery"',
|
||||
'select F2 as [Category], F5 as [Discount], F5*2 as [DiscountPlus] from [sheet1$A2:E11]'
|
||||
|
||||
foreach ($query in $queries) {
|
||||
"query: $($query)"
|
||||
Invoke-ExcelQuery .\testOleDb.xlsx $query | Format-Table
|
||||
}
|
||||
BIN
Examples/InvokeExcelQuery/testOleDb.xlsx
Normal file
BIN
Examples/InvokeExcelQuery/testOleDb.xlsx
Normal file
Binary file not shown.
@@ -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(
|
||||
|
||||
28
Examples/OpenExcelPackage/EnableFeatures.ps1
Normal file
28
Examples/OpenExcelPackage/EnableFeatures.ps1
Normal file
@@ -0,0 +1,28 @@
|
||||
# How to use Enable-ExcelAutoFilter and Enable-ExcelAutofit
|
||||
|
||||
try { Import-Module $PSScriptRoot\..\..\ImportExcel.psd1 } catch { throw ; return }
|
||||
|
||||
$data = ConvertFrom-Csv @"
|
||||
RegionInfo,StateInfo,Units,Price
|
||||
West,Texas,927,923.71
|
||||
North,Tennessee,466,770.67
|
||||
East,Florida,520,458.68
|
||||
East,Maine,828,661.24
|
||||
West,Virginia,465,053.58
|
||||
North,Missouri,436,235.67
|
||||
South,Kansas,214,992.47
|
||||
North,North Dakota,789,640.72
|
||||
South,Delaware,712,508.55
|
||||
"@
|
||||
|
||||
$xlfile = "$PSScriptRoot\enableFeatures.xlsx"
|
||||
Remove-Item $xlfile -ErrorAction SilentlyContinue
|
||||
|
||||
$data | Export-Excel $xlfile
|
||||
|
||||
$excel = Open-ExcelPackage $xlfile
|
||||
|
||||
Enable-ExcelAutoFilter -Worksheet $excel.Sheet1
|
||||
Enable-ExcelAutofit -Worksheet $excel.Sheet1
|
||||
|
||||
Close-ExcelPackage $excel -Show
|
||||
147
Examples/Pester-To-XLSx.ps1
Normal file
147
Examples/Pester-To-XLSx.ps1
Normal file
@@ -0,0 +1,147 @@
|
||||
[Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSPossibleIncorrectComparisonWithNull', '', Justification = 'Intentional use to select non null array items')]
|
||||
[CmdletBinding(DefaultParameterSetName = 'Default')]
|
||||
param(
|
||||
[Parameter(Position = 0)]
|
||||
[string]$XLFile,
|
||||
|
||||
[Parameter(ParameterSetName = 'Default', Position = 1)]
|
||||
[Alias('Path', 'relative_path')]
|
||||
[object[]]$Script = '.',
|
||||
|
||||
[Parameter(ParameterSetName = 'Existing', Mandatory = $true)]
|
||||
[switch]
|
||||
$UseExisting,
|
||||
|
||||
[Parameter(ParameterSetName = 'Default', Position = 2)]
|
||||
[Parameter(ParameterSetName = 'Existing', Position = 2, Mandatory = $true)]
|
||||
[string]$OutputFile,
|
||||
|
||||
[Parameter(ParameterSetName = 'Default')]
|
||||
[Alias("Name")]
|
||||
[string[]]$TestName,
|
||||
|
||||
[Parameter(ParameterSetName = 'Default')]
|
||||
[switch]$EnableExit,
|
||||
|
||||
[Parameter(ParameterSetName = 'Default')]
|
||||
[Alias('Tags')]
|
||||
[string[]]$Tag,
|
||||
[string[]]$ExcludeTag,
|
||||
|
||||
[Parameter(ParameterSetName = 'Default')]
|
||||
[switch]$Strict,
|
||||
|
||||
[string]$WorkSheetName = 'PesterResults',
|
||||
[switch]$append,
|
||||
[switch]$Show
|
||||
)
|
||||
|
||||
$InvokePesterParams = @{OutputFormat = 'NUnitXml' } + $PSBoundParameters
|
||||
if (-not $InvokePesterParams['OutputFile']) {
|
||||
$InvokePesterParams['OutputFile'] = Join-Path -ChildPath 'Pester.xml'-Path ([environment]::GetFolderPath([System.Environment+SpecialFolder]::MyDocuments))
|
||||
}
|
||||
if ($InvokePesterParams['Show'] ) { }
|
||||
if ($InvokePesterParams['XLFile']) { $InvokePesterParams.Remove('XLFile') }
|
||||
else { $XLFile = $InvokePesterParams['OutputFile'] -replace '.xml$', '.xlsx' }
|
||||
if (-not $UseExisting) {
|
||||
$InvokePesterParams.Remove('Append')
|
||||
$InvokePesterParams.Remove('UseExisting')
|
||||
$InvokePesterParams.Remove('Show')
|
||||
$InvokePesterParams.Remove('WorkSheetName')
|
||||
Invoke-Pester @InvokePesterParams
|
||||
}
|
||||
|
||||
if (-not (Test-Path -Path $InvokePesterParams['OutputFile'])) {
|
||||
throw "Could not output file $($InvokePesterParams['OutputFile'])"; return
|
||||
}
|
||||
|
||||
$resultXML = ([xml](Get-Content $InvokePesterParams['OutputFile'])).'test-results'
|
||||
$startDate = [datetime]$resultXML.date
|
||||
$startTime = $resultXML.time
|
||||
$machine = $resultXML.environment.'machine-name'
|
||||
#$user = $resultXML.environment.'user-domain' + '\' + $resultXML.environment.user
|
||||
$os = $resultXML.environment.platform -replace '\|.*$', " $($resultXML.environment.'os-version')"
|
||||
<#hierarchy goes
|
||||
root, [date], start [time], [Name] (always "Pester"), test results broken down as [total],[errors],[failures],[not-run] etc.
|
||||
Environment (user & machine info)
|
||||
Culture-Info (current, and currentUi culture)
|
||||
Test-Suite [name] = "Pester" [result], [time] to execute, etc.
|
||||
Results
|
||||
Test-Suite [name] = filename,[result], [Time] to Execute etc
|
||||
Results
|
||||
Test-Suite [Name] = Describe block Name, [result], [Time] to execute etc..
|
||||
Results
|
||||
Test-Suite [Name] = Context block name [result], [Time] to execute etc.
|
||||
Results
|
||||
Test-Case [name] = Describe.Context.It block names [description]= it block name, result], [Time] to execute etc
|
||||
or if the tests are parameterized
|
||||
Test suite [description] - name in the the it block with <vars> not filled in
|
||||
Results
|
||||
Test-case [description] - name as rendered for display with <vars> filled in
|
||||
#>
|
||||
$testResults = foreach ($test in $resultXML.'test-suite'.results.'test-suite') {
|
||||
$testPs1File = $test.name
|
||||
#Test if there are context blocks in the hierarchy OR if we go straight from Describe to test-case
|
||||
if ($test.results.'test-suite'.results.'test-suite' -ne $null) {
|
||||
foreach ($suite in $test.results.'test-suite') {
|
||||
$Describe = $suite.description
|
||||
foreach ($subsuite in $suite.results.'test-suite') {
|
||||
$Context = $subsuite.description
|
||||
if ($subsuite.results.'test-suite'.results.'test-case') {
|
||||
$testCases = $subsuite.results.'test-suite'.results.'test-case'
|
||||
}
|
||||
else { $testCases = $subsuite.results.'test-case' }
|
||||
$testCases | ForEach-Object {
|
||||
New-Object -TypeName psobject -Property ([ordered]@{
|
||||
Machine = $machine ; OS = $os
|
||||
Date = $startDate ; Time = $startTime
|
||||
Executed = $(if ($_.executed -eq 'True') { 1 })
|
||||
Success = $(if ($_.success -eq 'True') { 1 })
|
||||
Duration = $_.time
|
||||
File = $testPs1File; Group = $Describe
|
||||
SubGroup = $Context ; Name = ($_.Description -replace '\s{2,}', ' ')
|
||||
Result = $_.result ; FullDesc = '=Group&" "&SubGroup&" "&Name'
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
$test.results.'test-suite' | ForEach-Object {
|
||||
$Describe = $_.description
|
||||
$_.results.'test-case' | ForEach-Object {
|
||||
New-Object -TypeName psobject -Property ([ordered]@{
|
||||
Machine = $machine ; OS = $os
|
||||
Date = $startDate ; Time = $startTime
|
||||
Executed = $(if ($_.executed -eq 'True') { 1 })
|
||||
Success = $(if ($_.success -eq 'True') { 1 })
|
||||
Duration = $_.time
|
||||
File = $testPs1File; Group = $Describe
|
||||
SubGroup = $null ; Name = ($_.Description -replace '\s{2,}', ' ')
|
||||
Result = $_.result ; FullDesc = '=Group&" "&Test'
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (-not $testResults) { Write-Warning 'No Results found' ; return }
|
||||
$clearSheet = -not $Append
|
||||
$excel = $testResults | Export-Excel -Path $xlFile -WorkSheetname $WorkSheetName -ClearSheet:$clearSheet -Append:$append -PassThru -BoldTopRow -FreezeTopRow -AutoSize -AutoFilter -AutoNameRange
|
||||
$ws = $excel.Workbook.Worksheets[$WorkSheetName]
|
||||
<# Worksheet should look like ..
|
||||
|A |B |C D |E |F |G |H |I |J |K |L |M
|
||||
1|Machine |OS |Date Time |Executed |Success |Duration |File |Group |SubGroup |Name |Result |FullDescription
|
||||
2|Flatfish |Name_Version |[run started] |Boolean |Boolean |In seconds |xx.ps1 |Describe |Context |It |Success |Desc_Context_It
|
||||
#>
|
||||
|
||||
#Display Date as a date, not a date time
|
||||
Set-Column -Worksheet $ws -Column 3 -NumberFormat 'Short Date' # -AutoSize
|
||||
|
||||
#Hide columns E to J (Executed, Success, Duration, File, Group and Subgroup)
|
||||
(5..10) | ForEach-Object { Set-ExcelColumn -Worksheet $ws -Column $_ -Hide }
|
||||
|
||||
#Use conditional formatting to make Failures red, and Successes green (skipped remains black ) ... and save
|
||||
$endRow = $ws.Dimension.End.Row
|
||||
Add-ConditionalFormatting -WorkSheet $ws -range "L2:L$endrow" -RuleType ContainsText -ConditionValue "Failure" -BackgroundPattern None -ForegroundColor Red -Bold
|
||||
Add-ConditionalFormatting -WorkSheet $ws -range "L2:L$endRow" -RuleType ContainsText -ConditionValue "Success" -BackgroundPattern None -ForeGroundColor Green
|
||||
Close-ExcelPackage -ExcelPackage $excel -Show:$show
|
||||
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.
|
||||
|
||||
21
Examples/PsGallery.ps1
Normal file
21
Examples/PsGallery.ps1
Normal file
@@ -0,0 +1,21 @@
|
||||
|
||||
$top1000 = foreach ($p in 1..50) {
|
||||
$c = Invoke-WebRequest -Uri "https://www.powershellgallery.com/packages" -method Post -Body "q=&sortOrder=package-download-count&page=$p"
|
||||
[regex]::Matches($c.Content,'<table class="width-hundred-percent">.*?</table>', [System.Text.RegularExpressions.RegexOptions]::Singleline) | foreach {
|
||||
$name = [regex]::Match($_, "(?<=<h1><a href=.*?>).*(?=</a></h1>)").value
|
||||
$n = [regex]::replace($_,'^.*By:\s*<li role="menuitem">','', [System.Text.RegularExpressions.RegexOptions]::Singleline)
|
||||
$n = [regex]::replace($n,'</div>.*$','', [System.Text.RegularExpressions.RegexOptions]::Singleline)
|
||||
$by = [regex]::match($n,'(?<=">).*(?=</a>)').value
|
||||
$qty = [regex]::match($n,'\S*(?= downloads)').value
|
||||
[PSCustomObject]@{
|
||||
Name = $name
|
||||
by = $by
|
||||
Downloads = $qty
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
del "~\Documents\gallery.xlsx"
|
||||
$pivotdef = New-PivotTableDefinition -PivotTableName 'Summary' -PivotRows by -PivotData @{name="Count"
|
||||
Downloads="Sum"} -PivotDataToColumn -Activate -ChartType ColumnClustered -PivotNumberFormat '#,###'
|
||||
$top1000 | export-excel -path '~\Documents\gallery.xlsx' -Numberformat '#,###' -PivotTableDefinition $pivotdef -TableName 'TopDownloads' -Show
|
||||
78
Examples/Subtotals.ps1
Normal file
78
Examples/Subtotals.ps1
Normal file
@@ -0,0 +1,78 @@
|
||||
$Data = ConvertFrom-Csv @'
|
||||
Product, City, Gross, Net
|
||||
Apple, London , 300, 250
|
||||
Orange, London , 400, 350
|
||||
Banana, London , 300, 200
|
||||
Grape, Munich, 100, 100
|
||||
Orange, Paris, 600, 500
|
||||
Banana, Paris, 300, 200
|
||||
Apple, New York, 1200,700
|
||||
'@
|
||||
$ExcelPath = "$env:temp\subtotal.xlsx"
|
||||
$SheetName = 'Sheet1'
|
||||
Remove-Item -Path $ExcelPath -ErrorAction SilentlyContinue
|
||||
|
||||
|
||||
$GroupByFieldName = 'City'
|
||||
$TotalSingleRows = $false
|
||||
$GrandTotal = $false
|
||||
$SubtotalRowHeight = 0 #If non zero will set subtotals to this height
|
||||
$Subtotals =@{ 'Net' = {"=SUBTOTAL(3,D{0}:D{1})" -f $from, $to}
|
||||
|
||||
|
||||
}
|
||||
$SubtotalFieldName = 'Net'
|
||||
|
||||
$SubtotalFormula = '=SUBTOTAL(3,D{0}:D{1})' # {0} and {1} are placeholders for the first and last row. D is the column to total in
|
||||
# 1=AVERAGE; 2=COUNT; 3=COUNTA; 4=MAX; 5=MIN; 6=PRODUCT; 7=STDEV; 8=STDEVP; 9=SUM; 10=VAR; 11=VARP add 100 to ignore hidden values
|
||||
|
||||
#at each change in the Group by field, insert a subtotal (count) formula in the title column & send to excel - list those rows and make them half height after export
|
||||
$currentRow = 2
|
||||
$lastChangeRow = 2
|
||||
$insertedRows = @()
|
||||
#$hideRows = @()
|
||||
$lastValue = $Data[0].$GroupByFieldName
|
||||
$excel = $Data | ForEach-Object -Process {
|
||||
if ($_.$GroupByFieldName -ne $lastvalue) {
|
||||
if ($lastChangeRow -lt ($currentrow - 1) -or $totalSingleRows) {
|
||||
$formula = $SubtotalFormula -f $lastChangeRow, ($currentrow - 1)
|
||||
$insertedRows += $currentRow
|
||||
[pscustomobject]@{$SubtotalFieldName = $formula}
|
||||
$currentRow += 1
|
||||
}
|
||||
$lastChangeRow = $currentRow
|
||||
$lastValue = $_.$GroupByFieldName
|
||||
}
|
||||
$_
|
||||
$currentRow += 1
|
||||
} -end {
|
||||
$formula = $SubtotalFormula -f $lastChangeRow, ($currentrow - 1)
|
||||
[pscustomobject]@{$SubtotalFieldName=$formula}
|
||||
if ($GrandTotal) {
|
||||
$formula = $SubtotalFormula -f $lastChangeRow, ($currentrow - 1)
|
||||
[pscustomobject]@{$SubtotalFieldName=$formula}
|
||||
}
|
||||
} | Export-Excel -Path $ExcelPath -PassThru -AutoSize -AutoFilter -BoldTopRow -WorksheetName $sheetName
|
||||
|
||||
#We kept a lists of the total rows. Since single rows won't get expanded/collapsed hide them.
|
||||
if ($subtotalrowHeight) {
|
||||
foreach ($r in $insertedrows) { $excel.WorkItems.Row($r).Height = $SubtotalRowHeight}
|
||||
}
|
||||
#foreach ($r in $hideRows) { $excel.$SheetName.Row($r).hidden = $true}
|
||||
$range = $excel.$SheetName.Dimension.Address
|
||||
$sheetIndex = $excel.Sheet1.Index
|
||||
Close-ExcelPackage -ExcelPackage $excel
|
||||
|
||||
try { $excelApp = New-Object -ComObject "Excel.Application" }
|
||||
catch { Write-Warning "Could not start Excel application - which usually means it is not installed." ; return }
|
||||
|
||||
try { $excelWorkBook = $excelApp.Workbooks.Open($ExcelPath) }
|
||||
catch { Write-Warning -Message "Could not Open $ExcelPath." ; return }
|
||||
$ws = $excelWorkBook.Worksheets.Item($sheetIndex)
|
||||
$null = $ws.Range($range).Select()
|
||||
$null = $excelapp.Selection.AutoOutline()
|
||||
$excelWorkBook.Save()
|
||||
$excelWorkBook.Close()
|
||||
$excelApp.Quit()
|
||||
|
||||
Start-Process $ExcelPath
|
||||
29
Examples/Tables/SalesData-WithTotalRow.ps1
Normal file
29
Examples/Tables/SalesData-WithTotalRow.ps1
Normal file
@@ -0,0 +1,29 @@
|
||||
try { Import-Module $PSScriptRoot\..\..\ImportExcel.psd1 } catch { throw ; return }
|
||||
|
||||
$data = ConvertFrom-Csv @"
|
||||
OrderId,Category,Sales,Quantity,Discount
|
||||
1,Cosmetics,744.01,07,0.7
|
||||
2,Grocery,349.13,25,0.3
|
||||
3,Apparels,535.11,88,0.2
|
||||
4,Electronics,524.69,60,0.1
|
||||
5,Electronics,439.10,41,0.0
|
||||
6,Apparels,56.84,54,0.8
|
||||
7,Electronics,326.66,97,0.7
|
||||
8,Cosmetics,17.25,74,0.6
|
||||
9,Grocery,199.96,39,0.4
|
||||
10,Grocery,731.77,20,0.3
|
||||
"@
|
||||
|
||||
$xlfile = "$PSScriptRoot\TotalsRow.xlsx"
|
||||
Remove-Item $xlfile -ErrorAction SilentlyContinue
|
||||
|
||||
$TableTotalSettings = @{
|
||||
Quantity = 'Sum'
|
||||
Category = '=COUNTIF([Category],"<>Electronics")' # Count the number of categories not equal to Electronics
|
||||
Sales = @{
|
||||
Function = '=SUMIF([Category],"<>Electronics",[Sales])'
|
||||
Comment = "Sum of sales for everything that is NOT Electronics"
|
||||
}
|
||||
}
|
||||
|
||||
$data | Export-Excel -Path $xlfile -TableName Sales -TableStyle Medium10 -TableTotalSettings $TableTotalSettings -AutoSize -Show
|
||||
16
Examples/Tables/TotalsRow.ps1
Normal file
16
Examples/Tables/TotalsRow.ps1
Normal file
@@ -0,0 +1,16 @@
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
$r = Get-ChildItem C:\WINDOWS\system32 -File
|
||||
|
||||
$TotalSettings = @{
|
||||
Name = "Count"
|
||||
# You can create the formula in an Excel workbook first and copy-paste it here
|
||||
# This syntax can only be used for the Custom type
|
||||
Extension = "=COUNTIF([Extension];`".exe`")"
|
||||
Length = @{
|
||||
Function = "=SUMIF([Extension];`".exe`";[Length])"
|
||||
Comment = "Sum of all exe sizes"
|
||||
}
|
||||
}
|
||||
|
||||
$r | Export-Excel -TableName system32files -TableStyle Medium10 -TableTotalSettings $TotalSettings -Show
|
||||
@@ -29,7 +29,7 @@ function ConvertTo-PesterTest {
|
||||
|
||||
`$target.psobject.Properties.name | ForEach-Object {`$p=@{}} {`$p.`$_=`$(`$target.`$_)}
|
||||
|
||||
Invoke-RestMethod @p | Should Be '$($record.ExpectedResult)'
|
||||
Invoke-RestMethod @p | Should -Be '$($record.ExpectedResult)'
|
||||
}
|
||||
|
||||
"@
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user