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


Автор: Agares 18.8.2008, 17:25
Парсю XLS модулем Spreadsheet::ParseExcel
На выходе получаю: 
Код

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


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

Код

utf8::decode($string);

не помогает


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

Автор: Itsys 19.8.2008, 10:12
use Spreadsheet::ParseExcel::FmtUnicode;

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

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

Автор: nitr 19.8.2008, 10:15
Вот и оно smile
Itsys, ;)

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

Автор: Agares 19.8.2008, 11:05
Код

        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 | 


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

Автор: nitr 19.8.2008, 11:18
Agares, а как вариант с Encode?

Автор: Agares 19.8.2008, 16:26
тоже не помогает :(

Автор: Itsys 19.8.2008, 16:57
Неужели так не помогает?
Код

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);

Автор: Itsys 19.8.2008, 17:15
Если не помогает, когда приду домой, посмотрю, я с этом как-то уже боролся....

Автор: Agares 19.8.2008, 17:52
Увы не помогает

Автор: nitr 19.8.2008, 23:08
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???

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

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

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

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

Автор: Itsys 20.8.2008, 16:24
Нашел:
Код

            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};
                    }
                }
            }


Автор: Agares 20.8.2008, 16:51
Помогла вот такая бойда, спасибо smile
Код

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

Автор: nitr 20.8.2008, 20:44
Agares, ужас какой ;)

Itsys, интересная подметка...

Добавлено через 1 минуту и 17 секунд
Кстати, давно писал про этот модуль, он уже давно не обновлялся, к примеру, не поймет Excel 2007. Так вот, я писал тогда, что лучше работать с XLS как с XML, есть аналогичный модуль, тогда ещё некоторые доработки здесь приводил smile Автор скорее уже сделал их (надо будет ему написать ;) )

Автор: Itsys 21.8.2008, 11:19
nitr, ты имеешь в виду модуль XML::Excel? Не в курсе, насколько он быстрее работает чем Spreadsheet::ParseExcel?

ЗЫ Вообще, насколько я понял, быстрее всего парсить большие Excel файлы через OLE  smile 

Автор: shamber 21.8.2008, 11:36
вот что пишет автор
 Ofcourse the DOM implementation takes up more resources and in some instances timing, it's the easiest to use.

Цитата(Itsys @  21.8.2008,  11:19 Найти цитируемый пост)
ЗЫ Вообще, насколько я понял, быстрее всего парсить большие Excel файлы через OLE

помним помним  smile 
 smile 

Автор: nitr 21.8.2008, 21:02
Itsys, shamber, smile
Я вот что нашёл http://search.cpan.org/~scesano/Spreadsheet-TieExcel-0.75/TieExcel.pod
По поводу Excel 2007 http://search.cpan.org/~dmow/Spreadsheet-XLSX-0.03/lib/Spreadsheet/XLSX.pm
Так что проект кое-как развивается smile

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