格式化SQL Server结果

时间:2014-04-17 17:11:53

标签: excel powershell powershell-v3.0

这是我对sql server执行的查询并将结果存储在Excel中。

我无法实现的是

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

1 个答案:

答案 0 :(得分: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方法应用边框。现在,该方法使用一些参数,即线型,线宽和线颜色。对于Style,1 =连续(vs点,虚线等)。对于Weight,2 = Thin,这是默认值。对于颜色,0 =黑色。

$range.BorderAround(1,2,0)

你有它,标题行的大小为16字体,背景颜色为蓝色,整个区域都有一个边框。

现在,失败/成功位更具挑战性。首先我们需要找到Status列,所以让我们搜索单词Status的范围内的单元格,并确保它在第一行中,并获取该列号:

$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
    }
}

然后你去,根据需要进行格式化。