Compare commits
195 Commits
v7.4.2
...
fix-import
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
16e2319124 | ||
|
|
c1b395fac6 | ||
|
|
0d8d125222 | ||
|
|
f77ee7b060 | ||
|
|
8ff1757c06 | ||
|
|
ab526558a3 | ||
|
|
61744012cd | ||
|
|
2cb4712bc5 | ||
|
|
6847a49baa | ||
|
|
b8a8f4c565 | ||
|
|
edf25cf946 | ||
|
|
77ec946b84 | ||
|
|
637c11c2e6 | ||
|
|
cd2a70197c | ||
|
|
d99bd8fc9e | ||
|
|
23f1d92c1b | ||
|
|
ab4d03c984 | ||
|
|
ca4dfb7040 | ||
|
|
a9eca05303 | ||
|
|
195efdea54 | ||
|
|
24e5fccafe | ||
|
|
840870df11 | ||
|
|
0fe6654233 | ||
|
|
7598b75538 | ||
|
|
ed6c87e8de | ||
|
|
2642211e12 | ||
|
|
9373765e10 | ||
|
|
16820a30c4 | ||
|
|
438d7e2b03 | ||
|
|
c617d96322 | ||
|
|
15679a0d82 | ||
|
|
3c23a064bc | ||
|
|
c848497f53 | ||
|
|
ba374ec558 | ||
|
|
3f772ce726 | ||
|
|
3ea6fde928 | ||
|
|
81ece62494 | ||
|
|
828b2caf9f | ||
|
|
f760b63818 | ||
|
|
fe016f732d | ||
|
|
c719cc3d32 | ||
|
|
5558f48732 | ||
|
|
4dfd211bb6 | ||
|
|
90bc047267 | ||
|
|
4c0e7970cf | ||
|
|
b191f16e3e | ||
|
|
ce49038b75 | ||
|
|
652a611137 | ||
|
|
3b73ce24ae | ||
|
|
5e8afa48fc | ||
|
|
f494635b48 | ||
|
|
dcb67b4518 | ||
|
|
06c00cb0b2 | ||
|
|
d987437ad6 | ||
|
|
fe27ff81c8 | ||
|
|
9f4307f6c0 | ||
|
|
a1fccf914f | ||
|
|
0b4c2b81db | ||
|
|
8ee34217a4 | ||
|
|
c01601910d | ||
|
|
63f6543784 | ||
|
|
306e10c348 | ||
|
|
970febd6d3 | ||
|
|
e703a21dec | ||
|
|
c1be6a8d82 | ||
|
|
201b9cd984 | ||
|
|
559bfa2a7f | ||
|
|
4bd3efa1ef | ||
|
|
926042e5b6 | ||
|
|
be1e55cf8d | ||
|
|
a86c55b3ac | ||
|
|
fa14695fb9 | ||
|
|
6322bafaed | ||
|
|
c7a6f4ba35 | ||
|
|
49a6805727 | ||
|
|
c124ee199d | ||
|
|
858cf60a2f | ||
|
|
fcde64780e | ||
|
|
be5d270f44 | ||
|
|
f9fb49ad04 | ||
|
|
4727bb3b2b | ||
|
|
ac435fc1e1 | ||
|
|
340ffc560b | ||
|
|
069c227391 | ||
|
|
fa4f3a23cd | ||
|
|
f54db0e2d9 | ||
|
|
8c1388a799 | ||
|
|
7c473d1fb6 | ||
|
|
31366057df | ||
|
|
f102ece700 | ||
|
|
950b9ab078 | ||
|
|
869ab59a8a | ||
|
|
1e9a73d176 | ||
|
|
37e6896741 | ||
|
|
c39e6cc24c | ||
|
|
5ab9d6f23f | ||
|
|
81e60be51d | ||
|
|
943ca7e6d1 | ||
|
|
513ff59ba8 | ||
|
|
45fc5a2631 | ||
|
|
8b30fce81a | ||
|
|
0990c0ef09 | ||
|
|
724ed6b197 | ||
|
|
087feedde6 | ||
|
|
b92ea56fe9 | ||
|
|
c4eed8c25d | ||
|
|
9051ffc0e5 | ||
|
|
050613eede | ||
|
|
84f51c4823 | ||
|
|
f2544ed1ec | ||
|
|
5b4857d7a0 | ||
|
|
45449650c7 | ||
|
|
d7348250fc | ||
|
|
b53881fd02 | ||
|
|
632bb263cc | ||
|
|
658a6b543a | ||
|
|
0f301ff619 | ||
|
|
115fbb23a7 | ||
|
|
2b30537c20 | ||
|
|
22f50d2659 | ||
|
|
f0a2d076e3 | ||
|
|
835a11bbb3 | ||
|
|
701b8e2062 | ||
|
|
6f2bfaff4e | ||
|
|
ba6cee12d9 | ||
|
|
5d36945708 | ||
|
|
6cbf4efd1d | ||
|
|
4feaee46d2 | ||
|
|
89f90b77fb | ||
|
|
98256c61e8 | ||
|
|
ebde9269aa | ||
|
|
e3149b7b40 | ||
|
|
64ff97b486 | ||
|
|
12f1f23d51 | ||
|
|
e279cd785e | ||
|
|
04b5a9a096 | ||
|
|
c6a06cc325 | ||
|
|
a4bed31e1e | ||
|
|
c385ca9012 | ||
|
|
2a8cbbba7c | ||
|
|
b789db9ba3 | ||
|
|
89a4cfde0d | ||
|
|
ab56ae4409 | ||
|
|
ef35c4fca8 | ||
|
|
9fad33c7a6 | ||
|
|
8bb3d50052 | ||
|
|
d5b807d3cb | ||
|
|
e2053e4998 | ||
|
|
8c6c7eeaf6 | ||
|
|
31abd215dc | ||
|
|
cafaafd53d | ||
|
|
ee3c8e7680 | ||
|
|
0b207548e0 | ||
|
|
6628b55ce5 | ||
|
|
f6bfabd96a | ||
|
|
980631df8b | ||
|
|
4f9b83f0e6 | ||
|
|
59cf89b451 | ||
|
|
5777d907c4 | ||
|
|
d7c516d35e | ||
|
|
27d69e7531 | ||
|
|
8ae92fba54 | ||
|
|
aa0f0cf4e2 | ||
|
|
6e38d97498 | ||
|
|
ef7c8331f5 | ||
|
|
267d15f99a | ||
|
|
390aca0496 | ||
|
|
4fa34ae257 | ||
|
|
0b3b382c4e | ||
|
|
415be5bca3 | ||
|
|
79e5bdf8ba | ||
|
|
b03d9b048a | ||
|
|
aea90aa8d6 | ||
|
|
d4ebc9e95d | ||
|
|
6ece4483e2 | ||
|
|
ba14511254 | ||
|
|
964cf9e9c6 | ||
|
|
8d56a351ff | ||
|
|
b2119f08f5 | ||
|
|
634aaacc55 | ||
|
|
61b44f826d | ||
|
|
9273261b34 | ||
|
|
e55dfdd10e | ||
|
|
59e40d62d0 | ||
|
|
f478e8a134 | ||
|
|
b634bf9d93 | ||
|
|
a10ade898a | ||
|
|
eb10364722 | ||
|
|
b0024cf2c4 | ||
|
|
7f36b44fa8 | ||
|
|
483f761016 | ||
|
|
d55f0e64d4 | ||
|
|
f83f654c4a | ||
|
|
6a956dbd7e | ||
|
|
f348088b62 |
30
.github/workflows/ci.yml
vendored
Normal file
@@ -0,0 +1,30 @@
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- master
|
||||
- Set-up-GHA-CI/CD
|
||||
paths-ignore:
|
||||
- 'Examples/**'
|
||||
|
||||
pull_request:
|
||||
|
||||
|
||||
jobs:
|
||||
validate:
|
||||
runs-on: ${{ matrix.os }}
|
||||
strategy:
|
||||
matrix:
|
||||
os: [windows-latest, ubuntu-latest, macos-latest]
|
||||
steps:
|
||||
- uses: actions/checkout@v1
|
||||
- name: Run Continuous Integration
|
||||
shell: pwsh
|
||||
run : |
|
||||
if($PSVersionTable.Platform -eq 'Win32NT') {
|
||||
$null = mkdir ./ace
|
||||
Invoke-Restmethod https://download.microsoft.com/download/3/5/C/35C84C36-661A-44E6-9324-8786B8DBE231/accessdatabaseengine_X64.exe -OutFile ./ace/ace.exe
|
||||
Start-Process ./ace/ace.exe -Wait -ArgumentList "/quiet /passive /norestart"
|
||||
}
|
||||
|
||||
cd ./__tests__
|
||||
Invoke-Pester -Output Detailed
|
||||
133
Add-Subtotals.ps1
Normal file
@@ -0,0 +1,133 @@
|
||||
Function Add-Subtotals {
|
||||
param(
|
||||
[Parameter(Mandatory=$true, Position=0)]
|
||||
$ChangeColumnName , # = "Location"
|
||||
|
||||
[Parameter(Mandatory=$true, Position=1)]
|
||||
[hashtable]$AggregateColumn , #= @{"Sales" = "SUM" }
|
||||
|
||||
[Parameter(Position=2)]
|
||||
$ExcelPath = ([System.IO.Path]::GetTempFileName() -replace "\.tmp", ".xlsx") ,
|
||||
|
||||
[Parameter(Position=3)]
|
||||
$WorksheetName = "Sheet1",
|
||||
|
||||
[Parameter(ValueFromPipeline=$true)]
|
||||
$InputObject, #$DataToPivot | Sort location, product
|
||||
|
||||
[switch]$HideSingleRows,
|
||||
[switch]$NoSort,
|
||||
[switch]$NoOutLine,
|
||||
[switch]$Show
|
||||
|
||||
)
|
||||
begin {
|
||||
if (-not $PSBoundParameters.ContainsKey('ExcelPath')) {$Show = $true}
|
||||
$data = @()
|
||||
$aggFunctions = [ordered]@{
|
||||
"AVERAGE" = 1; "COUNT" = 2; "COUNTA" = 3 #(non empty cells) f
|
||||
"MAX" = 4; "MIN" = 5; "PRODUCT" = 6; "STDEV" = 7 # (sample)
|
||||
"STDEVP" = 8 # (whole population);
|
||||
"SUM" = 9; "VAR" = 10 # (Variance sample)
|
||||
"VARP" = 11 # (whole population) #add 100 to ignore hidden cells
|
||||
}
|
||||
}
|
||||
process {
|
||||
$data += $InputObject
|
||||
}
|
||||
end {
|
||||
if (-not $NoSort) {$data = $data | Sort-Object $changeColumnName}
|
||||
$Header = $data[0].PSObject.Properties.Name
|
||||
#region turn each entry in $AggregateColumn "=SUBTOTAL(a,x{0}}:x{1})" where a is the aggregate function number and x is the column letter
|
||||
$aggFormulas = @{}
|
||||
foreach ($k in $AggregateColumn.Keys) {
|
||||
$columnNo = 0 ;
|
||||
while ($columnNo -lt $header.count -and $header[$columnNo] -ne $k) {$columnNo ++}
|
||||
if ($columnNo -eq $header.count) {
|
||||
throw "'$k' isn't a property of the first row of data."; return
|
||||
}
|
||||
if ($AggregateColumn[$k] -is [string]) {
|
||||
$aggfn = $aggFunctions[$AggregateColumn[$k]]
|
||||
if (-not $aggfn) {
|
||||
throw "$($AggregateColumn[$k]) is not a valid aggregation function - these are $($aggFunctions.keys -join ', ')" ; return
|
||||
}
|
||||
}
|
||||
else {$aggfn = $AggregateColumn[$k]}
|
||||
$aggFormulas[$k] = "=SUBTOTAL({0},{1}{{0}}:{1}{{1}})" -f $aggfn , (Get-ExcelColumnName ($columnNo+1) ).ColumnName
|
||||
}
|
||||
if ($aggformulas.count -lt 1) {throw "We didn't get any aggregation formulas"}
|
||||
$aggFormulas | out-string -Stream | Write-Verbose -Verbose
|
||||
#endregion
|
||||
$insertedRows = @()
|
||||
$singleRows = @()
|
||||
$previousValue = $data[0].$changeColumnName
|
||||
$currentRow = $lastChangeRow = 2
|
||||
#region insert subtotals and send to excel:
|
||||
#each time there is a change in the column we're intetersted in.
|
||||
#either Add a row with the value and subtotal(s) function(s) if there is more than one row to total
|
||||
#or note the row if there was only one row with that value (we may hide it later.)
|
||||
$excel = $data |
|
||||
ForEach-Object -process {
|
||||
if ($_.$changeColumnName -ne $previousValue) {
|
||||
if ($lastChangeRow -lt ($currentrow - 1)) {
|
||||
$NewObj = @{$changeColumnName = $previousValue}
|
||||
foreach ($k in $aggFormulas.Keys) {
|
||||
$newobj[$k] = $aggformulas[$k] -f $lastChangeRow, ($currentRow - 1)
|
||||
}
|
||||
$insertedRows += $currentRow
|
||||
[pscustomobject]$newobj
|
||||
$currentRow += 1
|
||||
}
|
||||
else {$singleRows += $currentRow }
|
||||
$lastChangeRow = $currentRow
|
||||
$previousValue = $_.$changeColumnName
|
||||
}
|
||||
$_
|
||||
$currentRow += 1
|
||||
} -end { # the process block won't output the last row
|
||||
if ($lastChangeRow -lt ($currentrow - 1)) {
|
||||
$NewObj = @{$changeColumnName = $previousValue}
|
||||
foreach ($k in $aggFormulas.Keys) {
|
||||
$newobj[$k] = $aggformulas[$k] -f $lastChangeRow, ($currentRow - 1)
|
||||
}
|
||||
$insertedRows += $currentRow
|
||||
[pscustomobject]$newobj
|
||||
}
|
||||
else {$singleRows += $currentRow }
|
||||
} | Export-Excel -Path $ExcelPath -PassThru -AutoSize -AutoFilter -AutoNameRange -BoldTopRow -WorksheetName $WorksheetName -Activate -ClearSheet #-MaxAutoSizeRows 10000
|
||||
#endregion
|
||||
#Put the subtotal rows in bold optionally hide rows where only one has the value of interest.
|
||||
$ws = $excel.$WorksheetName
|
||||
#We kept lists of the total rows Since 1 rows won't get expand/collapse we can hide them.
|
||||
foreach ($r in $insertedrows) {$ws.Row($r).style.font.bold = $true }
|
||||
if ($HideSingleRows) {
|
||||
foreach ($r in $hideRows) { $ws.Row($r).hidden = $true}
|
||||
}
|
||||
$range = $ws.Dimension.Address
|
||||
$ExcelPath = $excel.File.FullName
|
||||
$SheetIndex = $ws.index
|
||||
if ($NoOutline) {
|
||||
Close-ExcelPackage $excel -show:$Show
|
||||
return
|
||||
}
|
||||
else {
|
||||
Close-ExcelPackage $excel
|
||||
|
||||
try { $excelApp = New-Object -ComObject "Excel.Application" }
|
||||
catch { Write-Warning "Could not start Excel application - which usually means it is not installed." ; return }
|
||||
|
||||
try { $excelWorkBook = $excelApp.Workbooks.Open($ExcelPath) }
|
||||
catch { Write-Warning -Message "Could not Open $ExcelPath." ; return }
|
||||
$ws = $excelWorkBook.Worksheets.item($SheetIndex)
|
||||
$null = $ws.Range($range).Select()
|
||||
$null = $excelapp.ActiveCell.AutoOutline()
|
||||
$null = $ws.Outline.ShowLevels(1,$null)
|
||||
$excelWorkBook.Save()
|
||||
if ($show) {$excelApp.Visible = $true}
|
||||
else {
|
||||
[void]$excelWorkBook.close()
|
||||
$excelapp.Quit()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
35
Examples/Charts/ChartDataSeparatePage.ps1
Normal file
@@ -0,0 +1,35 @@
|
||||
$data = ConvertFrom-Csv @"
|
||||
Region,State,Units,Price
|
||||
West,Texas,927,923.71
|
||||
North,Tennessee,466,770.67
|
||||
East,Florida,520,458.68
|
||||
East,Maine,828,661.24
|
||||
West,Virginia,465,053.58
|
||||
North,Missouri,436,235.67
|
||||
South,Kansas,214,992.47
|
||||
North,North Dakota,789,640.72
|
||||
South,Delaware,712,508.55
|
||||
"@
|
||||
|
||||
$xlfile = "$PSScriptRoot\spike.xlsx"
|
||||
Remove-Item $xlfile -ErrorAction SilentlyContinue
|
||||
|
||||
$xlpkg = $data | Export-Excel $xlfile -WorksheetName Data -AutoNameRange -PassThru
|
||||
|
||||
$null = Add-Worksheet -ExcelPackage $xlpkg -WorksheetName Summary -Activate
|
||||
|
||||
$params = @{
|
||||
Worksheet = $xlpkg.Summary
|
||||
Title = "Sales by Region"
|
||||
ChartType = 'ColumnClustered'
|
||||
|
||||
# XRange = "Data!A2:A10"
|
||||
# YRange = "Data!C2:C10"
|
||||
|
||||
XRange = 'Data!Region'
|
||||
YRange = 'Data!Units'
|
||||
}
|
||||
|
||||
Add-ExcelChart @params
|
||||
|
||||
Close-ExcelPackage $xlpkg -Show
|
||||
@@ -0,0 +1,22 @@
|
||||
try { Import-Module $PSScriptRoot\..\..\ImportExcel.psd1 } catch { throw ; return }
|
||||
|
||||
$data = ConvertFrom-Csv @"
|
||||
Region,State,Other,Units,Price,InStock
|
||||
West,Texas,1,927,923.71,1
|
||||
North,Tennessee,3,466,770.67,0
|
||||
East,Florida,0,1520,458.68,1
|
||||
East,Maine,1,1828,661.24,0
|
||||
West,Virginia,1,465,053.58,1
|
||||
North,Missouri,1,436,235.67,1
|
||||
South,Kansas,0,214,992.47,1
|
||||
North,North Dakota,1,789,640.72,0
|
||||
South,Delaware,-1,712,508.55,1
|
||||
"@
|
||||
|
||||
$xlfile = "$PSScriptRoot\test.xlsx"
|
||||
Remove-Item $xlfile -ErrorAction SilentlyContinue
|
||||
|
||||
$cfi1 = New-ConditionalFormattingIconSet -Range C:C -ConditionalFormat ThreeIconSet -IconType Symbols -ShowIconOnly
|
||||
$cfi2 = New-ConditionalFormattingIconSet -Range F:F -ConditionalFormat ThreeIconSet -IconType Symbols2 -ShowIconOnly
|
||||
|
||||
$data | Export-Excel $xlfile -AutoSize -ConditionalFormat $cfi1, $cfi2 -Show
|
||||
21
Examples/ConditionalFormatting/GetConditionalFormatting.ps1
Normal file
@@ -0,0 +1,21 @@
|
||||
try { Import-Module $PSScriptRoot\..\..\ImportExcel.psd1 } catch { throw ; return}
|
||||
|
||||
# This example is using Excel generated by Highlight-DiffCells.ps1
|
||||
# The displayed rule should be the same as in the PS script
|
||||
|
||||
function Get-ConditionalFormatting {
|
||||
param (
|
||||
[string] $xlSourcefile
|
||||
)
|
||||
$excel = Open-ExcelPackage -Path $xlSourcefile
|
||||
|
||||
$excel.Workbook.Worksheets | ForEach-Object {
|
||||
$wsNme = $_.Name
|
||||
$_.ConditionalFormatting | ForEach-Object {
|
||||
"Add-ConditionalFormatting -Worksheet `$excel[""$wsNme""] -Range '$($_.Address)' -ConditionValue '=$($_.Formula)' -RuleType $($_.Type) "
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$xlSourcefile = "$PSScriptRoot\GetConditionalFormatting.xlsx"
|
||||
Get-ConditionalFormatting -xlSourcefile $xlSourcefile
|
||||
BIN
Examples/ConditionalFormatting/GetConditionalFormatting.xlsx
Normal file
26
Examples/ConditionalFormatting/Highlight-DiffCells.ps1
Normal file
@@ -0,0 +1,26 @@
|
||||
try { Import-Module $PSScriptRoot\..\..\ImportExcel.psd1 } catch { throw ; return }
|
||||
|
||||
$xlSourcefile = "$env:TEMP\ImportExcelExample.xlsx"
|
||||
|
||||
Write-Verbose -Verbose -Message "Save location: $xlSourcefile"
|
||||
Remove-Item $xlSourcefile -ErrorAction Ignore
|
||||
|
||||
$data = ConvertFrom-Csv @"
|
||||
Region,State,Units2021,Units2022
|
||||
West,Texas,927,925
|
||||
North,Tennessee,466,466
|
||||
East,Florida,520,458
|
||||
East,Maine,828,661
|
||||
West,Virginia,465,465
|
||||
North,Missouri,436,235
|
||||
South,Kansas,214,214
|
||||
North,North Dakota,789,640
|
||||
South,Delaware,712,508
|
||||
"@
|
||||
|
||||
$excel = $data | Export-Excel $xlSourcefile -AutoSize -PassThru
|
||||
|
||||
Add-ConditionalFormatting -Worksheet $excel.sheet1 -Range "C2:D10" -ConditionValue '=$C2=$D2' -RuleType Expression -BackgroundColor ([System.Drawing.Color]::Thistle) -Bold
|
||||
Add-ConditionalFormatting -Worksheet $excel.sheet1 -Range "A2:D10" -ConditionValue '=$C2=$D2' -RuleType Expression -BackgroundColor ([System.Drawing.Color]::LavenderBlush)
|
||||
|
||||
Close-ExcelPackage $excel -Show
|
||||
23
Examples/CustomNumbers/ShortenNumbers.ps1
Normal file
@@ -0,0 +1,23 @@
|
||||
# How to convert abbreviate or shorten long numbers in Excel
|
||||
|
||||
Remove-Item .\custom.xlsx -ErrorAction SilentlyContinue
|
||||
|
||||
$data = $(
|
||||
12000
|
||||
1000
|
||||
2000
|
||||
3000
|
||||
2400
|
||||
3600
|
||||
6000
|
||||
13000
|
||||
40000
|
||||
400000
|
||||
1000000
|
||||
)
|
||||
|
||||
$excel = $data | Export-Excel .\custom.xlsx -PassThru
|
||||
|
||||
Set-ExcelRange -Worksheet $excel.Sheet1 -Range "A:A" -NumberFormat '[>999999]#,,"M";#,"K"'
|
||||
|
||||
Close-ExcelPackage $excel -Show
|
||||
@@ -6,15 +6,16 @@
|
||||
#>
|
||||
|
||||
param(
|
||||
[Parameter(Mandatory=$true)]
|
||||
$moduleName,
|
||||
$moduleName = "ImportExcel",
|
||||
[ValidateSet('Column','Bar','Line','Pie')]
|
||||
$chartType="Line"
|
||||
)
|
||||
|
||||
$galleryUrl = "https://www.powershellgallery.com/packages/$moduleName"
|
||||
$nolegend = '-nolegend'
|
||||
if($chartType -eq 'pie') {$nolegend = $null}
|
||||
$code = "$($chartType)Chart (Get-HtmlTable $galleryUrl 0 | sort lastupdated -desc) -title 'Download stats for $moduleName' $nolegend"
|
||||
$download = Get-HtmlTable "https://www.powershellgallery.com/packages/$moduleName" -FirstDataRow 1 |
|
||||
Select-Object @{n="Version";e={$v = $Null ; if ($_.version -is [valuetype]) {[string][version]($_.version.tostring("0.0")) }
|
||||
elseif ($_.version -is [string] -and [version]::TryParse($_.version.trim(),[ref]$v)) {$v}
|
||||
else {$_.Version.trim() -replace "\s+"," " } }},
|
||||
Downloads, @{n="LastUpdated";e={[datetime]$_.last_updated}} |
|
||||
Sort-Object lastupdated -Descending
|
||||
|
||||
$code | Invoke-Expression
|
||||
& "$($chartType)Chart" $download "Download stats for $moduleName" -nolegend:($chartype -ne 'pie')
|
||||
|
||||
10
Examples/FormatResults/GetAsMarkdownTable.ps1
Normal file
@@ -0,0 +1,10 @@
|
||||
param(
|
||||
[Alias('FullName')]
|
||||
[String[]]$Path
|
||||
)
|
||||
|
||||
if ($PSVersionTable.PSVersion.Major -gt 5 -and -not (Get-Command Format-Markdown -ErrorAction SilentlyContinue)) {
|
||||
throw "This requires EZOut. Install-Module EZOut -AllowClobber -Scope CurrentUser"
|
||||
}
|
||||
|
||||
Import-Excel $Path | Format-Markdown
|
||||
10
Examples/FormatResults/GetAsYaml.ps1
Normal file
@@ -0,0 +1,10 @@
|
||||
param(
|
||||
[Alias('FullName')]
|
||||
[String[]]$Path
|
||||
)
|
||||
|
||||
if ($PSVersionTable.PSVersion.Major -gt 5 -and -not (Get-Command Format-YAML -ErrorAction SilentlyContinue)) {
|
||||
throw "This requires EZOut. Install-Module EZOut -AllowClobber -Scope CurrentUser"
|
||||
}
|
||||
|
||||
Import-Excel $Path | Format-YAML
|
||||
11
Examples/FormatResults/Sample.csv
Normal file
@@ -0,0 +1,11 @@
|
||||
"OrderId","Category","Sales","Quantity","Discount"
|
||||
"1","Cosmetics","744.01","7","0.7"
|
||||
"2","Grocery","349.13","25","0.3"
|
||||
"3","Apparels","535.11","88","0.2"
|
||||
"4","Electronics","524.69","60","0.1"
|
||||
"5","Electronics","439.1","41","0"
|
||||
"6","Apparels","56.84","54","0.8"
|
||||
"7","Electronics","326.66","97","0.7"
|
||||
"8","Cosmetics","17.25","74","0.6"
|
||||
"9","Grocery","199.96","39","0.4"
|
||||
"10","Grocery","731.77","20","0.3"
|
||||
|
BIN
Examples/FormatResults/Sample.xlsx
Normal file
13
Examples/Grouping/GroupDateColumn.ps1
Normal file
@@ -0,0 +1,13 @@
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
#Get rid of pre-exisiting sheet
|
||||
$xlSourcefile = "$env:TEMP\ImportExcelExample.xlsx"
|
||||
Write-Verbose -Verbose -Message "Save location: $xlSourcefile"
|
||||
Remove-Item $xlSourcefile -ErrorAction Ignore
|
||||
|
||||
$PivotTableDefinition = New-PivotTableDefinition -Activate -PivotTableName Points `
|
||||
-PivotRows Driver -PivotColumns Date -PivotData @{Points = "SUM"} -GroupDateColumn Date -GroupDatePart Years, Months
|
||||
|
||||
Import-Csv "$PSScriptRoot\First10Races.csv" |
|
||||
Select-Object Race, @{n = "Date"; e = {[datetime]::ParseExact($_.date, "dd/MM/yyyy", (Get-Culture))}}, FinishPosition, Driver, GridPosition, Team, Points |
|
||||
Export-Excel $xlSourcefile -Show -AutoSize -PivotTableDefinition $PivotTableDefinition
|
||||
13
Examples/Grouping/GroupNumericColumn.ps1
Normal file
@@ -0,0 +1,13 @@
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
#Get rid of pre-exisiting sheet
|
||||
$xlSourcefile = "$env:TEMP\ImportExcelExample.xlsx"
|
||||
Write-Verbose -Verbose -Message "Save location: $xlSourcefile"
|
||||
Remove-Item $xlSourcefile -ErrorAction Ignore
|
||||
|
||||
$PivotTableDefinition = New-PivotTableDefinition -Activate -PivotTableName Places `
|
||||
-PivotRows Driver -PivotColumns FinishPosition -PivotData @{Date = "Count"} -GroupNumericColumn FinishPosition -GroupNumericMin 1 -GroupNumericMax 25 -GroupNumericInterval 3
|
||||
|
||||
Import-Csv "$PSScriptRoot\First10Races.csv" |
|
||||
Select-Object Race, @{n = "Date"; e = {[datetime]::ParseExact($_.date, "dd/MM/yyyy", (Get-Culture))}}, FinishPosition, Driver, GridPosition, Team, Points |
|
||||
Export-Excel $xlSourcefile -Show -AutoSize -PivotTableDefinition $PivotTableDefinition
|
||||
7
Examples/Import-Excel/ImportMultipleSheetsAsArray.ps1
Normal file
@@ -0,0 +1,7 @@
|
||||
Import-Module $PSScriptRoot\..\..\ImportExcel.psd1 -Force
|
||||
|
||||
$xlfile = "$PSScriptRoot\yearlySales.xlsx"
|
||||
|
||||
$result = Import-Excel -Path $xlfile -WorksheetName * -Raw
|
||||
|
||||
$result | Measure-Object
|
||||
@@ -0,0 +1,9 @@
|
||||
Import-Module $PSScriptRoot\..\..\ImportExcel.psd1 -Force
|
||||
|
||||
$xlfile = "$PSScriptRoot\yearlySales.xlsx"
|
||||
|
||||
$result = Import-Excel -Path $xlfile -WorksheetName *
|
||||
|
||||
foreach ($sheet in $result.Values) {
|
||||
$sheet
|
||||
}
|
||||
BIN
Examples/Import-Excel/yearlySales.xlsx
Normal file
BIN
Examples/ImportByColumns/FruitCity.xlsx
Normal file
BIN
Examples/ImportByColumns/VM_Build_Example.xlsx
Normal file
146
Examples/ImportByColumns/import-by-columns.ps1
Normal file
@@ -0,0 +1,146 @@
|
||||
function Import-ByColumns {
|
||||
<#
|
||||
.synopsis
|
||||
Works like Import-Excel but with data in columns instead of the conventional rows.
|
||||
.Description.
|
||||
Import-excel will read the sample file in this folder like this
|
||||
> Import-excel FruitCity.xlsx | ft *
|
||||
GroupAs Apple Orange Banana
|
||||
------- ----- ------ ------
|
||||
London 1 4 9
|
||||
Paris 2 4 10
|
||||
NewYork 6 5 11
|
||||
Munich 7 8 12
|
||||
Import-ByColumns transposes it
|
||||
> Import-Bycolumns FruitCity.xlsx | ft *
|
||||
GroupAs London Paris NewYork Munich
|
||||
------- ------ ----- ------- ------
|
||||
Apple 1 2 6 7
|
||||
Orange 4 4 5 8
|
||||
Banana 9 10 11 12
|
||||
.Example
|
||||
C:\> Import-Bycolumns -path .\VM_Build_Example.xlsx -StartRow 7 -EndRow 21 -EndColumn 7 -HeaderName Desc,size,type,
|
||||
cpu,ram,NetAcc,OS,OSDiskSize,DataDiskSize,LogDiskSize,TempDbDiskSize,BackupDiskSize,ImageDiskDize,AzureBackup,AzureReplication | ft -a *
|
||||
|
||||
This reads a spreadsheet which has a block from row 7 to 21 containing 14 properties of virtual machines.
|
||||
The properties names are in column A and the 6 VMS are in columns B-G
|
||||
Because the property names are written for easy reading by the person completing the spreadsheet, they are replaced with new names.
|
||||
All the parameters work as they would for Import-Excel
|
||||
#>
|
||||
|
||||
[Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSAvoidUsingPlainTextForPassword", "")]
|
||||
param(
|
||||
[Alias('FullName')]
|
||||
[Parameter(ParameterSetName = "PathA", Mandatory, ValueFromPipelineByPropertyName, ValueFromPipeline, Position = 0 )]
|
||||
[Parameter(ParameterSetName = "PathB", Mandatory, ValueFromPipelineByPropertyName, ValueFromPipeline, Position = 0 )]
|
||||
[Parameter(ParameterSetName = "PathC", Mandatory, ValueFromPipelineByPropertyName, ValueFromPipeline, Position = 0 )]
|
||||
[String]$Path,
|
||||
|
||||
[Parameter(ParameterSetName = "PackageA", Mandatory)]
|
||||
[Parameter(ParameterSetName = "PackageB", Mandatory)]
|
||||
[Parameter(ParameterSetName = "PackageC", Mandatory)]
|
||||
[OfficeOpenXml.ExcelPackage]$ExcelPackage,
|
||||
|
||||
[Alias('Sheet')]
|
||||
[Parameter(Position = 1)]
|
||||
[ValidateNotNullOrEmpty()]
|
||||
[String]$WorksheetName,
|
||||
|
||||
[Parameter(ParameterSetName = 'PathB' , Mandatory)]
|
||||
[Parameter(ParameterSetName = 'PackageB', Mandatory)]
|
||||
[String[]]$HeaderName ,
|
||||
[Parameter(ParameterSetName = 'PathC' , Mandatory)]
|
||||
[Parameter(ParameterSetName = 'PackageC', Mandatory)]
|
||||
[Switch]$NoHeader,
|
||||
|
||||
[Alias('TopRow')]
|
||||
[ValidateRange(1, 9999)]
|
||||
[Int]$StartRow = 1,
|
||||
|
||||
[Alias('StopRow', 'BottomRow')]
|
||||
[Int]$EndRow ,
|
||||
|
||||
[Alias('LeftColumn','LabelColumn')]
|
||||
[Int]$StartColumn = 1,
|
||||
|
||||
[Int]$EndColumn,
|
||||
[switch]$DataOnly,
|
||||
[switch]$AsHash,
|
||||
|
||||
[ValidateNotNullOrEmpty()]
|
||||
[String]$Password
|
||||
)
|
||||
function Get-PropertyNames {
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Create objects containing the row number and the row name for each of the different header types.
|
||||
#>
|
||||
[Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseSingularNouns', '', Justification = "Name would be incorrect, and command is not exported")]
|
||||
param(
|
||||
[Parameter(Mandatory)]
|
||||
[Int[]]$Rows,
|
||||
[Parameter(Mandatory)]
|
||||
[Int]$StartColumn
|
||||
)
|
||||
if ($HeaderName) {
|
||||
$i = 0
|
||||
foreach ($h in $HeaderName) {
|
||||
$h | Select-Object @{n='Row'; e={$rows[$i]}}, @{n='Value'; e={$h} }
|
||||
$i++
|
||||
}
|
||||
}
|
||||
elseif ($NoHeader) {
|
||||
$i = 0
|
||||
foreach ($r in $rows) {
|
||||
$i++
|
||||
$r | Select-Object @{n='Row'; e={$_}}, @{n='Value'; e={"P$i"} }
|
||||
}
|
||||
}
|
||||
else {
|
||||
foreach ($r in $Rows) {
|
||||
#allow "False" or "0" to be headings
|
||||
$Worksheet.Cells[$r, $StartColumn] | Where-Object {-not [string]::IsNullOrEmpty($_.Value) } | Select-Object @{n='Row'; e={$r} }, Value
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#region open file if necessary, find worksheet and ensure we have start/end row/columns
|
||||
if ($Path -and -not $ExcelPackage -and $Password) {
|
||||
$ExcelPackage = Open-ExcelPackage -Path $Path -Password $Password
|
||||
}
|
||||
elseif ($Path -and -not $ExcelPackage ) {
|
||||
$ExcelPackage = Open-ExcelPackage -Path $Path
|
||||
}
|
||||
if (-not $ExcelPackage) {
|
||||
throw 'Could not get an Excel workbook to work on' ; return
|
||||
}
|
||||
|
||||
if (-not $WorksheetName) { $Worksheet = $ExcelPackage.Workbook.Worksheets[1] }
|
||||
elseif (-not ($Worksheet = $ExcelPackage.Workbook.Worksheets[$WorkSheetName])) {
|
||||
throw "Worksheet '$WorksheetName' not found, the workbook only contains the worksheets '$($ExcelPackage.Workbook.Worksheets)'. If you only wish to select the first worksheet, please remove the '-WorksheetName' parameter." ; return
|
||||
}
|
||||
|
||||
if (-not $EndRow ) { $EndRow = $Worksheet.Dimension.End.Row }
|
||||
if (-not $EndColumn) { $EndColumn = $Worksheet.Dimension.End.Column }
|
||||
#endregion
|
||||
|
||||
$Rows = $Startrow .. $EndRow ;
|
||||
$Columns = (1 + $StartColumn)..$EndColumn
|
||||
|
||||
if ((-not $rows) -or (-not ($PropertyNames = Get-PropertyNames -Rows $Rows -StartColumn $StartColumn))) {
|
||||
throw "No headers found in left coulmn '$Startcolumn'. "; return
|
||||
}
|
||||
if (-not $Columns) {
|
||||
Write-Warning "Worksheet '$WorksheetName' in workbook contains no data in the rows after left column '$StartColumn'"
|
||||
}
|
||||
else {
|
||||
foreach ($c in $Columns) {
|
||||
$NewColumn = [Ordered]@{ }
|
||||
foreach ($p in $PropertyNames) {
|
||||
$NewColumn[$p.Value] = $Worksheet.Cells[$p.row,$c].text
|
||||
}
|
||||
if ($AsHash) {$NewColumn}
|
||||
elseif (($NewColumn.Values -ne "") -or -not $dataonly) {[PSCustomObject]$NewColumn}
|
||||
}
|
||||
}
|
||||
}
|
||||
28
Examples/OpenExcelPackage/EnableFeatures.ps1
Normal file
@@ -0,0 +1,28 @@
|
||||
# How to use Enable-ExcelAutoFilter and Enable-ExcelAutofit
|
||||
|
||||
try { Import-Module $PSScriptRoot\..\..\ImportExcel.psd1 } catch { throw ; return }
|
||||
|
||||
$data = ConvertFrom-Csv @"
|
||||
RegionInfo,StateInfo,Units,Price
|
||||
West,Texas,927,923.71
|
||||
North,Tennessee,466,770.67
|
||||
East,Florida,520,458.68
|
||||
East,Maine,828,661.24
|
||||
West,Virginia,465,053.58
|
||||
North,Missouri,436,235.67
|
||||
South,Kansas,214,992.47
|
||||
North,North Dakota,789,640.72
|
||||
South,Delaware,712,508.55
|
||||
"@
|
||||
|
||||
$xlfile = "$PSScriptRoot\enableFeatures.xlsx"
|
||||
Remove-Item $xlfile -ErrorAction SilentlyContinue
|
||||
|
||||
$data | Export-Excel $xlfile
|
||||
|
||||
$excel = Open-ExcelPackage $xlfile
|
||||
|
||||
Enable-ExcelAutoFilter -Worksheet $excel.Sheet1
|
||||
Enable-ExcelAutofit -Worksheet $excel.Sheet1
|
||||
|
||||
Close-ExcelPackage $excel -Show
|
||||
29
Examples/Tables/SalesData-WithTotalRow.ps1
Normal file
@@ -0,0 +1,29 @@
|
||||
try { Import-Module $PSScriptRoot\..\..\ImportExcel.psd1 } catch { throw ; return }
|
||||
|
||||
$data = ConvertFrom-Csv @"
|
||||
OrderId,Category,Sales,Quantity,Discount
|
||||
1,Cosmetics,744.01,07,0.7
|
||||
2,Grocery,349.13,25,0.3
|
||||
3,Apparels,535.11,88,0.2
|
||||
4,Electronics,524.69,60,0.1
|
||||
5,Electronics,439.10,41,0.0
|
||||
6,Apparels,56.84,54,0.8
|
||||
7,Electronics,326.66,97,0.7
|
||||
8,Cosmetics,17.25,74,0.6
|
||||
9,Grocery,199.96,39,0.4
|
||||
10,Grocery,731.77,20,0.3
|
||||
"@
|
||||
|
||||
$xlfile = "$PSScriptRoot\TotalsRow.xlsx"
|
||||
Remove-Item $xlfile -ErrorAction SilentlyContinue
|
||||
|
||||
$TableTotalSettings = @{
|
||||
Quantity = 'Sum'
|
||||
Category = '=COUNTIF([Category],"<>Electronics")' # Count the number of categories not equal to Electronics
|
||||
Sales = @{
|
||||
Function = '=SUMIF([Category],"<>Electronics",[Sales])'
|
||||
Comment = "Sum of sales for everything that is NOT Electronics"
|
||||
}
|
||||
}
|
||||
|
||||
$data | Export-Excel -Path $xlfile -TableName Sales -TableStyle Medium10 -TableTotalSettings $TableTotalSettings -AutoSize -Show
|
||||
16
Examples/Tables/TotalsRow.ps1
Normal file
@@ -0,0 +1,16 @@
|
||||
try {Import-Module $PSScriptRoot\..\..\ImportExcel.psd1} catch {throw ; return}
|
||||
|
||||
$r = Get-ChildItem C:\WINDOWS\system32 -File
|
||||
|
||||
$TotalSettings = @{
|
||||
Name = "Count"
|
||||
# You can create the formula in an Excel workbook first and copy-paste it here
|
||||
# This syntax can only be used for the Custom type
|
||||
Extension = "=COUNTIF([Extension];`".exe`")"
|
||||
Length = @{
|
||||
Function = "=SUMIF([Extension];`".exe`";[Length])"
|
||||
Comment = "Sum of all exe sizes"
|
||||
}
|
||||
}
|
||||
|
||||
$r | Export-Excel -TableName system32files -TableStyle Medium10 -TableTotalSettings $TotalSettings -Show
|
||||
62
Examples/VBA/ChangePivotTablesVBA.ps1
Normal file
@@ -0,0 +1,62 @@
|
||||
<#
|
||||
Excel VBA macro which changes all PivotTables in the workbook to Tabular form, disables subtotals and repeats item labels.
|
||||
https://github.com/dfinke/ImportExcel/issues/1196#issuecomment-1156320581
|
||||
#>
|
||||
$ExcelFile = "$ENV:TEMP\test.xlsm"
|
||||
Remove-Item -Path $ExcelFile -ErrorAction SilentlyContinue
|
||||
|
||||
$Macro = @"
|
||||
Private Sub Workbook_Open()
|
||||
'
|
||||
' ChangePivotTables Macro
|
||||
' Runs when the Excel workbook is opened.
|
||||
'
|
||||
' Changes all PivotTables in the workbook to Tabular form, repeats labels
|
||||
' and disables Subtotals.
|
||||
'
|
||||
' Declare variables
|
||||
Dim Ws As Worksheet
|
||||
Dim Pt As PivotTable
|
||||
Dim Pf As PivotField
|
||||
' Disable screen updates
|
||||
Application.ScreenUpdating = False
|
||||
' Continue even if an error occurs
|
||||
On Error Resume Next
|
||||
For Each Ws In ActiveWorkbook.Worksheets
|
||||
For Each Pt In Ws.PivotTables
|
||||
Pt.RowAxisLayout xlTabularRow
|
||||
Pt.RepeatAllLabels xlRepeatLabels
|
||||
For Each Pf In Pt.PivotFields
|
||||
Pf.Subtotals(1) = False
|
||||
Next
|
||||
Next
|
||||
Next
|
||||
Application.ScreenUpdating = True
|
||||
End Sub
|
||||
"@
|
||||
|
||||
$Data = ConvertFrom-Csv -InputObject @"
|
||||
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
|
||||
"@
|
||||
|
||||
$ExcelPackage = $Data | Export-Excel -Path $ExcelFile -TableName "Sales" -WorksheetName "Sales" -AutoSize -PassThru
|
||||
# Add Macro to the ThisWorkbook module
|
||||
$ExcelPackage.Workbook.CreateVBAProject()
|
||||
$VBAThisWorkbookModule = $ExcelPackage.Workbook.VbaProject.Modules | Where-Object -FilterScript { $_.Name -eq "ThisWorkbook" }
|
||||
$VBAThisWorkbookModule.Code = $Macro
|
||||
|
||||
# Create PivotTable example
|
||||
Add-PivotTable -PivotTableName "SalesPivot" -Address $ExcelPackage.Sales.Cells["E1"] -SourceWorksheet $ExcelPackage.Sales `
|
||||
-SourceRange $ExcelPackage.Sales.Tables[0].Address -PivotRows "Region", "Item" -PivotData @{ "TotalSold" = "Sum" }
|
||||
|
||||
Close-ExcelPackage -ExcelPackage $ExcelPackage -Show
|
||||
@@ -1,52 +0,0 @@
|
||||
|
||||
Function Import-Bycolumns {
|
||||
Param(
|
||||
[Parameter(Mandatory=$true)]
|
||||
[OfficeOpenXml.ExcelPackage]$ExcelPackage,
|
||||
[Int]$StartRow = 1,
|
||||
[String]$WorksheetName,
|
||||
[Int]$EndRow ,
|
||||
[Int]$StartColumn = 1,
|
||||
[Int]$EndColumn
|
||||
)
|
||||
Function Get-RowNames {
|
||||
[Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseSingularNouns', '', Justification = "Name would be incorrect, and command is not exported")]
|
||||
param(
|
||||
[Parameter(Mandatory)]
|
||||
[Int[]]$Rows,
|
||||
[Parameter(Mandatory)]
|
||||
[Int]$StartColumn
|
||||
)
|
||||
foreach ($R in $Rows) {
|
||||
#allow "False" or "0" to be headings
|
||||
$Worksheet.Cells[$R, $StartColumn] | Where-Object {-not [string]::IsNullOrEmpty($_.Value) } | Select-Object @{N = 'Row'; E = { $R } }, Value
|
||||
}
|
||||
}
|
||||
|
||||
if (-not $WorksheetName) { $Worksheet = $ExcelPackage.Workbook.Worksheets[1] }
|
||||
elseif (-not ($Worksheet = $ExcelPackage.Workbook.Worksheets[$WorkSheetName])) {
|
||||
throw "Worksheet '$WorksheetName' not found, the workbook only contains the worksheets '$($ExcelPackage.Workbook.Worksheets)'. If you only wish to select the first worksheet, please remove the '-WorksheetName' parameter." ; return
|
||||
}
|
||||
|
||||
if (-not $EndRow ) { $EndRow = $Worksheet.Dimension.End.Row }
|
||||
if (-not $EndColumn) { $EndColumn = $Worksheet.Dimension.End.Column }
|
||||
|
||||
$Rows = $Startrow .. $EndRow ;
|
||||
$Columns = (1 + $StartColumn)..$EndColumn
|
||||
|
||||
if ((-not $rows) -or (-not ($PropertyNames = Get-RowNames -Rows $Rows -StartColumn $StartColumn))) {
|
||||
throw "No headers found in left coulmn '$Startcolumn'. "; return
|
||||
}
|
||||
if (-not $Columns) {
|
||||
Write-Warning "Worksheet '$WorksheetName' in workbook contains no data in the rows after left column '$StartColumn'"
|
||||
}
|
||||
else {
|
||||
foreach ($c in $Columns) {
|
||||
$NewColumn = [Ordered]@{ }
|
||||
foreach ($p in $PropertyNames) {
|
||||
$NewColumn[$p.Value] = $Worksheet.Cells[$p.row,$c].text
|
||||
}
|
||||
[PSCustomObject]$NewColumn
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -6,7 +6,7 @@
|
||||
RootModule = 'ImportExcel.psm1'
|
||||
|
||||
# Version number of this module.
|
||||
ModuleVersion = '7.4.2'
|
||||
ModuleVersion = '7.8.6'
|
||||
|
||||
# ID used to uniquely identify this module
|
||||
GUID = '60dd4136-feff-401a-ba27-a84458c57ede'
|
||||
@@ -48,11 +48,15 @@ Check out the How To Videos https://www.youtube.com/watch?v=U3Ne_yX4tYo&list=PL5
|
||||
'ConvertTo-ExcelXlsx',
|
||||
'Copy-ExcelWorksheet',
|
||||
'DoChart',
|
||||
'Enable-ExcelAutoFilter',
|
||||
'Enable-ExcelAutofit',
|
||||
'Expand-NumberFormat',
|
||||
'Export-Excel',
|
||||
'Export-ExcelSheet',
|
||||
'Get-ExcelColumnName',
|
||||
'Get-ExcelFileSummary',
|
||||
'Get-ExcelFileSchema',
|
||||
'Get-ExcelFileSummary',
|
||||
'Get-ExcelSheetDimensionAddress',
|
||||
'Get-ExcelSheetInfo',
|
||||
'Get-ExcelWorkbookInfo',
|
||||
'Get-HtmlTable',
|
||||
@@ -63,8 +67,8 @@ Check out the How To Videos https://www.youtube.com/watch?v=U3Ne_yX4tYo&list=PL5
|
||||
'Import-UPS',
|
||||
'Import-USPS',
|
||||
'Invoke-AllTests',
|
||||
'Invoke-Sum',
|
||||
'Invoke-ExcelQuery',
|
||||
'Invoke-Sum',
|
||||
'Join-Worksheet',
|
||||
'LineChart',
|
||||
'Merge-MultipleSheets',
|
||||
@@ -80,11 +84,12 @@ Check out the How To Videos https://www.youtube.com/watch?v=U3Ne_yX4tYo&list=PL5
|
||||
'PieChart',
|
||||
'Pivot',
|
||||
'Read-Clipboard',
|
||||
'ReadClipboardImpl',
|
||||
'Read-OleDbData',
|
||||
'ReadClipboardImpl',
|
||||
'Remove-Worksheet',
|
||||
'Select-Worksheet',
|
||||
'Send-SQLDataToExcel',
|
||||
'Set-CellComment',
|
||||
'Set-CellStyle',
|
||||
'Set-ExcelColumn',
|
||||
'Set-ExcelRange',
|
||||
@@ -118,8 +123,7 @@ Check out the How To Videos https://www.youtube.com/watch?v=U3Ne_yX4tYo&list=PL5
|
||||
'.\GetExcelTable.ps1',
|
||||
'.\ImportExcel.psd1',
|
||||
'.\ImportExcel.psm1',
|
||||
'.\LICENSE.txt',
|
||||
'.\README.md',
|
||||
'.\LICENSE.txt',
|
||||
'.\Plot.ps1',
|
||||
'.\Private',
|
||||
'.\Public',
|
||||
@@ -128,9 +132,8 @@ Check out the How To Videos https://www.youtube.com/watch?v=U3Ne_yX4tYo&list=PL5
|
||||
'.\Charting\Charting.ps1',
|
||||
'.\InferData\InferData.ps1',
|
||||
'.\Pivot\Pivot.ps1',
|
||||
'.\spikes\ConvertFrom-ExcelColumnName.ps1',
|
||||
'.\Examples', '.\images', '.\Testimonials'
|
||||
|
||||
'.\Examples',
|
||||
'.\Testimonials'
|
||||
)
|
||||
|
||||
# Private data to pass to the module specified in RootModule/ModuleToProcess
|
||||
|
||||
@@ -7,5 +7,5 @@ if (-not $fullPath) {
|
||||
$fullPath = Join-Path $fullPath -ChildPath "ImportExcel"
|
||||
}
|
||||
Push-location $PSScriptRoot
|
||||
Robocopy . $fullPath /mir /XD .vscode .git CI __tests__ data mdHelp /XF appveyor.yml azure-pipelines.yml .gitattributes .gitignore filelist.txt install.ps1 InstallModule.ps1
|
||||
Robocopy . $fullPath /mir /XD .vscode images .git .github CI __tests__ data mdHelp spikes /XF README.md README.original.md appveyor.yml azure-pipelines.yml .gitattributes .gitignore filelist.txt install.ps1 InstallModule.ps1 PublishToGallery.ps1
|
||||
Pop-Location
|
||||
@@ -23,6 +23,7 @@
|
||||
[Parameter(ParameterSetName = "FourIconSet")]
|
||||
[Parameter(ParameterSetName = "FiveIconSet")]
|
||||
[switch]$Reverse,
|
||||
[switch]$ShowIconOnly,
|
||||
[Parameter(ParameterSetName = "NamedRule",Position = 2)]
|
||||
$ConditionValue,
|
||||
[Parameter(ParameterSetName = "NamedRule",Position = 3)]
|
||||
@@ -84,6 +85,9 @@
|
||||
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($ShowIconOnly) {
|
||||
$rule.ShowValue = $false
|
||||
}
|
||||
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}
|
||||
@@ -118,7 +122,7 @@
|
||||
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 }
|
||||
$RuleType -match "Top|Bottom" ) {$rule.Rank = $ConditionValue }
|
||||
if ($PSBoundParameters.ContainsKey("ConditionValue" ) -and
|
||||
$RuleType -match "StdDev" ) {$rule.StdDev = $ConditionValue }
|
||||
if ($PSBoundParameters.ContainsKey("ConditionValue" ) -and
|
||||
|
||||
@@ -9,7 +9,7 @@ function Add-ExcelTable {
|
||||
[Switch]$ShowHeader ,
|
||||
[Switch]$ShowFilter,
|
||||
[Switch]$ShowTotal,
|
||||
[hashtable]$TotalSettings,
|
||||
[hashtable]$TableTotalSettings,
|
||||
[Switch]$ShowFirstColumn,
|
||||
[Switch]$ShowLastColumn,
|
||||
[Switch]$ShowRowStripes,
|
||||
@@ -51,14 +51,65 @@ function Add-ExcelTable {
|
||||
}
|
||||
#it seems that show total changes some of the others, so the sequence matters.
|
||||
if ($PSBoundParameters.ContainsKey('ShowHeader')) {$tbl.ShowHeader = [bool]$ShowHeader}
|
||||
if ($PSBoundParameters.ContainsKey('TotalSettings')) {
|
||||
if ($PSBoundParameters.ContainsKey('TableTotalSettings') -And $Null -ne $TableTotalSettings) {
|
||||
$tbl.ShowTotal = $true
|
||||
foreach ($k in $TotalSettings.keys) {
|
||||
if (-not $tbl.Columns[$k]) {Write-Warning -Message "Table does not have a Column '$k'."}
|
||||
elseif ($TotalSettings[$k] -notin @("Average", "Count", "CountNums", "Max", "Min", "None", "StdDev", "Sum", "Var") ) {
|
||||
Write-Warning -Message "'$($TotalSettings[$k])' is not a valid total function."
|
||||
foreach ($k in $TableTotalSettings.keys) {
|
||||
|
||||
# Get the Function to be added in the totals row
|
||||
if ($TableTotalSettings[$k] -is [HashTable]) {
|
||||
If ($TableTotalSettings[$k].Keys -contains "Function") {
|
||||
$TotalFunction = $TableTotalSettings[$k]["Function"]
|
||||
}
|
||||
Else { Write-Warning -Message "TableTotalSettings parameter for column '$k' needs a key 'Function'" }
|
||||
}
|
||||
else {
|
||||
$TotalFunction = [String]($TableTotalSettings[$k])
|
||||
}
|
||||
|
||||
# Add the totals row
|
||||
if (-not $tbl.Columns[$k]) {Write-Warning -Message "Table does not have a Column '$k'."}
|
||||
elseif ($TotalFunction -match "^=") {
|
||||
### A function in Excel uses ";" between parameters but the OpenXML parameter separator is ","
|
||||
### Only replace semicolon when it's NOT somewhere between quotes quotes.
|
||||
# Get all text between quotes
|
||||
$QuoteMatches = [Regex]::Matches($TotalFunction,"`"[^`"]*`"|'[^']*'")
|
||||
# Create array with all indexes of characters between quotes (and the quotes themselves)
|
||||
$QuoteCharIndexes = $(
|
||||
Foreach ($QuoteMatch in $QuoteMatches) {
|
||||
(($QuoteMatch.Index)..($QuoteMatch.Index + $QuoteMatch.Length - 1))
|
||||
}
|
||||
)
|
||||
|
||||
# Get all semicolons
|
||||
$SemiColonMatches = [Regex]::Matches($TotalFunction, ";")
|
||||
# Replace the semicolons of which the index is not in the list of quote-text indexes
|
||||
Foreach ($SemiColonMatch in $SemiColonMatches.Index) {
|
||||
If ($QuoteCharIndexes -notcontains $SemiColonMatch) {
|
||||
$TotalFunction = $TotalFunction.remove($SemiColonMatch,1).Insert($SemiColonMatch,",")
|
||||
}
|
||||
}
|
||||
|
||||
# Configure the formula. The TotalsRowFunction is automatically set to "Custom" when the TotalsRowFormula is set.
|
||||
$tbl.Columns[$k].TotalsRowFormula = $TotalFunction
|
||||
}
|
||||
elseif ($TotalFunction -notin @("Average", "Count", "CountNums", "Max", "Min", "None", "StdDev", "Sum", "Var") ) {
|
||||
Write-Warning -Message "'$($TotalFunction)' is not a valid total function."
|
||||
}
|
||||
else {$tbl.Columns[$k].TotalsRowFunction = $TotalFunction}
|
||||
|
||||
# Set comment on totals row
|
||||
If ($TableTotalSettings[$k] -is [HashTable] -and $TableTotalSettings[$k].Keys -contains "Comment" -and ![String]::IsNullOrEmpty($TableTotalSettings[$k]["Comment"])) {
|
||||
$ColumnLetter = [officeOpenXml.ExcelAddress]::GetAddressCol(($tbl.columns | ? { $_.name -eq $k }).Id, $False)
|
||||
$CommentRange = "{0}{1}" -f $ColumnLetter, $tbl.Address.End.Row
|
||||
|
||||
$CellCommentParams = @{
|
||||
Worksheet = $tbl.WorkSheet
|
||||
Range = $CommentRange
|
||||
Text = $TableTotalSettings[$k]["Comment"]
|
||||
}
|
||||
|
||||
Set-CellComment @CellCommentParams
|
||||
}
|
||||
else {$tbl.Columns[$k].TotalsRowFunction = $TotalSettings[$k]}
|
||||
}
|
||||
}
|
||||
elseif ($PSBoundParameters.ContainsKey('ShowTotal')) {$tbl.ShowTotal = [bool]$ShowTotal}
|
||||
|
||||
@@ -18,8 +18,10 @@
|
||||
[String]$PivotTotals = "Both",
|
||||
[Switch]$NoTotalsInPivot,
|
||||
[String]$GroupDateRow,
|
||||
[String]$GroupDateColumn,
|
||||
[OfficeOpenXml.Table.PivotTable.eDateGroupBy[]]$GroupDatePart,
|
||||
[String]$GroupNumericRow,
|
||||
[String]$GroupNumericColumn,
|
||||
[double]$GroupNumericMin = 0 ,
|
||||
[double]$GroupNumericMax = [Double]::MaxValue ,
|
||||
[double]$GroupNumericInterval = 100 ,
|
||||
@@ -139,11 +141,21 @@
|
||||
if (-not $r ) {Write-Warning -Message "Could not find a Row field named '$GroupNumericRow'; no numeric grouping will be done."}
|
||||
else {$r.AddNumericGrouping($GroupNumericMin, $GroupNumericMax, $GroupNumericInterval)}
|
||||
}
|
||||
elseif ($GroupNumericColumn) {
|
||||
$c = $pivotTable.ColumnFields.Where( {$_.name -eq $GroupNumericColumn })
|
||||
if (-not $c ) {Write-Warning -Message "Could not find a Column field named '$GroupNumericColumn'; no numeric grouping will be done."}
|
||||
else {$c.AddNumericGrouping($GroupNumericMin, $GroupNumericMax, $GroupNumericInterval)}
|
||||
}
|
||||
if ($GroupDateRow -and $PSBoundParameters.ContainsKey("GroupDatePart")) {
|
||||
$r = $pivotTable.RowFields.Where( {$_.name -eq $GroupDateRow })
|
||||
if (-not $r ) {Write-Warning -Message "Could not find a Row field named '$GroupDateRow'; no date grouping will be done."}
|
||||
else {$r.AddDateGrouping($GroupDatePart)}
|
||||
}
|
||||
elseif ($GroupDateColumn -and $PSBoundParameters.ContainsKey("GroupDatePart")) {
|
||||
$c = $pivotTable.ColumnFields.Where( {$_.name -eq $GroupDateColumn })
|
||||
if (-not $c ) {Write-Warning -Message "Could not find a Column field named '$GroupDateColumn'; no date grouping will be done."}
|
||||
else {$c.AddDateGrouping($GroupDatePart)}
|
||||
}
|
||||
}
|
||||
catch {Write-Warning -Message "Failed adding PivotTable '$pivotTableName': $_"}
|
||||
}
|
||||
|
||||
@@ -49,7 +49,7 @@ function Add-Worksheet {
|
||||
}
|
||||
else {$ExcelWorkbook.Worksheets.MoveBefore($WorksheetName, $MoveBefore)}
|
||||
}
|
||||
else {Write-Warning "Can't find worksheet '$MoveBefore'; worsheet '$WorksheetName' will not be moved."}
|
||||
else {Write-Warning "Can't find worksheet '$MoveBefore'; worksheet '$WorksheetName' will not be moved."}
|
||||
}
|
||||
elseif ($MoveAfter ) {
|
||||
if ($MoveAfter -eq "*") {
|
||||
@@ -68,7 +68,7 @@ function Add-Worksheet {
|
||||
$ExcelWorkbook.Worksheets.MoveAfter($WorksheetName, $MoveAfter)
|
||||
}
|
||||
}
|
||||
else {Write-Warning "Can't find worksheet '$MoveAfter'; worsheet '$WorksheetName' will not be moved."}
|
||||
else {Write-Warning "Can't find worksheet '$MoveAfter'; worksheet '$WorksheetName' will not be moved."}
|
||||
}
|
||||
#endregion
|
||||
if ($Activate) {Select-Worksheet -ExcelWorksheet $ws }
|
||||
|
||||
@@ -8,7 +8,8 @@ function ConvertFrom-ExcelData {
|
||||
[ScriptBlock]$ScriptBlock,
|
||||
[Alias("Sheet")]
|
||||
$WorksheetName = 1,
|
||||
[int]$HeaderRow = 1,
|
||||
[Alias('HeaderRow', 'TopRow')]
|
||||
[int]$StartRow = 1,
|
||||
[string[]]$Header,
|
||||
[switch]$NoHeader,
|
||||
[switch]$DataOnly
|
||||
|
||||
16
Public/Enable-ExcelAutoFilter.ps1
Normal file
@@ -0,0 +1,16 @@
|
||||
function Enable-ExcelAutoFilter {
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Enable the Excel AutoFilter
|
||||
|
||||
.EXAMPLE
|
||||
Enable-ExcelAutoFilter $targetSheet
|
||||
#>
|
||||
param(
|
||||
[Parameter(Mandatory)]
|
||||
[OfficeOpenXml.ExcelWorksheet]$Worksheet
|
||||
)
|
||||
|
||||
$range = Get-ExcelSheetDimensionAddress $Worksheet
|
||||
$Worksheet.Cells[$range].AutoFilter = $true
|
||||
}
|
||||
16
Public/Enable-ExcelAutofit.ps1
Normal file
@@ -0,0 +1,16 @@
|
||||
function Enable-ExcelAutofit {
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Make all text fit the cells
|
||||
|
||||
.EXAMPLE
|
||||
Enable-ExcelAutofit $excel.Sheet1
|
||||
#>
|
||||
param(
|
||||
[Parameter(Mandatory)]
|
||||
[OfficeOpenXml.ExcelWorksheet]$Worksheet
|
||||
)
|
||||
|
||||
$range = Get-ExcelSheetDimensionAddress $Worksheet
|
||||
$Worksheet.Cells[$range].AutoFitColumns()
|
||||
}
|
||||
@@ -56,7 +56,8 @@
|
||||
[Alias('Table')]
|
||||
$TableName,
|
||||
[OfficeOpenXml.Table.TableStyles]$TableStyle = [OfficeOpenXml.Table.TableStyles]::Medium6,
|
||||
[Switch]$Barchart,
|
||||
[HashTable]$TableTotalSettings,
|
||||
[Switch]$BarChart,
|
||||
[Switch]$PieChart,
|
||||
[Switch]$LineChart ,
|
||||
[Switch]$ColumnChart ,
|
||||
@@ -78,6 +79,7 @@
|
||||
[Switch]$NoAliasOrScriptPropeties,
|
||||
[Switch]$DisplayPropertySet,
|
||||
[String[]]$NoNumberConversion,
|
||||
[String[]]$NoHyperLinkConversion,
|
||||
[Object[]]$ConditionalFormat,
|
||||
[Object[]]$ConditionalText,
|
||||
[Object[]]$Style,
|
||||
@@ -211,7 +213,7 @@
|
||||
$row ++
|
||||
$null = $ws.Cells[$row, $StartColumn].LoadFromDataTable($InputObject, $false )
|
||||
if ($TableName -or $PSBoundParameters.ContainsKey('TableStyle')) {
|
||||
Add-ExcelTable -Range $ws.Cells[$ws.Dimension] -TableName $TableName -TableStyle $TableStyle
|
||||
Add-ExcelTable -Range $ws.Cells[$ws.Dimension] -TableName $TableName -TableStyle $TableStyle -TableTotalSettings $TableTotalSettings
|
||||
}
|
||||
}
|
||||
else {
|
||||
@@ -317,7 +319,9 @@
|
||||
$ws.Cells[$row, $ColumnIndex].Value = $v
|
||||
if ($setNumformat) { $ws.Cells[$row, $ColumnIndex].Style.Numberformat.Format = $Numberformat }
|
||||
}
|
||||
elseif ($v -is [uri] ) {
|
||||
elseif ($v -is [uri] -and
|
||||
$NoHyperLinkConversion -ne '*' -and
|
||||
$NoHyperLinkConversion -notcontains $Name ) {
|
||||
$ws.Cells[$row, $ColumnIndex].HyperLink = $v
|
||||
$ws.Cells[$row, $ColumnIndex].Style.Font.Color.SetColor([System.Drawing.Color]::Blue)
|
||||
$ws.Cells[$row, $ColumnIndex].Style.Font.UnderLine = $true
|
||||
@@ -330,7 +334,10 @@
|
||||
$ws.Cells[$row, $ColumnIndex].Formula = ($v -replace '^=', '')
|
||||
if ($setNumformat) { $ws.Cells[$row, $ColumnIndex].Style.Numberformat.Format = $Numberformat }
|
||||
}
|
||||
elseif ( [System.Uri]::IsWellFormedUriString($v , [System.UriKind]::Absolute) ) {
|
||||
elseif ( $NoHyperLinkConversion -ne '*' -and # Put the check for 'NoHyperLinkConversion is null' first to skip checking for wellformedstring
|
||||
$NoHyperLinkConversion -notcontains $Name -and
|
||||
[System.Uri]::IsWellFormedUriString($v , [System.UriKind]::Absolute)
|
||||
) {
|
||||
if ($v -match "^xl://internal/") {
|
||||
$referenceAddress = $v -replace "^xl://internal/" , ""
|
||||
$display = $referenceAddress -replace "!A1$" , ""
|
||||
@@ -343,8 +350,8 @@
|
||||
}
|
||||
else {
|
||||
$number = $null
|
||||
if ( $numberRegex.IsMatch($v) -and # if it contains digit(s) - this syntax is quicker than -match for many items and cuts out slow checks for non numbers
|
||||
$NoNumberConversion -ne '*' -and # and NoNumberConversion isn't specified
|
||||
if ( $NoNumberConversion -ne '*' -and # Check if NoNumberConversion isn't specified. Put this first as it's going to stop the if clause. Quicker than putting regex check first
|
||||
$numberRegex.IsMatch($v) -and # and if it contains digit(s) - this syntax is quicker than -match for many items and cuts out slow checks for non numbers
|
||||
$NoNumberConversion -notcontains $Name -and
|
||||
[Double]::TryParse($v, [System.Globalization.NumberStyles]::Any, [System.Globalization.NumberFormatInfo]::CurrentInfo, [Ref]$number)
|
||||
) {
|
||||
@@ -424,7 +431,7 @@
|
||||
if ($null -ne $TableName -or $PSBoundParameters.ContainsKey('TableStyle')) {
|
||||
#Already inserted Excel table if input was a DataTable
|
||||
if ($InputObject -isnot [System.Data.DataTable]) {
|
||||
Add-ExcelTable -Range $ws.Cells[$dataRange] -TableName $TableName -TableStyle $TableStyle
|
||||
Add-ExcelTable -Range $ws.Cells[$dataRange] -TableName $TableName -TableStyle $TableStyle -TableTotalSettings $TableTotalSettings
|
||||
}
|
||||
}
|
||||
elseif ($AutoFilter) {
|
||||
@@ -493,7 +500,7 @@
|
||||
}
|
||||
elseif ($FreezeTopRow) {
|
||||
if ($Title) {
|
||||
$ws.View.FreezePanes(2, 1)
|
||||
$ws.View.FreezePanes(3, 1)
|
||||
Write-Verbose -Message "Froze title and header rows"
|
||||
}
|
||||
else {
|
||||
@@ -636,9 +643,9 @@
|
||||
}
|
||||
elseif ($c.formatter) {
|
||||
switch ($c.formatter) {
|
||||
"ThreeIconSet" { Add-ConditionalFormatting -Worksheet $ws -ThreeIconsSet $c.IconType -range $c.range -reverse:$c.reverse }
|
||||
"FourIconSet" { Add-ConditionalFormatting -Worksheet $ws -FourIconsSet $c.IconType -range $c.range -reverse:$c.reverse }
|
||||
"FiveIconSet" { Add-ConditionalFormatting -Worksheet $ws -FiveIconsSet $c.IconType -range $c.range -reverse:$c.reverse }
|
||||
"ThreeIconSet" { Add-ConditionalFormatting -Worksheet $ws -ThreeIconsSet $c.IconType -range $c.range -reverse:$c.reverse -ShowIconOnly:$c.ShowIconOnly}
|
||||
"FourIconSet" { Add-ConditionalFormatting -Worksheet $ws -FourIconsSet $c.IconType -range $c.range -reverse:$c.reverse -ShowIconOnly:$c.ShowIconOnly}
|
||||
"FiveIconSet" { Add-ConditionalFormatting -Worksheet $ws -FiveIconsSet $c.IconType -range $c.range -reverse:$c.reverse -ShowIconOnly:$c.ShowIconOnly}
|
||||
}
|
||||
Write-Verbose -Message "Added conditional formatting to range $($c.range)"
|
||||
}
|
||||
|
||||
47
Public/Get-ExcelFileSchema.ps1
Normal file
@@ -0,0 +1,47 @@
|
||||
function Get-ExcelFileSchema {
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Gets the schema of an Excel file.
|
||||
|
||||
.DESCRIPTION
|
||||
The Get-ExcelFileSchema function gets the schema of an Excel file by returning the property names of the first row of each worksheet in the file.
|
||||
|
||||
.PARAMETER Path
|
||||
Specifies the path to the Excel file.
|
||||
|
||||
.PARAMETER Compress
|
||||
Indicates whether to compress the json output.
|
||||
|
||||
.OUTPUTS
|
||||
Json
|
||||
|
||||
.EXAMPLE
|
||||
Get-ExcelFileSchema -Path .\example.xlsx
|
||||
#>
|
||||
|
||||
[CmdletBinding()]
|
||||
param(
|
||||
[Parameter(ValueFromPipelineByPropertyName, Mandatory)]
|
||||
[Alias('FullName')]
|
||||
$Path,
|
||||
[Switch]$Compress
|
||||
)
|
||||
|
||||
Begin {
|
||||
$result = @()
|
||||
}
|
||||
|
||||
Process {
|
||||
$excelFiles = Get-ExcelFileSummary $Path
|
||||
|
||||
foreach ($excelFile in $excelFiles) {
|
||||
$data = Import-Excel $Path -WorksheetName $excelFile.WorksheetName | Select-Object -First 1
|
||||
$names = $data[0].PSObject.Properties.name
|
||||
$result += $excelFile | Add-Member -MemberType NoteProperty -Name "PropertyNames" -Value $names -PassThru
|
||||
}
|
||||
}
|
||||
|
||||
End {
|
||||
$result | ConvertTo-Json -Compress:$Compress
|
||||
}
|
||||
}
|
||||
@@ -16,6 +16,7 @@ function Get-ExcelFileSummary {
|
||||
[PSCustomObject][Ordered]@{
|
||||
ExcelFile = Split-Path -Leaf $Path
|
||||
WorksheetName = $workSheet.Name
|
||||
Visible = $workSheet.Hidden -eq 'Visible'
|
||||
Rows = $workSheet.Dimension.Rows
|
||||
Columns = $workSheet.Dimension.Columns
|
||||
Address = $workSheet.Dimension.Address
|
||||
|
||||
15
Public/Get-ExcelSheetDimensionAddress.ps1
Normal file
@@ -0,0 +1,15 @@
|
||||
function Get-ExcelSheetDimensionAddress {
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Get the Excel address of the dimension of a sheet
|
||||
|
||||
.EXAMPLE
|
||||
Get-ExcelSheetDimensionAddress $excel.Sheet1
|
||||
#>
|
||||
param(
|
||||
[Parameter(Mandatory)]
|
||||
[OfficeOpenXml.ExcelWorksheet]$Worksheet
|
||||
)
|
||||
|
||||
$Worksheet.Dimension.Address
|
||||
}
|
||||
@@ -9,36 +9,75 @@ function Get-HtmlTable {
|
||||
[int]$FirstDataRow=0,
|
||||
[Switch]$UseDefaultCredentials
|
||||
)
|
||||
if ($PSVersionTable.PSVersion.Major -gt 5 -and -not (Get-Command ConvertFrom-Html -ErrorAction SilentlyContinue)) {
|
||||
# Invoke-WebRequest on .NET core doesn't have ParsedHtml so we need HtmlAgilityPack or similiar Justin Grote's PowerHTML wraps that nicely
|
||||
throw "This version of PowerShell needs the PowerHTML module to process HTML Tables."
|
||||
}
|
||||
|
||||
$r = Invoke-WebRequest $Url -UseDefaultCredentials: $UseDefaultCredentials
|
||||
$propertyNames = $Header
|
||||
|
||||
$table = $r.ParsedHtml.getElementsByTagName("table")[$TableIndex]
|
||||
$propertyNames=$Header
|
||||
$totalRows=@($table.rows).count
|
||||
if ($PSVersionTable.PSVersion.Major -le 5) {
|
||||
$table = $r.ParsedHtml.getElementsByTagName("table")[$TableIndex]
|
||||
$totalRows=@($table.rows).count
|
||||
|
||||
for ($idx = $FirstDataRow; $idx -lt $totalRows; $idx++) {
|
||||
for ($idx = $FirstDataRow; $idx -lt $totalRows; $idx++) {
|
||||
|
||||
$row = $table.rows[$idx]
|
||||
$cells = @($row.cells)
|
||||
$row = $table.rows[$idx]
|
||||
$cells = @($row.cells)
|
||||
|
||||
if(!$propertyNames) {
|
||||
if($cells[0].tagName -eq 'th') {
|
||||
$propertyNames = @($cells | ForEach-Object {$_.innertext -replace ' ',''})
|
||||
} else {
|
||||
$propertyNames = @(1..($cells.Count + 2) | Foreach-Object { "P$_" })
|
||||
if(!$propertyNames) {
|
||||
if($cells[0].tagName -eq 'th') {
|
||||
$propertyNames = @($cells | ForEach-Object {$_.innertext -replace ' ',''})
|
||||
} else {
|
||||
$propertyNames = @(1..($cells.Count + 2) | Foreach-Object { "P$_" })
|
||||
}
|
||||
continue
|
||||
}
|
||||
continue
|
||||
|
||||
$result = [ordered]@{}
|
||||
|
||||
for($counter = 0; $counter -lt $cells.Count; $counter++) {
|
||||
$propertyName = $propertyNames[$counter]
|
||||
|
||||
if(!$propertyName) { $propertyName= '[missing]'}
|
||||
$result.$propertyName= $cells[$counter].InnerText
|
||||
}
|
||||
|
||||
[PSCustomObject]$result
|
||||
}
|
||||
|
||||
$result = [ordered]@{}
|
||||
|
||||
for($counter = 0; $counter -lt $cells.Count; $counter++) {
|
||||
$propertyName = $propertyNames[$counter]
|
||||
|
||||
if(!$propertyName) { $propertyName= '[missing]'}
|
||||
$result.$propertyName= $cells[$counter].InnerText
|
||||
}
|
||||
else {
|
||||
$h = ConvertFrom-Html -Content $r.Content
|
||||
if ($TableIndex -is [valuetype]) { $TableIndex += 1}
|
||||
$rows = $h.SelectNodes("//table[$TableIndex]//tr")
|
||||
if (-not $rows) {Write-Warning "Could not find rows for `"//table[$TableIndex]`" in $Url ."}
|
||||
if ( -not $propertyNames) {
|
||||
if ( $tableHeaders = $rows[$FirstDataRow].SelectNodes("th")) {
|
||||
$propertyNames = $tableHeaders.foreach({[System.Web.HttpUtility]::HtmlDecode( $_.innerText ) -replace '\W+','_' -replace '(\w)_+$','$1' })
|
||||
$FirstDataRow += 1
|
||||
}
|
||||
else {
|
||||
$c = 0
|
||||
$propertyNames = $rows[$FirstDataRow].SelectNodes("td") | Foreach-Object { "P$c" ; $c ++ }
|
||||
}
|
||||
}
|
||||
Write-Verbose ("Property names: " + ($propertyNames -join ","))
|
||||
foreach ($n in $FirstDataRow..($rows.Count-1)) {
|
||||
$r = $rows[$n].SelectNodes("td|th")
|
||||
if ($r -and $r.innerText -ne "" -and $r.count -gt $rows[$n].SelectNodes("th").count ) {
|
||||
$c = 0
|
||||
$newObj = [ordered]@{}
|
||||
foreach ($p in $propertyNames) {
|
||||
$n = $null
|
||||
#Join descentandts for cases where the text in the cell is split (e.g with a <BR> ). We also want to remove HTML codes, trim and convert unicode minus sign to "-"
|
||||
$cellText = $r[$c].Descendants().where({$_.NodeType -eq "Text"}).foreach({[System.Web.HttpUtility]::HtmlDecode( $_.innerText ).Trim()}) -Join " " -replace "\u2212","-"
|
||||
if ([double]::TryParse($cellText, [ref]$n)) {$newObj[$p] = $n }
|
||||
else {$newObj[$p] = $cellText }
|
||||
$c ++
|
||||
}
|
||||
[pscustomObject]$newObj
|
||||
}
|
||||
}
|
||||
|
||||
[PSCustomObject]$result
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
[Alias('Sheet')]
|
||||
[Parameter(Position = 1)]
|
||||
[ValidateNotNullOrEmpty()]
|
||||
[String]$WorksheetName,
|
||||
[String[]]$WorksheetName,
|
||||
[Parameter(ParameterSetName = 'PathB' , Mandatory)]
|
||||
[Parameter(ParameterSetName = 'PackageB', Mandatory)]
|
||||
[String[]]$HeaderName ,
|
||||
@@ -23,7 +23,7 @@
|
||||
[Parameter(ParameterSetName = 'PackageC', Mandatory)]
|
||||
[Switch]$NoHeader ,
|
||||
[Alias('HeaderRow', 'TopRow')]
|
||||
[ValidateRange(1, 9999)]
|
||||
[ValidateRange(1, 1048576)]
|
||||
[Int]$StartRow = 1,
|
||||
[Alias('StopRow', 'BottomRow')]
|
||||
[Int]$EndRow ,
|
||||
@@ -36,7 +36,8 @@
|
||||
[string[]]$AsDate,
|
||||
[ValidateNotNullOrEmpty()]
|
||||
[String]$Password,
|
||||
[Int[]]$ImportColumns
|
||||
[Int[]]$ImportColumns,
|
||||
[Switch]$Raw
|
||||
)
|
||||
end {
|
||||
$sw = [System.Diagnostics.Stopwatch]::StartNew()
|
||||
@@ -64,7 +65,7 @@
|
||||
|
||||
try {
|
||||
if ($ImportColumns) {
|
||||
$end = $Worksheet.Dimension.End.Column
|
||||
$end = $sheet.Dimension.End.Column
|
||||
# Check $ImportColumns
|
||||
if ($ImportColumns[0] -le 0) { throw "The first entry in ImportColumns must be equal or greater 1" ; return }
|
||||
# Check $StartColumn and $EndColumn
|
||||
@@ -95,7 +96,7 @@
|
||||
|
||||
foreach ($C in $Columns) {
|
||||
#allow "False" or "0" to be column headings
|
||||
$Worksheet.Cells[$StartRow, $C] | Where-Object { -not [string]::IsNullOrEmpty($_.Value) } | Select-Object @{N = 'Column'; E = { $C } }, Value
|
||||
$sheet.Cells[$StartRow, $C] | Where-Object { -not [string]::IsNullOrEmpty($_.Value) } | Select-Object @{N = 'Column'; E = { $C } }, Value
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -125,108 +126,138 @@
|
||||
}
|
||||
try {
|
||||
#Select worksheet
|
||||
if (-not $WorksheetName) { $Worksheet = $ExcelPackage.Workbook.Worksheets[1] }
|
||||
if ($WorksheetName -eq '*') { $Worksheet = $ExcelPackage.Workbook.Worksheets }
|
||||
elseif (-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
|
||||
}
|
||||
|
||||
#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 (-not $EndRow ) { $EndRow = $Worksheet.Dimension.End.Row }
|
||||
if (-not $EndColumn) { $EndColumn = $Worksheet.Dimension.End.Column }
|
||||
$endAddress = [OfficeOpenXml.ExcelAddress]::TranslateFromR1C1("R[$EndRow]C[$EndColumn]", 0, 0)
|
||||
if ($DataOnly) {
|
||||
#If we are using headers startrow will be the header-row so examine data from startRow + 1,
|
||||
if ($NoHeader) { $range = "A" + ($StartRow ) + ":" + $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.
|
||||
#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,
|
||||
#using Hash tables: "we've seen it" is all we need, no need to worry about "seen it before" / "Seen it many times".
|
||||
$colHash = @{ }
|
||||
$rowHash = @{ }
|
||||
foreach ($cell in $Worksheet.Cells[$range]) {
|
||||
if ($null -ne $cell.Value ) { $colHash[$cell.Start.Column] = 1; $rowHash[$cell.Start.row] = 1 }
|
||||
}
|
||||
$rows = ( $StartRow..$EndRow ).Where( { $rowHash[$_] })
|
||||
$columns = ($StartColumn..$EndColumn).Where( { $colHash[$_] })
|
||||
}
|
||||
else {
|
||||
$Columns = $StartColumn .. $EndColumn ; if ($StartColumn -gt $EndColumn) { Write-Warning -Message "Selecting columns $StartColumn to $EndColumn might give odd results." }
|
||||
if ($NoHeader) { $rows = $StartRow..$EndRow ; if ($StartRow -gt $EndRow) { Write-Warning -Message "Selecting rows $StartRow to $EndRow might give odd results." } }
|
||||
elseif ($HeaderName) { $rows = $StartRow..$EndRow }
|
||||
else {
|
||||
$rows = (1 + $StartRow)..$EndRow
|
||||
if ($StartRow -eq 1 -and $EndRow -eq 1) {
|
||||
$rows = 0
|
||||
}
|
||||
$xlBook = [Ordered]@{}
|
||||
foreach ($sheet in $Worksheet) {
|
||||
if ($Worksheet.Count -gt 1 -or $Paths.Count -gt 1) {
|
||||
<#
|
||||
Needed under these conditions to handle sheets of different number of Row/Col
|
||||
- When reading more than one xlsx file
|
||||
- When reading more than one worksheet in the same file
|
||||
#>
|
||||
$EndRow = $null
|
||||
$EndColumn = $null
|
||||
}
|
||||
|
||||
# ; if ($StartRow -ge $EndRow) { Write-Warning -Message "Selecting $StartRow as the header with data in $(1+$StartRow) to $EndRow might give odd results." } }
|
||||
}
|
||||
#endregion
|
||||
#region Create property names
|
||||
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."; return
|
||||
}
|
||||
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."; return
|
||||
}
|
||||
#endregion
|
||||
if (-not $rows) {
|
||||
Write-Warning "Worksheet '$WorksheetName' in workbook '$Path' contains no data in the rows after top row '$StartRow'"
|
||||
}
|
||||
else {
|
||||
#region Create one object per row
|
||||
if ($AsText -or $AsDate) {
|
||||
<#join items in AsText together with ~~~ . Escape any regex special characters...
|
||||
$targetSheetname = $sheet.Name
|
||||
$xlBook["$targetSheetname"] = @()
|
||||
#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 (-not $EndRow ) { $EndRow = $sheet.Dimension.End.Row }
|
||||
if (-not $EndColumn) { $EndColumn = $sheet.Dimension.End.Column }
|
||||
$endAddress = [OfficeOpenXml.ExcelAddress]::TranslateFromR1C1("R[$EndRow]C[$EndColumn]", 0, 0)
|
||||
if ($DataOnly) {
|
||||
#If we are using headers startrow will be the header-row so examine data from startRow + 1,
|
||||
if ($NoHeader) { $range = "A" + ($StartRow ) + ":" + $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.
|
||||
#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,
|
||||
#using Hash tables: "we've seen it" is all we need, no need to worry about "seen it before" / "Seen it many times".
|
||||
$colHash = @{ }
|
||||
$rowHash = @{ }
|
||||
foreach ($cell in $sheet.Cells[$range]) {
|
||||
if ($null -ne $cell.Value ) { $colHash[$cell.Start.Column] = 1; $rowHash[$cell.Start.row] = 1 }
|
||||
}
|
||||
$rows = ( $StartRow..$EndRow ).Where( { $rowHash[$_] })
|
||||
$columns = ($StartColumn..$EndColumn).Where( { $colHash[$_] })
|
||||
}
|
||||
else {
|
||||
$Columns = $StartColumn .. $EndColumn ; if ($StartColumn -gt $EndColumn) { Write-Warning -Message "Selecting columns $StartColumn to $EndColumn might give odd results." }
|
||||
if ($NoHeader) { $rows = $StartRow..$EndRow ; if ($StartRow -gt $EndRow) { Write-Warning -Message "Selecting rows $StartRow to $EndRow might give odd results." } }
|
||||
elseif ($HeaderName) { $rows = $StartRow..$EndRow }
|
||||
else {
|
||||
$rows = (1 + $StartRow)..$EndRow
|
||||
if ($StartRow -eq 1 -and $EndRow -eq 1) {
|
||||
$rows = 0
|
||||
}
|
||||
}
|
||||
|
||||
# ; if ($StartRow -ge $EndRow) { Write-Warning -Message "Selecting $StartRow as the header with data in $(1+$StartRow) to $EndRow might give odd results." } }
|
||||
}
|
||||
#endregion
|
||||
#region Create property names
|
||||
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."; return
|
||||
}
|
||||
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."; return
|
||||
}
|
||||
#endregion
|
||||
if (-not $rows) {
|
||||
Write-Warning "Worksheet '$WorksheetName' in workbook '$Path' contains no data in the rows after top row '$StartRow'"
|
||||
}
|
||||
else {
|
||||
#region Create one object per row
|
||||
if ($AsText -or $AsDate) {
|
||||
<#join items in AsText together with ~~~ . Escape any regex special characters...
|
||||
# which turns "*" into "\*" make it ".*". Convert ~~~ to $|^ and top and tail with ^%;
|
||||
So if we get "Week", "[Time]" and "*date*" ; make the expression ^week$|^\[Time\]$|^.*Date.*$
|
||||
$make a regex for this which is case insensitive (option 1) and compiled (option 8)
|
||||
#>
|
||||
$TextColExpression = ''
|
||||
if ($AsText) {
|
||||
$TextColExpression += '(?<astext>^' + [regex]::Escape($AsText -join '~~~').replace('\*', '.*').replace('~~~', '$|^') + '$)'
|
||||
}
|
||||
if ($AsText -and $AsDate) {
|
||||
$TextColExpression += "|"
|
||||
}
|
||||
if ($AsDate) {
|
||||
$TextColExpression += '(?<asDate>^' + [regex]::Escape($AsDate -join '~~~').replace('\*', '.*').replace('~~~', '$|^') + '$)'
|
||||
}
|
||||
$TextColRegEx = New-Object -TypeName regex -ArgumentList $TextColExpression , 9
|
||||
}
|
||||
else { $TextColRegEx = $null }
|
||||
foreach ($R in $rows) {
|
||||
#Disabled write-verbose for speed
|
||||
# Write-Verbose "Import row '$R'"
|
||||
$NewRow = [Ordered]@{ }
|
||||
if ($TextColRegEx) {
|
||||
foreach ($P in $PropertyNames) {
|
||||
$MatchTest = $TextColRegEx.Match($P.value)
|
||||
if ($MatchTest.groups.name -eq "astext") {
|
||||
$NewRow[$P.Value] = $Worksheet.Cells[$R, $P.Column].Text
|
||||
}
|
||||
elseif ($MatchTest.groups.name -eq "asdate" -and $Worksheet.Cells[$R, $P.Column].Value -is [System.ValueType]) {
|
||||
$NewRow[$P.Value] = [datetime]::FromOADate(($Worksheet.Cells[$R, $P.Column].Value))
|
||||
}
|
||||
else { $NewRow[$P.Value] = $Worksheet.Cells[$R, $P.Column].Value }
|
||||
$TextColExpression = ''
|
||||
if ($AsText) {
|
||||
$TextColExpression += '(?<astext>^' + [regex]::Escape($AsText -join '~~~').replace('\*', '.*').replace('~~~', '$|^') + '$)'
|
||||
}
|
||||
}
|
||||
else {
|
||||
foreach ($P in $PropertyNames) {
|
||||
$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)'."
|
||||
if ($AsText -and $AsDate) {
|
||||
$TextColExpression += "|"
|
||||
}
|
||||
if ($AsDate) {
|
||||
$TextColExpression += '(?<asDate>^' + [regex]::Escape($AsDate -join '~~~').replace('\*', '.*').replace('~~~', '$|^') + '$)'
|
||||
}
|
||||
$TextColRegEx = New-Object -TypeName regex -ArgumentList $TextColExpression , 9
|
||||
}
|
||||
[PSCustomObject]$NewRow
|
||||
else { $TextColRegEx = $null }
|
||||
foreach ($R in $rows) {
|
||||
#Disabled write-verbose for speed
|
||||
# Write-Verbose "Import row '$R'"
|
||||
$NewRow = [Ordered]@{ }
|
||||
if ($TextColRegEx) {
|
||||
foreach ($P in $PropertyNames) {
|
||||
$MatchTest = $TextColRegEx.Match($P.value)
|
||||
if ($MatchTest.groups.name -eq "astext") {
|
||||
$NewRow[$P.Value] = $sheet.Cells[$R, $P.Column].Text
|
||||
}
|
||||
elseif ($MatchTest.groups.name -eq "asdate" -and $sheet.Cells[$R, $P.Column].Value -is [System.ValueType]) {
|
||||
$NewRow[$P.Value] = [datetime]::FromOADate(($sheet.Cells[$R, $P.Column].Value))
|
||||
}
|
||||
else { $NewRow[$P.Value] = $sheet.Cells[$R, $P.Column].Value }
|
||||
}
|
||||
}
|
||||
else {
|
||||
foreach ($P in $PropertyNames) {
|
||||
$NewRow[$P.Value] = $sheet.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)'."
|
||||
}
|
||||
}
|
||||
$xlBook["$targetSheetname"] += [PSCustomObject]$NewRow
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
catch { throw "Failed importing the Excel workbook '$Path' with worksheet '$WorksheetName': $_"; return }
|
||||
finally {
|
||||
# $EndRow = 0
|
||||
# $EndColumn = 0
|
||||
if ($Path) { $stream.close(); $ExcelPackage.Dispose() }
|
||||
|
||||
if ($Raw) {
|
||||
foreach ($entry in $xlbook.GetEnumerator()) {
|
||||
$entry.Value
|
||||
}
|
||||
}
|
||||
elseif ($Worksheet.Count -eq 1) {
|
||||
$xlBook["$targetSheetname"]
|
||||
}
|
||||
else {
|
||||
$xlBook
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,13 +3,13 @@ function Import-Html {
|
||||
[CmdletBinding()]
|
||||
param(
|
||||
$Url,
|
||||
$Index,
|
||||
[int]$Index = 0,
|
||||
$Header,
|
||||
[int]$FirstDataRow=0,
|
||||
[int]$FirstDataRow = 0,
|
||||
[Switch]$UseDefaultCredentials
|
||||
)
|
||||
|
||||
$xlFile = [System.IO.Path]::GetTempFileName() -replace "tmp","xlsx"
|
||||
$xlFile = [System.IO.Path]::GetTempFileName() -replace "tmp", "xlsx"
|
||||
Remove-Item $xlFile -ErrorAction Ignore
|
||||
|
||||
Write-Verbose "Exporting to Excel file $($xlFile)"
|
||||
|
||||
@@ -1,11 +1,12 @@
|
||||
function New-ConditionalFormattingIconSet {
|
||||
[Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseShouldProcessForStateChangingFunctions', '',Justification='Does not change system State')]
|
||||
[Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseShouldProcessForStateChangingFunctions', '', Justification = 'Does not change system State')]
|
||||
param(
|
||||
[Parameter(Mandatory=$true)]
|
||||
[Parameter(Mandatory = $true)]
|
||||
$Range,
|
||||
[ValidateSet("ThreeIconSet","FourIconSet","FiveIconSet")]
|
||||
[ValidateSet("ThreeIconSet", "FourIconSet", "FiveIconSet")]
|
||||
$ConditionalFormat,
|
||||
[Switch]$Reverse
|
||||
[Switch]$Reverse,
|
||||
[Switch]$ShowIconOnly
|
||||
)
|
||||
|
||||
DynamicParam {
|
||||
@@ -40,13 +41,14 @@ function New-ConditionalFormattingIconSet {
|
||||
|
||||
End {
|
||||
|
||||
$bp = @{}+$PSBoundParameters
|
||||
$bp = @{} + $PSBoundParameters
|
||||
|
||||
$obj = [PSCustomObject]@{
|
||||
Range = $Range
|
||||
Formatter = $ConditionalFormat
|
||||
IconType = $bp.IconType
|
||||
Reverse = $Reverse
|
||||
Range = $Range
|
||||
Formatter = $ConditionalFormat
|
||||
IconType = $bp.IconType
|
||||
Reverse = $Reverse
|
||||
ShowIconOnly = $ShowIconOnly
|
||||
}
|
||||
|
||||
$obj.pstypenames.Clear()
|
||||
|
||||
@@ -16,8 +16,10 @@ function New-PivotTableDefinition {
|
||||
[String]$PivotTotals = "Both",
|
||||
[Switch]$NoTotalsInPivot,
|
||||
[String]$GroupDateRow,
|
||||
[String]$GroupDateColumn,
|
||||
[OfficeOpenXml.Table.PivotTable.eDateGroupBy[]]$GroupDatePart,
|
||||
[String]$GroupNumericRow,
|
||||
[String]$GroupNumericColumn,
|
||||
[double]$GroupNumericMin = 0 ,
|
||||
[double]$GroupNumericMax = [Double]::MaxValue ,
|
||||
[double]$GroupNumericInterval = 100 ,
|
||||
|
||||
70
Public/Set-CellComment.ps1
Normal file
@@ -0,0 +1,70 @@
|
||||
[Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseShouldProcessForStateChangingFunctions', '', Scope='Function', Target='Set*', Justification='Does not change system state')]
|
||||
param()
|
||||
|
||||
function Set-CellComment {
|
||||
[CmdletBinding(DefaultParameterSetName = "Range")]
|
||||
param(
|
||||
[Parameter(Mandatory = $True, ParameterSetName = "ColumnLetter")]
|
||||
[Parameter(Mandatory = $True, ParameterSetName = "ColumnNumber")]
|
||||
[Parameter(Mandatory = $False, ParameterSetName = "Range")]
|
||||
[OfficeOpenXml.ExcelWorkSheet]$Worksheet,
|
||||
|
||||
[Parameter(Mandatory = $True, ParameterSetName = "Range", ValueFromPipeline = $true,Position=0)]
|
||||
[Alias("Address")]
|
||||
$Range,
|
||||
|
||||
[Parameter(Mandatory = $True, ParameterSetName = "ColumnLetter")]
|
||||
[Parameter(Mandatory = $True, ParameterSetName = "ColumnNumber")]
|
||||
[Int]$Row,
|
||||
|
||||
[Parameter(Mandatory = $True, ParameterSetName = "ColumnLetter")]
|
||||
[String]$ColumnLetter,
|
||||
|
||||
[Parameter(Mandatory = $True, ParameterSetName = "ColumnNumber")]
|
||||
[Int]$ColumnNumber,
|
||||
|
||||
[Parameter(Mandatory = $True)]
|
||||
[String]$Text
|
||||
)
|
||||
|
||||
If ($PSCmdlet.ParameterSetName -eq "Range") {
|
||||
Write-Verbose "Using 'Range' Parameter Set"
|
||||
if ($Range -is [Array]) {
|
||||
$null = $PSBoundParameters.Remove("Range")
|
||||
$Range | Set-CellComment @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 ($Range -is [OfficeOpenXml.Table.ExcelTable]) {$Range = $Range.Address}
|
||||
elseif ($Worksheet -and $Range -is [string]) {
|
||||
# Convert range as string to OfficeOpenXml.ExcelAddress
|
||||
$Range = [OfficeOpenXml.ExcelAddress]::new($Range)
|
||||
}
|
||||
elseif ($Range -is [string]) {Write-Warning -Message "The range parameter you have specified also needs a worksheet parameter." ;return}
|
||||
#else we assume $Range is a OfficeOpenXml.ExcelAddress
|
||||
}
|
||||
}
|
||||
ElseIf ($PSCmdlet.ParameterSetName -eq "ColumnNumber") {
|
||||
$Range = [OfficeOpenXml.ExcelAddress]::new($Row, $ColumnNumber, $Row, $ColumnNumber)
|
||||
}
|
||||
ElseIf ($PSCmdlet.ParameterSetName -eq "ColumnLetter") {
|
||||
$Range = [OfficeOpenXml.ExcelAddress]::new(("{0}{1}" -f $ColumnLetter,$Row))
|
||||
}
|
||||
|
||||
If ($Range -isnot [Array]) {
|
||||
Foreach ($c in $Worksheet.Cells[$Range]) {
|
||||
write-verbose $c.address
|
||||
Try {
|
||||
If ($Null -eq $c.comment) {
|
||||
[Void]$c.AddComment($Text, "ImportExcel")
|
||||
}
|
||||
Else {
|
||||
$c.Comment.Text = $Text
|
||||
$c.Comment.Author = "ImportExcel"
|
||||
}
|
||||
$c.Comment.AutoFit = $True
|
||||
}
|
||||
Catch { "Could not add comment to cell {0}: {1}" -f $c.Address, $_.ToString() }
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -110,7 +110,7 @@
|
||||
|
||||
#region Apply formatting
|
||||
$params = @{}
|
||||
foreach ($p in @('Underline','Bold','Italic','StrikeThru', 'FontName', 'FontSize','FontShift','NumberFormat','TextRotation',
|
||||
foreach ($p in @('Underline','UnderLineType','Bold','Italic','StrikeThru', 'FontName', 'FontSize','FontShift','NumberFormat','TextRotation',
|
||||
'WrapText', 'HorizontalAlignment','VerticalAlignment', 'Autosize', 'Width', 'FontColor'
|
||||
'BorderAround', 'BackgroundColor', 'BackgroundPattern', 'PatternColor')) {
|
||||
if ($PSBoundParameters.ContainsKey($p)) {$params[$p] = $PSBoundParameters[$p]}
|
||||
|
||||
@@ -58,7 +58,7 @@
|
||||
elseif ($Worksheet -and ($Range -is [string] -or $Range -is [OfficeOpenXml.ExcelAddress])) {
|
||||
$Range = $Worksheet.Cells[$Range]
|
||||
}
|
||||
elseif ($Range -is [string]) {Write-Warning -Message "The range pararameter you have specified also needs a worksheet parameter." ;return}
|
||||
elseif ($Range -is [string]) {Write-Warning -Message "The range parameter you have specified also needs a worksheet parameter." ;return}
|
||||
#else we assume $Range is a range.
|
||||
if ($ClearAll) {
|
||||
$Range.Clear()
|
||||
|
||||
1253
README.original.md
Normal file
@@ -1,6 +1,6 @@
|
||||
#Requires -Modules Pester
|
||||
[Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseDeclaredVarsMoreThanAssignments','',Justification='False Positives')]
|
||||
[Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSAvoidAssignmentToAutomaticVariable','',Justification='Only executes on versions without the automatic variable')]
|
||||
#Requires -Modules @{ ModuleName="Pester"; ModuleVersion="4.0.0" }
|
||||
[Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseDeclaredVarsMoreThanAssignments', '', Justification = 'False Positives')]
|
||||
[Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSAvoidAssignmentToAutomaticVariable', '', Justification = 'Only executes on versions without the automatic variable')]
|
||||
param()
|
||||
Describe ExportExcel -Tag "ExportExcel" {
|
||||
BeforeAll {
|
||||
@@ -8,7 +8,7 @@ Describe ExportExcel -Tag "ExportExcel" {
|
||||
$WarningAction = "SilentlyContinue"
|
||||
. "$PSScriptRoot\Samples\Samples.ps1"
|
||||
if (-not (Get-command Get-Service -ErrorAction SilentlyContinue)) {
|
||||
Function Get-Service {Import-Clixml $PSScriptRoot\Mockservices.xml}
|
||||
Function Get-Service { Import-Clixml $PSScriptRoot\Mockservices.xml }
|
||||
}
|
||||
if (Get-process -Name Excel, xlim -ErrorAction SilentlyContinue) {
|
||||
It "Excel is open" {
|
||||
@@ -205,7 +205,7 @@ Describe ExportExcel -Tag "ExportExcel" {
|
||||
else { $OtherCurrencySymbol = "£" }
|
||||
$path = "TestDrive:\test.xlsx"
|
||||
$warnVar = $null
|
||||
#Test correct export of different data types and number formats; test hyperlinks, test -NoNumberConversion test object is converted to a string with no warnings, test calcuation of formula
|
||||
#Test correct export of different data types and number formats; test hyperlinks, test -NoNumberConversion and -NoHyperLinkConversion test object is converted to a string with no warnings, test calcuation of formula
|
||||
Remove-item -Path $path -ErrorAction SilentlyContinue
|
||||
[PSCustOmobject][Ordered]@{
|
||||
Date = Get-Date
|
||||
@@ -233,9 +233,10 @@ Describe ExportExcel -Tag "ExportExcel" {
|
||||
Link3 = "xl://internal/sheet1!A1"
|
||||
Link4 = "xl://internal/sheet1!C5"
|
||||
Link5 = (New-Object -TypeName OfficeOpenXml.ExcelHyperLink -ArgumentList "Sheet1!E2" , "Display Text")
|
||||
Link6 = "xl://internal/sheet1!C5"
|
||||
Process = (Get-Process -Id $PID)
|
||||
TimeSpan = [datetime]::Now.Subtract([datetime]::Today)
|
||||
} | Export-Excel -NoNumberConversion IPAddress, StrLeadZero, StrAltPhone2 -Path $path -Calculate -WarningVariable $warnVar
|
||||
} | Export-Excel -NoNumberConversion IPAddress, StrLeadZero, StrAltPhone2 -NoHyperLinkConversion Link6 -Path $path -Calculate -WarningVariable $warnVar
|
||||
}
|
||||
|
||||
BeforeEach {
|
||||
@@ -253,7 +254,7 @@ Describe ExportExcel -Tag "ExportExcel" {
|
||||
}
|
||||
it "Created the worksheet with the expected name, number of rows and number of columns " {
|
||||
$ws.Name | Should -Be "sheet1"
|
||||
$ws.Dimension.Columns | Should -Be 27
|
||||
$ws.Dimension.Columns | Should -Be 28
|
||||
$ws.Dimension.Rows | Should -Be 2
|
||||
}
|
||||
it "Set a date in Cell A2 " {
|
||||
@@ -292,6 +293,9 @@ Describe ExportExcel -Tag "ExportExcel" {
|
||||
$ws.Cells[2, 25].Hyperlink.ReferenceAddress | Should -Be "sheet1!E2"
|
||||
$ws.Cells[2, 25].Hyperlink.Display | Should -Be "Display Text"
|
||||
}
|
||||
it "Create no link in cell Z2 (no hyperlink conversion) " {
|
||||
$ws.Cells[2, 26].Hyperlink | Should -BeNullOrEmpty
|
||||
}
|
||||
it "Processed thousands according to local settings (Cells H2 and I2) " {
|
||||
if ((Get-Culture).NumberFormat.NumberGroupSeparator -EQ ",") {
|
||||
($ws.Cells[2, 8].Value -is [valuetype] ) | Should -Be $true
|
||||
@@ -314,13 +318,13 @@ Describe ExportExcel -Tag "ExportExcel" {
|
||||
($ws.Cells[2, 19].Value -is [valuetype] ) | Should -Be $true
|
||||
($ws.Cells[2, 20].Value -is [valuetype] ) | Should -Be $true
|
||||
}
|
||||
it "Converted a nested object to a string (Y2) " {
|
||||
$ws.Cells[2, 26].Value | Should -Match '^System\.Diagnostics\.Process\s+\(.*\)$'
|
||||
it "Converted a nested object to a string (AA2) " {
|
||||
$ws.Cells[2, 27].Value | Should -Match '^System\.Diagnostics\.Process\s+\(.*\)$'
|
||||
}
|
||||
it "Processed a timespan object (Z2) " {
|
||||
$ws.cells[2, 27].Value.ToOADate() | Should -BeGreaterThan 0
|
||||
$ws.cells[2, 27].Value.ToOADate() | Should -BeLessThan 1
|
||||
$ws.cells[2, 27].Style.Numberformat.Format | Should -Be '[h]:mm:ss'
|
||||
it "Processed a timespan object (AB2) " {
|
||||
$ws.cells[2, 28].Value.ToOADate() | Should -BeGreaterThan 0
|
||||
$ws.cells[2, 28].Value.ToOADate() | Should -BeLessThan 1
|
||||
$ws.cells[2, 28].Style.Numberformat.Format | Should -Be '[h]:mm:ss'
|
||||
}
|
||||
}
|
||||
|
||||
@@ -344,8 +348,9 @@ Describe ExportExcel -Tag "ExportExcel" {
|
||||
PhoneNr1 = '+32 44'
|
||||
PhoneNr2 = '+32 4 4444 444'
|
||||
PhoneNr3 = '+3244444444'
|
||||
Link = [uri]"https://github.com/dfinke/ImportExcel"
|
||||
} | Export-Excel -NoNumberConversion IPAddress, Number1 -Path $path -NoHeader
|
||||
Link1 = [uri]"https://github.com/dfinke/ImportExcel"
|
||||
Link2 = [uri]"https://github.com/dfinke/ImportExcel"
|
||||
} | Export-Excel -NoHyperLinkConversion Link2 -NoNumberConversion IPAddress, Number1 -Path $path -NoHeader
|
||||
}
|
||||
|
||||
BeforeEach {
|
||||
@@ -363,7 +368,7 @@ Describe ExportExcel -Tag "ExportExcel" {
|
||||
|
||||
it "Created the worksheet with the expected name, number of rows and number of columns " {
|
||||
$ws.Name | Should -Be "sheet1"
|
||||
$ws.Dimension.Columns | Should -Be 14
|
||||
$ws.Dimension.Columns | Should -Be 15
|
||||
$ws.Dimension.Rows | Should -Be 1
|
||||
}
|
||||
|
||||
@@ -387,9 +392,13 @@ Describe ExportExcel -Tag "ExportExcel" {
|
||||
it "Set a hyperlink in Cell N1 " {
|
||||
$ws.Cells[1, 14].Hyperlink | Should -Be "https://github.com/dfinke/ImportExcel"
|
||||
}
|
||||
|
||||
it "Does not set a hyperlink in Cell O1 " {
|
||||
$ws.Cells[1, 15].Hyperlink | Should -BeNullOrEmpty
|
||||
}
|
||||
}
|
||||
|
||||
Context "#Example 5 # Adding a single conditional format "{
|
||||
Context "#Example 5 # Adding a single conditional format " {
|
||||
BeforeEach {
|
||||
#Test New-ConditionalText builds correctly
|
||||
$ct = New-ConditionalText -ConditionalType GreaterThan 525 -ConditionalTextColor ([System.Drawing.Color]::DarkRed) -BackgroundColor ([System.Drawing.Color]::LightPink)
|
||||
@@ -491,7 +500,7 @@ Describe ExportExcel -Tag "ExportExcel" {
|
||||
}
|
||||
}
|
||||
|
||||
Context "#Examples 8 & 9 # Adding Pivot tables and charts from parameters" {
|
||||
Context "#Examples 8 & 9 # Adding Pivot tables and charts from parameters" {
|
||||
BeforeAll {
|
||||
$path = "TestDrive:\test.xlsx"
|
||||
#Test -passthru and -worksheetName creating a new, named, sheet in an existing file.
|
||||
@@ -544,7 +553,7 @@ Describe ExportExcel -Tag "ExportExcel" {
|
||||
#Test appending data extends pivot chart (with a warning) .
|
||||
$warnVar = $null
|
||||
Get-Process | Select-Object -Last 20 -Property Name, cpu, pm, handles, company |
|
||||
Export-Excel $path -WorkSheetname Processes -Append -IncludePivotTable -PivotRows Company -PivotData PM -IncludePivotChart -ChartType PieExploded3D -WarningAction SilentlyContinue -WarningVariable warnvar
|
||||
Export-Excel $path -WorkSheetname Processes -Append -IncludePivotTable -PivotRows Company -PivotData PM -IncludePivotChart -ChartType PieExploded3D -WarningAction SilentlyContinue -WarningVariable warnvar
|
||||
$Excel = Open-ExcelPackage $path
|
||||
$pt = $Excel.Workbook.Worksheets["ProcessesPivotTable"].PivotTables[0]
|
||||
|
||||
@@ -557,12 +566,12 @@ Describe ExportExcel -Tag "ExportExcel" {
|
||||
}
|
||||
}
|
||||
|
||||
Context " # Add-Worksheet inserted sheets, moved them correctly, and copied a sheet" {
|
||||
Context " # Add-Worksheet inserted sheets, moved them correctly, and copied a sheet" {
|
||||
BeforeAll {
|
||||
$path = "TestDrive:\test.xlsx"
|
||||
#Test the -CopySource and -Movexxxx parameters for Add-Worksheet
|
||||
$Excel = Get-Process | Select-Object -first 20 -Property Name, cpu, pm, handles, company |
|
||||
Export-Excel $path -WorkSheetname Processes -IncludePivotTable -PivotRows Company -PivotData PM -NoTotalsInPivot -PivotDataToColumn -Activate
|
||||
Export-Excel $path -WorkSheetname Processes -IncludePivotTable -PivotRows Company -PivotData PM -NoTotalsInPivot -PivotDataToColumn -Activate
|
||||
|
||||
$Excel = Open-ExcelPackage $path
|
||||
#At this point Sheets Should be in the order Sheet1, Processes, ProcessesPivotTable
|
||||
@@ -683,6 +692,72 @@ Describe ExportExcel -Tag "ExportExcel" {
|
||||
}
|
||||
}
|
||||
|
||||
Context "#Example 10 # Creates a file with a table with a 'totals' row".PadRight(87) {
|
||||
BeforeEach {
|
||||
$path = "TestDrive:\test.xlsx"
|
||||
Remove-item -Path $path -ErrorAction SilentlyContinue
|
||||
|
||||
#Test with a maximum of 50 processes for speed; export limited set of properties.
|
||||
$processes = Get-Process | Where-Object { $_.StartTime } | Select-Object -First 50
|
||||
|
||||
# Export as table with a totals row with a set of possibilities
|
||||
$TableTotalSettings = @{
|
||||
Id = "COUNT"
|
||||
WS = "SUM"
|
||||
Handles = "AVERAGE"
|
||||
CPU = '=COUNTIF([CPU];"<1")'
|
||||
NPM = @{
|
||||
Function = '=SUMIF([Name];"=Chrome";[NPM])'
|
||||
Comment = "Sum of Non-Paged Memory (NPM) for all chrome processes"
|
||||
}
|
||||
}
|
||||
$Processes | Export-Excel $path -TableName "processes" -TableTotalSettings $TableTotalSettings
|
||||
$TotalRows = $Processes.count + 2 # Column header + Data (50 processes) + Totals row
|
||||
$Excel = Open-ExcelPackage -Path $path
|
||||
$ws = $Excel.Workbook.Worksheets[1]
|
||||
}
|
||||
|
||||
it "Totals row was created".PadRight(87) {
|
||||
$ws.Tables[0].Address.Rows | Should -Be $TotalRows
|
||||
$ws.tables[0].ShowTotal | Should -Be $True
|
||||
}
|
||||
|
||||
it "Added four calculations in the totals row".PadRight(87) {
|
||||
$IDcolumn = $ws.Tables[0].Columns | Where-Object { $_.Name -eq "id" }
|
||||
$WScolumn = $ws.Tables[0].Columns | Where-Object { $_.Name -eq "WS" }
|
||||
$HandlesColumn = $ws.Tables[0].Columns | Where-Object { $_.Name -eq "Handles" }
|
||||
$CPUColumn = $ws.Tables[0].Columns | Where-Object { $_.Name -eq "CPU" }
|
||||
$NPMColumn = $ws.Tables[0].Columns | Where-Object { $_.Name -eq "NPM" }
|
||||
|
||||
# Testing column properties
|
||||
$IDcolumn | Select-Object -ExpandProperty TotalsRowFunction | Should -Be "Count"
|
||||
$WScolumn | Select-Object -ExpandProperty TotalsRowFunction | Should -Be "Sum"
|
||||
$HandlesColumn | Select-Object -ExpandProperty TotalsRowFunction | Should -Be "Average"
|
||||
$CPUColumn | Select-Object -ExpandProperty TotalsRowFunction | Should -Be "Custom"
|
||||
$CPUColumn | Select-Object -ExpandProperty TotalsRowFormula | Should -Be 'COUNTIF([CPU],"<1")'
|
||||
$NPMColumn | Select-Object -ExpandProperty TotalsRowFunction | Should -Be "Custom"
|
||||
$NPMColumn | Select-Object -ExpandProperty TotalsRowFormula | Should -Be 'SUMIF([Name],"=Chrome",[NPM])'
|
||||
|
||||
# Testing actual cell properties
|
||||
$CountAddress = "{0}{1}" -f (Get-ExcelColumnName -ColumnNumber $IDcolumn.Id).ColumnName, $TotalRows
|
||||
$SumAddress = "{0}{1}" -f (Get-ExcelColumnName -ColumnNumber $WScolumn.Id).ColumnName, $TotalRows
|
||||
$AverageAddress = "{0}{1}" -f (Get-ExcelColumnName -ColumnNumber $HandlesColumn.Id).ColumnName, $TotalRows
|
||||
$CustomAddress = "{0}{1}" -f (Get-ExcelColumnName -ColumnNumber $CPUColumn.Id).ColumnName, $TotalRows
|
||||
$CustomCommentAddress = "{0}{1}" -f (Get-ExcelColumnName -ColumnNumber $NPMColumn.Id).ColumnName, $TotalRows
|
||||
|
||||
$ws.Cells[$CountAddress].Formula | Should -Be "SUBTOTAL(103,processes[Id])"
|
||||
$ws.Cells[$SumAddress].Formula | Should -Be "SUBTOTAL(109,processes[Ws])"
|
||||
$ws.Cells[$AverageAddress].Formula | Should -Be "SUBTOTAL(101,processes[Handles])"
|
||||
$ws.Cells[$CustomAddress].Formula | Should -Be 'COUNTIF([CPU],"<1")'
|
||||
$ws.Cells[$CustomCommentAddress].Formula | Should -Be 'SUMIF([Name],"=Chrome",[NPM])'
|
||||
$ws.Cells[$CustomCommentAddress].Comment.Text | Should -Not -BeNullOrEmpty
|
||||
}
|
||||
|
||||
AfterEach {
|
||||
Close-ExcelPackage -ExcelPackage $Excel
|
||||
}
|
||||
}
|
||||
|
||||
# Context "#Example 11 # Create and append with title, inc ranges and Pivot table" {
|
||||
# $path = "TestDrive:\test.xlsx"
|
||||
# #Test New-PivotTableDefinition builds definition using -Pivotfilter and -PivotTotals options.
|
||||
@@ -695,7 +770,13 @@ Describe ExportExcel -Tag "ExportExcel" {
|
||||
$path = "TestDrive:\test.xlsx"
|
||||
Remove-Item $path -ErrorAction SilentlyContinue
|
||||
#Test freezing top row/first column, adding formats and a pivot table - from Add-Pivot table not a specification variable - after the export
|
||||
$excel = Get-Process | Select-Object -Property Name, Company, Handles, CPU, PM, NPM, WS | Export-Excel -Path $path -ClearSheet -WorkSheetname "Processes" -FreezeTopRowFirstColumn -PassThru
|
||||
$Ex13Data = Get-Process | Select-Object -Property Name, Company, Handles, CPU, PM, NPM, WS
|
||||
$excel = $Ex13Data | Export-Excel -Path $path -ClearSheet -WorkSheetname "Processes" -FreezeTopRowFirstColumn -PassThru
|
||||
# Add extra worksheets for testing 'Freeze Top Row' and 'Freeze First Column' with or without title
|
||||
$excel = Export-Excel -InputObject $Ex13Data -ExcelPackage $excel -WorksheetName "FreezeTopRow" -FreezeTopRow -Passthru
|
||||
$excel = Export-Excel -InputObject $Ex13Data -ExcelPackage $excel -WorksheetName "FreezeFirstColumn" -FreezeFirstColumn -Passthru
|
||||
$excel = Export-Excel -InputObject $Ex13Data -Title "Freeze Top Row" -ExcelPackage $excel -WorksheetName "FreezeTopRowTitle" -FreezeTopRow -Passthru
|
||||
$excel = Export-Excel -InputObject $Ex13Data -Title "Freeze Top Row First Column" -ExcelPackage $excel -WorksheetName "FreezeTRFCTitle" -FreezeTopRowFirstColumn -Passthru
|
||||
$sheet = $excel.Workbook.Worksheets["Processes"]
|
||||
if ($isWindows) { $sheet.Column(1) | Set-ExcelRange -Bold -AutoFit }
|
||||
else { $sheet.Column(1) | Set-ExcelRange -Bold }
|
||||
@@ -715,6 +796,10 @@ Describe ExportExcel -Tag "ExportExcel" {
|
||||
|
||||
$excel = Open-ExcelPackage $path
|
||||
$sheet = $excel.Workbook.Worksheets["Processes"]
|
||||
$sheetftr = $excel.Workbook.Worksheets["FreezeTopRow"]
|
||||
$sheetffc = $excel.Workbook.Worksheets["FreezeFirstColumn"]
|
||||
$sheetftrt = $excel.Workbook.Worksheets["FreezeTopRowTitle"]
|
||||
$sheetftrfct = $excel.Workbook.Worksheets["FreezeTRFCTitle"]
|
||||
}
|
||||
it "Returned the rule when calling Add-ConditionalFormatting -passthru " {
|
||||
$rule | Should -Not -BeNullOrEmpty
|
||||
@@ -761,7 +846,27 @@ Describe ExportExcel -Tag "ExportExcel" {
|
||||
$sheet.Names[6].Name | Should -Be $sheet.Cells['G1'].Value
|
||||
}
|
||||
it "Froze the panes " {
|
||||
$sheet.view.Panes.Count | Should -Be 3
|
||||
$sheetPaneInfo = $sheet.worksheetxml.worksheet.sheetViews.sheetView.pane
|
||||
$sheetftrPaneInfo = $sheetftr.worksheetxml.worksheet.sheetViews.sheetView.pane
|
||||
$sheetffcPaneInfo = $sheetffc.worksheetxml.worksheet.sheetViews.sheetView.pane
|
||||
$sheetftrtPaneInfo = $sheetftrt.worksheetxml.worksheet.sheetViews.sheetView.pane
|
||||
$sheetftrfctPaneInfo = $sheetftrfct.worksheetxml.worksheet.sheetViews.sheetView.pane
|
||||
$sheet.view.Panes.Count | Should -Be 3 # Don't know if this actually checks anything
|
||||
$sheetPaneInfo.xSplit | Should -Be 1
|
||||
$sheetPaneInfo.ySplit | Should -Be 1
|
||||
$sheetPaneInfo.topLeftCell | Should -Be "B2"
|
||||
$sheetftrPaneInfo.xSplit | Should -BeNullOrEmpty
|
||||
$sheetftrPaneInfo.ySplit | Should -Be 1
|
||||
$sheetftrPaneInfo.topLeftCell | Should -Be "A2"
|
||||
$sheetffcPaneInfo.xSplit | Should -Be 1
|
||||
$sheetffcPaneInfo.ySplit | Should -BeNullOrEmpty
|
||||
$sheetffcPaneInfo.topLeftCell | Should -Be "B1"
|
||||
$sheetftrtPaneInfo.xSplit | Should -BeNullOrEmpty
|
||||
$sheetftrtPaneInfo.ySplit | Should -Be 2
|
||||
$sheetftrtPaneInfo.topLeftCell | Should -Be "A3"
|
||||
$sheetftrfctPaneInfo.xSplit | Should -Be 1
|
||||
$sheetftrfctPaneInfo.ySplit | Should -Be 2
|
||||
$sheetftrfctPaneInfo.topLeftCell | Should -Be "B3"
|
||||
}
|
||||
|
||||
it "Created the pivot table " {
|
||||
@@ -1081,4 +1186,171 @@ Describe ExportExcel -Tag "ExportExcel" {
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Context " # Check UnderLineType" -Tag CheckUnderLineType {
|
||||
BeforeAll {
|
||||
$Path = Join-Path (Resolve-Path 'TestDrive:').ProviderPath "testUnderLineType.xlsx"
|
||||
Remove-Item -Path $Path -ErrorAction SilentlyContinue
|
||||
|
||||
$data = "
|
||||
Set-ExcelRange,Set-ExcelColumn
|
||||
Should be double underlined,Should be double underlined
|
||||
Should be double underlined,Should be double underlined
|
||||
" | ConvertFrom-Csv
|
||||
|
||||
$data | Export-Excel $Path -AutoSize
|
||||
|
||||
$excel = Open-ExcelPackage $Path
|
||||
$ws = $excel.Workbook.Worksheets["sheet1"]
|
||||
|
||||
Set-ExcelRange -Range $ws.Cells["A2:A3"] -Underline -UnderLineType "Double"
|
||||
Set-ExcelColumn -Worksheet $ws -Column 2 -StartRow 2 -Underline -UnderLineType "Double"
|
||||
|
||||
Close-ExcelPackage $excel
|
||||
}
|
||||
|
||||
AfterAll {
|
||||
Remove-Item -Path $Path -ErrorAction SilentlyContinue
|
||||
}
|
||||
|
||||
it "Check Cell Style Font via Set-ExcelColumn".PadRight(87) {
|
||||
$excel = Open-ExcelPackage $Path
|
||||
$cell = $excel.Sheet1.Cells["B2"]
|
||||
|
||||
$actual = $cell.Style.Font
|
||||
|
||||
$actual.Underline | Should -BeTrue
|
||||
$actual.UnderlineType | Should -Be "Double"
|
||||
|
||||
Close-ExcelPackage $excel -NoSave
|
||||
}
|
||||
|
||||
it "Check Cell Style Font via Set-ExcelRange".PadRight(87) {
|
||||
$excel = Open-ExcelPackage $Path
|
||||
$cell = $excel.Sheet1.Cells["A2"]
|
||||
|
||||
$actual = $cell.Style.Font
|
||||
|
||||
$actual.Underline | Should -BeTrue
|
||||
$actual.UnderlineType | Should -Be "Double"
|
||||
|
||||
Close-ExcelPackage $excel -NoSave
|
||||
}
|
||||
}
|
||||
|
||||
It "Should have hyperlink created" -Tag hyperlink {
|
||||
$path = "TestDrive:\testHyperLink.xlsx"
|
||||
|
||||
$license = "cognc:MCOMEETADV_GOV,cognc:M365_G3_GOV,cognc:ENTERPRISEPACK_GOV,cognc:RIGHTSMANAGEMENT_ADHOC"
|
||||
$ms365 = [PSCustomObject]@{
|
||||
DisplayName = "Test Subject"
|
||||
UserPrincipalName = "test@contoso.com"
|
||||
licenses = $license
|
||||
}
|
||||
|
||||
$ms365 | Export-Excel $path
|
||||
|
||||
$excel = Open-ExcelPackage $Path
|
||||
|
||||
$ws = $excel.Sheet1
|
||||
|
||||
$ws.Dimension.Rows | Should -Be 2
|
||||
$ws.Dimension.Columns | Should -Be 3
|
||||
|
||||
$ws.Cells["C2"].Hyperlink | Should -BeExactly $license
|
||||
|
||||
Close-ExcelPackage $excel
|
||||
|
||||
Remove-Item $path
|
||||
}
|
||||
|
||||
It "Should have no hyperlink created" -Tag hyperlink {
|
||||
$path = "TestDrive:\testHyperLink.xlsx"
|
||||
|
||||
$license = "cognc:MCOMEETADV_GOV,cognc:M365_G3_GOV,cognc:ENTERPRISEPACK_GOV,cognc:RIGHTSMANAGEMENT_ADHOC"
|
||||
$ms365 = [PSCustomObject]@{
|
||||
DisplayName = "Test Subject"
|
||||
UserPrincipalName = "test@contoso.com"
|
||||
licenses = $license
|
||||
}
|
||||
|
||||
$ms365 | Export-Excel $path -NoHyperLinkConversion licenses
|
||||
|
||||
$excel = Open-ExcelPackage $Path
|
||||
|
||||
$ws = $excel.Sheet1
|
||||
|
||||
$ws.Dimension.Rows | Should -Be 2
|
||||
$ws.Dimension.Columns | Should -Be 3
|
||||
|
||||
$ws.Cells["C2"].Hyperlink | Should -BeNullOrEmpty
|
||||
|
||||
Close-ExcelPackage $excel
|
||||
Remove-Item $path
|
||||
}
|
||||
|
||||
It "Should have no hyperlink created using wild card" -Tag hyperlink {
|
||||
$path = "TestDrive:\testHyperLink.xlsx"
|
||||
|
||||
$license = "cognc:MCOMEETADV_GOV,cognc:M365_G3_GOV,cognc:ENTERPRISEPACK_GOV,cognc:RIGHTSMANAGEMENT_ADHOC"
|
||||
$ms365 = [PSCustomObject]@{
|
||||
DisplayName = "Test Subject"
|
||||
UserPrincipalName = "test@contoso.com"
|
||||
licenses = $license
|
||||
}
|
||||
|
||||
$ms365 | Export-Excel $path -NoHyperLinkConversion *
|
||||
|
||||
$excel = Open-ExcelPackage $Path
|
||||
|
||||
$ws = $excel.Sheet1
|
||||
|
||||
$ws.Dimension.Rows | Should -Be 2
|
||||
$ws.Dimension.Columns | Should -Be 3
|
||||
|
||||
$ws.Cells["A2"].Value | Should -BeExactly "Test Subject"
|
||||
$ws.Cells["B2"].Value | Should -BeExactly "test@contoso.com"
|
||||
$ws.Cells["C2"].Hyperlink | Should -BeNullOrEmpty
|
||||
|
||||
Close-ExcelPackage $excel
|
||||
Remove-Item $path
|
||||
}
|
||||
|
||||
It "Should freeze the correct rows" -tag Freeze {
|
||||
<#
|
||||
Export-Excel -InputObject $Data -Path $OutputFile -TableName $SheetName.Replace(' ', '_') -WorksheetName $SheetName -AutoSize -FreezeTopRow -TableStyle $TableStyle -Title $SheetName -TitleBold -TitleSize 18
|
||||
#>
|
||||
|
||||
$path = "TestDrive:\testFreeze.xlsx"
|
||||
|
||||
$data = ConvertFrom-Csv @"
|
||||
Region,State,Units,Price
|
||||
West,Texas,927,923.71
|
||||
North,Tennessee,466,770.67
|
||||
East,Florida,520,458.68
|
||||
East,Maine,828,661.24
|
||||
West,Virginia,465,053.58
|
||||
North,Missouri,436,235.67
|
||||
South,Kansas,214,992.47
|
||||
North,North Dakota,789,640.72
|
||||
South,Delaware,712,508.55
|
||||
"@
|
||||
|
||||
Export-Excel -InputObject $data -Path $path -TableName 'TestTable' -WorksheetName 'TestSheet' -AutoSize -TableStyle Medium2 -Title 'Test Title' -TitleBold -TitleSize 18 -FreezeTopRow
|
||||
|
||||
$excel = Open-ExcelPackage -Path $path
|
||||
$ws = $excel.TestSheet
|
||||
|
||||
$r = $ws.worksheetxml.worksheet.sheetViews.sheetView.pane
|
||||
|
||||
$r | Should -Not -BeNullOrEmpty
|
||||
$r.ySplit | Should -Be 2
|
||||
$r.topLeftCell | Should -BeExactly 'A3'
|
||||
$r.state | Should -BeExactly 'frozen'
|
||||
$r.activePane | Should -BeExactly 'bottomLeft'
|
||||
|
||||
Close-ExcelPackage $excel
|
||||
|
||||
Remove-Item $path
|
||||
}
|
||||
}
|
||||
@@ -140,4 +140,72 @@ Describe "Creating small named ranges with hyperlinks" {
|
||||
$pt.RowFields[1].Grouping.Interval | Should -Be 3
|
||||
}
|
||||
}
|
||||
Context "Adding group date column" -Tag GroupColumnTests {
|
||||
it "Tests adding a group date column" {
|
||||
$xlFile = "TestDrive:\Results.xlsx"
|
||||
Remove-Item $xlFile -ErrorAction Ignore
|
||||
|
||||
$PivotTableDefinition = New-PivotTableDefinition -Activate -PivotTableName Points `
|
||||
-PivotRows Driver -PivotColumns Date -PivotData @{Points = "SUM" } -GroupDateColumn Date -GroupDatePart Years, Months
|
||||
|
||||
$excel = 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 -AutoSize -PivotTableDefinition $PivotTableDefinition -PassThru
|
||||
|
||||
$excel.Workbook.Worksheets.Count | Should -Be 2
|
||||
$excel.Workbook.Worksheets[1].Name | Should -BeExactly 'Sheet1'
|
||||
$excel.Workbook.Worksheets[2].Name | Should -BeExactly 'Points'
|
||||
$excel.Points.PivotTables.Count | Should -Be 1
|
||||
$pt = $excel.Points.PivotTables[0]
|
||||
$pt.RowFields.Count | Should -Be 1
|
||||
$pt.RowFields[0].name | Should -Be "Driver"
|
||||
|
||||
$pt.ColumnFields.Count | Should -Be 2
|
||||
|
||||
$pt.ColumnFields[0].name | Should -Be "Years"
|
||||
$pt.ColumnFields[0].Grouping | Should -Not -BeNullOrEmpty
|
||||
$pt.ColumnFields[0].Grouping.GroupBy | Should -Be "Years"
|
||||
|
||||
$pt.ColumnFields[1].name | Should -Be "Date"
|
||||
$pt.ColumnFields[1].Grouping | Should -Not -BeNullOrEmpty
|
||||
$pt.ColumnFields[1].Grouping.GroupBy | Should -Be "Months"
|
||||
|
||||
Close-ExcelPackage $excel
|
||||
|
||||
Remove-Item $xlFile -ErrorAction Ignore
|
||||
}
|
||||
}
|
||||
Context "Adding group numeric column" -Tag GroupColumnTests {
|
||||
it "Tests adding numeric group column" {
|
||||
$xlFile = "TestDrive:\Results.xlsx"
|
||||
Remove-Item $xlFile -ErrorAction Ignore
|
||||
|
||||
$PivotTableDefinition = New-PivotTableDefinition -Activate -PivotTableName Places `
|
||||
-PivotRows Driver -PivotColumns FinishPosition -PivotData @{Date = "Count" } -GroupNumericColumn FinishPosition -GroupNumericMin 1 -GroupNumericMax 25 -GroupNumericInterval 3
|
||||
|
||||
$excel = 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 -AutoSize -PivotTableDefinition $PivotTableDefinition -PassThru
|
||||
|
||||
$excel.Workbook.Worksheets.Count | Should -Be 2
|
||||
$excel.Workbook.Worksheets[1].Name | Should -BeExactly 'Sheet1'
|
||||
$excel.Workbook.Worksheets[2].Name | Should -BeExactly 'Places'
|
||||
$excel.Places.PivotTables.Count | Should -Be 1
|
||||
$pt = $excel.Places.PivotTables[0]
|
||||
$pt.RowFields.Count | Should -Be 1
|
||||
$pt.RowFields[0].name | Should -Be "Driver"
|
||||
|
||||
$pt.ColumnFields.Count | Should -Be 1
|
||||
|
||||
$pt.ColumnFields[0].name | Should -Be "FinishPosition"
|
||||
$pt.ColumnFields[0].Grouping | Should -Not -BeNullOrEmpty
|
||||
$pt.ColumnFields[0].Grouping.Start | Should -Be 1
|
||||
$pt.ColumnFields[0].Grouping.End | Should -Be 25
|
||||
$pt.ColumnFields[0].Grouping.Interval | Should -Be 3
|
||||
|
||||
Close-ExcelPackage $excel
|
||||
|
||||
Remove-Item $xlFile -ErrorAction Ignore
|
||||
}
|
||||
}
|
||||
}
|
||||
54
__tests__/Get-ExcelFileSchema.tests.ps1
Normal file
@@ -0,0 +1,54 @@
|
||||
if (-not (Get-command Import-Excel -ErrorAction SilentlyContinue)) {
|
||||
Import-Module $PSScriptRoot\..\ImportExcel.psd1
|
||||
}
|
||||
|
||||
Describe "Test getting the schema of an Excel file" -Tag GetExcelFileSchema {
|
||||
|
||||
BeforeAll {
|
||||
$script:excelFile = "TestDrive:\test.xlsx"
|
||||
$data = ConvertFrom-Csv @"
|
||||
Region,State,Units,Price
|
||||
West,Texas,927,923.71
|
||||
North,Tennessee,466,770.67
|
||||
East,Florida,520,458.68
|
||||
East,Maine,828,661.24
|
||||
West,Virginia,465,053.58
|
||||
North,Missouri,436,235.67
|
||||
South,Kansas,214,992.47
|
||||
North,North Dakota,789,640.72
|
||||
South,Delaware,712,508.55
|
||||
"@
|
||||
$data | Export-Excel $excelFile
|
||||
}
|
||||
|
||||
It "Test Get-ExcelFileSchema function exists" {
|
||||
$function = Get-Command Get-ExcelFileSchema -ErrorAction SilentlyContinue
|
||||
$function | Should -Not -Be $null
|
||||
}
|
||||
|
||||
It "Test Get-ExcelFileSchema returns json" {
|
||||
$actual = Get-ExcelFileSchema -Path $excelFile
|
||||
$actual | Should -Not -Be $null
|
||||
$actual | Should -BeOfType [string]
|
||||
}
|
||||
|
||||
It "Test Get-ExcelFileSchema correct json" {
|
||||
$actual = Get-ExcelFileSchema -Path $excelFile
|
||||
$actual = $actual | ConvertFrom-Json
|
||||
|
||||
$actual.ExcelFile | Should -BeExactly "test.xlsx"
|
||||
$actual.WorksheetName | Should -BeExactly "Sheet1"
|
||||
$actual.Visible | Should -Be $true
|
||||
$actual.Rows | Should -Be 10
|
||||
$actual.Columns | Should -Be 4
|
||||
$actual.Address | Should -BeExactly "A1:D10"
|
||||
|
||||
$actual.Path | Should -BeExactly ("TestDrive:" + [System.IO.Path]::DirectorySeparatorChar)
|
||||
|
||||
$actual.PropertyNames.Count | Should -Be 4
|
||||
$actual.PropertyNames[0] | Should -BeExactly "Region"
|
||||
$actual.PropertyNames[1] | Should -BeExactly "State"
|
||||
$actual.PropertyNames[2] | Should -BeExactly "Units"
|
||||
$actual.PropertyNames[3] | Should -BeExactly "Price"
|
||||
}
|
||||
}
|
||||
@@ -3,9 +3,7 @@
|
||||
[Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSAvoidAssignmentToAutomaticVariable', '', Justification = 'Only executes on versions without the automatic variable')]
|
||||
param()
|
||||
|
||||
if (-not (Get-command Import-Excel -ErrorAction SilentlyContinue)) {
|
||||
Import-Module $PSScriptRoot\..\ImportExcel.psd1
|
||||
}
|
||||
Import-Module $PSScriptRoot\..\ImportExcel.psd1 -Force
|
||||
|
||||
Describe 'All tests for Get-ExcelFileSummary' -Tag "Get-ExcelFileSummary" {
|
||||
Context "Test Get-ExcelFileSummary" {
|
||||
@@ -14,6 +12,7 @@ Describe 'All tests for Get-ExcelFileSummary' -Tag "Get-ExcelFileSummary" {
|
||||
|
||||
$actual.ExcelFile | Should -BeExactly 'TestData1.xlsx'
|
||||
$actual.WorksheetName | Should -BeExactly 'Sheet1'
|
||||
$actual.Visible | Should -BeTrue
|
||||
$actual.Rows | Should -Be 3
|
||||
$actual.Columns | Should -Be 2
|
||||
$actual.Address | Should -BeExactly 'A1:B3'
|
||||
@@ -26,6 +25,7 @@ Describe 'All tests for Get-ExcelFileSummary' -Tag "Get-ExcelFileSummary" {
|
||||
|
||||
$actual[0].ExcelFile | Should -BeExactly 'MultipleSheets.xlsx'
|
||||
$actual[0].WorksheetName | Should -BeExactly 'Sheet1'
|
||||
$actual[0].Visible | Should -BeTrue
|
||||
$actual[0].Rows | Should -Be 1
|
||||
$actual[0].Columns | Should -Be 4
|
||||
$actual[0].Address | Should -BeExactly 'A1:D1'
|
||||
@@ -33,11 +33,20 @@ Describe 'All tests for Get-ExcelFileSummary' -Tag "Get-ExcelFileSummary" {
|
||||
|
||||
$actual[1].ExcelFile | Should -BeExactly 'MultipleSheets.xlsx'
|
||||
$actual[1].WorksheetName | Should -BeExactly 'Sheet2'
|
||||
$actual[1].Visible | Should -BeTrue
|
||||
$actual[1].Rows | Should -Be 2
|
||||
$actual[1].Columns | Should -Be 2
|
||||
$actual[1].Address | Should -BeExactly 'A1:B2'
|
||||
$actual[1].Path | Should -Not -BeNullOrEmpty
|
||||
}
|
||||
|
||||
It "Tests if sheet is hidden or not" {
|
||||
$actual = Get-ExcelFileSummary "$PSScriptRoot\ImportExcelTests\SheetVisibleTesting.xlsx"
|
||||
|
||||
$actual[0].Visible | Should -BeTrue
|
||||
$actual[1].Visible | Should -BeFalse
|
||||
$actual[2].Visible | Should -BeTrue
|
||||
$actual[3].Visible | Should -BeFalse
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -63,6 +63,10 @@ Describe "Import-Excel on a sheet with no headings" {
|
||||
}
|
||||
}
|
||||
|
||||
AfterAll {
|
||||
Remove-Item $PSScriptRoot\testImportExcelSparse.xlsx -ErrorAction SilentlyContinue
|
||||
}
|
||||
|
||||
It "Import-Excel should have this shape" {
|
||||
$actual = @(Import-Excel $xlfile)
|
||||
|
||||
@@ -230,6 +234,7 @@ Describe "Import-Excel on a sheet with no headings" {
|
||||
|
||||
$actual.Count | Should -Be 1
|
||||
|
||||
Remove-Item $xlfile
|
||||
# Looks like -DataOnly does not handle empty columns
|
||||
# $actual[0].FirstName | Should -BeExactly 'Jean-Claude'
|
||||
# $actual[0].SecondName | Should -BeExactly 'Vandamme'
|
||||
|
||||
BIN
__tests__/ImportExcelTests/DataInDiffRowCol.xlsx
Normal file
BIN
__tests__/ImportExcelTests/DataInDiffRowColMultipleSheets.xlsx
Normal file
@@ -0,0 +1,57 @@
|
||||
Import-Module $PSScriptRoot\..\..\ImportExcel.psd1 -Force
|
||||
|
||||
Describe 'Test' -Tag ImportExcelEndRowAndCols {
|
||||
BeforeAll {
|
||||
$script:xlFilename = "$PSScriptRoot\DataInDiffRowCol.xlsx"
|
||||
}
|
||||
|
||||
Context 'Test reading a partial sheet' {
|
||||
It 'Should read 2 rows and first 3 columns' {
|
||||
$actual = Import-Excel $xlFilename -StartRow 5 -EndRow 7 -StartColumn 3 -EndColumn 5
|
||||
|
||||
# $actual | out-host
|
||||
$actual.Count | Should -Be 2
|
||||
|
||||
$colNames = $actual[0].psobject.properties.Name
|
||||
$colNames.Count | Should -Be 3
|
||||
|
||||
$colNames[0] | Should -Be 'Region'
|
||||
$colNames[1] | Should -Be 'State'
|
||||
$colNames[2] | Should -Be 'Units'
|
||||
}
|
||||
|
||||
It 'Should read second 2 rows and last 2 columns' {
|
||||
$actual = Import-Excel $xlFilename -StartRow 8 -EndRow 9 -StartColumn 5 -EndColumn 6 -HeaderName 'Units', 'Price'
|
||||
|
||||
# $actual | out-host
|
||||
$actual.Count | Should -Be 2
|
||||
|
||||
$colNames = $actual[0].psobject.properties.Name
|
||||
$colNames.Count | Should -Be 2
|
||||
|
||||
$colNames[0] | Should -Be 'Units'
|
||||
$colNames[1] | Should -Be 'Price'
|
||||
}
|
||||
|
||||
It 'Should read any row up to maximum allowed row' {
|
||||
$xlMaxRows = "$PSScriptRoot\MaxRows.xlsx"
|
||||
$actual = Import-Excel $xlMaxRows -StartRow 1048576 -EndRow 1048576 -NoHeader
|
||||
$actual.P1 | Should -Be 1048576
|
||||
}
|
||||
}
|
||||
|
||||
Context 'Test reading multiple sheets with data in differnt rows and columns' {
|
||||
It 'Should read 2 sheets same StartRow different dimensions' {
|
||||
$xlFilename = "$PSScriptRoot\DataInDiffRowColMultipleSheets.xlsx"
|
||||
|
||||
$actual = Import-Excel $xlFilename -StartRow 5 -WorksheetName *
|
||||
|
||||
$actual.Keys.Count | Should -Be 2
|
||||
$actual.Contains('Sheet1') | Should -BeTrue
|
||||
$actual.Contains('Sheet2') | Should -BeTrue
|
||||
|
||||
$actual['Sheet1'].Count | Should -Be 9
|
||||
$actual['Sheet2'].Count | Should -Be 12
|
||||
}
|
||||
}
|
||||
}
|
||||
82
__tests__/ImportExcelTests/ImportExcelReadSheets.tests.ps1
Normal file
@@ -0,0 +1,82 @@
|
||||
#Requires -Modules Pester
|
||||
[Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseDeclaredVarsMoreThanAssignments', '', Justification = 'False Positives')]
|
||||
param()
|
||||
|
||||
Import-Module $PSScriptRoot\..\..\ImportExcel.psd1 -Force
|
||||
|
||||
Describe 'Different ways to import sheets' -Tag ImportExcelReadSheets {
|
||||
BeforeAll {
|
||||
$xlFilename = "$PSScriptRoot\yearlySales.xlsx"
|
||||
}
|
||||
|
||||
Context 'Test reading sheets' {
|
||||
It 'Should read one sheet' {
|
||||
$actual = Import-Excel $xlFilename
|
||||
|
||||
$actual.Count | Should -Be 100
|
||||
$actual[0].Month | Should -BeExactly "April"
|
||||
$actual[99].Month | Should -BeExactly "April"
|
||||
}
|
||||
|
||||
It 'Should read two sheets' {
|
||||
$actual = Import-Excel $xlFilename march, june
|
||||
|
||||
$actual.keys.Count | Should -Be 2
|
||||
$actual["March"].Count | Should -Be 100
|
||||
$actual["June"].Count | Should -Be 100
|
||||
}
|
||||
|
||||
It 'Should read all the sheets' {
|
||||
$actual = Import-Excel $xlFilename *
|
||||
|
||||
$actual.keys.Count | Should -Be 12
|
||||
|
||||
$actual["January"].Count | Should -Be 100
|
||||
$actual["February"].Count | Should -Be 100
|
||||
$actual["March"].Count | Should -Be 100
|
||||
$actual["April"].Count | Should -Be 100
|
||||
$actual["May"].Count | Should -Be 100
|
||||
$actual["June"].Count | Should -Be 100
|
||||
$actual["July"].Count | Should -Be 100
|
||||
$actual["August"].Count | Should -Be 100
|
||||
$actual["September"].Count | Should -Be 100
|
||||
$actual["October"].Count | Should -Be 100
|
||||
$actual["November"].Count | Should -Be 100
|
||||
$actual["December"].Count | Should -Be 100
|
||||
}
|
||||
|
||||
It 'Should throw if it cannot find the sheet' {
|
||||
{ Import-Excel $xlFilename april, june, notthere } | Should -Throw
|
||||
}
|
||||
|
||||
It 'Should return an array not a dictionary' {
|
||||
$actual = Import-Excel $xlFilename april, june -Raw
|
||||
|
||||
$actual.Count | Should -Be 200
|
||||
$group = $actual | Group-Object month -NoElement
|
||||
|
||||
$group.Count | Should -Be 2
|
||||
$group[0].Name | Should -BeExactly 'April'
|
||||
$group[1].Name | Should -BeExactly 'June'
|
||||
}
|
||||
|
||||
It "Should read multiple sheets with diff number of rows correctly" {
|
||||
$xlFilename = "$PSScriptRoot\construction.xlsx"
|
||||
|
||||
$actual = Import-Excel $xlFilename 2015, 2016
|
||||
$actual.keys.Count | Should -Be 2
|
||||
|
||||
$actual["2015"].Count | Should -Be 12
|
||||
$actual["2016"].Count | Should -Be 1
|
||||
}
|
||||
|
||||
It "Should read multiple sheets with diff number of rows correctly and flatten it" {
|
||||
$xlFilename = "$PSScriptRoot\construction.xlsx"
|
||||
|
||||
$actual = Import-Excel $xlFilename 2015, 2016 -Raw
|
||||
|
||||
$actual.Count | Should -Be 13
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
BIN
__tests__/ImportExcelTests/MaxRows.xlsx
Normal file
57
__tests__/ImportExcelTests/ReadMultipleXLSXFiles.tests.ps1
Normal file
@@ -0,0 +1,57 @@
|
||||
[Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseDeclaredVarsMoreThanAssignments', '', Justification = 'False Positives')]
|
||||
Param()
|
||||
|
||||
Import-Module $PSScriptRoot\..\..\ImportExcel.psd1 -Force
|
||||
|
||||
Describe "Test reading multiple XLSX files of different row count" -Tag ReadMultipleXLSX {
|
||||
It "Should find these xlsx files" {
|
||||
Test-Path -Path $PSScriptRoot\rows05.xlsx | Should -BeTrue
|
||||
Test-Path -Path $PSScriptRoot\rows10.xlsx | Should -BeTrue
|
||||
}
|
||||
|
||||
It "Should find two xlsx files" {
|
||||
(Get-ChildItem $PSScriptRoot\row*xlsx).Count | Should -Be 2
|
||||
}
|
||||
|
||||
It "Should get 5 rows" {
|
||||
(Import-Excel $PSScriptRoot\rows05.xlsx).Count | Should -Be 5
|
||||
}
|
||||
|
||||
It "Should get 10 rows" {
|
||||
(Import-Excel $PSScriptRoot\rows10.xlsx).Count | Should -Be 10
|
||||
}
|
||||
|
||||
It "Should get 15 rows" {
|
||||
$actual = Get-ChildItem $PSScriptRoot\row*xlsx | Import-Excel
|
||||
|
||||
$actual.Count | Should -Be 15
|
||||
}
|
||||
|
||||
It "Should get 4 property names" {
|
||||
$actual = Get-ChildItem $PSScriptRoot\row*xlsx | Import-Excel
|
||||
|
||||
$names = $actual[0].psobject.properties.name
|
||||
$names.Count | Should -Be 4
|
||||
|
||||
$names[0] | Should -BeExactly "Region"
|
||||
$names[1] | Should -BeExactly "State"
|
||||
$names[2] | Should -BeExactly "Units"
|
||||
$names[3] | Should -BeExactly "Price"
|
||||
}
|
||||
|
||||
It "Should have the correct data" {
|
||||
$actual = Get-ChildItem $PSScriptRoot\row*xlsx | Import-Excel
|
||||
|
||||
# rows05.xlsx
|
||||
$actual[0].Region | Should -BeExactly "South"
|
||||
$actual[0].Price | Should -Be 181.52
|
||||
$actual[4].Region | Should -BeExactly "West"
|
||||
$actual[4].Price | Should -Be 216.56
|
||||
|
||||
# rows10.xlsx
|
||||
$actual[5].Region | Should -BeExactly "South"
|
||||
$actual[5].Price | Should -Be 199.85
|
||||
$actual[14].Region | Should -BeExactly "East"
|
||||
$actual[14].Price | Should -Be 965.25
|
||||
}
|
||||
}
|
||||
BIN
__tests__/ImportExcelTests/SheetVisibleTesting.xlsx
Normal file
BIN
__tests__/ImportExcelTests/construction.xlsx
Normal file
BIN
__tests__/ImportExcelTests/rows05.xlsx
Normal file
BIN
__tests__/ImportExcelTests/rows10.xlsx
Normal file
BIN
__tests__/ImportExcelTests/yearlySales.xlsx
Normal file
66
__tests__/New-ConditionalFormattingIconSet.tests.ps1
Normal file
@@ -0,0 +1,66 @@
|
||||
if (-not (Get-command Import-Excel -ErrorAction SilentlyContinue)) {
|
||||
Import-Module $PSScriptRoot\..\ImportExcel.psd1
|
||||
}
|
||||
|
||||
Describe "Test New Conditional Formatting IconSet" -Tag ConditionalFormattingIconSet {
|
||||
BeforeEach {
|
||||
$xlFilename = "TestDrive:\ConditionalFormattingIconSet.xlsx"
|
||||
Remove-Item $xlFilename -ErrorAction SilentlyContinue
|
||||
|
||||
$data = ConvertFrom-Csv @"
|
||||
Region,State,Other,Units,Price,InStock
|
||||
West,Texas,1,927,923.71,1
|
||||
North,Tennessee,3,466,770.67,0
|
||||
East,Florida,0,1520,458.68,1
|
||||
East,Maine,1,1828,661.24,0
|
||||
West,Virginia,1,465,053.58,1
|
||||
North,Missouri,1,436,235.67,1
|
||||
South,Kansas,0,214,992.47,1
|
||||
North,North Dakota,1,789,640.72,0
|
||||
South,Delaware,-1,712,508.55,1
|
||||
"@
|
||||
}
|
||||
|
||||
It "Should set ThreeIconSet" {
|
||||
# $cfi1 = New-ConditionalFormattingIconSet -Range C:C -ConditionalFormat ThreeIconSet -IconType Symbols -ShowIconOnly
|
||||
$cfi1 = New-ConditionalFormattingIconSet -Range C:C -ConditionalFormat ThreeIconSet -IconType Symbols
|
||||
|
||||
$data | Export-Excel $xlFilename -ConditionalFormat $cfi1
|
||||
$actual = Import-Excel $xlFilename
|
||||
$actual.count | Should -Be 9
|
||||
|
||||
$xl = Open-ExcelPackage $xlFilename
|
||||
$xl.Workbook.Worksheets.Count | Should -Be 1
|
||||
$targetSheet = $xl.Workbook.Worksheets[1]
|
||||
|
||||
$targetSheet.Name | Should -Be "Sheet1"
|
||||
$targetSheet.ConditionalFormatting.Count | Should -Be 1
|
||||
$targetSheet.ConditionalFormatting[0].Type | Should -Be "ThreeIconSet"
|
||||
$targetSheet.ConditionalFormatting[0].IconSet | Should -Be "Symbols"
|
||||
$targetSheet.ConditionalFormatting[0].Reverse | Should -BeFalse
|
||||
$targetSheet.ConditionalFormatting[0].ShowValue | Should -BeTrue
|
||||
|
||||
Close-ExcelPackage $xl -NoSave
|
||||
}
|
||||
|
||||
It "Should set ThreeIconSet with ShowOnlyIcon" {
|
||||
$cfi1 = New-ConditionalFormattingIconSet -Range C:C -ConditionalFormat ThreeIconSet -IconType Symbols -ShowIconOnly
|
||||
|
||||
$data | Export-Excel $xlFilename -ConditionalFormat $cfi1
|
||||
$actual = Import-Excel $xlFilename
|
||||
$actual.count | Should -Be 9
|
||||
|
||||
$xl = Open-ExcelPackage $xlFilename
|
||||
$xl.Workbook.Worksheets.Count | Should -Be 1
|
||||
$targetSheet = $xl.Workbook.Worksheets[1]
|
||||
|
||||
$targetSheet.Name | Should -Be "Sheet1"
|
||||
$targetSheet.ConditionalFormatting.Count | Should -Be 1
|
||||
$targetSheet.ConditionalFormatting[0].Type | Should -Be "ThreeIconSet"
|
||||
$targetSheet.ConditionalFormatting[0].IconSet | Should -Be "Symbols"
|
||||
$targetSheet.ConditionalFormatting[0].Reverse | Should -BeFalse
|
||||
$targetSheet.ConditionalFormatting[0].ShowValue | Should -BeFalse
|
||||
|
||||
Close-ExcelPackage $xl -NoSave
|
||||
}
|
||||
}
|
||||
@@ -1,11 +1,12 @@
|
||||
Describe "Test reading relative paths" {
|
||||
BeforeAll {
|
||||
$script:xlfileName = "TestR.xlsx"
|
||||
@{data = 1 } | Export-Excel (Join-Path $PWD "TestR.xlsx")
|
||||
If ([String]::IsNullOrEmpty($PWD)) { $PWD = $PSScriptRoot }
|
||||
@{data = 1 } | Export-Excel (Join-Path $PWD "TestR.xlsx")
|
||||
}
|
||||
|
||||
AfterAll {
|
||||
Remove-Item (Join-Path $PWD "$($script:xlfileName)")
|
||||
Remove-Item (Join-Path $PWD "$($script:xlfileName)")
|
||||
}
|
||||
|
||||
It "Should read local file".PadRight(90) {
|
||||
|
||||
44
__tests__/Set-CellComment.tests.ps1
Normal file
@@ -0,0 +1,44 @@
|
||||
if (-not (Get-command Import-Excel -ErrorAction SilentlyContinue)) {
|
||||
Import-Module $PSScriptRoot\..\ImportExcel.psd1
|
||||
}
|
||||
|
||||
Describe "Test setting comment on cells in different ways" -Tag SetCellComment {
|
||||
BeforeAll {
|
||||
$data = ConvertFrom-Csv @"
|
||||
OrderId,Category,Sales,Quantity,Discount
|
||||
1,Cosmetics,744.01,07,0.7
|
||||
2,Grocery,349.13,25,0.3
|
||||
3,Apparels,535.11,88,0.2
|
||||
4,Electronics,524.69,60,0.1
|
||||
5,Electronics,439.10,41,0.0
|
||||
6,Apparels,56.84,54,0.8
|
||||
7,Electronics,326.66,97,0.7
|
||||
8,Cosmetics,17.25,74,0.6
|
||||
9,Grocery,199.96,39,0.4
|
||||
10,Grocery,731.77,20,0.3
|
||||
"@
|
||||
|
||||
$Excel = $data | Export-Excel -PassThru
|
||||
$ws = $Excel.Workbook.Worksheets | Select-Object -First 1
|
||||
}
|
||||
|
||||
AfterAll {
|
||||
Close-ExcelPackage $Excel
|
||||
}
|
||||
|
||||
It "Should add comments to multiple cells".PadRight(87) {
|
||||
Set-CellComment -Range "A1" -Worksheet $ws -Text "This was added with a single cell range"
|
||||
Set-CellComment -Range "A2:C2" -Worksheet $ws -Text "This was added with a multiple cell range"
|
||||
Set-CellComment -ColumnLetter A -Row 3 -Worksheet $ws -Text "This was added using a column letter and rownumber"
|
||||
Set-CellComment -ColumnNumber 1 -Row 4 -Worksheet $ws -Text "This was added using a column number and row number"
|
||||
|
||||
Set-CellComment -Range "B2" -Worksheet $ws -Text "This demonstrates an overwrite of a previously set comment"
|
||||
|
||||
$ws.Cells["A1"].Comment.Text | Should -BeExactly "This was added with a single cell range"
|
||||
$ws.Cells["A2"].Comment.Text | Should -BeExactly "This was added with a multiple cell range"
|
||||
$ws.Cells["B2"].Comment.Text | Should -BeExactly "This demonstrates an overwrite of a previously set comment"
|
||||
$ws.Cells["C2"].Comment.Text | Should -BeExactly "This was added with a multiple cell range"
|
||||
$ws.Cells["A3"].Comment.Text | Should -BeExactly "This was added using a column letter and rownumber"
|
||||
$ws.Cells["A4"].Comment.Text | Should -BeExactly "This was added using a column number and row number"
|
||||
}
|
||||
}
|
||||
@@ -132,6 +132,11 @@ Describe "Set-ExcelColumn, Set-ExcelRow and Set-ExcelRange" {
|
||||
12011,Crowbar,7,23.48
|
||||
"@
|
||||
|
||||
# Pester errors for countries with ',' as decimal separator
|
||||
Foreach ($datarow in $data) {
|
||||
$datarow.Price = [decimal]($datarow.Price)
|
||||
}
|
||||
|
||||
$DriverData = convertFrom-CSv @"
|
||||
Name,Wikipage,DateOfBirth
|
||||
Fernando Alonso,/wiki/Fernando_Alonso,1981-07-29
|
||||
@@ -392,7 +397,7 @@ Describe "Table Formatting" {
|
||||
$excel = $data2 | Export-excel -path $path -WorksheetName Hardware -AutoNameRange -AutoSize -BoldTopRow -FreezeTopRow -PassThru
|
||||
$ws = $excel.Workbook.Worksheets[1]
|
||||
#test showfilter & TotalSettings
|
||||
$Table = Add-ExcelTable -PassThru -Range $ws.Cells[$($ws.Dimension.address)] -TableStyle Light1 -TableName HardwareTable -TotalSettings @{"Total" = "Sum"} -ShowFirstColumn -ShowFilter:$false
|
||||
$Table = Add-ExcelTable -PassThru -Range $ws.Cells[$($ws.Dimension.address)] -TableStyle Light1 -TableName HardwareTable -TableTotalSettings @{"Total" = "Sum"} -ShowFirstColumn -ShowFilter:$false
|
||||
#test expnading named number formats
|
||||
Set-ExcelColumn -Worksheet $ws -Column 4 -NumberFormat 'Currency'
|
||||
Set-ExcelColumn -Worksheet $ws -Column 5 -NumberFormat 'Currency'
|
||||
|
||||
126
changelog.md
@@ -1,3 +1,129 @@
|
||||
# 7.8.7
|
||||
|
||||
-
|
||||
|
||||
# Infrastructure change
|
||||
|
||||
- Thank you to [RipFence](https://github.com/RipFence) who asked how to place a chart on a different sheet from the data and then did a PR adding the example.
|
||||
- added `ignore` so files checked into examples do not trigger a CI run
|
||||
|
||||
# 7.8.6
|
||||
|
||||
- Thank you [John Boyne](https://github.com/kyllath)
|
||||
- Add missing parameter aliases to align with caller/callee
|
||||
|
||||
# 7.8.5
|
||||
|
||||
- Added `Get-ExcelFileSchema` to get the schema of an Excel file.
|
||||
- This was added to support interacting with `ChatGPT`. Passing the schema to the `ChatGPT` via `PowerShellAI` let's you ask questions about the data including generating code based on the schema.
|
||||
|
||||
```powershell
|
||||
Get-ExcelFileSchema .\salesData.xlsx
|
||||
```
|
||||
|
||||
```json
|
||||
{
|
||||
"ExcelFile": "salesData.xlsx",
|
||||
"WorksheetName": "Sheet1",
|
||||
"Visible": true,
|
||||
"Rows": 10,
|
||||
"Columns": 4,
|
||||
"Address": "A1:D10",
|
||||
"Path": ".",
|
||||
"PropertyNames": [
|
||||
"Region",
|
||||
"State",
|
||||
"Units",
|
||||
"Price"
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
# 7.8.x
|
||||
|
||||
Thanks to [Thomas Hofkens](https://github.com/thkn-hofa)
|
||||
- Added `-NoHyperLinkConversion` to `Export-Excel` to no convert data to hyperlinks. [#1316](https://github.com/dfinke/ImportExcel/issues/1316)
|
||||
|
||||
# 7.8.4
|
||||
|
||||
- Add -ShowOnlyIcon to `New-ConditionalFormattingIconSet` does not show data in the cell, just the icon. Based on this discussion https://github.com/dfinke/ImportExcel/discussions/1340
|
||||
|
||||
# 7.8.3
|
||||
|
||||
Thanks [Thomas Hofkens](https://github.com/thkn-hofa)
|
||||
|
||||
- Extended Export-Excel with parameter TableTotalSettings
|
||||
- New Feature: Set-CellComment
|
||||
- Fix Pester error for countries with ',' as decimal separator
|
||||
- Fix Pester error for Windows PowerShell 5.1
|
||||
|
||||
# 7.8.2
|
||||
|
||||
- Fix docs [#1254](https://github.com/dfinke/ImportExcel/pull/1251)`Add-Worksheet` warning. Thank you [Wilson Stewart](https://github.com/WilsonStewart)
|
||||
- Fix docs [#1251](https://github.com/dfinke/ImportExcel/pull/1251)`Add-Worksheet` warning. Thank you [Jeremiah Adams](https://github.com/JeremiahTheFirst)
|
||||
- Fix docs [#1253](https://github.com/dfinke/ImportExcel/pull/1253) `convertfrom-exceltosqlinsert`. Thank you [Wes Stahler](https://github.com/stahler)
|
||||
- Set Validate Range for rows to max rows available [#1273](https://github.com/dfinke/ImportExcel/pull/1273). Thank you [Stephen Brown](https://github.com/steve-daedilus)
|
||||
- Extended Get-ExcelFileSummary to include more Visible -eq $true|$false
|
||||
|
||||
# 7.8.1
|
||||
|
||||
- Fixed conditional formatting so it recognizes 'Top and Bottom' as a rule type. Thanks [g-pearl](https://github.com/g-pearl)
|
||||
* Update open-excelpackage.md. Thanks [stahler](https://github.com/stahler)
|
||||
- Added Group Column tests
|
||||
|
||||
|
||||
# 7.8.0
|
||||
Thanks [James O'Neill](https://github.com/jhoneill)
|
||||
|
||||
- Updated example Get-ModuleStats that extracts module statistics on the PowerShell Gallery.
|
||||
- Added GroupNumericColumn and GroupDateColumn to New-PivotTableDefinition and Add-PivotTable.
|
||||
|
||||
|GroupNumericColumn|GroupDateColumn|
|
||||
|:---:|:---:|
|
||||
|||
|
||||
|
||||
# Example added
|
||||
|
||||
Thank you [@kkazala](https://github.com/kkazala)
|
||||
|
||||
- Added an example reading a sheet, extracting the `ConditionalFormatting` and generating the PowerShell statements so you can re-create them.
|
||||
- Added an example showing `ConditionalFormatting` using the `RuleType` `Expression` with a formula
|
||||
- [Highlight-DiffCells.ps1](https://github.dev/kkazala/ImportExcel/blob/b53881fd023c052da1acc7812511da223bb2e40c/Examples/ConditionalFormatting/Highlight-DiffCells.ps1)
|
||||
|
||||
# 7.7.0
|
||||
|
||||
- Fix a bug with `-UnderLineType parameter is ignored in Set-ExcelColumn` [#1204](https://github.com/dfinke/ImportExcel/issues/1204)
|
||||
|
||||
# 7.6.0
|
||||
|
||||
- **_[Under investigation]_** Fix -StartRow and -StartColumn being ignored.
|
||||
- James O'Neill:
|
||||
- Update Get-HtmlTable to support to use PowerHTML (maintained by [Justin Grote](https://twitter.com/JustinWGrote)).
|
||||
- Added example to including a new function Import-ByColumn. Works like Import-Excel but with data in columns instead of the conventional rows.
|
||||
- Update Import-HTML with better defaults
|
||||
- Fixed example `Get-ModuleStats.ps1` which reads the PowerShell Gallery page and extracts the stats table
|
||||
|
||||
|
||||
# v7.5.2
|
||||
- Changed the switch `-NotAsDictionary` to `-Raw`. Works with `-Worksheetname *` reads all the sheets in the xlsx file and returns an array.
|
||||
|
||||
# v7.5.1
|
||||
- Fixed `Import-Excel` - Reset `EndRow` and `EndColumn` in the correct place.
|
||||
# v7.5.0
|
||||
## Fixes
|
||||
|
||||
- Importing multiple files with Import-Excel by pipeline uses only the first file for the row count https://github.com/dfinke/ImportExcel/issues/1172
|
||||
|
||||
## New Features
|
||||
|
||||
- Import-Excel now supports importing multiple sheets. It can either return a dictionary of all sheets, or as a single array of all sheets combined.
|
||||
- `Import-Excel $xlfile *` # reads all sheets, returns all data in a dictionary
|
||||
- `Import-Excel $xlfile * -NotAsDictionary` # reads all sheets, returns all data in a single array
|
||||
- Added helper functions. Useful for working with an Excel package via `Open-ExcelPackage` or `-PassThru`
|
||||
- `Enable-ExcelAutoFilter`
|
||||
- `Enable-ExcelAutofit`
|
||||
- `Get-ExcelSheetDimensionAddress`
|
||||
|
||||
# v7.4.2
|
||||
|
||||
- Thank you [James Mueller](https://github.com/jamesmmueller) Updated `ConvertFrom-ExcelToSQLInsert` to handle single quotes in the SQL statement.
|
||||
|
||||
BIN
images/GroupDateColumn.png
Normal file
|
After Width: | Height: | Size: 27 KiB |
BIN
images/GroupNumericColumn.png
Normal file
|
After Width: | Height: | Size: 23 KiB |
BIN
images/SalesData.png
Normal file
|
After Width: | Height: | Size: 10 KiB |
BIN
images/SalesDataChart.png
Normal file
|
After Width: | Height: | Size: 35 KiB |
BIN
images/SalesDataChartPivotTable.png
Normal file
|
After Width: | Height: | Size: 238 KiB |
BIN
images/logo.png
Normal file
|
After Width: | Height: | Size: 22 KiB |
BIN
images/logoWithInstall.png
Normal file
|
After Width: | Height: | Size: 35 KiB |
@@ -66,7 +66,7 @@ PS\> $excel = $avdata | Export-Excel -Path (Join-path $FilePath "\Machines.XLSX"
|
||||
$excel.Save() ; $excel.Dispose()
|
||||
```
|
||||
|
||||
Here Export-Excel is called with the -PassThru parameter, so the ExcelPackage object representing Machines.XLSX is stored in $Excel.The desired worksheet is selected, and then columns" B" and "I" are conditionally formatted \(excluding the top row\) to show red text if they contain "2003" or "Disabled" respectively.
|
||||
Here Export-Excel is called with the -PassThru parameter, so the ExcelPackage object representing Machines.XLSX is stored in $Excel. The desired worksheet is selected, and then columns" B" and "I" are conditionally formatted \(excluding the top row\) 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.
|
||||
|
||||
@@ -83,7 +83,7 @@ Again Export-Excel has been called with -PassThru leaving a package object in $E
|
||||
|
||||
This time B1:B100 has been conditionally formatted with 3 icons, using the "Flags" Icon-Set.
|
||||
|
||||
Add-ConditionalFormatting does not provide accessto 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.
|
||||
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 3
|
||||
|
||||
|
||||
@@ -81,7 +81,7 @@ PS\> $Excel = Invoke-Sum (Get-Process) Company Handles, PM, VirtualMemorySize |
|
||||
|
||||
The first line exports information to a table in new file; and captures the excel Package object in $Excel
|
||||
|
||||
The second line creates a chart on the first page of the work sheet, using the notation "TableName\[ColumnnName\]" to refer to the data, the labels come Name column in the table, and the data series from its PM and VirtualMemorySize columns. The display names for these in the header are set to 'PM' and 'VMSize'.
|
||||
The second line creates a chart on the first page of the work sheet, using the notation "TableName\[ColumnName\]" to refer to the data, the labels come Name column in the table, and the data series from its PM and VirtualMemorySize columns. The display names for these in the header are set to 'PM' and 'VMSize'.
|
||||
|
||||
### EXAMPLE 4
|
||||
|
||||
@@ -112,7 +112,7 @@ An existing Sheet where the chart will be created.
|
||||
|
||||
```yaml
|
||||
Type: ExcelWorksheet
|
||||
Parameter Sets: Workshet
|
||||
Parameter Sets: Worksheet
|
||||
Aliases:
|
||||
|
||||
Required: True
|
||||
|
||||
@@ -14,7 +14,7 @@ Adds Tables to Excel workbooks.
|
||||
## SYNTAX
|
||||
|
||||
```text
|
||||
Add-ExcelTable [-Range] <ExcelRange> [[-TableName] <String>] [[-TableStyle] <TableStyles>] [-ShowHeader] [-ShowFilter] [-ShowTotal] [[-TotalSettings] <Hashtable>] [-ShowFirstColumn] [-ShowLastColumn] [-ShowRowStripes] [-ShowColumnStripes] [-PassThru] [<CommonParameters>]
|
||||
Add-ExcelTable [-Range] <ExcelRange> [[-TableName] <String>] [[-TableStyle] <TableStyles>] [-ShowHeader] [-ShowFilter] [-ShowTotal] [[-TableTotalSettings] <Hashtable>] [-ShowFirstColumn] [-ShowLastColumn] [-ShowRowStripes] [-ShowColumnStripes] [-PassThru] [<CommonParameters>]
|
||||
```
|
||||
|
||||
## DESCRIPTION
|
||||
@@ -142,9 +142,19 @@ Accept pipeline input: False
|
||||
Accept wildcard characters: False
|
||||
```
|
||||
|
||||
### -TotalSettings
|
||||
### -TableTotalSettings
|
||||
|
||||
A HashTable in the form ColumnName = "Average"\|"Count"\|"CountNums"\|"Max"\|"Min"\|"None"\|"StdDev"\|"Sum"\|"Var" - if specified, -ShowTotal is not needed.
|
||||
A HashTable in the form of either
|
||||
|
||||
- ColumnName = "Average"\|"Count"\|"CountNums"\|"Max"\|"Min"\|"None"\|"StdDev"\|"Sum"\|"Var"|\<Custom Excel function starting with "="\>
|
||||
- ```powershell
|
||||
ColumnName = @{
|
||||
Function = "Average"\|"Count"\|"CountNums"\|"Max"\|"Min"\|"None"\|"StdDev"\|"Sum"\|"Var"|<Custom Excel function starting with "=">
|
||||
Comment = $HoverComment
|
||||
}
|
||||
```
|
||||
|
||||
if specified, -ShowTotal is not needed.
|
||||
|
||||
```yaml
|
||||
Type: Hashtable
|
||||
|
||||
@@ -331,6 +331,22 @@ Accept pipeline input: False
|
||||
Accept wildcard characters: False
|
||||
```
|
||||
|
||||
### -GroupDateColumn
|
||||
|
||||
The name of a Column field which should be grouped by parts of the date/time \(ignored if GroupDateRow is not specified\)
|
||||
|
||||
```yaml
|
||||
Type: String
|
||||
Parameter Sets: (All)
|
||||
Aliases:
|
||||
|
||||
Required: False
|
||||
Position: Named
|
||||
Default value: None
|
||||
Accept pipeline input: False
|
||||
Accept wildcard characters: False
|
||||
```
|
||||
|
||||
### -GroupDatePart
|
||||
|
||||
The Part\(s\) of the date to use in the grouping \(ignored if GroupDateRow is not specified\)
|
||||
@@ -364,6 +380,22 @@ Accept pipeline input: False
|
||||
Accept wildcard characters: False
|
||||
```
|
||||
|
||||
### -GroupNumericColumn
|
||||
|
||||
The name of a Column field which should be grouped by Number \(e.g. 0-99, 100-199, 200-299 \)
|
||||
|
||||
```yaml
|
||||
Type: String
|
||||
Parameter Sets: (All)
|
||||
Aliases:
|
||||
|
||||
Required: False
|
||||
Position: Named
|
||||
Default value: None
|
||||
Accept pipeline input: False
|
||||
Accept wildcard characters: False
|
||||
```
|
||||
|
||||
### -GroupNumericMin
|
||||
|
||||
The starting point for grouping
|
||||
|
||||
@@ -137,7 +137,7 @@ Accept wildcard characters: False
|
||||
|
||||
### -Header
|
||||
|
||||
Specifies custom property names to use, instead of the values defined in the column headers of the TopRow. If you provide fewr 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 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 blank as there is no data for them.
|
||||
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 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 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 blank as there is no data for them.
|
||||
|
||||
```yaml
|
||||
Type: String[]
|
||||
|
||||
@@ -16,19 +16,19 @@ Exports data to an Excel worksheet.
|
||||
### Default \(Default\)
|
||||
|
||||
```text
|
||||
Export-Excel [[-Path] <String>] [-InputObject <Object>] [-Calculate] [-Show] [-WorksheetName <String>] [-Password <String>] [-ClearSheet] [-Append] [-Title <String>] [-TitleFillPattern <ExcelFillStyle>] [-TitleBold] [-TitleSize <Int32>] [-TitleBackgroundColor <Object>][-IncludePivotTable] [-PivotTableName <String>] [-PivotRows <String[]> [-PivotColumns <String[]>] [-PivotData <Object>] [-PivotFilter <String[]>] [-PivotDataToColumn] [-PivotTableDefinition <Hashtable>] [-IncludePivotChart] [-ChartType <eChartType>] [-NoLegend] [-ShowCategory] [-ShowPercent] [-AutoSize] [-MaxAutoSizeRows <Object>] [-NoClobber] [-FreezeTopRow] [-FreezeFirstColumn] [-FreezeTopRowFirstColumn] [-FreezePane <Int32[]>] [-AutoFilter] [-BoldTopRow] [-NoHeader] [-RangeName <String>] [-TableName <Object>] [-TableStyle <TableStyles>] [-Barchart] [-PieChart] [-LineChart] [-ColumnChart] [-ExcelChartDefinition <Object[]>] [-HideSheet <String[]>] [-UnHideSheet <String[]>] [-MoveToStart] [-MoveToEnd] [-MoveBefore <Object>] [-MoveAfter <Object>] [-KillExcel] [-AutoNameRange] [-StartRow <Int32>] [-StartColumn <Int32>] [-PassThru] [-Numberformat <String>] [-ExcludeProperty <String[]>] [-NoAliasOrScriptPropeties] [-DisplayPropertySet] [-NoNumberConversion <String[]>] [-ConditionalFormat <Object[]>] [-ConditionalText <Object[]>] [-Style <Object[]>] [-CellStyleSB <ScriptBlock>] [-Activate] [-Now] [-ReturnRange] [-PivotTotals <String>] [-NoTotalsInPivot] [-ReZip] [<CommonParameters>]
|
||||
Export-Excel [[-Path] <String>] [-InputObject <Object>] [-Calculate] [-Show] [-WorksheetName <String>] [-Password <String>] [-ClearSheet] [-Append] [-Title <String>] [-TitleFillPattern <ExcelFillStyle>] [-TitleBold] [-TitleSize <Int32>] [-TitleBackgroundColor <Object>][-IncludePivotTable] [-PivotTableName <String>] [-PivotRows <String[]> [-PivotColumns <String[]>] [-PivotData <Object>] [-PivotFilter <String[]>] [-PivotDataToColumn] [-PivotTableDefinition <Hashtable>] [-IncludePivotChart] [-ChartType <eChartType>] [-NoLegend] [-ShowCategory] [-ShowPercent] [-AutoSize] [-MaxAutoSizeRows <Object>] [-NoClobber] [-FreezeTopRow] [-FreezeFirstColumn] [-FreezeTopRowFirstColumn] [-FreezePane <Int32[]>] [-AutoFilter] [-BoldTopRow] [-NoHeader] [-RangeName <String>] [-TableName <Object>] [-TableStyle <TableStyles>] [-TableTotalSettings <HashTable>] [-Barchart] [-PieChart] [-LineChart] [-ColumnChart] [-ExcelChartDefinition <Object[]>] [-HideSheet <String[]>] [-UnHideSheet <String[]>] [-MoveToStart] [-MoveToEnd] [-MoveBefore <Object>] [-MoveAfter <Object>] [-KillExcel] [-AutoNameRange] [-StartRow <Int32>] [-StartColumn <Int32>] [-PassThru] [-Numberformat <String>] [-ExcludeProperty <String[]>] [-NoAliasOrScriptPropeties] [-DisplayPropertySet] [-NoNumberConversion <String[]>] [-NoHyperLinkConversion <String[]>] [-ConditionalFormat <Object[]>] [-ConditionalText <Object[]>] [-Style <Object[]>] [-CellStyleSB <ScriptBlock>] [-Activate] [-Now] [-ReturnRange] [-PivotTotals <String>] [-NoTotalsInPivot] [-ReZip] [<CommonParameters>]
|
||||
```
|
||||
|
||||
### Package
|
||||
|
||||
```text
|
||||
Export-Excel -ExcelPackage <ExcelPackage> [-InputObject <Object>] [-Calculate] [-Show] [-WorksheetName <String>] [-Password <String>] [-ClearSheet] [-Append] [-Title <String>] [-TitleFillPattern <ExcelFillStyle>] [-TitleBold] [-TitleSize <Int32>] [-TitleBackgroundColor <Object>] [-IncludePivotTable] [-PivotTableName <String>] [-PivotRows <String[]>] [-PivotColumns <String[]>] [-PivotData <Object>] [-PivotFilter <String[]>] [-PivotDataToColumn] [-PivotTableDefinition <Hashtable>] [-IncludePivotChart] [-ChartType <eChartType>] [-NoLegend] [-ShowCategory] [-ShowPercent] [-AutoSize] [-MaxAutoSizeRows <Object>] [-NoClobber] [-FreezeTopRow] [-FreezeFirstColumn] [-FreezeTopRowFirstColumn] [-FreezePane <Int32[]>] [-AutoFilter] [-BoldTopRow] [-NoHeader] [-RangeName <String>] [-TableName <Object>] [-TableStyle <TableStyles>] [-Barchart] [-PieChart] [-LineChart] [-ColumnChart] [-ExcelChartDefinition <Object[]>] [-HideSheet <String[]>] [-UnHideSheet <String[]>] [-MoveToStart] [-MoveToEnd] [-MoveBefore <Object>] [-MoveAfter <Object>] [-KillExcel] [-AutoNameRange] [-StartRow <Int32>] [-StartColumn <Int32>] [-PassThru] [-Numberformat <String>] [-ExcludeProperty <String[]>]
|
||||
[-NoAliasOrScriptPropeties] [-DisplayPropertySet] [-NoNumberConversion <String[]>] [-ConditionalFormat <Object[]>] [-ConditionalText <Object[]>] [-Style <Object[]>] [-CellStyleSB <ScriptBlock>] [-Activate] [-ReturnRange] [-PivotTotals <String>] [-NoTotalsInPivot] [-ReZip] [<CommonParameters>]
|
||||
Export-Excel -ExcelPackage <ExcelPackage> [-InputObject <Object>] [-Calculate] [-Show] [-WorksheetName <String>] [-Password <String>] [-ClearSheet] [-Append] [-Title <String>] [-TitleFillPattern <ExcelFillStyle>] [-TitleBold] [-TitleSize <Int32>] [-TitleBackgroundColor <Object>] [-IncludePivotTable] [-PivotTableName <String>] [-PivotRows <String[]>] [-PivotColumns <String[]>] [-PivotData <Object>] [-PivotFilter <String[]>] [-PivotDataToColumn] [-PivotTableDefinition <Hashtable>] [-IncludePivotChart] [-ChartType <eChartType>] [-NoLegend] [-ShowCategory] [-ShowPercent] [-AutoSize] [-MaxAutoSizeRows <Object>] [-NoClobber] [-FreezeTopRow] [-FreezeFirstColumn] [-FreezeTopRowFirstColumn] [-FreezePane <Int32[]>] [-AutoFilter] [-BoldTopRow] [-NoHeader] [-RangeName <String>] [-TableName <Object>] [-TableStyle <TableStyles>] [-TableTotalSettings <HashTable>] [-Barchart] [-PieChart] [-LineChart] [-ColumnChart] [-ExcelChartDefinition <Object[]>] [-HideSheet <String[]>] [-UnHideSheet <String[]>] [-MoveToStart] [-MoveToEnd] [-MoveBefore <Object>] [-MoveAfter <Object>] [-KillExcel] [-AutoNameRange] [-StartRow <Int32>] [-StartColumn <Int32>] [-PassThru] [-Numberformat <String>] [-ExcludeProperty <String[]>]
|
||||
[-NoAliasOrScriptPropeties] [-DisplayPropertySet] [-NoNumberConversion <String[]>] [-NoHyperLinkConversion <String[]>] [-ConditionalFormat <Object[]>] [-ConditionalText <Object[]>] [-Style <Object[]>] [-CellStyleSB <ScriptBlock>] [-Activate] [-ReturnRange] [-PivotTotals <String>] [-NoTotalsInPivot] [-ReZip] [<CommonParameters>]
|
||||
```
|
||||
|
||||
## DESCRIPTION
|
||||
|
||||
Exports data to an Excel file and where possible tries to convert numbers in text fields so Excel recognizes them as numbers instead of text. After all: Excel is a spreadsheet program used for number manipulation and calculations. The parameter -NoNumberConversion \* can be used if number conversion is not desired.
|
||||
Exports data to an Excel file and where possible tries to convert numbers in text fields so Excel recognizes them as numbers instead of text. After all: Excel is a spreadsheet program used for number manipulation and calculations. The parameter -NoNumberConversion \* can be used if number conversion is not desired. In the same way the parameter NoHyperLinkConversion \* can be used if hyperlink conversion is not desired
|
||||
|
||||
## EXAMPLES
|
||||
|
||||
@@ -108,10 +108,10 @@ PS\> [PSCustOmobject][Ordered]@{
|
||||
PhoneNr1 = '+32 44'
|
||||
PhoneNr2 = '+32 4 4444 444'
|
||||
PhoneNr3 = '+3244444444'
|
||||
} | Export-Excel @ExcelParams -NoNumberConversion *
|
||||
} | Export-Excel @ExcelParams -NoNumberConversion * -NoHyperLinkConversion *
|
||||
```
|
||||
|
||||
Exports all data to the Excel file 'Excel.xslx' as is, no number conversion will take place. This means that Excel will show the exact same data that you handed over to the 'Export-Excel' function.
|
||||
Exports all data to the Excel file 'Excel.xslx' as is, no number or hyperlink conversion will take place. This means that Excel will show the exact same data that you handed over to the 'Export-Excel' function.
|
||||
|
||||
### EXAMPLE 5
|
||||
|
||||
@@ -156,6 +156,29 @@ If neither condition is met, the color will be the default, black text on a whit
|
||||
|
||||
### EXAMPLE 7
|
||||
|
||||
```text
|
||||
PS\> $r = Get-ChildItem C:\WINDOWS\system32 -File
|
||||
|
||||
PS\> $TotalSettings = @{
|
||||
Name = "Count"
|
||||
Extension = "=COUNTIF([Extension];`".exe`")"
|
||||
Length = @{
|
||||
Function = "=SUMIF([Extension];`".exe`";[Length])"
|
||||
Comment = "Sum of all exe sizes"
|
||||
}
|
||||
}
|
||||
|
||||
PS\> $r | Export-Excel -TableName system32files -TableStyle Medium10 -TableTotalSettings $TotalSettings -Show
|
||||
```
|
||||
|
||||
Exports a list of files with a totals row with three calculated totals:
|
||||
|
||||
- Total count of names
|
||||
- Count of files with the extension ".exe"
|
||||
- Total size of all file with extension ".exe" and add a comment as to not be mistaken that is is the total size of all files
|
||||
|
||||
### EXAMPLE 8
|
||||
|
||||
```text
|
||||
PS\> $ExcelParams = @{
|
||||
Path = $env:TEMP + '\Excel.xlsx'
|
||||
@@ -189,25 +212,25 @@ PS\> $Array | Update-FirstObjectProperties | Export-Excel @ExcelParams -Workshee
|
||||
|
||||
Updates the first object of the array by adding property 'Member3' and 'Member4'. Afterwards, all objects are exported to an Excel file and all column headers are visible.
|
||||
|
||||
### EXAMPLE 8
|
||||
### EXAMPLE 9
|
||||
|
||||
```text
|
||||
PS\> Get-Process | Export-Excel .\test.xlsx -WorksheetName Processes -IncludePivotTable -Show -PivotRows Company -PivotData PM
|
||||
```
|
||||
|
||||
### EXAMPLE 9
|
||||
### EXAMPLE 10
|
||||
|
||||
```text
|
||||
PS\> Get-Process | Export-Excel .\test.xlsx -WorksheetName Processes -ChartType PieExploded3D -IncludePivotChart -IncludePivotTable -Show -PivotRows Company -PivotData PM
|
||||
```
|
||||
|
||||
### EXAMPLE 10
|
||||
### EXAMPLE 11
|
||||
|
||||
```text
|
||||
PS\> Get-Service | Export-Excel 'c:\temp\test.xlsx' -Show -IncludePivotTable -PivotRows status -PivotData @{status='count'}
|
||||
```
|
||||
|
||||
### EXAMPLE 11
|
||||
### EXAMPLE 12
|
||||
|
||||
```text
|
||||
PS\> $pt = [ordered]@{}
|
||||
@@ -237,7 +260,7 @@ Then it puts Service data on Sheet1 with one call to Export-Excel and Process Da
|
||||
|
||||
The third and final call adds the two PivotTables and opens the spreadsheet in Excel.
|
||||
|
||||
### EXAMPLE 12
|
||||
### EXAMPLE 13
|
||||
|
||||
```text
|
||||
PS\> Remove-Item -Path .\test.xlsx
|
||||
@@ -258,7 +281,7 @@ It then uses the package object to apply formatting, and then saves the workbook
|
||||
|
||||
Note: Other commands in the module remove the need to work directly with the package object in this way.
|
||||
|
||||
### EXAMPLE 13
|
||||
### EXAMPLE 14
|
||||
|
||||
```text
|
||||
PS\> Remove-Item -Path .\test.xlsx -ErrorAction Ignore
|
||||
@@ -281,7 +304,7 @@ This a more sophisticated version of the previous example showing different ways
|
||||
|
||||
In the final command a PivotChart is added and the workbook is opened in Excel.
|
||||
|
||||
### EXAMPLE 14
|
||||
### EXAMPLE 15
|
||||
|
||||
```text
|
||||
PS\> 0..360 | ForEach-Object {[pscustomobject][ordered]@{X=$_; Sinx="=Sin(Radians(x)) "} } |
|
||||
@@ -290,7 +313,7 @@ PS\> 0..360 | ForEach-Object {[pscustomobject][ordered]@{X=$_; Sinx="=Sin(Radian
|
||||
|
||||
Creates a line chart showing the value of Sine\(x\) for values of X between 0 and 360 degrees.
|
||||
|
||||
### EXAMPLE 15
|
||||
### EXAMPLE 16
|
||||
|
||||
```text
|
||||
PS\> Invoke-Sqlcmd -ServerInstance localhost\DEFAULT -Database AdventureWorks2014 -Query "select * from sys.tables" -OutputAs DataRows |
|
||||
@@ -337,7 +360,7 @@ Accept wildcard characters: False
|
||||
|
||||
### -InputObject
|
||||
|
||||
Date is usually piped into Export-Excel, but it also accepts data through the InputObject parameter
|
||||
Data is usually piped into Export-Excel, but it also accepts data through the InputObject parameter
|
||||
|
||||
```yaml
|
||||
Type: Object
|
||||
@@ -952,6 +975,32 @@ Accept pipeline input: False
|
||||
Accept wildcard characters: False
|
||||
```
|
||||
|
||||
### -TableTotalSettings
|
||||
|
||||
A HashTable in the form of either
|
||||
|
||||
- ColumnName = "Average"\|"Count"\|"CountNums"\|"Max"\|"Min"\|"None"\|"StdDev"\|"Sum"\|"Var"|\<Custom Excel function starting with "="\>
|
||||
- ```powershell
|
||||
ColumnName = @{
|
||||
Function = "Average"\|"Count"\|"CountNums"\|"Max"\|"Min"\|"None"\|"StdDev"\|"Sum"\|"Var"|<Custom Excel function starting with "=">
|
||||
Comment = $HoverComment
|
||||
}
|
||||
```
|
||||
|
||||
if specified, -ShowTotal is not needed.
|
||||
|
||||
```yaml
|
||||
Type: Hashtable
|
||||
Parameter Sets: (All)
|
||||
Aliases:
|
||||
|
||||
Required: False
|
||||
Position: 4
|
||||
Default value: None
|
||||
Accept pipeline input: False
|
||||
Accept wildcard characters: False
|
||||
```
|
||||
|
||||
### -Barchart
|
||||
|
||||
Creates a "quick" bar chart using the first text column as labels and the first numeric column as values.
|
||||
@@ -1308,6 +1357,24 @@ Accept pipeline input: False
|
||||
Accept wildcard characters: False
|
||||
```
|
||||
|
||||
### -NoHyperLinkConversion
|
||||
|
||||
By default the command will convert all URIs to hyperlinks if possible, but this isn't always desirable. -NoHyperLinkConversion allows you to add exceptions for the conversion.
|
||||
|
||||
The only Wildcard allowed is \* for all properties
|
||||
|
||||
```yaml
|
||||
Type: String[]
|
||||
Parameter Sets: (All)
|
||||
Aliases:
|
||||
|
||||
Required: False
|
||||
Position: Named
|
||||
Default value: None
|
||||
Accept pipeline input: False
|
||||
Accept wildcard characters: False
|
||||
```
|
||||
|
||||
### -ConditionalFormat
|
||||
|
||||
One or more conditional formatting rules defined with New-ConditionalFormattingIconSet.
|
||||
|
||||
@@ -64,6 +64,7 @@ If the default behavior is not desired and you want to import the complete works
|
||||
### EXAMPLE 1
|
||||
|
||||
```text
|
||||
|
||||
----------------------------------------------
|
||||
| File: Movies.xlsx - Sheet: Actors |
|
||||
----------------------------------------------
|
||||
@@ -89,6 +90,7 @@ Notice that column 'B' is not imported because there's no value in cell 'B1' tha
|
||||
### EXAMPLE 2
|
||||
|
||||
```text
|
||||
|
||||
----------------------------------------------
|
||||
| File: Movies.xlsx - Sheet: Actors |
|
||||
----------------------------------------------
|
||||
@@ -120,6 +122,7 @@ Notice that the column header \(row 1\) is imported as an object too.
|
||||
### EXAMPLE 3
|
||||
|
||||
```text
|
||||
|
||||
----------------------------------------------------------
|
||||
| File: Movies.xlsx - Sheet: Movies |
|
||||
----------------------------------------------------------
|
||||
@@ -160,6 +163,7 @@ Notice that empty rows are imported and that data for the property 'Genre' is no
|
||||
### EXAMPLE 4
|
||||
|
||||
```text
|
||||
|
||||
----------------------------------------------------------
|
||||
| File: Movies.xlsx - Sheet: Movies |
|
||||
----------------------------------------------------------
|
||||
@@ -192,6 +196,7 @@ Notice that empty rows and empty columns are not imported.
|
||||
### EXAMPLE 5
|
||||
|
||||
```text
|
||||
|
||||
----------------------------------------------------------
|
||||
| File: Movies.xlsx - Sheet: Actors |
|
||||
----------------------------------------------------------
|
||||
|
||||
@@ -225,6 +225,22 @@ Accept pipeline input: False
|
||||
Accept wildcard characters: False
|
||||
```
|
||||
|
||||
### -GroupDateColumn
|
||||
|
||||
The name of a column field which should be grouped by parts of the date/time \(ignored if GroupDatePart is not specified\)
|
||||
|
||||
```yaml
|
||||
Type: String
|
||||
Parameter Sets: (All)
|
||||
Aliases:
|
||||
|
||||
Required: False
|
||||
Position: Named
|
||||
Default value: None
|
||||
Accept pipeline input: False
|
||||
Accept wildcard characters: False
|
||||
```
|
||||
|
||||
### -GroupDatePart
|
||||
|
||||
The Part\(s\) of the date to use in the grouping \(ignored if GroupDateRow is not specified\)
|
||||
@@ -234,7 +250,6 @@ Type: eDateGroupBy[]
|
||||
Parameter Sets: (All)
|
||||
Aliases:
|
||||
Accepted values: Years, Quarters, Months, Days, Hours, Minutes, Seconds
|
||||
|
||||
Required: False
|
||||
Position: Named
|
||||
Default value: None
|
||||
@@ -250,7 +265,6 @@ The name of a row field which should be grouped by Number \(e.g 0-99, 100-199, 2
|
||||
Type: String
|
||||
Parameter Sets: (All)
|
||||
Aliases:
|
||||
|
||||
Required: False
|
||||
Position: Named
|
||||
Default value: None
|
||||
@@ -258,6 +272,23 @@ Accept pipeline input: False
|
||||
Accept wildcard characters: False
|
||||
```
|
||||
|
||||
|
||||
### -GroupNumericColumn
|
||||
|
||||
The name of a column field which should be grouped by Number \(e.g 0-99, 100-199, 200-299 \)
|
||||
|
||||
```yaml
|
||||
Type: String
|
||||
Parameter Sets: (All)
|
||||
Aliases:
|
||||
Required: False
|
||||
Position: Named
|
||||
Default value: None
|
||||
Accept pipeline input: False
|
||||
Accept wildcard characters: False
|
||||
```
|
||||
|
||||
|
||||
### -GroupNumericMin
|
||||
|
||||
The starting point for grouping
|
||||
|
||||
@@ -39,13 +39,13 @@ This will create a new file in the temp folder if it doesn't already exist. It t
|
||||
### EXAMPLE 2
|
||||
|
||||
```text
|
||||
PS\> $excela= Open-ExcelPackage -path "$xlPath" -Password $password
|
||||
PS\> $sheet1 = $excel.Workbook.Worksheetsa"sheet1" ]
|
||||
PS\> $excel= Open-ExcelPackage -path "$xlPath" -Password $password
|
||||
PS\> $sheet1 = $excel.Workbook.Worksheets["sheet1"]
|
||||
PS\> Set-ExcelRange -Range $sheet1.Cells ["E1:S1048576" ], $sheet1.Cells ["V1:V1048576" ] -NFormat ( [cultureinfo ]::CurrentCulture.DateTimeFormat.ShortDatePattern)
|
||||
PS\> Close-ExcelPackage $excel -Show
|
||||
```
|
||||
|
||||
This will open the password protected file at $xlPath using the password stored in $Password. Sheet1 is selected and formatting applied to two blocks of the sheet; then the file is and saved and loaded into Excel.
|
||||
This will open the password protected file at $xlPath using the password stored in $Password. Sheet1 is selected and formatting applied to two blocks of the sheet; then the file is saved and loaded into Excel.
|
||||
|
||||
## PARAMETERS
|
||||
|
||||
|
||||