Skip to content Skip to sidebar Skip to footer

How To Format An Object Into A Nice Html Table?

I have 2 scripts script1 has the following: $exportObject = New-Object System.Collections.ArrayList $exportObject | Select-Object in script2, i am calling script1 to do something

Solution 1:

You can be as creative as you like with HTML styling of course. Below code styles the table like this:

enter image description here

# just some fake data here$exportObject = @(
    [PSCustomObject]@{
        'Server' = 'Server1.com''Cube' = 'Cube1''Connection Details' = 'Connection changed!'
    },
    [PSCustomObject]@{
        'Server' = 'Server2.com''Cube' = 'Cube2''Connection Details' = 'Connection Unchanged!'
    },
        [PSCustomObject]@{
        'Server' = 'Server3.com''Cube' = 'Cube3''Connection Details' = 'Connection changed!'
    }
)

functionConvertTo-HTMLTable ($obj) {
    # Accepts a System.Data.DataTable object or an array of PSObjects and converts to styled HTML table# add type needed to replace HTML special characters into entities
    Add-Type -AssemblyName System.Web

    $sb = New-Object -TypeName System.Text.StringBuilder
    [void]$sb.AppendLine('<table>')
    if ($null -ne $obj) {
        if (([object]$obj).GetType().FullName -eq 'System.Data.DataTable'){
            # it is a DataTable; convert to array of PSObjects$obj = $obj | Select-Object * -ExcludeProperty ItemArray, Table, RowError, RowState, HasErrors
        }
        $headers = $obj[0].PSObject.Properties | Select -ExpandProperty Name
        [void]$sb.AppendLine('<thead><tr>')
        foreach ($column in $headers) {
            [void]$sb.AppendLine(('<th>{0}</th>' -f [System.Web.HttpUtility]::HtmlEncode($column)))
        }
        [void]$sb.AppendLine('</tr></thead><tbody>')
        $row = 0$obj | ForEach-Object {
            # add inline style for zebra color rowsif ($row++ -band 1) {
                $tr = '<tr style="background-color: {0};">' -f $oddRowBackColor
            } 
            else {
                $tr = '<tr>'
            }
            [void]$sb.AppendLine($tr)
            foreach ($column in $headers) {
                [string]$val = $($_.$column)
                if ([string]::IsNullOrWhiteSpace($val)) { 
                    $td = '<td>&nbsp;</td>' 
                } 
                else { 
                    $td = '<td>{0}</td>' -f [System.Web.HttpUtility]::HtmlEncode($val)
                }
                [void]$sb.Append($td)
            }
            [void]$sb.AppendLine('</tr>')
        }

        [void]$sb.AppendLine('</tbody>')
    }
    [void]$sb.AppendLine('</table>')

    return$sb.ToString()
}


$headerBackColor = '#4F81BD'# backgroundcolor for column headers$oddRowBackColor = '#DCE6F1'# background color for odd rows$style = @"
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <title>Report</title>
    <meta name="generator" content="PowerShell" />
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <style type="text/css">
    body {
        font-family: Verdana, Arial, Geneva, Helvetica, sans-serif;
        font-size: 12px;
        color: black;
    }
    table, td, th {
        border-color: black;
        border-style: solid;
        font-family: Verdana, Arial, Geneva, Helvetica, sans-serif;
        font-size: 11px;
    }
    table {
        border-width: 001px 1px;
        border-spacing: 0;
        border-collapse: collapse;
    }

    td, th {
        margin: 0;
        padding: 4px;
        border-width: 1px 1px 00;
        text-align: left;
    }
    th {
        color: white;
        background-color: $headerBackColor;
        font-weight: bold;
    }
    </style>
"@

$body = '{0}</head><body>{1}</body></html>' -f $style, (ConvertTo-HTMLTable $exportObject)

Send-MailMessage -From $FromEm -Subject $Subject -To "user@domain.com" -Body $body -BodyAsHtml -SmtpServer $SmtpServer -Port $Port -Credential $Creds -UseSsl

Two examples to do table styling that mimic the MS Word Grid Table 5 Dark Accent 5 can be found here

Hope that helps

Solution 2:

Not sure what's going wrong for you. This works for me:

$Body = Get-ChildItem C:\Windows\ -File | 
    Select-Object -Property Name, Length, LastWriteTime -First 10 |
    ConvertTo-Html -As Table -Head '<style type="text/css">th,td { text-align:center; }</style>' |
    Out-String

Send-MailMessage -SmtpServer $SmtpServer -UseSsl -Subject $Subject -To $To -From$From -Body $Body -BodyAsHtml

Post a Comment for "How To Format An Object Into A Nice Html Table?"