mirror of
https://github.com/dfinke/ImportExcel.git
synced 2025-12-13 14:53:19 +00:00
Compare commits
336 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
99f742fa8c | ||
|
|
558070bb60 | ||
|
|
1e0dd763ca | ||
|
|
a783b9c8ca | ||
|
|
9abbe2983b | ||
|
|
0556e4947a | ||
|
|
859b1e5467 | ||
|
|
0f4e491076 | ||
|
|
b30a91d64f | ||
|
|
d1f794c933 | ||
|
|
a016f069a5 | ||
|
|
fb16ec4677 | ||
|
|
1a51d38c0f | ||
|
|
554163a911 | ||
|
|
efd8dcd60a | ||
|
|
1c77bd31b5 | ||
|
|
35e013fe1d | ||
|
|
8ac9927cfa | ||
|
|
9c305a1dae | ||
|
|
aa738629f7 | ||
|
|
c1a26f4f4b | ||
|
|
63f41ceaec | ||
|
|
b82888527f | ||
|
|
a3c71de190 | ||
|
|
f3a99f04ce | ||
|
|
f631a20269 | ||
|
|
dbd35721ee | ||
|
|
8759070636 | ||
|
|
6259b8d091 | ||
|
|
7086c3707c | ||
|
|
8b28172616 | ||
|
|
abdd37b09e | ||
|
|
e1e855a823 | ||
|
|
585d9686a6 | ||
|
|
e87a6bdaf5 | ||
|
|
5ded5111b4 | ||
|
|
914c61048b | ||
|
|
25fb76d9b7 | ||
|
|
7faa27a3b3 | ||
|
|
5700be0684 | ||
|
|
6d86108060 | ||
|
|
4581c2b3e9 | ||
|
|
142c31ccc1 | ||
|
|
b99b7ba799 | ||
|
|
17b5d2caec | ||
|
|
6add16aa9f | ||
|
|
9aa0192ee6 | ||
|
|
fa25d1ac06 | ||
|
|
8131eee50f | ||
|
|
3ce485a144 | ||
|
|
bb1b413ada | ||
|
|
08078410dc | ||
|
|
3edcc0bdfb | ||
|
|
25081f84c1 | ||
|
|
668e3c982c | ||
|
|
98cf7e03c1 | ||
|
|
5b5c1c6fce | ||
|
|
4383916090 | ||
|
|
7c2bbf9595 | ||
|
|
48ca35b9ff | ||
|
|
68be3c3483 | ||
|
|
78326b4258 | ||
|
|
94b10b6f51 | ||
|
|
8ac9815e83 | ||
|
|
b3184d36a9 | ||
|
|
e58265075a | ||
|
|
453b2d8963 | ||
|
|
bc816851c9 | ||
|
|
b0a68e3445 | ||
|
|
8a1d0b0cf8 | ||
|
|
26f55251e2 | ||
|
|
0f9b308d53 | ||
|
|
847c9a1dc4 | ||
|
|
b488ffc700 | ||
|
|
3ec2481750 | ||
|
|
2d26c854d9 | ||
|
|
a4348ddca7 | ||
|
|
6bfdea6d3e | ||
|
|
cfd3db5803 | ||
|
|
f20a9de3df | ||
|
|
978e8d38b5 | ||
|
|
e7d2b528e5 | ||
|
|
899a8215e5 | ||
|
|
b06e9e35b7 | ||
|
|
6c7f00b031 | ||
|
|
337af82ae2 | ||
|
|
77ef2ebc40 | ||
|
|
92c97b25c3 | ||
|
|
52231254a5 | ||
|
|
494ac51ae5 | ||
|
|
0febb4a3c2 | ||
|
|
62f0faa5c5 | ||
|
|
1055bc41bf | ||
|
|
e100fa7a36 | ||
|
|
83bd387f98 | ||
|
|
caf0059ef5 | ||
|
|
965831ba57 | ||
|
|
a49cab5efc | ||
|
|
17bcea15e8 | ||
|
|
79fb29740d | ||
|
|
2984fe2ef5 | ||
|
|
8734dbd26c | ||
|
|
0211edf008 | ||
|
|
552552b93d | ||
|
|
2229bfb3ed | ||
|
|
25e7962100 | ||
|
|
6071f77218 | ||
|
|
52b9333d7c | ||
|
|
d3d8d76a71 | ||
|
|
f5f97fcd56 | ||
|
|
6665c2952d | ||
|
|
31444320cb | ||
|
|
d5734ff9b2 | ||
|
|
4481637c21 | ||
|
|
6caf247f5b | ||
|
|
65641955ba | ||
|
|
f2c13949a4 | ||
|
|
878ca570fb | ||
|
|
28fd5512bb | ||
|
|
7e465e3729 | ||
|
|
22283604f8 | ||
|
|
0c603afc0e | ||
|
|
a4a989c556 | ||
|
|
d94db666d7 | ||
|
|
438be760f7 | ||
|
|
2949ecc173 | ||
|
|
639ca738f6 | ||
|
|
736dd648f4 | ||
|
|
acdbd4a618 | ||
|
|
ad35d39850 | ||
|
|
e7afe166a4 | ||
|
|
37b076706e | ||
|
|
3303116658 | ||
|
|
89a8cb0469 | ||
|
|
bb9f4c31a6 | ||
|
|
996d1246cf | ||
|
|
0bb08fcb20 | ||
|
|
d004019761 | ||
|
|
a54ca228e9 | ||
|
|
bb6ff474a8 | ||
|
|
86b5c13543 | ||
|
|
c2525b0348 | ||
|
|
9625e4a8ac | ||
|
|
82177da695 | ||
|
|
b3f7a60be8 | ||
|
|
643610c267 | ||
|
|
bd7d70a050 | ||
|
|
d1f41012a1 | ||
|
|
0fbe9dbc9b | ||
|
|
e0b2d15c53 | ||
|
|
34c924ae19 | ||
|
|
9217962306 | ||
|
|
56acf56430 | ||
|
|
ef9be471ab | ||
|
|
9db2bc068e | ||
|
|
9560ea83f9 | ||
|
|
9c79ba573c | ||
|
|
894e645a47 | ||
|
|
f3dc390bfa | ||
|
|
f0f58f84a0 | ||
|
|
7ded24d2f9 | ||
|
|
cf964e3e4f | ||
|
|
8c5b3b2f5f | ||
|
|
8409adeeba | ||
|
|
153d4d8c45 | ||
|
|
69f9ba7d17 | ||
|
|
e4deb5801e | ||
|
|
1a74c0f0d0 | ||
|
|
72e44da219 | ||
|
|
bef2f29651 | ||
|
|
787dda70ee | ||
|
|
285e9e4949 | ||
|
|
01e3ea206d | ||
|
|
6f3420d11e | ||
|
|
2981bf23b1 | ||
|
|
c5cc018eb5 | ||
|
|
268d48ce3d | ||
|
|
eca631670c | ||
|
|
284560e109 | ||
|
|
234615dfdb | ||
|
|
d31cd04781 | ||
|
|
77481f2901 | ||
|
|
54fec69f88 | ||
|
|
1dc9a02d7d | ||
|
|
f86fdbab22 | ||
|
|
66937db040 | ||
|
|
80520299aa | ||
|
|
2753a6876a | ||
|
|
ade442b18c | ||
|
|
45ba112f73 | ||
|
|
e1fe36699b | ||
|
|
b3f4b188da | ||
|
|
0ce75794e6 | ||
|
|
3afe2059e5 | ||
|
|
66b7b64779 | ||
|
|
d90cd6d2d0 | ||
|
|
1d1f266fb6 | ||
|
|
4945b4d6e3 | ||
|
|
21b5a11aca | ||
|
|
d1976bf3a9 | ||
|
|
ffcdd39ae9 | ||
|
|
b4b5e75d28 | ||
|
|
4c3eb792d6 | ||
|
|
c4ef920bdf | ||
|
|
d81c2055e9 | ||
|
|
4528f3b052 | ||
|
|
5acec641fe | ||
|
|
04d06ff008 | ||
|
|
1974beef2d | ||
|
|
49f0c97635 | ||
|
|
0710724e2d | ||
|
|
a6438d468a | ||
|
|
ce92461efc | ||
|
|
b3c4a334b5 | ||
|
|
6b2190bfff | ||
|
|
5822ef330e | ||
|
|
d78e3fff98 | ||
|
|
85bd85ee69 | ||
|
|
04e8faaccc | ||
|
|
2c062a4e5d | ||
|
|
80c1a945f0 | ||
|
|
1d5ec26b04 | ||
|
|
860b2724f5 | ||
|
|
c38648a654 | ||
|
|
dcd730a4d1 | ||
|
|
0fdaeb977b | ||
|
|
61173d5e40 | ||
|
|
d26f0c66dd | ||
|
|
fe4fcff444 | ||
|
|
01c58faea8 | ||
|
|
dce2f6d108 | ||
|
|
49afad6977 | ||
|
|
b7add5f9e1 | ||
|
|
c07fc81dfe | ||
|
|
3835ceeebb | ||
|
|
6683bed799 | ||
|
|
20aade4bdd | ||
|
|
b6965e0724 | ||
|
|
9d85c6cb81 | ||
|
|
a17fc95415 | ||
|
|
ecb045274a | ||
|
|
e5c4a715d6 | ||
|
|
e27e98a9eb | ||
|
|
9da8bf8bf7 | ||
|
|
50905c7989 | ||
|
|
91a7c17341 | ||
|
|
3c18af50b9 | ||
|
|
66f5d09ace | ||
|
|
fa64299760 | ||
|
|
c36e5fb582 | ||
|
|
5158addc36 | ||
|
|
bf2e37ac9f | ||
|
|
d22d40cdc2 | ||
|
|
df49e04c6c | ||
|
|
f60ca87358 | ||
|
|
cef95f9ebe | ||
|
|
288071035f | ||
|
|
414d1ac72b | ||
|
|
1c7241774f | ||
|
|
7c773ff915 | ||
|
|
46de6c5934 | ||
|
|
955c737bb7 | ||
|
|
74e5fee161 | ||
|
|
c3331e8f09 | ||
|
|
1951a61699 | ||
|
|
5b29ccd9c2 | ||
|
|
d8bd5a8cb6 | ||
|
|
820722b481 | ||
|
|
08c82977f5 | ||
|
|
a2dd42fc80 | ||
|
|
c1d778ef85 | ||
|
|
7abb5dde89 | ||
|
|
0f15f3e3e5 | ||
|
|
3194bb0ee4 | ||
|
|
b1f716f0d5 | ||
|
|
a8f7a13248 | ||
|
|
d200a2929b | ||
|
|
99e69bd6c0 | ||
|
|
4f0c0d7c28 | ||
|
|
968d5a57b6 | ||
|
|
bdefb45095 | ||
|
|
4297d2ef82 | ||
|
|
a49bdb3abc | ||
|
|
a983ecd765 | ||
|
|
5a7d84e624 | ||
|
|
e0f5d9f789 | ||
|
|
7d3bcb810c | ||
|
|
8975aa2e95 | ||
|
|
77f30f105b | ||
|
|
972142f727 | ||
|
|
cfd1ac99b2 | ||
|
|
e09c5e5207 | ||
|
|
3ff59907ff | ||
|
|
ef4ac9777b | ||
|
|
65b1f79d53 | ||
|
|
ecad48acb3 | ||
|
|
f47887f7fe | ||
|
|
061ae22bfe | ||
|
|
53b63b3780 | ||
|
|
378a20a094 | ||
|
|
7edf5f8a3a | ||
|
|
6393701a2f | ||
|
|
71c22d647d | ||
|
|
ef656f72b3 | ||
|
|
dfd9b23cd7 | ||
|
|
f94a075f52 | ||
|
|
cea9713129 | ||
|
|
343687c418 | ||
|
|
d4d2b4a856 | ||
|
|
bed52d456d | ||
|
|
31e6eaf59b | ||
|
|
d770646dc7 | ||
|
|
bc65699068 | ||
|
|
ce3fd2021f | ||
|
|
10f670b4e6 | ||
|
|
c49b7b6db0 | ||
|
|
f768634214 | ||
|
|
07342235b9 | ||
|
|
2793ff1c21 | ||
|
|
121346f939 | ||
|
|
dc8a096732 | ||
|
|
c63512e658 | ||
|
|
e46fe6d3e9 | ||
|
|
6ae50c3193 | ||
|
|
ee2378150c | ||
|
|
259c7e8ae6 | ||
|
|
ae30bfe6c3 | ||
|
|
3756cd6ad8 | ||
|
|
1014250e0b | ||
|
|
951364da51 | ||
|
|
c1604fc08a | ||
|
|
5a235e309e | ||
|
|
af77580b5e | ||
|
|
b06a5059c5 | ||
|
|
edab941c44 | ||
|
|
91fb314bca |
6
.gitignore
vendored
6
.gitignore
vendored
@@ -2,6 +2,8 @@
|
|||||||
Thumbs.db
|
Thumbs.db
|
||||||
ehthumbs.db
|
ehthumbs.db
|
||||||
|
|
||||||
|
*.gitignore
|
||||||
|
|
||||||
# Folder config file
|
# Folder config file
|
||||||
Desktop.ini
|
Desktop.ini
|
||||||
|
|
||||||
@@ -14,6 +16,8 @@ $RECYCLE.BIN/
|
|||||||
*.msm
|
*.msm
|
||||||
*.msp
|
*.msp
|
||||||
|
|
||||||
|
*.dll
|
||||||
|
|
||||||
# Windows shortcuts
|
# Windows shortcuts
|
||||||
*.lnk
|
*.lnk
|
||||||
|
|
||||||
@@ -57,4 +61,6 @@ testCCFMT.ps1
|
|||||||
testHide.ps1
|
testHide.ps1
|
||||||
ImportExcel.zip
|
ImportExcel.zip
|
||||||
.vscode/launch.json
|
.vscode/launch.json
|
||||||
|
.vscode/settings.json
|
||||||
|
|
||||||
|
~$*
|
||||||
|
|||||||
7
.vscode/spellright.dict
vendored
7
.vscode/spellright.dict
vendored
@@ -28,3 +28,10 @@ PivtoTableName
|
|||||||
New-Excelchart
|
New-Excelchart
|
||||||
paypal
|
paypal
|
||||||
dll
|
dll
|
||||||
|
enums
|
||||||
|
Numberformat
|
||||||
|
ChartDefiniton
|
||||||
|
hashtables
|
||||||
|
Agramont
|
||||||
|
AGramont
|
||||||
|
Jhoneill
|
||||||
|
|||||||
@@ -1,148 +1,275 @@
|
|||||||
Function Add-ConditionalFormatting {
|
try {
|
||||||
|
#ensure that color and font lookups are available
|
||||||
|
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing")
|
||||||
|
}
|
||||||
|
catch {}
|
||||||
|
Function Add-ConditionalFormatting {
|
||||||
<#
|
<#
|
||||||
.Synopsis
|
.Synopsis
|
||||||
Adds contitional formatting to worksheet.
|
Adds conditional formatting to all or part of a worksheet.
|
||||||
|
.Description
|
||||||
|
Conditional formatting allows Excel to:
|
||||||
|
* Mark cells with icons depending on their value
|
||||||
|
* Show a databar whose length indicates the value or a two or three color scale where the color indicates the relative value
|
||||||
|
* Change the color, font, or number format of cells which meet given criteria
|
||||||
|
Add-ConditionalFormatting allows these parameters to be set; for fine tuning of
|
||||||
|
the rules, the -PassThru switch will return the rule so that you can modify
|
||||||
|
things which are specific to that type of rule, example, the values which
|
||||||
|
correspond to each icon in an Icon-Set.
|
||||||
.Example
|
.Example
|
||||||
|
>
|
||||||
$excel = $avdata | Export-Excel -Path (Join-path $FilePath "\Machines.XLSX" ) -WorksheetName "Server Anti-Virus" -AutoSize -FreezeTopRow -AutoFilter -PassThru
|
$excel = $avdata | Export-Excel -Path (Join-path $FilePath "\Machines.XLSX" ) -WorksheetName "Server Anti-Virus" -AutoSize -FreezeTopRow -AutoFilter -PassThru
|
||||||
|
|
||||||
Add-ConditionalFormatting -WorkSheet $excel.Workbook.Worksheets[1] -Address "b2:b1048576" -ForeGroundColor "RED" -RuleType ContainsText -ConditionValue "2003"
|
Add-ConditionalFormatting -WorkSheet $excel.Workbook.Worksheets[1] -Address "b2:b1048576" -ForeGroundColor "RED" -RuleType ContainsText -ConditionValue "2003"
|
||||||
Add-ConditionalFormatting -WorkSheet $excel.Workbook.Worksheets[1] -Address "i2:i1048576" -ForeGroundColor "RED" -RuleType ContainsText -ConditionValue "Disabled"
|
Add-ConditionalFormatting -WorkSheet $excel.Workbook.Worksheets[1] -Address "i2:i1048576" -ForeGroundColor "RED" -RuleType ContainsText -ConditionValue "Disabled"
|
||||||
$excel.Workbook.Worksheets[1].Cells["D1:G1048576"].Style.Numberformat.Format = [cultureinfo]::CurrentCulture.DateTimeFormat.ShortDatePattern
|
$excel.Workbook.Worksheets[1].Cells["D1:G1048576"].Style.Numberformat.Format = [cultureinfo]::CurrentCulture.DateTimeFormat.ShortDatePattern
|
||||||
$excel.Workbook.Worksheets[1].Row(1).style.font.bold = $true
|
$excel.Workbook.Worksheets[1].Row(1).style.font.bold = $true
|
||||||
$excel.Save() ; $excel.Dispose()
|
$excel.Save() ; $excel.Dispose()
|
||||||
|
|
||||||
Here Export-Excel is called with the -passThru parameter so the Excel Package object is stored in $Excel
|
Here Export-Excel is called with the -PassThru parameter so the ExcelPackage object
|
||||||
The desired worksheet is selected and the then columns B and i are conditially formatted (excluding the top row) to show red text if
|
representing Machines.XLSX is stored in $Excel.The desired worksheet is selected
|
||||||
the columns contain "2003" or "Disabled respectively. A fixed date formats are then applied to columns D..G, and the top row is formatted.
|
and then columns" B" and "I" are conditionally formatted (excluding the top row)
|
||||||
Finally the workbook is saved and the Excel object closed.
|
to show red text if they contain "2003" or "Disabled" respectively.
|
||||||
|
A fixed date format is then applied to columns D to G, and the top row is formatted.
|
||||||
|
Finally the workbook is saved and the Excel package object is closed.
|
||||||
.Example
|
.Example
|
||||||
C:\> $r = Add-ConditionalFormatting -WorkSheet $excel.Workbook.Worksheets[1] -Range "B1:B100" -ThreeIconsSet Flags -Passthru
|
>
|
||||||
C:\> $r.Reverse = $true ; $r.Icon1.Type = "Num"; $r.Icon2.Type = "Num" ; $r.Icon2.value = 100 ; $r.Icon3.type = "Num" ;$r.Icon3.value = 1000
|
$r = Add-ConditionalFormatting -WorkSheet $excel.Workbook.Worksheets[1] -Range "B1:B100" -ThreeIconsSet Flags -Passthru
|
||||||
|
$r.Reverse = $true ; $r.Icon1.Type = "Num"; $r.Icon2.Type = "Num" ; $r.Icon2.value = 100 ; $r.Icon3.type = "Num" ;$r.Icon3.value = 1000
|
||||||
|
|
||||||
|
Again Export-Excel has been called with -PassThru leaving a package object
|
||||||
|
in $Excel. This time B1:B100 has been conditionally formatted with 3 icons,
|
||||||
|
using the "Flags" Icon-Set. Add-ConditionalFormatting does not provide access
|
||||||
|
to every option in the formatting rule, so -PassThru has been used and the
|
||||||
|
rule is modified to apply the flags in reverse order, and transitions
|
||||||
|
between flags are set to 100 and 1000.
|
||||||
|
.Example
|
||||||
|
Add-ConditionalFormatting -WorkSheet $sheet -Range "D2:D1048576" -DataBarColor Red
|
||||||
|
|
||||||
|
This time $sheet holds an ExcelWorkshseet object and databars are added to
|
||||||
|
column D, excluding the top row.
|
||||||
|
.Example
|
||||||
|
Add-ConditionalFormatting -Address $worksheet.cells["FinishPosition"] -RuleType Equal -ConditionValue 1 -ForeGroundColor Purple -Bold -Priority 1 -StopIfTrue
|
||||||
|
|
||||||
|
In this example a named range is used to select the cells where the condition
|
||||||
|
should apply, and instead of specifying a sheet and range within the sheet as
|
||||||
|
separate parameters, the cells where the format should apply are specified
|
||||||
|
directly. If a cell in the "FinishPosition" range is 1, then the text is
|
||||||
|
turned to Bold & Purple. This rule is moved to first in the priority list,
|
||||||
|
and where cells have a value of 1, no other rules will be processed.
|
||||||
|
.Example
|
||||||
|
>
|
||||||
|
$excel = Get-ChildItem | Select-Object -Property Name,Length,LastWriteTime,CreationTime | Export-Excel "$env:temp\test43.xlsx" -PassThru -AutoSize
|
||||||
|
$ws = $excel.Workbook.Worksheets["Sheet1"]
|
||||||
|
$ws.Cells["E1"].Value = "SavedAt"
|
||||||
|
$ws.Cells["F1"].Value = [datetime]::Now
|
||||||
|
$ws.Cells["F1"].Style.Numberformat.Format = (Expand-NumberFormat -NumberFormat 'Date-Time')
|
||||||
|
$lastRow = $ws.Dimension.End.Row
|
||||||
|
|
||||||
|
Add-ConditionalFormatting -WorkSheet $ws -address "A2:A$Lastrow" -RuleType LessThan -ConditionValue "A" -ForeGroundColor Gray
|
||||||
|
Add-ConditionalFormatting -WorkSheet $ws -address "B2:B$Lastrow" -RuleType GreaterThan -ConditionValue 1000000 -NumberFormat '#,###,,.00"M"'
|
||||||
|
Add-ConditionalFormatting -WorkSheet $ws -address "C2:C$Lastrow" -RuleType GreaterThan -ConditionValue "=INT($F$1-7)" -ForeGroundColor Green -StopIfTrue
|
||||||
|
Add-ConditionalFormatting -WorkSheet $ws -address "D2:D$Lastrow" -RuleType Equal -ConditionValue "=C2" -ForeGroundColor Blue -StopIfTrue
|
||||||
|
|
||||||
|
Close-ExcelPackage -Show $excel
|
||||||
|
|
||||||
|
The first few lines of code export a list of file and directory names, sizes
|
||||||
|
and dates to a spreadsheet. It puts the date of the export in cell F1.
|
||||||
|
The first Conditional format changes the color of files and folders that begin
|
||||||
|
with a ".", "_" or anything else which sorts before "A".
|
||||||
|
The second Conditional format changes the Number format of numbers bigger than
|
||||||
|
1 million, for example 1,234,567,890 will dispay as "1,234.57M"
|
||||||
|
The third highlights datestamps of files less than a week old when the export
|
||||||
|
was run; the = is necessary in the condition value otherwise the rule will
|
||||||
|
look for the the text INT($F$1-7), and the cell address for the date is fixed
|
||||||
|
using the standard Excel $ notation.
|
||||||
|
The final Conditional format looks for files which have not changed since they
|
||||||
|
were created. Here the condition value is "=C2". The = sign means C2 is treated
|
||||||
|
as a formula, not literal text. Unlike the file age, we want the cell used to
|
||||||
|
change for each cell where the conditional format applies. The first cell in
|
||||||
|
the conditional format range is D2, which is compared against C2, then D3 is
|
||||||
|
compared against C3 and so on. A common mistake is to include the title row in
|
||||||
|
the range and accidentally apply conditional formatting to it, or to begin the
|
||||||
|
range at row 2 but use row 1 as the starting point for comparisons.
|
||||||
|
.Example
|
||||||
|
Add-ConditionalFormatting $ws.Cells["B:B"] GreaterThan 10000000 -Fore Red -Stop -Pri 1
|
||||||
|
|
||||||
|
This version shows the shortest syntax - the Address, Ruletype, and
|
||||||
|
Conditionvalue can be identified from their position, and ForegroundColor,
|
||||||
|
StopIfTrue and Priority can all be shortend.
|
||||||
|
|
||||||
Again Export excel has been called with -passthru leaving a package object in $Excel
|
|
||||||
This time B1:B100 has been conditionally formatted with 3 icons, using the flags icon set.
|
|
||||||
Add-ConditionalFormatting does not provide access to every option in the formatting rule, so passthru has been used and the
|
|
||||||
rule is to apply the flags in reverse order, and boundaries for the number which will set the split are set to 100 and 1000
|
|
||||||
#>
|
#>
|
||||||
Param (
|
Param (
|
||||||
#The worksheet where the format is to be applied
|
#A block of cells to format - you can use a named range with -Address $ws.names[1] or $ws.cells["RangeName"]
|
||||||
[Parameter(Mandatory = $true, ParameterSetName = "NamedRule")]
|
[Parameter(Mandatory = $true, Position = 0)]
|
||||||
[Parameter(Mandatory = $true, ParameterSetName = "DataBar")]
|
[Alias("Range")]
|
||||||
[Parameter(Mandatory = $true, ParameterSetName = "ThreeIconSet")]
|
|
||||||
[Parameter(Mandatory = $true, ParameterSetName = "FourIconSet")]
|
|
||||||
[Parameter(Mandatory = $true, ParameterSetName = "FiveIconSet")]
|
|
||||||
[OfficeOpenXml.ExcelWorksheet]$WorkSheet ,
|
|
||||||
#The area of the worksheet where the format is to be applied
|
|
||||||
[Parameter(Mandatory = $true, ParameterSetName = "NamedRule")]
|
|
||||||
[Parameter(Mandatory = $true, ParameterSetName = "DataBar")]
|
|
||||||
[Parameter(Mandatory = $true, ParameterSetName = "ThreeIconSet")]
|
|
||||||
[Parameter(Mandatory = $true, ParameterSetName = "FourIconSet")]
|
|
||||||
[Parameter(Mandatory = $true, ParameterSetName = "FiveIconSet")]
|
|
||||||
[OfficeOpenXml.ExcelAddress]$Range ,
|
|
||||||
#One or more row(s), column(s) and/or block(s) of cells to format
|
|
||||||
[Parameter(Mandatory = $true, ParameterSetName = "NamedRuleAddress")]
|
|
||||||
[Parameter(Mandatory = $true, ParameterSetName = "DataBarAddress")]
|
|
||||||
[Parameter(Mandatory = $true, ParameterSetName = "ThreeIconSetAddress")]
|
|
||||||
[Parameter(Mandatory = $true, ParameterSetName = "FourIconSetAddress")]
|
|
||||||
[Parameter(Mandatory = $true, ParameterSetName = "FiveIconSetAddress")]
|
|
||||||
$Address ,
|
$Address ,
|
||||||
#One of the standard named rules - Top / Bottom / Less than / Greater than / Contains etc.
|
#The worksheet where the format is to be applied
|
||||||
[Parameter(Mandatory = $true, ParameterSetName = "NamedRule", Position = 3)]
|
[OfficeOpenXml.ExcelWorksheet]$WorkSheet ,
|
||||||
[Parameter(Mandatory = $true, ParameterSetName = "NamedRuleAddress", Position = 3)]
|
#A standard named-rule - Top / Bottom / Less than / Greater than / Contains etc.
|
||||||
|
[Parameter(Mandatory = $true, ParameterSetName = "NamedRule", Position = 1)]
|
||||||
[OfficeOpenXml.ConditionalFormatting.eExcelConditionalFormattingRuleType]$RuleType ,
|
[OfficeOpenXml.ConditionalFormatting.eExcelConditionalFormattingRuleType]$RuleType ,
|
||||||
#Text colour for matching objects
|
#Text color for matching objects
|
||||||
[Alias("ForeGroundColour")]
|
[Parameter(ParameterSetName = "NamedRule")]
|
||||||
[System.Drawing.Color]$ForeGroundColor,
|
[Alias("ForegroundColour","FontColor")]
|
||||||
#colour for databar type charts
|
$ForegroundColor,
|
||||||
|
#Color for databar type charts
|
||||||
[Parameter(Mandatory = $true, ParameterSetName = "DataBar")]
|
[Parameter(Mandatory = $true, ParameterSetName = "DataBar")]
|
||||||
[Parameter(Mandatory = $true, ParameterSetName = "DataBarAddress")]
|
|
||||||
[Alias("DataBarColour")]
|
[Alias("DataBarColour")]
|
||||||
[System.Drawing.Color]$DataBarColor,
|
$DataBarColor,
|
||||||
#One of the three-icon set types (e.g. Traffic Lights)
|
#One of the three-icon set types (e.g. Traffic Lights)
|
||||||
[Parameter(Mandatory = $true, ParameterSetName = "ThreeIconSet")]
|
[Parameter(Mandatory = $true, ParameterSetName = "ThreeIconSet")]
|
||||||
[Parameter(Mandatory = $true, ParameterSetName = "ThreeIconSetAddress")]
|
|
||||||
[OfficeOpenXml.ConditionalFormatting.eExcelconditionalFormatting3IconsSetType]$ThreeIconsSet,
|
[OfficeOpenXml.ConditionalFormatting.eExcelconditionalFormatting3IconsSetType]$ThreeIconsSet,
|
||||||
#A four-icon set name
|
#A four-icon set name
|
||||||
[Parameter(Mandatory = $true, ParameterSetName = "FourIconSet")]
|
[Parameter(Mandatory = $true, ParameterSetName = "FourIconSet")]
|
||||||
[Parameter(Mandatory = $true, ParameterSetName = "FourIconSetAddress")]
|
|
||||||
[OfficeOpenXml.ConditionalFormatting.eExcelconditionalFormatting4IconsSetType]$FourIconsSet,
|
[OfficeOpenXml.ConditionalFormatting.eExcelconditionalFormatting4IconsSetType]$FourIconsSet,
|
||||||
#A five-icon set name
|
#A five-icon set name
|
||||||
[Parameter(Mandatory = $true, ParameterSetName = "FiveIconSet")]
|
[Parameter(Mandatory = $true, ParameterSetName = "FiveIconSet")]
|
||||||
[Parameter(Mandatory = $true, ParameterSetName = "FiveIconSetAddress")]
|
|
||||||
[OfficeOpenXml.ConditionalFormatting.eExcelconditionalFormatting5IconsSetType]$FiveIconsSet,
|
[OfficeOpenXml.ConditionalFormatting.eExcelconditionalFormatting5IconsSetType]$FiveIconsSet,
|
||||||
#Use the icon set in reverse order
|
#Use the Icon-Set in reverse order, or reverse the orders of Two- & Three-Color Scales
|
||||||
|
[Parameter(ParameterSetName = "NamedRule")]
|
||||||
[Parameter(ParameterSetName = "ThreeIconSet")]
|
[Parameter(ParameterSetName = "ThreeIconSet")]
|
||||||
[Parameter(ParameterSetName = "ThreeIconSetAddress")]
|
|
||||||
[Parameter(ParameterSetName = "FourIconSet")]
|
[Parameter(ParameterSetName = "FourIconSet")]
|
||||||
[Parameter(ParameterSetName = "FourIconSetAddress")]
|
|
||||||
[Parameter(ParameterSetName = "FiveIconSet")]
|
[Parameter(ParameterSetName = "FiveIconSet")]
|
||||||
[Parameter(ParameterSetName = "FiveIconSetAddress")]
|
|
||||||
[switch]$Reverse,
|
[switch]$Reverse,
|
||||||
#A value for the condition (e.g. "2000" if the test is 'lessthan 2000')
|
#A value for the condition (for example 2000 if the test is 'lessthan 2000'; Formulas should begin with "=" )
|
||||||
[string]$ConditionValue,
|
[Parameter(ParameterSetName = "NamedRule",Position = 2)]
|
||||||
#A second value for the conditions like "between x and Y"
|
$ConditionValue,
|
||||||
[string]$ConditionValue2,
|
#A second value for the conditions like "Between X and Y"
|
||||||
#Background colour for matching items
|
[Parameter(ParameterSetName = "NamedRule",Position = 3)]
|
||||||
[System.Drawing.Color]$BackgroundColor,
|
$ConditionValue2,
|
||||||
|
#Background color for matching items
|
||||||
|
[Parameter(ParameterSetName = "NamedRule")]
|
||||||
|
$BackgroundColor,
|
||||||
#Background pattern for matching items
|
#Background pattern for matching items
|
||||||
|
[Parameter(ParameterSetName = "NamedRule")]
|
||||||
[OfficeOpenXml.Style.ExcelFillStyle]$BackgroundPattern = [OfficeOpenXml.Style.ExcelFillStyle]::None ,
|
[OfficeOpenXml.Style.ExcelFillStyle]$BackgroundPattern = [OfficeOpenXml.Style.ExcelFillStyle]::None ,
|
||||||
#Secondary colour when a background pattern requires it
|
#Secondary color when a background pattern requires it
|
||||||
[System.Drawing.Color]$PatternColor,
|
[Parameter(ParameterSetName = "NamedRule")]
|
||||||
|
$PatternColor,
|
||||||
#Sets the numeric format for matching items
|
#Sets the numeric format for matching items
|
||||||
|
[Parameter(ParameterSetName = "NamedRule")]
|
||||||
$NumberFormat,
|
$NumberFormat,
|
||||||
#Put matching items in bold face
|
#Put matching items in bold face
|
||||||
|
[Parameter(ParameterSetName = "NamedRule")]
|
||||||
[switch]$Bold,
|
[switch]$Bold,
|
||||||
#Put matching items in italic
|
#Put matching items in italic
|
||||||
|
[Parameter(ParameterSetName = "NamedRule")]
|
||||||
[switch]$Italic,
|
[switch]$Italic,
|
||||||
#Underline matching items
|
#Underline matching items
|
||||||
|
[Parameter(ParameterSetName = "NamedRule")]
|
||||||
[switch]$Underline,
|
[switch]$Underline,
|
||||||
#Strikethrough text of matching items
|
#Strikethrough text of matching items
|
||||||
|
[Parameter(ParameterSetName = "NamedRule")]
|
||||||
[switch]$StrikeThru,
|
[switch]$StrikeThru,
|
||||||
|
#Prevent the processing of subsequent rules
|
||||||
|
[Parameter(ParameterSetName = "NamedRule")]
|
||||||
|
[switch]$StopIfTrue,
|
||||||
|
#Set the sequence for rule processing
|
||||||
|
[int]$Priority,
|
||||||
#If specified pass the rule back to the caller to allow additional customization.
|
#If specified pass the rule back to the caller to allow additional customization.
|
||||||
[switch]$Passthru
|
[switch]$PassThru
|
||||||
)
|
)
|
||||||
|
|
||||||
#Allow conditional formatting to work like Set-Format (with single ADDRESS parameter), split it to get worksheet and range of cells.
|
#Allow conditional formatting to work like Set-ExcelRange (with single ADDRESS parameter), split it to get worksheet and range of cells.
|
||||||
If ($Address -and -not $WorkSheet -and -not $Range) {
|
If ($Address -is [OfficeOpenXml.Table.ExcelTable]) {
|
||||||
$WorkSheet = $Address.Worksheet[0]
|
$WorkSheet = $Address.Address.Worksheet
|
||||||
$Range = $Address.Address
|
$Address = $Address.Address.Address
|
||||||
|
}
|
||||||
|
elseif ($Address.Address -and $Address.Worksheet -and -not $WorkSheet) { #Address is a rangebase or similar
|
||||||
|
$WorkSheet = $Address.Worksheet[0]
|
||||||
|
$Address = $Address.Address
|
||||||
|
}
|
||||||
|
elseif ($Address -is [String] -and $WorkSheet -and $WorkSheet.Names[$Address] ) { #Address is the name of a named range.
|
||||||
|
$Address = $WorkSheet.Names[$Address].Address
|
||||||
|
}
|
||||||
|
if (($Address -is [OfficeOpenXml.ExcelRow] -and -not $WorkSheet) -or
|
||||||
|
($Address -is [OfficeOpenXml.ExcelColumn] -and -not $WorkSheet) ){ #EPPLUs Can't get the worksheet object from a row or column object, so bail if that was tried
|
||||||
|
Write-Warning -Message "Add-ConditionalFormatting does not support Row or Column objects as an address; use a worksheet and/or specify 'R:R' or 'C:C' instead. "; return
|
||||||
|
}
|
||||||
|
elseif ($Address -is [OfficeOpenXml.ExcelRow]) { #But if we have a column or row object and a worksheet (I don't know *why*) turn them into a string for the range
|
||||||
|
$Address = "$($Address.Row):$($Address.Row)"
|
||||||
|
}
|
||||||
|
elseif ($Address -is [OfficeOpenXml.ExcelColumn]) {
|
||||||
|
$Address = (New-Object 'OfficeOpenXml.ExcelAddress' @(1, $address.ColumnMin, 1, $address.ColumnMax).Address) -replace '1',''
|
||||||
|
if ($Address -notmatch ':') {$Address = "$Address`:$Address"}
|
||||||
|
}
|
||||||
|
if ( $Address -is [string] -and $Address -match "!") {$Address = $Address -replace '^.*!',''}
|
||||||
|
#By this point we should have a worksheet object whose ConditionalFormatting collection we will add to. If not, bail.
|
||||||
|
if (-not $worksheet -or $WorkSheet -isnot [OfficeOpenXml.ExcelWorksheet]) {write-warning "You need to provide a worksheet object." ; return}
|
||||||
|
#region create a rule of the right type
|
||||||
|
if ($RuleType -match 'IconSet$') {Write-warning -Message "You cannot configure a Icon-Set rule in this way; please use -$RuleType <SetName>." ; return}
|
||||||
|
if ($PSBoundParameters.ContainsKey("DataBarColor" ) ) {if ($DataBarColor -is [string]) {$DataBarColor = [System.Drawing.Color]::$DataBarColor }
|
||||||
|
$rule = $WorkSheet.ConditionalFormatting.AddDatabar( $Address , $DataBarColor )
|
||||||
|
}
|
||||||
|
elseif ($PSBoundParameters.ContainsKey("ThreeIconsSet" ) ) {$rule = $WorkSheet.ConditionalFormatting.AddThreeIconSet($Address , $ThreeIconsSet)}
|
||||||
|
elseif ($PSBoundParameters.ContainsKey("FourIconsSet" ) ) {$rule = $WorkSheet.ConditionalFormatting.AddFourIconSet( $Address , $FourIconsSet )}
|
||||||
|
elseif ($PSBoundParameters.ContainsKey("FiveIconsSet" ) ) {$rule = $WorkSheet.ConditionalFormatting.AddFiveIconSet( $Address , $FiveIconsSet )}
|
||||||
|
else {$rule = ($WorkSheet.ConditionalFormatting)."Add$RuleType"($Address ) }
|
||||||
|
if ($Reverse) {
|
||||||
|
if ($rule.type -match 'IconSet$' ) {$rule.reverse = $true}
|
||||||
|
elseif ($rule.type -match 'ColorScale$') {$temp =$rule.LowValue.Color ; $rule.LowValue.Color = $rule.HighValue.Color; $rule.HighValue.Color = $temp}
|
||||||
|
else {Write-Warning -Message "-Reverse was ignored because $ruletype does not support it."}
|
||||||
}
|
}
|
||||||
#region Create a rule of the right type
|
|
||||||
if ($PSBoundParameters.ContainsKey("ThreeIconsSet" ) ) {$rule = $WorkSheet.ConditionalFormatting.AddThreeIconSet($Range , $ThreeIconsSet)}
|
|
||||||
elseif ($PSBoundParameters.ContainsKey("FourIconsSet" ) ) {$rule = $WorkSheet.ConditionalFormatting.AddFourIconSet( $Range , $FourIconsSet) }
|
|
||||||
elseif ($PSBoundParameters.ContainsKey("FiveIconsSet" ) ) {$rule = $WorkSheet.ConditionalFormatting.AddFiveIconSet( $Range , $FiveIconsSet) }
|
|
||||||
elseif ($PSBoundParameters.ContainsKey("DataBarColor" ) ) {$rule = $WorkSheet.ConditionalFormatting.AddDatabar( $Range , $DataBarColor) }
|
|
||||||
else {$rule = ($WorkSheet.ConditionalFormatting)."Add$RuleType"($Range)}
|
|
||||||
if ($PSBoundParameters.ContainsKey("Reverse" ) ) {$rule.reverse = [boolean]$Reverse}
|
|
||||||
#endregion
|
#endregion
|
||||||
#region set the rule conditions
|
#region set the rule conditions
|
||||||
if ($PSBoundParameters.ContainsKey("ConditionValue") -and
|
#for lessThan/GreaterThan/Equal/Between conditions make sure that strings are wrapped in quotes. Formulas should be passed with = which will be stripped.
|
||||||
$RuleType -match "Top|Botom" ) {$rule.Rank = $ConditionValue }
|
if ($RuleType -match "Than|Equal|Between" ) {
|
||||||
if ($PSBoundParameters.ContainsKey("ConditionValue") -and
|
if ($PSBoundParameters.ContainsKey("ConditionValue" )) {
|
||||||
$RuleType -match "StdDev" ) {$rule.StdDev = $ConditionValue }
|
$number = $Null
|
||||||
if ($PSBoundParameters.ContainsKey("ConditionValue") -and
|
#if the condition type is not a value type, but parses as a number, make it the number
|
||||||
$RuleType -match "Than|Equal|Expression" ) {$rule.Formula = $ConditionValue }
|
if ($ConditionValue -isnot [System.ValueType] -and [Double]::TryParse($ConditionValue, [System.Globalization.NumberStyles]::Any, [System.Globalization.NumberFormatInfo]::CurrentInfo, [Ref]$number) ) {
|
||||||
if ($PSBoundParameters.ContainsKey("ConditionValue") -and
|
$ConditionValue = $number
|
||||||
$RuleType -match "Text|With" ) {$rule.Text = $ConditionValue }
|
} #else if it is not a value type, or a formula, or wrapped in quotes, wrap it in quotes.
|
||||||
if ($PSBoundParameters.ContainsKey("ConditionValue") -and
|
elseif (($ConditionValue -isnot [System.ValueType])-and ($ConditionValue -notmatch '^=') -and ($ConditionValue -notmatch '^".*"$') ) {
|
||||||
$PSBoundParameters.ContainsKey("ConditionValue") -and
|
$ConditionValue = '"' + $ConditionValue +'"'
|
||||||
$RuleType -match "Between" ) {
|
}
|
||||||
$rule.Formula = $ConditionValue;
|
}
|
||||||
$rule.Formula2 = $ConditionValue2
|
if ($PSBoundParameters.ContainsKey("ConditionValue2")) {
|
||||||
|
$number = $Null
|
||||||
|
if ($ConditionValue -isnot [System.ValueType] -and [Double]::TryParse($ConditionValue2, [System.Globalization.NumberStyles]::Any, [System.Globalization.NumberFormatInfo]::CurrentInfo, [Ref]$number) ) {
|
||||||
|
$ConditionValue2 = $number
|
||||||
|
}
|
||||||
|
elseif (($ConditionValue -isnot [System.ValueType]) -and ($ConditionValue2 -notmatch '^=') -and ($ConditionValue2 -notmatch '^".*"$') ) {
|
||||||
|
$ConditionValue2 = '"' + $ConditionValue2 + '"'
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
#But we don't usually want quotes round containstext | beginswith type rules. Can't be Certain they need to be removed, so warn the user their condition might be wrong
|
||||||
|
if ($RuleType -match "Text|With" -and $ConditionValue -match '^".*"$' ) {
|
||||||
|
Write-Warning -Message "The condition will look for the quotes at the start and end."
|
||||||
|
}
|
||||||
|
if ($PSBoundParameters.ContainsKey("ConditionValue" ) -and
|
||||||
|
$RuleType -match "Top|Botom" ) {$rule.Rank = $ConditionValue }
|
||||||
|
if ($PSBoundParameters.ContainsKey("ConditionValue" ) -and
|
||||||
|
$RuleType -match "StdDev" ) {$rule.StdDev = $ConditionValue }
|
||||||
|
if ($PSBoundParameters.ContainsKey("ConditionValue" ) -and
|
||||||
|
$RuleType -match "Than|Equal|Expression" ) {$rule.Formula = ($ConditionValue -replace '^=','') }
|
||||||
|
if ($PSBoundParameters.ContainsKey("ConditionValue" ) -and
|
||||||
|
$RuleType -match "Text|With" ) {$rule.Text = ($ConditionValue -replace '^=','') }
|
||||||
|
if ($PSBoundParameters.ContainsKey("ConditionValue" ) -and
|
||||||
|
$PSBoundParameters.ContainsKey("ConditionValue2") -and
|
||||||
|
$RuleType -match "Between" ) {
|
||||||
|
$rule.Formula = ($ConditionValue -replace '^=','');
|
||||||
|
$rule.Formula2 = ($ConditionValue2 -replace '^=','')
|
||||||
|
}
|
||||||
|
if ($PSBoundParameters.ContainsKey("StopIfTrue") ) {$rule.StopIfTrue = $StopIfTrue }
|
||||||
|
if ($PSBoundParameters.ContainsKey("Priority") ) {$rule.Priority = $Priority }
|
||||||
#endregion
|
#endregion
|
||||||
#region set the rule format
|
#region set the rule format
|
||||||
if ($PSBoundParameters.ContainsKey("NumberFormat" ) ) {$rule.Style.NumberFormat.Format = (Expand-NumberFormat $NumberFormat) }
|
if ($PSBoundParameters.ContainsKey("NumberFormat" ) ) {$rule.Style.NumberFormat.Format = (Expand-NumberFormat $NumberFormat) }
|
||||||
if ($Underline ) {$rule.Style.Font.Underline = [OfficeOpenXml.Style.ExcelUnderLineType]::Single }
|
if ($Underline ) {$rule.Style.Font.Underline = [OfficeOpenXml.Style.ExcelUnderLineType]::Single }
|
||||||
elseif ($PSBoundParameters.ContainsKey("Underline" ) ) {$rule.Style.Font.Underline = [OfficeOpenXml.Style.ExcelUnderLineType]::None }
|
elseif ($PSBoundParameters.ContainsKey("Underline" ) ) {$rule.Style.Font.Underline = [OfficeOpenXml.Style.ExcelUnderLineType]::None }
|
||||||
if ($PSBoundParameters.ContainsKey("Bold" ) ) {$rule.Style.Font.Bold = [boolean]$Bold }
|
if ($PSBoundParameters.ContainsKey("Bold" ) ) {$rule.Style.Font.Bold = [boolean]$Bold }
|
||||||
if ($PSBoundParameters.ContainsKey("Italic" ) ) {$rule.Style.Font.Italic = [boolean]$Italic }
|
if ($PSBoundParameters.ContainsKey("Italic" ) ) {$rule.Style.Font.Italic = [boolean]$Italic }
|
||||||
if ($PSBoundParameters.ContainsKey("StrikeThru") ) {$rule.Style.Font.Strike = [boolean]$StrikeThru }
|
if ($PSBoundParameters.ContainsKey("StrikeThru" ) ) {$rule.Style.Font.Strike = [boolean]$StrikeThru }
|
||||||
if ($PSBoundParameters.ContainsKey("ForeGroundColor" ) ) {$rule.Style.Font.Color.color = $ForeGroundColor }
|
if ($PSBoundParameters.ContainsKey("ForeGroundColor" ) ) {if ($ForeGroundColor -is [string]) {$ForeGroundColor = [System.Drawing.Color]::$ForeGroundColor }
|
||||||
if ($PSBoundParameters.ContainsKey("BackgroundColor" ) ) {$rule.Style.Fill.BackgroundColor.color = $BackgroundColor }
|
$rule.Style.Font.Color.color = $ForeGroundColor }
|
||||||
|
if ($PSBoundParameters.ContainsKey("BackgroundColor" ) ) {if ($BackgroundColor -is [string]) {$BackgroundColor = [System.Drawing.Color]::$BackgroundColor }
|
||||||
|
$rule.Style.Fill.BackgroundColor.color = $BackgroundColor }
|
||||||
if ($PSBoundParameters.ContainsKey("BackgroundPattern") ) {$rule.Style.Fill.PatternType = $BackgroundPattern }
|
if ($PSBoundParameters.ContainsKey("BackgroundPattern") ) {$rule.Style.Fill.PatternType = $BackgroundPattern }
|
||||||
if ($PSBoundParameters.ContainsKey("PatternColor" ) ) {$rule.Style.Fill.PatternColor.color = $PatternColor }
|
if ($PSBoundParameters.ContainsKey("PatternColor" ) ) {if ($PatternColor -is [string]) {$PatternColor = [System.Drawing.Color]::$PatternColor }
|
||||||
#endregion
|
$rule.Style.Fill.PatternColor.color = $PatternColor }
|
||||||
#Allow further tweaking by returning the rule, if passthru specified
|
#endregion
|
||||||
|
#Allow further tweaking by returning the rule, if passthru specified
|
||||||
if ($Passthru) {$rule}
|
if ($Passthru) {$rule}
|
||||||
}
|
}
|
||||||
99
AddDataValidation.ps1
Normal file
99
AddDataValidation.ps1
Normal file
@@ -0,0 +1,99 @@
|
|||||||
|
Function Add-ExcelDataValidationRule {
|
||||||
|
<#
|
||||||
|
.Synopsis
|
||||||
|
Adds data validation to a range of cells
|
||||||
|
.Example
|
||||||
|
>
|
||||||
|
>Add-ExcelDataValidationRule -WorkSheet $PlanSheet -Range 'E2:E1001' -ValidationType Integer -Operator between -Value 0 -Value2 100 `
|
||||||
|
-ShowErrorMessage -ErrorStyle stop -ErrorTitle 'Invalid Data' -ErrorBody 'Percentage must be a whole number between 0 and 100'
|
||||||
|
|
||||||
|
This defines a validation rule on cells E2-E1001; it is an integer rule and requires a number between 0 and 100
|
||||||
|
If a value is input with a fraction, negative number, or positive number > 100 a stop dialog box appears.
|
||||||
|
.Example
|
||||||
|
>
|
||||||
|
>Add-ExcelDataValidationRule -WorkSheet $PlanSheet -Range 'B2:B1001' -ValidationType List -Formula 'values!$a$2:$a$1000'
|
||||||
|
-ShowErrorMessage -ErrorStyle stop -ErrorTitle 'Invalid Data' -ErrorBody 'You must select an item from the list'
|
||||||
|
This defines a list rule on Cells B2:1001, and the posible values are in a sheet named "values" at cells A2 to A1000
|
||||||
|
Blank cells in this range are ignored. If $ signs are left out of the fomrmula B2 would be checked against A2-A1000
|
||||||
|
B3, against A3-A1001, B4 against A4-A1002 up to B1001 beng checked against A1001-A1999
|
||||||
|
.Example
|
||||||
|
>
|
||||||
|
>Add-ExcelDataValidationRule -WorkSheet $PlanSheet -Range 'I2:N1001' -ValidationType List -ValueSet @('yes','YES','Yes')
|
||||||
|
-ShowErrorMessage -ErrorStyle stop -ErrorTitle 'Invalid Data' -ErrorBody "Select Yes or leave blank for no"
|
||||||
|
Similar to the previous example but this time provides a value set; Excel comparisons are case sesnsitive, hence 3 versions of Yes.
|
||||||
|
#>
|
||||||
|
|
||||||
|
[CmdletBinding()]
|
||||||
|
Param(
|
||||||
|
#The range of cells to be validate, e.g. "B2:C100"
|
||||||
|
[Parameter(ValueFromPipeline = $true,Position=0)]
|
||||||
|
[Alias("Address")]
|
||||||
|
$Range ,
|
||||||
|
#The worksheet where the cells should be validated
|
||||||
|
[OfficeOpenXml.ExcelWorksheet]$WorkSheet ,
|
||||||
|
#An option corresponding to a choice from the 'Allow' pull down on the settings page in the Excel dialog. Any means "any allowed" i.e. no Validation
|
||||||
|
[ValidateSet('Any','Custom','DateTime','Decimal','Integer','List','TextLength','Time')]
|
||||||
|
$ValidationType,
|
||||||
|
#The operator to apply to Decimal, Integer, TextLength, DateTime and time fields, e.g. equal, between
|
||||||
|
[OfficeOpenXml.DataValidation.ExcelDataValidationOperator]$Operator = [OfficeOpenXml.DataValidation.ExcelDataValidationOperator]::equal ,
|
||||||
|
#For Decimal, Integer, TextLength, DateTime the [first] data value
|
||||||
|
$Value,
|
||||||
|
#When using the between operator, the second data value
|
||||||
|
$Value2,
|
||||||
|
#The [first] data value as a formula. Use absolute formulas $A$1 if (e.g.) you want all cells to check against the same list
|
||||||
|
$Formula,
|
||||||
|
#When using the between operator, the second data value as a formula
|
||||||
|
$Formula2,
|
||||||
|
#When using the list validation type, a set of values (rather than refering to Sheet!B$2:B$100 )
|
||||||
|
$ValueSet,
|
||||||
|
#Corresponds to the the 'Show Error alert ...' check box on error alert page in the Excel dialog
|
||||||
|
[switch]$ShowErrorMessage,
|
||||||
|
#Stop, Warning, or Infomation, corresponding to to the style setting in the Excel dialog
|
||||||
|
[OfficeOpenXml.DataValidation.ExcelDataValidationWarningStyle]$ErrorStyle,
|
||||||
|
#The title for the message box corresponding to to the title setting in the Excel dialog
|
||||||
|
[String]$ErrorTitle,
|
||||||
|
#The error message corresponding to to the Error message setting in the Excel dialog
|
||||||
|
[String]$ErrorBody,
|
||||||
|
#Corresponds to the the 'Show Input message ...' check box on input message page in the Excel dialog
|
||||||
|
[switch]$ShowPromptMessage,
|
||||||
|
#The prompt message corresponding to to the Input message setting in the Excel dialog
|
||||||
|
[String]$PromptBody,
|
||||||
|
#The title for the message box corresponding to to the title setting in the Excel dialog
|
||||||
|
[String]$PromptTitle,
|
||||||
|
#By default the 'Ignore blank' option will be selected, unless NoBlank is sepcified.
|
||||||
|
[String]$NoBlank
|
||||||
|
)
|
||||||
|
if ($Range -is [Array]) {
|
||||||
|
$null = $PSBoundParameters.Remove("Range")
|
||||||
|
$Range | Add-ExcelDataValidationRule @PSBoundParameters
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
#We should accept, a worksheet and a name of a range or a cell address; a table; the address of a table; a named range; a row, a column or .Cells[ ]
|
||||||
|
if (-not $WorkSheet -and $Range.worksheet) {$WorkSheet = $Range.worksheet}
|
||||||
|
if ($Range.Address) {$Range = $Range.Address}
|
||||||
|
|
||||||
|
if ($Range -isnot [string] -or -not $WorkSheet) {Write-Warning -Message "You need to provide a worksheet and range of cells." ;return}
|
||||||
|
#else we assume Range is a range.
|
||||||
|
|
||||||
|
$validation = $WorkSheet.DataValidations."Add$ValidationType`Validation"($Range)
|
||||||
|
if ($validation.AllowsOperator) {$validation.Operator = $Operator}
|
||||||
|
if ($PSBoundParameters.ContainsKey('value')) {
|
||||||
|
$validation.Formula.Value = $Value
|
||||||
|
}
|
||||||
|
elseif ($Formula) {$validation.Formula.ExcelFormula = $Formula}
|
||||||
|
elseif ($ValueSet) {Foreach ($v in $ValueSet) {$validation.Formula.Values.Add($V)}}
|
||||||
|
if ($PSBoundParameters.ContainsKey('Value2')) {
|
||||||
|
$validation.Formula2.Value = $Value2
|
||||||
|
}
|
||||||
|
elseif ($Formula2) {$validation.Formula2.ExcelFormula = $Formula}
|
||||||
|
$validation.ShowErrorMessage = [bool]$ShowErrorMessage
|
||||||
|
$validation.ShowInputMessage = [bool]$ShowPromptMessage
|
||||||
|
$validation.AllowBlank = -not $NoBlank
|
||||||
|
|
||||||
|
if ($PromptTitle) {$validation.PromptTitle = $PromptTitle}
|
||||||
|
if ($ErrorTitle) {$validation.ErrorTitle = $ErrorTitle}
|
||||||
|
if ($PromptBody) {$validation.Prompt = $PromptBody}
|
||||||
|
if ($ErrorBody) {$validation.Error = $ErrorBody}
|
||||||
|
if ($ErrorStyle) {$validation.ErrorStyle = $ErrorStyle}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -15,6 +15,7 @@ if (Get-Command -Name register-argumentCompleter -ErrorAction SilentlyContinue)
|
|||||||
Register-ArgumentCompleter -CommandName Compare-Worksheet -ParameterName BackgroundColor -ScriptBlock $Function:ColorCompletion
|
Register-ArgumentCompleter -CommandName Compare-Worksheet -ParameterName BackgroundColor -ScriptBlock $Function:ColorCompletion
|
||||||
Register-ArgumentCompleter -CommandName Compare-Worksheet -ParameterName FontColor -ScriptBlock $Function:ColorCompletion
|
Register-ArgumentCompleter -CommandName Compare-Worksheet -ParameterName FontColor -ScriptBlock $Function:ColorCompletion
|
||||||
Register-ArgumentCompleter -CommandName Compare-Worksheet -ParameterName TabColor -ScriptBlock $Function:ColorCompletion
|
Register-ArgumentCompleter -CommandName Compare-Worksheet -ParameterName TabColor -ScriptBlock $Function:ColorCompletion
|
||||||
|
Register-ArgumentCompleter -CommandName Join-Worksheet -ParameterName TitleBackgroundColor -ScriptBlock $Function:ColorCompletion
|
||||||
Register-ArgumentCompleter -CommandName Merge-Worksheet -ParameterName AddBackgroundColor -ScriptBlock $Function:ColorCompletion
|
Register-ArgumentCompleter -CommandName Merge-Worksheet -ParameterName AddBackgroundColor -ScriptBlock $Function:ColorCompletion
|
||||||
Register-ArgumentCompleter -CommandName Merge-Worksheet -ParameterName ChangeBackgroundColor -ScriptBlock $Function:ColorCompletion
|
Register-ArgumentCompleter -CommandName Merge-Worksheet -ParameterName ChangeBackgroundColor -ScriptBlock $Function:ColorCompletion
|
||||||
Register-ArgumentCompleter -CommandName Merge-Worksheet ` -ParameterName DeleteBackgroundColor -ScriptBlock $Function:ColorCompletion
|
Register-ArgumentCompleter -CommandName Merge-Worksheet ` -ParameterName DeleteBackgroundColor -ScriptBlock $Function:ColorCompletion
|
||||||
@@ -25,14 +26,19 @@ if (Get-Command -Name register-argumentCompleter -ErrorAction SilentlyContinue)
|
|||||||
Register-ArgumentCompleter -CommandName Merge-MulipleSheets -ParameterName KeyFontColor -ScriptBlock $Function:ColorCompletion
|
Register-ArgumentCompleter -CommandName Merge-MulipleSheets -ParameterName KeyFontColor -ScriptBlock $Function:ColorCompletion
|
||||||
Register-ArgumentCompleter -CommandName New-ConditionalText -ParameterName PatternColor -ScriptBlock $Function:ColorCompletion
|
Register-ArgumentCompleter -CommandName New-ConditionalText -ParameterName PatternColor -ScriptBlock $Function:ColorCompletion
|
||||||
Register-ArgumentCompleter -CommandName New-ConditionalText -ParameterName BackgroundColor -ScriptBlock $Function:ColorCompletion
|
Register-ArgumentCompleter -CommandName New-ConditionalText -ParameterName BackgroundColor -ScriptBlock $Function:ColorCompletion
|
||||||
Register-ArgumentCompleter -CommandName Set-Format -ParameterName BackgroundColor -ScriptBlock $Function:ColorCompletion
|
Register-ArgumentCompleter -CommandName New-ConditionalText -ParameterName ConditionalTextColor -ScriptBlock $Function:ColorCompletion
|
||||||
Register-ArgumentCompleter -CommandName Set-Format -ParameterName FontColor -ScriptBlock $Function:ColorCompletion
|
Register-ArgumentCompleter -CommandName New-ExcelStyle -ParameterName BackgroundColor -ScriptBlock $Function:ColorCompletion
|
||||||
Register-ArgumentCompleter -CommandName Set-Format -ParameterName BorderColor -ScriptBlock $Function:ColorCompletion
|
Register-ArgumentCompleter -CommandName New-ExcelStyle -ParameterName FontColor -ScriptBlock $Function:ColorCompletion
|
||||||
Register-ArgumentCompleter -CommandName Set-Format -ParameterName PatternColor -ScriptBlock $Function:ColorCompletion
|
Register-ArgumentCompleter -CommandName New-ExcelStyle -ParameterName BorderColor -ScriptBlock $Function:ColorCompletion
|
||||||
Register-ArgumentCompleter -CommandName Set-Column -ParameterName BackgroundColor -ScriptBlock $Function:ColorCompletion
|
Register-ArgumentCompleter -CommandName New-ExcelStyle -ParameterName PatternColor -ScriptBlock $Function:ColorCompletion
|
||||||
Register-ArgumentCompleter -CommandName Set-Column -ParameterName FontColor -ScriptBlock $Function:ColorCompletion
|
Register-ArgumentCompleter -CommandName Set-ExcelRange -ParameterName BackgroundColor -ScriptBlock $Function:ColorCompletion
|
||||||
Register-ArgumentCompleter -CommandName Set-Column -ParameterName PatternColor -ScriptBlock $Function:ColorCompletion
|
Register-ArgumentCompleter -CommandName Set-ExcelRange -ParameterName FontColor -ScriptBlock $Function:ColorCompletion
|
||||||
Register-ArgumentCompleter -CommandName Set-Row -ParameterName BackgroundColor -ScriptBlock $Function:ColorCompletion
|
Register-ArgumentCompleter -CommandName Set-ExcelRange -ParameterName BorderColor -ScriptBlock $Function:ColorCompletion
|
||||||
Register-ArgumentCompleter -CommandName Set-Row -ParameterName FontColor -ScriptBlock $Function:ColorCompletion
|
Register-ArgumentCompleter -CommandName Set-ExcelRange -ParameterName PatternColor -ScriptBlock $Function:ColorCompletion
|
||||||
Register-ArgumentCompleter -CommandName Set-Row -ParameterName PatternColor -ScriptBlock $Function:ColorCompletion
|
Register-ArgumentCompleter -CommandName Set-ExcelColumn -ParameterName BackgroundColor -ScriptBlock $Function:ColorCompletion
|
||||||
|
Register-ArgumentCompleter -CommandName Set-ExcelColumn -ParameterName FontColor -ScriptBlock $Function:ColorCompletion
|
||||||
|
Register-ArgumentCompleter -CommandName Set-ExcelColumn -ParameterName PatternColor -ScriptBlock $Function:ColorCompletion
|
||||||
|
Register-ArgumentCompleter -CommandName Set-ExcelRow -ParameterName BackgroundColor -ScriptBlock $Function:ColorCompletion
|
||||||
|
Register-ArgumentCompleter -CommandName Set-ExcelRow -ParameterName FontColor -ScriptBlock $Function:ColorCompletion
|
||||||
|
Register-ArgumentCompleter -CommandName Set-ExcelRow -ParameterName PatternColor -ScriptBlock $Function:ColorCompletion
|
||||||
}
|
}
|
||||||
@@ -35,15 +35,15 @@
|
|||||||
Write-Progress -Activity "Exporting $range of $workSheetname in $Path" -Status "Opening Workbook and copying data"
|
Write-Progress -Activity "Exporting $range of $workSheetname in $Path" -Status "Opening Workbook and copying data"
|
||||||
$xlWbk = $xlApp.Workbooks.Open($Path)
|
$xlWbk = $xlApp.Workbooks.Open($Path)
|
||||||
$xlWbk.Worksheets($workSheetname).Select()
|
$xlWbk.Worksheets($workSheetname).Select()
|
||||||
$xlWbk.ActiveSheet.Range($range).Select() | Out-Null
|
$null = $xlWbk.ActiveSheet.Range($range).Select()
|
||||||
$xlApp.Selection.Copy() | Out-Null
|
$null = $xlApp.Selection.Copy()
|
||||||
Write-Progress -Activity "Exporting $range of $workSheetname in $Path" -Status "Saving copied data"
|
Write-Progress -Activity "Exporting $range of $workSheetname in $Path" -Status "Saving copied data"
|
||||||
# Get-Clipboard came in with PS5. Older versions can use [System.Windows.Clipboard] but it is ugly.
|
# Get-Clipboard came in with PS5. Older versions can use [System.Windows.Clipboard] but it is ugly.
|
||||||
$image = Get-Clipboard -Format Image
|
$image = Get-Clipboard -Format Image
|
||||||
$image.Save($destination, $Format)
|
$image.Save($destination, $Format)
|
||||||
Write-Progress -Activity "Exporting $range of $workSheetname in $Path" -Status "Closing Excel"
|
Write-Progress -Activity "Exporting $range of $workSheetname in $Path" -Status "Closing Excel"
|
||||||
$xlWbk.ActiveSheet.Range("a1").Select() | Out-Null
|
$null = $xlWbk.ActiveSheet.Range("a1").Select()
|
||||||
$xlApp.Selection.Copy() | Out-Null
|
$null = $xlApp.Selection.Copy()
|
||||||
$xlApp.Quit()
|
$xlApp.Quit()
|
||||||
Write-Progress -Activity "Exporting $range of $workSheetname in $Path" -Completed
|
Write-Progress -Activity "Exporting $range of $workSheetname in $Path" -Completed
|
||||||
if ($show) {Start-Process -FilePath $destination}
|
if ($show) {Start-Process -FilePath $destination}
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ function ConvertFrom-ExcelData {
|
|||||||
.SYNOPSIS
|
.SYNOPSIS
|
||||||
Reads data from a sheet, and for each row, calls a custom scriptblock with a list of property names and the row of data.
|
Reads data from a sheet, and for each row, calls a custom scriptblock with a list of property names and the row of data.
|
||||||
|
|
||||||
|
|
||||||
.EXAMPLE
|
.EXAMPLE
|
||||||
ConvertFrom-ExcelData .\testSQLGen.xlsx {
|
ConvertFrom-ExcelData .\testSQLGen.xlsx {
|
||||||
param($propertyNames, $record)
|
param($propertyNames, $record)
|
||||||
|
|||||||
@@ -1,18 +1,21 @@
|
|||||||
Function ConvertTo-ExcelXlsx {
|
Function ConvertTo-ExcelXlsx {
|
||||||
[CmdletBinding()]
|
<#
|
||||||
|
.SYNOPSIS
|
||||||
|
Converts an Excel xls to a xlsx using -ComObject
|
||||||
|
#>
|
||||||
|
[CmdletBinding()]
|
||||||
Param
|
Param
|
||||||
(
|
(
|
||||||
[parameter(Mandatory=$true, ValueFromPipeline)]
|
[parameter(Mandatory = $true, ValueFromPipeline)]
|
||||||
[string]$Path,
|
[string]$Path,
|
||||||
[parameter(Mandatory=$false)]
|
[parameter(Mandatory = $false)]
|
||||||
[switch]$Force
|
[switch]$Force
|
||||||
)
|
)
|
||||||
Process
|
Process {
|
||||||
{
|
if (-Not ($Path | Test-Path) ) {
|
||||||
if(-Not ($Path | Test-Path) ){
|
throw "File not found"
|
||||||
throw "File not found"
|
|
||||||
}
|
}
|
||||||
if(-Not ($Path | Test-Path -PathType Leaf) ){
|
if (-Not ($Path | Test-Path -PathType Leaf) ) {
|
||||||
throw "Folder paths are not allowed"
|
throw "Folder paths are not allowed"
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -20,31 +23,34 @@ Function ConvertTo-ExcelXlsx {
|
|||||||
$xlsFile = Get-Item -Path $Path
|
$xlsFile = Get-Item -Path $Path
|
||||||
$xlsxPath = "{0}x" -f $xlsFile.FullName
|
$xlsxPath = "{0}x" -f $xlsFile.FullName
|
||||||
|
|
||||||
if($xlsFile.Extension -ne ".xls"){
|
if ($xlsFile.Extension -ne ".xls") {
|
||||||
throw "Expected .xls extension"
|
throw "Expected .xls extension"
|
||||||
}
|
}
|
||||||
|
|
||||||
if(Test-Path -Path $xlsxPath){
|
if (Test-Path -Path $xlsxPath) {
|
||||||
if($Force){
|
if ($Force) {
|
||||||
try {
|
try {
|
||||||
Remove-Item $xlsxPath -Force
|
Remove-Item $xlsxPath -Force
|
||||||
} catch {
|
}
|
||||||
|
catch {
|
||||||
throw "{0} already exists and cannot be removed. The file may be locked by another application." -f $xlsxPath
|
throw "{0} already exists and cannot be removed. The file may be locked by another application." -f $xlsxPath
|
||||||
}
|
}
|
||||||
Write-Verbose $("Removed {0}" -f $xlsxPath)
|
Write-Verbose $("Removed {0}" -f $xlsxPath)
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
throw "{0} already exists!" -f $xlsxPath
|
throw "{0} already exists!" -f $xlsxPath
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
try{
|
try {
|
||||||
$Excel = New-Object -ComObject "Excel.Application"
|
$Excel = New-Object -ComObject "Excel.Application"
|
||||||
} catch {
|
}
|
||||||
|
catch {
|
||||||
throw "Could not create Excel.Application ComObject. Please verify that Excel is installed."
|
throw "Could not create Excel.Application ComObject. Please verify that Excel is installed."
|
||||||
}
|
}
|
||||||
|
|
||||||
$Excel.Visible = $false
|
$Excel.Visible = $false
|
||||||
$Excel.Workbooks.Open($xlsFile.FullName) | Out-Null
|
$null = $Excel.Workbooks.Open($xlsFile.FullName)
|
||||||
$Excel.ActiveWorkbook.SaveAs($xlsxPath, $xlFixedFormat)
|
$Excel.ActiveWorkbook.SaveAs($xlsxPath, $xlFixedFormat)
|
||||||
$Excel.ActiveWorkbook.Close()
|
$Excel.ActiveWorkbook.Close()
|
||||||
$Excel.Quit()
|
$Excel.Quit()
|
||||||
|
|||||||
@@ -1,110 +1,130 @@
|
|||||||
function Copy-ExcelWorkSheet {
|
function Copy-ExcelWorkSheet {
|
||||||
[CmdletBinding()]
|
|
||||||
<#
|
<#
|
||||||
.SYNOPSIS
|
.SYNOPSIS
|
||||||
Copies a worksheet between workbooks or within the same workbook.
|
Copies a worksheet between workbooks or within the same workbook.
|
||||||
.DESCRIPTION
|
.DESCRIPTION
|
||||||
Copy-ExcelWorkSheet takes Source and Destination workbook parameters; each can be the path to an XLSx file, an ExcelPackage object or an ExcelWorkbook object.
|
Copy-ExcelWorkSheet takes a Source object which is either a worksheet,
|
||||||
The Source worksheet is specified by name or number (starting from 1), and the destination worksheet can be explicitly named,
|
or a package, Workbook or path, in which case the source worksheet can be specified
|
||||||
or will follow the name of the source if no name is specified.
|
by name or number (starting from 1).
|
||||||
|
The destination worksheet can be explicitly named, or will follow the name of the source if no name is specified.
|
||||||
|
The Destination workbook can be given as the path to an XLSx file, an ExcelPackage object or an ExcelWorkbook object.
|
||||||
|
|
||||||
.EXAMPLE
|
.EXAMPLE
|
||||||
C:\> Copy-ExcelWorkSheet -SourceWorkbook Test1.xlsx -DestinationWorkbook Test2.xlsx
|
C:\> Copy-ExcelWorkSheet -SourceWorkbook Test1.xlsx -DestinationWorkbook Test2.xlsx
|
||||||
This is the simplest version of the command: no source worksheet is specified so Copy-ExcelWorksheet uses the first sheet in the workbook
|
This is the simplest version of the command: no source worksheet is specified so Copy-ExcelWorksheet uses the first sheet in the workbook
|
||||||
No Destination sheet is specified so the new worksheet will be the same as the one which is being copied.
|
No Destination sheet is specified so the new worksheet will be the same as the one which is being copied.
|
||||||
.EXAMPLE
|
.EXAMPLE
|
||||||
C:\> Copy-ExcelWorkSheet -SourceWorkbook Server1.xlsx -sourceWorksheet "Settings" -DestinationWorkbook Settings.xlsx -DestinationWorkSheet "Server1"
|
C:\> Copy-ExcelWorkSheet -SourceWorkbook Server1.xlsx -sourceWorksheet "Settings" -DestinationWorkbook Settings.xlsx -DestinationWorksheet "Server1"
|
||||||
Here the Settings page from Server1's workbook is copied to the 'Server1" page of a "Settings" workbook.
|
Here the Settings page from Server1's workbook is copied to the 'Server1" page of a "Settings" workbook.
|
||||||
.EXAMPLE
|
.EXAMPLE
|
||||||
C:\> $excel = Open-ExcelPackage .\test.xlsx
|
C:\> $excel = Open-ExcelPackage .\test.xlsx
|
||||||
C:\> Copy-ExcelWorkSheet -SourceWorkbook $excel -SourceWorkSheet "first" -DestinationWorkbook $excel -Show -DestinationWorkSheet Duplicate
|
C:\> Copy-ExcelWorkSheet -SourceWorkbook $excel -SourceWorkSheet "first" -DestinationWorkbook $excel -Show -DestinationWorksheet Duplicate
|
||||||
This opens the workbook test.xlsx and copies the worksheet named "first" to a new worksheet named "Duplicate",
|
This opens the workbook test.xlsx and copies the worksheet named "first" to a new worksheet named "Duplicate",
|
||||||
because -Show is specified the file is saved and opened in Excel
|
because -Show is specified the file is saved and opened in Excel
|
||||||
.EXAMPLE
|
.EXAMPLE
|
||||||
C:\> $excel = Open-ExcelPackage .\test.xlsx
|
C:\> $excel = Open-ExcelPackage .\test.xlsx
|
||||||
C:\> Copy-ExcelWorkSheet -SourceWorkbook $excel -SourceWorkSheet 1 -DestinationWorkbook $excel -DestinationWorkSheet Duplicate
|
C:\> Copy-ExcelWorkSheet -SourceWorkbook $excel -SourceWorkSheet 1 -DestinationWorkbook $excel -DestinationWorksheet Duplicate
|
||||||
C:\> Close-ExcelPackage $excel
|
C:\> Close-ExcelPackage $excel
|
||||||
This is almost the same as the previous example, except source sheet is specified by position rather than name and
|
This is almost the same as the previous example, except source sheet is specified by position rather than name and
|
||||||
because -Show is not specified, so other steps can be carried using the package object, at the end the file is saved by Close-ExcelPackage
|
because -Show is not specified, so other steps can be carried using the package object, at the end the file is saved by Close-ExcelPackage
|
||||||
|
|
||||||
#>
|
#>
|
||||||
|
[CmdletBinding()]
|
||||||
param(
|
param(
|
||||||
#An ExcelWorkbook or ExcelPackage object or the path to an XLSx file where the data is found.
|
#An ExcelWorkbook or ExcelPackage object or the path to an XLSx file where the data is found.
|
||||||
[Parameter(Mandatory=$true)]
|
[Parameter(Mandatory = $true,ValueFromPipeline=$true)]
|
||||||
$SourceWorkbook,
|
[Alias('SourceWorkbook')]
|
||||||
|
$SourceObject,
|
||||||
#Name or number (starting from 1) of the worksheet in the source workbook (defaults to 1).
|
#Name or number (starting from 1) of the worksheet in the source workbook (defaults to 1).
|
||||||
$SourceWorkSheet = 1 ,
|
$SourceWorkSheet = 1 ,
|
||||||
#An ExcelWorkbook or ExcelPackage object or the path to an XLSx file where the data should be copied.
|
#An ExcelWorkbook or ExcelPackage object or the path to an XLSx file where the data should be copied.
|
||||||
[Parameter(Mandatory=$true)]
|
[Parameter(Mandatory = $true)]
|
||||||
$DestinationWorkbook,
|
$DestinationWorkbook,
|
||||||
#Name of the worksheet in the destination workbook; by default the same as the source worksheet's name. If the sheet exists it will be deleted and re-copied.
|
#Name of the worksheet in the destination workbook; by default the same as the source worksheet's name. If the sheet exists it will be deleted and re-copied.
|
||||||
$DestinationWorkSheet,
|
$DestinationWorksheet,
|
||||||
#if the destination is an excel package or a path, launch excel and open the file on completion.
|
#if the destination is an excel package or a path, launch excel and open the file on completion.
|
||||||
[Switch]$Show
|
[Switch]$Show
|
||||||
)
|
)
|
||||||
#Special case - give the same path for source and destination worksheet
|
begin {
|
||||||
if ($SourceWorkbook -is [System.String] -and $SourceWorkbook -eq $DestinationWorkbook) {
|
#For the case where we are piped multiple sheets, we want to open the destination in the begin and close it in the end.
|
||||||
if (-not $DestinationWorkSheet) {Write-Warning -Message "You must specify a destination worksheet name if copying within the same workbook."; return}
|
if ($DestinationWorkbook -is [OfficeOpenXml.ExcelPackage] ) {
|
||||||
else {
|
if ($Show) {$package2 = $DestinationWorkbook}
|
||||||
Write-Verbose -Message "Copying "
|
$DestinationWorkbook = $DestinationWorkbook.Workbook
|
||||||
$excel = Open-ExcelPackage -Path $SourceWorkbook
|
}
|
||||||
if (-not $excel.Workbook.Worksheets[$Sourceworksheet]) {
|
elseif ($DestinationWorkbook -is [string] -and ($DestinationWorkbook -ne $SourceObject)) {
|
||||||
Write-Warning -Message "Could not find Worksheet $sourceWorksheet in $sourceWorkbook"
|
$package2 = Open-ExcelPackage -Create -Path $DestinationWorkbook
|
||||||
Close-ExcelPackage -ExcelPackage $excel -NoSave
|
$DestinationWorkbook = $package2.Workbook
|
||||||
return
|
}
|
||||||
}
|
}
|
||||||
elseif ($excel.Workbook.Worksheets[$Sourceworksheet].name -eq $DestinationWorkSheet) {
|
process {
|
||||||
Write-Warning -Message "The destination worksheet name is the same as the source. "
|
#Special case - given the same path for source and destination worksheet
|
||||||
Close-ExcelPackage -ExcelPackage $excel -NoSave
|
if ($SourceObject -is [System.String] -and $SourceObject -eq $DestinationWorkbook) {
|
||||||
return
|
if (-not $DestinationWorksheet) {Write-Warning -Message "You must specify a destination worksheet name if copying within the same workbook."; return}
|
||||||
}
|
|
||||||
else {
|
else {
|
||||||
$null = Add-WorkSheet -ExcelPackage $Excel -WorkSheetname $DestinationWorkSheet -CopySource ($excel.Workbook.Worksheets[$SourceWorkSheet])
|
Write-Verbose -Message "Copying "
|
||||||
Close-ExcelPackage -ExcelPackage $excel -Show:$Show
|
$excel = Open-ExcelPackage -Path $SourceObject
|
||||||
return
|
if (-not $excel.Workbook.Worksheets[$Sourceworksheet]) {
|
||||||
|
Write-Warning -Message "Could not find Worksheet $sourceWorksheet in $SourceObject"
|
||||||
|
Close-ExcelPackage -ExcelPackage $excel -NoSave
|
||||||
|
return
|
||||||
|
}
|
||||||
|
elseif ($excel.Workbook.Worksheets[$Sourceworksheet].name -eq $DestinationWorksheet) {
|
||||||
|
Write-Warning -Message "The destination worksheet name is the same as the source. "
|
||||||
|
Close-ExcelPackage -ExcelPackage $excel -NoSave
|
||||||
|
return
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$null = Add-WorkSheet -ExcelPackage $excel -WorkSheetname $DestinationWorksheet -CopySource ($excel.Workbook.Worksheets[$SourceWorkSheet])
|
||||||
|
Close-ExcelPackage -ExcelPackage $excel -Show:$Show
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if ($SourceObject -is [OfficeOpenXml.ExcelWorksheet]) {$sourceWs = $SourceObject}
|
||||||
|
elseif ($SourceObject -is [OfficeOpenXml.ExcelWorkbook]) {$sourceWs = $SourceObject.Worksheets[$SourceWorkSheet]}
|
||||||
|
elseif ($SourceObject -is [OfficeOpenXml.ExcelPackage] ) {$sourceWs = $SourceObject.Workbook.Worksheets[$SourceWorkSheet]}
|
||||||
|
else {
|
||||||
|
$SourceObject = (Resolve-Path $SourceObject).ProviderPath
|
||||||
|
try {
|
||||||
|
Write-Verbose "Opening worksheet '$Worksheetname' in Excel workbook '$SourceObject'."
|
||||||
|
$stream = New-Object -TypeName System.IO.FileStream -ArgumentList $SourceObject, 'Open', 'Read' , 'ReadWrite'
|
||||||
|
$package1 = New-Object -TypeName OfficeOpenXml.ExcelPackage -ArgumentList $stream
|
||||||
|
$sourceWs = $Package1.Workbook.Worksheets[$SourceWorkSheet]
|
||||||
|
}
|
||||||
|
catch {Write-Warning -Message "Could not open $SourceObject - the error was '$($_.exception.message)' " ; return}
|
||||||
|
}
|
||||||
|
if (-not $sourceWs) {Write-Warning -Message "Could not find worksheet '$Sourceworksheet' in the source workbook." ; return}
|
||||||
|
else {
|
||||||
|
try {
|
||||||
|
if ($DestinationWorkbook -isnot [OfficeOpenXml.ExcelWorkbook]) {
|
||||||
|
Write-Warning "Not a valid workbook" ; return
|
||||||
|
}
|
||||||
|
#check if we have a destination sheet name and set one if not. Because we might loop round check $psBoundParameters, not the variable.
|
||||||
|
if (-not $PSBoundParameters['DestinationWorksheet']) {
|
||||||
|
#if we are piped files, use the file name without the extension as the destination sheet name, Otherwise use the source sheet name
|
||||||
|
if ($_ -is [System.IO.FileInfo]) {$DestinationWorksheet = $_.name -replace '\.xlsx$', '' }
|
||||||
|
else { $DestinationWorksheet = $sourceWs.Name}
|
||||||
|
}
|
||||||
|
if ($DestinationWorkbook.Worksheets[$DestinationWorksheet]) {
|
||||||
|
Write-Verbose "Destination workbook already has a sheet named '$DestinationWorksheet', deleting it."
|
||||||
|
$DestinationWorkbook.Worksheets.Delete($DestinationWorksheet)
|
||||||
|
}
|
||||||
|
Write-Verbose "Copying '$($sourcews.name)' from $($SourceObject) to '$($DestinationWorksheet)' in $($PSBoundParameters['DestinationWorkbook'])"
|
||||||
|
$null = Add-WorkSheet -ExcelWorkbook $DestinationWorkbook -WorkSheetname $DestinationWorksheet -CopySource $sourceWs
|
||||||
|
#Leave the destination open but close the source - if we're copying more than one sheet we'll re-open it and live with the inefficiency
|
||||||
|
if ($stream) {$stream.Close() }
|
||||||
|
if ($package1) {Close-ExcelPackage -ExcelPackage $package1 -NoSave }
|
||||||
|
}
|
||||||
|
catch {Write-Warning -Message "Could not write to sheet '$DestinationWorksheet' in the destination workbook. Error was '$($_.exception.message)'" ; return}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
end {
|
||||||
if ($SourceWorkbook -is [OfficeOpenXml.ExcelWorkbook]) {$sourcews=$SourceWorkbook.Worksheets[$SourceWorkSheet]}
|
#OK Now we can close the destination package
|
||||||
elseif ($SourceWorkbook -is [OfficeOpenXml.ExcelPackage] ) {$sourcews=$SourceWorkbook.Workbook.Worksheets[$SourceWorkSheet]}
|
if ($package2) {Close-ExcelPackage -ExcelPackage $package2 -Show:$Show }
|
||||||
else {
|
if ($Show -and -not $package2) {
|
||||||
$SourceWorkbook = (Resolve-Path $SourceWorkbook).ProviderPath
|
Write-Warning -Message "-Show only works if the Destination workbook is given as a file path or an ExcelPackage object."
|
||||||
try {
|
|
||||||
Write-Verbose "Opening worksheet '$Worksheetname' in Excel workbook '$SourceWorkbook'."
|
|
||||||
$Stream = New-Object -TypeName System.IO.FileStream -ArgumentList $SourceWorkbook, 'Open', 'Read' ,'ReadWrite'
|
|
||||||
$Package1 = New-Object -TypeName OfficeOpenXml.ExcelPackage -ArgumentList $Stream
|
|
||||||
$sourceWs = $Package1.Workbook.Worksheets[$SourceWorkSheet]
|
|
||||||
}
|
|
||||||
catch {Write-Warning -Message "Could not open $SourceWorkbook" ; return}
|
|
||||||
}
|
|
||||||
if (-not $sourceWs) {Write-Warning -Message "Could not find worksheet '$Sourceworksheet' in the source workbook." ; return}
|
|
||||||
else {
|
|
||||||
try {
|
|
||||||
if ($DestinationWorkbook -is [OfficeOpenXml.ExcelWorkbook]) {
|
|
||||||
$wb = $DestinationWorkbook
|
|
||||||
}
|
|
||||||
elseif ($DestinationWorkbook -is [OfficeOpenXml.ExcelPackage] ) {
|
|
||||||
$wb = $DestinationWorkbook.workbook
|
|
||||||
if ($show) {$package2 =$DestinationWorkbook}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
$package2 = Open-ExcelPackage -Create -Path $DestinationWorkbook
|
|
||||||
$wb = $package2.Workbook
|
|
||||||
}
|
|
||||||
if (-not $DestinationWorkSheet) {$DestinationWorkSheet = $SourceWs.Name}
|
|
||||||
if ($wb.Worksheets[$DestinationWorkSheet]) {
|
|
||||||
Write-Verbose "Destination workbook already has a sheet named '$DestinationWorkSheet', deleting it."
|
|
||||||
$wb.Worksheets.Delete($DestinationWorkSheet)
|
|
||||||
}
|
|
||||||
Write-Verbose "Copying $($SourceWorkSheet) from $($SourceWorkbook) to $($DestinationWorkSheet) in $($DestinationWorkbook)"
|
|
||||||
$null = Add-WorkSheet -ExcelWorkbook $wb -WorkSheetname $DestinationWorkSheet -CopySource $sourceWs
|
|
||||||
if ($package1) {Close-ExcelPackage -ExcelPackage $Package1 -NoSave }
|
|
||||||
if ($package2) {Close-ExcelPackage -ExcelPackage $Package2 -Show:$show }
|
|
||||||
if ($show -and $DestinationWorkbook -is [OfficeOpenXml.ExcelWorkbook]) {
|
|
||||||
Write-Warning -Message "-Show only works if the Destination workbook is given as a file path or an ExcelPackage object."
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch {Write-Warning -Message "Could not write to sheet '$DestinationWorkSheet' in the destination workbook" ; return}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
20
DoTests.ps1
20
DoTests.ps1
@@ -1,14 +1,24 @@
|
|||||||
|
param(
|
||||||
|
[Switch]$DontCreateZip
|
||||||
|
)
|
||||||
|
|
||||||
|
##
|
||||||
|
# Used in Appveyor.yml
|
||||||
|
##
|
||||||
|
|
||||||
$PSVersionTable.PSVersion
|
$PSVersionTable.PSVersion
|
||||||
|
|
||||||
## Create the zip before the tests run
|
## Create the zip before the tests run
|
||||||
## Otherwise the EPPlus.dll is in use after the Pester run
|
## Otherwise the EPPlus.dll is in use after the Pester run
|
||||||
$ModuleVersion = (Get-Content -Raw .\ImportExcel.psd1) | Invoke-Expression | ForEach-Object ModuleVersion
|
$ModuleVersion = (Invoke-Command -ScriptBlock ([scriptblock]::Create((Get-Content -Raw .\ImportExcel.psd1)))).moduleVersion
|
||||||
|
|
||||||
$dest = "ImportExcel-{0}-{1}.zip" -f $ModuleVersion, (Get-Date).ToString("yyyyMMddHHmmss")
|
if (!$DontCreateZip) {
|
||||||
Compress-Archive -Path . -DestinationPath .\$dest
|
$dest = "ImportExcel-{0}-{1}.zip" -f $ModuleVersion, (Get-Date).ToString("yyyyMMddHHmmss")
|
||||||
|
Compress-Archive -Path . -DestinationPath .\$dest
|
||||||
|
}
|
||||||
|
|
||||||
if ((Get-Module -ListAvailable pester) -eq $null) {
|
if ($null -eq (Get-Module -ListAvailable pester)) {
|
||||||
Install-Module -Name Pester -Repository PSGallery -Force
|
Install-Module -Name Pester -Repository PSGallery -Force -Scope CurrentUser
|
||||||
}
|
}
|
||||||
|
|
||||||
$result = Invoke-Pester -Script $PSScriptRoot\__tests__ -Verbose -PassThru
|
$result = Invoke-Pester -Script $PSScriptRoot\__tests__ -Verbose -PassThru
|
||||||
|
|||||||
BIN
EPPlus.dll
BIN
EPPlus.dll
Binary file not shown.
15
Examples/AddWorkSheet/AddMultiWorkSheet.ps1
Normal file
15
Examples/AddWorkSheet/AddMultiWorkSheet.ps1
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {}
|
||||||
|
|
||||||
|
$xlSourcefile = "$env:TEMP\Source.xlsx"
|
||||||
|
write-host "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
|
||||||
|
$TabData1 = 1..5 | Export-Excel $xlSourcefile -WorksheetName 'Tab 1' -AutoSize -AutoFilter
|
||||||
|
|
||||||
|
#Add another tab. Replace the $TabData2 with your data
|
||||||
|
$TabData2 = 1..10 | Export-Excel $xlSourcefile -WorksheetName 'Tab 2' -AutoSize -AutoFilter
|
||||||
|
|
||||||
|
#Add another tab. Replace the $TabData3 with your data
|
||||||
|
$TabData3 = 1..15 | Export-Excel $xlSourcefile -WorksheetName 'Tab 3' -AutoSize -AutoFilter -Show
|
||||||
@@ -4,8 +4,9 @@ $xlSourcefile = "$env:TEMP\Source.xlsx"
|
|||||||
|
|
||||||
Remove-Item $xlSourcefile -ErrorAction Ignore
|
Remove-Item $xlSourcefile -ErrorAction Ignore
|
||||||
|
|
||||||
|
#Put some simple data in a worksheet and Get an excel package object to represent the file
|
||||||
$excel = 1..10 | Export-Excel $xlSourcefile -PassThru
|
$excel = 1..10 | Export-Excel $xlSourcefile -PassThru
|
||||||
|
#Add a new worksheet named 'NewSheet' and copying the sheet that was just made (Sheet1) to the new sheet
|
||||||
Add-WorkSheet -ExcelPackage $excel -WorkSheetname "NewSheet" -CopySource $excel.Workbook.Worksheets["Sheet1"]
|
Add-WorkSheet -ExcelPackage $excel -WorkSheetname "NewSheet" -CopySource $excel.Workbook.Worksheets["Sheet1"]
|
||||||
|
#Save and open in Excel
|
||||||
Close-ExcelPackage -ExcelPackage $excel -Show
|
Close-ExcelPackage -ExcelPackage $excel -Show
|
||||||
|
|||||||
21
Examples/Charts/ChartAndTrendlines.ps1
Normal file
21
Examples/Charts/ChartAndTrendlines.ps1
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
# Creates a worksheet, addes a chart and then a Linear trendline
|
||||||
|
|
||||||
|
$xlfile = "$env:TEMP\trendLine.xlsx"
|
||||||
|
Remove-Item $xlfile -ErrorAction SilentlyContinue
|
||||||
|
|
||||||
|
$data = ConvertFrom-Csv @"
|
||||||
|
Region,Item,TotalSold
|
||||||
|
West,screws,60
|
||||||
|
South,lemon,48
|
||||||
|
South,apple,71
|
||||||
|
East,screwdriver,70
|
||||||
|
East,kiwi,32
|
||||||
|
West,screwdriver,1
|
||||||
|
South,melon,21
|
||||||
|
East,apple,79
|
||||||
|
South,apple,68
|
||||||
|
South,avocado,73
|
||||||
|
"@
|
||||||
|
|
||||||
|
$cd = New-ExcelChartDefinition -XRange Region -YRange TotalSold -ChartType ColumnClustered -ChartTrendLine Linear
|
||||||
|
$data | Export-Excel $xlfile -ExcelChartDefinition $cd -AutoNameRange -Show
|
||||||
@@ -11,7 +11,7 @@ A,B,C,Date
|
|||||||
$c = New-ExcelChartDefinition -Title Impressions `
|
$c = New-ExcelChartDefinition -Title Impressions `
|
||||||
-ChartType Line `
|
-ChartType Line `
|
||||||
-XRange "Impressions[Date]" `
|
-XRange "Impressions[Date]" `
|
||||||
-YRange "Impressions[B]" # @("Impressions[B]","Impressions[A]") `
|
-YRange @("Impressions[B]","Impressions[A]") `
|
||||||
-SeriesHeader 'B data','A data' `
|
-SeriesHeader 'B data','A data' `
|
||||||
-Row 0 -Column 0
|
-Row 0 -Column 0
|
||||||
|
|
||||||
|
|||||||
27
Examples/Charts/NumberOfVisitors.ps1
Normal file
27
Examples/Charts/NumberOfVisitors.ps1
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
$xlfile = "$env:TEMP\visitors.xlsx"
|
||||||
|
Remove-Item $xlfile -ErrorAction SilentlyContinue
|
||||||
|
|
||||||
|
$data = ConvertFrom-Csv @"
|
||||||
|
Week, TotalVisitors
|
||||||
|
1,11916
|
||||||
|
2,11665
|
||||||
|
3,13901
|
||||||
|
4,15444
|
||||||
|
5,21592
|
||||||
|
6,15057
|
||||||
|
7,26187
|
||||||
|
8,20662
|
||||||
|
9,28935
|
||||||
|
10,32443
|
||||||
|
"@
|
||||||
|
|
||||||
|
$cd = New-ExcelChartDefinition `
|
||||||
|
-XRange Week `
|
||||||
|
-YRange TotalVisitors `
|
||||||
|
-Title "No. Of Visitors" `
|
||||||
|
-ChartType ColumnClustered `
|
||||||
|
-NoLegend `
|
||||||
|
-ChartTrendLine Linear
|
||||||
|
|
||||||
|
$data | Export-Excel $xlfile -Show -AutoNameRange -AutoSize -TableName Visitors -ExcelChartDefinition $cd
|
||||||
|
|
||||||
@@ -13,14 +13,14 @@ function plot {
|
|||||||
$file = 'C:\temp\plot.xlsx'
|
$file = 'C:\temp\plot.xlsx'
|
||||||
Remove-Item $file -ErrorAction Ignore
|
Remove-Item $file -ErrorAction Ignore
|
||||||
|
|
||||||
$c = New-ExcelChart -XRange X -YRange Y -ChartType Line -NoLegend -Title Plot -Column 2 -ColumnOffSetPixels 35
|
# $c = New-ExcelChart -XRange X -YRange Y -ChartType Line -NoLegend -Title Plot -Column 2 -ColumnOffSetPixels 35
|
||||||
|
|
||||||
$(for ($i = $minx; $i -lt $maxx-.1; $i+=.1) {
|
$(for ($i = $minx; $i -lt $maxx-.1; $i+=.1) {
|
||||||
[pscustomobject]@{
|
[pscustomobject]@{
|
||||||
X=$i.ToString("N1")
|
X=$i.ToString("N1")
|
||||||
Y=(&$f $i)
|
Y=(&$f $i)
|
||||||
}
|
}
|
||||||
}) | Export-Excel $file -Show -AutoNameRange -ExcelChartDefinition $c
|
}) | Export-Excel $file -Show -AutoNameRange -LineChart -NoLegend #-ExcelChartDefinition $c
|
||||||
}
|
}
|
||||||
|
|
||||||
function pi {[math]::pi}
|
function pi {[math]::pi}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
echo Last7Days LastMonth LastWeek NextMonth NextWeek ThisMonth ThisWeek Today Tomorrow Yesterday |
|
echo Last7Days LastMonth LastWeek NextMonth NextWeek ThisMonth ThisWeek Today Tomorrow Yesterday |
|
||||||
% {
|
Foreach-Object {
|
||||||
$text = @"
|
$text = @"
|
||||||
`$f = ".\testExport.xlsx"
|
`$f = ".\testExport.xlsx"
|
||||||
|
|
||||||
|
|||||||
@@ -1,13 +1,13 @@
|
|||||||
try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {}
|
try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {}
|
||||||
|
|
||||||
$file = ".\conditionalTextFormatting.xlsx"
|
$file = "$env:temp\conditionalTextFormatting.xlsx"
|
||||||
Remove-Item $file -ErrorAction Ignore
|
Remove-Item $file -ErrorAction Ignore
|
||||||
|
|
||||||
Get-Service |
|
Get-Service |
|
||||||
Select-Object Status, Name, DisplayName, ServiceName |
|
Select-Object Status, Name, DisplayName, ServiceName |
|
||||||
Export-Excel $file -Show -AutoSize -AutoFilter -ConditionalText $(
|
Export-Excel $file -Show -AutoSize -AutoFilter -ConditionalText $(
|
||||||
New-ConditionalText stop
|
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
|
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
|
New-ConditionalText -ConditionalType EndsWith svc wheat green #the rule here is 'Ends with' and the value is 'svc' the forground is wheat and the background dark green
|
||||||
New-ConditionalText -ConditionalType BeginsWith windows darkgreen wheat
|
New-ConditionalText -ConditionalType BeginsWith windows darkgreen wheat #this is 'Begins with "Windows"' the forground is dark green and the background wheat
|
||||||
)
|
)
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {}
|
try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {}
|
||||||
|
|
||||||
|
#Define a "Contains blanks" rule. No format is specified so it default to dark-red text on light-pink background.
|
||||||
$ContainsBlanks = New-ConditionalText -ConditionalType ContainsBlanks
|
$ContainsBlanks = New-ConditionalText -ConditionalType ContainsBlanks
|
||||||
|
|
||||||
$data = $(
|
$data = $(
|
||||||
@@ -11,7 +12,8 @@ $data = $(
|
|||||||
New-PSItem g h i
|
New-PSItem g h i
|
||||||
)
|
)
|
||||||
|
|
||||||
$file ="c:\temp\testblanks.xlsx"
|
$file ="$env:temp\testblanks.xlsx"
|
||||||
|
|
||||||
Remove-Item $file -ErrorAction Ignore
|
Remove-Item $file -ErrorAction Ignore
|
||||||
|
#use the conditional format definition created above
|
||||||
$data | Export-Excel $file -show -ConditionalText $ContainsBlanks
|
$data | Export-Excel $file -show -ConditionalText $ContainsBlanks
|
||||||
@@ -1,23 +1,32 @@
|
|||||||
try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {}
|
try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {}
|
||||||
|
|
||||||
Remove-Item -Path .\test.xlsx -ErrorAction Ignore
|
$path = "$env:temp\test.xlsx"
|
||||||
|
Remove-Item -Path $path -ErrorAction Ignore
|
||||||
|
|
||||||
|
#Export processes, and get an ExcelPackage object representing the file.
|
||||||
$excel = Get-Process |
|
$excel = Get-Process |
|
||||||
Select-Object -Property Name,Company,Handles,CPU,PM,NPM,WS |
|
Select-Object -Property Name,Company,Handles,CPU,PM,NPM,WS |
|
||||||
Export-Excel -Path .\test.xlsx -ClearSheet -WorkSheetname "Processes" -PassThru
|
Export-Excel -Path $path -ClearSheet -WorkSheetname "Processes" -PassThru
|
||||||
|
|
||||||
$sheet = $excel.Workbook.Worksheets["Processes"]
|
$sheet = $excel.Workbook.Worksheets["Processes"]
|
||||||
$sheet.Column(1) | Set-Format -Bold -AutoFit
|
|
||||||
|
#Apply fixed formatting to columns. Set-Format is an Alias for Set-Excel Range, -NFormat is an alias for numberformat
|
||||||
|
$sheet.Column(1) | Set-ExcelRange -Bold -AutoFit
|
||||||
$sheet.Column(2) | Set-Format -Width 29 -WrapText
|
$sheet.Column(2) | Set-Format -Width 29 -WrapText
|
||||||
$sheet.Column(3) | Set-Format -HorizontalAlignment Right -NFormat "#,###"
|
$sheet.Column(3) | Set-Format -HorizontalAlignment Right -NFormat "#,###"
|
||||||
|
|
||||||
Set-Format -Address $sheet.Cells["E1:H1048576"] -HorizontalAlignment Right -NFormat "#,###"
|
Set-ExcelRange -Range -Address $sheet.Cells["E1:H1048576"] -HorizontalAlignment Right -NFormat "#,###"
|
||||||
Set-Format -Address $sheet.Column(4) -HorizontalAlignment Right -NFormat "#,##0.0" -Bold
|
#Set-Format is an alias for Set-ExcelRange
|
||||||
|
Set-Format -Range $sheet.Column(4) -HorizontalAlignment Right -NFormat "#,##0.0" -Bold
|
||||||
|
#In Set-ExcelRange / Set-Format "-Address" is an alias for "-Range"
|
||||||
Set-Format -Address $sheet.Row(1) -Bold -HorizontalAlignment Center
|
Set-Format -Address $sheet.Row(1) -Bold -HorizontalAlignment Center
|
||||||
|
|
||||||
Add-ConditionalFormatting -WorkSheet $sheet -Range "D2:D1048576" -DataBarColor Red
|
#Create a Red Data-bar for the values in Column D
|
||||||
Add-ConditionalFormatting -WorkSheet $sheet -Range "G2:G1048576" -RuleType GreaterThan -ConditionValue "104857600" -ForeGroundColor Red
|
Add-ConditionalFormatting -WorkSheet $sheet -Address "D2:D1048576" -DataBarColor Red
|
||||||
|
# Conditional formatting applies to "Addreses" aliases allow either "Range" or "Address" to be used in Set-ExcelRange or Add-Conditional formatting.
|
||||||
|
Add-ConditionalFormatting -WorkSheet $sheet -Range "G2:G1048576" -RuleType GreaterThan -ConditionValue "104857600" -ForeGroundColor Red
|
||||||
|
|
||||||
foreach ($c in 5..9) {Set-Format -Address $sheet.Column($c) -AutoFit }
|
foreach ($c in 5..9) {Set-Format -Address $sheet.Column($c) -AutoFit }
|
||||||
|
|
||||||
|
#Create a pivot and save the file.
|
||||||
Export-Excel -ExcelPackage $excel -WorkSheetname "Processes" -IncludePivotChart -ChartType ColumnClustered -NoLegend -PivotRows company -PivotData @{'Name'='Count'} -Show
|
Export-Excel -ExcelPackage $excel -WorkSheetname "Processes" -IncludePivotChart -ChartType ColumnClustered -NoLegend -PivotRows company -PivotData @{'Name'='Count'} -Show
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {}
|
try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {}
|
||||||
|
|
||||||
$f = ".\testExport.xlsx"
|
$f = "$env:TEMP\testExport.xlsx"
|
||||||
|
|
||||||
Remove-Item $f -ErrorAction Ignore
|
Remove-Item $f -ErrorAction Ignore
|
||||||
|
|
||||||
@@ -21,6 +21,8 @@ $data = $(
|
|||||||
New-PSItem Westerly 120
|
New-PSItem Westerly 120
|
||||||
New-PSItem SouthWest 118
|
New-PSItem SouthWest 118
|
||||||
)
|
)
|
||||||
|
# in this example instead of doing $variable = New-Conditional text <parameters> .... ; Export-excel -conditionalText $variable <other parameters>
|
||||||
|
# the syntax is used is Export-excel -conditionalText (New-Conditional text <parameters>) <other parameters>
|
||||||
|
|
||||||
|
|
||||||
#$data | Export-Excel $f -Show -AutoSize -ConditionalText (New-ConditionalText -ConditionalType AboveAverage)
|
#$data | Export-Excel $f -Show -AutoSize -ConditionalText (New-ConditionalText -ConditionalType AboveAverage)
|
||||||
|
|||||||
@@ -1,10 +1,12 @@
|
|||||||
try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {}
|
try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {}
|
||||||
|
|
||||||
Remove-Item .\testExport.xlsx -ErrorAction Ignore
|
Remove-Item "$env:TEMP\testExport.xlsx" -ErrorAction Ignore
|
||||||
|
|
||||||
Get-Process | Where-Object Company | Select-Object Company, Name, PM, Handles, *mem* |
|
Get-Process | Where-Object Company | Select-Object Company, Name, PM, Handles, *mem* |
|
||||||
|
|
||||||
Export-Excel .\testExport.xlsx -Show -AutoSize -AutoNameRange `
|
#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 `
|
||||||
-ConditionalFormat $(
|
-ConditionalFormat $(
|
||||||
New-ConditionalFormattingIconSet -Range "C:C" `
|
New-ConditionalFormattingIconSet -Range "C:C" `
|
||||||
-ConditionalFormat ThreeIconSet -IconType Arrows
|
-ConditionalFormat ThreeIconSet -IconType Arrows
|
||||||
|
|||||||
@@ -1,6 +1,4 @@
|
|||||||
cls
|
try {ipmo ..\..\ImportExcel.psd1 -Force} catch {}
|
||||||
|
|
||||||
ipmo ..\..\ImportExcel.psd1 -Force
|
|
||||||
|
|
||||||
$data = $(
|
$data = $(
|
||||||
New-PSItem 100 (echo test testx)
|
New-PSItem 100 (echo test testx)
|
||||||
@@ -10,8 +8,8 @@ $data = $(
|
|||||||
New-PSItem 500
|
New-PSItem 500
|
||||||
)
|
)
|
||||||
|
|
||||||
$file1 = "tryComparison1.xlsx"
|
$file1 = "$env:Temp\tryComparison1.xlsx"
|
||||||
$file2 = "tryComparison2.xlsx"
|
$file2 = "$env:Temp\tryComparison2.xlsx"
|
||||||
|
|
||||||
rm $file1 -ErrorAction Ignore
|
rm $file1 -ErrorAction Ignore
|
||||||
rm $file2 -ErrorAction Ignore
|
rm $file2 -ErrorAction Ignore
|
||||||
@@ -22,6 +20,6 @@ $data | Export-Excel $file1 -Show -ConditionalText $(
|
|||||||
)
|
)
|
||||||
|
|
||||||
$data | Export-Excel $file2 -Show -ConditionalText $(
|
$data | Export-Excel $file2 -Show -ConditionalText $(
|
||||||
New-ConditionalText -ConditionalType GreaterThanOrEqual 275
|
New-ConditionalText -ConditionalType GreaterThanOrEqual 275
|
||||||
New-ConditionalText -ConditionalType LessThanOrEqual 250 -BackgroundColor cyan
|
New-ConditionalText -ConditionalType LessThanOrEqual 250 -BackgroundColor cyan
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {}
|
try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {}
|
||||||
|
|
||||||
$f = ".\dashboard.xlsx"
|
$f = "$env:temp\dashboard.xlsx"
|
||||||
Remove-Item $f -ErrorAction Ignore
|
Remove-Item $f -ErrorAction Ignore
|
||||||
|
|
||||||
$data = @"
|
$data = @"
|
||||||
@@ -51,7 +51,7 @@ Set-Format -Address $sheet1.Cells["E2:G2"] -BorderBottom $BorderBottom -BorderCo
|
|||||||
Set-Format -Address $sheet1.Cells["I2:K2"] -BorderBottom $BorderBottom -BorderColor $BorderColor
|
Set-Format -Address $sheet1.Cells["I2:K2"] -BorderBottom $BorderBottom -BorderColor $BorderColor
|
||||||
Set-Format -Address $sheet1.Cells["M2:O2"] -BorderBottom $BorderBottom -BorderColor $BorderColor
|
Set-Format -Address $sheet1.Cells["M2:O2"] -BorderBottom $BorderBottom -BorderColor $BorderColor
|
||||||
|
|
||||||
Set-Format -Address $sheet1.Cells["A2:C8"] -FontColor GrayText
|
Set-Format -Address $sheet1.Cells["A2:C8"] -FontColor Gray
|
||||||
|
|
||||||
$HorizontalAlignment = "Center"
|
$HorizontalAlignment = "Center"
|
||||||
Set-Format -Address $sheet1.Cells["F1"] -HorizontalAlignment $HorizontalAlignment -Bold -Value Revenue
|
Set-Format -Address $sheet1.Cells["F1"] -HorizontalAlignment $HorizontalAlignment -Bold -Value Revenue
|
||||||
@@ -69,4 +69,4 @@ Set-Format -Address $sheet1.Cells["I10"] -Formula "=Sum(I3:I8)" -Bold
|
|||||||
Set-Format -Address $sheet1.Cells["M10"] -Formula "=Sum(M3:M8)" -Bold
|
Set-Format -Address $sheet1.Cells["M10"] -Formula "=Sum(M3:M8)" -Bold
|
||||||
Set-Format -Address $sheet1.Cells["O10"] -Formula "=Sum(O3:O8)" -Bold
|
Set-Format -Address $sheet1.Cells["O10"] -Formula "=Sum(O3:O8)" -Bold
|
||||||
|
|
||||||
Close-ExcelPackage $excel -Show
|
Close-ExcelPackage $excel -Show
|
||||||
|
|||||||
Binary file not shown.
89
Examples/CustomizeExportExcel/Out-Excel.ps1
Normal file
89
Examples/CustomizeExportExcel/Out-Excel.ps1
Normal file
@@ -0,0 +1,89 @@
|
|||||||
|
<#
|
||||||
|
This is an example on how to customize Export-Excel to your liking.
|
||||||
|
First select a name for your function, in ths example its "Out-Excel" you can even set the name to "Export-Excel".
|
||||||
|
You can customize the following things:
|
||||||
|
1. To add parameters to the function define them in "param()", here I added "Preset1" and "Preset2".
|
||||||
|
The parameters need to be removed after use (see comments and code below).
|
||||||
|
2. To remove parameters from the function add them to the list under "$_.Name -notmatch", I removed "Now".
|
||||||
|
3. Add your custom code, here I defined what the Presets do:
|
||||||
|
Preset1 configure the TableStyle, name the table depending on WorksheetName and FreezeTopRow.
|
||||||
|
Preset2 will set AutoFilter and add the Title "Daily Report".
|
||||||
|
(see comments and code below).
|
||||||
|
#>
|
||||||
|
Function Out-Excel {
|
||||||
|
[CmdletBinding(DefaultParameterSetName = 'Default')]
|
||||||
|
param(
|
||||||
|
[switch]
|
||||||
|
${Preset1},
|
||||||
|
[switch]
|
||||||
|
${Preset2}
|
||||||
|
)
|
||||||
|
DynamicParam {
|
||||||
|
$paramDictionary = [System.Management.Automation.RuntimeDefinedParameterDictionary]::new()
|
||||||
|
foreach ($P in (Get-Command -Name Export-Excel).Parameters.values.where( { $_.Name -notmatch 'Verbose|Debug|Action$|Variable$|Buffer$|Now' })) {
|
||||||
|
$paramDictionary.Add($P.Name, [System.Management.Automation.RuntimeDefinedParameter]::new( $P.Name, $P.ParameterType, $P.Attributes ) )
|
||||||
|
}
|
||||||
|
return $paramDictionary
|
||||||
|
}
|
||||||
|
|
||||||
|
begin {
|
||||||
|
try {
|
||||||
|
# Run you custom code here if it need to run before calling Export-Excel.
|
||||||
|
$PSBoundParameters['Now'] = $true
|
||||||
|
if ($Preset1) {
|
||||||
|
$PSBoundParameters['TableStyle'] = 'Medium7'
|
||||||
|
$PSBoundParameters['FreezeTopRow'] = $true
|
||||||
|
if ($PSBoundParameters['WorksheetName'] -and -not $PSBoundParameters['TableName']) {
|
||||||
|
$PSBoundParameters['TableName'] = $PSBoundParameters['WorksheetName'] + '_Table'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
elseif ($Preset2) {
|
||||||
|
$PSBoundParameters['Title'] = 'Daily Report'
|
||||||
|
$PSBoundParameters['AutoFilter'] = $true
|
||||||
|
}
|
||||||
|
# Remove the extra params we added as Export-Excel will not know what to do with them:
|
||||||
|
$null = $PSBoundParameters.Remove('Preset1')
|
||||||
|
$null = $PSBoundParameters.Remove('Preset2')
|
||||||
|
|
||||||
|
# The rest of the code was auto generated.
|
||||||
|
$outBuffer = $null
|
||||||
|
if ($PSBoundParameters.TryGetValue('OutBuffer', [ref]$outBuffer)) {
|
||||||
|
$PSBoundParameters['OutBuffer'] = 1
|
||||||
|
}
|
||||||
|
|
||||||
|
$wrappedCmd = $ExecutionContext.InvokeCommand.GetCommand('Export-Excel', [System.Management.Automation.CommandTypes]::Function)
|
||||||
|
# You can add a pipe after @PSBoundParameters to manipulate the output.
|
||||||
|
$scriptCmd = { & $wrappedCmd @PSBoundParameters }
|
||||||
|
|
||||||
|
$steppablePipeline = $scriptCmd.GetSteppablePipeline()
|
||||||
|
$steppablePipeline.Begin($PSCmdlet)
|
||||||
|
}
|
||||||
|
catch {
|
||||||
|
throw
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
process {
|
||||||
|
try {
|
||||||
|
$steppablePipeline.Process($_)
|
||||||
|
}
|
||||||
|
catch {
|
||||||
|
throw
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
end {
|
||||||
|
try {
|
||||||
|
$steppablePipeline.End()
|
||||||
|
}
|
||||||
|
catch {
|
||||||
|
throw
|
||||||
|
}
|
||||||
|
}
|
||||||
|
<#
|
||||||
|
|
||||||
|
.ForwardHelpTargetName Export-Excel
|
||||||
|
.ForwardHelpCategory Function
|
||||||
|
|
||||||
|
#>
|
||||||
|
}
|
||||||
85
Examples/ExcelDataValidation/MutipleValidations.ps1
Normal file
85
Examples/ExcelDataValidation/MutipleValidations.ps1
Normal file
@@ -0,0 +1,85 @@
|
|||||||
|
#region Setup
|
||||||
|
<#
|
||||||
|
This examples demos three types of validation:
|
||||||
|
* Creating a list using a PowerShell array
|
||||||
|
* Creating a list data from another Excel Worksheet
|
||||||
|
* Creating a rule for numbers to be between 0 an 10000
|
||||||
|
|
||||||
|
Run the script then try"
|
||||||
|
* Add random data in Column B
|
||||||
|
* Then choose from the drop down list
|
||||||
|
* Add random data in Column C
|
||||||
|
* Then choose from the drop down list
|
||||||
|
* Add .01 in column F
|
||||||
|
#>
|
||||||
|
|
||||||
|
try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {}
|
||||||
|
|
||||||
|
$path = "$Env:TEMP\DataValidation.xlsx"
|
||||||
|
Remove-Item $path -ErrorAction SilentlyContinue
|
||||||
|
|
||||||
|
$data = ConvertFrom-Csv -InputObject @"
|
||||||
|
ID,Region,Product,Quantity,Price
|
||||||
|
12001,North,Nails,37,3.99
|
||||||
|
12002,South,Hammer,5,12.10
|
||||||
|
12003,East,Saw,12,15.37
|
||||||
|
12010,West,Drill,20,8
|
||||||
|
12011,North,Crowbar,7,23.48
|
||||||
|
"@
|
||||||
|
|
||||||
|
# Export the raw data
|
||||||
|
$excelPackage = $Data |
|
||||||
|
Export-Excel -WorksheetName "Sales" -Path $path -PassThru
|
||||||
|
|
||||||
|
# Creates a sheet with data that will be used in a validation rule
|
||||||
|
$excelPackage = @('Chisel', 'Crowbar', 'Drill', 'Hammer', 'Nails', 'Saw', 'Screwdriver', 'Wrench') |
|
||||||
|
Export-excel -ExcelPackage $excelPackage -WorksheetName Values -PassThru
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Creating a list using a PowerShell array
|
||||||
|
$ValidationParams = @{
|
||||||
|
WorkSheet = $excelPackage.sales
|
||||||
|
ShowErrorMessage = $true
|
||||||
|
ErrorStyle = 'stop'
|
||||||
|
ErrorTitle = 'Invalid Data'
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
$MoreValidationParams = @{
|
||||||
|
Range = 'B2:B1001'
|
||||||
|
ValidationType = 'List'
|
||||||
|
ValueSet = @('North', 'South', 'East', 'West')
|
||||||
|
ErrorBody = "You must select an item from the list."
|
||||||
|
}
|
||||||
|
|
||||||
|
Add-ExcelDataValidationRule @ValidationParams @MoreValidationParams
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Creating a list data from another Excel Worksheet
|
||||||
|
$MoreValidationParams = @{
|
||||||
|
Range = 'C2:C1001'
|
||||||
|
ValidationType = 'List'
|
||||||
|
Formula = 'values!$a$1:$a$10'
|
||||||
|
ErrorBody = "You must select an item from the list.`r`nYou can add to the list on the values page" #Bucket
|
||||||
|
}
|
||||||
|
|
||||||
|
Add-ExcelDataValidationRule @ValidationParams @MoreValidationParams
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Creating a rule for numbers to be between 0 an 10000
|
||||||
|
$MoreValidationParams = @{
|
||||||
|
Range = 'F2:F1001'
|
||||||
|
ValidationType = 'Integer'
|
||||||
|
Operator = 'between'
|
||||||
|
Value = 0
|
||||||
|
Value2 = 10000
|
||||||
|
ErrorBody = 'Quantity must be a whole number between 0 and 10000'
|
||||||
|
}
|
||||||
|
|
||||||
|
Add-ExcelDataValidationRule @ValidationParams @MoreValidationParams
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Close Package
|
||||||
|
Close-ExcelPackage -ExcelPackage $excelPackage -Show
|
||||||
|
#endregion
|
||||||
Binary file not shown.
24
Examples/FormatCellStyles/ApplyStyle.ps1
Normal file
24
Examples/FormatCellStyles/ApplyStyle.ps1
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
$data = ConvertFrom-Csv @'
|
||||||
|
Item,Quantity,Price,Total Cost
|
||||||
|
Footballs,9,21.95,197.55
|
||||||
|
Cones,36,7.99,287.64
|
||||||
|
Shin Guards,14,10.95,153.3
|
||||||
|
Turf Shoes,22,79.95,1758.9
|
||||||
|
Baseballs,68,7.99,543.32
|
||||||
|
Baseball Gloves,31,65.00,2015.00
|
||||||
|
Baseball Bats,38,159.00,6042.00
|
||||||
|
'@
|
||||||
|
|
||||||
|
$f = "$env:TEMP\styles.xlsx"
|
||||||
|
Remove-Item $f -ErrorAction SilentlyContinue
|
||||||
|
|
||||||
|
$pkg = $data | Export-Excel -Path $f -AutoSize -PassThru
|
||||||
|
|
||||||
|
$ws = $pkg.Workbook.Worksheets["Sheet1"]
|
||||||
|
|
||||||
|
Set-ExcelRange -WorkSheet $ws -Range "A2:C6" -BackgroundColor PeachPuff -FontColor Purple -FontSize 12 -Width 12
|
||||||
|
Set-ExcelRange -WorkSheet $ws -Range "D2:D6" -BackgroundColor WhiteSmoke -FontColor Orange -Bold -FontSize 12 -Width 12
|
||||||
|
Set-ExcelRange -WorkSheet $ws -Range "A1:D1" -BackgroundColor BlueViolet -FontColor Wheat -FontSize 12 -Width 12
|
||||||
|
Set-ExcelRange -WorkSheet $ws -Range "A:A" -Width 15
|
||||||
|
|
||||||
|
Close-ExcelPackage -ExcelPackage $pkg -Show
|
||||||
@@ -8,7 +8,7 @@
|
|||||||
$sign=@{sign=echo + -}
|
$sign=@{sign=echo + -}
|
||||||
$location=@{location=echo Atlanta Newark Washington Chicago Philadelphia Houston Phoneix}
|
$location=@{location=echo Atlanta Newark Washington Chicago Philadelphia Houston Phoneix}
|
||||||
|
|
||||||
$(1..6 | % {
|
$(1..6 | Foreach-Object {
|
||||||
|
|
||||||
$from=$to=""
|
$from=$to=""
|
||||||
while($from -eq $to) {
|
while($from -eq $to) {
|
||||||
|
|||||||
101
Examples/Grouping/First10Races.csv
Normal file
101
Examples/Grouping/First10Races.csv
Normal file
@@ -0,0 +1,101 @@
|
|||||||
|
Race,Date,FinishPosition,Driver,GridPosition,Team,Points
|
||||||
|
Australian,25/03/2018,1,Sebastian Vettel,3,Ferrari,25
|
||||||
|
Australian,25/03/2018,2,Lewis Hamilton,1,Mercedes,18
|
||||||
|
Australian,25/03/2018,3,Kimi Räikkönen,2,Ferrari,15
|
||||||
|
Australian,25/03/2018,4,Daniel Ricciardo,8,Red Bull Racing-TAG Heuer,12
|
||||||
|
Australian,25/03/2018,5,Fernando Alonso,10,McLaren-Renault,10
|
||||||
|
Australian,25/03/2018,6,Max Verstappen,4,Red Bull Racing-TAG Heuer,8
|
||||||
|
Australian,25/03/2018,7,Nico Hülkenberg,7,Renault,6
|
||||||
|
Australian,25/03/2018,8,Valtteri Bottas,15,Mercedes,4
|
||||||
|
Australian,25/03/2018,9,Stoffel Vandoorne,11,McLaren-Renault,2
|
||||||
|
Australian,25/03/2018,10,Carlos Sainz,9,Renault,1
|
||||||
|
Bahrain,08/04/2018,1,Sebastian Vettel,1,Ferrari,25
|
||||||
|
Bahrain,08/04/2018,2,Valtteri Bottas,3,Mercedes,18
|
||||||
|
Bahrain,08/04/2018,3,Lewis Hamilton,9,Mercedes,15
|
||||||
|
Bahrain,08/04/2018,4,Pierre Gasly,5,STR-Honda,12
|
||||||
|
Bahrain,08/04/2018,5,Kevin Magnussen,6,Haas-Ferrari,10
|
||||||
|
Bahrain,08/04/2018,6,Nico Hülkenberg,7,Renault,8
|
||||||
|
Bahrain,08/04/2018,7,Fernando Alonso,13,McLaren-Renault,6
|
||||||
|
Bahrain,08/04/2018,8,Stoffel Vandoorne,14,McLaren-Renault,4
|
||||||
|
Bahrain,08/04/2018,9,Marcus Ericsson,17,Sauber-Ferrari,2
|
||||||
|
Bahrain,08/04/2018,10,Esteban Ocon,8,Force India-Mercedes,1
|
||||||
|
Chinese,15/04/2018,1,Daniel Ricciardo,6,Red Bull Racing-TAG Heuer,25
|
||||||
|
Chinese,15/04/2018,2,Valtteri Bottas,3,Mercedes,18
|
||||||
|
Chinese,15/04/2018,3,Kimi Räikkönen,2,Ferrari,15
|
||||||
|
Chinese,15/04/2018,4,Lewis Hamilton,4,Mercedes,12
|
||||||
|
Chinese,15/04/2018,5,Max Verstappen,5,Red Bull Racing-TAG Heuer,10
|
||||||
|
Chinese,15/04/2018,6,Nico Hülkenberg,7,Renault,8
|
||||||
|
Chinese,15/04/2018,7,Fernando Alonso,13,McLaren-Renault,6
|
||||||
|
Chinese,15/04/2018,8,Sebastian Vettel,1,Ferrari,4
|
||||||
|
Chinese,15/04/2018,9,Carlos Sainz,9,Renault,2
|
||||||
|
Chinese,15/04/2018,10,Kevin Magnussen,11,Haas-Ferrari,1
|
||||||
|
Azerbaijan,29/04/2018,1,Lewis Hamilton,2,Mercedes,25
|
||||||
|
Azerbaijan,29/04/2018,2,Kimi Räikkönen,6,Ferrari,18
|
||||||
|
Azerbaijan,29/04/2018,3,Sergio Pérez,8,Force India-Mercedes,15
|
||||||
|
Azerbaijan,29/04/2018,4,Sebastian Vettel,1,Ferrari,12
|
||||||
|
Azerbaijan,29/04/2018,5,Carlos Sainz,9,Renault,10
|
||||||
|
Azerbaijan,29/04/2018,6,Charles Leclerc,13,Sauber-Ferrari,8
|
||||||
|
Azerbaijan,29/04/2018,7,Fernando Alonso,12,McLaren-Renault,6
|
||||||
|
Azerbaijan,29/04/2018,8,Lance Stroll,10,Williams-Mercedes,4
|
||||||
|
Azerbaijan,29/04/2018,9,Stoffel Vandoorne,16,McLaren-Renault,2
|
||||||
|
Azerbaijan,29/04/2018,10,Brendon Hartley,19,STR-Honda,1
|
||||||
|
Spanish,13/05/2018,1,Lewis Hamilton,1,Mercedes,25
|
||||||
|
Spanish,13/05/2018,2,Valtteri Bottas,2,Mercedes,18
|
||||||
|
Spanish,13/05/2018,3,Max Verstappen,5,Red Bull Racing-TAG Heuer,15
|
||||||
|
Spanish,13/05/2018,4,Sebastian Vettel,3,Ferrari,12
|
||||||
|
Spanish,13/05/2018,5,Daniel Ricciardo,6,Red Bull Racing-TAG Heuer,10
|
||||||
|
Spanish,13/05/2018,6,Kevin Magnussen,7,Haas-Ferrari,8
|
||||||
|
Spanish,13/05/2018,7,Carlos Sainz,9,Renault,6
|
||||||
|
Spanish,13/05/2018,8,Fernando Alonso,8,McLaren-Renault,4
|
||||||
|
Spanish,13/05/2018,9,Sergio Pérez,15,Force India-Mercedes,2
|
||||||
|
Spanish,13/05/2018,10,Charles Leclerc,14,Sauber-Ferrari,1
|
||||||
|
Monaco,27/05/2018,1,Daniel Ricciardo,1,Red Bull Racing-TAG Heuer,25
|
||||||
|
Monaco,27/05/2018,2,Sebastian Vettel,2,Ferrari,18
|
||||||
|
Monaco,27/05/2018,3,Lewis Hamilton,3,Mercedes,15
|
||||||
|
Monaco,27/05/2018,4,Kimi Räikkönen,4,Ferrari,12
|
||||||
|
Monaco,27/05/2018,5,Valtteri Bottas,5,Mercedes,10
|
||||||
|
Monaco,27/05/2018,6,Esteban Ocon,6,Force India-Mercedes,8
|
||||||
|
Monaco,27/05/2018,7,Pierre Gasly,10,STR-Honda,6
|
||||||
|
Monaco,27/05/2018,8,Nico Hülkenberg,11,Renault,4
|
||||||
|
Monaco,27/05/2018,9,Max Verstappen,20,Red Bull Racing-TAG Heuer,2
|
||||||
|
Monaco,27/05/2018,10,Carlos Sainz,8,Renault,1
|
||||||
|
Canadian,10/06/2018,1,Sebastian Vettel,1,Ferrari,25
|
||||||
|
Canadian,10/06/2018,2,Valtteri Bottas,2,Mercedes,18
|
||||||
|
Canadian,10/06/2018,3,Max Verstappen,3,Red Bull Racing-TAG Heuer,15
|
||||||
|
Canadian,10/06/2018,4,Daniel Ricciardo,6,Red Bull Racing-TAG Heuer,12
|
||||||
|
Canadian,10/06/2018,5,Lewis Hamilton,4,Mercedes,10
|
||||||
|
Canadian,10/06/2018,6,Kimi Räikkönen,5,Ferrari,8
|
||||||
|
Canadian,10/06/2018,7,Nico Hülkenberg,7,Renault,6
|
||||||
|
Canadian,10/06/2018,8,Carlos Sainz,9,Renault,4
|
||||||
|
Canadian,10/06/2018,9,Esteban Ocon,8,Force India-Mercedes,2
|
||||||
|
Canadian,10/06/2018,10,Charles Leclerc,13,Sauber-Ferrari,1
|
||||||
|
French,24/06/2018,1,Lewis Hamilton,1,Mercedes,25
|
||||||
|
French,24/06/2018,2,Max Verstappen,4,Red Bull Racing-TAG Heuer,18
|
||||||
|
French,24/06/2018,3,Kimi Räikkönen,6,Ferrari,15
|
||||||
|
French,24/06/2018,4,Daniel Ricciardo,5,Red Bull Racing-TAG Heuer,12
|
||||||
|
French,24/06/2018,5,Sebastian Vettel,3,Ferrari,10
|
||||||
|
French,24/06/2018,6,Kevin Magnussen,9,Haas-Ferrari,8
|
||||||
|
French,24/06/2018,7,Valtteri Bottas,2,Mercedes,6
|
||||||
|
French,24/06/2018,8,Carlos Sainz,7,Renault,4
|
||||||
|
French,24/06/2018,9,Nico Hülkenberg,12,Renault,2
|
||||||
|
French,24/06/2018,10,Charles Leclerc,8,Sauber-Ferrari,1
|
||||||
|
Austrian,01/07/2018,1,Max Verstappen,4,Red Bull Racing-TAG Heuer,25
|
||||||
|
Austrian,01/07/2018,2,Kimi Räikkönen,3,Ferrari,18
|
||||||
|
Austrian,01/07/2018,3,Sebastian Vettel,6,Ferrari,15
|
||||||
|
Austrian,01/07/2018,4,Romain Grosjean,5,Haas-Ferrari,12
|
||||||
|
Austrian,01/07/2018,5,Kevin Magnussen,8,Haas-Ferrari,10
|
||||||
|
Austrian,01/07/2018,6,Esteban Ocon,11,Force India-Mercedes,8
|
||||||
|
Austrian,01/07/2018,7,Sergio Pérez,15,Force India-Mercedes,6
|
||||||
|
Austrian,01/07/2018,8,Fernando Alonso,20,McLaren-Renault,4
|
||||||
|
Austrian,01/07/2018,9,Charles Leclerc,17,Sauber-Ferrari,2
|
||||||
|
Austrian,01/07/2018,10,Marcus Ericsson,18,Sauber-Ferrari,1
|
||||||
|
British,08/07/2018,1,Sebastian Vettel,2,Ferrari,25
|
||||||
|
British,08/07/2018,2,Lewis Hamilton,1,Mercedes,18
|
||||||
|
British,08/07/2018,3,Kimi Räikkönen,3,Ferrari,15
|
||||||
|
British,08/07/2018,4,Valtteri Bottas,4,Mercedes,12
|
||||||
|
British,08/07/2018,5,Daniel Ricciardo,6,Red Bull Racing-TAG Heuer,10
|
||||||
|
British,08/07/2018,6,Nico Hülkenberg,11,Renault,8
|
||||||
|
British,08/07/2018,7,Esteban Ocon,10,Force India-Mercedes,6
|
||||||
|
British,08/07/2018,8,Fernando Alonso,13,McLaren-Renault,4
|
||||||
|
British,08/07/2018,9,Kevin Magnussen,7,Haas-Ferrari,2
|
||||||
|
British,08/07/2018,10,Sergio Pérez,12,Force India-Mercedes,1
|
||||||
|
10
Examples/Grouping/GroupDate.ps1
Normal file
10
Examples/Grouping/GroupDate.ps1
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
$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
|
||||||
10
Examples/Grouping/GroupNumeric.ps1
Normal file
10
Examples/Grouping/GroupNumeric.ps1
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
$xlfile = "$env:TEMP\Places.xlsx"
|
||||||
|
|
||||||
|
Remove-Item $xlfile -ErrorAction SilentlyContinue
|
||||||
|
|
||||||
|
$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
|
||||||
39
Examples/Grouping/TimestampBucket.ps1
Normal file
39
Examples/Grouping/TimestampBucket.ps1
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
$data = ConvertFrom-Csv @"
|
||||||
|
Timestamp,Tenant
|
||||||
|
10/29/2018 3:00:00.123,1
|
||||||
|
10/29/2018 3:00:10.456,1
|
||||||
|
10/29/2018 3:01:20.389,1
|
||||||
|
10/29/2018 3:00:30.222,1
|
||||||
|
10/29/2018 3:00:40.143,1
|
||||||
|
10/29/2018 3:00:50.809,1
|
||||||
|
10/29/2018 3:01:00.193,1
|
||||||
|
10/29/2018 3:01:10.555,1
|
||||||
|
10/29/2018 3:01:20.739,1
|
||||||
|
10/29/2018 3:01:30.912,1
|
||||||
|
10/29/2018 3:01:40.989,1
|
||||||
|
10/29/2018 3:01:50.545,1
|
||||||
|
10/29/2018 3:02:00.999,1
|
||||||
|
"@ | Select-Object @{n = 'Timestamp'; e = {get-date $_.timestamp}}, tenant, @{n = 'Bucket'; e = { - (get-date $_.timestamp).Second % 30}}
|
||||||
|
|
||||||
|
$f = "$env:temp\pivottest.xlsx"
|
||||||
|
Remove-Item $f -ErrorAction SilentlyContinue
|
||||||
|
|
||||||
|
$pivotDefParams = @{
|
||||||
|
PivotTableName = 'Timestamp Buckets'
|
||||||
|
PivotRows = @('Timestamp', 'Tenant')
|
||||||
|
PivotData = @{'Bucket' = 'count'}
|
||||||
|
GroupDateRow = 'TimeStamp'
|
||||||
|
GroupDatePart = @('Hours', 'Minutes')
|
||||||
|
Activate = $true
|
||||||
|
}
|
||||||
|
|
||||||
|
$excelParams = @{
|
||||||
|
PivotTableDefinition = New-PivotTableDefinition @pivotDefParams
|
||||||
|
Path = $f
|
||||||
|
WorkSheetname = "Log Data"
|
||||||
|
AutoSize = $true
|
||||||
|
AutoFilter = $true
|
||||||
|
Show = $true
|
||||||
|
}
|
||||||
|
|
||||||
|
$data | Export-Excel @excelParams
|
||||||
101
Examples/HyperLinks/First10Races.csv
Normal file
101
Examples/HyperLinks/First10Races.csv
Normal file
@@ -0,0 +1,101 @@
|
|||||||
|
Race,Date,FinishPosition,Driver,GridPosition,Team,Points
|
||||||
|
Australian,25/03/2018,1,Sebastian Vettel,3,Ferrari,25
|
||||||
|
Australian,25/03/2018,2,Lewis Hamilton,1,Mercedes,18
|
||||||
|
Australian,25/03/2018,3,Kimi Räikkönen,2,Ferrari,15
|
||||||
|
Australian,25/03/2018,4,Daniel Ricciardo,8,Red Bull Racing-TAG Heuer,12
|
||||||
|
Australian,25/03/2018,5,Fernando Alonso,10,McLaren-Renault,10
|
||||||
|
Australian,25/03/2018,6,Max Verstappen,4,Red Bull Racing-TAG Heuer,8
|
||||||
|
Australian,25/03/2018,7,Nico Hülkenberg,7,Renault,6
|
||||||
|
Australian,25/03/2018,8,Valtteri Bottas,15,Mercedes,4
|
||||||
|
Australian,25/03/2018,9,Stoffel Vandoorne,11,McLaren-Renault,2
|
||||||
|
Australian,25/03/2018,10,Carlos Sainz,9,Renault,1
|
||||||
|
Bahrain,08/04/2018,1,Sebastian Vettel,1,Ferrari,25
|
||||||
|
Bahrain,08/04/2018,2,Valtteri Bottas,3,Mercedes,18
|
||||||
|
Bahrain,08/04/2018,3,Lewis Hamilton,9,Mercedes,15
|
||||||
|
Bahrain,08/04/2018,4,Pierre Gasly,5,STR-Honda,12
|
||||||
|
Bahrain,08/04/2018,5,Kevin Magnussen,6,Haas-Ferrari,10
|
||||||
|
Bahrain,08/04/2018,6,Nico Hülkenberg,7,Renault,8
|
||||||
|
Bahrain,08/04/2018,7,Fernando Alonso,13,McLaren-Renault,6
|
||||||
|
Bahrain,08/04/2018,8,Stoffel Vandoorne,14,McLaren-Renault,4
|
||||||
|
Bahrain,08/04/2018,9,Marcus Ericsson,17,Sauber-Ferrari,2
|
||||||
|
Bahrain,08/04/2018,10,Esteban Ocon,8,Force India-Mercedes,1
|
||||||
|
Chinese,15/04/2018,1,Daniel Ricciardo,6,Red Bull Racing-TAG Heuer,25
|
||||||
|
Chinese,15/04/2018,2,Valtteri Bottas,3,Mercedes,18
|
||||||
|
Chinese,15/04/2018,3,Kimi Räikkönen,2,Ferrari,15
|
||||||
|
Chinese,15/04/2018,4,Lewis Hamilton,4,Mercedes,12
|
||||||
|
Chinese,15/04/2018,5,Max Verstappen,5,Red Bull Racing-TAG Heuer,10
|
||||||
|
Chinese,15/04/2018,6,Nico Hülkenberg,7,Renault,8
|
||||||
|
Chinese,15/04/2018,7,Fernando Alonso,13,McLaren-Renault,6
|
||||||
|
Chinese,15/04/2018,8,Sebastian Vettel,1,Ferrari,4
|
||||||
|
Chinese,15/04/2018,9,Carlos Sainz,9,Renault,2
|
||||||
|
Chinese,15/04/2018,10,Kevin Magnussen,11,Haas-Ferrari,1
|
||||||
|
Azerbaijan,29/04/2018,1,Lewis Hamilton,2,Mercedes,25
|
||||||
|
Azerbaijan,29/04/2018,2,Kimi Räikkönen,6,Ferrari,18
|
||||||
|
Azerbaijan,29/04/2018,3,Sergio Pérez,8,Force India-Mercedes,15
|
||||||
|
Azerbaijan,29/04/2018,4,Sebastian Vettel,1,Ferrari,12
|
||||||
|
Azerbaijan,29/04/2018,5,Carlos Sainz,9,Renault,10
|
||||||
|
Azerbaijan,29/04/2018,6,Charles Leclerc,13,Sauber-Ferrari,8
|
||||||
|
Azerbaijan,29/04/2018,7,Fernando Alonso,12,McLaren-Renault,6
|
||||||
|
Azerbaijan,29/04/2018,8,Lance Stroll,10,Williams-Mercedes,4
|
||||||
|
Azerbaijan,29/04/2018,9,Stoffel Vandoorne,16,McLaren-Renault,2
|
||||||
|
Azerbaijan,29/04/2018,10,Brendon Hartley,19,STR-Honda,1
|
||||||
|
Spanish,13/05/2018,1,Lewis Hamilton,1,Mercedes,25
|
||||||
|
Spanish,13/05/2018,2,Valtteri Bottas,2,Mercedes,18
|
||||||
|
Spanish,13/05/2018,3,Max Verstappen,5,Red Bull Racing-TAG Heuer,15
|
||||||
|
Spanish,13/05/2018,4,Sebastian Vettel,3,Ferrari,12
|
||||||
|
Spanish,13/05/2018,5,Daniel Ricciardo,6,Red Bull Racing-TAG Heuer,10
|
||||||
|
Spanish,13/05/2018,6,Kevin Magnussen,7,Haas-Ferrari,8
|
||||||
|
Spanish,13/05/2018,7,Carlos Sainz,9,Renault,6
|
||||||
|
Spanish,13/05/2018,8,Fernando Alonso,8,McLaren-Renault,4
|
||||||
|
Spanish,13/05/2018,9,Sergio Pérez,15,Force India-Mercedes,2
|
||||||
|
Spanish,13/05/2018,10,Charles Leclerc,14,Sauber-Ferrari,1
|
||||||
|
Monaco,27/05/2018,1,Daniel Ricciardo,1,Red Bull Racing-TAG Heuer,25
|
||||||
|
Monaco,27/05/2018,2,Sebastian Vettel,2,Ferrari,18
|
||||||
|
Monaco,27/05/2018,3,Lewis Hamilton,3,Mercedes,15
|
||||||
|
Monaco,27/05/2018,4,Kimi Räikkönen,4,Ferrari,12
|
||||||
|
Monaco,27/05/2018,5,Valtteri Bottas,5,Mercedes,10
|
||||||
|
Monaco,27/05/2018,6,Esteban Ocon,6,Force India-Mercedes,8
|
||||||
|
Monaco,27/05/2018,7,Pierre Gasly,10,STR-Honda,6
|
||||||
|
Monaco,27/05/2018,8,Nico Hülkenberg,11,Renault,4
|
||||||
|
Monaco,27/05/2018,9,Max Verstappen,20,Red Bull Racing-TAG Heuer,2
|
||||||
|
Monaco,27/05/2018,10,Carlos Sainz,8,Renault,1
|
||||||
|
Canadian,10/06/2018,1,Sebastian Vettel,1,Ferrari,25
|
||||||
|
Canadian,10/06/2018,2,Valtteri Bottas,2,Mercedes,18
|
||||||
|
Canadian,10/06/2018,3,Max Verstappen,3,Red Bull Racing-TAG Heuer,15
|
||||||
|
Canadian,10/06/2018,4,Daniel Ricciardo,6,Red Bull Racing-TAG Heuer,12
|
||||||
|
Canadian,10/06/2018,5,Lewis Hamilton,4,Mercedes,10
|
||||||
|
Canadian,10/06/2018,6,Kimi Räikkönen,5,Ferrari,8
|
||||||
|
Canadian,10/06/2018,7,Nico Hülkenberg,7,Renault,6
|
||||||
|
Canadian,10/06/2018,8,Carlos Sainz,9,Renault,4
|
||||||
|
Canadian,10/06/2018,9,Esteban Ocon,8,Force India-Mercedes,2
|
||||||
|
Canadian,10/06/2018,10,Charles Leclerc,13,Sauber-Ferrari,1
|
||||||
|
French,24/06/2018,1,Lewis Hamilton,1,Mercedes,25
|
||||||
|
French,24/06/2018,2,Max Verstappen,4,Red Bull Racing-TAG Heuer,18
|
||||||
|
French,24/06/2018,3,Kimi Räikkönen,6,Ferrari,15
|
||||||
|
French,24/06/2018,4,Daniel Ricciardo,5,Red Bull Racing-TAG Heuer,12
|
||||||
|
French,24/06/2018,5,Sebastian Vettel,3,Ferrari,10
|
||||||
|
French,24/06/2018,6,Kevin Magnussen,9,Haas-Ferrari,8
|
||||||
|
French,24/06/2018,7,Valtteri Bottas,2,Mercedes,6
|
||||||
|
French,24/06/2018,8,Carlos Sainz,7,Renault,4
|
||||||
|
French,24/06/2018,9,Nico Hülkenberg,12,Renault,2
|
||||||
|
French,24/06/2018,10,Charles Leclerc,8,Sauber-Ferrari,1
|
||||||
|
Austrian,01/07/2018,1,Max Verstappen,4,Red Bull Racing-TAG Heuer,25
|
||||||
|
Austrian,01/07/2018,2,Kimi Räikkönen,3,Ferrari,18
|
||||||
|
Austrian,01/07/2018,3,Sebastian Vettel,6,Ferrari,15
|
||||||
|
Austrian,01/07/2018,4,Romain Grosjean,5,Haas-Ferrari,12
|
||||||
|
Austrian,01/07/2018,5,Kevin Magnussen,8,Haas-Ferrari,10
|
||||||
|
Austrian,01/07/2018,6,Esteban Ocon,11,Force India-Mercedes,8
|
||||||
|
Austrian,01/07/2018,7,Sergio Pérez,15,Force India-Mercedes,6
|
||||||
|
Austrian,01/07/2018,8,Fernando Alonso,20,McLaren-Renault,4
|
||||||
|
Austrian,01/07/2018,9,Charles Leclerc,17,Sauber-Ferrari,2
|
||||||
|
Austrian,01/07/2018,10,Marcus Ericsson,18,Sauber-Ferrari,1
|
||||||
|
British,08/07/2018,1,Sebastian Vettel,2,Ferrari,25
|
||||||
|
British,08/07/2018,2,Lewis Hamilton,1,Mercedes,18
|
||||||
|
British,08/07/2018,3,Kimi Räikkönen,3,Ferrari,15
|
||||||
|
British,08/07/2018,4,Valtteri Bottas,4,Mercedes,12
|
||||||
|
British,08/07/2018,5,Daniel Ricciardo,6,Red Bull Racing-TAG Heuer,10
|
||||||
|
British,08/07/2018,6,Nico Hülkenberg,11,Renault,8
|
||||||
|
British,08/07/2018,7,Esteban Ocon,10,Force India-Mercedes,6
|
||||||
|
British,08/07/2018,8,Fernando Alonso,13,McLaren-Renault,4
|
||||||
|
British,08/07/2018,9,Kevin Magnussen,7,Haas-Ferrari,2
|
||||||
|
British,08/07/2018,10,Sergio Pérez,12,Force India-Mercedes,1
|
||||||
|
27
Examples/HyperLinks/Races.ps1
Normal file
27
Examples/HyperLinks/Races.ps1
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
|
||||||
|
#First 10 races is a CSV file containing the top 10 finishers for the first 10 Formula one races of 2018. Read this file and group the results by race
|
||||||
|
#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.
|
||||||
|
|
||||||
|
#Read the data, and decide how much space to leave for the hyperlinks
|
||||||
|
$scriptPath = Split-Path -Path $MyInvocation.MyCommand.path -Parent
|
||||||
|
$dataPath = Join-Path -Path $scriptPath -ChildPath "First10Races.csv"
|
||||||
|
$results = Import-Csv -Path $dataPath | Group-Object -Property RACE
|
||||||
|
$topRow = $lastDataRow = 1 + $results.Count
|
||||||
|
|
||||||
|
#Export the first row of the first group (race) with headers.
|
||||||
|
$path = "$env:TEMP\Results.xlsx"
|
||||||
|
Remove-Item -Path $path -ErrorAction SilentlyContinue
|
||||||
|
$excel = $results[0].Group[0] | Export-Excel -Path $path -StartRow $TopRow -BoldTopRow -PassThru
|
||||||
|
|
||||||
|
#export each group (race) below the last one, without headers, and create a range for each using the group (Race) name
|
||||||
|
foreach ($r in $results) {
|
||||||
|
$excel = $R.Group | Export-Excel -ExcelPackage $excel -NoHeader -StartRow ($lastDataRow +1) -RangeName $R.Name -PassThru -AutoSize
|
||||||
|
$lastDataRow += $R.Group.Count
|
||||||
|
}
|
||||||
|
|
||||||
|
#Create a hyperlink for each property with display text of "RaceNameGP" which links to the range created when the rows were exported a
|
||||||
|
$results | ForEach-Object {(New-Object -TypeName OfficeOpenXml.ExcelHyperLink -ArgumentList "Sheet1!$($_.Name)" , "$($_.name) GP")} |
|
||||||
|
Export-Excel -ExcelPackage $excel -AutoSize -Show
|
||||||
|
|
||||||
41
Examples/Index - Music.ps1
Normal file
41
Examples/Index - Music.ps1
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
#requires -modules "Get-IndexedItem"
|
||||||
|
[cmdletbinding()]
|
||||||
|
Param()
|
||||||
|
Remove-Item ~\documents\music.xlsx -ErrorAction SilentlyContinue
|
||||||
|
[System.Diagnostics.Stopwatch]$stopwatch = [System.Diagnostics.Stopwatch]::StartNew()
|
||||||
|
|
||||||
|
#Query system index for .MP3 files in C:\Users, where album artist is non-blank. Leave sorted table with columns of interest in $Music.
|
||||||
|
|
||||||
|
Get-IndexedItem "itemtype='.mp3'","AlbumArtist like '%'" -Recurse C:\Users -OutputVariable Music `
|
||||||
|
-OrderBy AlbumArtist, AlbumTitle, TrackNumber, Title -NoFiles `
|
||||||
|
-Property AlbumArtist, AlbumTitle, TrackNumber, Title, Duration, Size, SampleRate
|
||||||
|
Write-Verbose -Message ("Fetched " + $music.Rows.Count + " rows from index: " + $stopwatch.Elapsed.TotalSeconds)
|
||||||
|
#Send Table in $Music to Excel, format as a table, point $ws to the Worksheet
|
||||||
|
$excel = Send-SQLDataToExcel -Path ~\documents\music.xlsx -DataTable $music -WorkSheetname Music -TableName Music -Passthru
|
||||||
|
Write-Verbose -Message ("Inserted into Excel: " + $stopwatch.Elapsed.TotalSeconds)
|
||||||
|
$ws = $excel.Music
|
||||||
|
|
||||||
|
#Strip "SYSTEM.", "SYSTEM.AUDIO", "SYSTEM.MEDIA", "SYSTEM.MUSIC" from the column headings
|
||||||
|
#Convert Duration (column 5) from 100ns ticks to days and format as minutes, seconds, decimal
|
||||||
|
#Format filesize and sample rate nicely
|
||||||
|
#Autofit the columns.
|
||||||
|
Set-ExcelRow -Worksheet $ws -Row 1 -Value {($worksheet.cells[$row,$column].value -replace '^SYSTEM\.','') -replace '^MEDIA\.|^AUDIO\.|^MUSIC\.','' }
|
||||||
|
Set-ExcelColumn -Worksheet $ws -Column 5 -NumberFormat 'mm:ss.0' -StartRow 2 -Value {$worksheet.cells[$row,$column].value / 864000000000 }
|
||||||
|
Write-Verbose -Message ("Cells Reset: " + $stopwatch.Elapsed.TotalSeconds)
|
||||||
|
Set-Column -Worksheet $ws -Column 6 -NumberFormat '#.#,,"MB"'
|
||||||
|
Set-ExcelColumn -Worksheet $ws -Column 7 -NumberFormat '0.0,"KHz"'
|
||||||
|
$ws.Cells[$ws.Dimension].AutoFitColumns()
|
||||||
|
|
||||||
|
#Make a Pivot table for sum of space and count of tracks by artist. Sort by artist, apply formatting to space, give it nice titles.
|
||||||
|
$pt = Add-PivotTable -PassThru -PivotTableName SpaceUsedByMusic -ExcelPackage $excel -SourceWorkSheet $ws `
|
||||||
|
-PivotRows ALBUMARTIST -PivotData ([ordered]@{"Size"="Sum"; "Duration"="Count"}) -PivotDataToColumn
|
||||||
|
|
||||||
|
$pt.RowFields[0].Sort = [OfficeOpenXml.Table.PivotTable.eSortType]::Ascending
|
||||||
|
$pt.DataFields[0].Format = '#.0,,"MB"'
|
||||||
|
$pt.DataFields[0].Name = 'Space Used'
|
||||||
|
$pt.DataFields[1].Name = 'Tracks'
|
||||||
|
|
||||||
|
#Save the file, and load it into Excel
|
||||||
|
$stopwatch.Stop()
|
||||||
|
Write-Verbose -Message ("Pivot Done: " + $stopwatch.Elapsed.TotalSeconds)
|
||||||
|
Close-ExcelPackage -show $excel
|
||||||
26
Examples/InteractWithOtherModules/Pester/Analyze_that.ps1
Normal file
26
Examples/InteractWithOtherModules/Pester/Analyze_that.ps1
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
param(
|
||||||
|
$PesterTestsPath = "$PSScriptRoot\..\..\..\__tests__\"
|
||||||
|
)
|
||||||
|
|
||||||
|
$xlfile = "$env:Temp\testResults.xlsx"
|
||||||
|
Remove-Item $xlfile -ErrorAction SilentlyContinue
|
||||||
|
|
||||||
|
$xlparams = @{
|
||||||
|
Path = $xlfile
|
||||||
|
InputObject = (Invoke-Pester -Script $PesterTestsPath -PassThru).TestResult | Sort-Object describe
|
||||||
|
WorksheetName = 'FullResults'
|
||||||
|
|
||||||
|
IncludePivotTable = $true
|
||||||
|
PivotRows = 'Describe'
|
||||||
|
PivotColumns = 'Passed'
|
||||||
|
PivotData = @{'Passed' = 'Count' }
|
||||||
|
|
||||||
|
IncludePivotChart = $true
|
||||||
|
ChartType = 'BarClustered'
|
||||||
|
|
||||||
|
AutoSize = $true
|
||||||
|
AutoFilter = $true
|
||||||
|
Activate = $true
|
||||||
|
}
|
||||||
|
|
||||||
|
Export-Excel -Show @xlparams
|
||||||
@@ -0,0 +1,62 @@
|
|||||||
|
<#
|
||||||
|
.Synopsis
|
||||||
|
Runs PsScriptAnalyzer against one or more folders and pivots the results to form a report.
|
||||||
|
|
||||||
|
.Example
|
||||||
|
Analyze_this.ps1
|
||||||
|
Invokes script analyzer on the current directory; creates a file in $env:temp and opens it in Excel
|
||||||
|
.Example
|
||||||
|
Analyze_this.ps1 -xlfile ..\mymodule.xlsx -quiet
|
||||||
|
Invokes script analyzer on the current directory; creates a file in the parent directory but does not open it
|
||||||
|
.Example
|
||||||
|
"." , (dir 'C:\Program Files\WindowsPowerShell\Modules\ImportExcel\') | .\examples\ScriptAnalyzer\Analyze_this.ps1
|
||||||
|
run from a developemnt directory for importExcel it will produce a report for that directory compared against installed versions
|
||||||
|
this creates the file in the default location and opens it
|
||||||
|
#>
|
||||||
|
[CmdletBinding()]
|
||||||
|
param (
|
||||||
|
[parameter(ValueFromPipeline = $true)]
|
||||||
|
$Path = $PWD,
|
||||||
|
$xlfile = "$env:TEMP\ScriptAnalyzer.xlsx",
|
||||||
|
$ChartType = 'BarClustered' ,
|
||||||
|
$PivotColumns = 'Location',
|
||||||
|
[switch]$Quiet
|
||||||
|
)
|
||||||
|
|
||||||
|
begin {
|
||||||
|
Remove-Item -Path $xlfile -ErrorAction SilentlyContinue
|
||||||
|
$xlparams = @{
|
||||||
|
Path = $xlfile
|
||||||
|
WorksheetName = 'FullResults'
|
||||||
|
AutoSize = $true
|
||||||
|
AutoFilter = $true
|
||||||
|
Activate = $true
|
||||||
|
Show = (-not $Quiet)
|
||||||
|
}
|
||||||
|
$pivotParams = @{
|
||||||
|
PivotTableName = 'BreakDown'
|
||||||
|
PivotData = @{RuleName = 'Count' }
|
||||||
|
PivotRows = 'Severity', 'RuleName'
|
||||||
|
PivotColumns = 'Location'
|
||||||
|
PivotTotals = 'Rows'
|
||||||
|
}
|
||||||
|
$dirsToProcess = @()
|
||||||
|
}
|
||||||
|
process {
|
||||||
|
if ($path.fullName) {$dirsToProcess += $path.fullName}
|
||||||
|
elseif ($path.path) {$dirsToProcess += $path.Path}
|
||||||
|
else {$dirsToProcess += $path}
|
||||||
|
}
|
||||||
|
|
||||||
|
end {
|
||||||
|
$pivotParams['-PivotChartDefinition'] = New-ExcelChartDefinition -ChartType $chartType -Column (1 + $dirsToProcess.Count) -Title "Script analysis" -LegendBold
|
||||||
|
$xlparams['PivotTableDefinition'] = New-PivotTableDefinition @pivotParams
|
||||||
|
|
||||||
|
$dirsToProcess | ForEach-Object {
|
||||||
|
$dirName = (Resolve-Path -Path $_) -replace "^.*\\(.*?)\\(.*?)$", '$1-$2'
|
||||||
|
Write-Progress -Activity "Running Script Analyzer" -CurrentOperation $dirName
|
||||||
|
Invoke-ScriptAnalyzer -Path $_ -ErrorAction SilentlyContinue |
|
||||||
|
Add-Member -MemberType NoteProperty -Name Location -Value $dirName -PassThru
|
||||||
|
} | Export-Excel @xlparams
|
||||||
|
Write-Progress -Activity "Running Script Analyzer" -Completed
|
||||||
|
}
|
||||||
@@ -40,4 +40,4 @@ $ptdef = New-PivotTableDefinition -PivotTableName "Summary" -PivotRows "Store" -
|
|||||||
#Put in a title and freeze to top of the sheet including title and colmun headings
|
#Put in a title and freeze to top of the sheet including title and colmun headings
|
||||||
#Add the Pivot table.
|
#Add the Pivot table.
|
||||||
#Show the result
|
#Show the result
|
||||||
Join-Worksheet -Path $path -WorkSheetName "Total" -Clearsheet -FromLabel "Store" -TableName "Summary" -TableStyle Light1 -AutoSize -BoldTopRow -FreezePane 2,1 -Title "Store Sales Summary" -TitleBold -TitleSize 14 -PivotTableDefinition $ptdef -show
|
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
|
||||||
|
|||||||
@@ -1,11 +1,13 @@
|
|||||||
|
|
||||||
$path = "$env:TEMP\Test.xlsx"
|
$path = "$env:TEMP\Test.xlsx"
|
||||||
Remove-item -Path $path -ErrorAction SilentlyContinue
|
Remove-item -Path $path -ErrorAction SilentlyContinue
|
||||||
Get-WmiObject -Class win32_logicaldisk |
|
#Export disk volume, and Network adapter to their own sheets.
|
||||||
|
Get-WmiObject -Class win32_logicaldisk |
|
||||||
Select-Object -Property DeviceId,VolumeName, Size,Freespace |
|
Select-Object -Property DeviceId,VolumeName, Size,Freespace |
|
||||||
Export-Excel -Path $path -WorkSheetname Volumes -NumberFormat "0,000"
|
Export-Excel -Path $path -WorkSheetname Volumes -NumberFormat "0,000"
|
||||||
Get-NetAdapter |
|
Get-NetAdapter |
|
||||||
Select-Object -Property Name,InterfaceDescription,MacAddress,LinkSpeed |
|
Select-Object -Property Name,InterfaceDescription,MacAddress,LinkSpeed |
|
||||||
Export-Excel -Path $path -WorkSheetname NetAdapters
|
Export-Excel -Path $path -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 $path -HideSource -WorkSheetName Summary -NoHeader -LabelBlocks -AutoSize -Title "Summary" -TitleBold -TitleSize 22 -show
|
||||||
|
|||||||
@@ -11,12 +11,13 @@ $params = @{
|
|||||||
ExcelChartDefinition = New-ExcelChartDefinition -XRange Item -YRange UnitSold -Title 'Units Sold'
|
ExcelChartDefinition = New-ExcelChartDefinition -XRange Item -YRange UnitSold -Title 'Units Sold'
|
||||||
Path = $xlfile
|
Path = $xlfile
|
||||||
}
|
}
|
||||||
|
#Import 4 sets of sales data from 4 CSV files, using the parameters above.
|
||||||
Import-Csv $PSScriptRoot\NorthSales.csv | Export-Excel -WorkSheetname North @params
|
Import-Csv $PSScriptRoot\NorthSales.csv | Export-Excel -WorkSheetname North @params
|
||||||
Import-Csv $PSScriptRoot\EastSales.csv | Export-Excel -WorkSheetname East @params
|
Import-Csv $PSScriptRoot\EastSales.csv | Export-Excel -WorkSheetname East @params
|
||||||
Import-Csv $PSScriptRoot\SouthSales.csv | Export-Excel -WorkSheetname South @params
|
Import-Csv $PSScriptRoot\SouthSales.csv | Export-Excel -WorkSheetname South @params
|
||||||
Import-Csv $PSScriptRoot\WestSales.csv | Export-Excel -WorkSheetname West @params
|
Import-Csv $PSScriptRoot\WestSales.csv | Export-Excel -WorkSheetname West @params
|
||||||
|
|
||||||
|
#Join the 4 worksheets together on a sheet named Allsales, use the same parameters, except for AutoNameRange and ExcelChartDefinition.
|
||||||
$params.Remove("AutoNameRange")
|
$params.Remove("AutoNameRange")
|
||||||
$params.Remove("ExcelChartDefinition")
|
$params.Remove("ExcelChartDefinition")
|
||||||
Join-Worksheet -WorkSheetName AllSales -Show @params
|
Join-Worksheet -WorkSheetName AllSales -Show @params
|
||||||
21
Examples/MergeWorkSheet/Merge_2_Servers_Services.ps1
Normal file
21
Examples/MergeWorkSheet/Merge_2_Servers_Services.ps1
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
Remove-Item -Path "$env:temp\server*.xlsx" , "$env:temp\Combined*.xlsx" -ErrorAction SilentlyContinue
|
||||||
|
|
||||||
|
#Get a subset of services into $s and export them
|
||||||
|
[System.Collections.ArrayList]$s = get-service | Select-Object -first 25 -Property *
|
||||||
|
$s | Export-Excel -Path $env:temp\server1.xlsx
|
||||||
|
|
||||||
|
#$s is a zero based array, excel rows are 1 based and excel has a header row so Excel rows will be 2 + index in $s.
|
||||||
|
#Change a row. Add a row. Delete a row. And export the changed $s to a second file.
|
||||||
|
$s[2].DisplayName = "Changed from the orginal" #This will be row 4 in Excel - this should be highlighted as a change
|
||||||
|
|
||||||
|
$d = $s[-1] | Select-Object -Property *
|
||||||
|
$d.DisplayName = "Dummy Service"
|
||||||
|
$d.Name = "Dummy"
|
||||||
|
$s.Insert(3,$d) #This will be row 5 in Excel - this should be highlighted as a new item
|
||||||
|
|
||||||
|
$s.RemoveAt(5) #This will be row 7 in Excel - this should be highlighted as deleted item
|
||||||
|
|
||||||
|
$s | Export-Excel -Path $env:temp\server2.xlsx
|
||||||
|
|
||||||
|
#This use of Merge-worksheet Assumes a default worksheet name, (sheet1) We will check and output Name (the key), DisplayName and StartType and ignore other properties.
|
||||||
|
Merge-Worksheet -Referencefile "$env:temp\server1.xlsx" -Differencefile "$env:temp\Server2.xlsx" -OutputFile "$env:temp\combined1.xlsx" -Property name,displayname,startType -Key name -Show
|
||||||
34
Examples/MergeWorkSheet/Merge_3_Servers_Services.ps1
Normal file
34
Examples/MergeWorkSheet/Merge_3_Servers_Services.ps1
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
Remove-Item -Path "$env:temp\server*.xlsx" , "$env:temp\Combined*.xlsx" -ErrorAction SilentlyContinue
|
||||||
|
|
||||||
|
#Get a subset of services into $s and export them
|
||||||
|
[System.Collections.ArrayList]$s = get-service | Select-Object -first 25 -Property Name,DisplayName,StartType
|
||||||
|
$s | Export-Excel -Path $env:temp\server1.xlsx
|
||||||
|
|
||||||
|
#$s is a zero based array, excel rows are 1 based and excel has a header row so Excel rows will be 2 + index in $s.
|
||||||
|
#Change a row. Add a row. Delete a row. And export the changed $s to a second file.
|
||||||
|
$row4Displayname = $s[2].DisplayName
|
||||||
|
$s[2].DisplayName = "Changed from the orginal" #This will be excel row 4 and Server 2 will show as changed.
|
||||||
|
|
||||||
|
$d = $s[-1] | Select-Object -Property *
|
||||||
|
$d.DisplayName = "Dummy Service"
|
||||||
|
$d.Name = "Dummy"
|
||||||
|
$s.Insert(3,$d) #This will be Excel row 5 and server 2 will show as changed - so will Server 3
|
||||||
|
|
||||||
|
$s.RemoveAt(5) #This will be Excel row 7 and Server 2 will show as missing.
|
||||||
|
|
||||||
|
$s | Export-Excel -Path $env:temp\server2.xlsx
|
||||||
|
|
||||||
|
#Make some more changes to $s and export it to a third file
|
||||||
|
$s[2].displayname = $row4Displayname #Server 3 row 4 will match server 1 so won't be highlighted
|
||||||
|
|
||||||
|
$d = $s[-1] | Select-Object -Property *
|
||||||
|
$d.DisplayName = "Second Service"
|
||||||
|
$d.Name = "Service2"
|
||||||
|
$s.Insert(6,$d) #This will be an extra row in Server 3 at row 8. It will show as missing in Server 2.
|
||||||
|
$s.RemoveAt(8) #This will show as missing in Server 3 at row 11 ()
|
||||||
|
|
||||||
|
$s | Export-Excel -Path $env:temp\server3.xlsx
|
||||||
|
|
||||||
|
#Now bring the three files together.
|
||||||
|
|
||||||
|
Merge-MultipleSheets -Path "$env:temp\server1.xlsx", "$env:temp\Server2.xlsx","$env:temp\Server3.xlsx" -OutputFile "$env:temp\combined3.xlsx" -Property name,displayname,startType -Key name -Show
|
||||||
55
Examples/MortgageCalculator/MortgageCalculator.ps1
Normal file
55
Examples/MortgageCalculator/MortgageCalculator.ps1
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
<#
|
||||||
|
Fixed Rate Loan/Mortgage Calculator in Excel
|
||||||
|
#>
|
||||||
|
|
||||||
|
param(
|
||||||
|
$Amount = 400000,
|
||||||
|
$InterestRate = .065,
|
||||||
|
$Term = 30
|
||||||
|
)
|
||||||
|
|
||||||
|
function New-CellData {
|
||||||
|
param(
|
||||||
|
$Range,
|
||||||
|
$Value,
|
||||||
|
$Format
|
||||||
|
)
|
||||||
|
|
||||||
|
$setFormatParams = @{
|
||||||
|
WorkSheet = $ws
|
||||||
|
Range = $Range
|
||||||
|
NumberFormat = $Format
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($Value -is [string] -and $Value.StartsWith('=')) {
|
||||||
|
$setFormatParams.Formula = $Value
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$setFormatParams.Value = $Value
|
||||||
|
}
|
||||||
|
|
||||||
|
Set-Format @setFormatParams
|
||||||
|
}
|
||||||
|
|
||||||
|
$f = "$PSScriptRoot\mortgage.xlsx"
|
||||||
|
Remove-Item $f -ErrorAction SilentlyContinue
|
||||||
|
|
||||||
|
$pkg = "" | Export-Excel $f -Title 'Fixed Rate Loan Payments' -PassThru -AutoSize
|
||||||
|
$ws = $pkg.Workbook.Worksheets["Sheet1"]
|
||||||
|
|
||||||
|
New-CellData A3 'Amount'
|
||||||
|
New-CellData B3 $Amount '$#,##0'
|
||||||
|
|
||||||
|
New-CellData A4 "Interest Rate"
|
||||||
|
New-CellData B4 $InterestRate 'Percentage'
|
||||||
|
|
||||||
|
New-CellData A5 "Term (Years)"
|
||||||
|
New-CellData B5 $Term
|
||||||
|
|
||||||
|
New-CellData D3 "Monthly Payment"
|
||||||
|
New-CellData F3 "=-PMT(F4, B5*12, B3)" '$#,##0.#0'
|
||||||
|
|
||||||
|
New-CellData D4 "Monthly Rate"
|
||||||
|
New-CellData F4 "=((1+B4)^(1/12))-1" 'Percentage'
|
||||||
|
|
||||||
|
Close-ExcelPackage $pkg -Show
|
||||||
@@ -3,7 +3,7 @@ try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {}
|
|||||||
$xlfile = "$env:TEMP\testThis.xlsx"
|
$xlfile = "$env:TEMP\testThis.xlsx"
|
||||||
Remove-Item $xlfile -ErrorAction Ignore
|
Remove-Item $xlfile -ErrorAction Ignore
|
||||||
|
|
||||||
1..10 | Export-Excel $xlfile -WorkSheetname First
|
1..10 | Export-Excel $xlfile -WorkSheetname First #'First' will be the only sheet
|
||||||
11..20 | Export-Excel $xlfile -WorkSheetname Second -MoveToStart
|
11..20 | Export-Excel $xlfile -WorkSheetname Second -MoveToStart #'Second' is moved before first so the order is 'Second', 'First'
|
||||||
21..30 | Export-Excel $xlfile -WorkSheetname Third -MoveBefore First
|
21..30 | Export-Excel $xlfile -WorkSheetname Third -MoveBefore First #'Second' is moved before first so the order is 'Second', 'Third', 'First'
|
||||||
31..40 | Export-Excel $xlfile -WorkSheetname Fourth -MoveAfter Third -Show
|
31..40 | Export-Excel $xlfile -WorkSheetname Fourth -MoveAfter Third -Show #'Fourth' is moved after third so the order is ' 'Second', 'Third', 'Fourth' First'
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {}
|
try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {}
|
||||||
|
|
||||||
$file = "disks.xlsx"
|
$file = "$env:TEMP\disks.xlsx"
|
||||||
|
|
||||||
Remove-Item $file -ErrorAction Ignore
|
Remove-Item $file -ErrorAction Ignore
|
||||||
|
|
||||||
@@ -11,5 +11,5 @@ $data = $(
|
|||||||
New-PSItem -3.2 -4.1
|
New-PSItem -3.2 -4.1
|
||||||
New-PSItem -5.2 6.1
|
New-PSItem -5.2 6.1
|
||||||
)
|
)
|
||||||
|
#Set the numbers throughout the sheet to format as positive in blue with a + sign, negative in Red with a - sign.
|
||||||
$data | Export-Excel -Path $file -Show -AutoSize -NumberFormat "[Blue]+0.#0;[Red]-0.#0"
|
$data | Export-Excel -Path $file -Show -AutoSize -NumberFormat "[Blue]+0.#0;[Red]-0.#0"
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {}
|
try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {}
|
||||||
|
|
||||||
$file = "disks.xlsx"
|
$file = "$env:temp\disks.xlsx"
|
||||||
|
|
||||||
Remove-Item $file -ErrorAction Ignore
|
Remove-Item $file -ErrorAction Ignore
|
||||||
|
|
||||||
@@ -12,6 +12,5 @@ $data = $(
|
|||||||
New-PSItem -5.2 6.1
|
New-PSItem -5.2 6.1
|
||||||
New-PSItem 1000 -2000
|
New-PSItem 1000 -2000
|
||||||
)
|
)
|
||||||
|
#Number format can expand terms like Currency, to the local currency format
|
||||||
$data | Export-Excel -Path $file -Show -AutoSize -NumberFormat '[Blue]$#,##0.00;[Red]-$#,##0.00'
|
$data | Export-Excel -Path $file -Show -AutoSize -NumberFormat 'Currency'
|
||||||
|
|
||||||
|
|||||||
Binary file not shown.
23
Examples/OutTabulator/demo.txt
Normal file
23
Examples/OutTabulator/demo.txt
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
# ConvertFrom-Excel
|
||||||
|
''
|
||||||
|
|
||||||
|
.\test.xlsx
|
||||||
|
|
||||||
|
Import-Excel .\test.xlsx | ft
|
||||||
|
|
||||||
|
ConvertFrom-Excel -ExcelFile .\test.xlsx -outFile .\targetout.html
|
||||||
|
|
||||||
|
# Create a column definition
|
||||||
|
$columnOptions = @()
|
||||||
|
|
||||||
|
$columnOptions += New-ColumnOption -ColumnName Progress -formatter progress
|
||||||
|
ConvertFrom-Excel -ExcelFile .\test.xlsx -outFile .\targetout.html -columnOptions $columnOptions
|
||||||
|
|
||||||
|
$columnOptions += New-ColumnOption Activity -formatter lineFormatter
|
||||||
|
ConvertFrom-Excel -ExcelFile .\test.xlsx -outFile .\targetout.html -columnOptions $columnOptions
|
||||||
|
|
||||||
|
$columnOptions += New-ColumnOption -ColumnName Rating -formatter star
|
||||||
|
$columnOptions += New-ColumnOption Driver -formatter tickCross
|
||||||
|
ConvertFrom-Excel -ExcelFile .\test.xlsx -outFile .\targetout.html -columnOptions $columnOptions
|
||||||
|
|
||||||
|
ConvertFrom-Excel -ExcelFile .\test.xlsx -outFile .\targetout.html -columnOptions $columnOptions -groupBy Gender
|
||||||
216
Examples/OutTabulator/start-demo.ps1
Normal file
216
Examples/OutTabulator/start-demo.ps1
Normal file
@@ -0,0 +1,216 @@
|
|||||||
|
## Start-Demo.ps1
|
||||||
|
##################################################################################################
|
||||||
|
## This is an overhaul of Jeffrey Snover's original Start-Demo script by Joel "Jaykul" Bennett
|
||||||
|
##
|
||||||
|
## I've switched it to using ReadKey instead of ReadLine (you don't have to hit Enter each time)
|
||||||
|
## As a result, I've changed the names and keys for a lot of the operations, so that they make
|
||||||
|
## sense with only a single letter to tell them apart (sorry if you had them memorized).
|
||||||
|
##
|
||||||
|
## I've also been adding features as I come across needs for them, and you'll contribute your
|
||||||
|
## improvements back to the PowerShell Script repository as well.
|
||||||
|
##################################################################################################
|
||||||
|
## Revision History (version 3.3)
|
||||||
|
## 3.3.3 Fixed: Script no longer says "unrecognized key" when you hit shift or ctrl, etc.
|
||||||
|
## Fixed: Blank lines in script were showing as errors (now printed like comments)
|
||||||
|
## 3.3.2 Fixed: Changed the "x" to match the "a" in the help text
|
||||||
|
## 3.3.1 Fixed: Added a missing bracket in the script
|
||||||
|
## 3.3 - Added: Added a "Clear Screen" option
|
||||||
|
## - Added: Added a "Rewind" function (which I'm not using much)
|
||||||
|
## 3.2 - Fixed: Put back the trap { continue; }
|
||||||
|
## 3.1 - Fixed: No Output when invoking Get-Member (and other cmdlets like it???)
|
||||||
|
## 3.0 - Fixed: Commands which set a variable, like: $files = ls
|
||||||
|
## - Fixed: Default action doesn't continue
|
||||||
|
## - Changed: Use ReadKey instead of ReadLine
|
||||||
|
## - Changed: Modified the option prompts (sorry if you had them memorized)
|
||||||
|
## - Changed: Various time and duration strings have better formatting
|
||||||
|
## - Enhance: Colors are settable: prompt, command, comment
|
||||||
|
## - Added: NoPauseAfterExecute switch removes the extra pause
|
||||||
|
## If you set this, the next command will be displayed immediately
|
||||||
|
## - Added: Auto Execute mode (FullAuto switch) runs the rest of the script
|
||||||
|
## at an automatic speed set by the AutoSpeed parameter (or manually)
|
||||||
|
## - Added: Automatically append an empty line to the end of the demo script
|
||||||
|
## so you have a chance to "go back" after the last line of you demo
|
||||||
|
##################################################################################################
|
||||||
|
##
|
||||||
|
param(
|
||||||
|
$file=".\demo.txt",
|
||||||
|
[int]$command=0,
|
||||||
|
[System.ConsoleColor]$promptColor="Yellow",
|
||||||
|
[System.ConsoleColor]$commandColor="White",
|
||||||
|
[System.ConsoleColor]$commentColor="Green",
|
||||||
|
[switch]$FullAuto,
|
||||||
|
[int]$AutoSpeed = 3,
|
||||||
|
[switch]$NoPauseAfterExecute
|
||||||
|
)
|
||||||
|
|
||||||
|
$RawUI = $Host.UI.RawUI
|
||||||
|
$hostWidth = $RawUI.BufferSize.Width
|
||||||
|
|
||||||
|
# A function for reading in a character
|
||||||
|
function Read-Char() {
|
||||||
|
$_OldColor = $RawUI.ForeGroundColor
|
||||||
|
$RawUI.ForeGroundColor = "Red"
|
||||||
|
$inChar=$RawUI.ReadKey("IncludeKeyUp")
|
||||||
|
# loop until they press a character, so Shift or Ctrl, etc don't terminate us
|
||||||
|
while($inChar.Character -eq 0){
|
||||||
|
$inChar=$RawUI.ReadKey("IncludeKeyUp")
|
||||||
|
}
|
||||||
|
$RawUI.ForeGroundColor = $_OldColor
|
||||||
|
return $inChar.Character
|
||||||
|
}
|
||||||
|
|
||||||
|
function Rewind($lines, $index, $steps = 1) {
|
||||||
|
$started = $index;
|
||||||
|
$index -= $steps;
|
||||||
|
while(($index -ge 0) -and ($lines[$index].Trim(" `t").StartsWith("#"))){
|
||||||
|
$index--
|
||||||
|
}
|
||||||
|
if( $index -lt 0 ) { $index = $started }
|
||||||
|
return $index
|
||||||
|
}
|
||||||
|
|
||||||
|
$file = Resolve-Path $file
|
||||||
|
while(-not(Test-Path $file)) {
|
||||||
|
$file = Read-Host "Please enter the path of your demo script (Crtl+C to cancel)"
|
||||||
|
$file = Resolve-Path $file
|
||||||
|
}
|
||||||
|
|
||||||
|
Clear-Host
|
||||||
|
|
||||||
|
$_lines = Get-Content $file
|
||||||
|
# Append an extra (do nothing) line on the end so we can still go back after the last line.
|
||||||
|
$_lines += "Write-Host 'The End'"
|
||||||
|
$_starttime = [DateTime]::now
|
||||||
|
$FullAuto = $false
|
||||||
|
|
||||||
|
Write-Host -nonew -back black -fore $promptColor $(" " * $hostWidth)
|
||||||
|
Write-Host -nonew -back black -fore $promptColor @"
|
||||||
|
<Demo Started :: $(split-path $file -leaf)>$(' ' * ($hostWidth -(18 + $(split-path $file -leaf).Length)))
|
||||||
|
"@
|
||||||
|
Write-Host -nonew -back black -fore $promptColor "Press"
|
||||||
|
Write-Host -nonew -back black -fore Red " ? "
|
||||||
|
Write-Host -nonew -back black -fore $promptColor "for help.$(' ' * ($hostWidth -17))"
|
||||||
|
Write-Host -nonew -back black -fore $promptColor $(" " * $hostWidth)
|
||||||
|
|
||||||
|
# We use a FOR and an INDEX ($_i) instead of a FOREACH because
|
||||||
|
# it is possible to start at a different location and/or jump
|
||||||
|
# around in the order.
|
||||||
|
for ($_i = $Command; $_i -lt $_lines.count; $_i++)
|
||||||
|
{
|
||||||
|
# Put the current command in the Window Title along with the demo duration
|
||||||
|
$Dur = [DateTime]::Now - $_StartTime
|
||||||
|
$RawUI.WindowTitle = "$(if($dur.Hours -gt 0){'{0}h '})$(if($dur.Minutes -gt 0){'{1}m '}){2}s {3}" -f
|
||||||
|
$dur.Hours, $dur.Minutes, $dur.Seconds, $($_Lines[$_i])
|
||||||
|
|
||||||
|
# Echo out the commmand to the console with a prompt as though it were real
|
||||||
|
Write-Host -nonew -fore $promptColor "[$_i]$([char]0x2265) "
|
||||||
|
if ($_lines[$_i].Trim(" ").StartsWith("#") -or $_lines[$_i].Trim(" ").Length -le 0) {
|
||||||
|
Write-Host -fore $commentColor "$($_Lines[$_i]) "
|
||||||
|
continue
|
||||||
|
} else {
|
||||||
|
Write-Host -nonew -fore $commandColor "$($_Lines[$_i]) "
|
||||||
|
}
|
||||||
|
|
||||||
|
if( $FullAuto ) { Start-Sleep $autoSpeed; $ch = [char]13 } else { $ch = Read-Char }
|
||||||
|
switch($ch)
|
||||||
|
{
|
||||||
|
"?" {
|
||||||
|
Write-Host -Fore $promptColor @"
|
||||||
|
|
||||||
|
Running demo: $file
|
||||||
|
(n) Next (p) Previous
|
||||||
|
(q) Quit (s) Suspend
|
||||||
|
(t) Timecheck (v) View $(split-path $file -leaf)
|
||||||
|
(g) Go to line by number
|
||||||
|
(f) Find lines by string
|
||||||
|
(a) Auto Execute mode
|
||||||
|
(c) Clear Screen
|
||||||
|
"@
|
||||||
|
$_i-- # back a line, we're gonna step forward when we loop
|
||||||
|
}
|
||||||
|
"n" { # Next (do nothing)
|
||||||
|
Write-Host -Fore $promptColor "<Skipping Line>"
|
||||||
|
}
|
||||||
|
"p" { # Previous
|
||||||
|
Write-Host -Fore $promptColor "<Back one Line>"
|
||||||
|
while ($_lines[--$_i].Trim(" ").StartsWith("#")){}
|
||||||
|
$_i-- # back a line, we're gonna step forward when we loop
|
||||||
|
}
|
||||||
|
"a" { # EXECUTE (Go Faster)
|
||||||
|
$AutoSpeed = [int](Read-Host "Pause (seconds)")
|
||||||
|
$FullAuto = $true;
|
||||||
|
Write-Host -Fore $promptColor "<eXecute Remaining Lines>"
|
||||||
|
$_i-- # Repeat this line, and then just blow through the rest
|
||||||
|
}
|
||||||
|
"q" { # Quit
|
||||||
|
Write-Host -Fore $promptColor "<Quiting demo>"
|
||||||
|
$_i = $_lines.count;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
"v" { # View Source
|
||||||
|
$lines[0..($_i-1)] | Write-Host -Fore Yellow
|
||||||
|
$lines[$_i] | Write-Host -Fore Green
|
||||||
|
$lines[($_i+1)..$lines.Count] | Write-Host -Fore Yellow
|
||||||
|
$_i-- # back a line, we're gonna step forward when we loop
|
||||||
|
}
|
||||||
|
"t" { # Time Check
|
||||||
|
$dur = [DateTime]::Now - $_StartTime
|
||||||
|
Write-Host -Fore $promptColor $(
|
||||||
|
"{3} -- $(if($dur.Hours -gt 0){'{0}h '})$(if($dur.Minutes -gt 0){'{1}m '}){2}s" -f
|
||||||
|
$dur.Hours, $dur.Minutes, $dur.Seconds, ([DateTime]::Now.ToShortTimeString()))
|
||||||
|
$_i-- # back a line, we're gonna step forward when we loop
|
||||||
|
}
|
||||||
|
"s" { # Suspend (Enter Nested Prompt)
|
||||||
|
Write-Host -Fore $promptColor "<Suspending demo - type 'Exit' to resume>"
|
||||||
|
$Host.EnterNestedPrompt()
|
||||||
|
$_i-- # back a line, we're gonna step forward when we loop
|
||||||
|
}
|
||||||
|
"g" { # GoTo Line Number
|
||||||
|
$i = [int](Read-Host "line number")
|
||||||
|
if($i -le $_lines.Count) {
|
||||||
|
if($i -gt 0) {
|
||||||
|
# extra line back because we're gonna step forward when we loop
|
||||||
|
$_i = Rewind $_lines $_i (($_i-$i)+1)
|
||||||
|
} else {
|
||||||
|
$_i = -1 # Start negative, because we step forward when we loop
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
"f" { # Find by pattern
|
||||||
|
$match = $_lines | Select-String (Read-Host "search string")
|
||||||
|
if($match -eq $null) {
|
||||||
|
Write-Host -Fore Red "Can't find a matching line"
|
||||||
|
} else {
|
||||||
|
$match | % { Write-Host -Fore $promptColor $("[{0,2}] {1}" -f ($_.LineNumber - 1), $_.Line) }
|
||||||
|
if($match.Count -lt 1) {
|
||||||
|
$_i = $match.lineNumber - 2 # back a line, we're gonna step forward when we loop
|
||||||
|
} else {
|
||||||
|
$_i-- # back a line, we're gonna step forward when we loop
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
"c" {
|
||||||
|
Clear-Host
|
||||||
|
$_i-- # back a line, we're gonna step forward when we loop
|
||||||
|
}
|
||||||
|
"$([char]13)" { # on enter
|
||||||
|
Write-Host
|
||||||
|
trap [System.Exception] {Write-Error $_; continue;}
|
||||||
|
Invoke-Expression ($_lines[$_i]) | out-default
|
||||||
|
if(-not $NoPauseAfterExecute -and -not $FullAuto) {
|
||||||
|
$null = $RawUI.ReadKey("NoEcho,IncludeKeyUp") # Pause after output for no apparent reason... ;)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
default
|
||||||
|
{
|
||||||
|
Write-Host -Fore Green "`nKey not recognized. Press ? for help, or ENTER to execute the command."
|
||||||
|
$_i-- # back a line, we're gonna step forward when we loop
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$dur = [DateTime]::Now - $_StartTime
|
||||||
|
Write-Host -Fore $promptColor $(
|
||||||
|
"<Demo Complete -- $(if($dur.Hours -gt 0){'{0}h '})$(if($dur.Minutes -gt 0){'{1}m '}){2}s>" -f
|
||||||
|
$dur.Hours, $dur.Minutes, $dur.Seconds, [DateTime]::Now.ToLongTimeString())
|
||||||
|
Write-Host -Fore $promptColor $([DateTime]::now)
|
||||||
|
Write-Host
|
||||||
80
Examples/OutTabulator/targetout.html
Normal file
80
Examples/OutTabulator/targetout.html
Normal file
@@ -0,0 +1,80 @@
|
|||||||
|
<!doctype html>
|
||||||
|
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="ie=edge">
|
||||||
|
<title>Out-TabulatorView</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<script type="text/javascript" src="file:///C:\Program Files\WindowsPowerShell\Modules\OutTabulatorView\js\jquery-3.3.1.min.js"></script>
|
||||||
|
<script type="text/javascript" src="file:///C:\Program Files\WindowsPowerShell\Modules\OutTabulatorView\js\jquery-ui.min.js"></script>
|
||||||
|
<script type="text/javascript" src="file:///C:\Program Files\WindowsPowerShell\Modules\OutTabulatorView\js\tabulator.min.js"></script>
|
||||||
|
<script type="text/javascript" src="file:///C:\Program Files\WindowsPowerShell\Modules\OutTabulatorView\js\jquery.sparkline.min.js"></script>
|
||||||
|
|
||||||
|
<link href="file:///C:\Program Files\WindowsPowerShell\Modules\OutTabulatorView\css\tabulator.min.css" rel="stylesheet">
|
||||||
|
|
||||||
|
|
||||||
|
<div id="example-table"></div>
|
||||||
|
|
||||||
|
<script type="text/javascript">
|
||||||
|
var lineFormatter = function(cell, formatterParams){
|
||||||
|
setTimeout(function(){ //give cell enough time to be added to the DOM before calling sparkline formatter
|
||||||
|
cell.getElement().sparkline(cell.getValue(), {width:"100%", type:"line", disableTooltips:true});
|
||||||
|
}, 10);
|
||||||
|
};
|
||||||
|
|
||||||
|
var tabledata = [{"Name":"Alan Francis","Progress":90,"Activity":[4,17,11,7,6,12,14,13,11,10,9,6,11,12,0,5,12,14,18,11],"Gender":"male","Rating":3,"Color":"blue","dob":"07/08/1972","Driver":"true"},{"Name":"Brendon Philips","Progress":100,"Activity":[3,7,9,1,4,8,2,6,4,2,1,3,1,3,3,1,1,3,1,3],"Gender":"male","Rating":1,"Color":"orange","dob":"01/08/1980","Driver":""},{"Name":"Christine Lobowski","Progress":42,"Activity":[1,2,5,4,1,16,4,2,1,3,3,7,9,1,4,8,2,6,4,2],"Gender":"female","Rating":0,"Color":"green","dob":"22/05/1982","Driver":"true"},{"Name":"Ed White","Progress":70,"Activity":[20,17,15,11,16,9,4,17,11,12,0,5,12,14,18,11,12,14,20,12],"Gender":"male","Rating":0,"Color":"yellow","dob":"19/06/1976","Driver":""},{"Name":"Emily Sykes","Progress":42,"Activity":[11,15,19,20,17,16,16,5,3,2,1,2,3,4,5,4,2,5,9,8],"Gender":"female","Rating":1,"Color":"maroon","dob":"11/11/1970","Driver":""},{"Name":"Emma Netwon","Progress":40,"Activity":[3,7,9,1,4,8,3,7,9,1,4,8,2,6,4,2,2,6,4,2],"Gender":"female","Rating":4,"Color":"brown","dob":"07/10/1963","Driver":"true"},{"Name":"Frank Harbours","Progress":38,"Activity":[20,17,15,11,16,9,12,14,20,12,11,7,6,12,14,13,11,10,9,6],"Gender":"male","Rating":4,"Color":"red","dob":"12/05/1966","Driver":1},{"Name":"Gemma Jane","Progress":60,"Activity":[4,17,11,12,0,5,12,14,18,11,11,15,19,20,17,16,16,5,3,2],"Gender":"female","Rating":0,"Color":"red","dob":"22/05/1982","Driver":"true"},{"Name":"Hannah Farnsworth","Progress":30,"Activity":[1,2,5,4,1,16,10,12,14,16,13,9,7,11,10,13,4,2,1,3],"Gender":"female","Rating":1,"Color":"pink","dob":"11/02/1991","Driver":""},{"Name":"James Newman","Progress":73,"Activity":[1,20,5,3,10,13,17,15,9,11,1,2,3,4,5,4,2,5,9,8],"Gender":"male","Rating":5,"Color":"red","dob":"22/03/1998","Driver":""},{"Name":"Jamie Newhart","Progress":23,"Activity":[11,7,6,12,14,13,11,10,9,6,4,17,11,12,0,5,12,14,18,11],"Gender":"male","Rating":3,"Color":"green","dob":"14/05/1985","Driver":"true"},{"Name":"Jenny Green","Progress":56,"Activity":[11,15,19,20,17,15,11,16,9,12,14,20,12,20,17,16,16,5,3,2],"Gender":"female","Rating":4,"Color":"indigo","dob":"12/11/1998","Driver":"true"},{"Name":"John Phillips","Progress":80,"Activity":[11,7,6,12,14,1,20,5,3,10,13,17,15,9,1,13,11,10,9,6],"Gender":"male","Rating":1,"Color":"green","dob":"24/09/1950","Driver":"true"},{"Name":"Margret Marmajuke","Progress":16,"Activity":[1,3,1,3,3,1,1,3,1,3,20,17,15,11,16,9,12,14,20,12],"Gender":"female","Rating":5,"Color":"yellow","dob":"31/01/1999","Driver":""},{"Name":"Martin Barryman","Progress":20,"Activity":[1,2,3,4,5,4,11,7,6,12,14,13,11,10,9,6,2,5,9,8],"Gender":"male","Rating":5,"Color":"violet","dob":"04/04/2001","Driver":""},{"Name":"Mary May","Progress":1,"Activity":[10,12,14,16,13,9,7,11,10,13,1,2,5,4,1,16,4,2,1,3],"Gender":"female","Rating":2,"Color":"blue","dob":"14/05/1982","Driver":"true"},{"Name":"Oli Bob","Progress":12,"Activity":[1,20,5,3,10,13,17,15,9,11,10,12,14,16,13,9,7,11,10,13],"Gender":"male","Rating":1,"Color":"red","dob":"19/02/1984","Driver":1},{"Name":"Paul Branderson","Progress":60,"Activity":[1,3,1,3,3,1,11,15,19,20,17,16,16,5,3,2,1,3,1,3],"Gender":"male","Rating":5,"Color":"orange","dob":"01/01/1982","Driver":""},{"Name":"Victoria Bath","Progress":20,"Activity":[10,12,14,16,13,9,7,1,2,3,4,5,4,2,5,9,8,11,10,13],"Gender":"female","Rating":2,"Color":"purple","dob":"22/03/1986","Driver":null}]
|
||||||
|
|
||||||
|
$("#example-table").tabulator(
|
||||||
|
{
|
||||||
|
"outFile": ".\\targetout.html",
|
||||||
|
"columns": [
|
||||||
|
{
|
||||||
|
"field": "Name",
|
||||||
|
"title": "Name"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"field": "Progress",
|
||||||
|
"title": "Progress",
|
||||||
|
"formatter": "progress"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"field": "Activity",
|
||||||
|
"title": "Activity",
|
||||||
|
"formatter": lineFormatter
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"field": "Gender",
|
||||||
|
"title": "Gender"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"field": "Rating",
|
||||||
|
"title": "Rating",
|
||||||
|
"formatter": "star"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"field": "Color",
|
||||||
|
"title": "Color"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"field": "dob",
|
||||||
|
"title": "dob"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"field": "Driver",
|
||||||
|
"title": "Driver",
|
||||||
|
"formatter": "tickCross"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"groupBy": "Gender"
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
$("#example-table").tabulator("setData", tabledata);
|
||||||
|
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
9
Examples/OutTabulator/tryConvertFromExcel.ps1
Normal file
9
Examples/OutTabulator/tryConvertFromExcel.ps1
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
[CmdletBinding()]
|
||||||
|
param($outFile = "$PSScriptRoot\targetout.html")
|
||||||
|
|
||||||
|
$columnOptions = @()
|
||||||
|
|
||||||
|
$columnOptions += New-ColumnOption -ColumnName Progress -formatter progress
|
||||||
|
$columnOptions += New-ColumnOption -ColumnName Activity -formatter lineFormatter
|
||||||
|
|
||||||
|
ConvertFrom-Excel -ExcelFile $PSScriptRoot\test.xlsx -outFile $PSScriptRoot\targetout.html -columnOptions $columnOptions
|
||||||
@@ -1,16 +1,20 @@
|
|||||||
try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {}
|
try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {}
|
||||||
|
|
||||||
$file = "sales.xlsx"
|
$file = "$env:Temp\sales.xlsx"
|
||||||
|
|
||||||
Remove-Item $file -ErrorAction Ignore
|
Remove-Item $file -ErrorAction Ignore
|
||||||
|
|
||||||
|
#Using -Passthru with Export-Excel returns an Excel Package object.
|
||||||
$xlPkg = Import-Csv .\sales.csv | Export-Excel $file -PassThru
|
$xlPkg = Import-Csv .\sales.csv | Export-Excel $file -PassThru
|
||||||
|
|
||||||
$ws = $xlPkg.Workbook.WorkSheets[1]
|
#We add script properties to the package so $xlPkg.Sheet1 is equivalent to $xlPkg.Workbook.WorkSheets["Sheet1"]
|
||||||
|
$ws = $xlPkg.Sheet1
|
||||||
|
|
||||||
|
#We can manipulate the cells ...
|
||||||
$ws.Cells["E1"].Value = "TotalSold"
|
$ws.Cells["E1"].Value = "TotalSold"
|
||||||
$ws.Cells["F1"].Value = "Add 10%"
|
$ws.Cells["F1"].Value = "Add 10%"
|
||||||
|
|
||||||
|
#This is for illustration - there are more efficient ways to do this.
|
||||||
2..($ws.Dimension.Rows) |
|
2..($ws.Dimension.Rows) |
|
||||||
ForEach-Object {
|
ForEach-Object {
|
||||||
$ws.Cells["E$_"].Formula = "=C$_+D$_"
|
$ws.Cells["E$_"].Formula = "=C$_+D$_"
|
||||||
@@ -19,7 +23,7 @@ $ws.Cells["F1"].Value = "Add 10%"
|
|||||||
|
|
||||||
$ws.Cells.AutoFitColumns()
|
$ws.Cells.AutoFitColumns()
|
||||||
|
|
||||||
|
#You can call close-ExcelPackage $xlPkg -show, but here we will do the ssteps explicitly
|
||||||
$xlPkg.Save()
|
$xlPkg.Save()
|
||||||
$xlPkg.Dispose()
|
$xlPkg.Dispose()
|
||||||
|
|
||||||
Invoke-Item $file
|
Invoke-Item $file
|
||||||
Binary file not shown.
55
Examples/PivotTable/MultiplePivotTables.ps1
Normal file
55
Examples/PivotTable/MultiplePivotTables.ps1
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
$data = ConvertFrom-Csv @"
|
||||||
|
Region,Date,Fruit,Sold
|
||||||
|
North,1/1/2017,Pears,50
|
||||||
|
South,1/1/2017,Pears,150
|
||||||
|
East,4/1/2017,Grapes,100
|
||||||
|
West,7/1/2017,Bananas,150
|
||||||
|
South,10/1/2017,Apples,200
|
||||||
|
North,1/1/2018,Pears,100
|
||||||
|
East,4/1/2018,Grapes,200
|
||||||
|
West,7/1/2018,Bananas,300
|
||||||
|
South,10/1/2018,Apples,400
|
||||||
|
"@ | Select-Object -Property Region, @{n = "Date"; e = {[datetime]::ParseExact($_.Date, "M/d/yyyy", (Get-Culture))}}, Fruit, Sold
|
||||||
|
|
||||||
|
$xlfile = "$env:temp\multiplePivotTables.xlsx"
|
||||||
|
Remove-Item $xlfile -ErrorAction SilentlyContinue
|
||||||
|
|
||||||
|
$excel = $data | Export-Excel $xlfile -PassThru -AutoSize -TableName FruitData
|
||||||
|
|
||||||
|
$pivotTableParams = @{
|
||||||
|
PivotTableName = "ByRegion"
|
||||||
|
Address = $excel.Sheet1.cells["F1"]
|
||||||
|
SourceWorkSheet = $excel.Sheet1
|
||||||
|
PivotRows = echo Region Fruit Date
|
||||||
|
PivotData = @{'sold' = 'sum'}
|
||||||
|
PivotTableStyle = 'Light21'
|
||||||
|
GroupDateRow = "Date"
|
||||||
|
GroupDatePart = echo Years Quarters
|
||||||
|
}
|
||||||
|
|
||||||
|
$pt = Add-PivotTable @pivotTableParams -PassThru
|
||||||
|
#$pt.RowHeaderCaption ="By Region,Fruit,Date"
|
||||||
|
$pt.RowHeaderCaption = "By " + ($pivotTableParams.PivotRows -join ",")
|
||||||
|
|
||||||
|
$pivotTableParams.PivotTableName = "ByFruit"
|
||||||
|
$pivotTableParams.Address = $excel.Sheet1.cells["J1"]
|
||||||
|
$pivotTableParams.PivotRows = echo Fruit Region Date
|
||||||
|
|
||||||
|
$pt = Add-PivotTable @pivotTableParams -PassThru
|
||||||
|
$pt.RowHeaderCaption = "By Fruit,Region"
|
||||||
|
|
||||||
|
$pivotTableParams.PivotTableName = "ByDate"
|
||||||
|
$pivotTableParams.Address = $excel.Sheet1.cells["N1"]
|
||||||
|
$pivotTableParams.PivotRows = echo Date Region Fruit
|
||||||
|
|
||||||
|
$pt = Add-PivotTable @pivotTableParams -PassThru
|
||||||
|
$pt.RowHeaderCaption = "By Date,Region,Fruit"
|
||||||
|
|
||||||
|
$pivotTableParams.PivotTableName = "ByYears"
|
||||||
|
$pivotTableParams.Address = $excel.Sheet1.cells["S1"]
|
||||||
|
$pivotTableParams.GroupDatePart = echo Years
|
||||||
|
|
||||||
|
$pt = Add-PivotTable @pivotTableParams -PassThru
|
||||||
|
$pt.RowHeaderCaption = "By Years,Region"
|
||||||
|
|
||||||
|
Close-ExcelPackage $excel -Show
|
||||||
@@ -1,15 +1,25 @@
|
|||||||
try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {}
|
try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {}
|
||||||
|
|
||||||
Remove-Item .\test1.xlsx -ErrorAction Ignore
|
|
||||||
|
|
||||||
$ExcelParams = @{
|
$ExcelParams = @{
|
||||||
Path = ".\test1.xlsx"
|
Path = "$env:TEMP\test1.xlsx"
|
||||||
IncludePivotTable = $true
|
IncludePivotTable = $true
|
||||||
PivotRows = 'Company'
|
PivotRows = 'Company'
|
||||||
PivotTableName = 'MyTable'
|
PivotTableName = 'MyTable'
|
||||||
PivotData = @{'Handles' = 'sum'}
|
PivotData = @{'Handles' = 'sum'}
|
||||||
Show = $true
|
Show = $true
|
||||||
|
Activate = $true
|
||||||
}
|
}
|
||||||
|
Remove-Item $ExcelParams.Path -ErrorAction Ignore
|
||||||
|
Get-Process | Select-Object Company, Handles | Export-Excel @ExcelParams
|
||||||
|
|
||||||
Get-Process | Select-Object Company, Handles |
|
<# Builds a pivot table that looks like this:
|
||||||
Export-Excel @ExcelParams
|
|
||||||
|
Sum of Handles
|
||||||
|
Row Labels Total
|
||||||
|
Adobe Systems Incorporated 3100
|
||||||
|
(blank) 214374
|
||||||
|
Apple Inc. 215
|
||||||
|
etc
|
||||||
|
etc
|
||||||
|
Grand Total 365625
|
||||||
|
#>
|
||||||
26
Examples/PivotTable/TableAndPivotTable.ps1
Normal file
26
Examples/PivotTable/TableAndPivotTable.ps1
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
$path = "$Env:TEMP\test.xlsx"
|
||||||
|
remove-item -path $path -ErrorAction SilentlyContinue
|
||||||
|
|
||||||
|
#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 @"
|
||||||
|
Product, City, Gross, Net
|
||||||
|
Apple, London , 300, 250
|
||||||
|
Orange, London , 400, 350
|
||||||
|
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"}
|
||||||
|
|
||||||
|
#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.
|
||||||
|
# activate the sheet and add a pivot chart (defined in a hash table)
|
||||||
|
Add-PivotTable -Address $excel.Sheet1.Cells["F1"] -SourceWorkSheet $Excel.Sheet1 -SourceRange $Excel.Sheet1.Dimension.Address -PivotTableName "Sales" -PivotTableStyle "Medium12" -PivotNumberFormat "$#,##0.00" `
|
||||||
|
-PivotRows "City" -PivotColumns "Product" -PivotData @{Gross="Sum";Net="Sum"}-PivotTotals "Both" -Activate -PivotChartDefinition @{
|
||||||
|
Title="Gross and net by city and product";
|
||||||
|
ChartType="ColumnClustered";
|
||||||
|
Column=11; Width=500; Height=360;
|
||||||
|
YMajorUnit=500; YMinorUnit=100; YAxisNumberformat="$#,##0"
|
||||||
|
LegendPosition="Bottom"}
|
||||||
|
#Save and open in excel
|
||||||
|
Close-ExcelPackage $excel -Show
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1,6 +1,6 @@
|
|||||||
try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {}
|
try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {}
|
||||||
|
|
||||||
$xlFile=".\testPivot.xlsx"
|
$xlFile="$env:TEMP\testPivot.xlsx"
|
||||||
Remove-Item $xlFile -ErrorAction Ignore
|
Remove-Item $xlFile -ErrorAction Ignore
|
||||||
|
|
||||||
$data =@"
|
$data =@"
|
||||||
@@ -18,4 +18,18 @@ $data |
|
|||||||
-AutoSize -AutoFilter `
|
-AutoSize -AutoFilter `
|
||||||
-IncludePivotTable `
|
-IncludePivotTable `
|
||||||
-PivotRows Product `
|
-PivotRows Product `
|
||||||
-PivotData @{"Units"="sum"} -PivotFilter Region, Area
|
-PivotData @{"Units"="sum"} -PivotFilter Region, Area -Activate
|
||||||
|
|
||||||
|
<#
|
||||||
|
Creates a Pivot table that looks like
|
||||||
|
Region All^
|
||||||
|
Area All^
|
||||||
|
|
||||||
|
Sum of Units
|
||||||
|
Row Labels Total
|
||||||
|
Apple 100
|
||||||
|
Pear 240
|
||||||
|
Grape 280
|
||||||
|
Banana 160
|
||||||
|
Grand Total 780
|
||||||
|
#>
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {}
|
try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {}
|
||||||
|
|
||||||
$plt = New-Plot
|
$plt = New-Plot
|
||||||
$plt.Plot((Get-Range 0 5 .02|%{[math]::Cos(2*[math]::pi*$_)}))
|
$plt.Plot((Get-Range 0 5 .02|Foreach-Object {[math]::Cos(2*[math]::pi*$_)}))
|
||||||
$plt.SetChartSize(800,300)
|
$plt.SetChartSize(800,300)
|
||||||
$plt.Show()
|
$plt.Show()
|
||||||
@@ -1,5 +1,7 @@
|
|||||||
try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {}
|
#requires -modules "getSql"
|
||||||
|
|
||||||
|
try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {}
|
||||||
|
#download f1Results from https://1drv.ms/f/s!AhfYu7-CJv4egbt5FD7Cdxi8jSz3aQ and update the path below
|
||||||
Get-SQL -Session f1 -Excel -Connection C:\Users\mcp\OneDrive\Public\F1\f1Results.xlsx -showtables -Verbose
|
Get-SQL -Session f1 -Excel -Connection C:\Users\mcp\OneDrive\Public\F1\f1Results.xlsx -showtables -Verbose
|
||||||
|
|
||||||
Remove-Item .\demo3.xlsx
|
Remove-Item .\demo3.xlsx
|
||||||
|
|||||||
@@ -1,10 +1,13 @@
|
|||||||
try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {}
|
try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {}
|
||||||
|
|
||||||
$p = Get-Process | Select-Object Company, Handles | Export-Excel c:\temp\testBackgroundColor.xlsx -ClearSheet -KillExcel -PassThru
|
$path = "$env:TEMP\testBackgroundColor.xlsx"
|
||||||
|
|
||||||
|
$p = Get-Process | Select-Object Company, Handles | Export-Excel $path -ClearSheet -PassThru
|
||||||
|
|
||||||
$ws = $p.Workbook.WorkSheets[1]
|
$ws = $p.Workbook.WorkSheets[1]
|
||||||
$totalRows = $ws.Dimension.Rows
|
$totalRows = $ws.Dimension.Rows
|
||||||
|
|
||||||
Set-Format -Address $ws.Cells["B2:B$($totalRows)"] -BackgroundColor LightBlue
|
#Set the range from B2 to the last active row. s
|
||||||
|
Set-ExcelRange -Range $ws.Cells["B2:B$($totalRows)"] -BackgroundColor LightBlue
|
||||||
|
|
||||||
Export-Excel -ExcelPackage $p -show -AutoSize
|
Export-Excel -ExcelPackage $p -show -AutoSize
|
||||||
25
Examples/Sparklines/SalesByQuarter.ps1
Normal file
25
Examples/Sparklines/SalesByQuarter.ps1
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
try { . $PSScriptRoot\..\..\LoadPSD1.ps1 } catch { }
|
||||||
|
|
||||||
|
$xlfile = "$env:TEMP\SalesByQuarter.xlsx"
|
||||||
|
Remove-Item $xlfile -ErrorAction SilentlyContinue
|
||||||
|
|
||||||
|
$data = ConvertFrom-Csv @"
|
||||||
|
Region,Q1,Q2,Q3,Q4,YTDPerformance
|
||||||
|
Asia,1400,7200,5700,6900
|
||||||
|
Europe,3400,2300,9400,7300
|
||||||
|
Midwest,4700,9300,3700,8600
|
||||||
|
Northeast,2300,4300,4600,5600
|
||||||
|
"@
|
||||||
|
|
||||||
|
$excel = $data | Export-Excel $xlfile -Passthru -AutoSize -TableName SalesByQuarter
|
||||||
|
|
||||||
|
$ws = $excel.Sheet1
|
||||||
|
|
||||||
|
Set-Format -WorkSheet $ws -Range "B2:E5" -NumberFormat "$#,##0" -AutoSize
|
||||||
|
$sparkLineType = "line"
|
||||||
|
$null = $ws.SparklineGroups.Add( $sparkLineType, $ws.Cells["F2"], $ws.Cells["B2:E2"] )
|
||||||
|
$null = $ws.SparklineGroups.Add( $sparkLineType, $ws.Cells["F3"], $ws.Cells["B3:E3"] )
|
||||||
|
$null = $ws.SparklineGroups.Add( $sparkLineType, $ws.Cells["F4"], $ws.Cells["B4:E4"] )
|
||||||
|
$null = $ws.SparklineGroups.Add( $sparkLineType, $ws.Cells["F5"], $ws.Cells["B5:E5"] )
|
||||||
|
|
||||||
|
Close-ExcelPackage $excel -Show
|
||||||
99
Examples/Sparklines/Sparklines.ps1
Normal file
99
Examples/Sparklines/Sparklines.ps1
Normal file
@@ -0,0 +1,99 @@
|
|||||||
|
try { . $PSScriptRoot\..\..\LoadPSD1.ps1 } catch { }
|
||||||
|
|
||||||
|
class data {
|
||||||
|
[datetime]$Date
|
||||||
|
[Double]$AUD
|
||||||
|
[Double]$CAD
|
||||||
|
[Double]$CHF
|
||||||
|
[Double]$DKK
|
||||||
|
[Double]$EUR
|
||||||
|
[Double]$GBP
|
||||||
|
[Double]$HKD
|
||||||
|
[Double]$JPY
|
||||||
|
[Double]$MYR
|
||||||
|
[Double]$NOK
|
||||||
|
[Double]$NZD
|
||||||
|
[Double]$RUB
|
||||||
|
[Double]$SEK
|
||||||
|
[Double]$THB
|
||||||
|
[Double]$TRY
|
||||||
|
[Double]$USD
|
||||||
|
}
|
||||||
|
|
||||||
|
[data[]]$data = ConvertFrom-Csv @"
|
||||||
|
Date,AUD,CAD,CHF,DKK,EUR,GBP,HKD,JPY,MYR,NOK,NZD,RUB,SEK,THB,TRY,USD
|
||||||
|
2016-03-01,6.17350,6.42084,8.64785,1.25668,9.37376,12.01683,1.11067,0.07599,2.06900,0.99522,5.69227,0.11665,1.00000,0.24233,2.93017,8.63185
|
||||||
|
2016-03-02,6.27223,6.42345,8.63480,1.25404,9.35350,12.14970,1.11099,0.07582,2.07401,0.99311,5.73277,0.11757,1.00000,0.24306,2.94083,8.63825
|
||||||
|
2016-03-07,6.33778,6.38403,8.50245,1.24980,9.32373,12.05756,1.09314,0.07478,2.07171,0.99751,5.77539,0.11842,1.00000,0.23973,2.91088,8.48885
|
||||||
|
2016-03-08,6.30268,6.31774,8.54066,1.25471,9.36254,12.03361,1.09046,0.07531,2.05625,0.99225,5.72501,0.11619,1.00000,0.23948,2.91067,8.47020
|
||||||
|
2016-03-09,6.32630,6.33698,8.46118,1.24399,9.28125,11.98879,1.08544,0.07467,2.04128,0.98960,5.71601,0.11863,1.00000,0.23893,2.91349,8.42945
|
||||||
|
2016-03-10,6.24241,6.28817,8.48684,1.25260,9.34350,11.99193,1.07956,0.07392,2.04500,0.98267,5.58145,0.11769,1.00000,0.23780,2.89150,8.38245
|
||||||
|
2016-03-11,6.30180,6.30152,8.48295,1.24848,9.31230,12.01194,1.07545,0.07352,2.04112,0.98934,5.62335,0.11914,1.00000,0.23809,2.90310,8.34510
|
||||||
|
2016-03-15,6.19790,6.21615,8.42931,1.23754,9.22896,11.76418,1.07026,0.07359,2.00929,0.97129,5.49278,0.11694,1.00000,0.23642,2.86487,8.30540
|
||||||
|
2016-03-16,6.18508,6.22493,8.41792,1.23543,9.21149,11.72470,1.07152,0.07318,2.01179,0.96907,5.49138,0.11836,1.00000,0.23724,2.84767,8.31775
|
||||||
|
2016-03-17,6.25214,6.30642,8.45981,1.24327,9.26623,11.86396,1.05571,0.07356,2.01706,0.98159,5.59544,0.12024,1.00000,0.23543,2.87595,8.18825
|
||||||
|
2016-03-18,6.25359,6.32400,8.47826,1.24381,9.26976,11.91322,1.05881,0.07370,2.02554,0.98439,5.59067,0.12063,1.00000,0.23538,2.86880,8.20950
|
||||||
|
"@
|
||||||
|
|
||||||
|
$xlfile = "$env:TEMP\sparklines.xlsx"
|
||||||
|
Remove-Item $xlfile -ErrorAction SilentlyContinue
|
||||||
|
|
||||||
|
$excel = $data | Export-Excel $xlfile -WorksheetName SEKRates -AutoSize -PassThru
|
||||||
|
|
||||||
|
# Add a column sparkline for all currencies
|
||||||
|
Set-Format -WorkSheet $excel.SEKRates -Range "A2:A12" -NumberFormat "yyyy-mm-dd" -AutoSize
|
||||||
|
Set-Format -WorkSheet $excel.SEKRates -Range A15 -Value Column -AutoSize
|
||||||
|
|
||||||
|
$sparklineCol = $excel.SEKRates.SparklineGroups.Add(
|
||||||
|
"Column",
|
||||||
|
$excel.SEKRates.Cells["B15:Q15"],
|
||||||
|
$excel.SEKRates.Cells["B2:Q12"]
|
||||||
|
)
|
||||||
|
|
||||||
|
$sparklineCol.High = $true
|
||||||
|
$sparklineCol.ColorHigh.SetColor("Red")
|
||||||
|
|
||||||
|
# Add a line sparkline for all currencies
|
||||||
|
Set-Format -WorkSheet $excel.SEKRates -Range A16 -Value Line -AutoSize
|
||||||
|
$sparklineLine = $excel.SEKRates.SparklineGroups.Add(
|
||||||
|
"Line",
|
||||||
|
$excel.SEKRates.Cells["B16:Q16"],
|
||||||
|
$excel.SEKRates.Cells["B2:Q12"]
|
||||||
|
)
|
||||||
|
|
||||||
|
$sparklineLine.DateAxisRange = $excel.SEKRates.Cells["A2:A12"]
|
||||||
|
|
||||||
|
# Add some more random values and add a stacked sparkline.
|
||||||
|
Set-Format -WorkSheet $excel.SEKRates -Range A17 -Value Stacked -AutoSize
|
||||||
|
|
||||||
|
$numbers = 2, -1, 3, -4, 8, 5, -12, 18, 99, 1, -4, 12, -8, 9, 0, -8
|
||||||
|
|
||||||
|
$col = 2 # Column B
|
||||||
|
foreach ($n in $numbers) {
|
||||||
|
$excel.SEKRates.Cells[17, $col++].Value = $n
|
||||||
|
}
|
||||||
|
|
||||||
|
$sparklineStacked = $excel.SEKRates.SparklineGroups.Add(
|
||||||
|
"Stacked",
|
||||||
|
$excel.SEKRates.Cells["R17"],
|
||||||
|
$excel.SEKRates.Cells["B17:Q17"]
|
||||||
|
)
|
||||||
|
|
||||||
|
$sparklineStacked.High = $true
|
||||||
|
$sparklineStacked.ColorHigh.SetColor("Red")
|
||||||
|
$sparklineStacked.Low = $true
|
||||||
|
$sparklineStacked.ColorLow.SetColor("Green")
|
||||||
|
$sparklineStacked.Negative = $true
|
||||||
|
$sparklineStacked.ColorNegative.SetColor("Blue")
|
||||||
|
|
||||||
|
Set-Format -WorkSheet $excel.SEKRates -Range "A15:A17" -Bold -Height 50 -AutoSize
|
||||||
|
|
||||||
|
$v = @"
|
||||||
|
High - Red
|
||||||
|
Low - Green
|
||||||
|
Negative - Blue
|
||||||
|
"@
|
||||||
|
|
||||||
|
Set-Format -WorkSheet $excel.SEKRates -Range S17 -Value $v -WrapText -Width 20 -HorizontalAlignment Center -VerticalAlignment Center
|
||||||
|
|
||||||
|
Close-ExcelPackage $excel -Show
|
||||||
@@ -3,7 +3,7 @@ try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {}
|
|||||||
|
|
||||||
#. ..\New-PSItem.ps1
|
#. ..\New-PSItem.ps1
|
||||||
|
|
||||||
Remove-Item *.xlsx
|
Remove-Item "$env:temp\functions.xlsx" -ErrorAction SilentlyContinue
|
||||||
|
|
||||||
$(
|
$(
|
||||||
New-PSItem 12001 Nails 37 3.99 =C2*D2 (echo ID Product Quantity Price Total)
|
New-PSItem 12001 Nails 37 3.99 =C2*D2 (echo ID Product Quantity Price Total)
|
||||||
@@ -11,4 +11,4 @@ $(
|
|||||||
New-PSItem 12003 Saw 12 15.37 =C4*D4
|
New-PSItem 12003 Saw 12 15.37 =C4*D4
|
||||||
New-PSItem 12010 Drill 20 8 =C5*D5
|
New-PSItem 12010 Drill 20 8 =C5*D5
|
||||||
New-PSItem 12011 Crowbar 7 23.48 =C6*D6
|
New-PSItem 12011 Crowbar 7 23.48 =C6*D6
|
||||||
) | Export-Excel functions.xlsx -AutoSize -Show
|
) | Export-Excel "$env:temp\functions.xlsx"-AutoSize -Show
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {}
|
try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {}
|
||||||
|
|
||||||
Remove-Item *.xlsx
|
Remove-Item "$env:temp\functions.xlsx" -ErrorAction SilentlyContinue
|
||||||
|
|
||||||
$(
|
$(
|
||||||
New-PSItem =2%/12 60 500000 "=pmt(rate,nper,pv)" (echo rate nper pv pmt)
|
New-PSItem =2%/12 60 500000 "=pmt(rate,nper,pv)" (echo rate nper pv pmt)
|
||||||
@@ -9,4 +9,4 @@ $(
|
|||||||
New-PSItem =5%/12 60 500000 "=pmt(rate,nper,pv)"
|
New-PSItem =5%/12 60 500000 "=pmt(rate,nper,pv)"
|
||||||
New-PSItem =6%/12 60 500000 "=pmt(rate,nper,pv)"
|
New-PSItem =6%/12 60 500000 "=pmt(rate,nper,pv)"
|
||||||
New-PSItem =7%/12 60 500000 "=pmt(rate,nper,pv)"
|
New-PSItem =7%/12 60 500000 "=pmt(rate,nper,pv)"
|
||||||
) | Export-Excel functions.xlsx -AutoNameRange -AutoSize -Show
|
) | Export-Excel "$env:temp\functions.xlsx" -AutoNameRange -AutoSize -Show
|
||||||
@@ -1,10 +1,10 @@
|
|||||||
try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {}
|
try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {}
|
||||||
|
|
||||||
Remove-Item *.xlsx
|
Remove-Item "$env:temp\hyperlink.xlsx" -ErrorAction SilentlyContinue
|
||||||
|
|
||||||
$(
|
$(
|
||||||
New-PSItem '=Hyperlink("http://dougfinke.com/blog","Doug Finke")' @("Link")
|
New-PSItem '=Hyperlink("http://dougfinke.com/blog","Doug Finke")' @("Link")
|
||||||
New-PSItem '=Hyperlink("http://blogs.msdn.com/b/powershell/","PowerShell Blog")'
|
New-PSItem '=Hyperlink("http://blogs.msdn.com/b/powershell/","PowerShell Blog")'
|
||||||
New-PSItem '=Hyperlink("http://blogs.technet.com/b/heyscriptingguy/","Hey, Scripting Guy")'
|
New-PSItem '=Hyperlink("http://blogs.technet.com/b/heyscriptingguy/","Hey, Scripting Guy")'
|
||||||
|
|
||||||
) | Export-Excel hyperlink.xlsx -AutoSize -Show
|
) | Export-Excel "$env:temp\hyperlink.xlsx" -AutoSize -Show
|
||||||
|
|||||||
Binary file not shown.
@@ -1,25 +1,24 @@
|
|||||||
<#
|
|
||||||
Revisit I think yahoo deprecated their service
|
|
||||||
#>
|
|
||||||
|
|
||||||
function Get-StockInfo {
|
function Get-StockInfo {
|
||||||
param(
|
param(
|
||||||
$stock,
|
[Parameter(Mandatory)]
|
||||||
[datetime]$startDate,
|
$symbols,
|
||||||
[datetime]$endDate
|
[ValidateSet('open', 'close', 'high', 'low', 'avgTotalVolume')]
|
||||||
|
$dataPlot = "close"
|
||||||
)
|
)
|
||||||
|
|
||||||
Process {
|
$xlfile = "$env:TEMP\stocks.xlsx"
|
||||||
|
rm $xlfile -ErrorAction Ignore
|
||||||
|
|
||||||
if (!$endDate) { $endDate = $startDate}
|
$result = Invoke-RestMethod "https://api.iextrading.com/1.0/stock/market/batch?symbols=$($symbols)&types=quote&last=1"
|
||||||
|
|
||||||
$baseUrl = "http://query.yahooapis.com/v1/public/yql?q="
|
$symbolCount = $symbols.Split(",").count
|
||||||
$q = @"
|
|
||||||
select * from yahoo.finance.historicaldata where symbol = "$($stock)" and startDate = "$($startDate.ToString('yyyy-MM-dd'))" and endDate = "$($endDate.ToString('yyyy-MM-dd'))"
|
|
||||||
"@
|
|
||||||
$suffix = "&env=store://datatables.org/alltableswithkeys&format=json"
|
|
||||||
$r = Invoke-RestMethod ($baseUrl + $q + $suffix)
|
|
||||||
$r.query.results.quote
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
$ecd = New-ExcelChartDefinition -Row 1 -Column 1 -SeriesHeader $dataPlot `
|
||||||
|
-XRange symbol -YRange $dataPlot `
|
||||||
|
-Title "$($dataPlot)`r`n As Of $((Get-Date).ToShortDateString())"
|
||||||
|
|
||||||
|
$(foreach ($name in $result.psobject.Properties.name) {
|
||||||
|
$result.$name.quote
|
||||||
|
}) | Export-Excel $xlfile -AutoNameRange -AutoSize -Show -ExcelChartDefinition $ecd -StartRow 21 -StartColumn 2
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,20 +0,0 @@
|
|||||||
<#
|
|
||||||
Revisit I think yahoo deprecated their service
|
|
||||||
#>
|
|
||||||
|
|
||||||
# try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {}
|
|
||||||
|
|
||||||
# $Symbol = "MSFT"
|
|
||||||
|
|
||||||
# . .\Get-StockInfo.ps1
|
|
||||||
|
|
||||||
# Remove-Item *.xlsx -ErrorAction Ignore
|
|
||||||
|
|
||||||
# $chart = New-ExcelChart -XRange Date -YRange Volume `
|
|
||||||
# -ChartType ColumnStacked `
|
|
||||||
# -Column 9 -Title "$Symbol Volume"
|
|
||||||
|
|
||||||
# Get-StockInfo $Symbol 11/2 11/30 |
|
|
||||||
# Export-Excel .\stocks.xlsx -Show `
|
|
||||||
# -AutoSize -AutoNameRange `
|
|
||||||
# -ExcelChartDefinition $chart
|
|
||||||
3
Examples/Stocks/GetStocksAvgTotVol.ps1
Normal file
3
Examples/Stocks/GetStocksAvgTotVol.ps1
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
. $PSScriptRoot\Get-StockInfo.ps1
|
||||||
|
|
||||||
|
Get-StockInfo -symbols "msft,ibm,ge,xom,aapl" -dataPlot avgTotalVolume
|
||||||
Binary file not shown.
35
Examples/Styles/MultipleStyles.ps1
Normal file
35
Examples/Styles/MultipleStyles.ps1
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
try { . $PSScriptRoot\..\..\LoadPSD1.ps1 } catch { }
|
||||||
|
|
||||||
|
$xlfile = "$env:TEMP\test.xlsx"
|
||||||
|
Remove-Item $xlfile -ErrorAction SilentlyContinue
|
||||||
|
|
||||||
|
$data = ConvertFrom-Csv @"
|
||||||
|
Region,Item,TotalSold
|
||||||
|
North,melon,38
|
||||||
|
South,screwdriver,21
|
||||||
|
South,peach,33
|
||||||
|
South,saw,81
|
||||||
|
South,kiwi,70
|
||||||
|
North,orange,59
|
||||||
|
North,avocado,25
|
||||||
|
South,lime,48
|
||||||
|
South,nail,83
|
||||||
|
North,apple,2
|
||||||
|
"@
|
||||||
|
|
||||||
|
$styleParams = @{
|
||||||
|
FontSize = 13
|
||||||
|
Bold = $true
|
||||||
|
}
|
||||||
|
|
||||||
|
$styles = $(
|
||||||
|
New-ExcelStyle -BackgroundColor LightBlue -FontSize 14 -Bold -Range "A1:H1" -HorizontalAlignment Center -Merge
|
||||||
|
|
||||||
|
New-ExcelStyle -BackgroundColor LimeGreen -Range "B10" @styleParams
|
||||||
|
New-ExcelStyle -BackgroundColor PeachPuff -Range "B5" @styleParams
|
||||||
|
New-ExcelStyle -BackgroundColor Orange -Range "B8" @styleParams
|
||||||
|
New-ExcelStyle -BackgroundColor Red -Range "B12" @styleParams
|
||||||
|
)
|
||||||
|
|
||||||
|
$reportTitle = "This is a report Title"
|
||||||
|
$data | Export-Excel $xlfile -Show -AutoSize -AutoFilter -Title $reportTitle -Style $styles
|
||||||
23
Examples/Styles/NewExcelStyle.ps1
Normal file
23
Examples/Styles/NewExcelStyle.ps1
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
# https://raw.githubusercontent.com/dfinke/ImportExcel/master/images/NewExcelStyle.png
|
||||||
|
try { . $PSScriptRoot\..\..\LoadPSD1.ps1 } catch { }
|
||||||
|
|
||||||
|
$xlfile = "$env:TEMP\test.xlsx"
|
||||||
|
Remove-Item $xlfile -ErrorAction SilentlyContinue
|
||||||
|
|
||||||
|
$data = ConvertFrom-Csv @"
|
||||||
|
Region,Item,TotalSold
|
||||||
|
North,melon,38
|
||||||
|
South,screwdriver,21
|
||||||
|
South,peach,33
|
||||||
|
South,saw,81
|
||||||
|
South,kiwi,70
|
||||||
|
North,orange,59
|
||||||
|
North,avocado,25
|
||||||
|
South,lime,48
|
||||||
|
South,nail,83
|
||||||
|
North,apple,2
|
||||||
|
"@
|
||||||
|
|
||||||
|
$reportTitle = "This is a report Title"
|
||||||
|
$style = New-ExcelStyle -BackgroundColor LightBlue -FontSize 14 -Bold -Range "A1:H1" -HorizontalAlignment Center -Merge
|
||||||
|
$data | Export-Excel $xlfile -Show -AutoSize -AutoFilter -Title $reportTitle -Style $style
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {}
|
try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {}
|
||||||
|
|
||||||
$xlfile = "testData.xlsx"
|
$xlfile = "$env:Temp\testData.xlsx"
|
||||||
Remove-Item *.xlsx
|
Remove-Item $xlfile -ErrorAction SilentlyContinue
|
||||||
|
|
||||||
$r = Get-ChildItem C:\WINDOWS\system32
|
$r = Get-ChildItem C:\WINDOWS\system32
|
||||||
|
|
||||||
@@ -23,16 +23,19 @@ $top10ByFileSize = $r |
|
|||||||
Select-Object -First 10 Name, @{n="Size";e={$_.Length}} #,Extension,Path
|
Select-Object -First 10 Name, @{n="Size";e={$_.Length}} #,Extension,Path
|
||||||
|
|
||||||
|
|
||||||
$top10BySize | Export-Excel $xlfile -WorkSheetname FileInfo -TableName ExtSize
|
$xlPkg = $top10BySize | Export-Excel -path $xlfile -WorkSheetname FileInfo -TableName ExtSize -PassThru
|
||||||
$top10ByCount | Export-Excel $xlfile -WorkSheetname FileInfo -StartRow 13 -TableName ExtCount
|
$xlPkg = $top10ByCount | Export-Excel -ExcelPackage $xlPkg -WorkSheetname FileInfo -StartRow 13 -TableName ExtCount -PassThru
|
||||||
$top10ByFileSize | Export-Excel $xlfile -WorkSheetname FileInfo -StartRow 25 -AutoSize -TableName FileSize
|
$xlPkg = $top10ByFileSize | Export-Excel -ExcelPackage $xlPkg -WorkSheetname FileInfo -StartRow 25 -TableName FileSize -PassThru -AutoSize
|
||||||
|
|
||||||
|
#worksheets.tables["Name1","Name2"] returns 2 tables. Set-ExcelRange can process those and will set the number format over both
|
||||||
|
Set-ExcelRange -Range $xlpkg.Workbook.Worksheets[1].Tables["ExtSize","FileSize"] -NumberFormat '0,,"MB"'
|
||||||
|
|
||||||
$ps = Get-Process | Where-Object Company
|
$ps = Get-Process | Where-Object Company
|
||||||
|
|
||||||
$ps |
|
$ps |
|
||||||
Sort-Object handles -Descending |
|
Sort-Object handles -Descending |
|
||||||
Select-Object -First 10 company, handles |
|
Select-Object -First 10 company, handles |
|
||||||
Export-Excel $xlfile -WorkSheetname Handles -AutoSize -TableName Handles
|
Export-Excel -ExcelPackage $xlPkg -WorkSheetname Handles -AutoSize -TableName Handles
|
||||||
|
|
||||||
$ps |
|
$ps |
|
||||||
Sort-Object PM -Descending |
|
Sort-Object PM -Descending |
|
||||||
|
|||||||
Binary file not shown.
90
Examples/TestRestAPI/PSExcelPester.psm1
Normal file
90
Examples/TestRestAPI/PSExcelPester.psm1
Normal file
@@ -0,0 +1,90 @@
|
|||||||
|
function ConvertTo-PesterTest {
|
||||||
|
param(
|
||||||
|
[parameter(Mandatory)]
|
||||||
|
$XlFilename,
|
||||||
|
$WorksheetName = 'Sheet1'
|
||||||
|
)
|
||||||
|
|
||||||
|
$testFileName = "{0}.tests.ps1" -f (get-date).ToString("yyyyMMddHHmmss")
|
||||||
|
|
||||||
|
$records = Import-Excel $XlFilename
|
||||||
|
|
||||||
|
$params = @{}
|
||||||
|
|
||||||
|
$blocks = $(foreach ($record in $records) {
|
||||||
|
foreach ($propertyName in $record.psobject.properties.name) {
|
||||||
|
if ($propertyName -notmatch 'ExpectedResult|QueryString') {
|
||||||
|
$params.$propertyName = $record.$propertyName
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($record.QueryString) {
|
||||||
|
$params.Uri += "?{0}" -f $record.QueryString
|
||||||
|
}
|
||||||
|
|
||||||
|
@"
|
||||||
|
|
||||||
|
it "Should have the expected result '$($record.ExpectedResult)'" {
|
||||||
|
`$target = '$($params | ConvertTo-Json -compress)' | ConvertFrom-Json
|
||||||
|
|
||||||
|
`$target.psobject.Properties.name | ForEach-Object {`$p=@{}} {`$p.`$_=`$(`$target.`$_)}
|
||||||
|
|
||||||
|
Invoke-RestMethod @p | Should Be '$($record.ExpectedResult)'
|
||||||
|
}
|
||||||
|
|
||||||
|
"@
|
||||||
|
})
|
||||||
|
|
||||||
|
@"
|
||||||
|
Describe "Tests from $($XlFilename) in $($WorksheetName)" {
|
||||||
|
$($blocks)
|
||||||
|
}
|
||||||
|
"@ | Set-Content -Encoding Ascii $testFileName
|
||||||
|
|
||||||
|
[PSCustomObject]@{
|
||||||
|
TestFileName = (Get-ChildItem $testFileName).FullName
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function Show-PesterResult {
|
||||||
|
param(
|
||||||
|
[Parameter(ValueFromPipelineByPropertyName, Mandatory)]
|
||||||
|
$TestFileName
|
||||||
|
)
|
||||||
|
|
||||||
|
Begin {
|
||||||
|
$xlfilename = ".\test.xlsx"
|
||||||
|
Remove-Item $xlfilename -ErrorAction SilentlyContinue
|
||||||
|
|
||||||
|
$ConditionalText = @()
|
||||||
|
$ConditionalText += New-ConditionalText -Range "Result" -Text failed -BackgroundColor red -ConditionalTextColor black
|
||||||
|
$ConditionalText += New-ConditionalText -Range "Result" -Text passed -BackgroundColor green -ConditionalTextColor black
|
||||||
|
$ConditionalText += New-ConditionalText -Range "Result" -Text pending -BackgroundColor gray -ConditionalTextColor black
|
||||||
|
|
||||||
|
$xlParams = @{
|
||||||
|
Path = $xlfilename
|
||||||
|
WorkSheetname = 'PesterTests'
|
||||||
|
ConditionalText = $ConditionalText
|
||||||
|
PivotRows = 'Result', 'Name'
|
||||||
|
PivotData = @{'Result' = 'Count'}
|
||||||
|
IncludePivotTable = $true
|
||||||
|
AutoSize = $true
|
||||||
|
AutoNameRange = $true
|
||||||
|
AutoFilter = $true
|
||||||
|
Show = $true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
End {
|
||||||
|
|
||||||
|
$(foreach ($result in (Invoke-Pester -Script $TestFileName -PassThru -Show None).TestResult) {
|
||||||
|
[PSCustomObject][Ordered]@{
|
||||||
|
Description = $result.Describe
|
||||||
|
Name = $result.Name
|
||||||
|
Result = $result.Result
|
||||||
|
Messge = $result.FailureMessage
|
||||||
|
StackTrace = $result.StackTrace
|
||||||
|
}
|
||||||
|
}) | Export-Excel @xlParams
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,40 +1,32 @@
|
|||||||
function Show-PesterResults {
|
function Show-PesterResults {
|
||||||
$xlfilename=".\test.xlsx"
|
$xlfilename = ".\test.xlsx"
|
||||||
rm $xlfilename -ErrorAction Ignore
|
Remove-Item $xlfilename -ErrorAction Ignore
|
||||||
|
|
||||||
$ConditionalText = @()
|
$ConditionalText = @()
|
||||||
$ConditionalText += New-ConditionalText -Range "Result" -Text failed -BackgroundColor red -ConditionalTextColor black
|
$ConditionalText += New-ConditionalText -Range "Result" -Text failed -BackgroundColor red -ConditionalTextColor black
|
||||||
$ConditionalText += New-ConditionalText -Range "Result" -Text passed -BackgroundColor green -ConditionalTextColor black
|
$ConditionalText += New-ConditionalText -Range "Result" -Text passed -BackgroundColor green -ConditionalTextColor black
|
||||||
$ConditionalText += New-ConditionalText -Range "Result" -Text pending -BackgroundColor gray -ConditionalTextColor black
|
$ConditionalText += New-ConditionalText -Range "Result" -Text pending -BackgroundColor gray -ConditionalTextColor black
|
||||||
|
|
||||||
$xlParams = @{
|
$xlParams = @{
|
||||||
Path=$xlfilename
|
Path = $xlfilename
|
||||||
WorkSheetname = 'PesterTests'
|
WorkSheetname = 'PesterTests'
|
||||||
ConditionalText=$ConditionalText
|
ConditionalText = $ConditionalText
|
||||||
PivotRows = 'Description'
|
PivotRows = 'Result', 'Name'
|
||||||
PivotColumns = 'Result'
|
PivotData = @{'Result' = 'Count'}
|
||||||
PivotData = @{'Result'='Count'}
|
IncludePivotTable = $true
|
||||||
IncludePivotTable = $true
|
AutoSize = $true
|
||||||
#IncludePivotChart = $true
|
AutoNameRange = $true
|
||||||
#NoLegend = $true
|
AutoFilter = $true
|
||||||
#ShowPercent = $true
|
Show = $true
|
||||||
#ShowCategory = $true
|
|
||||||
AutoSize = $true
|
|
||||||
AutoNameRange = $true
|
|
||||||
AutoFilter = $true
|
|
||||||
Show = $true
|
|
||||||
}
|
}
|
||||||
|
|
||||||
$(foreach($result in (Invoke-Pester -PassThru -Show None).TestResult) {
|
$(foreach ($result in (Invoke-Pester -PassThru -Show None).TestResult) {
|
||||||
|
[PSCustomObject]@{
|
||||||
[PSCustomObject]@{
|
Description = $result.Describe
|
||||||
Description = $result.Describe
|
Name = $result.Name
|
||||||
Name = $result.Name
|
Result = $result.Result
|
||||||
#Time = $result.Time
|
Messge = $result.FailureMessage
|
||||||
Result = $result.Result
|
StackTrace = $result.StackTrace
|
||||||
Messge = $result.FailureMessage
|
}
|
||||||
StackTrace = $result.StackTrace
|
}) | Sort-Object Description | Export-Excel @xlParams
|
||||||
}
|
|
||||||
|
|
||||||
}) | Sort Description | Export-Excel @xlParams
|
|
||||||
}
|
}
|
||||||
@@ -1,5 +1,3 @@
|
|||||||
try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {}
|
|
||||||
|
|
||||||
function Test-APIReadXls {
|
function Test-APIReadXls {
|
||||||
param(
|
param(
|
||||||
[parameter(Mandatory)]
|
[parameter(Mandatory)]
|
||||||
@@ -7,6 +5,8 @@ function Test-APIReadXls {
|
|||||||
$WorksheetName = 'Sheet1'
|
$WorksheetName = 'Sheet1'
|
||||||
)
|
)
|
||||||
|
|
||||||
|
$testFileName = "{0}.tests.ps1" -f (get-date).ToString("yyyyMMddHHmmss")
|
||||||
|
|
||||||
$records = Import-Excel $XlFilename
|
$records = Import-Excel $XlFilename
|
||||||
|
|
||||||
$params = @{}
|
$params = @{}
|
||||||
@@ -35,15 +35,11 @@ function Test-APIReadXls {
|
|||||||
"@
|
"@
|
||||||
})
|
})
|
||||||
|
|
||||||
$testFileName = "{0}.tests.ps1" -f (get-date).ToString("yyyyMMddHHmmss.fff")
|
|
||||||
|
|
||||||
@"
|
@"
|
||||||
Describe "Tests from $($XlFilename) in $($WorksheetName)" {
|
Describe "Tests from $($XlFilename) in $($WorksheetName)" {
|
||||||
$($blocks)
|
$($blocks)
|
||||||
}
|
}
|
||||||
"@ | Set-Content -Encoding Ascii $testFileName
|
"@ | Set-Content -Encoding Ascii $testFileName
|
||||||
|
|
||||||
#Invoke-Pester -Script (Get-ChildItem $testFileName)
|
(Get-ChildItem $testFileName).FullName
|
||||||
Get-ChildItem $testFileName
|
}
|
||||||
}
|
|
||||||
|
|
||||||
@@ -2,6 +2,6 @@ try {. $PSScriptRoot\..\..\LoadPSD1.ps1} catch {}
|
|||||||
|
|
||||||
. $PSScriptRoot\TestAPIReadXls.ps1
|
. $PSScriptRoot\TestAPIReadXls.ps1
|
||||||
|
|
||||||
Test-APIReadXls $PSScriptRoot\testlist.xlsx | % {
|
Test-APIReadXls $PSScriptRoot\testlist.xlsx | Foreach-Object {
|
||||||
Invoke-Pester -Script $_.fullname -PassThru -Show None
|
Invoke-Pester -Script $_.fullname -PassThru -Show None
|
||||||
}
|
}
|
||||||
Binary file not shown.
38
Examples/VBA/HelloWorldVBA.ps1
Normal file
38
Examples/VBA/HelloWorldVBA.ps1
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
$xlfile = "$env:temp\test.xlsm"
|
||||||
|
Remove-Item $xlfile -ErrorAction SilentlyContinue
|
||||||
|
|
||||||
|
$Excel = ConvertFrom-Csv @"
|
||||||
|
Region,Item,TotalSold
|
||||||
|
West,screwdriver,98
|
||||||
|
West,kiwi,19
|
||||||
|
North,kiwi,47
|
||||||
|
West,screws,48
|
||||||
|
West,avocado,52
|
||||||
|
East,avocado,40
|
||||||
|
South,drill,61
|
||||||
|
North,orange,92
|
||||||
|
South,drill,29
|
||||||
|
South,saw,36
|
||||||
|
"@ | Export-Excel $xlfile -PassThru -AutoSize
|
||||||
|
|
||||||
|
$wb = $Excel.Workbook
|
||||||
|
$sheet = $wb.Worksheets["Sheet1"]
|
||||||
|
$wb.CreateVBAProject()
|
||||||
|
|
||||||
|
$code = @"
|
||||||
|
Public Function HelloWorld() As String
|
||||||
|
HelloWorld = "Hello World"
|
||||||
|
End Function
|
||||||
|
|
||||||
|
Public Function DoSum() As Integer
|
||||||
|
DoSum = Application.Sum(Range("C:C"))
|
||||||
|
End Function
|
||||||
|
"@
|
||||||
|
|
||||||
|
$module = $wb.VbaProject.Modules.AddModule("PSExcelModule")
|
||||||
|
$module.Code = $code
|
||||||
|
|
||||||
|
Set-Format -WorkSheet $sheet -Range "h7" -Formula "HelloWorld()" -AutoSize
|
||||||
|
Set-Format -WorkSheet $sheet -Range "h8" -Formula "DoSum()" -AutoSize
|
||||||
|
|
||||||
|
Close-ExcelPackage $Excel -Show
|
||||||
1422
Export-Excel.ps1
1422
Export-Excel.ps1
File diff suppressed because it is too large
Load Diff
28
Export-StocksToExcel.ps1
Normal file
28
Export-StocksToExcel.ps1
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
function Export-StocksToExcel {
|
||||||
|
param(
|
||||||
|
[string]$symbols,
|
||||||
|
[ValidateSet("Open", "High", "Low", "Close", "Volume")]
|
||||||
|
$measure = "Open"
|
||||||
|
)
|
||||||
|
|
||||||
|
$xl = "$env:TEMP\Stocks.xlsx"
|
||||||
|
|
||||||
|
Remove-Item $xl -ErrorAction SilentlyContinue
|
||||||
|
|
||||||
|
$r = Invoke-RestMethod "https://azfnstockdata-fn83fffd32.azurewebsites.net/api/GetQuoteChart?symbol=$($symbols)"
|
||||||
|
|
||||||
|
$chartColumn = $symbols.Split(',').count + 2
|
||||||
|
$ptd = New-PivotTableDefinition `
|
||||||
|
-SourceWorkSheet Sheet1 `
|
||||||
|
-PivotTableName result `
|
||||||
|
-PivotData @{$measure = 'sum'} `
|
||||||
|
-PivotRows date `
|
||||||
|
-PivotColumns symbol `
|
||||||
|
-ChartType Line `
|
||||||
|
-ChartTitle "Stock - $measure " `
|
||||||
|
-IncludePivotChart -NoTotalsInPivot -ChartColumn $chartColumn -ChartRow 3 -Activate
|
||||||
|
|
||||||
|
$r | Sort-Object Date, symbol | Export-Excel $xl -PivotTableDefinition $ptd -AutoSize -AutoFilter -Show
|
||||||
|
}
|
||||||
|
|
||||||
|
# Export-StocksToExcel -symbols 'ibm,aapl,msft' -measure High
|
||||||
@@ -1,49 +1,49 @@
|
|||||||
<#
|
<#
|
||||||
.Synopsis
|
.Synopsis
|
||||||
Exports the charts in an Excel spreadSheet
|
Exports the charts in an Excel spreadSheet
|
||||||
.Example
|
.Example
|
||||||
Export-Charts .\test.xlsx
|
Export-Charts .\test.xlsx
|
||||||
Exports the charts in test.xlsx to JPEG files in the current directory.
|
Exports the charts in test.xlsx to JPEG files in the current directory.
|
||||||
|
|
||||||
.Example
|
.Example
|
||||||
Export-Charts -path .\test,xlsx -destination [System.Environment+SpecialFolder]::MyDocuments -outputType PNG -passthrough
|
Export-Charts -path .\test,xlsx -destination [System.Environment+SpecialFolder]::MyDocuments -outputType PNG -passthrough
|
||||||
Exports the charts to PNG files in MyDocuments , and returns file objects representing the newly created files
|
Exports the charts to PNG files in MyDocuments , and returns file objects representing the newly created files
|
||||||
|
|
||||||
#>
|
#>
|
||||||
Param (
|
Param (
|
||||||
#Path to the Excel file whose chars we will export.
|
#Path to the Excel file whose chars we will export.
|
||||||
$Path = "C:\Users\public\Documents\stats.xlsx",
|
$Path = "C:\Users\public\Documents\stats.xlsx",
|
||||||
#If specified, output file objects representing the image files
|
#If specified, output file objects representing the image files
|
||||||
[switch]$Passthru,
|
[switch]$Passthru,
|
||||||
#Format to write - JPG by default
|
#Format to write - JPG by default
|
||||||
[ValidateSet("JPG","PNG","GIF")]
|
[ValidateSet("JPG","PNG","GIF")]
|
||||||
$OutputType = "JPG",
|
$OutputType = "JPG",
|
||||||
#Folder to write image files to (defaults to same one as the Excel file is in)
|
#Folder to write image files to (defaults to same one as the Excel file is in)
|
||||||
$Destination
|
$Destination
|
||||||
)
|
)
|
||||||
|
|
||||||
#if no output folder was specified, set destination to the folder where the Excel file came from
|
#if no output folder was specified, set destination to the folder where the Excel file came from
|
||||||
if (-not $Destination) {$Destination = Split-Path -Path $Path -Parent }
|
if (-not $Destination) {$Destination = Split-Path -Path $Path -Parent }
|
||||||
|
|
||||||
#Call up Excel and tell it to open the file.
|
#Call up Excel and tell it to open the file.
|
||||||
try { $excelApp = New-Object -ComObject "Excel.Application" }
|
try { $excelApp = New-Object -ComObject "Excel.Application" }
|
||||||
catch { Write-Warning "Could not start Excel application - which usually means it is not installed." ; return }
|
catch { Write-Warning "Could not start Excel application - which usually means it is not installed." ; return }
|
||||||
|
|
||||||
try { $excelWorkBook = $excelApp.Workbooks.Open($Path) }
|
try { $excelWorkBook = $excelApp.Workbooks.Open($Path) }
|
||||||
catch { Write-Warning -Message "Could not Open $Path." ; return }
|
catch { Write-Warning -Message "Could not Open $Path." ; return }
|
||||||
|
|
||||||
#For each worksheet, for each chart, jump to the chart, create a filename of "WorksheetName_ChartTitle.jpg", and export the file.
|
#For each worksheet, for each chart, jump to the chart, create a filename of "WorksheetName_ChartTitle.jpg", and export the file.
|
||||||
foreach ($excelWorkSheet in $excelWorkBook.Worksheets) {
|
foreach ($excelWorkSheet in $excelWorkBook.Worksheets) {
|
||||||
#note somewhat unusual way of telling excel we want all the charts.
|
#note somewhat unusual way of telling excel we want all the charts.
|
||||||
foreach ($excelchart in $excelWorkSheet.ChartObjects([System.Type]::Missing)) {
|
foreach ($excelchart in $excelWorkSheet.ChartObjects([System.Type]::Missing)) {
|
||||||
#if you don't go to the chart the image will be zero size !
|
#if you don't go to the chart the image will be zero size !
|
||||||
$excelApp.Goto($excelchart.TopLeftCell,$true)
|
$excelApp.Goto($excelchart.TopLeftCell,$true)
|
||||||
$imagePath = Join-Path -Path $Destination -ChildPath ($excelWorkSheet.Name + "_" + ($excelchart.Chart.ChartTitle.Text -split "\s\d\d:\d\d,")[0] + ".$OutputType")
|
$imagePath = Join-Path -Path $Destination -ChildPath ($excelWorkSheet.Name + "_" + ($excelchart.Chart.ChartTitle.Text -split "\s\d\d:\d\d,")[0] + ".$OutputType")
|
||||||
if ( $excelchart.Chart.Export($imagePath, $OutputType, $false) ) { # Export returs true/false for success/failure
|
if ( $excelchart.Chart.Export($imagePath, $OutputType, $false) ) { # Export returs true/false for success/failure
|
||||||
if ($Passthru) {Get-Item -Path $imagePath } # when succesful return a file object (-Passthru) or print a verbose message, write warning for any failures
|
if ($Passthru) {Get-Item -Path $imagePath } # when succesful return a file object (-Passthru) or print a verbose message, write warning for any failures
|
||||||
else {Write-Verbose -Message "Exported $imagePath"}
|
else {Write-Verbose -Message "Exported $imagePath"}
|
||||||
}
|
}
|
||||||
else {Write-Warning -Message "Failure exporting $imagePath" }
|
else {Write-Warning -Message "Failure exporting $imagePath" }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
$excelApp.DisplayAlerts = $false
|
$excelApp.DisplayAlerts = $false
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ Function Get-ExcelSheetInfo {
|
|||||||
$stream = New-Object -TypeName System.IO.FileStream -ArgumentList $Path,'Open','Read','ReadWrite'
|
$stream = New-Object -TypeName System.IO.FileStream -ArgumentList $Path,'Open','Read','ReadWrite'
|
||||||
$xl = New-Object -TypeName OfficeOpenXml.ExcelPackage -ArgumentList $stream
|
$xl = New-Object -TypeName OfficeOpenXml.ExcelPackage -ArgumentList $stream
|
||||||
$workbook = $xl.Workbook
|
$workbook = $xl.Workbook
|
||||||
|
|
||||||
if ($workbook -and $workbook.Worksheets) {
|
if ($workbook -and $workbook.Worksheets) {
|
||||||
$workbook.Worksheets |
|
$workbook.Worksheets |
|
||||||
Select-Object -Property name,index,hidden,@{
|
Select-Object -Property name,index,hidden,@{
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
Function Get-ExcelWorkbookInfo {
|
Function Get-ExcelWorkbookInfo {
|
||||||
<#
|
<#
|
||||||
.SYNOPSIS
|
.SYNOPSIS
|
||||||
Retrieve information of an Excel workbook.
|
Retrieve information of an Excel workbook.
|
||||||
.DESCRIPTION
|
.DESCRIPTION
|
||||||
The Get-ExcelWorkbookInfo cmdlet retrieves information (LastModifiedBy, LastPrinted, Created, Modified, ...) fron an Excel workbook. These are the same details that are visible in Windows Explorer when right clicking the Excel file, selecting Properties and check the Details tabpage.
|
The Get-ExcelWorkbookInfo cmdlet retrieves information (LastModifiedBy, LastPrinted, Created, Modified, ...) fron an Excel workbook. These are the same details that are visible in Windows Explorer when right clicking the Excel file, selecting Properties and check the Details tabpage.
|
||||||
.PARAMETER Path
|
.PARAMETER Path
|
||||||
Specifies the path to the Excel file. This parameter is required.
|
Specifies the path to the Excel file. This parameter is required.
|
||||||
@@ -10,22 +10,22 @@
|
|||||||
Get-ExcelWorkbookInfo .\Test.xlsx
|
Get-ExcelWorkbookInfo .\Test.xlsx
|
||||||
|
|
||||||
CorePropertiesXml : #document
|
CorePropertiesXml : #document
|
||||||
Title :
|
Title :
|
||||||
Subject :
|
Subject :
|
||||||
Author : Konica Minolta User
|
Author : Konica Minolta User
|
||||||
Comments :
|
Comments :
|
||||||
Keywords :
|
Keywords :
|
||||||
LastModifiedBy : Bond, James (London) GBR
|
LastModifiedBy : Bond, James (London) GBR
|
||||||
LastPrinted : 2017-01-21T12:36:11Z
|
LastPrinted : 2017-01-21T12:36:11Z
|
||||||
Created : 17/01/2017 13:51:32
|
Created : 17/01/2017 13:51:32
|
||||||
Category :
|
Category :
|
||||||
Status :
|
Status :
|
||||||
ExtendedPropertiesXml : #document
|
ExtendedPropertiesXml : #document
|
||||||
Application : Microsoft Excel
|
Application : Microsoft Excel
|
||||||
HyperlinkBase :
|
HyperlinkBase :
|
||||||
AppVersion : 14.0300
|
AppVersion : 14.0300
|
||||||
Company : Secret Service
|
Company : Secret Service
|
||||||
Manager :
|
Manager :
|
||||||
Modified : 10/02/2017 12:45:37
|
Modified : 10/02/2017 12:45:37
|
||||||
CustomPropertiesXml : #document
|
CustomPropertiesXml : #document
|
||||||
|
|
||||||
@@ -35,8 +35,8 @@
|
|||||||
|
|
||||||
.LINK
|
.LINK
|
||||||
https://github.com/dfinke/ImportExcel
|
https://github.com/dfinke/ImportExcel
|
||||||
#>
|
#>
|
||||||
|
|
||||||
[CmdletBinding()]
|
[CmdletBinding()]
|
||||||
Param (
|
Param (
|
||||||
[Alias('FullName')]
|
[Alias('FullName')]
|
||||||
@@ -52,12 +52,12 @@
|
|||||||
$xl = New-Object -TypeName OfficeOpenXml.ExcelPackage -ArgumentList $stream
|
$xl = New-Object -TypeName OfficeOpenXml.ExcelPackage -ArgumentList $stream
|
||||||
$workbook = $xl.Workbook
|
$workbook = $xl.Workbook
|
||||||
$workbook.Properties
|
$workbook.Properties
|
||||||
|
|
||||||
$stream.Close()
|
$stream.Close()
|
||||||
$stream.Dispose()
|
$stream.Dispose()
|
||||||
$xl.Dispose()
|
$xl.Dispose()
|
||||||
$xl = $null
|
$xl = $null
|
||||||
}
|
}
|
||||||
Catch {
|
Catch {
|
||||||
throw "Failed retrieving Excel workbook information for '$Path': $_"
|
throw "Failed retrieving Excel workbook information for '$Path': $_"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
# https://www.leeholmes.com/blog/2015/01/05/extracting-tables-from-powershells-invoke-webrequest/
|
||||||
|
# tweaked from the above code
|
||||||
function Get-HtmlTable {
|
function Get-HtmlTable {
|
||||||
param(
|
param(
|
||||||
[Parameter(Mandatory=$true)]
|
[Parameter(Mandatory=$true)]
|
||||||
@@ -9,7 +11,7 @@ function Get-HtmlTable {
|
|||||||
)
|
)
|
||||||
|
|
||||||
$r = Invoke-WebRequest $url -UseDefaultCredentials: $UseDefaultCredentials
|
$r = Invoke-WebRequest $url -UseDefaultCredentials: $UseDefaultCredentials
|
||||||
|
|
||||||
$table = $r.ParsedHtml.getElementsByTagName("table")[$tableIndex]
|
$table = $r.ParsedHtml.getElementsByTagName("table")[$tableIndex]
|
||||||
$propertyNames=$Header
|
$propertyNames=$Header
|
||||||
$totalRows=@($table.rows).count
|
$totalRows=@($table.rows).count
|
||||||
@@ -17,16 +19,16 @@ function Get-HtmlTable {
|
|||||||
for ($idx = $FirstDataRow; $idx -lt $totalRows; $idx++) {
|
for ($idx = $FirstDataRow; $idx -lt $totalRows; $idx++) {
|
||||||
|
|
||||||
$row = $table.rows[$idx]
|
$row = $table.rows[$idx]
|
||||||
$cells = @($row.cells)
|
$cells = @($row.cells)
|
||||||
|
|
||||||
if(!$propertyNames) {
|
if(!$propertyNames) {
|
||||||
if($cells[0].tagName -eq 'th') {
|
if($cells[0].tagName -eq 'th') {
|
||||||
$propertyNames = @($cells | foreach {$_.innertext -replace ' ',''})
|
$propertyNames = @($cells | ForEach-Object {$_.innertext -replace ' ',''})
|
||||||
} else {
|
} else {
|
||||||
$propertyNames = @(1..($cells.Count + 2) | % { "P$_" })
|
$propertyNames = @(1..($cells.Count + 2) | Foreach-Object { "P$_" })
|
||||||
}
|
}
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
$result = [ordered]@{}
|
$result = [ordered]@{}
|
||||||
|
|
||||||
@@ -39,4 +41,4 @@ function Get-HtmlTable {
|
|||||||
|
|
||||||
[PSCustomObject]$result
|
[PSCustomObject]$result
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
function Get-XYRange {
|
function Get-XYRange {
|
||||||
param($targetData)
|
param($targetData)
|
||||||
|
|
||||||
$record = $targetData| select -First 1
|
$record = $targetData | Select-Object -First 1
|
||||||
$p=$record.psobject.Properties.name
|
$p=$record.psobject.Properties.name
|
||||||
|
|
||||||
$infer = for ($idx = 0; $idx -lt $p.Count; $idx++) {
|
$infer = for ($idx = 0; $idx -lt $p.Count; $idx++) {
|
||||||
@@ -20,7 +20,7 @@ function Get-XYRange {
|
|||||||
}
|
}
|
||||||
|
|
||||||
[PSCustomObject]@{
|
[PSCustomObject]@{
|
||||||
XRange = $infer | ? {$_.datatype -match 'string'} | select -First 1 excelcolumn, name
|
XRange = $infer | Where-Object -FilterScript {$_.datatype -match 'string'} | Select-Object -First 1 -Property excelcolumn, name
|
||||||
YRange = $infer | ? {$_.datatype -match 'int|double'} |select -First 1 excelcolumn, name
|
YRange = $infer | Where-Object -FilterScript {$_.datatype -match 'int|double'} | Select-Object -First 1 -Property excelcolumn, name
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -25,7 +25,7 @@ Function Get-ExcelTableName {
|
|||||||
$Stream.Close()
|
$Stream.Close()
|
||||||
$Stream.Dispose()
|
$Stream.Dispose()
|
||||||
$Excel.Dispose()
|
$Excel.Dispose()
|
||||||
$Excel = $null
|
$Excel = $null
|
||||||
}
|
}
|
||||||
|
|
||||||
Function Get-ExcelTable {
|
Function Get-ExcelTable {
|
||||||
@@ -66,7 +66,7 @@ Function Get-ExcelTable {
|
|||||||
$propertyNames = for($col=$startCol; $col -lt ($startCol+$colCount); $col+= 1) {
|
$propertyNames = for($col=$startCol; $col -lt ($startCol+$colCount); $col+= 1) {
|
||||||
$Worksheet.Cells[$startRow, $col].value
|
$Worksheet.Cells[$startRow, $col].value
|
||||||
}
|
}
|
||||||
|
|
||||||
$startRow++
|
$startRow++
|
||||||
for($row=$startRow; $row -lt ($startRow+$rowCount); $row += 1) {
|
for($row=$startRow; $row -lt ($startRow+$rowCount); $row += 1) {
|
||||||
$nr=[ordered]@{}
|
$nr=[ordered]@{}
|
||||||
@@ -89,16 +89,14 @@ function ConvertFrom-ExcelColumnName {
|
|||||||
|
|
||||||
$sum=0
|
$sum=0
|
||||||
$columnName.ToCharArray() |
|
$columnName.ToCharArray() |
|
||||||
ForEach {
|
ForEach-Object {
|
||||||
$sum*=26
|
$sum*=26
|
||||||
$sum+=[char]$_.tostring().toupper()-[char]'A'+1
|
$sum+=[char]$_.tostring().toupper()-[char]'A'+1
|
||||||
}
|
}
|
||||||
$sum
|
$sum
|
||||||
}
|
}
|
||||||
|
|
||||||
cls
|
Import-Module .\ImportExcel.psd1 -Force
|
||||||
|
|
||||||
ipmo .\ImportExcel.psd1 -Force
|
#Get-ExcelTableName .\testTable.xlsx | Get-ExcelTable .\testTable.xlsx
|
||||||
|
|
||||||
#Get-ExcelTableName .\testTable.xlsx | Get-ExcelTable .\testTable.xlsx
|
|
||||||
Get-ExcelTable .\testTable.xlsx Table3
|
Get-ExcelTable .\testTable.xlsx Table3
|
||||||
@@ -2,19 +2,19 @@
|
|||||||
function Import-Html {
|
function Import-Html {
|
||||||
[CmdletBinding()]
|
[CmdletBinding()]
|
||||||
param(
|
param(
|
||||||
$url,
|
$url,
|
||||||
$index,
|
$index,
|
||||||
$Header,
|
$Header,
|
||||||
[int]$FirstDataRow=0,
|
[int]$FirstDataRow=0,
|
||||||
[Switch]$UseDefaultCredentials
|
[Switch]$UseDefaultCredentials
|
||||||
)
|
)
|
||||||
|
|
||||||
$xlFile = [System.IO.Path]::GetTempFileName() -replace "tmp","xlsx"
|
$xlFile = [System.IO.Path]::GetTempFileName() -replace "tmp","xlsx"
|
||||||
rm $xlFile -ErrorAction Ignore
|
Remove-Item $xlFile -ErrorAction Ignore
|
||||||
|
|
||||||
Write-Verbose "Exporting to Excel file $($xlFile)"
|
Write-Verbose "Exporting to Excel file $($xlFile)"
|
||||||
|
|
||||||
$data = Get-HtmlTable -url $url -tableIndex $index -Header $Header -FirstDataRow $FirstDataRow -UseDefaultCredentials: $UseDefaultCredentials
|
$data = Get-HtmlTable -url $url -tableIndex $index -Header $Header -FirstDataRow $FirstDataRow -UseDefaultCredentials: $UseDefaultCredentials
|
||||||
|
|
||||||
$data | Export-Excel $xlFile -Show -AutoSize
|
$data | Export-Excel $xlFile -Show -AutoSize
|
||||||
}
|
}
|
||||||
File diff suppressed because it is too large
Load Diff
226
ImportExcel.psd1
226
ImportExcel.psd1
@@ -1,120 +1,190 @@
|
|||||||
@{
|
@{
|
||||||
|
|
||||||
# Script module or binary module file associated with this manifest.
|
# Script module or binary module file associated with this manifest.
|
||||||
RootModule = 'ImportExcel.psm1'
|
RootModule = 'ImportExcel.psm1'
|
||||||
|
|
||||||
# Version number of this module.
|
# Version number of this module.
|
||||||
ModuleVersion = '5.1.1'
|
ModuleVersion = '6.5.0'
|
||||||
|
|
||||||
# ID used to uniquely identify this module
|
# ID used to uniquely identify this module
|
||||||
GUID = '60dd4136-feff-401a-ba27-a84458c57ede'
|
GUID = '60dd4136-feff-401a-ba27-a84458c57ede'
|
||||||
|
|
||||||
# Author of this module
|
# Author of this module
|
||||||
Author = 'Douglas Finke'
|
Author = 'Douglas Finke'
|
||||||
|
|
||||||
# Company or vendor of this module
|
# Company or vendor of this module
|
||||||
CompanyName = 'Doug Finke'
|
CompanyName = 'Doug Finke'
|
||||||
|
|
||||||
# Copyright statement for this module
|
# Copyright statement for this module
|
||||||
Copyright = 'c 2015 All rights reserved.'
|
Copyright = 'c 2019 All rights reserved.'
|
||||||
|
|
||||||
# Description of the functionality provided by this module
|
# Description of the functionality provided by this module
|
||||||
Description = @'
|
Description = @'
|
||||||
PowerShell module to import/export Excel spreadsheets, without Excel.
|
PowerShell module to import/export Excel spreadsheets, without Excel.
|
||||||
Check out the How To Videos https://www.youtube.com/watch?v=U3Ne_yX4tYo&list=PL5uoqS92stXioZw-u-ze_NtvSo0k0K0kq
|
Check out the How To Videos https://www.youtube.com/watch?v=U3Ne_yX4tYo&list=PL5uoqS92stXioZw-u-ze_NtvSo0k0K0kq
|
||||||
'@
|
'@
|
||||||
|
|
||||||
# Minimum version of the Windows PowerShell engine required by this module
|
# Minimum version of the Windows PowerShell engine required by this module
|
||||||
# PowerShellVersion = ''
|
# PowerShellVersion = ''
|
||||||
|
|
||||||
# Name of the Windows PowerShell host required by this module
|
# Name of the Windows PowerShell host required by this module
|
||||||
# PowerShellHostName = ''
|
# PowerShellHostName = ''
|
||||||
|
|
||||||
# Minimum version of the Windows PowerShell host required by this module
|
# Minimum version of the Windows PowerShell host required by this module
|
||||||
# PowerShellHostVersion = ''
|
# PowerShellHostVersion = ''
|
||||||
|
|
||||||
# Minimum version of Microsoft .NET Framework required by this module
|
# Minimum version of Microsoft .NET Framework required by this module
|
||||||
# DotNetFrameworkVersion = ''
|
# DotNetFrameworkVersion = ''
|
||||||
|
|
||||||
# Minimum version of the common language runtime (CLR) required by this module
|
# Minimum version of the common language runtime (CLR) required by this module
|
||||||
# CLRVersion = ''
|
# CLRVersion = ''
|
||||||
|
|
||||||
# Processor architecture (None, X86, Amd64) required by this module
|
# Processor architecture (None, X86, Amd64) required by this module
|
||||||
# ProcessorArchitecture = ''
|
# ProcessorArchitecture = ''
|
||||||
|
|
||||||
# Modules that must be imported into the global environment prior to importing this module
|
# Modules that must be imported into the global environment prior to importing this module
|
||||||
# RequiredModules = @()
|
# RequiredModules = @()
|
||||||
|
|
||||||
# Assemblies that must be loaded prior to importing this module
|
# Assemblies that must be loaded prior to importing this module
|
||||||
# RequiredAssemblies = @()
|
# RequiredAssemblies = @()
|
||||||
|
|
||||||
# Script files (.ps1) that are run in the caller's environment prior to importing this module.
|
# Script files (.ps1) that are run in the caller's environment prior to importing this module.
|
||||||
# ScriptsToProcess = @()
|
# ScriptsToProcess = @()
|
||||||
|
|
||||||
# Type files (.ps1xml) to be loaded when importing this module
|
# Type files (.ps1xml) to be loaded when importing this module
|
||||||
# TypesToProcess = @()
|
# TypesToProcess = @()
|
||||||
|
|
||||||
# Format files (.ps1xml) to be loaded when importing this module
|
# Format files (.ps1xml) to be loaded when importing this module
|
||||||
# FormatsToProcess = @()
|
# FormatsToProcess = @()
|
||||||
|
|
||||||
# Modules to import as nested modules of the module specified in RootModule/ModuleToProcess
|
# Modules to import as nested modules of the module specified in RootModule/ModuleToProcess
|
||||||
# NestedModules = @()
|
# NestedModules = @()
|
||||||
|
|
||||||
# Functions to export from this module
|
# Functions to export from this module
|
||||||
FunctionsToExport = '*'
|
FunctionsToExport = @(
|
||||||
|
'Add-ConditionalFormatting',
|
||||||
|
'Add-ExcelChart',
|
||||||
|
'Add-ExcelDataValidationRule',
|
||||||
|
'Add-ExcelName',
|
||||||
|
'Add-ExcelTable',
|
||||||
|
'Add-PivotTable',
|
||||||
|
'Add-WorkSheet',
|
||||||
|
'BarChart',
|
||||||
|
'Close-ExcelPackage',
|
||||||
|
'ColumnChart',
|
||||||
|
'Compare-WorkSheet',
|
||||||
|
'Convert-XlRangeToImage',
|
||||||
|
'ConvertFrom-ExcelData',
|
||||||
|
'ConvertFrom-ExcelSheet',
|
||||||
|
'ConvertFrom-ExcelToSQLInsert',
|
||||||
|
'ConvertTo-ExcelXlsx',
|
||||||
|
'Copy-ExcelWorkSheet',
|
||||||
|
'DoChart',
|
||||||
|
'Expand-NumberFormat',
|
||||||
|
'Export-Excel',
|
||||||
|
'Export-ExcelSheet',
|
||||||
|
'Export-MultipleExcelSheets',
|
||||||
|
'Get-ExcelColumnName',
|
||||||
|
'Get-ExcelSheetInfo',
|
||||||
|
'Get-ExcelWorkbookInfo',
|
||||||
|
'Get-HtmlTable',
|
||||||
|
'Get-Range',
|
||||||
|
'Get-XYRange',
|
||||||
|
'Import-Excel',
|
||||||
|
'Import-Html',
|
||||||
|
'Import-UPS',
|
||||||
|
'Import-USPS',
|
||||||
|
'Invoke-AllTests',
|
||||||
|
'Invoke-Sum',
|
||||||
|
'Join-Worksheet',
|
||||||
|
'LineChart',
|
||||||
|
'Merge-MultipleSheets',
|
||||||
|
'Merge-Worksheet',
|
||||||
|
'New-ConditionalFormattingIconSet',
|
||||||
|
'New-ConditionalText',
|
||||||
|
'New-ExcelChartDefinition',
|
||||||
|
'New-ExcelStyle',
|
||||||
|
'New-PivotTableDefinition',
|
||||||
|
'New-Plot',
|
||||||
|
'New-PSItem',
|
||||||
|
'NumberFormatCompletion',
|
||||||
|
'Open-ExcelPackage',
|
||||||
|
'PieChart',
|
||||||
|
'Pivot',
|
||||||
|
'Remove-WorkSheet'
|
||||||
|
'Select-Worksheet',
|
||||||
|
'Send-SQLDataToExcel',
|
||||||
|
'Set-CellStyle',
|
||||||
|
'Set-ExcelColumn',
|
||||||
|
'Set-ExcelRange',
|
||||||
|
'Set-ExcelRow',
|
||||||
|
'Set-WorkSheetProtection',
|
||||||
|
'Test-Boolean',
|
||||||
|
'Test-Date',
|
||||||
|
'Test-Integer',
|
||||||
|
'Test-Number',
|
||||||
|
'Test-String',
|
||||||
|
'Update-FirstObjectProperties'
|
||||||
|
)
|
||||||
|
|
||||||
# Cmdlets to export from this module
|
# Cmdlets to export from this module
|
||||||
CmdletsToExport = '*'
|
#CmdletsToExport = '*'
|
||||||
|
|
||||||
# Variables to export from this module
|
# Variables to export from this module
|
||||||
VariablesToExport = '*'
|
#VariablesToExport = '*'
|
||||||
|
|
||||||
# Aliases to export from this module
|
# Aliases to export from this module
|
||||||
AliasesToExport = '*'
|
AliasesToExport = @(
|
||||||
|
'New-ExcelChart',
|
||||||
|
'Set-Column',
|
||||||
|
'Set-Format',
|
||||||
|
'Set-Row',
|
||||||
|
'Use-ExcelData'
|
||||||
|
)
|
||||||
|
|
||||||
# List of all modules packaged with this module
|
# List of all modules packaged with this module
|
||||||
# ModuleList = @()
|
# ModuleList = @()
|
||||||
|
|
||||||
# List of all files packaged with this module
|
# List of all files packaged with this module
|
||||||
# FileList = @()
|
# FileList = @()
|
||||||
|
|
||||||
# Private data to pass to the module specified in RootModule/ModuleToProcess
|
# Private data to pass to the module specified in RootModule/ModuleToProcess
|
||||||
PrivateData = @{
|
PrivateData = @{
|
||||||
# PSData is module packaging and gallery metadata embedded in PrivateData
|
# PSData is module packaging and gallery metadata embedded in PrivateData
|
||||||
# It's for rebuilding PowerShellGet (and PoshCode) NuGet-style packages
|
# It's for rebuilding PowerShellGet (and PoshCode) NuGet-style packages
|
||||||
# We had to do this because it's the only place we're allowed to extend the manifest
|
# We had to do this because it's the only place we're allowed to extend the manifest
|
||||||
# https://connect.microsoft.com/PowerShell/feedback/details/421837
|
# https://connect.microsoft.com/PowerShell/feedback/details/421837
|
||||||
PSData = @{
|
PSData = @{
|
||||||
# The primary categorization of this module (from the TechNet Gallery tech tree).
|
# The primary categorization of this module (from the TechNet Gallery tech tree).
|
||||||
Category = "Scripting Excel"
|
Category = "Scripting Excel"
|
||||||
|
|
||||||
# Keyword tags to help users find this module via navigations and search.
|
# Keyword tags to help users find this module via navigations and search.
|
||||||
Tags = @("Excel","EPPlus","Export","Import")
|
Tags = @("Excel", "EPPlus", "Export", "Import")
|
||||||
|
|
||||||
# The web address of an icon which can be used in galleries to represent this module
|
# The web address of an icon which can be used in galleries to represent this module
|
||||||
#IconUri = "http://pesterbdd.com/images/Pester.png"
|
#IconUri = "http://pesterbdd.com/images/Pester.png"
|
||||||
|
|
||||||
# The web address of this module's project or support homepage.
|
# The web address of this module's project or support homepage.
|
||||||
ProjectUri = "https://github.com/dfinke/ImportExcel"
|
ProjectUri = "https://github.com/dfinke/ImportExcel"
|
||||||
|
|
||||||
# The web address of this module's license. Points to a page that's embeddable and linkable.
|
# The web address of this module's license. Points to a page that's embeddable and linkable.
|
||||||
LicenseUri = "https://github.com/dfinke/ImportExcel/blob/master/LICENSE.txt"
|
LicenseUri = "https://github.com/dfinke/ImportExcel/blob/master/LICENSE.txt"
|
||||||
|
|
||||||
# Release notes for this particular version of the module
|
# Release notes for this particular version of the module
|
||||||
#ReleaseNotes = $True
|
#ReleaseNotes = $True
|
||||||
|
|
||||||
# If true, the LicenseUrl points to an end-user license (not just a source license) which requires the user agreement before use.
|
# If true, the LicenseUrl points to an end-user license (not just a source license) which requires the user agreement before use.
|
||||||
# RequireLicenseAcceptance = ""
|
# RequireLicenseAcceptance = ""
|
||||||
|
|
||||||
# Indicates this is a pre-release/testing version of the module.
|
# Indicates this is a pre-release/testing version of the module.
|
||||||
IsPrerelease = 'False'
|
IsPrerelease = 'False'
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
# HelpInfo URI of this module
|
# HelpInfo URI of this module
|
||||||
# HelpInfoURI = ''
|
# HelpInfoURI = ''
|
||||||
|
|
||||||
# Default prefix for commands exported from this module. Override the default prefix using Import-Module -Prefix.
|
# Default prefix for commands exported from this module. Override the default prefix using Import-Module -Prefix.
|
||||||
# DefaultCommandPrefix = ''
|
# DefaultCommandPrefix = ''
|
||||||
|
|
||||||
}
|
}
|
||||||
315
ImportExcel.psm1
315
ImportExcel.psm1
@@ -1,74 +1,84 @@
|
|||||||
#region import everything we need
|
#region import everything we need
|
||||||
Add-Type -Path "$($PSScriptRoot)\EPPlus.dll"
|
Add-Type -Path "$($PSScriptRoot)\EPPlus.dll"
|
||||||
. $PSScriptRoot\AddConditionalFormatting.ps1
|
. $PSScriptRoot\AddConditionalFormatting.ps1
|
||||||
. $PSScriptRoot\Charting.ps1
|
. $PSScriptRoot\AddDataValidation.ps1
|
||||||
. $PSScriptRoot\ColorCompletion.ps1
|
. $PSScriptRoot\Charting.ps1
|
||||||
. $PSScriptRoot\ConvertExcelToImageFile.ps1
|
. $PSScriptRoot\ColorCompletion.ps1
|
||||||
. $PSScriptRoot\Compare-WorkSheet.ps1
|
. $PSScriptRoot\ConvertExcelToImageFile.ps1
|
||||||
. $PSScriptRoot\ConvertFromExcelData.ps1
|
. $PSScriptRoot\compare-workSheet.ps1
|
||||||
. $PSScriptRoot\ConvertFromExcelToSQLInsert.ps1
|
. $PSScriptRoot\ConvertFromExcelData.ps1
|
||||||
. $PSScriptRoot\ConvertToExcelXlsx.ps1
|
. $PSScriptRoot\ConvertFromExcelToSQLInsert.ps1
|
||||||
. $PSScriptRoot\Copy-ExcelWorkSheet.ps1
|
. $PSScriptRoot\ConvertToExcelXlsx.ps1
|
||||||
. $PSScriptRoot\Export-Excel.ps1
|
. $PSScriptRoot\Copy-ExcelWorkSheet.ps1
|
||||||
. $PSScriptRoot\Export-ExcelSheet.ps1
|
. $PSScriptRoot\Export-Excel.ps1
|
||||||
. $PSScriptRoot\Get-ExcelColumnName.ps1
|
. $PSScriptRoot\Export-ExcelSheet.ps1
|
||||||
. $PSScriptRoot\Get-ExcelSheetInfo.ps1
|
. $PSScriptRoot\Export-StocksToExcel.ps1
|
||||||
. $PSScriptRoot\Get-ExcelWorkbookInfo.ps1
|
. $PSScriptRoot\Get-ExcelColumnName.ps1
|
||||||
. $PSScriptRoot\Get-HtmlTable.ps1
|
. $PSScriptRoot\Get-ExcelSheetInfo.ps1
|
||||||
. $PSScriptRoot\Get-Range.ps1
|
. $PSScriptRoot\Get-ExcelWorkbookInfo.ps1
|
||||||
. $PSScriptRoot\Get-XYRange.ps1
|
. $PSScriptRoot\Get-HtmlTable.ps1
|
||||||
. $PSScriptRoot\Import-Html.ps1
|
. $PSScriptRoot\Get-Range.ps1
|
||||||
. $PSScriptRoot\InferData.ps1
|
. $PSScriptRoot\Get-XYRange.ps1
|
||||||
. $PSScriptRoot\Invoke-Sum.ps1
|
. $PSScriptRoot\Import-Html.ps1
|
||||||
. $PSScriptRoot\Join-WorkSheet.ps1
|
. $PSScriptRoot\InferData.ps1
|
||||||
. $PSScriptRoot\Merge-Worksheet.ps1
|
. $PSScriptRoot\Invoke-Sum.ps1
|
||||||
. $PSScriptRoot\New-ConditionalFormattingIconSet.ps1
|
. $PSScriptRoot\Join-Worksheet.ps1
|
||||||
. $PSScriptRoot\New-ConditionalText.ps1
|
. $PSScriptRoot\Merge-worksheet.ps1
|
||||||
. $PSScriptRoot\New-ExcelChart.ps1
|
. $PSScriptRoot\New-ConditionalFormattingIconSet.ps1
|
||||||
. $PSScriptRoot\New-PSItem.ps1
|
. $PSScriptRoot\New-ConditionalText.ps1
|
||||||
. $PSScriptRoot\Open-ExcelPackage.ps1
|
. $PSScriptRoot\New-ExcelChart.ps1
|
||||||
. $PSScriptRoot\Pivot.ps1
|
. $PSScriptRoot\New-PSItem.ps1
|
||||||
. $PSScriptRoot\Send-SQLDataToExcel.ps1
|
. $PSScriptRoot\Open-ExcelPackage.ps1
|
||||||
. $PSScriptRoot\Set-CellStyle.ps1
|
. $PSScriptRoot\Pivot.ps1
|
||||||
. $PSScriptRoot\Set-Column.ps1
|
. $PSScriptRoot\PivotTable.ps1
|
||||||
. $PSScriptRoot\Set-Row.ps1
|
. $PSScriptRoot\RemoveWorksheet.ps1
|
||||||
. $PSScriptRoot\SetFormat.ps1
|
. $PSScriptRoot\Send-SqlDataToExcel.ps1
|
||||||
. $PSScriptRoot\TrackingUtils.ps1
|
. $PSScriptRoot\Set-CellStyle.ps1
|
||||||
. $PSScriptRoot\Update-FirstObjectProperties.ps1
|
. $PSScriptRoot\Set-Column.ps1
|
||||||
|
. $PSScriptRoot\Set-Row.ps1
|
||||||
|
. $PSScriptRoot\Set-WorkSheetProtection.ps1
|
||||||
|
. $PSScriptRoot\SetFormat.ps1
|
||||||
|
. $PSScriptRoot\TrackingUtils.ps1
|
||||||
|
. $PSScriptRoot\Update-FirstObjectProperties.ps1
|
||||||
|
|
||||||
|
|
||||||
New-Alias -Name Use-ExcelData -Value "ConvertFrom-ExcelData" -Force
|
New-Alias -Name Use-ExcelData -Value "ConvertFrom-ExcelData" -Force
|
||||||
|
|
||||||
if ($PSVersionTable.PSVersion.Major -ge 5) {
|
if ($PSVersionTable.PSVersion.Major -ge 5) {
|
||||||
. $PSScriptRoot\Plot.ps1
|
. $PSScriptRoot\plot.ps1
|
||||||
|
|
||||||
Function New-Plot {
|
Function New-Plot {
|
||||||
Param()
|
[Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseShouldProcessForStateChangingFunctions', '', Justification = 'New-Plot does not change system state')]
|
||||||
|
Param()
|
||||||
[PSPlot]::new()
|
|
||||||
}
|
|
||||||
|
|
||||||
|
[PSPlot]::new()
|
||||||
}
|
}
|
||||||
else {
|
|
||||||
Write-Warning 'PowerShell 5 is required for plot.ps1'
|
}
|
||||||
Write-Warning 'PowerShell Excel is ready, except for that functionality'
|
else {
|
||||||
}
|
Write-Warning 'PowerShell 5 is required for plot.ps1'
|
||||||
|
Write-Warning 'PowerShell Excel is ready, except for that functionality'
|
||||||
|
}
|
||||||
#endregion
|
#endregion
|
||||||
function Import-Excel {
|
function Import-Excel {
|
||||||
<#
|
<#
|
||||||
.SYNOPSIS
|
.SYNOPSIS
|
||||||
Create custom objects from the rows in an Excel worksheet.
|
Create custom objects from the rows in an Excel worksheet.
|
||||||
|
|
||||||
.DESCRIPTION
|
.DESCRIPTION
|
||||||
The Import-Excel cmdlet creates custom objects from the rows in an Excel worksheet. Each row represents one object. All of this is possible without installing Microsoft Excel and by using the .NET library ‘EPPLus.dll’.
|
The Import-Excel cmdlet creates custom objects from the rows in an Excel worksheet. Each row represents one object. All of this is possible without installing Microsoft Excel and by using the .NET library ‘EPPLus.dll’.
|
||||||
|
|
||||||
By default, the property names of the objects are retrieved from the column headers. Because an object cannot have a blanc property name, only columns with column headers will be imported.
|
By default, the property names of the objects are retrieved from the column headers. Because an object cannot have a blank property name, only columns with column headers will be imported.
|
||||||
|
|
||||||
If the default behavior is not desired and you want to import the complete worksheet ‘as is’, the parameter ‘-NoHeader’ can be used. In case you want to provide your own property names, you can use the parameter ‘-HeaderName’.
|
If the default behavior is not desired and you want to import the complete worksheet ‘as is’, the parameter ‘-NoHeader’ can be used. In case you want to provide your own property names, you can use the parameter ‘-HeaderName’.
|
||||||
|
|
||||||
.PARAMETER Path
|
.PARAMETER Path
|
||||||
Specifies the path to the Excel file.
|
Specifies the path to the Excel file.
|
||||||
|
.PARAMETER ExcelPackage
|
||||||
|
Instead of specifying a path provides an Excel Package object (from Open-ExcelPackage)
|
||||||
|
Using this avoids re-reading the whole file when importing multiple parts of it.
|
||||||
|
To allow multiple read operations Import-Excel does NOT close the package, and you should use
|
||||||
|
Close-ExcelPackage -noSave to close it.
|
||||||
.PARAMETER WorksheetName
|
.PARAMETER WorksheetName
|
||||||
Specifies the name of the worksheet in the Excel workbook to import. By default, if no name is provided, the first worksheet will be imported.
|
Specifies the name of the worksheet in the Excel workbook to import. By default, if no name is provided, the first worksheet will be imported.
|
||||||
|
|
||||||
@@ -77,19 +87,15 @@ function Import-Excel {
|
|||||||
|
|
||||||
.PARAMETER HeaderName
|
.PARAMETER HeaderName
|
||||||
Specifies custom property names to use, instead of the values defined in the column headers of the TopRow.
|
Specifies custom property names to use, instead of the values defined in the column headers of the TopRow.
|
||||||
|
If you provide fewer header names than there are columns of data in the worksheet, then data will only be imported from that number of columns - the others will be ignored.
|
||||||
In case you provide less header names than there is data in the worksheet, then only the data with a corresponding header name will be imported and the data without header name will be disregarded.
|
If you provide more header names than there are columns of data in the worksheet, it will result in blank properties being added to the objects returned.
|
||||||
|
|
||||||
In case you provide more header names than there is data in the worksheet, then all data will be imported and all objects will have all the property names you defined in the header names. As such, the last properties will be blanc as there is no data for them.
|
|
||||||
|
|
||||||
.PARAMETER NoHeader
|
.PARAMETER NoHeader
|
||||||
Automatically generate property names (P1, P2, P3, ..) instead of the ones defined in the column headers of the TopRow.
|
Automatically generate property names (P1, P2, P3, ..) instead of the ones defined in the column headers of the TopRow.
|
||||||
|
|
||||||
This switch is best used when you want to import the complete worksheet ‘as is’ and are not concerned with the property names.
|
This switch is best used when you want to import the complete worksheet ‘as is’ and are not concerned with the property names.
|
||||||
|
|
||||||
.PARAMETER StartRow
|
.PARAMETER StartRow
|
||||||
The row from where we start to import data, all rows above the StartRow are disregarded. By default this is the first row.
|
The row from where we start to import data, all rows above the StartRow are disregarded. By default this is the first row.
|
||||||
|
|
||||||
When the parameters ‘-NoHeader’ and ‘-HeaderName’ are not provided, this row will contain the column headers that will be used as property names. When one of both parameters are provided, the property names are automatically created and this row will be treated as a regular row containing data.
|
When the parameters ‘-NoHeader’ and ‘-HeaderName’ are not provided, this row will contain the column headers that will be used as property names. When one of both parameters are provided, the property names are automatically created and this row will be treated as a regular row containing data.
|
||||||
|
|
||||||
.PARAMETER EndRow
|
.PARAMETER EndRow
|
||||||
@@ -220,7 +226,7 @@ function Import-Excel {
|
|||||||
|
|
||||||
Notice that empty rows and empty columns are not imported.
|
Notice that empty rows and empty columns are not imported.
|
||||||
|
|
||||||
.EXAMPLE
|
.EXAMPLE
|
||||||
Import data from an Excel worksheet. One object is created for each row. The property names are provided with the ‘-HeaderName’ parameter. The import will start from row 2 and empty columns and rows are not imported.
|
Import data from an Excel worksheet. One object is created for each row. The property names are provided with the ‘-HeaderName’ parameter. The import will start from row 2 and empty columns and rows are not imported.
|
||||||
|
|
||||||
----------------------------------------------------------
|
----------------------------------------------------------
|
||||||
@@ -240,31 +246,48 @@ function Import-Excel {
|
|||||||
|
|
||||||
Notice that only 1 object is imported with only 3 properties. Column B and row 2 are empty and have been disregarded by using the switch '-DataOnly'. The property names have been named with the values provided with the parameter '-HeaderName'. Row number 1 with ‘Chuck Norris’ has not been imported, because we started the import from row 2 with the parameter ‘-StartRow 2’.
|
Notice that only 1 object is imported with only 3 properties. Column B and row 2 are empty and have been disregarded by using the switch '-DataOnly'. The property names have been named with the values provided with the parameter '-HeaderName'. Row number 1 with ‘Chuck Norris’ has not been imported, because we started the import from row 2 with the parameter ‘-StartRow 2’.
|
||||||
|
|
||||||
|
.EXAMPLE
|
||||||
|
>
|
||||||
|
PS> ,(Import-Excel -Path .\SysTables_AdventureWorks2014.xlsx) |
|
||||||
|
Write-SqlTableData -ServerInstance localhost\DEFAULT -Database BlankDB -SchemaName dbo -TableName MyNewTable_fromExcel -Force
|
||||||
|
|
||||||
|
Imports data from an Excel file and pipe the data to the Write-SqlTableData to be INSERTed into a table in a SQL Server database.
|
||||||
|
The ",( ... )" around the Import-Excel command allows all rows to be imported from the Excel file, prior to pipelining to the Write-SqlTableData cmdlet. This helps prevent a RBAR scenario and is important when trying to import thousands of rows.
|
||||||
|
The -Force parameter will be ignored if the table already exists. However, if a table is not found that matches the values provided by -SchemaName and -TableName parameters, it will create a new table in SQL Server database. The Write-SqlTableData cmdlet will inherit the column names & datatypes for the new table from the object being piped in.
|
||||||
|
NOTE: You need to install the SqlServer module from the PowerShell Gallery in oder to get the Write-SqlTableData cmdlet.
|
||||||
|
|
||||||
.LINK
|
.LINK
|
||||||
https://github.com/dfinke/ImportExcel
|
https://github.com/dfinke/ImportExcel
|
||||||
|
|
||||||
.NOTES
|
.NOTES
|
||||||
#>
|
#>
|
||||||
|
|
||||||
[CmdLetBinding(DefaultParameterSetName)]
|
[CmdLetBinding()]
|
||||||
[Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSAvoidUsingPlainTextForPassword","")]
|
[Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSAvoidUsingPlainTextForPassword", "")]
|
||||||
Param (
|
Param (
|
||||||
[Alias('FullName')]
|
[Alias('FullName')]
|
||||||
[Parameter(ValueFromPipelineByPropertyName, ValueFromPipeline, Position=0, Mandatory)]
|
[Parameter(ParameterSetName = "PathA", Mandatory, ValueFromPipelineByPropertyName, ValueFromPipeline, Position = 0 )]
|
||||||
[ValidateScript( {(Test-Path -Path $_ -PathType Leaf) -and ($_ -match '.xls$|.xlsx$|.xlsm$')})]
|
[Parameter(ParameterSetName = "PathB", Mandatory, ValueFromPipelineByPropertyName, ValueFromPipeline, Position = 0 )]
|
||||||
|
[Parameter(ParameterSetName = "PathC", Mandatory, ValueFromPipelineByPropertyName, ValueFromPipeline, Position = 0 )]
|
||||||
[String]$Path,
|
[String]$Path,
|
||||||
|
[Parameter(ParameterSetName = "PackageA", Mandatory)]
|
||||||
|
[Parameter(ParameterSetName = "PackageB", Mandatory)]
|
||||||
|
[Parameter(ParameterSetName = "PackageC", Mandatory)]
|
||||||
|
[OfficeOpenXml.ExcelPackage]$ExcelPackage,
|
||||||
[Alias('Sheet')]
|
[Alias('Sheet')]
|
||||||
[Parameter(Position=1)]
|
[Parameter(Position = 1)]
|
||||||
[ValidateNotNullOrEmpty()]
|
[ValidateNotNullOrEmpty()]
|
||||||
[String]$WorksheetName,
|
[String]$WorksheetName,
|
||||||
[Parameter(ParameterSetName='B', Mandatory)]
|
[Parameter(ParameterSetName = 'PathB' , Mandatory)]
|
||||||
|
[Parameter(ParameterSetName = 'PackageB', Mandatory)]
|
||||||
[String[]]$HeaderName ,
|
[String[]]$HeaderName ,
|
||||||
[Parameter(ParameterSetName='C', Mandatory)]
|
[Parameter(ParameterSetName = 'PathC' , Mandatory)]
|
||||||
|
[Parameter(ParameterSetName = 'PackageC', Mandatory)]
|
||||||
[Switch]$NoHeader ,
|
[Switch]$NoHeader ,
|
||||||
[Alias('HeaderRow','TopRow')]
|
[Alias('HeaderRow', 'TopRow')]
|
||||||
[ValidateRange(1, 9999)]
|
[ValidateRange(1, 9999)]
|
||||||
[Int]$StartRow = 1,
|
[Int]$StartRow = 1,
|
||||||
[Alias('StopRow','BottomRow')]
|
[Alias('StopRow', 'BottomRow')]
|
||||||
[Int]$EndRow ,
|
[Int]$EndRow ,
|
||||||
[Alias('LeftColumn')]
|
[Alias('LeftColumn')]
|
||||||
[Int]$StartColumn = 1,
|
[Int]$StartColumn = 1,
|
||||||
@@ -274,14 +297,15 @@ function Import-Excel {
|
|||||||
[ValidateNotNullOrEmpty()]
|
[ValidateNotNullOrEmpty()]
|
||||||
[String]$Password
|
[String]$Password
|
||||||
)
|
)
|
||||||
Begin {
|
begin {
|
||||||
$sw = [System.Diagnostics.Stopwatch]::StartNew()
|
$sw = [System.Diagnostics.Stopwatch]::StartNew()
|
||||||
|
|
||||||
Function Get-PropertyNames {
|
Function Get-PropertyNames {
|
||||||
<#
|
<#
|
||||||
.SYNOPSIS
|
.SYNOPSIS
|
||||||
Create objects containing the column number and the column name for each of the different header types.
|
Create objects containing the column number and the column name for each of the different header types.
|
||||||
#>
|
#>
|
||||||
|
[Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseSingularNouns', '', Justification = "Name would be incorrect, and command is not exported")]
|
||||||
Param (
|
Param (
|
||||||
[Parameter(Mandatory)]
|
[Parameter(Mandatory)]
|
||||||
[Int[]]$Columns,
|
[Int[]]$Columns,
|
||||||
@@ -294,99 +318,93 @@ function Import-Excel {
|
|||||||
$i = 0
|
$i = 0
|
||||||
foreach ($C in $Columns) {
|
foreach ($C in $Columns) {
|
||||||
$i++
|
$i++
|
||||||
$C | Select-Object @{N='Column'; E={$_}}, @{N='Value'; E={'P' + $i}}
|
$C | Select-Object @{N = 'Column'; E = { $_ } }, @{N = 'Value'; E = { 'P' + $i } }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
elseif ($HeaderName) {
|
elseif ($HeaderName) {
|
||||||
$i = 0
|
$i = 0
|
||||||
foreach ($H in $HeaderName) {
|
foreach ($H in $HeaderName) {
|
||||||
$H | Select-Object @{N='Column'; E={$Columns[$i]}}, @{N='Value'; E={$H}}
|
$H | Select-Object @{N = 'Column'; E = { $Columns[$i] } }, @{N = 'Value'; E = { $H } }
|
||||||
$i++
|
$i++
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if ($StartRow -eq 0) {
|
if ($StartRow -lt 1) {
|
||||||
throw 'The top row can never be equal to 0 when we need to retrieve headers from the worksheet.'
|
throw 'The top row can never be less than 1 when we need to retrieve headers from the worksheet.' ; return
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach ($C in $Columns) {
|
foreach ($C in $Columns) {
|
||||||
$Worksheet.Cells[$StartRow,$C] | Where-Object {$_.Value} | Select-Object @{N='Column'; E={$C}}, Value
|
$Worksheet.Cells[$StartRow, $C] | Where-Object { $_.Value } | Select-Object @{N = 'Column'; E = { $C } }, Value
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Catch {
|
Catch {
|
||||||
throw "Failed creating property names: $_"
|
throw "Failed creating property names: $_" ; return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Process {
|
process {
|
||||||
Try {
|
if ($path) {
|
||||||
#region Open file
|
$extension = [System.IO.Path]::GetExtension($Path)
|
||||||
$Path = (Resolve-Path $Path).ProviderPath
|
if ($extension -notmatch '.xlsx$|.xlsm$') {
|
||||||
Write-Verbose "Import Excel workbook '$Path' with worksheet '$Worksheetname'"
|
throw "Import-Excel does not support reading this extension type $($extension)"
|
||||||
|
}
|
||||||
|
|
||||||
$Stream = New-Object -TypeName System.IO.FileStream -ArgumentList $Path, 'Open', 'Read', 'ReadWrite'
|
$resolvedPath = (Resolve-Path $Path -ErrorAction SilentlyContinue)
|
||||||
|
if ($resolvedPath) {
|
||||||
if ($Password) {
|
$Path = $resolvedPath.ProviderPath
|
||||||
$Excel = New-Object -TypeName OfficeOpenXml.ExcelPackage
|
|
||||||
|
|
||||||
Try {
|
|
||||||
$Excel.Load($Stream,$Password)
|
|
||||||
}
|
|
||||||
Catch {
|
|
||||||
throw "Password '$Password' is not correct."
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
$Excel = New-Object -TypeName OfficeOpenXml.ExcelPackage -ArgumentList $Stream
|
throw "'$($Path)' file not found"
|
||||||
}
|
}
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region Select worksheet
|
$stream = New-Object -TypeName System.IO.FileStream -ArgumentList $Path, 'Open', 'Read', 'ReadWrite'
|
||||||
if ($WorksheetName) {
|
$ExcelPackage = New-Object -TypeName OfficeOpenXml.ExcelPackage
|
||||||
if (-not ($Worksheet = $Excel.Workbook.Worksheets[$WorkSheetName])) {
|
if ($Password) { $ExcelPackage.Load($stream,$Password)}
|
||||||
throw "Worksheet '$WorksheetName' not found, the workbook only contains the worksheets '$($Excel.Workbook.Worksheets)'. If you only wish to select the first worksheet, please remove the '-WorksheetName' parameter."
|
else { $ExcelPackage.Load($stream) }
|
||||||
}
|
}
|
||||||
|
try {
|
||||||
|
#Select worksheet
|
||||||
|
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
|
||||||
}
|
}
|
||||||
else {
|
|
||||||
$Worksheet = $Excel.Workbook.Worksheets | Select-Object -First 1
|
|
||||||
}
|
|
||||||
#endregion
|
|
||||||
Write-Debug $sw.Elapsed.TotalMilliseconds
|
Write-Debug $sw.Elapsed.TotalMilliseconds
|
||||||
#region Get rows and columns
|
#region Get rows and columns
|
||||||
#If we are doing dataonly it is quicker to work out which rows to ignore before processing the cells.
|
#If we are doing dataonly it is quicker to work out which rows to ignore before processing the cells.
|
||||||
if (-not $EndRow ) {$EndRow = $Worksheet.Dimension.End.Row }
|
if (-not $EndRow ) { $EndRow = $Worksheet.Dimension.End.Row }
|
||||||
if (-not $EndColumn) {$EndColumn = $Worksheet.Dimension.End.Column }
|
if (-not $EndColumn) { $EndColumn = $Worksheet.Dimension.End.Column }
|
||||||
$endAddress = [OfficeOpenXml.ExcelAddress]::TranslateFromR1C1("R[$EndRow]C[$EndColumn]",0,0)
|
$endAddress = [OfficeOpenXml.ExcelAddress]::TranslateFromR1C1("R[$EndRow]C[$EndColumn]", 0, 0)
|
||||||
if ($DataOnly) {
|
if ($DataOnly) {
|
||||||
#If we are using headers startrow will be the headerrow so examine data from startRow + 1,
|
#If we are using headers startrow will be the header-row so examine data from startRow + 1,
|
||||||
if ($NoHeader) {$range = "A" + ($StartRow ) + ":" + $endAddress }
|
if ($NoHeader) { $range = "A" + ($StartRow ) + ":" + $endAddress }
|
||||||
else {$range = "A" + ($StartRow + 1 ) + ":" + $endAddress }
|
else { $range = "A" + ($StartRow + 1 ) + ":" + $endAddress }
|
||||||
#We're going to look at every cell and build 2 hash tables holding rows & columns which contain data.
|
#We're going to look at every cell and build 2 hash tables holding rows & columns which contain data.
|
||||||
#Want to Avoid 'select unique' operations & large Sorts, becuse time time taken increases with square
|
#Want to Avoid 'select unique' operations & large Sorts, becuse time time taken increases with square
|
||||||
#of number of items (PS uses heapsort at large size). Instead keep a list of what we have seen,
|
#of number of items (PS uses heapsort at large size). Instead keep a list of what we have seen,
|
||||||
#using Hash tables: "we've seen it" is all we need, no need to worry about "seen it before" / "Seen it many times".
|
#using Hash tables: "we've seen it" is all we need, no need to worry about "seen it before" / "Seen it many times".
|
||||||
$colHash = @{}
|
$colHash = @{ }
|
||||||
$rowHash = @{}
|
$rowHash = @{ }
|
||||||
foreach ($cell in $Worksheet.Cells[$range]) {
|
foreach ($cell in $Worksheet.Cells[$range]) {
|
||||||
if ($null -ne $cell.Value ) {$colHash[$cell.Start.Column]=1; $rowHash[$cell.Start.row]=1 }
|
if ($null -ne $cell.Value ) { $colHash[$cell.Start.Column] = 1; $rowHash[$cell.Start.row] = 1 }
|
||||||
}
|
}
|
||||||
$rows = ( $StartRow..$EndRow ).Where({$rowHash[$_]})
|
$rows = ( $StartRow..$EndRow ).Where( { $rowHash[$_] })
|
||||||
$columns = ($StartColumn..$EndColumn).Where({$colHash[$_]})
|
$columns = ($StartColumn..$EndColumn).Where( { $colHash[$_] })
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
$Columns = $StartColumn..$EndColumn ; if ($StartColumn -gt $EndColumn) {Write-Warning -Message "Selecting columns $StartColumn to $EndColumn might give odd results."}
|
$Columns = $StartColumn .. $EndColumn ; if ($StartColumn -gt $EndColumn) { Write-Warning -Message "Selecting columns $StartColumn to $EndColumn might give odd results." }
|
||||||
if ($NoHeader) {$Rows = ( $StartRow)..$EndRow ; if ($StartRow -gt $EndRow) {Write-Warning -Message "Selecting rows $StartRow to $EndRow might give odd results."} }
|
if ($NoHeader) { $Rows = $StartRow..$EndRow ; if ($StartRow -gt $EndRow) { Write-Warning -Message "Selecting rows $StartRow to $EndRow might give odd results." } }
|
||||||
else {$Rows = (1 + $StartRow)..$EndRow ; if ($StartRow -ge $EndRow) {Write-Warning -Message "Selecting $StartRow as the header with data in $(1+$StartRow) to $EndRow might give odd results."}}
|
else { $Rows = (1 + $StartRow)..$EndRow } # ; if ($StartRow -ge $EndRow) { Write-Warning -Message "Selecting $StartRow as the header with data in $(1+$StartRow) to $EndRow might give odd results." } }
|
||||||
}
|
}
|
||||||
#endregion
|
#endregion
|
||||||
#region Create property names
|
#region Create property names
|
||||||
if ((-not $Columns) -or (-not ($PropertyNames = Get-PropertyNames -Columns $Columns -StartRow $StartRow))) {
|
if ((-not $Columns) -or (-not ($PropertyNames = Get-PropertyNames -Columns $Columns -StartRow $StartRow))) {
|
||||||
throw "No column headers found on top row '$StartRow'. If column headers in the worksheet are not a requirement then please use the '-NoHeader' or '-HeaderName' parameter."
|
throw "No column headers found on top row '$StartRow'. If column headers in the worksheet are not a requirement then please use the '-NoHeader' or '-HeaderName' parameter."; return
|
||||||
}
|
}
|
||||||
if ($Duplicates = $PropertyNames | Group-Object Value | Where-Object Count -GE 2) {
|
if ($Duplicates = $PropertyNames | Group-Object Value | Where-Object Count -GE 2) {
|
||||||
throw "Duplicate column headers found on row '$StartRow' in columns '$($Duplicates.Group.Column)'. Column headers must be unique, if this is not a requirement please use the '-NoHeader' or '-HeaderName' parameter."
|
throw "Duplicate column headers found on row '$StartRow' in columns '$($Duplicates.Group.Column)'. Column headers must be unique, if this is not a requirement please use the '-NoHeader' or '-HeaderName' parameter."; return
|
||||||
}
|
}
|
||||||
#endregion
|
#endregion
|
||||||
Write-Debug $sw.Elapsed.TotalMilliseconds
|
Write-Debug $sw.Elapsed.TotalMilliseconds
|
||||||
@@ -396,12 +414,13 @@ function Import-Excel {
|
|||||||
else {
|
else {
|
||||||
#region Create one object per row
|
#region Create one object per row
|
||||||
foreach ($R in $Rows) {
|
foreach ($R in $Rows) {
|
||||||
Write-Verbose "Import row '$R'"
|
#Disabled write-verbose for speed
|
||||||
$NewRow = [Ordered]@{}
|
# Write-Verbose "Import row '$R'"
|
||||||
|
$NewRow = [Ordered]@{ }
|
||||||
|
|
||||||
foreach ($P in $PropertyNames) {
|
foreach ($P in $PropertyNames) {
|
||||||
$NewRow[$P.Value] = $Worksheet.Cells[$R, $P.Column].Value
|
$NewRow[$P.Value] = $Worksheet.Cells[$R, $P.Column].Value
|
||||||
Write-Verbose "Import cell '$($Worksheet.Cells[$R, $P.Column].Address)' with property name '$($p.Value)' and value '$($Worksheet.Cells[$R, $P.Column].Value)'."
|
# Write-Verbose "Import cell '$($Worksheet.Cells[$R, $P.Column].Address)' with property name '$($p.Value)' and value '$($Worksheet.Cells[$R, $P.Column].Value)'."
|
||||||
}
|
}
|
||||||
|
|
||||||
[PSCustomObject]$NewRow
|
[PSCustomObject]$NewRow
|
||||||
@@ -410,14 +429,9 @@ function Import-Excel {
|
|||||||
}
|
}
|
||||||
Write-Debug $sw.Elapsed.TotalMilliseconds
|
Write-Debug $sw.Elapsed.TotalMilliseconds
|
||||||
}
|
}
|
||||||
Catch {
|
catch { throw "Failed importing the Excel workbook '$Path' with worksheet '$Worksheetname': $_"; return }
|
||||||
throw "Failed importing the Excel workbook '$Path' with worksheet '$Worksheetname': $_"
|
finally {
|
||||||
}
|
if ($Path) { $stream.close(); $ExcelPackage.Dispose() }
|
||||||
Finally {
|
|
||||||
$Stream.Close()
|
|
||||||
$Stream.Dispose()
|
|
||||||
$Excel.Dispose()
|
|
||||||
$Excel = $null
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -446,11 +460,11 @@ function ConvertFrom-ExcelSheet {
|
|||||||
[String]
|
[String]
|
||||||
$OutputPath = '.\',
|
$OutputPath = '.\',
|
||||||
[String]
|
[String]
|
||||||
$SheetName="*",
|
$SheetName = "*",
|
||||||
[ValidateSet('ASCII', 'BigEndianUniCode','Default','OEM','UniCode','UTF32','UTF7','UTF8')]
|
[ValidateSet('ASCII', 'BigEndianUniCode', 'Default', 'OEM', 'UniCode', 'UTF32', 'UTF7', 'UTF8')]
|
||||||
[string]
|
[string]
|
||||||
$Encoding = 'UTF8',
|
$Encoding = 'UTF8',
|
||||||
[ValidateSet('.txt', '.log','.csv')]
|
[ValidateSet('.txt', '.log', '.csv')]
|
||||||
[string]
|
[string]
|
||||||
$Extension = '.csv',
|
$Extension = '.csv',
|
||||||
[ValidateSet(';', ',')]
|
[ValidateSet(';', ',')]
|
||||||
@@ -459,20 +473,19 @@ function ConvertFrom-ExcelSheet {
|
|||||||
)
|
)
|
||||||
|
|
||||||
$Path = (Resolve-Path $Path).Path
|
$Path = (Resolve-Path $Path).Path
|
||||||
$stream = New-Object -TypeName System.IO.FileStream -ArgumentList $Path,"Open","Read","ReadWrite"
|
$Stream = New-Object -TypeName System.IO.FileStream -ArgumentList $Path, "Open", "Read", "ReadWrite"
|
||||||
$xl = New-Object -TypeName OfficeOpenXml.ExcelPackage -ArgumentList $stream
|
$xl = New-Object -TypeName OfficeOpenXml.ExcelPackage -ArgumentList $Stream
|
||||||
$workbook = $xl.Workbook
|
$workbook = $xl.Workbook
|
||||||
|
|
||||||
$targetSheets = $workbook.Worksheets | Where-Object {$_.Name -like $SheetName}
|
$targetSheets = $workbook.Worksheets | Where-Object { $_.Name -like $SheetName }
|
||||||
|
|
||||||
$params = @{} + $PSBoundParameters
|
$params = @{ } + $PSBoundParameters
|
||||||
$params.Remove("OutputPath")
|
$params.Remove("OutputPath")
|
||||||
$params.Remove("SheetName")
|
$params.Remove("SheetName")
|
||||||
$params.Remove('Extension')
|
$params.Remove('Extension')
|
||||||
$params.NoTypeInformation = $true
|
$params.NoTypeInformation = $true
|
||||||
|
|
||||||
Foreach ($sheet in $targetSheets)
|
Foreach ($sheet in $targetSheets) {
|
||||||
{
|
|
||||||
Write-Verbose "Exporting sheet: $($sheet.Name)"
|
Write-Verbose "Exporting sheet: $($sheet.Name)"
|
||||||
|
|
||||||
$params.Path = "$OutputPath\$($Sheet.Name)$Extension"
|
$params.Path = "$OutputPath\$($Sheet.Name)$Extension"
|
||||||
@@ -480,24 +493,24 @@ function ConvertFrom-ExcelSheet {
|
|||||||
Import-Excel $Path -Sheet $($sheet.Name) | Export-Csv @params
|
Import-Excel $Path -Sheet $($sheet.Name) | Export-Csv @params
|
||||||
}
|
}
|
||||||
|
|
||||||
$stream.Close()
|
$Stream.Close()
|
||||||
$stream.Dispose()
|
$Stream.Dispose()
|
||||||
$xl.Dispose()
|
$xl.Dispose()
|
||||||
}
|
}
|
||||||
|
|
||||||
function Export-MultipleExcelSheets {
|
function Export-MultipleExcelSheets {
|
||||||
[Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSAvoidUsingPlainTextForPassword","")]
|
[Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSAvoidUsingPlainTextForPassword", "")]
|
||||||
param(
|
param(
|
||||||
[Parameter(Mandatory=$true)]
|
[Parameter(Mandatory = $true)]
|
||||||
$Path,
|
$Path,
|
||||||
[Parameter(Mandatory=$true)]
|
[Parameter(Mandatory = $true)]
|
||||||
[hashtable]$InfoMap,
|
[hashtable]$InfoMap,
|
||||||
[string]$Password,
|
[string]$Password,
|
||||||
[Switch]$Show,
|
[Switch]$Show,
|
||||||
[Switch]$AutoSize
|
[Switch]$AutoSize
|
||||||
)
|
)
|
||||||
|
|
||||||
$parameters = @{}+$PSBoundParameters
|
$parameters = @{ } + $PSBoundParameters
|
||||||
$parameters.Remove("InfoMap")
|
$parameters.Remove("InfoMap")
|
||||||
$parameters.Remove("Show")
|
$parameters.Remove("Show")
|
||||||
|
|
||||||
@@ -505,24 +518,24 @@ function Export-MultipleExcelSheets {
|
|||||||
|
|
||||||
foreach ($entry in $InfoMap.GetEnumerator()) {
|
foreach ($entry in $InfoMap.GetEnumerator()) {
|
||||||
Write-Progress -Activity "Exporting" -Status "$($entry.Key)"
|
Write-Progress -Activity "Exporting" -Status "$($entry.Key)"
|
||||||
$parameters.WorkSheetname=$entry.Key
|
$parameters.WorkSheetname = $entry.Key
|
||||||
|
|
||||||
& $entry.Value | Export-Excel @parameters
|
& $entry.Value | Export-Excel @parameters
|
||||||
}
|
}
|
||||||
|
|
||||||
if($Show) {Invoke-Item $Path}
|
if ($Show) { Invoke-Item $Path }
|
||||||
}
|
}
|
||||||
|
|
||||||
Function WorksheetArgumentCompleter {
|
Function WorksheetArgumentCompleter {
|
||||||
param($commandName, $parameterName, $wordToComplete, $commandAst, $fakeBoundParameter)
|
param($commandName, $parameterName, $wordToComplete, $commandAst, $fakeBoundParameter)
|
||||||
$xlPath = $fakeBoundParameter['Path']
|
$xlPath = $fakeBoundParameter['Path']
|
||||||
if (Test-Path -Path $xlPath) {
|
if (Test-Path -Path $xlPath) {
|
||||||
$xlpkg = Open-ExcelPackage -Path $xlPath
|
$xlpkg = Open-ExcelPackage -ReadOnly -Path $xlPath
|
||||||
$WorksheetNames = $xlPkg.Workbook.Worksheets.Name
|
$WorksheetNames = $xlPkg.Workbook.Worksheets.Name
|
||||||
Close-ExcelPackage -nosave -ExcelPackage $xlpkg
|
Close-ExcelPackage -nosave -ExcelPackage $xlpkg
|
||||||
$WorksheetNames.where({$_ -like "*$wordToComplete*"}) | foreach-object {
|
$WorksheetNames.where( { $_ -like "*$wordToComplete*" }) | foreach-object {
|
||||||
New-Object -TypeName System.Management.Automation.CompletionResult -ArgumentList "'$_'",
|
New-Object -TypeName System.Management.Automation.CompletionResult -ArgumentList "'$_'",
|
||||||
$_ , ([System.Management.Automation.CompletionResultType]::ParameterValue) ,$_
|
$_ , ([System.Management.Automation.CompletionResultType]::ParameterValue) , $_
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -68,7 +68,7 @@ function Invoke-AllTests {
|
|||||||
)
|
)
|
||||||
|
|
||||||
$resultCount=0
|
$resultCount=0
|
||||||
$tests.GetEnumerator() | ForEach {
|
$tests.GetEnumerator() | ForEach-Object {
|
||||||
|
|
||||||
$result=& $_.Value $target
|
$result=& $_.Value $target
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<#
|
<#
|
||||||
.SYNOPSIS
|
.SYNOPSIS
|
||||||
Download the module files from GitHub.
|
Download the module files from GitHub.
|
||||||
|
|
||||||
.DESCRIPTION
|
.DESCRIPTION
|
||||||
@@ -85,12 +85,12 @@ Process {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (-not (Test-Path $InstallDirectory)) {
|
if (-not (Test-Path $InstallDirectory)) {
|
||||||
New-Item -Path $InstallDirectory -ItemType Directory -EA Stop | Out-Null
|
$null = New-Item -Path $InstallDirectory -ItemType Directory -EA Stop
|
||||||
Write-Verbose "$ModuleName created module folder '$InstallDirectory'"
|
Write-Verbose "$ModuleName created module folder '$InstallDirectory'"
|
||||||
}
|
}
|
||||||
|
|
||||||
$WebClient = New-Object System.Net.WebClient
|
$WebClient = New-Object System.Net.WebClient
|
||||||
|
|
||||||
$Files | ForEach-Object {
|
$Files | ForEach-Object {
|
||||||
$WebClient.DownloadFile("$GitPath/$_","$installDirectory\$_")
|
$WebClient.DownloadFile("$GitPath/$_","$installDirectory\$_")
|
||||||
Write-Verbose "$ModuleName installed module file '$_'"
|
Write-Verbose "$ModuleName installed module file '$_'"
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user