Forum Webscript.Ru

Программирование => Perl => Тема начата: Alexandr от 17 Июля 2002, 14:31:27

Название: Excel (use Perl) => txt
Отправлено: Alexandr от 17 Июля 2002, 14:31:27
В Perl\'е я не шарю, поэтому решил обратиться к вам, перлистам.
Необходимо написать скрипт, который бы данные из Excel\'я парсил в текстовый файл (разделитель табуляция).
Пробовал найти что-нть подобное на PHP, но не нашёл, а на перле есть такая штука.
Необходимо следующее:
1) Запускаю скрит (н-р, parse.pl?path=/my_xls_files/file.xls)
2) Скрипт перегоняет данные с первого листа файла /my_xls_files/file.xls в текстовый файл (разделитель табуляция)
3) Далее, если всё ОК, скрипт передаёт управление моему PHP скрипту (н-р, parse_txt.php?error=no), если (!OK), то передаёт код ошибки (н-р, parse_txt.php?error=1 (н-р, если файл не является файлом Excel); parse_txt.php?error=2 (н-р, если файл является файлом Excel не соответствующей версии) и т.д.)
Вот в общем-то и всё. Платформа Unix (если это имеет значение).

Работу могу простимулировать.
Название: Excel (use Perl) => txt
Отправлено: ESE от 18 Июля 2002, 03:21:52
Я как-то тоже хотел подобное сделать........... тщетно.
Пришлось просто сохранять файл из excel в формат с раздел. табуляции......
Название: Excel (use Perl) => txt
Отправлено: NeoNox от 18 Июля 2002, 12:21:32
DESCRIPTION
Spreadsheet::ParseExcel makes you to get information from Excel95, Excel97, Excel2000 file...

А по сабжу, если никто не возьмется, отпиши мне, помогу.
Название: Excel (use Perl) => txt
Отправлено: Alexandr от 18 Июля 2002, 12:33:33
Цитировать
Пришлось просто сохранять файл из excel в формат с раздел. табуляции......
Так я сейчас и делаю.....
Цитировать
Я как-то тоже хотел подобное сделать........... тщетно.
Ну, а как же
http://ftp://ftp.dn.ru/pub/MySQL/Downloads/Contrib/excel2mysql
http://www-106.ibm.com/developerworks/linux/library/l-pexcel/
Название: Excel (use Perl) => txt
Отправлено: Alexandr от 26 Июля 2002, 09:04:43
Ребята помогите плиззз, а то чтот NeoNox взялся....... и замолчал.
Название: Excel (use Perl) => txt
Отправлено: Evgeny от 26 Июля 2002, 10:43:52
Не могу сейчас вспомнить, как называется модуль, но я с его помощью и читал, и писал в Excel.
Правда под Windows это было, и какое-то ограничение на количество обрабатываемых строк было,
модуль стандартный, или на cpan.org или activestate.com взял.
Название: Excel (use Perl) => txt
Отправлено: Alexandr от 26 Июля 2002, 10:58:26
Да мне под *nix, а лучше кросс.
Название: Excel (use Perl) => txt
Отправлено: NeoNox от 28 Июля 2002, 22:46:13
Цитировать
Ребята помогите плиззз, а то чтот NeoNox взялся....... и замолчал.
Сори, в оффлайн ушел. Грабли с модулем. Переписали как курица лапой... :( Давай не зафлуживать топик, перейдем в асю.
Название: Excel (use Perl) => txt
Отправлено: Alexandr от 07 Августа 2002, 11:12:02
Установили мне админы модули
Spreadsheet-ParseExcel
Spreadsheet-WriteExcel

Ща пробую делать указаную выше штуку.
Скопировал с ентого урля
http://www-106.ibm.com/developerwor...brary/l-pexcel/
вот такую вещь

#!/usr/bin/perl -w

use strict;
use Spreadsheet::ParseExcel;

my $oExcel = new Spreadsheet::ParseExcel;

die "You must provide a filename to $0 to be parsed as an Excel file" unless @ARGV;

my $oBook = $oExcel->Parse($ARGV[0]);
my($iR, $iC, $oWkS, $oWkC);
print "FILE  :", $oBook->{File} , "\\n";
print "COUNT :", $oBook->{SheetCount} , "\\n";

print "AUTHOR:", $oBook->{Author} , "\\n"
if defined $oBook->{Author};

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

запускаю
http://www.autodealer.ru/_proba.pl
в ерор логе такая штука
Premature end of script headers: /web/autodealer/site/www/_proba.pl
You must provide a filename to _proba.pl to be parsed as an Excel file at _proba.pl line 8

делаю так
http://www.autodealer.ru/_proba.pl?other (есть ещё файл other.xls)
он пишет
Premature end of script headers: /web/autodealer/site/www/_proba.pl
Use of uninitialized value at _proba.pl line 12.
Use of uninitialized value at _proba.pl line 13.
Use of uninitialized value at _proba.pl line 18.

Может кто подскажет. А то я совсем не рублю в Перл\'е.
(но видимо придётся разбираться и учить)
Название: Excel (use Perl) => txt
Отправлено: Chs от 07 Августа 2002, 11:42:52
лол

Шелл хостинг дает? :)
Название: Excel (use Perl) => txt
Отправлено: Alexandr от 07 Августа 2002, 11:51:20
Не знаю....
В смысле telneat, то да.
Название: Excel (use Perl) => txt
Отправлено: Unregistered от 07 Августа 2002, 12:54:33
Цитировать
Premature end of script headers: /web/autodealer/site/www/_proba.pl
Use of uninitialized value at _proba.pl line 12.
Use of uninitialized value at _proba.pl line 13.
Use of uninitialized value at _proba.pl line 18.

