2017-10-16 9 views
0

Win32 Je me bats avec cela et ont rouge beaucoup d'articles montrant comment il devrait fonctionner, mais je n'ai pas le succès:J'essaie de modifier un fichier Excel en utilisant Perl et Ole

Mon système est un ordinateur Windows 7 avec Office 2016 installé et activé. Je souhaite utiliser un fichier Excel comme modèle pour le modifier et l'enregistrer dans un nouvel emplacement. Voici mon code:

sub ExcelWriter { 
    my $Template = "../templates/template.xls"; 
    my $ExcelFile = $MyOutDir."New_Excel_File.xls"; 
    my $Excel = new Win32::OLE('Excel.Application'); 
    if (-f $Template) { 
     my $WorkBook = $Excel->Workbooks->Open($Template); 
     my $WorkSheet = $WorkBook->Worksheets('Overview'); 
     $WorkSheet->Cells(5,3)->{Value} = $Customer; 
     $WorkBook->SaveAs($ExcelFile); 
     $WorkBook->Close(); 
     undef $WorkBook; 
     undef $Excel; 
    } 
} 

Je reçois « Can't call method "Worksheets" on an undefined value at... » Quand je l'utilise « Workbooks->Add » et « Worksheets->Add » pour créer un nouveau classeur, je peux écrire les cellules. Même en sélectionnant Worksheets, travaillez ici! Pour les experts, cela semble évident, mais j'ai dû manquer quelque chose ici. J'ai déjà enregistré mon classeur de ".xlsx" à ".xls" et supprimé toutes les formules etc ... et même créer un nouveau classeur vide!

Merci pour votre aide

Cordialement Laurent

+0

Je pense que je viens de le découvrir. La variable $ Template utilise "../" qui est redirigé avec le module WIN32 :: OLE vers ".... AppData \ Roaming \ Microsoft \ Windows" –

Répondre

0

J'ai modifié le code (en utilisant le fichier ".xlsx" d'origine):

sub ExcelWriter { 
    my ($Volume, $Directory, $File) = File::Spec->splitpath(__FILE__); 
    my $Template = $Volume.$Directory.'..\templates\template.xlsx'; 
    my $ExcelFile = $MyOutDir.'New_Excel_File.xlsx'; 
    my $Excel = new Win32::OLE('Excel.Application'); 
    my $WorkBook = $Excel->Workbooks->Open($Template); 
    my $WorkSheet = $WorkBook->Worksheets('Overview'); 
    $WorkSheet->Cells(5,3)->{Value} = $Customer; 
    $WorkBook->SaveAs($ExcelFile); 
    $WorkBook->Close(); 
    undef $WorkBook; 
    undef $Excel; 
} 

... et il fonctionne très bien !