Take this one, see comments:
Add-Type -AssemblyName Microsoft.Office.Interop.Excel
# create dummy datatable with 2 colums
$dt = New-Object System.Data.DataTable
[void]$dt.Columns.Add('Column1',[string]::empty.GetType() )
[void]$dt.Columns.Add('Column2',[string]::empty.GetType() )
#fill datatable
for( $i = 0; $i -lt 10; $i++ ) {
$row = $dt.NewRow()
$row.Column1 = 'Hello' + $i.ToString()
$row.Column2 = 'World' + $i.ToString()
[void]$dt.Rows.Add( $row )
}
# to move a datatable to excel, it must be an n-dimensional array of objects
# move datatable to object-array:
$excelArray = New-Object 'object[,]' $dt.Rows.Count, $dt.Columns.Count
for( $i = 0; $i -lt $dt.Rows.Count; $i++ ) {
$excelArray[$i, 0] = $dt.Rows[$i].Column1
$excelArray[$i, 1] = $dt.Rows[$i].Column2
}
# open excel file
$excelFile = 'D:\test\emptySheet.xlsx'
$excel = New-Object -ComObject Excel.Application
$excel.Visible = $true
$excel.ScreenUpdating = $true
$workbook = $excel.Workbooks.Open( $excelFile ,$null, $false )
$ws = $workbook.WorkSheets.item(1)
[void]$ws.Activate()
# select range
$range = $ws.Range('A1', ([char](64 + $dt.Columns.Count)).ToString() + ($dt.Rows.Count).ToString() )
# copy aray to excel range
$range.Value2 = $excelArray
# save and cleanup
[void]$workbook.Save()
[void]$workbook.Close()
[void]$excel.Quit()
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($excel) | Out-Null