Убери use strict;
или строку
Цитировать
my($iR, $iC, $oWkS, $oWkC);

перепиши как  my($iR, $iC, $oWkS, $oWkC,$oBook);

Второе предпочтительнее.
Название: Excel (use Perl) => txt
Отправлено: Alexandr от 07 Августа 2002, 13:02:43
Вот ответ:
"my" variable $oBook masks earlier declaration in same scope at _proba.pl line 11.
Use of uninitialized value at _proba.pl line 12.
Use of uninitialized value at _proba.pl line 13.
Use of uninitialized value at _proba.pl line 18.
[Wed Aug  7 15:02:02 2002] [error] [client 212.220.204.71] Premature end of script headers: /web/autodealer/site/www/_proba.pl
Название: Excel (use Perl) => txt
Отправлено: Serchey от 07 Августа 2002, 16:40:52
А-у-у! Вы чего, не видете что надо переделать 8-ю строчку?Этот скрипт расчитан на то, что нужный файл передается с командной строки.
Название: Excel (use Perl) => txt
Отправлено: Alexandr от 07 Августа 2002, 16:43:23
Serchey дак как переделать или как передать?
плииизззз нелп.
Название: Excel (use Perl) => txt
Отправлено: Serchey от 07 Августа 2002, 23:08:28
#!/usr/bin/perl -w
#Alexandr, я бы сделал это так:
use strict;
use Spreadsheet::ParseExcel;

print "Content-type: text/html\\n\\n";
my $filename = \'\';
my $oExcel = new Spreadsheet::ParseExcel;
if(defined $ENV{QUERY_STRING}) && $ENV{QUERY_STRING} ne \'\'){
 my @parts = split(\'&\',$ENV{QUERY_STRING});
 my ($par,$val);
 foreach(@parts){
  ($par,$val) = split(/=/,$_,2);
   if($par eq \'path\'){$filename = $val; last;}
 }
}
if($filename eq \'\'){print "

No path specified!

\\n"; exit;}
if(!(-e $filename) || !(-r $filename)){print "

File is not aviable!


Maby file not exists..\\n"; exit;}


my $oBook = $oExcel->Parse($filename);
my($iR, $iC, $oWkS, $oWkC);
print "FILE :", $oBook->{File} , "
\\n";
print "COUNT :", $oBook->{SheetCount} , "
\\n";

print "AUTHOR:", $oBook->{Author} , "
\\n"
if defined $oBook->{Author};
print "
\\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);
  }
 }
}

print "

All done.

