mirror of
https://github.com/dfinke/ImportExcel.git
synced 2025-12-06 00:23:20 +00:00
Linted with the updated PSScriptAnalyzer.
This commit is contained in:
@@ -185,7 +185,7 @@
|
|||||||
$Address = "$($Address.Row):$($Address.Row)"
|
$Address = "$($Address.Row):$($Address.Row)"
|
||||||
}
|
}
|
||||||
elseif ($Address -is [OfficeOpenXml.ExcelColumn]) {
|
elseif ($Address -is [OfficeOpenXml.ExcelColumn]) {
|
||||||
$Address = [OfficeOpenXml.ExcelAddress]::new(1,$address.ColumnMin,1,$address.ColumnMax).Address -replace '1',''
|
$Address = (New-Object 'OfficeOpenXml.ExcelAddress' @(1, $address.ColumnMin, 1, $address.ColumnMax).Address) -replace '1',''
|
||||||
if ($Address -notmatch ':') {$Address = "$Address`:$Address"}
|
if ($Address -notmatch ':') {$Address = "$Address`:$Address"}
|
||||||
}
|
}
|
||||||
if ( $Address -is [string] -and $Address -match "!") {$Address = $Address -replace '^.*!',''}
|
if ( $Address -is [string] -and $Address -match "!") {$Address = $Address -replace '^.*!',''}
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ $PSVersionTable.PSVersion
|
|||||||
|
|
||||||
## Create the zip before the tests run
|
## Create the zip before the tests run
|
||||||
## Otherwise the EPPlus.dll is in use after the Pester run
|
## Otherwise the EPPlus.dll is in use after the Pester run
|
||||||
$ModuleVersion = (Get-Content -Raw .\ImportExcel.psd1) | Invoke-Expression | ForEach-Object ModuleVersion
|
$ModuleVersion = (Invoke-Command -ScriptBlock ([scriptblock]::Create((Get-Content -Raw .\ImportExcel.psd1)))).moduleVersion
|
||||||
|
|
||||||
if (!$DontCreateZip) {
|
if (!$DontCreateZip) {
|
||||||
$dest = "ImportExcel-{0}-{1}.zip" -f $ModuleVersion, (Get-Date).ToString("yyyyMMddHHmmss")
|
$dest = "ImportExcel-{0}-{1}.zip" -f $ModuleVersion, (Get-Date).ToString("yyyyMMddHHmmss")
|
||||||
|
|||||||
104
Export-Excel.ps1
104
Export-Excel.ps1
@@ -84,9 +84,9 @@
|
|||||||
.PARAMETER RangeName
|
.PARAMETER RangeName
|
||||||
Makes the data in the worksheet a named range.
|
Makes the data in the worksheet a named range.
|
||||||
.PARAMETER TableName
|
.PARAMETER TableName
|
||||||
Makes the data in the worksheet a table with a name, and applies a style to it. Name must not contain spaces.
|
Makes the data in the worksheet a table with a name, and applies a style to it. The name must not contain spaces. If a style is specified without a name, table1, table2 etc. will be used.
|
||||||
.PARAMETER TableStyle
|
.PARAMETER TableStyle
|
||||||
Selects the style for the named table - defaults to 'Medium6'.
|
Selects the style for the named table - if a name is specified without a style, 'Medium6' is used as a default.
|
||||||
.PARAMETER BarChart
|
.PARAMETER BarChart
|
||||||
Creates a "quick" bar chart using the first text column as labels and the first numeric column as values
|
Creates a "quick" bar chart using the first text column as labels and the first numeric column as values
|
||||||
.PARAMETER ColumnChart
|
.PARAMETER ColumnChart
|
||||||
@@ -418,15 +418,15 @@
|
|||||||
.LINK
|
.LINK
|
||||||
https://github.com/dfinke/ImportExcel
|
https://github.com/dfinke/ImportExcel
|
||||||
#>
|
#>
|
||||||
[CmdletBinding(DefaultParameterSetName = 'Default')]
|
[CmdletBinding(DefaultParameterSetName = 'Now')]
|
||||||
[OutputType([OfficeOpenXml.ExcelPackage])]
|
[OutputType([OfficeOpenXml.ExcelPackage])]
|
||||||
[Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSAvoidUsingPlainTextForPassword", "")]
|
[Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSAvoidUsingPlainTextForPassword", "")]
|
||||||
Param(
|
Param(
|
||||||
[Parameter(ParameterSetName = "Default", Position = 0)]
|
|
||||||
[Parameter(ParameterSetName = "Table" , Position = 0)]
|
[Parameter(Mandatory = $true, ParameterSetName = "Path", Position = 0)]
|
||||||
[String]$Path,
|
[String]$Path,
|
||||||
[Parameter(Mandatory = $true, ParameterSetName = "PackageDefault")]
|
[Parameter(Mandatory = $true, ParameterSetName = "Package")]
|
||||||
[Parameter(Mandatory = $true, ParameterSetName = "PackageTable")]
|
|
||||||
[OfficeOpenXml.ExcelPackage]$ExcelPackage,
|
[OfficeOpenXml.ExcelPackage]$ExcelPackage,
|
||||||
[Parameter(ValueFromPipeline = $true)]
|
[Parameter(ValueFromPipeline = $true)]
|
||||||
[Alias('TargetData')]
|
[Alias('TargetData')]
|
||||||
@@ -462,8 +462,8 @@
|
|||||||
[Switch]$FreezeFirstColumn,
|
[Switch]$FreezeFirstColumn,
|
||||||
[Switch]$FreezeTopRowFirstColumn,
|
[Switch]$FreezeTopRowFirstColumn,
|
||||||
[Int[]]$FreezePane,
|
[Int[]]$FreezePane,
|
||||||
[Parameter(ParameterSetName = 'Default')]
|
|
||||||
[Parameter(ParameterSetName = 'PackageDefault')]
|
|
||||||
[Switch]$AutoFilter,
|
[Switch]$AutoFilter,
|
||||||
[Switch]$BoldTopRow,
|
[Switch]$BoldTopRow,
|
||||||
[Switch]$NoHeader,
|
[Switch]$NoHeader,
|
||||||
@@ -478,11 +478,11 @@
|
|||||||
elseif ($_[0] -notmatch '[a-z]') { throw 'Tablename starts with an invalid character.' }
|
elseif ($_[0] -notmatch '[a-z]') { throw 'Tablename starts with an invalid character.' }
|
||||||
else { $true }
|
else { $true }
|
||||||
})]
|
})]
|
||||||
[Parameter(ParameterSetName = 'Table' , Mandatory = $true, ValueFromPipelineByPropertyName)]
|
|
||||||
[Parameter(ParameterSetName = 'PackageTable' , Mandatory = $true, ValueFromPipelineByPropertyName)]
|
|
||||||
[String]$TableName,
|
[String]$TableName,
|
||||||
[Parameter(ParameterSetName = 'Table')]
|
|
||||||
[Parameter(ParameterSetName = 'PackageTable')]
|
|
||||||
[OfficeOpenXml.Table.TableStyles]$TableStyle,
|
[OfficeOpenXml.Table.TableStyles]$TableStyle,
|
||||||
[Switch]$Barchart,
|
[Switch]$Barchart,
|
||||||
[Switch]$PieChart,
|
[Switch]$PieChart,
|
||||||
@@ -793,9 +793,12 @@
|
|||||||
Add-ExcelName -RangeName $targetRangeName -Range $ws.Cells[$targetRow, ($StartColumn + $c ), $LastRow, ($StartColumn + $c )]
|
Add-ExcelName -RangeName $targetRangeName -Range $ws.Cells[$targetRow, ($StartColumn + $c ), $LastRow, ($StartColumn + $c )]
|
||||||
try {#this test can throw with some names, surpress any error
|
try {#this test can throw with some names, surpress any error
|
||||||
if ([OfficeOpenXml.FormulaParsing.ExcelUtilities.ExcelAddressUtil]::IsValidAddress(($targetRangeName -replace '\W' , '_' ))) {
|
if ([OfficeOpenXml.FormulaParsing.ExcelUtilities.ExcelAddressUtil]::IsValidAddress(($targetRangeName -replace '\W' , '_' ))) {
|
||||||
Write-Warning "AutoNameRange: Property name '$targetRangeName' is also a valid Excel address and may cause issues. Consider renaming the property name."
|
Write-Warning -Message "AutoNameRange: Property name '$targetRangeName' is also a valid Excel address and may cause issues. Consider renaming the property."
|
||||||
}
|
}
|
||||||
} Catch {}
|
}
|
||||||
|
Catch {
|
||||||
|
Write-Warning -Message "AutoNameRange: Testing '$targetRangeName' caused an error. This should be harmless, but a change of property name may be needed.."
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch {Write-Warning -Message "Failed adding named ranges to worksheet '$WorksheetName': $_" }
|
catch {Write-Warning -Message "Failed adding named ranges to worksheet '$WorksheetName': $_" }
|
||||||
@@ -803,14 +806,17 @@
|
|||||||
#Empty string is not allowed as a name for ranges or tables.
|
#Empty string is not allowed as a name for ranges or tables.
|
||||||
if ($RangeName) { Add-ExcelName -Range $ws.Cells[$dataRange] -RangeName $RangeName}
|
if ($RangeName) { Add-ExcelName -Range $ws.Cells[$dataRange] -RangeName $RangeName}
|
||||||
|
|
||||||
if ($TableName) {
|
#Allow table to be inserted by specifying Name, or Style or both; only process autoFilter if there is no table (they clash).
|
||||||
|
if ($TableName) {
|
||||||
if ($PSBoundParameters.ContainsKey('TableStyle')) {
|
if ($PSBoundParameters.ContainsKey('TableStyle')) {
|
||||||
Add-ExcelTable -Range $ws.Cells[$dataRange] -TableName $TableName -TableStyle $TableStyle
|
Add-ExcelTable -Range $ws.Cells[$dataRange] -TableName $TableName -TableStyle $TableStyle
|
||||||
}
|
}
|
||||||
else {Add-ExcelTable -Range $ws.Cells[$dataRange] -TableName $TableName}
|
else {Add-ExcelTable -Range $ws.Cells[$dataRange] -TableName $TableName}
|
||||||
}
|
}
|
||||||
|
elseif ($PSBoundParameters.ContainsKey('TableStyle')) {
|
||||||
if ($AutoFilter) {
|
Add-ExcelTable -Range $ws.Cells[$dataRange] -TableName "" -TableStyle $TableStyle
|
||||||
|
}
|
||||||
|
elseif ($AutoFilter) {
|
||||||
try {
|
try {
|
||||||
$ws.Cells[$dataRange].AutoFilter = $true
|
$ws.Cells[$dataRange].AutoFilter = $true
|
||||||
Write-Verbose -Message "Enabled autofilter. "
|
Write-Verbose -Message "Enabled autofilter. "
|
||||||
@@ -1235,7 +1241,7 @@ function Select-Worksheet {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Function Add-ExcelName {
|
function Add-ExcelName {
|
||||||
<#
|
<#
|
||||||
.SYNOPSIS
|
.SYNOPSIS
|
||||||
Adds a named-range to an existing Excel worksheet.
|
Adds a named-range to an existing Excel worksheet.
|
||||||
@@ -1299,9 +1305,8 @@ function Add-ExcelTable {
|
|||||||
#The range of cells to assign to a table.
|
#The range of cells to assign to a table.
|
||||||
[Parameter(Mandatory=$true)]
|
[Parameter(Mandatory=$true)]
|
||||||
[OfficeOpenXml.ExcelRange]$Range,
|
[OfficeOpenXml.ExcelRange]$Range,
|
||||||
#The name for the Table - this should be unqiue in the Workbook.
|
#The name for the Table - this should be unqiue in the Workbook - auto generated names will be used if this is left empty.
|
||||||
[Parameter(Mandatory=$true)]
|
[String]$TableName = "",
|
||||||
[String]$TableName,
|
|
||||||
#The Style for the table, by default "Medium6" is used
|
#The Style for the table, by default "Medium6" is used
|
||||||
[OfficeOpenXml.Table.TableStyles]$TableStyle = 'Medium6',
|
[OfficeOpenXml.Table.TableStyles]$TableStyle = 'Medium6',
|
||||||
#By default the header row is shown - it can be turned off with -ShowHeader:$false.
|
#By default the header row is shown - it can be turned off with -ShowHeader:$false.
|
||||||
@@ -1324,32 +1329,37 @@ function Add-ExcelTable {
|
|||||||
[Switch]$PassThru
|
[Switch]$PassThru
|
||||||
)
|
)
|
||||||
try {
|
try {
|
||||||
if ([OfficeOpenXml.FormulaParsing.ExcelUtilities.ExcelAddressUtil]::IsValidAddress($TableName)) {
|
if ($TableName -eq "" -or $null -eq $TableName) {
|
||||||
Write-Warning -Message "$tableName reads as an Excel address, and so is not allowed as a table name."
|
$tbl = $Range.Worksheet.Tables.Add($Range, "")
|
||||||
return
|
|
||||||
}
|
|
||||||
if ($tableName -notMatch '^[A-Z]') {
|
|
||||||
Write-Warning -Message "$tableName is not allowed as a table name because it does not begin with a letter."
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if ($TableName -match "\W") {
|
|
||||||
Write-Warning -Message "At least one character in $TableName is illegal in a table name and will be replaced with '_' . "
|
|
||||||
$TableName = $TableName -replace '\W', '_'
|
|
||||||
}
|
|
||||||
$ws = $Range.Worksheet
|
|
||||||
#if the table exists in this worksheet, update it.
|
|
||||||
if ($ws.Tables[$TableName]) {
|
|
||||||
$tbl =$ws.Tables[$TableName]
|
|
||||||
$tbl.TableXml.table.ref = $Range.Address
|
|
||||||
Write-Verbose -Message "Re-defined table '$TableName', now at $($Range.Address)."
|
|
||||||
}
|
|
||||||
elseif ($ws.Workbook.Worksheets.Tables.Name -contains $TableName) {
|
|
||||||
Write-Warning -Message "The Table name '$TableName' is already used on a different worksheet."
|
|
||||||
return
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
$tbl = $ws.Tables.Add($Range, $TableName)
|
if ([OfficeOpenXml.FormulaParsing.ExcelUtilities.ExcelAddressUtil]::IsValidAddress($TableName)) {
|
||||||
Write-Verbose -Message "Defined table '$TableName' at $($Range.Address)"
|
Write-Warning -Message "$TableName reads as an Excel address, and so is not allowed as a table name."
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if ($TableName -notMatch '^[A-Z]') {
|
||||||
|
Write-Warning -Message "$TableName is not allowed as a table name because it does not begin with a letter."
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if ($TableName -match "\W") {
|
||||||
|
Write-Warning -Message "At least one character in $TableName is illegal in a table name and will be replaced with '_' . "
|
||||||
|
$TableName = $TableName -replace '\W', '_'
|
||||||
|
}
|
||||||
|
$ws = $Range.Worksheet
|
||||||
|
#if the table exists in this worksheet, update it.
|
||||||
|
if ($ws.Tables[$TableName]) {
|
||||||
|
$tbl =$ws.Tables[$TableName]
|
||||||
|
$tbl.TableXml.table.ref = $Range.Address
|
||||||
|
Write-Verbose -Message "Re-defined table '$TableName', now at $($Range.Address)."
|
||||||
|
}
|
||||||
|
elseif ($ws.Workbook.Worksheets.Tables.Name -contains $TableName) {
|
||||||
|
Write-Warning -Message "The Table name '$TableName' is already used on a different worksheet."
|
||||||
|
return
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$tbl = $ws.Tables.Add($Range, $TableName)
|
||||||
|
Write-Verbose -Message "Defined table '$($tbl.Name)' at $($Range.Address)"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#it seems that show total changes some of the others, so the sequence matters.
|
#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('ShowHeader')) {$tbl.ShowHeader = [bool]$ShowHeader}
|
||||||
@@ -1358,7 +1368,7 @@ function Add-ExcelTable {
|
|||||||
foreach ($k in $TotalSettings.keys) {
|
foreach ($k in $TotalSettings.keys) {
|
||||||
if (-not $tbl.Columns[$k]) {Write-Warning -Message "Table does not have a Column '$k'."}
|
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") ) {
|
elseif ($TotalSettings[$k] -notin @("Average", "Count", "CountNums", "Max", "Min", "None", "StdDev", "Sum", "Var") ) {
|
||||||
Write-wanring "'$($TotalSettings[$k])' is not a valid total function."
|
Write-Warning -Message "'$($TotalSettings[$k])' is not a valid total function."
|
||||||
}
|
}
|
||||||
else {$tbl.Columns[$k].TotalsRowFunction = $TotalSettings[$k]}
|
else {$tbl.Columns[$k].TotalsRowFunction = $TotalSettings[$k]}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -96,7 +96,7 @@ function ConvertFrom-ExcelColumnName {
|
|||||||
$sum
|
$sum
|
||||||
}
|
}
|
||||||
|
|
||||||
ipmo .\ImportExcel.psd1 -Force
|
Import-Module .\ImportExcel.psd1 -Force
|
||||||
|
|
||||||
#Get-ExcelTableName .\testTable.xlsx | Get-ExcelTable .\testTable.xlsx
|
#Get-ExcelTableName .\testTable.xlsx | Get-ExcelTable .\testTable.xlsx
|
||||||
Get-ExcelTable .\testTable.xlsx Table3
|
Get-ExcelTable .\testTable.xlsx Table3
|
||||||
@@ -10,7 +10,7 @@ function Import-Html {
|
|||||||
)
|
)
|
||||||
|
|
||||||
$xlFile = [System.IO.Path]::GetTempFileName() -replace "tmp","xlsx"
|
$xlFile = [System.IO.Path]::GetTempFileName() -replace "tmp","xlsx"
|
||||||
rm $xlFile -ErrorAction Ignore
|
Remove-Item $xlFile -ErrorAction Ignore
|
||||||
|
|
||||||
Write-Verbose "Exporting to Excel file $($xlFile)"
|
Write-Verbose "Exporting to Excel file $($xlFile)"
|
||||||
|
|
||||||
|
|||||||
@@ -48,6 +48,7 @@ if ($PSVersionTable.PSVersion.Major -ge 5) {
|
|||||||
. $PSScriptRoot\Plot.ps1
|
. $PSScriptRoot\Plot.ps1
|
||||||
|
|
||||||
Function New-Plot {
|
Function New-Plot {
|
||||||
|
[Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseShouldProcessForStateChangingFunctions', '', Justification='New-Plot does not change system state')]
|
||||||
Param()
|
Param()
|
||||||
|
|
||||||
[PSPlot]::new()
|
[PSPlot]::new()
|
||||||
@@ -296,7 +297,7 @@ function Import-Excel {
|
|||||||
.SYNOPSIS
|
.SYNOPSIS
|
||||||
Create objects containing the column number and the column name for each of the different header types.
|
Create objects containing the column number and the column name for each of the different header types.
|
||||||
#>
|
#>
|
||||||
|
[Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseSingularNouns', '', Justification="Name would be incorrect, and command is not exported")]
|
||||||
Param (
|
Param (
|
||||||
[Parameter(Mandatory)]
|
[Parameter(Mandatory)]
|
||||||
[Int[]]$Columns,
|
[Int[]]$Columns,
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
if((Get-Module -list ImportExcel) -eq $null) {
|
if($null -eq (Get-Module -ListAvailable ImportExcel) ) {
|
||||||
Import-Module $PSScriptRoot\ImportExcel.psd1 -force
|
Import-Module $PSScriptRoot\ImportExcel.psd1 -force
|
||||||
}
|
}
|
||||||
@@ -316,10 +316,10 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
Function Merge-MultipleSheets {
|
Function Merge-MultipleSheets {
|
||||||
<#
|
<#
|
||||||
.Synopsis
|
.Synopsis
|
||||||
Merges Worksheets into a single Worksheet with differences marked up.
|
Merges Worksheets into a single Worksheet with differences marked up.
|
||||||
.Description
|
.Description
|
||||||
The Merge Worksheet command combines two sheets. Merge-MultipleSheets is
|
The Merge Worksheet command combines two sheets. Merge-MultipleSheets is
|
||||||
designed to merge more than two. So if asked to merge sheets A,B,C which
|
designed to merge more than two. So if asked to merge sheets A,B,C which
|
||||||
contain Services, with a Name, Displayname and Start mode, where "Name" is
|
contain Services, with a Name, Displayname and Start mode, where "Name" is
|
||||||
@@ -353,30 +353,32 @@ Function Merge-MultipleSheets {
|
|||||||
sheet. However if Sheet B is the reference sheet, A and C will be seen to
|
sheet. However if Sheet B is the reference sheet, A and C will be seen to
|
||||||
have an item removed; and if B is processed before C, the extra item is
|
have an item removed; and if B is processed before C, the extra item is
|
||||||
known when C is processed and so C is considered to be missing that item.
|
known when C is processed and so C is considered to be missing that item.
|
||||||
.Example
|
.Example
|
||||||
dir Server*.xlsx | Merge-MulipleSheets -WorksheetName Services -OutputFile Test2.xlsx -OutputSheetName Services -Show
|
dir Server*.xlsx | Merge-MulipleSheets -WorksheetName Services -OutputFile Test2.xlsx -OutputSheetName Services -Show
|
||||||
Here we are auditing servers and each one has a workbook in the current
|
Here we are auditing servers and each one has a workbook in the current
|
||||||
directory which contains a "Services" Worksheet (the result of
|
directory which contains a "Services" Worksheet (the result of
|
||||||
Get-WmiObject -Class win32_service | Select-Object -Property Name, Displayname, Startmode)
|
Get-WmiObject -Class win32_service | Select-Object -Property Name, Displayname, Startmode)
|
||||||
No key is specified so the key is assumed to be the "Name" column.
|
No key is specified so the key is assumed to be the "Name" column.
|
||||||
The files are merged and the result is opened on completion.
|
The files are merged and the result is opened on completion.
|
||||||
.Example
|
.Example
|
||||||
dir Serv*.xlsx | Merge-MulipleSheets -WorksheetName Software -Key "*" -ExcludeProperty Install* -OutputFile Test2.xlsx -OutputSheetName Software -Show
|
dir Serv*.xlsx | Merge-MulipleSheets -WorksheetName Software -Key "*" -ExcludeProperty Install* -OutputFile Test2.xlsx -OutputSheetName Software -Show
|
||||||
The server audit files in the previous example also have "Software" worksheet,
|
The server audit files in the previous example also have "Software" worksheet,
|
||||||
but no single field on that sheet works as a key. Specifying "*" for the key
|
but no single field on that sheet works as a key. Specifying "*" for the key
|
||||||
produces a compound key using all non-excluded fields (and the installation
|
produces a compound key using all non-excluded fields (and the installation
|
||||||
date and file location are excluded).
|
date and file location are excluded).
|
||||||
.Example
|
.Example
|
||||||
Merge-MulipleSheets -Path hotfixes.xlsx -WorksheetName Serv* -Key hotfixid -OutputFile test2.xlsx -OutputSheetName hotfixes -HideRowNumbers -Show
|
Merge-MulipleSheets -Path hotfixes.xlsx -WorksheetName Serv* -Key hotfixid -OutputFile test2.xlsx -OutputSheetName hotfixes -HideRowNumbers -Show
|
||||||
This time all the servers have written their hotfix information to their own
|
This time all the servers have written their hotfix information to their own
|
||||||
worksheets in a shared Excel workbook named "Hotfixes.xlsx" (the information was
|
worksheets in a shared Excel workbook named "Hotfixes.xlsx" (the information was
|
||||||
obtained by running Get-Hotfix | Sort-Object -Property description,hotfixid | Select-Object -Property Description,HotfixID)
|
obtained by running Get-Hotfix | Sort-Object -Property description,hotfixid | Select-Object -Property Description,HotfixID)
|
||||||
This ignores any sheets which are not named "Serv*", and uses the HotfixID as
|
This ignores any sheets which are not named "Serv*", and uses the HotfixID as
|
||||||
the key; in this version the row numbers are hidden.
|
the key; in this version the row numbers are hidden.
|
||||||
#>
|
#>
|
||||||
[cmdletbinding()]
|
[cmdletbinding()]
|
||||||
#[Alias("Merge-MulipleSheets")] #There was a spelling error in the first release. This was there to ensure things didn't break but intelisense gave the alias first.
|
[Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseDeclaredVarsMoreThanAssignments', '', Justification="False positives when initializing variable in begin block")]
|
||||||
param (
|
[Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseSingularNouns', '', Justification="MultipleSheet would be incorrect")]
|
||||||
|
#[Alias("Merge-MulipleSheets")] #There was a spelling error in the first release. This was there to ensure things didn't break but intelisense gave the alias first.
|
||||||
|
param (
|
||||||
#Paths to the files to be merged. Files are also accepted
|
#Paths to the files to be merged. Files are also accepted
|
||||||
[Parameter(Mandatory=$true,ValueFromPipeline=$true)]
|
[Parameter(Mandatory=$true,ValueFromPipeline=$true)]
|
||||||
$Path ,
|
$Path ,
|
||||||
@@ -418,9 +420,9 @@ Function Merge-MultipleSheets {
|
|||||||
#If specified, opens the output workbook.
|
#If specified, opens the output workbook.
|
||||||
[Switch]$Show
|
[Switch]$Show
|
||||||
)
|
)
|
||||||
begin { $filestoProcess = @() }
|
begin { $filestoProcess = @() }
|
||||||
process { $filestoProcess += $Path}
|
process { $filestoProcess += $Path}
|
||||||
end {
|
end {
|
||||||
if ($filestoProcess.Count -eq 1 -and $WorksheetName -match '\*') {
|
if ($filestoProcess.Count -eq 1 -and $WorksheetName -match '\*') {
|
||||||
Write-Progress -Activity "Merging sheets" -CurrentOperation "Expanding * to names of sheets in $($filestoProcess[0]). "
|
Write-Progress -Activity "Merging sheets" -CurrentOperation "Expanding * to names of sheets in $($filestoProcess[0]). "
|
||||||
$excel = Open-ExcelPackage -Path $filestoProcess
|
$excel = Open-ExcelPackage -Path $filestoProcess
|
||||||
@@ -532,5 +534,5 @@ Function Merge-MultipleSheets {
|
|||||||
if ($Passthru) {$excel}
|
if ($Passthru) {$excel}
|
||||||
else {Close-ExcelPackage -ExcelPackage $excel -Show:$Show}
|
else {Close-ExcelPackage -ExcelPackage $excel -Show:$Show}
|
||||||
Write-Progress -Activity "Merging sheets" -Completed
|
Write-Progress -Activity "Merging sheets" -Completed
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -27,6 +27,7 @@ function New-ConditionalFormattingIconSet {
|
|||||||
Add-Add-ConditionalFormatting
|
Add-Add-ConditionalFormatting
|
||||||
New-ConditionalText
|
New-ConditionalText
|
||||||
#>
|
#>
|
||||||
|
[Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseShouldProcessForStateChangingFunctions', '',Justification='Does not change system State')]
|
||||||
param(
|
param(
|
||||||
[Parameter(Mandatory=$true)]
|
[Parameter(Mandatory=$true)]
|
||||||
$Range,
|
$Range,
|
||||||
|
|||||||
@@ -42,8 +42,8 @@ function New-ConditionalText {
|
|||||||
Add-Add-ConditionalFormatting
|
Add-Add-ConditionalFormatting
|
||||||
New-ConditionalFormattingIconSet
|
New-ConditionalFormattingIconSet
|
||||||
#>
|
#>
|
||||||
|
|
||||||
[cmdletbinding()]
|
[cmdletbinding()]
|
||||||
|
[Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseShouldProcessForStateChangingFunctions', '',Justification='Does not change system State')]
|
||||||
param(
|
param(
|
||||||
#[Parameter(Mandatory=$true)]
|
#[Parameter(Mandatory=$true)]
|
||||||
[Alias("ConditionValue")]
|
[Alias("ConditionValue")]
|
||||||
|
|||||||
@@ -97,6 +97,7 @@
|
|||||||
#>
|
#>
|
||||||
[Alias("New-ExcelChart")] #This was the former name. The new name reflects that we are defining a chart, not making one in the workbook.
|
[Alias("New-ExcelChart")] #This was the former name. The new name reflects that we are defining a chart, not making one in the workbook.
|
||||||
[cmdletbinding()]
|
[cmdletbinding()]
|
||||||
|
[Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseShouldProcessForStateChangingFunctions', '',Justification='Does not change system State')]
|
||||||
param(
|
param(
|
||||||
$Title = "Chart Title",
|
$Title = "Chart Title",
|
||||||
$Header,
|
$Header,
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
[Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseShouldProcessForStateChangingFunctions', '', Scope='Function', Target='New*', Justification='Does not change system State')]
|
||||||
|
param()
|
||||||
function New-PSItem {
|
function New-PSItem {
|
||||||
|
|
||||||
$totalArgs = $args.Count
|
$totalArgs = $args.Count
|
||||||
|
|||||||
@@ -312,6 +312,7 @@ function New-PivotTableDefinition {
|
|||||||
|
|
||||||
This is a re-work of one of the examples in Export-Excel - instead of writing out the pivot definition hash table it is built by calling New-PivotTableDefinition.
|
This is a re-work of one of the examples in Export-Excel - instead of writing out the pivot definition hash table it is built by calling New-PivotTableDefinition.
|
||||||
#>
|
#>
|
||||||
|
[Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseShouldProcessForStateChangingFunctions', '',Justification='Does not change system State')]
|
||||||
param(
|
param(
|
||||||
[Parameter(Mandatory)]
|
[Parameter(Mandatory)]
|
||||||
[Alias("PivtoTableName")]#Previous typo - use alias to avoid breaking scripts
|
[Alias("PivtoTableName")]#Previous typo - use alias to avoid breaking scripts
|
||||||
|
|||||||
@@ -15,7 +15,8 @@
|
|||||||
C:\> dir c:\reports\*.xlsx | Remove-WorkSheet
|
C:\> dir c:\reports\*.xlsx | Remove-WorkSheet
|
||||||
Removes 'Sheet1' from all the xlsx files in the c:\reports directory
|
Removes 'Sheet1' from all the xlsx files in the c:\reports directory
|
||||||
|
|
||||||
#>
|
#>
|
||||||
|
[cmdletbinding(SupportsShouldProcess=$true)]
|
||||||
param(
|
param(
|
||||||
# [Parameter(ValueFromPipelineByPropertyName)]
|
# [Parameter(ValueFromPipelineByPropertyName)]
|
||||||
[Parameter(ValueFromPipelineByPropertyName)]
|
[Parameter(ValueFromPipelineByPropertyName)]
|
||||||
@@ -34,9 +35,10 @@
|
|||||||
|
|
||||||
if ($pkg) {
|
if ($pkg) {
|
||||||
foreach ($wsn in $WorksheetName) {
|
foreach ($wsn in $WorksheetName) {
|
||||||
$pkg.Workbook.Worksheets.Delete($wsn)
|
if ($PSCmdlet.ShouldProcess($FullName,"Remove Sheet $wsn")) {
|
||||||
|
$pkg.Workbook.Worksheets.Delete($wsn)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Close-ExcelPackage -ExcelPackage $pkg -Show:$Show
|
Close-ExcelPackage -ExcelPackage $pkg -Show:$Show
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -90,6 +90,8 @@
|
|||||||
Export-Excel
|
Export-Excel
|
||||||
#>
|
#>
|
||||||
[CmdletBinding(DefaultParameterSetName="none")]
|
[CmdletBinding(DefaultParameterSetName="none")]
|
||||||
|
[Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSAvoidGlobalVars', '', Justification="Allowed to use DBSessions Global variable from GETSQL Module")]
|
||||||
|
|
||||||
param (
|
param (
|
||||||
[Parameter(ParameterSetName="SQLConnection", Mandatory=$true)]
|
[Parameter(ParameterSetName="SQLConnection", Mandatory=$true)]
|
||||||
[Parameter(ParameterSetName="ODBCConnection", Mandatory=$true)]
|
[Parameter(ParameterSetName="ODBCConnection", Mandatory=$true)]
|
||||||
|
|||||||
@@ -1,4 +1,7 @@
|
|||||||
function Set-CellStyle {
|
[Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseShouldProcessForStateChangingFunctions', '', Scope='Function', Target='Set*', Justification='Does not change system state')]
|
||||||
|
param()
|
||||||
|
|
||||||
|
function Set-CellStyle {
|
||||||
param(
|
param(
|
||||||
$WorkSheet,
|
$WorkSheet,
|
||||||
$Row,
|
$Row,
|
||||||
|
|||||||
@@ -44,6 +44,8 @@
|
|||||||
[cmdletbinding()]
|
[cmdletbinding()]
|
||||||
[Alias("Set-Column")]
|
[Alias("Set-Column")]
|
||||||
[OutputType([OfficeOpenXml.ExcelColumn],[String])]
|
[OutputType([OfficeOpenXml.ExcelColumn],[String])]
|
||||||
|
[Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseShouldProcessForStateChangingFunctions', '',Justification='Does not change system state')]
|
||||||
|
[Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseDeclaredVarsMoreThanAssignments', '', Justification="Variables created for script block which may be passed as a parameter, but not used in the script")]
|
||||||
Param (
|
Param (
|
||||||
#If specifying the worksheet by name, the ExcelPackage object which contains the worksheet also needs to be passed.
|
#If specifying the worksheet by name, the ExcelPackage object which contains the worksheet also needs to be passed.
|
||||||
[Parameter(ParameterSetName="Package",Mandatory=$true)]
|
[Parameter(ParameterSetName="Package",Mandatory=$true)]
|
||||||
@@ -138,7 +140,7 @@
|
|||||||
process {
|
process {
|
||||||
if ($null -eq $workSheet.Dimension) {Write-Warning "Can't format an empty worksheet."; return}
|
if ($null -eq $workSheet.Dimension) {Write-Warning "Can't format an empty worksheet."; return}
|
||||||
if ($Column -eq 0 ) {$Column = $endColumn + 1 }
|
if ($Column -eq 0 ) {$Column = $endColumn + 1 }
|
||||||
$columnName = [OfficeOpenXml.ExcelCellAddress]::new(1,$column).Address -replace "1",""
|
$columnName = (New-Object 'OfficeOpenXml.ExcelCellAddress' @(1, $column)).Address -replace "1",""
|
||||||
Write-Verbose -Message "Updating Column $columnName"
|
Write-Verbose -Message "Updating Column $columnName"
|
||||||
#If there is a heading, insert it and use it as the name for a range (if we're creating one)
|
#If there is a heading, insert it and use it as the name for a range (if we're creating one)
|
||||||
if ($PSBoundParameters.ContainsKey('Heading')) {
|
if ($PSBoundParameters.ContainsKey('Heading')) {
|
||||||
|
|||||||
@@ -33,6 +33,8 @@
|
|||||||
[cmdletbinding()]
|
[cmdletbinding()]
|
||||||
[Alias("Set-Row")]
|
[Alias("Set-Row")]
|
||||||
[OutputType([OfficeOpenXml.ExcelRow],[String])]
|
[OutputType([OfficeOpenXml.ExcelRow],[String])]
|
||||||
|
[Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseShouldProcessForStateChangingFunctions', '',Justification='Does not change system state')]
|
||||||
|
[Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseDeclaredVarsMoreThanAssignments', '', Justification="Variables created for script block which may be passed as a parameter, but not used in the script")]
|
||||||
Param (
|
Param (
|
||||||
#An Excel package object - e.g. from Export-Excel -PassThru - requires a sheet name.
|
#An Excel package object - e.g. from Export-Excel -PassThru - requires a sheet name.
|
||||||
[Parameter(ParameterSetName="Package",Mandatory=$true)]
|
[Parameter(ParameterSetName="Package",Mandatory=$true)]
|
||||||
@@ -143,7 +145,7 @@
|
|||||||
#Fill in the data
|
#Fill in the data
|
||||||
if ($PSBoundParameters.ContainsKey('Value')) {foreach ($column in ($StartColumn..$endColumn)) {
|
if ($PSBoundParameters.ContainsKey('Value')) {foreach ($column in ($StartColumn..$endColumn)) {
|
||||||
#We might want the column name in a script block
|
#We might want the column name in a script block
|
||||||
$columnName = [OfficeOpenXml.ExcelCellAddress]::new(1,$column).Address -replace "1",""
|
$columnName = (New-Object -TypeName OfficeOpenXml.ExcelCellAddress @(1,$column)).Address -replace "1",""
|
||||||
if ($Value -is [scriptblock] ) {
|
if ($Value -is [scriptblock] ) {
|
||||||
#re-create the script block otherwise variables from this function are out of scope.
|
#re-create the script block otherwise variables from this function are out of scope.
|
||||||
$cellData = & ([scriptblock]::create( $Value ))
|
$cellData = & ([scriptblock]::create( $Value ))
|
||||||
@@ -177,7 +179,7 @@
|
|||||||
if ($PSBoundParameters.ContainsKey($p)) {$params[$p] = $PSBoundParameters[$p]}
|
if ($PSBoundParameters.ContainsKey($p)) {$params[$p] = $PSBoundParameters[$p]}
|
||||||
}
|
}
|
||||||
if ($params.Count) {
|
if ($params.Count) {
|
||||||
$theRange = [OfficeOpenXml.ExcelAddress]::New($Row, $StartColumn, $Row, $endColumn)
|
$theRange = New-Object -TypeName OfficeOpenXml.ExcelAddress @($Row, $StartColumn, $Row, $endColumn)
|
||||||
Set-ExcelRange -WorkSheet $Worksheet -Range $theRange @params
|
Set-ExcelRange -WorkSheet $Worksheet -Range $theRange @params
|
||||||
}
|
}
|
||||||
#endregion
|
#endregion
|
||||||
|
|||||||
@@ -9,6 +9,7 @@
|
|||||||
Set-WorkSheetProtection -WorkSheet $planSheet -IsProtected -AllowAll -AllowInsertColumns:$false -AllowDeleteColumns:$false -UnLockAddress "A:N"
|
Set-WorkSheetProtection -WorkSheet $planSheet -IsProtected -AllowAll -AllowInsertColumns:$false -AllowDeleteColumns:$false -UnLockAddress "A:N"
|
||||||
Turns on protection for the worksheet in $planSheet, checks all the allow boxes excel Insert and Delete columns and unlocks columns A-N
|
Turns on protection for the worksheet in $planSheet, checks all the allow boxes excel Insert and Delete columns and unlocks columns A-N
|
||||||
#>
|
#>
|
||||||
|
[Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseShouldProcessForStateChangingFunctions', '',Justification='Does not change system state')]
|
||||||
param (
|
param (
|
||||||
#The worksheet where protection is to be applied.
|
#The worksheet where protection is to be applied.
|
||||||
[Parameter(Mandatory=$true)]
|
[Parameter(Mandatory=$true)]
|
||||||
|
|||||||
@@ -32,6 +32,7 @@
|
|||||||
#>
|
#>
|
||||||
[cmdletbinding()]
|
[cmdletbinding()]
|
||||||
[Alias("Set-Format")]
|
[Alias("Set-Format")]
|
||||||
|
[Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseShouldProcessForStateChangingFunctions', '',Justification='Does not change system state')]
|
||||||
Param (
|
Param (
|
||||||
#One or more row(s), Column(s) and/or block(s) of cells to format.
|
#One or more row(s), Column(s) and/or block(s) of cells to format.
|
||||||
[Parameter(ValueFromPipeline = $true,Position=0)]
|
[Parameter(ValueFromPipeline = $true,Position=0)]
|
||||||
|
|||||||
@@ -1,3 +1,8 @@
|
|||||||
|
[Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseShouldProcessForStateChangingFunctions', '', Scope='Function', Target='Update*', Justification='Does not change system state')]
|
||||||
|
[Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseSingularNouns', '', Scope='Function', Target='Update*', Justification='Property would be incorrect')]
|
||||||
|
|
||||||
|
param()
|
||||||
|
|
||||||
Function Update-FirstObjectProperties {
|
Function Update-FirstObjectProperties {
|
||||||
<#
|
<#
|
||||||
.SYNOPSIS
|
.SYNOPSIS
|
||||||
@@ -79,7 +84,7 @@ Function Update-FirstObjectProperties {
|
|||||||
$Union = @()
|
$Union = @()
|
||||||
$Input | ForEach-Object {
|
$Input | ForEach-Object {
|
||||||
If ($Union.Count) {
|
If ($Union.Count) {
|
||||||
$_ | Get-Member | Where {-not ($Union[0] | Get-Member $_.Name)} | ForEach-Object {
|
$_ | Get-Member | Where-Object {-not ($Union[0] | Get-Member $_.Name)} | ForEach-Object {
|
||||||
$Union[0] | Add-Member -MemberType NoteProperty -Name $_.Name -Value $Null
|
$Union[0] | Add-Member -MemberType NoteProperty -Name $_.Name -Value $Null
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -328,7 +328,7 @@ Describe "Merge Multiple sheets" {
|
|||||||
$ws.Cells[12,9 ].Value | Should be $ws.Cells[12,5].Value
|
$ws.Cells[12,9 ].Value | Should be $ws.Cells[12,5].Value
|
||||||
$ws.Cells[12,10].Value | Should be $ws.Cells[12,6].Value
|
$ws.Cells[12,10].Value | Should be $ws.Cells[12,6].Value
|
||||||
}
|
}
|
||||||
it "Creared Conditional formatting rules " {
|
it "Created Conditional formatting rules " {
|
||||||
$cf=$ws.ConditionalFormatting
|
$cf=$ws.ConditionalFormatting
|
||||||
$cf.Count | Should be 17
|
$cf.Count | Should be 17
|
||||||
$cf[16].Address.Address | Should be 'B2:B1048576'
|
$cf[16].Address.Address | Should be 'B2:B1048576'
|
||||||
|
|||||||
@@ -91,9 +91,9 @@ Describe "Join Worksheet part 1" {
|
|||||||
}
|
}
|
||||||
$path = "$env:TEMP\Test.xlsx"
|
$path = "$env:TEMP\Test.xlsx"
|
||||||
Remove-item -Path $path -ErrorAction SilentlyContinue
|
Remove-item -Path $path -ErrorAction SilentlyContinue
|
||||||
IF ($PSVersionTable.PSVersion.Major -gt 5) {Write-warning -message "Part 2 Does not run on V6"; return}
|
#switched from WMI to CIM objects so test runs on V6
|
||||||
Describe "Join Worksheet part 2" {
|
Describe "Join Worksheet part 2" {
|
||||||
Get-WmiObject -Class win32_logicaldisk |
|
Get-CimInstance -ClassName win32_logicaldisk |
|
||||||
Select-Object -Property DeviceId,VolumeName, Size,Freespace |
|
Select-Object -Property DeviceId,VolumeName, Size,Freespace |
|
||||||
Export-Excel -Path $path -WorkSheetname Volumes -NumberFormat "0,000"
|
Export-Excel -Path $path -WorkSheetname Volumes -NumberFormat "0,000"
|
||||||
Get-NetAdapter |
|
Get-NetAdapter |
|
||||||
|
|||||||
@@ -69,6 +69,8 @@
|
|||||||
Only the unchanged rows are highlighted.
|
Only the unchanged rows are highlighted.
|
||||||
#>
|
#>
|
||||||
[cmdletbinding(DefaultParameterSetName)]
|
[cmdletbinding(DefaultParameterSetName)]
|
||||||
|
[Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSAvoidUsingWriteHost', '', Justification="Write host used for sub-warning level message to operator which does not form output")]
|
||||||
|
[Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseDeclaredVarsMoreThanAssignments', '', Justification="False positives when initializing variable in begin block")]
|
||||||
Param(
|
Param(
|
||||||
#First file to compare.
|
#First file to compare.
|
||||||
[parameter(Mandatory=$true,Position=0)]
|
[parameter(Mandatory=$true,Position=0)]
|
||||||
@@ -219,11 +221,9 @@
|
|||||||
}
|
}
|
||||||
elseif ($diff -and $FontColor) {Write-Warning -Message "To match rows to set changed cells, you must specify -Key and it must match one of the included properties." }
|
elseif ($diff -and $FontColor) {Write-Warning -Message "To match rows to set changed cells, you must specify -Key and it must match one of the included properties." }
|
||||||
|
|
||||||
#if nothing was found write a message which wont be redirected
|
#if nothing was found write a message which will not be redirected
|
||||||
if (-not $diff) {Write-Host "Comparison of $Referencefile::$worksheet1 and $Differencefile::$WorkSheet2 returned no results." }
|
if (-not $diff) {Write-Host "Comparison of $Referencefile::$worksheet1 and $Differencefile::$WorkSheet2 returned no results." }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if ($Show) {
|
if ($Show) {
|
||||||
Start-Process -FilePath $Referencefile
|
Start-Process -FilePath $Referencefile
|
||||||
if (-not $oneFile) { Start-Process -FilePath $Differencefile }
|
if (-not $oneFile) { Start-Process -FilePath $Differencefile }
|
||||||
|
|||||||
Reference in New Issue
Block a user