записать данные в Excel, используя PowerShell из таблицы SQL - PullRequest
0 голосов
/ 01 мая 2018

У меня есть файл .xlsx, который был преобразован в таблицу данных с помощью oledb provider. Теперь я хочу добавить значение к этому .xlsx на основе данных таблицы sql, которые у меня есть
(который также конвертируется в CSV-файл Book1.csv)

Таблица sql состоит из имени и примечаний ...
Где столбец имени одинаков как в файле .xlsx, так и в переменной sql $sql

Я хочу добавить эти закрывающие примечания к столбцу f файла .xlsx, если значение имени совпадает со значением столбца sql таблицы «A». Первый, который я написал ниже, очень медленный и неэффективный.
Любая помощь будет принята с благодарностью.

$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 голосов
/ 01 мая 2018

Похоже, вы ответили на мой вопрос о том, куда "Небраска" попадает в данные.

Убедитесь, что все объекты 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...