Here is a script to export object data to an Excel document.
#requires -version 2 <# .SYNOPSIS This script takes a regular PowerShell object as input and creates a Microsoft Excel document out of it. .PARAMETER InputObject This is the object that will be converted into an Excel document. .PARAMETER WorksheetName The name of the worksheet created. If no name is given the default (Sheet1) will be used. .PARAMETER FormatAsList If you want the worksheet formated as a list, enable it with this parameter and use ListStyle to define what list style you would like to use. .PARAMETER ListStyle Defines what list style you would like to use for formatting. The default is "ListStyleLight1". .PARAMETER AutoFit This parameter is on by default, and will autofit all the columns. .PARAMETER SplitColumn Defines at what column you would like to do a split. Default value is 0 (off). .PARAMETER SplitRow Defines at what row you would like to do a split. Default value is 1 (first row). .PARAMETER FreezePanes This parameter is true by default and will freeze the panes based on the split values. .PARAMETER SaveAs Path and name of the output file. If this paramter is not defined the default path will be used and the file will be named "excel-out.xlsx" .EXAMPLE Get-Service | Select-Object Name,DisplayName,Status | .\Export-Excel.ps1 -SaveAS c:\Services.xlsx This will generate an Excel document with information about all running services, and save it as Services.xlsx at c:\ .EXAMPLE Get-Service | .\Export-Excel.ps1 -FormatAsList -SplitColumn 1 -SaveAs c:\Services.xlsx This will generate a fully formated report of all services on a computer, saved at c:\services.xlsx .LINK http://www.lucd.info/2010/05/29/beyond-export-csv-export-xls/ LucD created a similar script .DESCRIPTION This script will take any PowerShell object and genereate an Excel document with the result. You can choose to format the list using Excel List Styles as well. Note that the script will create a temporary CSV file at the location you are running it from. This file will be deleted before the script is finished. #> [CmdletBinding()] param( [Parameter(ValueFromPipeline = $true, Mandatory = $true)] $InputObject, [String]$WorksheetName, [switch]$FormatAsList = $false, [string]$ListStyle = "TableStyleLight1", [switch]$AutoFit = $true, [int]$SplitColumn = 0, [int]$SplitRow = 1, [switch]$FreezePanes = $true, [string]$SaveAs ) BEGIN { function Release-Ref ($ref){ ([System.Runtime.InteropServices.Marshal]::ReleaseComObject([System.__ComObject]$ref) -gt 0) [System.GC]::Collect() [System.GC]::WaitForPendingFinalizers() } function Set-Culture([System.Globalization.CultureInfo]$Culture){ [System.Threading.Thread]::CurrentThread.CurrentUICulture = $Culture [System.Threading.Thread]::CurrentThread.CurrentCulture = $Culture } ## Get the current location and set path for temp csv file $CurrentLocation = Get-Location $csv = $CurrentLocation.Path + "\tmp.csv" ## Check if Excel is installed $wmi = Get-WmiObject Win32_Product | Where-Object {$_.Caption -match "excel"} if (!$wmi){ Write-Host "Excel not installed - aborting..." Break } ## Take a note of the original culture and compare with the language of Excel. If Excel is in english but the culture is not, change the culture to prevent known errors! $originalCulture = Get-Culture if (($wmi.caption -match "english") -and ($originalCulture.Name -ne "en-US")){Set-Culture en-US} $array = @() } PROCESS {$array += $InputObject} END { ## Export object to CSV $array | Export-CSV $csv -NoTypeInformation -Encoding UTF8 ## Create excel object $excel = New-Object -ComObject Excel.Application $excel.DisplayAlerts = $false $excel.Visible = $false ## Add default workbooks and delete two of them $workbook = $excel.workbooks.add() $workbook.worksheets.item(2).delete() $workbook.worksheets.item(2).delete() ## Define first workbook as our worksheet, and name it $worksheet = $workbook.worksheets.item(1) if ($WorksheetName){$worksheet.name = $WorksheetName} ## Open CSV file to a temporary worksheet $tmpCSV = $excel.workbooks.open("$csv") $tmpsheet = $tmpCSV.worksheets.item(1) ## Copy data from the temporary worksheet to our regular worksheet $tmpsheet.UsedRange.Copy()|out-null $worksheet.Paste() ## Close the temporary worksheet $tmpCSV.close() ## Define range before we start formatting $range = $worksheet.UsedRange ## Define the range as a List Object and add a Table Style if ($FormatAsList){ $listObject = $worksheet.ListObjects.Add([Microsoft.Office.Interop.Excel.XlListObjectSourceType]::xlSrcRange,$range,$null,[Microsoft.Office.Interop.Excel.xlYesNoGuess]::xlYes,$null) $listObject.TableStyle = $ListStyle } ## Adjust the colum width if ($AutoFit){$range.EntireColumn.AutoFit()|out-null} ## Define the first row as a new range, and format it bold $firstRow = $worksheet.Range("1:1") $firstRow.font.bold = $true ## Define splits and freezes: I want first row and first column to split and frozen $worksheet.application.activewindow.splitcolumn = $SplitColumn $worksheet.application.activewindow.splitrow = $SplitRow $worksheet.application.activewindow.freezepanes = $FreezePanes ## Define A1 as a new range to "de-select" the entire used range $newRange = $worksheet.Range("A1") $newRange.Select()|out-null if (!$SaveAs){$SaveAs = $CurrentLocation.Path + "\excel-out.xlsx"} ## Save the workbook $workbook.saveas("$SaveAs") ## Quit Excel and clean up $excel.quit() Release-Ref($range)|out-null Release-Ref($firstRow)|out-null Release-Ref($newRange)|out-null Remove-Item $csv Set-Culture $originalCulture }