Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: разработка для Web > Spreadsheet::WriteExcel и кодировка


Автор: Новичок в perl 15.9.2005, 13:49
Вообщем проблема такая:
Есть мускулевская база, в ней записи на русском в cp1251.
Есть скрипт:

#!/usr/bin/perl
$| = 1;

use lib "/home/unumber/perl/lib/perl5/site_perl/5.8.6/";
use strict;
use Spreadsheet::WriteExcel;

use DBI;
use CGI::Carp qw(fatalsToBrowser);

use encoding 'cp1251', STDIN=>'cp1251', STDOUT=>'cp1251';

# Set the filename and send the content type
my $filename ="price.xls";

print "Content-type: application/vnd.ms-excel\n";
# The Content-Disposition will generate a prompt to save the file. If you want
# to stream the file to the browser, comment out the following line.
print "Content-Disposition: attachment; filename=$filename\n";
print "\n";

# Create a new workbook and add a worksheet. The special Perl filehandle - will
# redirect the output to STDOUT
#
my $workbook = Spreadsheet::WriteExcel->new("-");
my $worksheet = $workbook->add_worksheet();

# Set the column width for column 1
$worksheet->set_column(0, 0, 40);

# Create a format
my $format = $workbook->add_format();
$format->set_bold();
$format->set_size(15);
$format->set_color('red');

#print "Content-Type: text/html\n\n";

my $dbh=DBI->connect('DBI:mysql:server','uname','passwd');

my $SQL="SELECT * FROM price ORDER BY parent, name DESC";

my $sth=$dbh->prepare($SQL);
$sth->execute();

my $row=0;

while (my ($id, $parent, $name, $text, $price, $foto) = $sth->fetchrow_array())
{
my $test = "Строка по-русски";
$worksheet->write($row, 0, $price, $format);
$row = $row +1;
}

Скрипт отдает экселевский файл, но кодировка неправильная.
При этом если в строке
"$worksheet->write($row, 0, $price, $format);"
$price заменить на $test, то все получается шоколадно.

Дяденьки, поможите кто-нить... smile

Автор: BlackLFL 16.9.2005, 12:04
а в какой кодировке отдает данные Mysql?

Автор: Guest 17.9.2005, 15:40
BlackLFL
Цитата(BlackLFL @ 16.9.2005, 12:04)
а в какой кодировке отдает данные Mysql?

Судя по всему в 1251

Автор: BlackLFL 19.9.2005, 08:41
Цитата(Guest @ 17.9.2005, 15:40)
BlackLFL
Цитата(BlackLFL @ 16.9.2005, 12:04)
а в какой кодировке отдает данные Mysql?

Судя по всему в 1251

мне все-таки кажется надо проверить в какой кодировке отдает Mysql

Автор: Guest 19.9.2005, 12:49
BlackLFL
Мускуль что - перекодировать будет мне из одной кодировки в другую на лету?!! По-моему он отдает в той кодировке, в которой я ему это записывал.
А кроме того опытным путем установлено что 1251.

Автор: BlackLFL 22.9.2005, 15:53
2Guest, да будет, см. код ниже.


какой версии Spreadsheet::WriteExcel ?

Код

use encoding "ru_RU.CP1251";

так же попробуйте
Код

$dbh->do("SET character_set_client = cp1251"); 
$dbh->do("SET character_set_connection = cp1251"); 
$dbh->do("SET character_set_results = cp1251"); 

Автор: Guest 23.9.2005, 09:36
BlackLFL
Версия 2,14. Спасибо, щас попробую

Автор: Guest 23.9.2005, 09:40
BlackLFL
Нет, ни то, ни другое не помогло. Результат нулевой.

Автор: BlackLFL 23.9.2005, 09:43
покажите код, который у Вас в итоге получился.

Автор: Guest 23.9.2005, 15:49
Код

#!/usr/bin/perl
$| = 1;

use lib "/home/u*****/perl/lib/perl5/site_perl/5.8.6/";
use strict;
use Spreadsheet::WriteExcel;

use DBI;
use CGI::Carp qw(fatalsToBrowser);
use encoding "ru_RU.CP1251";
#use encoding 'cp1251'; #, STDOUT => 'cp1251'; #STDOUT => 'utf-8';
#use encoding 'cp1251', STDIN=>'cp1251', STDOUT=>'cp1251';
use Encode;
use Text::Iconv;

# Set the filename and send the content type
my $filename ="price.xls";

print "Content-type: application/vnd.ms-excel\n";
# The Content-Disposition will generate a prompt to save the file. If you want
# to stream the file to the browser, comment out the following line.
print "Content-Disposition: attachment; filename=$filename\n";
print "\n";

# Create a new workbook and add a worksheet. The special Perl filehandle - will
# redirect the output to STDOUT
#
my $workbook  = Spreadsheet::WriteExcel->new("-");
my $worksheet = $workbook->add_worksheet();

# Set the column width for column 1
$worksheet->set_column(0, 0, 40);

# Create a format
my $format = $workbook->add_format();
$format->set_bold();
$format->set_size(15);
$format->set_color('red');

#print "Content-Type: text/html\n\n";

my $dbh=DBI->connect('DBI:mysql:u*****:u*****.mysql.masterhost.ru','u*****','PASSWORD');
$dbh->do("SET character_set_client = cp1251");    
$dbh->do("SET character_set_connection = cp1251");    
$dbh->do("SET character_set_results = cp1251"); 

my $SQL="SELECT * FROM price ORDER BY parent, name DESC";

my $sth=$dbh->prepare($SQL);
$sth->execute();

my $row=0;

while (my ($id, $parent, $name, $text, $price, $foto) = $sth->fetchrow_array())
{

#:encoding(cp1251) => my $test = "Тест";

# Write to the workbook
#my $converter = Text::Iconv->new("koi8-r", "cp1251");

$worksheet->write($row, 0, $price, $format);
$row = $row +1;
}


Автор: BlackLFL 23.9.2005, 19:21
не знаю что сказать, у меня данный код отрабатывает корректно

Perl 5.8.4
Spreadsheet::WriteExcel 2.15
Encode 2.12

Автор: Guest 24.9.2005, 13:55
BlackLFL
А ты его локально из-под виндов запускал или с юникс-системы? Базу данных создавал/юзал? smile

Автор: BlackLFL 25.9.2005, 14:27
я проверял под WinXP, Linux.
Какая версия у тебя Mysql, DBD-Mysql,DBI ?

Автор: Guest 26.9.2005, 12:07
BlackLFL
Честно - не знаю.
Я на хостинге у .masterhost (http://masterhost.ru/). Но вроде как у них там модули перловские обновляются постоянно, версии последние... Чесслово - не в кусре

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)