这是我对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
答案 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
}
}
然后你去,根据需要进行格式化。