Documentimo.psm1
function Format-PSTable { [CmdletBinding()] param ([parameter(ValueFromPipelineByPropertyName, ValueFromPipeline)][System.Collections.ICollection] $Object, [switch] $SkipTitle, [string[]] $Property, [string[]] $ExcludeProperty, [Object] $OverwriteHeaders, [switch] $PreScanHeaders, [string] $Splitter = ';') if ($Object[0] -is [System.Collections.IDictionary]) { $Array = @(if (-not $SkipTitle) { , @('Name', 'Value') } foreach ($O in $Object) { foreach ($Name in $O.Keys) { $Value = $O[$Name] if ($O[$Name].Count -gt 1) { $Value = $O[$Name] -join $Splitter } else { $Value = $O[$Name] } , @($Name, $Value) } }) if ($Array.Count -eq 1) { , $Array } else { $Array } } elseif ($Object[0].GetType().Name -match 'bool|byte|char|datetime|decimal|double|ExcelHyperLink|float|int|long|sbyte|short|string|timespan|uint|ulong|URI|ushort') { return $Object } else { if ($Property) { $Object = $Object | Select-Object -Property $Property } $Array = @(if ($PreScanHeaders) { $Titles = Get-ObjectProperties -Object $Object } elseif ($OverwriteHeaders) { $Titles = $OverwriteHeaders } else { $Titles = $Object[0].PSObject.Properties.Name } if (-not $SkipTitle) { , $Titles } foreach ($O in $Object) { $ArrayValues = foreach ($Name in $Titles) { $Value = $O."$Name" if ($Value.Count -gt 1) { $Value -join $Splitter } elseif ($Value.Count -eq 1) { if ($Value.Value) { $Value.Value } else { $Value } } else { '' } } , $ArrayValues }) if ($Array.Count -eq 1) { , $Array } else { $Array } } } function Format-TransposeTable { [CmdletBinding()] param ([Parameter(ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true)][System.Collections.ICollection] $Object, [ValidateSet("ASC", "DESC", "NONE")][String] $Sort = 'NONE') begin { $i = 0 } process { foreach ($myObject in $Object) { if ($myObject -is [System.Collections.IDictionary]) { $output = New-Object -TypeName PsObject Add-Member -InputObject $output -MemberType ScriptMethod -Name AddNote -Value { Add-Member -InputObject $this -MemberType NoteProperty -Name $args[0] -Value $args[1] } if ($Sort -eq 'ASC') { $myObject.Keys | Sort-Object -Descending:$false | ForEach-Object { $output.AddNote($_, $myObject.$_) } } elseif ($Sort -eq 'DESC') { $myObject.Keys | Sort-Object -Descending:$true | ForEach-Object { $output.AddNote($_, $myObject.$_) } } else { $myObject.Keys | ForEach-Object { $output.AddNote($_, $myObject.$_) } } $output } else { $output = [ordered] @{ } $myObject | Get-Member -MemberType *Property | ForEach-Object { $output.($_.name) = $myObject.($_.name) } $output } $i += 1 } } } function Get-FileName { <# .SYNOPSIS Short description .DESCRIPTION Long description .PARAMETER Extension Parameter description .PARAMETER Temporary Parameter description .PARAMETER TemporaryFileOnly Parameter description .EXAMPLE Get-FileName -Temporary Output: 3ymsxvav.tmp .EXAMPLE Get-FileName -Temporary Output: C:\Users\pklys\AppData\Local\Temp\tmpD74C.tmp .EXAMPLE Get-FileName -Temporary -Extension 'xlsx' Output: C:\Users\pklys\AppData\Local\Temp\tmp45B6.xlsx .NOTES General notes #> [CmdletBinding()] param([string] $Extension = 'tmp', [switch] $Temporary, [switch] $TemporaryFileOnly) if ($Temporary) { return "$($([System.IO.Path]::GetTempFileName()).Replace('.tmp','')).$Extension" } if ($TemporaryFileOnly) { return "$($([System.IO.Path]::GetRandomFileName()).Split('.')[0]).$Extension" } } function Get-ObjectProperties { param ([object] $Object, [string[]] $AddProperties, [switch] $Sort, [bool] $RequireUnique = $true) $Properties = @(foreach ($O in $Object) { $ObjectProperties = $O.PSObject.Properties.Name $ObjectProperties } foreach ($Property in $AddProperties) { $Property }) if ($Sort) { return $Properties | Sort-Object -Unique:$RequireUnique } else { return $Properties | Select-Object -Unique:$RequireUnique } } function New-DocWordChart { [CmdletBinding()] param([Xceed.Document.NET.Container] $WordDocument, [PSCustomObject] $Parameters) [Array] $DataTable = $Parameters.DataTable [string] $Key = $Parameters.Key [string] $Value = $Parameters.Value [Xceed.Document.NET.ChartLegendPosition] $LegendPosition = $Parameters.LegendPosition [bool] $LegendOverlay = $Parameters.LegendOverlay [string] $Title = $Parameters.Title if ($DataTable.Count -gt 0) { if ($DataTable[0] -is [System.Collections.IDictionary]) { $TemporaryNames = $DataTable.Keys $Names = foreach ($Name in $TemporaryNames) { "$Name ($($DataTable.$Name))" } $Values = $DataTable.Values } else { if (($Key -ne '') -and ($Value -ne '')) { $Names = for ($i = 0; $i -lt $DataTable.Count; $i++) { "$($DataTable[$i].$Key) ($($DataTable[$i].$Value))" } $Values = $DataTable.$Value } else { return } } if (($Values.Count -eq $Names.Count) -and ($Values.Count -gt 0)) { Add-WordParagraph -WordDocument $WordDocument -Supress $True Add-WordPieChart -WordDocument $WordDocument -ChartName $Title -Names $Names -Values $Values -ChartLegendPosition $LegendPosition -ChartLegendOverlay $LegendOverlay } else { Write-Warning "DocumentimoChart - Names and Values count doesn't match or equals 0" } } } function New-DocWordList { [CmdletBinding()] param([Xceed.Document.NET.Container] $WordDocument, [PSCustomObject] $Parameters) $List = $null foreach ($Item in $Parameters.ListItems) { if ($null -eq $List) { $List = $WordDocument.AddList($Item.Text, $Item.Level, $Parameters.Type, $Item.StartNumber, $Item.TrackChanges, $Item.ContinueNumbering) } else { $List = $WordDocument.AddListItem($List, $Item.Text, $Item.Level, $Parameters.Type, $Item.StartNumber, $Item.TrackChanges, $Item.ContinueNumbering) } } $null = Add-WordListItem -WordDocument $WordDocument -List $List } function New-DocWordNumbering { [CmdletBinding()] param([Xceed.Document.NET.Container] $WordDocument, [PSCustomObject] $Parameters) $TOC = Add-WordTocItem -WordDocument $WordDocument -Text $Parameters.Text -ListLevel $Parameters.Level -ListItemType $Parameters.Type -HeadingType $Parameters.Heading if ($Parameters.Content) { New-WordProcessing -Content $Parameters.Content -WordDocument $WordDocument } } function New-DocWordPageBreak { [CmdletBinding()] param([Xceed.Document.NET.Container] $WordDocument, [PSCustomObject] $Parameters) $i = 0 While ($i -lt $Parameters.Count) { Write-Verbose "New-WordBlockPageBreak - PageBreak $i" Add-WordPageBreak -Supress $True -WordDocument $WordDocument $i++ } } function New-DocWordTable { [CmdletBinding()] param([Xceed.Document.NET.Container] $WordDocument, [PSCustomObject] $Parameters) if ($Parameters.OverWriteTitle) { [Xceed.Document.NET.Alignment] $TitleAlignment = $Parameters.OverwriteTitleAlignment [System.Drawing.Color] $TitleColor = $Parameters.OverwriteTitleColor $Table = Add-WordTable -WordDocument $WordDocument -Supress $false -DataTable $Parameters.DataTable -Design $Parameters.Design -AutoFit $Parameters.AutoFit -MaximumColumns $Parameters.MaximumColumns $Table = Set-WordTableRowMergeCells -Table $Table -RowNr 0 -MergeAll $TableParagraph = Get-WordTableRow -Table $Table -RowNr 0 -ColumnNr 0 $TableParagraph = Set-WordText -Paragraph $TableParagraph -Text $Parameters.OverwriteTitle -Alignment $TitleAlignment -Color $TitleColor } else { $Table = Add-WordTable -WordDocument $WordDocument -Supress $true -DataTable $Parameters.DataTable -Design $Parameters.Design -AutoFit $Parameters.AutoFit } } function New-DocWordText { [CmdletBinding()] param([Xceed.Document.NET.Container] $WordDocument, [PSCustomObject] $Parameters) if ($Parameters.Text) { Add-WordText -WordDocument $WordDocument -Text $Parameters.Text -Color $Parameters.Color -Supress $true } if ($Parameters.LineBreak) { Add-WordParagraph -WordDocument $WordDocument -Supress $True } } function New-DocWordTOC { [CmdletBinding()] param([Xceed.Document.NET.Container] $WordDocument, [PSCustomObject] $Parameters) Add-WordTOC -WordDocument $WordDocument -Title $Parameters.Title -Switches $Parameters.Switches -RightTabPos $Parameters.RightTabPos -Supress $True } function New-WordProcessing { [CmdletBinding()] param([Array] $Content, [Xceed.Document.NET.Container] $WordDocument) if ($Content.Count -gt 0) { foreach ($Parameters in $Content) { if ($Parameters.ObjectType -eq 'List') { New-DocWordList -WordDocument $WordDocument -Parameters $Parameters } elseif ($Parameters.ObjectType -eq 'Table') { New-DocWordTable -WordDocument $WordDocument -Parameters $Parameters } elseif ($Parameters.ObjectType -eq 'TOC') { New-DocWordTOC -WordDocument $WordDocument -Parameters $Parameters } elseif ($Parameters.ObjectType -eq 'Text') { New-DocWordText -WordDocument $WordDocument -Parameters $Parameters } elseif ($Parameters.ObjectType -eq 'TocItem') { New-DocWordNumbering -WordDocument $WordDocument -Parameters $Parameters } elseif ($Parameters.ObjectType -eq 'PageBreak') { New-DocWordPageBreak -WordDocument $WordDocument -Parameters $Parameters } elseif ($Parameters.ObjectType -eq 'ChartPie') { New-DocWordChart -WordDocument $WordDocument -Parameters $Parameters } } } } function Documentimo { [CmdletBinding()] [alias('Doc', 'New-Documentimo')] param([Parameter(Position = 0)][ValidateNotNull()][ScriptBlock] $Content = $(Throw "Documentimo requires opening and closing brace."), [string] $FilePath, [alias('Show')][switch] $Open, [string] $Language = 'en-US') $WordDocument = New-WordDocument -FilePath $FilePath if ($null -ne $Content) { $Array = Invoke-Command -ScriptBlock $Content New-WordProcessing -Content $Array -WordDocument $WordDocument } Save-WordDocument -WordDocument $WordDocument -Supress $true -Language $Language -Verbose -OpenDocument:$Open } function DocChart { [CmdletBinding()] [alias('DocumentimoChart', 'New-DocumentimoChart')] param([Array] $DataTable, [string] $Title, [string] $Key, [string] $Value, [Xceed.Document.NET.ChartLegendPosition] $LegendPosition = [Xceed.Document.NET.ChartLegendPosition]::Bottom, [bool] $LegendOverlay) [PSCustomObject] @{ObjectType = 'ChartPie' DataTable = $DataTable Title = $Title Key = $Key Value = $Value LegendPosition = $LegendPosition LegendOverlay = $LegendOverlay } } function DocList { [CmdletBinding()] [alias('DocumentimoList', 'New-DocumentimoList')] param([ScriptBlock] $ListItems, [alias('ListType')][Xceed.Document.NET.ListItemType] $Type = [Xceed.Document.NET.ListItemType]::Bulleted) [PSCustomObject] @{ObjectType = 'List' ListItems = Invoke-Command -ScriptBlock $ListItems Type = $Type } } function DocListItem { [CmdletBinding()] [alias('DocumentimoListItem', 'New-DocumentimoListItem')] param([ValidateRange(0, 8)] [int] $Level, [string] $Text, [nullable[int]] $StartNumber, [bool]$TrackChanges = $false, [bool]$ContinueNumbering = $false, [bool]$Supress = $false) [PSCustomObject] @{ObjectType = 'ListItem' Level = $Level Text = $Text StartNumber = $StartNumber TrackChanges = $TrackChanges ContinueNumbering = $ContinueNumbering } } function DocNumbering { [CmdletBinding()] [alias('DocumentimoNumbering', 'New-DocumentimoNumbering')] param([Parameter(Position = 0)][ScriptBlock] $Content, [string] $Text, [int] $Level = 0, [Xceed.Document.NET.ListItemType] $Type = [Xceed.Document.NET.ListItemType]::Numbered, [Xceed.Document.NET.HeadingType] $Heading = [Xceed.Document.NET.HeadingType]::Heading1) [PSCustomObject] @{ObjectType = 'TocItem' Text = $Text Content = & $Content Level = $Level Type = $Type Heading = $Heading } } function DocPageBreak { [CmdletBinding()] [alias('DocumentimoPageBreak', 'New-DocumentimoPageBreak')] param([int] $Count = 1) [PSCustomObject] @{ObjectType = 'PageBreak' Count = $Count } } function DocTable { [CmdletBinding()] [alias('DocumentimoTable', 'New-DocumentimoTable')] param([Array] $DataTable, [Xceed.Document.NET.AutoFit] $AutoFit = [Xceed.Document.NET.AutoFit]::Window, [Xceed.Document.NET.TableDesign] $Design = [Xceed.Document.NET.TableDesign]::LightGrid, [Xceed.Document.NET.Direction] $Direction = [Xceed.Document.NET.Direction]::LeftToRight, [int] $MaximumColumns = 5, [string] $OverwriteTitle, [Xceed.Document.NET.Alignment] $OverwriteTitleAlignment = [Xceed.Document.NET.Alignment]::center, [System.Drawing.Color] $OverwriteTitleColor = [System.Drawing.Color]::Black) [PSCustomObject] @{ObjectType = 'Table' DataTable = $DataTable AutoFit = $AutoFit Design = $Design Direction = $Direction MaximumColumns = $MaximumColumns OverwriteTitle = $OverwriteTitle OverwriteTitleAlignment = $OverwriteTitleAlignment OverwriteTitleColor = $OverwriteTitleColor } } function DocText { [CmdletBinding()] [alias('DocumentimoText', 'New-DocumentimoText')] param([Parameter(Mandatory = $false, Position = 0)][ScriptBlock] $TextBlock, [String[]]$Text, [System.Drawing.Color[]]$Color = @(), [switch] $LineBreak) if ($TextBlock) { $Text = (Invoke-Command -ScriptBlock $TextBlock) } [PSCustomObject] @{ObjectType = 'Text' Text = $Text Color = $Color LineBreak = $LineBreak } } function DocToc { [CmdletBinding()] [alias('DocumentimoTOC', 'New-DocumentimoTOC')] param([string] $Title, [int] $RightTabPos, [Xceed.Document.NET.TableOfContentsSwitches] $Switches) [PSCustomObject] @{ObjectType = 'TOC' Title = $Title RightTabPos = $RightTabPos Switches = $Switches } } Export-ModuleMember -Function @('DocChart', 'DocList', 'DocListItem', 'DocNumbering', 'DocPageBreak', 'DocTable', 'DocText', 'DocToc', 'Documentimo') -Alias @('Doc', 'DocumentimoChart', 'DocumentimoList', 'DocumentimoListItem', 'DocumentimoNumbering', 'DocumentimoPageBreak', 'DocumentimoTable', 'DocumentimoText', 'DocumentimoTOC', 'New-Documentimo', 'New-DocumentimoChart', 'New-DocumentimoList', 'New-DocumentimoListItem', 'New-DocumentimoNumbering', 'New-DocumentimoPageBreak', 'New-DocumentimoTable', 'New-DocumentimoText', 'New-DocumentimoTOC') |