PDA

Tam Sürümünü Görmek İçin : Excel den veri çekerken Türkçe karakterler görüntülenemiyor


anov
23/08/2006, 19:50
Kullandığım programlar :

ActivePerl 5.8.x
Xitami
Microsoft Excel

Win32::OLE modülü ile bir excel tablosundaki verileri alıp, isim kontrolü yapıyorum. (nöbetler möbetler)


#bu kod buyuk oranda activestate faq suna dayanmaktadir.
use strict;
use CGI qw(:standard);
use CGI::Carp qw(fatalsToBrowser);
use Win32::OLE;
use Win32::OLE::Const 'Microsoft Excel';

my $dosya_yolu = "bla bla bla";

my $excel = Win32::OLE->new('Excel.Application', 'Quit');
my $kitap = $excel->Workbooks->Open("$dosya_yolu");
my $sayfa = $kitap->Worksheets(1);
my $range = $sayfa->Range("a1:a10")->{'Value'};

print header(-encoding=>'iso-8859-9');
print start_html;

my $i;

foreach $i (@{$range}) {
foreach (@{$i}) {
print "$_  ";
}
print "<br>";
}

print end_html;


bu kodlarla isimleri yazdırıyorum (esas amacım isim yazdırmak değil tabii ki) fakat ister utf8 pragmasını kullanayım ister türkçe kodlayayım bir türlü türkçe karakterleri görüntülemeyi başaramadım. daha önce benzer uygulamalarda tecrübesi olan arkadaşlardan yardım bekliyorum.


anov
25/08/2006, 14:23
Bir önceki mesajdaki kod eksik bir kod. Bunu dikkate alınız
require ile istenen dosya sadece bir liste döndürüyor.

Bu arada kodun amacı yanlışlıkla nöbet yazılmayan adamları yakalamak. :)

#! perl
# nobet_tutmayan.pl
use strict;
use warnings;
use CGI qw(:standard);
use CGI::Carp qw(fatalsToBrowser);
use Win32::OLE;
use Win32::OLE::Const 'Microsoft Excel';

require "isim_listesi.pl";

#sabitler
#dosya isimleri
my $nobet_listesi = "C:\\Bilmemne Cart curt\\Nöbet Listesi.xls";

#burası pek mühim değil geriye bir tüm isimleri içeren bir list dönüyor.
my @isim_listesi = isim_listesi(); #isim_listesi.pl
#gun hucresi
my $gun = "";
#gece nobetleri
my $gece = "C5:G21";
#gunduz nobetleri
my $gunduz = "C23:G39";

print header(-encoding=>'iso-8859-9');
print start_html(-title=>'Nöbet tutmayanlar',-meta=>{'Content-Type'=>'text/html;charset=iso-8859-9'});

my $sayfa = param("sayfa");
$sayfa = $sayfa || 5;
print start_form(-method=>'GET');
sayfalar($nobet_listesi, $sayfa);
print submit("Gönder");
print end_form;

my $gece_nobeti = undef;
my $gunduz_nobeti = undef;

($gece_nobeti, $gunduz_nobeti) = listeler($nobet_listesi, $gece, $gunduz, $sayfa);

my @gece_tutanlar = nobet_listesi_dokumu($gece_nobeti);
my @gunduz_tutanlar = nobet_listesi_dokumu($gunduz_nobeti);

@gece_tutanlar = sort @gece_tutanlar;
@gunduz_tutanlar = sort @gunduz_tutanlar;

my @gece_tutmayanlar = ();
my @gunduz_tutmayanlar = ();

foreach (@isim_listesi) {
push @gece_tutmayanlar, $_ unless nobeti_var_mi($_, @gece_tutanlar);
push @gunduz_tutmayanlar, $_ unless nobeti_var_mi($_, @gunduz_tutanlar);
}

print h2("gece tutmayan:");
print "<ol>";
print li($_) . "\n" foreach (@gece_tutmayanlar);
print "</ol>";

print h2("gunduz tutmayan:");
print "<ol>";
print li($_) . "\n" foreach (@gunduz_tutmayanlar);
print "</ol>";

print end_html;

#-----------------------------------------------------------------------

# (\@gece_aoa, \@gunduz_aoa) = listeler($dosya, $gece_hucre_araligi, $gunduz_hucre_araligi)
sub listeler {
my $dosya;
my $gece_hucre_araligi;
my $gunduz_hucre_araligi;
my $sayfa;
($dosya, $gece_hucre_araligi, $gunduz_hucre_araligi, $sayfa) = @_;
$sayfa = $sayfa * 1;
my $excel = Win32::OLE->new('Excel.Application', 'Quit');
my $wb = $excel->Workbooks->Open($dosya);
my $s = $wb->Worksheets($sayfa);
my $gece = $s->Range($gece_hucre_araligi)->{'Value'};
my $gunduz = $s->Range($gunduz_hucre_araligi)->{'Value'};
$wb->Close(0);
return ($gece, $gunduz);
}

sub sayfalar {
my $dosya = shift;
my $sayfa = shift;
my $e = Win32::OLE->new('Excel.Application', 'Quit');
my $b = $e->Workbooks->Open($dosya);
print "<select name='sayfa'>";
for(my $i=1; $i<=$b->Worksheets->{'Count'};$i++) {
unless ($b->Worksheets($i)->{'Name'} =~ /Arka/) {
print "<option value='$i'";
print " selected " if $i eq $sayfa;
print ">" . $b->Worksheets->Item($i)->{'Name'} . "</option>";
}
}
print "</select>";
$b->Close(0);
}

sub nobet_listesi_dokumu {
my $nobet_listesi = shift;
my @isim_listesi = ();
foreach my $i(@{$nobet_listesi}) {
foreach (@{$i}) {
#sadece isimler $1 $2
push @isim_listesi, $1 if /(\D+)\s*(\d+)/;
#isim------------------------^ ^
#silah numarası----------------------|
#print td($i);
}
}
return @isim_listesi;
}

sub nobeti_var_mi {
my $isim = undef;
my @liste = ();
($isim, @liste) = @_;
foreach (@liste) {
return 1 if /$isim/;
}
return 0;
}

perlci
29/08/2006, 22:28
print header(-encoding=>'iso-8859-9'); BU satırı şununla değiştirip bir uygulayın
print header(-charset => 'ISO-8859-9');

encoding genelde XML verileri için kullanılır.

anov
30/08/2006, 16:51
sorunun bu kadar basit bir noktadan kaynaklanabileceği doğrusu aklıma geliyordu ama encoding bana çok mantıklı gözükmüştü. CGI modülü geriye xhtml döndürdüğü için sanırım örneklerde encoding diye geçiyor.

Sorunum çözüldü. Çok teşekkür ederim. Bunu perl bölümüne kod veya ipucu olarak ekleyeyim bir ara. (Örnek dosyalar ile birlikte)