Модераторы: korob2001, ginnie

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Spreadsheet::ParseExcel, проблемма с отображение рус текста 
V
    Опции темы
Agares
  Дата 18.8.2008, 17:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 376
Регистрация: 20.5.2007
Где: Минск

Репутация: нет
Всего: нет



Парсю XLS модулем Spreadsheet::ParseExcel
На выходе получаю: 
Код

4 | software | @>3@0<<=>5� >15A?5G5=85 | 


Как я понял, проблема с кодировкой, похоже выдается в utf8. Можно ли как-то преобразовать в нормальный вид? 

Код

utf8::decode($string);

не помогает



Это сообщение отредактировал(а) Agares - 18.8.2008, 17:30


--------------------
Мой ноут: Impression First 657
ОС: Gentoo Linux
PM MAIL WWW Skype GTalk   Вверх
nitr
Дата 19.8.2008, 10:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

Репутация: 37
Всего: 84



Agares, поманипулируйте с модулем Encode (методы decode, encode). Прочтите по вашему модулю документацию, там есть явное указание кодировок (на сколько помню).


--------------------
PM   Вверх
Itsys
Дата 19.8.2008, 10:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1338
Регистрация: 21.1.2008
Где: г. Москва

Репутация: 2
Всего: 34



use Spreadsheet::ParseExcel::FmtUnicode;

Добавлено через 1 минуту и 29 секунд
my $oFmtJ = Spreadsheet::ParseExcel::FmtUnicode->new(Unicode_Map=>'CP1251');

my $oBook = $oExcel->Parse('C:/путь/to.xls',$oFmtJ);

PM MAIL WWW Skype   Вверх
nitr
Дата 19.8.2008, 10:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

Репутация: 37
Всего: 84



Вот и оно smile
Itsys, ;)

P.S.: память не подвела smile , а на работе нет возможно проверить как же "указывается" smile



--------------------
PM   Вверх
Agares
  Дата 19.8.2008, 11:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 376
Регистрация: 20.5.2007
Где: Минск

Репутация: нет
Всего: нет



Код

        my $oFmtJ = Spreadsheet::ParseExcel::FmtUnicode->new(Unicode_Map=>'CP1251');
        my $excel = Spreadsheet::ParseExcel::Workbook->Parse($import_file,$oFmtJ);


Код

6028 | enterprise resource planning (ERP) software | ONDn‰ÄR�(�E�R�P�)oOS | 5262 | 


