【问题标题】:Formatting SQL server results格式化 SQL 服务器结果
【发布时间】:2014-06-02 02:12:54
【问题描述】:

这是我对 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

【问题讨论】:

    标签: excel powershell powershell-3.0


    【解决方案1】:

    到目前为止,您做得很好。就我个人而言,我更喜欢使用 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 = 连续(相对于虚线、虚线等)。对于重量,2 = 薄,这是默认值。对于颜色,0 = 黑色。

    $range.BorderAround(1,2,0)
    

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

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

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

    好的,现在调整该列中的每个单元格。我将运行一个 ForEach 循环,处理我们找到状态标题的列号中的每个单元格。在那个循环中,我将确保我们正在调整的单元格不是第一行(以免与标题行混淆),然后如果它与“失败”的文本匹配,则将其着色为红色,否则将其着色为绿色(再次确保它不是标题行):

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

    然后就可以了,根据需要进行格式化。

    【讨论】:

      猜你喜欢
      • 2023-01-26
      • 1970-01-01
      • 2022-01-19
      • 1970-01-01
      • 2011-01-25
      • 2020-08-08
      • 2017-09-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多