使用sql表中的powershell将数据写入excel

时间:2018-05-01 13:52:41

标签: sql powershell

我有一个.xlsx文件,由oledb提供者制作成数据表。现在我想根据我拥有的sql表数据为.xlsx添加值 (也将其转换为csv文件Book1.csv

sql表由名称和备注组成...
其中name列在.xlsx文件和sql变量$sql

中相同

如果name的值与sql table" A"的值匹配,我想在.xlsx文件的f列中添加密切注释。我在下面写的第一栏很慢而且没有效果 任何帮助都将受到高度赞赏。

$Excel = New-Object -ComObject Excel.Application 
$Workbook = $Excel.Workbooks.Open('C:\Users\VIKRAM\Documents\Sample - Superstore.xlsx')
$workSheet = $Workbook.Sheets.Item(1)
$WorkSheet.Name
$Found = $WorkSheet.Cells.Find('$Data.number')
$Found.row
$Found.text
$Excel1 = New-Object -ComObject Excel.Application 
$file = $Excel1.Workbooks.Open('C:\Users\VIKRAM\Documents\Book1.xlsx')
$ff=$file.Sheets.Item(1)
$ff.Name
$ff1=$ff.Range("A1").entirecolumn
$ff1.Value2

foreach ($line in $ff1.value2){

if( $found.text -eq $line)
{
    Write-Host "success"
    $fff=$ff1.Row   
    $WorkSheet.Cells.item($fff,20) =$ff.cells.item($fff,2)
}
}

.xlsx文件中的数据

Number  Priority  Comment
612721  4 - High

Book1.csv中的数据

Number Clo_notes
612721 Order has been closed

我需要更新clo_notes值以在.xlsx文件中注释,如果这个"数字"每个文件中的列匹配将clos_notes更新为相应的注释列

1 个答案:

答案 0 :(得分:1)

看起来你回答了我关于“内布拉斯加州”属于数据的问题。

确保释放任何COM对象,否则您将拥有孤立的Excel进程。

您可以尝试这样的事情。我能够按照您的要求将Clo_notes值写入第6列:

## function to close all com objects
function Release-Ref ($ref) {
    ([System.Runtime.InteropServices.Marshal]::ReleaseComObject([System.__ComObject]$ref) -gt 0)
    [System.GC]::Collect()
    [System.GC]::WaitForPendingFinalizers()
}

## open Excel data
$Excel = New-Object -ComObject Excel.Application 
$Workbook = $Excel.Workbooks.Open('C:\Users\51290\Documents\_temp\StackOverflowAnswers\Excel.xlsx')
$workSheet = $Workbook.Sheets.Item(1)
$WorkSheet.Name

## open SQL data
$Excel1 = New-Object -ComObject Excel.Application 
$file = $Excel1.Workbooks.Open('C:\Users\51290\Documents\_temp\StackOverflowAnswers\SQL.xlsx')
$sheetSQL = $file.Sheets.Item(1)
$dataSQL = $sheetSQL.Range("A1").currentregion

$foundNumber = 0
$row_idx = 1
foreach ($row in $WorkSheet.Rows) {
    "row_idx = " + $row_idx
    if ($row_idx -gt 1) {
        $foundNumber = $row.Cells.Item(1,1).Value2
        "foundNumber = " + $foundNumber

        if ($foundNumber -eq "" -or $foundNumber -eq $null) {
            Break
        }

        foreach ($cell in $dataSQL.Cells) {
            if ($cell.Row -gt 1) {
                if ($cell.Column -eq 1 -and $cell.Value2 -eq $foundNumber) {
                    $clo_notes = $sheetSQL.Cells.Item($cell.Row, 2).Value2
                    Write-Host "success"
                    $WorkSheet.Cells.item($row_idx, 6).Value2 = $clo_notes
                }

            }

        }
    }
    $row_idx++
}


$Excel.Quit()
$Excel1.Quit()

## close all object references
Release-Ref($WorkSheet)
Release-Ref($WorkBook)
Release-Ref($Excel)
Release-Ref($Excel1)