Schrift
[thread]8821[/thread]

use Win32::OLE::Const('Microsoft Excel');: modul abhängig einbinden

Leser: 2


<< >> 10 Einträge, 1 Seite
bo
 2007-03-08 10:53
#74863 #74863
User since
2006-05-09
76 Artikel
BenutzerIn
[default_avatar]
hallo community,

ich möchte, abhängig davon, ob excel auf einem rechner installiert ist oder nicht, entweder CPAN:Win32::OLE oder CPAN:Spreadsheet::SimpleExcel verwenden.
ich bräuchte also etwas in der art
Code: (dl )
use Win32::OLE::Const 'Microsoft Excel' or Spreadsheet::SimpleExcel;

wie kann man sowas lösen?
sesth
 2007-03-08 11:04
#74864 #74864
User since
2005-02-01
181 Artikel
BenutzerIn
[default_avatar]
Du kannst einen BEGIN-Block in Dein Programm einfügen. Der wird als erstes abgearbeitet. Dort kannst Du prüfen, ob Excel installiert ist und dann die entsprechenden Module mit "require" laden.
Gruß
Thomas
renee
 2007-03-08 11:06
#74865 #74865
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
my $OLE = 0;

BEGIN{
eval{
require Win32::OLE::Const;
Win32::OLE::Const->import('Microsoft Excel');
$OLE = 1;
};
if( $@ ){
require Spreadsheet::SimpleExcel;
}
}
(ungetestet)
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
bo
 2007-03-08 11:32
#74866 #74866
User since
2006-05-09
76 Artikel
BenutzerIn
[default_avatar]
@renee
das funktioniert leider nicht... :-(
nach der ausführung auf einem rechner ohne excel bleibt $OLE = 0
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
my $OLE = 0;

BEGIN
{
eval
{
require Win32::OLE::Const;
Win32::OLE::Const->import('Microsoft Excel');
$OLE = 1;
};

if ( $@ )
{
require Spreadsheet::SimpleExcel;
$OLE = 2;
}
}

print qq(Result: $OLE\n);
bo
 2007-03-08 11:40
#74867 #74867
User since
2006-05-09
76 Artikel
BenutzerIn
[default_avatar]
ich habe eine lösung gefunden...
Code: (dl )
1
2
3
4
5
6
7
BEGIN
{
if (! Win32::OLE->CreateObject("Excel.Application"))
{
require Spreadsheet::SimpleExcel;
}
}


danke euch beiden :)
renee
 2007-03-08 12:05
#74868 #74868
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Stimmt, Du hättest die Initialisierung von my $OLE weglassen müssen. Also einfach nur
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
my $OLE;

BEGIN
{
eval
{
require Win32::OLE::Const;
Win32::OLE::Const->import('Microsoft Excel');
$OLE = 1;
};

if ( $@ )
{
require Spreadsheet::SimpleExcel;
$OLE = 2;
}
}

print qq(Result: $OLE\n);
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
bo
 2007-03-08 12:17
#74869 #74869
User since
2006-05-09
76 Artikel
BenutzerIn
[default_avatar]
mmh, klar, BEGIN wird ja vorher ausgeführt :p

aber so kommt $OLE = 1 raus, anstatt $OLE = 2, d.h. SimpleExcel wird nicht eingebunden
Strat
 2007-03-12 17:23
#74870 #74870
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
$OLE in BEGIN und my $OLE sind zwei verschiedene Variablen; die my-Variable beginnt erst, wenn die aus BEGIN schon lange wieder tot ist. use vars qw($OLE) anstelle von my muesste in diesem Fall helfen...
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
renee
 2007-03-12 19:50
#74871 #74871
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Nee, sind es nicht. Wichtig ist halt, dass die Deklaration vor dem BEGIN-Block kommt. Der Parser legt beim Parsen die Variable schon an (weist ihr aber keinen Wert zu), dann kommt der BEGIN-Block.

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
#!/usr/bin/perl

use strict;
use warnings;

my $OLE;

BEGIN{
$OLE = 5;
}

print $OLE;
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
bo
 2007-03-13 10:23
#74872 #74872
User since
2006-05-09
76 Artikel
BenutzerIn
[default_avatar]
ja, genau... wird die variable aber nicht nur deklariert, sondern auch initialisiert, dann wird der im BEGIN-Block zugewiesene wert mit dem initialwert überschrieben
hier ist die ausgabe 0, bei renee's beispiel 5
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
#!/usr/bin/perl

use strict;
use warnings;

my $OLE = 0;

BEGIN{
$OLE = 5;
}

print $OLE;
<< >> 10 Einträge, 1 Seite



View all threads created 2007-03-08 10:53.