\\n";
#Да, даный скрипт ни в какой файл ничего не записывает - он лишь выводит
# на экран содержимое. Если хочешь, я как-нибудь переделаю его на досуге,
# но чуть позже(работы завал!). Удачи!
Название: Excel (use Perl) => txt
Отправлено: Alexandr от 08 Августа 2002, 09:32:46
Цитировать
даный скрипт ни в какой файл ничего не записывает - он лишь выводит

Да это-то я сразу понял. Я этот-то запустить не мог, не говоря уж о том чтобы сделать скрипт, который в файл пишет.
Цитировать
Если хочешь
Хочешь....
Название: Excel (use Perl) => txt
Отправлено: Alexandr от 08 Августа 2002, 10:19:50
Serchey не могу твой скрипт запустить. Всяко уже пробовал. Ни в какую.
Пишет: No path specified!
Вот скрипт:
http://www.autodealer.ru/_proba.pl
А вот файл xls
http://www.autodealer.ru/other.xls

ЗЫ у тя ошибочка в скриптец закралась. В девятой строке "(" пропустил.
Название: Excel (use Perl) => txt
Отправлено: Serchey от 08 Августа 2002, 10:56:01
Да, точно, пропустил.
Но Alexandr, ты набираешь http путь к файлу, вместо полного физического(хотябы относительного), потому и глюки. Предположив, что нужный файл находиться со скриптом в одной папке, я набрал вот что
http://www.autodealer.ru/_proba.pl?path=./other.xls
и получил его содержимое. Конечно, немного лажа, но уже это уже вина модулей(а не моя). А пока все. Скрипт я чуток позже постараюсь переделать. Удачи.
Название: Excel (use Perl) => txt
Отправлено: Alexandr от 08 Августа 2002, 11:03:16
Да всё ок. Понял. Я просто не знал что файл надо передавать переменной path и делал так
http://www.autodealer.ru/_proba.pl?./other.xls
и так
http://www.autodealer.ru/_proba.pl?other.xls
и полный путь тоже пробовал.
Название: Excel (use Perl) => txt
Отправлено: Alexandr от 08 Августа 2002, 11:09:24
Всё спасибо получилось.
Только он русские буквы наотрез отказывается показывать.
Может кто знает как исправить?
Или это глюк компонента Spreadsheet::ParseExcel?
Название: Excel (use Perl) => txt
Отправлено: Chs от 08 Августа 2002, 21:57:19
Цитировать
Только он русские буквы наотрез отказывается показывать.
Может кто знает как исправить?
Или это глюк компонента Spreadsheet::ParseExcel?

Это не баг - это фича.:))
Документацию к модулю внимательно смотрим?
Там даже примерчик есть с использованием чарсетов.:)
Название: Excel (use Perl) => txt
Отправлено: Alexandr от 09 Августа 2002, 09:21:18
Не знаю где документация. И пример тоже не нашёл.
Но вот здесь
http://search.cpan.org/doc/KWITKNR/Spreadsheet-ParseExcel-0.2602/ParseExcel.pm
Такое прочитал:
Цитировать

TextFmt($oSelf, $sText, $sCode)
converts original text into applicatable for Value.

$oSelf
Formatter itself

$sText
Original text

$sCode
Character code of Original text

Может кто скажет что куда в моём примере надо вставить?
Название: Excel (use Perl) => txt
Отправлено: Unregistered от 10 Августа 2002, 17:18:52
добавь в начало
 my $oFmtJ = Spreadsheet::ParseExcel::FmtUnicode->new(Unicode_Map=>\'CP1251\');

и замениmy
$oBook = $oExcel->Parse($filename);
иа
my $oBook = $oExcel->Parse($filename, $oFmtJ );

Подозреваю что Unicode::Map придётся устоновит
Название: Excel (use Perl) => txt
Отправлено: Alexandr от 15 Августа 2002, 16:26:42
Цитировать
Подозреваю что Unicode::Map придётся устоновит

Установил.
Но всё равно не хочет работать.
Пишет
Can\'t locate object method "new" via package "Spreadsheet::ParseExcel::FmtUnicode" at _proba.pl line 9.