2017-06-07 4 views
0

Ich habe ein wenig Probleme beim Löschen bestimmter Zeilen in Excel mit PowerShell, derzeit habe ich bestimmte Spalten gelöscht, deren Header ein bestimmtes Wort enthält (was aus irgendeinem Grund nicht vollständig als funktioniert Ich beabsichtigte, aber ich machte Zugeständnisse, damit es funktioniert) und jetzt muss ich alle Reihen in der Excel-Datei ab einem bestimmten Punkt löschen, ich habe zahlreiche Methoden ausprobiert und keiner von ihnen scheint zu funktionieren, fast alles, was auskommentiert ist, ist vorheriger Versuch, der nicht funktioniert hat, wenn jemand irgendwelche möglichen Tipps oder Lösungen hat, würde ich wirklich die Hilfe lieben. Hier ist mein Code unten. Kann nicht alle Zeilen in Excel durch Powershell löschen

#list of columns wanted 
$want_list = ("CustomerCompanyName","InvoiceNumber","ChargeStartDate","ChargeEndDate", 
"SubscriptionId","ServiceName","ServiceType","ResourceName","Region","ConsumedQuantity", 
"IncludedQuantity","OverageQuantity","ListPrice","PretaxCharges","ChargeType","DomainName") 
$bad_list = ("PartnerId","PartnerName","PartnerBillableAccountId","MpnId","SubscriptionName", 
"SubscriptionDescription","OrderId","ResourceGuid","Sku","DetailLineItemId","TaxAmount", 
"PostTaxTotal","Currency","PretaxEffectiveRate","PostTaxEffectiveRate","CustomerId") 

$file = Read-Host "Enter Billing Info Location: example C:\Users\tyarn\Desktop\Billing_Folder\Billing_Info.csv" 
    #create new object 
    $excel = New-Object -ComObject Excel.Application 
    $excel.DisplayAlerts = $false 
    $excel.visible = $false 

    #open csv file 
    $workbook = $excel.WorkBooks.open($file) 
    $sheet = $workbook.Sheets.Item(1) 

    #get num columns 
    $num_cols = $sheet.UsedRange.Columns.Count 



    #for loop with deleting entire column if name of column isnt in list 
    For($i=1;$i -lt $num_cols;$i++){ 
     if($sheet.Cells.Item(2,$i).Text -notin $want_list){[void]$sheet.Cells.Item(2,$i).EntireColumn.Delete()} 
     if($sheet.Cells.Item(2,$i).Text -in $bad_list){[void]$sheet.Cells.Item(2,$i).EntireColumn.Delete()} 
     if($sheet.Cells.Item(2,$i).Text -eq "OrderId"){[void]$sheet.Cells.Item(2,$i).EntireColumn.Delete()} 
     if($sheet.Cells.Item(2,$i).Text -eq "Currency"){[void]$sheet.Cells.Item(2,$i).EntireColumn.Delete()} 
     if($sheet.Cells.Item(2,$i).Text -eq "PretaxEffectiveRate"){[void]$sheet.Cells.Item(2,$i).EntireColumn.Delete()} 
     if($sheet.Cells.Item(2,$i).Text -eq "PartnerId"){[void]$sheet.Cells.Item(2,$i).EntireColumn.Delete()} 
    } 
    ##Regular for loop going through and deleteing every row after a certain point doesnt work 
    #get number of rows 
    $num_rows = $sheet.UsedRange.Rows.Count 
    #doesnt work yet 
    #loop deleting unneeded rows 
    #$truth_value = 0 
    #For($i = 1; $i -lt $num_rows+1;$i++){ 
    #if($sheet.Cells.Item($i,1).Text -eq ""){ 
    #$truth_value = 1 
    #For($j = $i;$j-lt $num_rows; $j++){ 
    #[void]$sheet.Cells.Item($j,1).EntireRow.Delete()} 
    #} 
    #if($truth_value -eq 1){break} 
    #} 

    #new try 
    ##find row to start delete on 
    $row_start = $null 
    For($j=1;$j -lt $num_rows;$j++){ 
     if($sheet.Cells.Item($j,1).Text -eq "Daily Usage"){ 
      $row_start = $j 
      $start_delete = $row_start 


     } 
    } 
    ##deleting row 56 everytime cause it moves up one when its deleted? doesnt work dont think 
    #For($row_start;$row_start -lt $num_rows; $row_start++){ 
     # [void]$sheet.Cells.Item($row_start,1).EntireRow.Delete() 
     #$start_delete +=1 
    #} 

    #long solution 
    #For($i=1;$i -lt $num_cols;$i++){ 
     # For($j=$start_delete;$j -lt $num_rows;$j++){ 
      # [void]$sheet.Cells.Item($i,$j).clear() 
     # } 
    # } 
    ##GET RID OF 
    #save 
    $file_name = Read-Host "What would you like the new files name to be" 
    #must create a folder for this 
    $workbook.SaveAs("C:\Users\tyarn\desktop\New_Billing\$file_name") 

    #close and release com 
    $workbook.Close($true) 
    $excel.Quit() 
    [void][System.Runtime.Interopservices.Marshal]::ReleaseComObject($excel) 
    Remove-Variable excel 

I enthalten nur die „schlechte Liste“, da einige Spalten gelöscht und aus irgendeinem Grunde werent sind und ich nur enthalten die anderen Löschspalte für Schleifen, weil noch einige nicht gelöscht wurden, aber das ist nicht das Hauptproblem, Das Hauptproblem ist, dass egal, was ich versuche, alle Zeilen zu löschen, nach einem bestimmten Punkt wird es nicht arbeiten, es manchmal eine oder eine halbe Spalte aus allen Zeilen, aber nie alle.

Antwort

0

Sie waren fast mit einem Ihrer Versuche dort. Verwenden Sie den folgenden Code, wenn $ START_DELETE bekannt ist, werden alle Zeilen aus dem $ START_DELETE Reihe wird gelöscht:

For($j = $start_delete; $j -le $num_rows; $j++){ [void]$sheet.Cells.Item($start_delete,1).EntireRow.Delete() }

importent es zu benutzen, die -le, wird dies auch die letzte Zeile löschen. Mit $start_delete als Anzeige für die Zeile wird sichergestellt, dass die gleiche Zeile jedes Mal gelöscht wird, da die Datei schrumpft.

+0

Ich versuchte dies, und logisch sollte es funktionieren wie ein paar meiner anderen Versuche, aber es nicht, ich glaube, das Problem ist nicht mit dem Code an dieser Stelle ist es mit der eigentlichen CSV-Datei, weil ich versucht habe anderen Ansatz und versucht, bestimmte Spalten zu exportieren, und nichts mit den Zeilen, und es hat nicht einmal die Spalten, nur die Header, die sehr seltsam war, weil ich den Code direkt aus einer seriösen Quelle kopiert – Ferozi

Verwandte Themen