Powershell, как скопировать () рабочий лист и сохранить его как собственную книгу

Я не очень хорошо разбираюсь в PowerShell, но я пишу сценарий, который открывает файл Excel, считывает содержимое из файла .txt и передает эти данные в таблицу Excel. Введенные данные будут давать значения диаграмме на другом листе. Я хочу спросить пользователя, хотят ли они создать копию этой диаграммы или нет (не всегда требуется). Если пользователь захочет, он скопирует только рабочий лист диаграммы и сохранит как свою собственную книгу (..copyedChart.xls ).

Теперь я знаю, что когда я использую функцию .Copy (), она берет текущий активный лист и уже открывает новый экземпляр Excel. Моя проблема заключается в том, чтобы на самом деле «контролировать» этот новый экземпляр Excel, у меня возникли проблемы с пониманием того, как на самом деле вызвать этот лист и сохранить его.

Вот что у меня есть ..

#Create an instance of Excel
$excel = New-Object -comobject Excel.Application

Write-Host "Initializing applications.."   #all Write-Host are for the users..

#declaring sheet names.. 
$sheetName = "Sheet1"
$sheetName2 = "Sheet2"

$excel.displayAlerts = $false 


Try{    

    #open Excel file
    [string]$file = "C:\Users\Desktop\test.xls"

    #create a reference to the specified excel workbook
    $workBook = $excel.Workbooks.open($file)

    #activates sheet
    $sheet = $workBook.WorkSheets.Item($sheetName).activate()

    $excel.Visible = $true

    $data = Get-Content C:\Users\Desktop\input.txt  

}#end try

Catch{
    Write-Host "An error has occured."
}#end catch


Write-Host "Inputting new data.."

$i = 0
$rowNumber = 2

#Im just parsing the input.txt and spitting it out into excel
foreach($row in $data){    
    if($row){   
        [Array] $index = $row.Split(" ")
        $i++
        $column = 1

        if($i -ge 1){    
                foreach($item in $index){          
                    $excel.Cells.Item($rowNumber, $column) = "$item"
                    $column++
                }#end foreach  
             $rowNumber++             
        }#end if $i          
    }#end if $row
}#end foreach

$date = $excel.Cells.Item(2, 1).Value().toString("MMMM-dd-yyyy")       #row, column 

#changes the active sheet
$sheet2 = $workBook.Sheets.Item($sheetName2).Select()

#references the active chart on the active page
$chart = $workBook.ActiveChart

Write-Host "Updating charts.."

#changes the title of the chart to include the current date    
$chart.ChartTitle.Text = "Some title - $date"

#saves the files to these locations
$save = 'C:\Users\Desktop\'+$date+'-text.xls'
$saveChartCopy = 'C:\Users\Desktop\'+$date+'-CHARTCOPY.xls'

Write-Host "Saving new file.."

#save this workbook
$workBook.SaveAs($save)


#asks the user if they would like to create a copy of the chart
$makeCopy = Read-Host ("Would you like to create a copy of the chart? (y/n)")

#-----------------------------------------------------------STUCK HERE
#if yes, copy and save the chart as a new workbook.
if($makeCopy -eq "y" -or $makeCopy -eq "Y"){

    $copiedChart = $chart.Copy()           #Copies the chart and opens into a new instance of excel...    
    $copiedChart.SaveAs($saveChartCopy)    #My sad attempt at trying to save the copied chart...
}

#if no, than close excel
elseif($makeCopy -eq "n" -or $makeCopy -eq "N"){

    #close excel
    Write-Host "Closing Excel.."
    $excel.Quit()
    Write-Host "Complete!"
}

else{
    Read-Host "Please enter a valid option!"
}

Если есть какая-то путаница в том, что я спрашиваю, спросите, и я постараюсь объяснить дальше.

Кроме того, поскольку я новичок в PowerShell, и я вроде как программист-новичок ... Я открыт для любого другого ввода в отношении моего кода.


person BRBT    schedule 28.01.2014    source источник
comment
Это то, что вы ищете? stackoverflow.com/questions/3226096/   -  person Adi Inbar    schedule 28.01.2014
comment
@AdiInbar У них уже есть конечный файл, я пытаюсь создать конечный файл из функции .Copy () (потому что он уже открывает новый экземпляр Excel и создает новую книгу с .copy () в качестве рабочего листа) , и сможете управлять этой новой книгой. Я не знаю, как вызвать новый экземпляр Excel и управлять им   -  person BRBT    schedule 28.01.2014


Ответы (2)


Вам необходимо создать новый объект книги с помощью $ Excel.Workbooks.add ():

$NewWorkBook = $Excel.Workbooks.Add()
# Copy and paste your sheet
$NewWorkBook.SaveAs($FileName)
$NewWorkBook.Close()
person Andy Chen    schedule 10.02.2014
comment
Это просто создает еще одну книгу. Использование .Copy() уже сделает это ... Я просто не знаю, как взаимодействовать с этой новой скопированной книгой - person BRBT; 11.02.2014
comment
$ NewWorkBook - это еще один объект Workbook, подобный тому, с которым вы взаимодействуете. Используйте его как хотите. - person Andy Chen; 04.03.2014

Если я правильно понимаю вашу проблему (и сообщите мне, если я не понимаю), все, что вам нужно сделать, это поймать дескриптор новой книги в другой переменной. Мне самому это было любопытно, и я решил бросить что-нибудь быстрое и грязное, чтобы поиграть с этим. Попробуйте что-то вроде этого:

$Excel = New-Object -ComObject "Excel.Application"

$Workbook = $Excel.Workbooks.Add()
$Sheet = $Workbook.Worksheets.Item(1)
$Excel.Visible = $true
$Cells = $Sheet.Cells

$Workbook2 = $Excel.Workbooks.Add()
$Sheet2 = $Workbook2.Worksheets.Item(1)
$Cells2 = $Sheet2.Cells    

$Cells.Item(1,1) = "Book 1"
$Cells2.Item(1,1) = "Book 2"

$Workbook.Close()
$Workbook2.Close()
$Excel.Quit()
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($Excel)

Кроме того, не забудьте очистить этот ComObject!

person Telestia    schedule 06.03.2014
comment
Да, моя проблема в том, что я не могу понять, как обращаться с новой книгой, которую я получаю, когда использую .Copy(). Я хочу сохранить эту новую книгу или копию под другим именем. Также я хочу иметь возможность .Copy() 2 рабочих листа и иметь их в своей собственной книге. Попробуйте запустить .Copy() на листе, и вы поймете, что я имею в виду. Также не могли бы вы объяснить или указать мне, что означает ваша последняя строчка? [System.Runtime.Interopservices.Marshal]::ReleaseComObject($Excel) - person BRBT; 07.03.2014
comment
Это просто освобождает процесс Excel. Если вы запустите свой сценарий несколько раз, не вызывая его, у вас может быть одновременно запущено несколько экземпляров EXCEL.exe. На самом деле я какое-то время не знал об этом. Однажды я проверил свой диспетчер задач, и у меня было около 9 запущенных. Я займусь проблемой копирования сегодня. - person Telestia; 07.03.2014