2017-06-07 1 views
0

J'ai un peu de mal à supprimer certaines lignes dans Excel en utilisant PowerShell, actuellement j'ai supprimé certaines colonnes qui ont leur en-tête contenant un certain mot (qui, pour une raison quelconque, n'a pas fonctionné complètement J'avais l'intention mais j'ai fait des concessions pour le faire fonctionner) et maintenant je dois supprimer toutes les lignes dans le dossier d'Excel après un certain point, j'ai essayé de nombreuses méthodes et aucun d'entre eux ne semble fonctionner, presque tout ce qui est commenté est un essai précédent qui n'a pas fonctionné, si quelqu'un a des conseils ou des solutions possibles, je voudrais vraiment l'aide. Voici mon code ci-dessous.Impossible de supprimer toutes les lignes dans Excel via Powershell

#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 

Je ne comprenait la « mauvaise liste » parce que certaines colonnes werent supprimés et pour une raison quelconque et je n'inclus l'autre colonne de suppression des boucles parce que certains étaient toujours pas supprimés, mais ce n'est pas la question principale, Le problème principal est que, peu importe ce que j'essaie de faire en boucle pour supprimer toutes les lignes après un certain point, il ne fonctionnera pas, parfois une, ou une demi-colonne de toutes les lignes, mais jamais toutes.

Répondre

0

Vous étiez presque là avec un de vos essais. Utilisez le code suivant, quand $ START_DELETE est connu, toutes les lignes de la ligne de START_DELETE $ seront supprimés:

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

pour l'utiliser importent le -le, ce sera aussi supprimer la dernière ligne. L'utilisation de $start_delete comme indication pour la ligne, garantira que la même ligne est supprimée à chaque fois, car le fichier est réduit.

+0

J'ai essayé cela, et logiquement il devrait fonctionner comme un couple de mes autres essais, mais il ne le fait pas, je crois que le problème n'est pas avec le code à ce stade, il est avec le fichier CSV réel, parce que j'ai essayé approche différente et essayé d'exporter certaines colonnes, et n'a rien fait avec les lignes, et il n'a même pas exporter les colonnes, seulement les en-têtes qui était très étrange parce que j'ai copié le code directement à partir d'une source fiable – Ferozi