не помогает :(


--------------------
Мой ноут: Impression First 657
ОС: Gentoo Linux
PM MAIL WWW Skype GTalk   Вверх
nitr
Дата 19.8.2008, 11:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

Репутация: 37
Всего: 84



Agares, а как вариант с Encode?


--------------------
PM   Вверх
Agares
Дата 19.8.2008, 16:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 376
Регистрация: 20.5.2007
Где: Минск

Репутация: нет
Всего: нет



тоже не помогает :(


--------------------
Мой ноут: Impression First 657
ОС: Gentoo Linux
PM MAIL WWW Skype GTalk   Вверх
Itsys
Дата 19.8.2008, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1338
Регистрация: 21.1.2008
Где: г. Москва

Репутация: 2
Всего: 34



Неужели так не помогает?
Код

use Spreadsheet::ParseExcel;
use Spreadsheet::ParseExcel::FmtUnicode;
my $oExcel = new Spreadsheet::ParseExcel;
my $oFmtJ = Spreadsheet::ParseExcel::FmtUnicode->new(Unicode_Map=>'CP1251');

my $oBook = $oExcel->Parse('C:/путь/to.xls',$oFmtJ);

PM MAIL WWW Skype   Вверх
Itsys
Дата 19.8.2008, 17:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1338
Регистрация: 21.1.2008
Где: г. Москва

Репутация: 2
Всего: 34



Если не помогает, когда приду домой, посмотрю, я с этом как-то уже боролся....
PM MAIL WWW Skype   Вверх
Agares
Дата 19.8.2008, 17:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 376
Регистрация: 20.5.2007
Где: Минск

Репутация: нет
Всего: нет



Увы не помогает


--------------------
Мой ноут: Impression First 657
ОС: Gentoo Linux
PM MAIL WWW Skype GTalk   Вверх
nitr
Дата 19.8.2008, 23:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

Репутация: 37
Всего: 84



Agares

Код
...
use Encode 'encode';

...
print encode('cp1251', $oWkC->Value);
...


Добавлено через 2 минуты
Agares, вы уверены что должно? Я проверил оба способа, что через Encode, что через Spreadsheet::ParseExcel::FmtUnicode.
Результат - положительгый

Добавлено через 3 минуты и 42 секунды
Взял просто sample.pl отредактировал для себя и всё
Код
#!/usr/bin/perl
use strict;
use warnings;

use Spreadsheet::ParseExcel;
use Spreadsheet::ParseExcel::FmtUnicode;

my $oFmt = Spreadsheet::ParseExcel::FmtUnicode->new(Unicode_Map=>'CP1251');
my $oExcel = Spreadsheet::ParseExcel->new;

my $oBook = $oExcel->Parse('./test.xls', $oFmt);
PrnBook($oBook);

sub PrnBook {
    my($oBook) = @_;
    my($iR, $iC, $oWkS, $oWkC);

    print "=========================================\n";
    print "FILE  :", $oBook->{File} , "\n";
    print "COUNT :", $oBook->{SheetCount} , "\n";
    print "AUTHOR:", $oBook->{Author} , "\n";
    for(my $iSheet=0; $iSheet < $oBook->{SheetCount} ; $iSheet++) {
        $oWkS = $oBook->{Worksheet}[$iSheet];
        print "--------- SHEET:", $oWkS->{Name}, "\n";
        for(my $iR = $oWkS->{MinRow} ; 
                defined $oWkS->{MaxRow} && $iR <= $oWkS->{MaxRow} ; $iR++) {
            for(my $iC = $oWkS->{MinCol} ;
                            defined $oWkS->{MaxCol} && $iC <= $oWkS->{MaxCol} ; $iC++) {
                $oWkC = $oWkS->{Cells}[$iR][$iC];
                print "( $iR , $iC ) =>", $oWkC->Value, "\n" if($oWkC);
            }
        }
    }
}


Добавлено через 4 минуты и 41 секунду
Agares, какая ОС и какой формат (чем создавался) данный xls???


--------------------
PM   Вверх
Agares
Дата 20.8.2008, 10:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 376
Регистрация: 20.5.2007
Где: Минск

Репутация: нет
Всего: нет



ОС Unix, чем создавался файл не знаю, скорее всего Майкрософт Эксель. Сам сайт работает на utf8.


--------------------
Мой ноут: Impression First 657
ОС: Gentoo Linux
PM MAIL WWW Skype GTalk   Вверх
nitr
Дата 20.8.2008, 11:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

Репутация: 37
Всего: 84



Цитата(Agares @  20.8.2008,  10:52 Найти цитируемый пост)
ОС Unix, чем создавался файл не знаю, скорее всего Майкрософт Эксель. Сам сайт работает на utf8. 

вы столько инфы сейчас дали smile

Прочтите доку по всем вашим модулям. Я бы предложил "побаловаться" с Encode.pm.


--------------------
PM   Вверх
Itsys
Дата 20.8.2008, 16:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1338
Регистрация: 21.1.2008
Где: г. Москва

Репутация: 2
Всего: 34



Нашел:
Код

            my $oFmtJ = Spreadsheet::ParseExcel::FmtUnicode->new(Unicode_Map => 'CP1251');
            my $excel = Spreadsheet::ParseExcel::Workbook->Parse("file.xls", $oFmtJ);
            my $sheet = $excel->{Worksheet}[0];
            $NumberRows = $sheet->{MaxRow};
            foreach my $cellnum ($sheet->{MinCol} .. $sheet->{MaxCol}) {
                my $cell = $sheet->{Cells}[$PARAMS{HeaderLine} - 1][$cellnum];
                if ($cell) {
                    my $Val = $oFmtJ->TextFmt($cell->{Val}, $cell->{Code});
                    if ($Val){
                        $names{$Val} = {ColumnPosition => $cellnum};
                    }
                }
            }


PM MAIL WWW Skype   Вверх
Agares
  Дата 20.8.2008, 16:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 376
Регистрация: 20.5.2007
Где: Минск

Репутация: нет
Всего: нет



Помогла вот такая бойда, спасибо smile
Код

if ($cell->{Code} eq 'ucs2')
                            {
                              $inf->{$i}->{$col} = &Encode::decode("UCS-2BE", $cell->{Val});
                            }



--------------------
Мой ноут: Impression First 657
ОС: Gentoo Linux
PM MAIL WWW Skype GTalk   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1094 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.