2014-04-17 138 views
0

這裏是我的查詢來執行sql服務器並將結果存儲在Excel中。格式化SQL服務器結果

我什麼不能做到的,是

1)製作標題的字體大小16和大膽。

2)標題背景顏色爲藍色。

3)所有的記錄都是有界的。

4)有一個名爲Status的列顯示成功,失敗。我想在顏色上假設失敗紅色,成功綠色

$query = "Select [Job Name],(SUBSTRING(run_duration, 1, 2) + ':' + SUBSTRING(run_duration, 3, 2) + ':' + 
    SUBSTRING(run_duration, 5, 2)) AS run_duration,run_date , 

    (SUBSTRING(run_Time, 1, 2) + ':' + SUBSTRING(run_Time, 3, 2) + ':' + 
    SUBSTRING(run_Time, 5, 2)) AS [Job _Started Time] 

    from (

     Select k.name as [Job Name], run_date, 
    [run_duration] = ((RIGHT('000000' + CONVERT(varchar(6), run_duration), 6))), 
    ((RIGHT('000000' + CONVERT(varchar(6), run_Time), 6))) as 
    Run_Time from Msdb..sysjobhistory j inner join msdb ..sysjobs k 
     on K.job_ID=j.Job_ID 
     Where run_date=CONVERT(VARCHAR(10), GETDATE(), 112) and step_id=0 
     ) a " 
    Get-process *Excel* |Stop-process 
     $csvFilePath = "c:\Powershell\Jobs.csv" 
     $excelFilePath = "c:\Powershell\Jobs1.xls" 

     write-host "Executing query against server: Localhost " 
    $results = Invoke-Sqlcmd -Query $query 

    write-host "Saving Query Results in CSV format..." 
     $results | export-csv $csvFilePath -NoTypeInformation 

     write-host "Converting CSV output to Excel..." 
     $excel = New-Object -ComObject excel.application 
     $excel.visible = $true 
     $excel.displayalerts=$False 
     $workbook = $excel.Workbooks.Open($csvFilePath) 

     $workSheet = $workbook.worksheets.Item(1) 
     $resize = $workSheet.UsedRange 
     $resize.EntireColumn.AutoFit() | Out-Null 
     $xlExcel8 = 56 
    $workbook.SaveAs($excelFilePath,$xlExcel8) 
     $Sheet = $excel.WorkSheets.Item(1) 
    $excel = $null 


    write-host "Results are saved in Excel file: " $excelFilePath 

     Get-process *Excel* |stop-Process -verbose 

回答

0

到目前爲止你做得很好,已經做得很好。我個人更喜歡使用PowerShell社區擴展,因此可以訪問Out-Clipboard,並且可以從PowerShell「複製」並粘貼到Excel中,而無需首先創建CSV文件。這是我的首選,接受或放棄它,它在你的問題上沒有真正的立場。

只需幾行腳本即可完成您想要完成的任務。在自動調整列大小之前,您可能需要這樣做,因爲增加字體大小可能會導致混亂。首先,我們要選擇正在使用的區域:

$range = $workbook.ActiveSheet.UsedRange 

好吧,很簡單。然後讓我們得到的一個子範圍正好位於第一行,你的標題是:

$TitleRow = $range.Rows|?{$_.row -eq 1} 

好吧,現在來修改.Font.Interior屬性的大小和顏色:

$TitleRow.Font.Size = 16 
$TitleRow.Interior.ColorIndex = 5 #Depends on the default color palate, but the standard one makes this blue 

最後,我們將使用Range.BorderAround方法應用邊框。現在,該方法使用幾個參數,即線型,線重量和線顏色。對於樣式,1 =連續(與點,虛線等)。對於Weight,2 = Thin,這是默認值。對於顏色,0 =黑色。

$range.BorderAround(1,2,0) 

有你有它,標題行都有一個大小爲16的字體和藍色背景色,以及整個區域周圍有邊框。

現在,失敗/成功位有點更具挑戰性。首先,我們需要找到狀態欄,讓我們搜索細胞中的單詞狀態的範圍內,並確保它的第一行,並抓住這列編號:

$Status = $range.cells|?{$_.row -eq 1 -and $_.value2 -match "status"}|select -ExpandProperty Column 

好了,現在調整各該列中的單元格。我將運行一個ForEach循環,處理找到Status標題的列號中的每個單元格。在那個循環中,我將確保我們正在調整的單元格不是第一行(以免弄亂標題行),然後如果它與「失敗」的文本顏色匹配爲紅色,則將其顏色變爲綠色(再次確保它不是標題行):

foreach($Cell in ($range.Columns | ?{$_.column -eq $status}).Cells){ 
    if($Cell.value2 -match "Failure" -and !($Cell.Row -eq 1)){ 
     $Cell.Interior.ColorIndex = 3 
    }elseif(!($Cell.Row -eq 1)){ 
     $Cell.Interior.ColorIndex = 4 
    } 
} 

然後你去,根據需要格式化。