Compare commits

...

116 Commits

Author SHA1 Message Date
Doug Finke
15679a0d82 Merge pull request #1341 from dfinke/DoNotShowValues-for-Conditional
Add -ShowOnlyIcon to New-ConditionalFormattingIconSet. Base on https:…
2022-12-11 10:17:36 -05:00
dfinke
3c23a064bc Add -ShowOnlyIcon to New-ConditionalFormattingIconSet. Base on https://github.com/dfinke/ImportExcel/discussions/1340 2022-12-10 18:22:36 -05:00
Doug Finke
c848497f53 Merge pull request #1305 from thkn-hofa/master
TotalSettings improvements
2022-11-19 08:09:35 -05:00
dfinke
ba374ec558 tweak test 2022-11-19 08:03:37 -05:00
Doug Finke
3f772ce726 Merge pull request #1285 from steve-daedilus/master
#1281 Grammar error update
2022-11-19 07:47:58 -05:00
Thomas Hofkens
3ea6fde928 changelog update + Pester test fix for powershell 5.1 2022-11-14 17:54:15 +01:00
Thomas Hofkens
81ece62494 Fix Pester errors for countries with ',' as decimal separator 2022-11-14 17:33:21 +01:00
Thomas Hofkens
828b2caf9f Implement Set Column by range in Add-ExcelTable + simplify adding table from Export-Excel 2022-11-14 17:32:39 +01:00
Thomas Hofkens
f760b63818 Update Set-CellComment to use 'Range' parameter + Create tests file 2022-11-14 17:31:36 +01:00
Thomas Hofkens
fe016f732d Bugfix example script 2022-11-12 00:52:15 +01:00
Thomas Hofkens
c719cc3d32 Doc update 2022-11-12 00:42:36 +01:00
Thomas Hofkens
5558f48732 Changelog update: TableTotalSettings in stead of TotalSettings 2022-11-12 00:42:24 +01:00
Thomas Hofkens
4dfd211bb6 Newlines after ```text because of help build failures 2022-11-12 00:41:57 +01:00
Thomas Hofkens
90bc047267 Updated Documentation 2022-11-12 00:26:49 +01:00
Thomas Hofkens
4c0e7970cf Updated Examples 2022-11-12 00:26:40 +01:00
Thomas Hofkens
b191f16e3e Updated Tests 2022-11-12 00:26:19 +01:00
Thomas Hofkens
ce49038b75 Changed TotalSettings to TableTotalSettings + Changed the way custom formulas are added + added possibility to add comments tot totals row 2022-11-12 00:25:56 +01:00
Thomas Hofkens
652a611137 Added new function 'Set-CellComment' 2022-11-12 00:24:17 +01:00
Doug Finke
3b73ce24ae Merge pull request #1300 from thkn-hofa/master
Add TotalSettings parameter to Export-Excel
2022-11-11 10:01:17 -05:00
dfinke
5e8afa48fc Add a Sales Data example, known data and diff criteria in the COUNTIF 2022-11-11 09:38:56 -05:00
Thomas Hofkens
f494635b48 Added custom formula for totals row + Example File 2022-11-09 11:35:19 +01:00
Thomas Hofkens
dcb67b4518 Merged Export-Excel-TotalSettings.Tests.ps1 with Export-Excel.Tests.ps1 2022-11-08 16:31:02 +01:00
Thomas Hofkens
06c00cb0b2 Expanded Unit Tests 2022-11-06 12:07:05 +01:00
Thomas Hofkens
d987437ad6 Unit Tests 2022-11-06 11:52:34 +01:00
Thomas Hofkens
fe27ff81c8 bump version, update changelog 2022-11-04 15:26:23 +01:00
Thomas Hofkens
9f4307f6c0 Add TotalSettings parameter to Export-Excel 2022-11-04 15:05:28 +01:00
Stephen Brown
a1fccf914f Merge remote-tracking branch 'upstream/master' 2022-10-22 00:44:36 +01:00
Doug Finke
0b4c2b81db Merge pull request #1283 from stahler/patch-5
Update add-excelchart.md
2022-10-21 10:48:13 -04:00
Stephen Brown
8ee34217a4 #1281 Grammar error update 2022-10-21 13:53:13 +01:00
Wes Stahler
c01601910d Update add-excelchart.md
Correct minor spelling
2022-10-20 21:11:27 -04:00
dfinke
63f6543784 update 2022-10-20 20:35:50 -04:00
Doug Finke
306e10c348 Merge pull request #1273 from steve-daedilus/master
Set Validate Range for rows to max rows available
2022-10-20 20:23:05 -04:00
dfinke
970febd6d3 The orignal test took too long to run 2022-10-20 20:13:27 -04:00
Stephen Brown
e703a21dec Pester test setup for Max Rows retrieval 2022-10-20 18:06:08 +01:00
Stephen Brown
c1be6a8d82 Merge branch 'dfinke:master' into master 2022-10-18 09:51:53 +01:00
dfinke
201b9cd984 Add Sheet visibility property 2022-10-15 19:34:58 -04:00
dfinke
559bfa2a7f bump version update log 2022-10-15 19:34:24 -04:00
Stephen Brown
4bd3efa1ef Set Validate Range for rows to max rows available
$StartRow parameter had ValidateRange(1,9999) which was limiting the start row to a maximum of 9999. There's no good reason this cannot be any row in the spreadsheet, of which the maximum is 1048576 in modern instances of Excel.
2022-10-14 19:00:42 +01:00
Doug Finke
926042e5b6 Merge pull request #1266 from stahler/patch-4
Update Export-Excel.ps1
2022-10-11 16:25:24 -04:00
Wes Stahler
be1e55cf8d Update Export-Excel.ps1
Fixed case on -BarChart switch.
2022-10-11 16:18:16 -04:00
Doug Finke
a86c55b3ac update 2022-09-24 13:08:43 -04:00
Doug Finke
fa14695fb9 Merge pull request #1254 from WilsonStewart/master
Fixed typo of 'pararameter' to 'parameter'
2022-09-24 13:07:32 -04:00
WilsonStewart
6322bafaed Fixed typo of 'pararameter' to 'parameter' 2022-09-21 16:25:40 -06:00
Doug Finke
c7a6f4ba35 update changelog 2022-09-20 10:36:49 -04:00
Doug Finke
49a6805727 Merge pull request #1253 from stahler/patch-3
Update convertfrom-exceltosqlinsert.md
2022-09-20 10:21:03 -04:00
Wes Stahler
c124ee199d Update convertfrom-exceltosqlinsert.md
fix spelling
2022-09-19 20:46:43 -04:00
Doug Finke
858cf60a2f Merge pull request #1251 from JeremiahTheFirst/master
Update Add-Worksheet.ps1 - 'worsheet' to 'worksheet' in warnings
2022-09-16 16:01:12 -04:00
Jeremiah Adams
fcde64780e Update Add-Worksheet.ps1 - 'worsheet' to 'worksheet' in warnings 2022-09-15 09:04:08 -05:00
dfinke
be5d270f44 update change log 2022-09-03 16:51:59 -04:00
Doug Finke
f9fb49ad04 Merge pull request #1234 from stahler/patch-2
Update open-excelpackage.md
2022-08-25 13:51:21 -04:00
Wes Stahler
4727bb3b2b Update open-excelpackage.md
Small changes to Example 2
2022-08-24 21:34:46 -04:00
dfinke
ac435fc1e1 bump version 2022-08-24 18:37:24 -04:00
dfinke
340ffc560b Use EZOut to format data form Excel to Mardown tables and Yaml 2022-08-24 18:37:14 -04:00
Doug Finke
069c227391 Merge pull request #1233 from g-pearl/master
Update Bottom Spelling Error
2022-08-24 18:21:38 -04:00
g-pearl
fa4f3a23cd Update Bottom Spelling Error 2022-08-24 08:54:36 -06:00
Doug Finke
f54db0e2d9 Merge pull request #1220 from dfinke/Add-Group-Column-Tests
Added Group Column tests
2022-07-20 07:15:46 -04:00
dfinke
8c1388a799 Added Group Column tests 2022-07-17 11:24:51 -04:00
dfinke
7c473d1fb6 bump version 2022-07-16 13:45:40 -04:00
dfinke
31366057df Add images for changelog 2022-07-16 13:45:34 -04:00
Doug Finke
f102ece700 Merge pull request #1219 from jhoneill/PivotTableUpdates
Pivot table updates
2022-07-16 13:25:17 -04:00
dfinke
950b9ab078 update with examples that were added 2022-07-16 12:19:23 -04:00
Doug Finke
869ab59a8a tweak README 2022-07-16 11:47:33 -04:00
Doug Finke
1e9a73d176 Merge pull request #1214 from dbrennand/feat/vba-pivotable-tabular-repeat-label-no-subtotals
Feat/VBA-PivotTable-Tabular-Repeat-Label-No-Subtotals
2022-07-16 11:30:19 -04:00
James O'Neill
37e6896741 Merge branch 'dfinke:master' into PivotTableUpdates 2022-07-14 20:27:59 +01:00
Doug Finke
c39e6cc24c Merge pull request #1216 from chadmando/fixtypo
Fix typo in help
2022-07-14 14:15:16 -04:00
James O'Neill
5ab9d6f23f Add column to GroupNumeric/Date in PivotTables. 2022-07-14 17:43:55 +01:00
chadmando
81e60be51d Fix typo in help
Open-ExcelPackage Example #2 Line#48
remove 'and'
2022-07-13 15:36:17 -05:00
dfinke
943ca7e6d1 Added -Show 2022-07-13 14:13:22 -04:00
Doug Finke
513ff59ba8 Merge pull request #1208 from kkazala/kkazala/exportformatting
Kkazala/exportformatting
2022-07-13 12:09:55 -04:00
dbrennand
45fc5a2631 fix: add missing -Path parameter 2022-07-13 16:59:18 +01:00
dbrennand
8b30fce81a feat: add VBA example to modify PivotTables
Excel macro example for changing all PivotTables in the workbook to Tabular form, repeats labels and disables Subtotals.
2022-07-13 16:57:22 +01:00
dfinke
0990c0ef09 used $PSScriptRoot instead 2022-07-13 09:50:02 -04:00
Kinga Kazala
724ed6b197 Get-ConditionalFormatting function added 2022-07-13 09:34:30 +02:00
Kinga Kazala
087feedde6 fix: corrected the script to include sheet name, and to add '=' in the ConditionValue 2022-07-13 09:26:19 +02:00
Kinga Kazala
b92ea56fe9 GetConditionalFormatting.xlsx added 2022-07-11 07:58:29 +02:00
Kinga Kazala
c4eed8c25d GetConditionalFormatting.ps1 example added: exports conditional formatting rules in a 'ready to use' format 2022-07-05 16:05:40 +02:00
Kinga Kazala
9051ffc0e5 example update: format both cells, plus format whole row 2022-07-05 15:59:32 +02:00
Doug Finke
050613eede Merge pull request #1206 from dfinke/Investigate-underlinetype-not-being-set
Fix -UnderLineType parameter is ignored in Set-ExcelColumn #1204
2022-07-04 10:47:10 -04:00
Doug Finke
84f51c4823 Merge branch 'master' into Investigate-underlinetype-not-being-set 2022-07-04 10:41:02 -04:00
dfinke
f2544ed1ec Fix -UnderLineType parameter is ignored in Set-ExcelColumn #1204 2022-07-04 10:29:39 -04:00
James O'Neill
5b4857d7a0 New subtotals, tweak module stats example 2022-06-21 16:58:42 +02:00
Doug Finke
45449650c7 Merge pull request #1202 from kkazala/compareCells
Compare cells
2022-06-20 13:07:58 -04:00
Doug Finke
d7348250fc Updated 2022-06-20 13:00:33 -04:00
Kinga Kazala
b53881fd02 Merge branch 'compareCells' of https://github.com/kkazala/ImportExcel into compareCells 2022-06-20 17:20:17 +02:00
Kinga Kazala
632bb263cc docs: Highlight-DiffCells.ps1 example added 2022-06-20 17:19:01 +02:00
Kinga Kazala
658a6b543a docs: Highlight-DiffCells.ps1 example added 2022-06-20 17:12:48 +02:00
Doug Finke
0f301ff619 fix formatting 2022-06-17 12:20:32 -04:00
Doug Finke
115fbb23a7 Merge pull request #1200 from jhoneill/master
Update to Get-HTMLTable, added Import-ByColuumns function and example
2022-06-17 12:04:06 -04:00
dfinke
2b30537c20 update change log 2022-06-17 11:56:47 -04:00
dfinke
22f50d2659 fix spelling 2022-06-17 11:50:02 -04:00
dfinke
f0a2d076e3 Update Import-Html with better defaults 2022-06-17 11:38:19 -04:00
dfinke
835a11bbb3 Update HTML example 2022-06-17 11:37:54 -04:00
James O'Neill
701b8e2062 Fix Get-HTMLTable for .NET core 2022-06-17 09:42:36 +01:00
James O'Neill
6f2bfaff4e Merge branch 'dfinke:master' into master 2022-06-16 14:19:30 +01:00
Doug Finke
ba6cee12d9 Merge pull request #1198 from dfinke/Set-up-GHA-CI/CD
Set up gha ci/cd
2022-06-12 15:28:04 -04:00
Doug Finke
5d36945708 remove fail tests 2022-06-12 15:18:56 -04:00
Doug Finke
6cbf4efd1d try mac 2022-06-12 15:14:27 -04:00
Doug Finke
4feaee46d2 fail tests on windows 2022-06-12 15:11:36 -04:00
Doug Finke
89f90b77fb try failing tests 2022-06-12 15:06:53 -04:00
Doug Finke
98256c61e8 include test for Invoke-ExcelQuery 2022-06-12 14:48:37 -04:00
Doug Finke
ebde9269aa just windows 2022-06-12 14:44:17 -04:00
Doug Finke
e3149b7b40 install ace 2022-06-12 14:42:41 -04:00
Doug Finke
64ff97b486 fix yml 2022-06-12 14:30:16 -04:00
Doug Finke
12f1f23d51 chk platform 2022-06-12 14:19:49 -04:00
Doug Finke
e279cd785e sudo 2022-06-12 13:59:37 -04:00
Doug Finke
04b5a9a096 install dependencies for autosize 2022-06-12 13:57:27 -04:00
Doug Finke
c6a06cc325 see what fails 2022-06-12 13:55:10 -04:00
Doug Finke
a4bed31e1e list pester version 2022-06-12 13:52:12 -04:00
dfinke
c385ca9012 add branches 2022-06-12 13:46:54 -04:00
Doug Finke
2a8cbbba7c Merge pull request #1197 from dfinke/fix-1194-EndRow-and-EndColumn-Parameters-Ignored
Fix 1194 end row and end column parameters ignored
2022-06-12 11:43:33 -04:00
dfinke
b789db9ba3 bump version 2022-06-12 11:32:12 -04:00
dfinke
89a4cfde0d fix test 2022-06-12 10:49:05 -04:00
dfinke
ab56ae4409 Add additional tests 2022-06-12 10:42:16 -04:00
dfinke
ef35c4fca8 Fix for EndRow and EndColumn Parameters Ignored in Import-Excel #1194 2022-06-12 09:53:52 -04:00
James O'Neill
9fad33c7a6 Merge branch 'master' of https://github.com/dfinke/ImportExcel 2022-06-07 22:14:27 +01:00
jhoneill
f348088b62 Improved Import By Columns example 2021-08-13 12:13:42 +01:00
64 changed files with 5040 additions and 4820 deletions

27
.github/workflows/ci.yml vendored Normal file
View 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
View 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()
}
}
}
}

View File

@@ -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

View 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

View 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

View File

@@ -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')

View 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

View 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

View 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"
1 OrderId Category Sales Quantity Discount
2 1 Cosmetics 744.01 7 0.7
3 2 Grocery 349.13 25 0.3
4 3 Apparels 535.11 88 0.2
5 4 Electronics 524.69 60 0.1
6 5 Electronics 439.1 41 0
7 6 Apparels 56.84 54 0.8
8 7 Electronics 326.66 97 0.7
9 8 Cosmetics 17.25 74 0.6
10 9 Grocery 199.96 39 0.4
11 10 Grocery 731.77 20 0.3

Binary file not shown.

View 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

View 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

Binary file not shown.

Binary file not shown.

View 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}
}
}
}

View 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

View 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

View 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

View File

@@ -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
}
}
}

View File

@@ -6,7 +6,7 @@
RootModule = 'ImportExcel.psm1'
# Version number of this module.
ModuleVersion = '7.5.3'
ModuleVersion = '7.8.4'
# ID used to uniquely identify this module
GUID = '60dd4136-feff-401a-ba27-a84458c57ede'
@@ -88,6 +88,7 @@ Check out the How To Videos https://www.youtube.com/watch?v=U3Ne_yX4tYo&list=PL5
'Remove-Worksheet',
'Select-Worksheet',
'Send-SQLDataToExcel',
'Set-CellComment',
'Set-CellStyle',
'Set-ExcelColumn',
'Set-ExcelRange',

View File

@@ -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

View File

@@ -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}

View File

@@ -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': $_"}
}

View File

@@ -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 }

View File

@@ -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 ,
@@ -211,7 +212,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 {
@@ -424,7 +425,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) {
@@ -636,9 +637,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)"
}

View File

@@ -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

View File

@@ -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
}
}

View File

@@ -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 ,
@@ -134,8 +134,16 @@
$xlBook = [Ordered]@{}
foreach ($sheet in $Worksheet) {
$EndRow = 0
$EndColumn = 0
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
}
$targetSheetname = $sheet.Name
$xlBook["$targetSheetname"] = @()
#region Get rows and columns

View File

@@ -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)"

View File

@@ -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()

View File

@@ -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 ,

View 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() }
}
}
}

View File

@@ -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]}

View File

@@ -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()

View File

@@ -14,8 +14,8 @@
Automate Excel with PowerShell without having Excel installed. Works on Windows, Linux and MAC. Creating Tables, Pivot Tables, Charts and much more just got a lot easier.
## Examples
Check out [more than 100 examples](Examples/) on ways to make you more productive.
## Examples
Check out the [more than 100 examples](Examples/) on ways to create amazing reports as well as make you more productive with PowerShell and Excel.
# Basic Usage
## Installation

View File

@@ -65,6 +65,11 @@ Plus, wiring the [PowerShell ScriptAnalyzer Excel report](https://github.com/dfi
![](.gitbook/assets/ScriptAnalyzerReport.png)
## What's new for 7.1.4
- Added GroupNumericColumn and GroupDateColumn to New-PivotTableDefinition and Add-PivotTable.
## What's new 7.1.3
- Changed to `ProviderPath`. Thanks [Trevor Walker](https://github.com/sporkabob)

View 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" {
@@ -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 {
#Test New-ConditionalText builds correctly
$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 {
$path = "TestDrive:\test.xlsx"
#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) .
$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 +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 {
$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 +683,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.
@@ -1081,4 +1147,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
}
}
}

View File

@@ -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
}
}
}

View File

@@ -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
}
}
}

Binary file not shown.

View 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
}
}
}

Binary file not shown.

View File

@@ -3,7 +3,7 @@ Param()
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" {
Test-Path -Path $PSScriptRoot\rows05.xlsx | Should -BeTrue
Test-Path -Path $PSScriptRoot\rows10.xlsx | Should -BeTrue

Binary file not shown.

View 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
}
}

View File

@@ -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) {

View 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"
}
}

View File

@@ -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'

View File

@@ -1,3 +1,62 @@
# 7.8.3
- 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|
|:---:|:---:|
|![](images/GroupNumericColumn.png)|![](images/GroupDateColumn.png)|
# 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.

File diff suppressed because it is too large Load Diff

BIN
images/GroupDateColumn.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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[]

View File

@@ -16,13 +16,13 @@ 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[]>] [-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[]>]
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[]>] [-ConditionalFormat <Object[]>] [-ConditionalText <Object[]>] [-Style <Object[]>] [-CellStyleSB <ScriptBlock>] [-Activate] [-ReturnRange] [-PivotTotals <String>] [-NoTotalsInPivot] [-ReZip] [<CommonParameters>]
```
@@ -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.

View File

@@ -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 |
----------------------------------------------------------

View File

@@ -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

View File

@@ -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