Powershell:Excel将工作表组合到一个工作表中

时间:2015-01-23 01:47:42

标签: arrays excel powershell

我有一些网络脚本,我已经适应运行7个T-SQL查询并将结果输出到1个Excel工作簿,每个查询一个工作表。我刚刚被问到是否可以将所有7个工作表合并为一个。

这是我的示例代码,它复制了一个工作表,但是选择了整个列而不仅仅是UsedData。此外,目标工作表上的第一个工作表数据将替换为第二个工作表数据。

问题:让Powershell将7个查询输出到由两个空白行分隔的One Excel工作表中会更简单吗?或修改现有的Powershell脚本以创建7个工作表,然后将它们合并为一个?

代码不漂亮!我也很遗憾地使用$Excel = New-Object -ComObject excel.application后跟$Excel | Get-Member来探索如何让PowerShell与Excel一起使用。 MSDN上的引用通常用于VB或C语言,我无法将其转换为PowerShell。

- 编辑,添加将7个查询结果存储在数组中的代码并输出到控制台。数据是正确的,但我只是不确定如何将数据传输到单个Excel工作表中。

$docs = "C:\Temp\SQL\test.xlsx"
If (Test-Path $docs){Remove-Item $docs}
Function First-Query {
param([string[]]$queries)
$xlsObj = New-Object -ComObject Excel.Application
$xlsObj.DisplayAlerts = $false
## - Create new Workbook and Sheet (Visible = 1 / 0 not visible)
$xlsObj.Visible = 0
$xlsWb = $xlsobj.Workbooks.Add(1)
$xlsSh = $xlsWb.Worksheets.Add([System.Reflection.Missing]::Value, $xlsWb.Worksheets.Item($xlsWb.Worksheets.Coun))
$xlsSh.Name = 'Test'
for ($i = 0; $i -lt $queries.Count; $i++){
$query = $queries[$i]
$SQLServer = 'Server'
$Database = 'DataBase'
## - Connect to SQL Server using non-SMO class 'System.Data':
$SqlConnection = New-Object System.Data.SqlClient.SqlConnection
$SqlConnection.ConnectionString = "Server = $SQLServer; Database = $Database; Integrated Security = True"
$SqlCmd = New-Object System.Data.SqlClient.SqlCommand
$SqlCmd.CommandText = $query
$SqlCmd.Connection = $SqlConnection
## - Extract and build the SQL data object '$DataSetTable':
$SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter
$SqlAdapter.SelectCommand = $SqlCmd;
$tables = New-Object System.Data.DataSet;
$SqlAdapter.Fill($tables)
$TableArray = @($tables)
$SqlConnection.Close()
$DataSetTable = $TableArray.Tables[0]
}#End For Loop
## - Build the Excel column heading:
[Array] $getColumnNames = $DataSetTable.Columns | Select ColumnName;
## - Build column header:
[Int] $RowHeader = 1;
foreach ($ColH in $getColumnNames){
$xlsSh.Cells.item(1, $RowHeader).font.bold = $true;
$xlsSh.Cells.item(1, $RowHeader) = $ColH.ColumnName;
$RowHeader++;
}
## - Adding the data start in row 2 column 1:
[Int] $rowData = 2;
[Int] $colData = 1;
foreach ($rec in $DataSetTable.Rows){
foreach ($Coln in $getColumnNames){
## - Next line convert cell to be text only:
$xlsSh.Cells.NumberFormat = "@";
## - Populating columns:
$xlsSh.Cells.Item($rowData, $colData) = `
$rec.$($Coln.ColumnName).ToString()
$ColData++
}
$rowData++; $ColData = 1
}
## - Adjusting columns in the Excel sheet:
$xlsRng = $xlsSH.usedRange
$xlsRng.EntireColumn.AutoFit() | Out-Null
#End for loop.
#Delete unwanted Sheet1.
$xlsWb.Sheets.Item('Sheet1').Delete()
#Set Monday to Active Sheet upon opening Workbook.
$xlsWb.Sheets.Item('Monday').Activate()
## ---------- Saving file and Terminating Excel Application ---------- ##
$xlsFile = "C:\Temp\SQL\test.xlsx"
$xlsObj.ActiveWorkbook.SaveAs($xlsFile) | Out-Null
$xlsObj.Quit()
## - End of Script - ##
start-sleep 2
While ([System.Runtime.Interopservices.Marshal]::ReleaseComObject($xlsRng)) {'cleanup xlsRng'}
While ([System.Runtime.Interopservices.Marshal]::ReleaseComObject($xlsSh)) {'cleanup xlsSh'}
While ([System.Runtime.Interopservices.Marshal]::ReleaseComObject($xlsWb)) {'cleanup xlsWb'}
While ([System.Runtime.Interopservices.Marshal]::ReleaseComObject($xlsObj)) {'cleanup xlsObj'}
[gc]::collect() | Out-Null
[gc]::WaitForPendingFinalizers() | Out-Null
}#End Function
$queries = @()
$queries += @'
SELECT DISTINCT
'@
First-Query -queries $queries

1 个答案:

答案 0 :(得分:0)

不确定我真的明白你的问题是什么,但下面是一个可以帮助你做你想做的“模板”。它向您展示了如何创建工作表并处理它们。您必须填写空白(请参阅注释部分,您必须在其中调用查询功能)。

param (
    [string] $ExcelFile = (Read-Host "Enter full path for Excel file")
)

try
{
    $Error.Clear()

    # http://support.microsoft.com/kb/320369
    [System.Threading.Thread]::CurrentThread.CurrentCulture = [System.Globalization.CultureInfo] "en-US"

    Push-Location
    $scriptPath = Split-Path -parent $MyInvocation.MyCommand.Path

    Set-Location $scriptPath

    $Excel = New-Object -comobject Excel.Application
    $Excel.Visible = $True

    $WorksheetCount = 7

    $Workbook = $Excel.Workbooks.Add()
    $Workbook.Title = 'My Workbook'


    $weekdays = @("Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday")


    ($WorksheetCount - 1)..0 | %{

        $sheet = $Excel.Worksheets.Add()
        $sheet.Name = $weekdays[$_]

        # $dataTable = Execute-Your-Query-Here-Returning-A-Data-Table

        # $x = 0
        # $dataTable | %{
            # $sheet.cells.item($x, 1) =  ...
            # $sheet.cells.item($x, 2) =  ...
            # $x++
        # }
    }   

    $excel.ActiveWorkbook.SaveAs("$ExcelFile")
 }

catch
{
    "$($MyInvocation.InvocationName): $Error"
}

finally
{
    Pop-Location

    $Excel.Quit()
    $Excel = $null

    [gc]::collect()
    [gc]::WaitForPendingFinalizers()
}