Compare commits
94 Commits
v7.5.2
...
add-header
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6166f0e87c | ||
|
|
bb8297c528 | ||
|
|
b61aef888f | ||
|
|
4c002358fe | ||
|
|
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 | ||
|
|
f348088b62 |
27
.github/workflows/ci.yml
vendored
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- master
|
||||||
|
- Set-up-GHA-CI/CD
|
||||||
|
|
||||||
|
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()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
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
|
||||||
29
Examples/CopyRange/CopyFromOneSheetInSameWorkbook.ps1
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
<#
|
||||||
|
Copy a range from WorksheetA to WorksheetB
|
||||||
|
#>
|
||||||
|
|
||||||
|
$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 = "./test.xlsx"
|
||||||
|
Remove-Item $xlfile -ErrorAction SilentlyContinue
|
||||||
|
|
||||||
|
$data | Export-Excel $xlfile -WorksheetName WorksheetA
|
||||||
|
$data | Export-Excel $xlfile -WorksheetName WorksheetB
|
||||||
|
|
||||||
|
$excel = Open-ExcelPackage $xlfile
|
||||||
|
|
||||||
|
# Copy a range from WorksheetA to WorksheetB
|
||||||
|
$excel.WorksheetA.Cells["A3:B5"].Copy($excel.WorksheetB.Cells["G3"])
|
||||||
|
|
||||||
|
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(
|
param(
|
||||||
[Parameter(Mandatory=$true)]
|
$moduleName = "ImportExcel",
|
||||||
$moduleName,
|
|
||||||
[ValidateSet('Column','Bar','Line','Pie')]
|
[ValidateSet('Column','Bar','Line','Pie')]
|
||||||
$chartType="Line"
|
$chartType="Line"
|
||||||
)
|
)
|
||||||
|
|
||||||
$galleryUrl = "https://www.powershellgallery.com/packages/$moduleName"
|
$download = Get-HtmlTable "https://www.powershellgallery.com/packages/$moduleName" -FirstDataRow 1 |
|
||||||
$nolegend = '-nolegend'
|
Select-Object @{n="Version";e={$v = $Null ; if ($_.version -is [valuetype]) {[string][version]($_.version.tostring("0.0")) }
|
||||||
if($chartType -eq 'pie') {$nolegend = $null}
|
elseif ($_.version -is [string] -and [version]::TryParse($_.version.trim(),[ref]$v)) {$v}
|
||||||
$code = "$($chartType)Chart (Get-HtmlTable $galleryUrl 0 | sort lastupdated -desc) -title 'Download stats for $moduleName' $nolegend"
|
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
|
||||||
24
Examples/HeaderName/ConvertDictionaryOfArraysToExcel.ps1
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
function ConvertTo-Excel {
|
||||||
|
param(
|
||||||
|
$Path,
|
||||||
|
[System.Collections.IDictionary]$targetData
|
||||||
|
)
|
||||||
|
|
||||||
|
$column = 1
|
||||||
|
foreach ($key in $targetData.Keys) {
|
||||||
|
$cityData[$key] | Export-Excel $xlfile -StartColumn ($column++) -HeaderName $key -AutoSize
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$cityData = [Ordered]@{}
|
||||||
|
|
||||||
|
$cityData.City = "New York City", "Paris", "Barcelona", "Rome"
|
||||||
|
$cityData.Country = "United States", "France", "Spain", "Italy"
|
||||||
|
$cityData.Population = 8600000, 2141000, 5515000, 2873000
|
||||||
|
|
||||||
|
$xlfile = "$PSScriptRoot/test.xlsx"
|
||||||
|
Remove-Item $xlfile -ErrorAction SilentlyContinue
|
||||||
|
|
||||||
|
ConvertTo-Excel $xlfile $cityData
|
||||||
|
|
||||||
|
. $xlfile
|
||||||
24
Examples/HeaderName/HeaderName.ps1
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
try { Import-Module $PSScriptRoot\..\..\ImportExcel.psd1 } catch { throw ; return }
|
||||||
|
|
||||||
|
## This exports only the numbers
|
||||||
|
# 1..10 | Export-excel $PSScriptRoot\test.xlsx -Show
|
||||||
|
|
||||||
|
## This exports the numbers and in A1 the text "MyNum"
|
||||||
|
# 1..10 | Export-excel $PSScriptRoot\test.xlsx -HeaderName MyNum -Show
|
||||||
|
|
||||||
|
$xlfile = "$PSScriptRoot/testMultipleColumns.xlsx"
|
||||||
|
Remove-Item $xlfile -ErrorAction SilentlyContinue
|
||||||
|
|
||||||
|
$Regions = 'West', 'North', 'East ', 'East ', 'West ', 'North', 'South', 'North', 'South'
|
||||||
|
$States = 'Texas', 'Tennessee', 'Florida', 'Maine', 'Virginia', 'Missouri', 'Kansas', 'North Dakota', 'Delaware'
|
||||||
|
$Units = 927, 466, 520, 828, 465, 436, 214, 789, 712
|
||||||
|
$Prices = 923.71, 770.67, 458.68, 661.24, 53.58, 235.67, 992.47, 640.72, 508.55
|
||||||
|
|
||||||
|
# Export each list (array) as a separate column to the same worksheet and workbook
|
||||||
|
$Regions | Export-Excel -Path $xlfile -HeaderName Region -StartColumn 1 -AutoSize
|
||||||
|
$States | Export-Excel -Path $xlfile -HeaderName State -StartColumn 2 -AutoSize
|
||||||
|
$Units | Export-Excel -Path $xlfile -HeaderName Units -StartColumn 3 -AutoSize
|
||||||
|
$Prices | Export-Excel -Path $xlfile -HeaderName Prices -StartColumn 4 -AutoSize
|
||||||
|
|
||||||
|
# Show the results in Excel
|
||||||
|
. $xlfile
|
||||||
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}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
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'
|
RootModule = 'ImportExcel.psm1'
|
||||||
|
|
||||||
# Version number of this module.
|
# Version number of this module.
|
||||||
ModuleVersion = '7.5.2'
|
ModuleVersion = '7.8.2'
|
||||||
|
|
||||||
# ID used to uniquely identify this module
|
# ID used to uniquely identify this module
|
||||||
GUID = '60dd4136-feff-401a-ba27-a84458c57ede'
|
GUID = '60dd4136-feff-401a-ba27-a84458c57ede'
|
||||||
@@ -131,9 +131,8 @@ Check out the How To Videos https://www.youtube.com/watch?v=U3Ne_yX4tYo&list=PL5
|
|||||||
'.\Charting\Charting.ps1',
|
'.\Charting\Charting.ps1',
|
||||||
'.\InferData\InferData.ps1',
|
'.\InferData\InferData.ps1',
|
||||||
'.\Pivot\Pivot.ps1',
|
'.\Pivot\Pivot.ps1',
|
||||||
'.\spikes\ConvertFrom-ExcelColumnName.ps1',
|
'.\Examples',
|
||||||
'.\Examples', '.\images', '.\Testimonials'
|
'.\Testimonials'
|
||||||
|
|
||||||
)
|
)
|
||||||
|
|
||||||
# Private data to pass to the module specified in RootModule/ModuleToProcess
|
# Private data to pass to the module specified in RootModule/ModuleToProcess
|
||||||
|
|||||||
@@ -7,5 +7,5 @@ if (-not $fullPath) {
|
|||||||
$fullPath = Join-Path $fullPath -ChildPath "ImportExcel"
|
$fullPath = Join-Path $fullPath -ChildPath "ImportExcel"
|
||||||
}
|
}
|
||||||
Push-location $PSScriptRoot
|
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
|
Pop-Location
|
||||||
@@ -118,7 +118,7 @@
|
|||||||
Write-Warning -Message "The condition will look for the quotes at the start and end."
|
Write-Warning -Message "The condition will look for the quotes at the start and end."
|
||||||
}
|
}
|
||||||
if ($PSBoundParameters.ContainsKey("ConditionValue" ) -and
|
if ($PSBoundParameters.ContainsKey("ConditionValue" ) -and
|
||||||
$RuleType -match "Top|Botom" ) {$rule.Rank = $ConditionValue }
|
$RuleType -match "Top|Bottom" ) {$rule.Rank = $ConditionValue }
|
||||||
if ($PSBoundParameters.ContainsKey("ConditionValue" ) -and
|
if ($PSBoundParameters.ContainsKey("ConditionValue" ) -and
|
||||||
$RuleType -match "StdDev" ) {$rule.StdDev = $ConditionValue }
|
$RuleType -match "StdDev" ) {$rule.StdDev = $ConditionValue }
|
||||||
if ($PSBoundParameters.ContainsKey("ConditionValue" ) -and
|
if ($PSBoundParameters.ContainsKey("ConditionValue" ) -and
|
||||||
|
|||||||
@@ -18,8 +18,10 @@
|
|||||||
[String]$PivotTotals = "Both",
|
[String]$PivotTotals = "Both",
|
||||||
[Switch]$NoTotalsInPivot,
|
[Switch]$NoTotalsInPivot,
|
||||||
[String]$GroupDateRow,
|
[String]$GroupDateRow,
|
||||||
|
[String]$GroupDateColumn,
|
||||||
[OfficeOpenXml.Table.PivotTable.eDateGroupBy[]]$GroupDatePart,
|
[OfficeOpenXml.Table.PivotTable.eDateGroupBy[]]$GroupDatePart,
|
||||||
[String]$GroupNumericRow,
|
[String]$GroupNumericRow,
|
||||||
|
[String]$GroupNumericColumn,
|
||||||
[double]$GroupNumericMin = 0 ,
|
[double]$GroupNumericMin = 0 ,
|
||||||
[double]$GroupNumericMax = [Double]::MaxValue ,
|
[double]$GroupNumericMax = [Double]::MaxValue ,
|
||||||
[double]$GroupNumericInterval = 100 ,
|
[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."}
|
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)}
|
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")) {
|
if ($GroupDateRow -and $PSBoundParameters.ContainsKey("GroupDatePart")) {
|
||||||
$r = $pivotTable.RowFields.Where( {$_.name -eq $GroupDateRow })
|
$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."}
|
if (-not $r ) {Write-Warning -Message "Could not find a Row field named '$GroupDateRow'; no date grouping will be done."}
|
||||||
else {$r.AddDateGrouping($GroupDatePart)}
|
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': $_"}
|
catch {Write-Warning -Message "Failed adding PivotTable '$pivotTableName': $_"}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,6 +13,7 @@
|
|||||||
[Switch]$Calculate,
|
[Switch]$Calculate,
|
||||||
[Switch]$Show,
|
[Switch]$Show,
|
||||||
[String]$WorksheetName = 'Sheet1',
|
[String]$WorksheetName = 'Sheet1',
|
||||||
|
[String]$HeaderName,
|
||||||
[Alias("PW")]
|
[Alias("PW")]
|
||||||
[String]$Password,
|
[String]$Password,
|
||||||
[switch]$ClearSheet,
|
[switch]$ClearSheet,
|
||||||
@@ -258,6 +259,11 @@
|
|||||||
try {
|
try {
|
||||||
if ($null -eq $InputObject) { $row += 1 }
|
if ($null -eq $InputObject) { $row += 1 }
|
||||||
foreach ($TargetData in $InputObject) {
|
foreach ($TargetData in $InputObject) {
|
||||||
|
|
||||||
|
if ($HeaderName -and $TargetData.psobject.TypeNames[0] -match 'System.String|System.Int32|System.Double|System.Char') {
|
||||||
|
$TargetData = [PSCustomObject]@{ $HeaderName = $TargetData }
|
||||||
|
}
|
||||||
|
|
||||||
if ($firstTimeThru) {
|
if ($firstTimeThru) {
|
||||||
$firstTimeThru = $false
|
$firstTimeThru = $false
|
||||||
$isDataTypeValueType = ($null -eq $TargetData) -or ($TargetData.GetType().name -match 'string|timespan|datetime|bool|byte|char|decimal|double|float|int|long|sbyte|short|uint|ulong|ushort|URI|ExcelHyperLink')
|
$isDataTypeValueType = ($null -eq $TargetData) -or ($TargetData.GetType().name -match 'string|timespan|datetime|bool|byte|char|decimal|double|float|int|long|sbyte|short|uint|ulong|ushort|URI|ExcelHyperLink')
|
||||||
|
|||||||
@@ -9,36 +9,75 @@ function Get-HtmlTable {
|
|||||||
[int]$FirstDataRow=0,
|
[int]$FirstDataRow=0,
|
||||||
[Switch]$UseDefaultCredentials
|
[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
|
$r = Invoke-WebRequest $Url -UseDefaultCredentials: $UseDefaultCredentials
|
||||||
|
$propertyNames = $Header
|
||||||
|
|
||||||
$table = $r.ParsedHtml.getElementsByTagName("table")[$TableIndex]
|
if ($PSVersionTable.PSVersion.Major -le 5) {
|
||||||
$propertyNames=$Header
|
$table = $r.ParsedHtml.getElementsByTagName("table")[$TableIndex]
|
||||||
$totalRows=@($table.rows).count
|
$totalRows=@($table.rows).count
|
||||||
|
|
||||||
for ($idx = $FirstDataRow; $idx -lt $totalRows; $idx++) {
|
for ($idx = $FirstDataRow; $idx -lt $totalRows; $idx++) {
|
||||||
|
|
||||||
$row = $table.rows[$idx]
|
$row = $table.rows[$idx]
|
||||||
$cells = @($row.cells)
|
$cells = @($row.cells)
|
||||||
|
|
||||||
if(!$propertyNames) {
|
if(!$propertyNames) {
|
||||||
if($cells[0].tagName -eq 'th') {
|
if($cells[0].tagName -eq 'th') {
|
||||||
$propertyNames = @($cells | ForEach-Object {$_.innertext -replace ' ',''})
|
$propertyNames = @($cells | ForEach-Object {$_.innertext -replace ' ',''})
|
||||||
} else {
|
} else {
|
||||||
$propertyNames = @(1..($cells.Count + 2) | Foreach-Object { "P$_" })
|
$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]@{}
|
else {
|
||||||
|
$h = ConvertFrom-Html -Content $r.Content
|
||||||
for($counter = 0; $counter -lt $cells.Count; $counter++) {
|
if ($TableIndex -is [valuetype]) { $TableIndex += 1}
|
||||||
$propertyName = $propertyNames[$counter]
|
$rows = $h.SelectNodes("//table[$TableIndex]//tr")
|
||||||
|
if (-not $rows) {Write-Warning "Could not find rows for `"//table[$TableIndex]`" in $Url ."}
|
||||||
if(!$propertyName) { $propertyName= '[missing]'}
|
if ( -not $propertyNames) {
|
||||||
$result.$propertyName= $cells[$counter].InnerText
|
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
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -134,8 +134,16 @@
|
|||||||
|
|
||||||
$xlBook = [Ordered]@{}
|
$xlBook = [Ordered]@{}
|
||||||
foreach ($sheet in $Worksheet) {
|
foreach ($sheet in $Worksheet) {
|
||||||
$EndRow = 0
|
if ($Worksheet.Count -gt 1 -or $Paths.Count -gt 1) {
|
||||||
$EndColumn = 0
|
<#
|
||||||
|
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
|
||||||
|
}
|
||||||
|
|
||||||
$targetSheetname = $sheet.Name
|
$targetSheetname = $sheet.Name
|
||||||
$xlBook["$targetSheetname"] = @()
|
$xlBook["$targetSheetname"] = @()
|
||||||
#region Get rows and columns
|
#region Get rows and columns
|
||||||
|
|||||||
@@ -3,13 +3,13 @@ function Import-Html {
|
|||||||
[CmdletBinding()]
|
[CmdletBinding()]
|
||||||
param(
|
param(
|
||||||
$Url,
|
$Url,
|
||||||
$Index,
|
[int]$Index = 0,
|
||||||
$Header,
|
$Header,
|
||||||
[int]$FirstDataRow=0,
|
[int]$FirstDataRow = 0,
|
||||||
[Switch]$UseDefaultCredentials
|
[Switch]$UseDefaultCredentials
|
||||||
)
|
)
|
||||||
|
|
||||||
$xlFile = [System.IO.Path]::GetTempFileName() -replace "tmp","xlsx"
|
$xlFile = [System.IO.Path]::GetTempFileName() -replace "tmp", "xlsx"
|
||||||
Remove-Item $xlFile -ErrorAction Ignore
|
Remove-Item $xlFile -ErrorAction Ignore
|
||||||
|
|
||||||
Write-Verbose "Exporting to Excel file $($xlFile)"
|
Write-Verbose "Exporting to Excel file $($xlFile)"
|
||||||
|
|||||||
@@ -16,8 +16,10 @@ function New-PivotTableDefinition {
|
|||||||
[String]$PivotTotals = "Both",
|
[String]$PivotTotals = "Both",
|
||||||
[Switch]$NoTotalsInPivot,
|
[Switch]$NoTotalsInPivot,
|
||||||
[String]$GroupDateRow,
|
[String]$GroupDateRow,
|
||||||
|
[String]$GroupDateColumn,
|
||||||
[OfficeOpenXml.Table.PivotTable.eDateGroupBy[]]$GroupDatePart,
|
[OfficeOpenXml.Table.PivotTable.eDateGroupBy[]]$GroupDatePart,
|
||||||
[String]$GroupNumericRow,
|
[String]$GroupNumericRow,
|
||||||
|
[String]$GroupNumericColumn,
|
||||||
[double]$GroupNumericMin = 0 ,
|
[double]$GroupNumericMin = 0 ,
|
||||||
[double]$GroupNumericMax = [Double]::MaxValue ,
|
[double]$GroupNumericMax = [Double]::MaxValue ,
|
||||||
[double]$GroupNumericInterval = 100 ,
|
[double]$GroupNumericInterval = 100 ,
|
||||||
|
|||||||
@@ -110,7 +110,7 @@
|
|||||||
|
|
||||||
#region Apply formatting
|
#region Apply formatting
|
||||||
$params = @{}
|
$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'
|
'WrapText', 'HorizontalAlignment','VerticalAlignment', 'Autosize', 'Width', 'FontColor'
|
||||||
'BorderAround', 'BackgroundColor', 'BackgroundPattern', 'PatternColor')) {
|
'BorderAround', 'BackgroundColor', 'BackgroundPattern', 'PatternColor')) {
|
||||||
if ($PSBoundParameters.ContainsKey($p)) {$params[$p] = $PSBoundParameters[$p]}
|
if ($PSBoundParameters.ContainsKey($p)) {$params[$p] = $PSBoundParameters[$p]}
|
||||||
|
|||||||
1253
README.original.md
Normal file
@@ -1,6 +1,6 @@
|
|||||||
#Requires -Modules Pester
|
#Requires -Modules Pester
|
||||||
[Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseDeclaredVarsMoreThanAssignments','',Justification='False Positives')]
|
[Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseDeclaredVarsMoreThanAssignments', '', Justification = 'False Positives')]
|
||||||
[Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSAvoidAssignmentToAutomaticVariable','',Justification='Only executes on versions without the automatic variable')]
|
[Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSAvoidAssignmentToAutomaticVariable', '', Justification = 'Only executes on versions without the automatic variable')]
|
||||||
param()
|
param()
|
||||||
Describe ExportExcel -Tag "ExportExcel" {
|
Describe ExportExcel -Tag "ExportExcel" {
|
||||||
BeforeAll {
|
BeforeAll {
|
||||||
@@ -8,7 +8,7 @@ Describe ExportExcel -Tag "ExportExcel" {
|
|||||||
$WarningAction = "SilentlyContinue"
|
$WarningAction = "SilentlyContinue"
|
||||||
. "$PSScriptRoot\Samples\Samples.ps1"
|
. "$PSScriptRoot\Samples\Samples.ps1"
|
||||||
if (-not (Get-command Get-Service -ErrorAction SilentlyContinue)) {
|
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) {
|
if (Get-process -Name Excel, xlim -ErrorAction SilentlyContinue) {
|
||||||
It "Excel is open" {
|
It "Excel is open" {
|
||||||
@@ -389,7 +389,7 @@ Describe ExportExcel -Tag "ExportExcel" {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Context "#Example 5 # Adding a single conditional format "{
|
Context "#Example 5 # Adding a single conditional format " {
|
||||||
BeforeEach {
|
BeforeEach {
|
||||||
#Test New-ConditionalText builds correctly
|
#Test New-ConditionalText builds correctly
|
||||||
$ct = New-ConditionalText -ConditionalType GreaterThan 525 -ConditionalTextColor ([System.Drawing.Color]::DarkRed) -BackgroundColor ([System.Drawing.Color]::LightPink)
|
$ct = New-ConditionalText -ConditionalType GreaterThan 525 -ConditionalTextColor ([System.Drawing.Color]::DarkRed) -BackgroundColor ([System.Drawing.Color]::LightPink)
|
||||||
@@ -491,7 +491,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 {
|
BeforeAll {
|
||||||
$path = "TestDrive:\test.xlsx"
|
$path = "TestDrive:\test.xlsx"
|
||||||
#Test -passthru and -worksheetName creating a new, named, sheet in an existing file.
|
#Test -passthru and -worksheetName creating a new, named, sheet in an existing file.
|
||||||
@@ -544,7 +544,7 @@ Describe ExportExcel -Tag "ExportExcel" {
|
|||||||
#Test appending data extends pivot chart (with a warning) .
|
#Test appending data extends pivot chart (with a warning) .
|
||||||
$warnVar = $null
|
$warnVar = $null
|
||||||
Get-Process | Select-Object -Last 20 -Property Name, cpu, pm, handles, company |
|
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
|
$Excel = Open-ExcelPackage $path
|
||||||
$pt = $Excel.Workbook.Worksheets["ProcessesPivotTable"].PivotTables[0]
|
$pt = $Excel.Workbook.Worksheets["ProcessesPivotTable"].PivotTables[0]
|
||||||
|
|
||||||
@@ -557,12 +557,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 {
|
BeforeAll {
|
||||||
$path = "TestDrive:\test.xlsx"
|
$path = "TestDrive:\test.xlsx"
|
||||||
#Test the -CopySource and -Movexxxx parameters for Add-Worksheet
|
#Test the -CopySource and -Movexxxx parameters for Add-Worksheet
|
||||||
$Excel = Get-Process | Select-Object -first 20 -Property Name, cpu, pm, handles, company |
|
$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
|
$Excel = Open-ExcelPackage $path
|
||||||
#At this point Sheets Should be in the order Sheet1, Processes, ProcessesPivotTable
|
#At this point Sheets Should be in the order Sheet1, Processes, ProcessesPivotTable
|
||||||
@@ -1081,4 +1081,55 @@ 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
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -140,4 +140,72 @@ Describe "Creating small named ranges with hyperlinks" {
|
|||||||
$pt.RowFields[1].Grouping.Interval | Should -Be 3
|
$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
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
88
__tests__/HeaderName.tests.ps1
Normal file
@@ -0,0 +1,88 @@
|
|||||||
|
if (-not (Get-command Import-Excel -ErrorAction SilentlyContinue)) {
|
||||||
|
Import-Module $PSScriptRoot\..\ImportExcel.psd1
|
||||||
|
}
|
||||||
|
|
||||||
|
Describe "Test HeaderName parameter" -Tag HeaderName {
|
||||||
|
It "Should add data as usual" {
|
||||||
|
$xlfile = "TestDrive:\headername.xlsx"
|
||||||
|
Remove-Item $xlfile -ErrorAction SilentlyContinue
|
||||||
|
|
||||||
|
1..10 | Export-Excel -Path $xlfile
|
||||||
|
|
||||||
|
{ Test-Path $xlfile } | Should -BeTrue
|
||||||
|
|
||||||
|
$excel = Open-ExcelPackage $xlfile
|
||||||
|
|
||||||
|
1..10 | ForEach-Object {
|
||||||
|
$excel.Sheet1.Cells[$_, 1].Text | Should -BeExactly $_
|
||||||
|
}
|
||||||
|
|
||||||
|
Close-ExcelPackage $excel
|
||||||
|
|
||||||
|
Remove-Item $xlfile -ErrorAction SilentlyContinue
|
||||||
|
}
|
||||||
|
|
||||||
|
It "Should add data and the first cell should have the header name" {
|
||||||
|
$xlfile = "TestDrive:\headername.xlsx"
|
||||||
|
Remove-Item $xlfile -ErrorAction SilentlyContinue
|
||||||
|
|
||||||
|
1..10 | Export-Excel -Path $xlfile -HeaderName MyNum
|
||||||
|
|
||||||
|
{ Test-Path $xlfile } | Should -BeTrue
|
||||||
|
|
||||||
|
$excel = Open-ExcelPackage $xlfile
|
||||||
|
|
||||||
|
$excel.Sheet1.Cells[1, 1].Text | Should -BeExactly "MyNum"
|
||||||
|
|
||||||
|
1..10 | ForEach-Object {
|
||||||
|
$excel.Sheet1.Cells[($_ + 1), 1].Text | Should -BeExactly $_
|
||||||
|
}
|
||||||
|
|
||||||
|
Close-ExcelPackage $excel
|
||||||
|
|
||||||
|
Remove-Item $xlfile -ErrorAction SilentlyContinue
|
||||||
|
}
|
||||||
|
|
||||||
|
It "Should ignore the header name" {
|
||||||
|
$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 = "TestDrive:\headername.xlsx"
|
||||||
|
Remove-Item $xlfile -ErrorAction SilentlyContinue
|
||||||
|
|
||||||
|
$data | Export-Excel -Path $xlfile -HeaderName MyNum
|
||||||
|
|
||||||
|
{ Test-Path $xlfile } | Should -BeTrue
|
||||||
|
|
||||||
|
$excel = Open-ExcelPackage $xlfile
|
||||||
|
|
||||||
|
$excel.Sheet1.Cells[1, 1].Text | Should -BeExactly "Region"
|
||||||
|
$excel.Sheet1.Cells[1, 2].Text | Should -BeExactly "State"
|
||||||
|
$excel.Sheet1.Cells[1, 3].Text | Should -BeExactly "Units"
|
||||||
|
$excel.Sheet1.Cells[1, 4].Text | Should -BeExactly "Price"
|
||||||
|
|
||||||
|
$excel.Sheet1.Cells[2, 1].Text | Should -BeExactly "West"
|
||||||
|
$excel.Sheet1.Cells[2, 2].Text | Should -BeExactly "Texas"
|
||||||
|
$excel.Sheet1.Cells[2, 3].Text | Should -Be 927
|
||||||
|
$excel.Sheet1.Cells[2, 4].Text | Should -Be 923.71
|
||||||
|
|
||||||
|
$excel.Sheet1.Cells[10, 1].Text | Should -BeExactly "South"
|
||||||
|
$excel.Sheet1.Cells[10, 2].Text | Should -BeExactly "Delaware"
|
||||||
|
$excel.Sheet1.Cells[10, 3].Text | Should -Be 712
|
||||||
|
$excel.Sheet1.Cells[10, 4].Text | Should -Be 508.55
|
||||||
|
|
||||||
|
Close-ExcelPackage $excel
|
||||||
|
|
||||||
|
Remove-Item $xlfile -ErrorAction SilentlyContinue
|
||||||
|
}
|
||||||
|
}
|
||||||
BIN
__tests__/ImportExcelTests/DataInDiffRowCol.xlsx
Normal file
BIN
__tests__/ImportExcelTests/DataInDiffRowColMultipleSheets.xlsx
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
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'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -3,7 +3,7 @@ Param()
|
|||||||
|
|
||||||
Import-Module $PSScriptRoot\..\..\ImportExcel.psd1 -Force
|
Import-Module $PSScriptRoot\..\..\ImportExcel.psd1 -Force
|
||||||
|
|
||||||
Describe "Test reading multiple XLSX files of differernt row count" -Tag ReadMultipleXLSX {
|
Describe "Test reading multiple XLSX files of different row count" -Tag ReadMultipleXLSX {
|
||||||
It "Should find these xlsx files" {
|
It "Should find these xlsx files" {
|
||||||
Test-Path -Path $PSScriptRoot\rows05.xlsx | Should -BeTrue
|
Test-Path -Path $PSScriptRoot\rows05.xlsx | Should -BeTrue
|
||||||
Test-Path -Path $PSScriptRoot\rows10.xlsx | Should -BeTrue
|
Test-Path -Path $PSScriptRoot\rows10.xlsx | Should -BeTrue
|
||||||
|
|||||||
52
changelog.md
@@ -1,3 +1,55 @@
|
|||||||
|
# 7.8.2
|
||||||
|
|
||||||
|
- Added `HeaderName` parameter to `Export-Excel`. Allows you to output an object with a property name. Otherwise the data is just the array of values.
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
1..10 | Export-Excel -Path .\test.xlsx -HeaderName MyNum
|
||||||
|
```
|
||||||
|
|
||||||
|
- Added example `CopyFromOneSheetInSameWorkbook`. Shows how to copy a range of data from WorksheetA to WorksheetB
|
||||||
|
- Added example `HeaderName`. Shows how to use the new `-HeaderName` parameter
|
||||||
|
- Added example `HeaderName`. Shows how to use the new `-HeaderName` parameter
|
||||||
|
- Added example `ConvertDictionaryOfArraysToExcel` example. Takes a dictionary of arrays and converts it Rows and Columns of data in Excel.
|
||||||
|
|
||||||
|
# 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
|
# v7.5.2
|
||||||
- Changed the switch `-NotAsDictionary` to `-Raw`. Works with `-Worksheetname *` reads all the sheets in the xlsx file and returns an array.
|
- Changed the switch `-NotAsDictionary` to `-Raw`. Works with `-Worksheetname *` reads all the sheets in the xlsx file and returns an array.
|
||||||
|
|
||||||
|
|||||||
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 |
@@ -331,6 +331,22 @@ Accept pipeline input: False
|
|||||||
Accept wildcard characters: 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
|
### -GroupDatePart
|
||||||
|
|
||||||
The Part\(s\) of the date to use in the grouping \(ignored if GroupDateRow is not specified\)
|
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
|
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
|
### -GroupNumericMin
|
||||||
|
|
||||||
The starting point for grouping
|
The starting point for grouping
|
||||||
|
|||||||
@@ -225,6 +225,22 @@ Accept pipeline input: False
|
|||||||
Accept wildcard characters: 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
|
### -GroupDatePart
|
||||||
|
|
||||||
The Part\(s\) of the date to use in the grouping \(ignored if GroupDateRow is not specified\)
|
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)
|
Parameter Sets: (All)
|
||||||
Aliases:
|
Aliases:
|
||||||
Accepted values: Years, Quarters, Months, Days, Hours, Minutes, Seconds
|
Accepted values: Years, Quarters, Months, Days, Hours, Minutes, Seconds
|
||||||
|
|
||||||
Required: False
|
Required: False
|
||||||
Position: Named
|
Position: Named
|
||||||
Default value: None
|
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
|
Type: String
|
||||||
Parameter Sets: (All)
|
Parameter Sets: (All)
|
||||||
Aliases:
|
Aliases:
|
||||||
|
|
||||||
Required: False
|
Required: False
|
||||||
Position: Named
|
Position: Named
|
||||||
Default value: None
|
Default value: None
|
||||||
@@ -258,6 +272,23 @@ Accept pipeline input: False
|
|||||||
Accept wildcard characters: 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
|
### -GroupNumericMin
|
||||||
|
|
||||||
The starting point for grouping
|
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
|
### EXAMPLE 2
|
||||||
|
|
||||||
```text
|
```text
|
||||||
PS\> $excela= Open-ExcelPackage -path "$xlPath" -Password $password
|
PS\> $excel= Open-ExcelPackage -path "$xlPath" -Password $password
|
||||||
PS\> $sheet1 = $excel.Workbook.Worksheetsa"sheet1" ]
|
PS\> $sheet1 = $excel.Workbook.Worksheets["sheet1"]
|
||||||
PS\> Set-ExcelRange -Range $sheet1.Cells ["E1:S1048576" ], $sheet1.Cells ["V1:V1048576" ] -NFormat ( [cultureinfo ]::CurrentCulture.DateTimeFormat.ShortDatePattern)
|
PS\> Set-ExcelRange -Range $sheet1.Cells ["E1:S1048576" ], $sheet1.Cells ["V1:V1048576" ] -NFormat ( [cultureinfo ]::CurrentCulture.DateTimeFormat.ShortDatePattern)
|
||||||
PS\> Close-ExcelPackage $excel -Show
|
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
|
## PARAMETERS
|
||||||
|
|
||||||
|
|||||||