LINUX.ORG.RU

Распарсить xlsx в perl

 , ,


0

1

Посоветуйте модуль для парсинга xlsx, который действительно умеет xlsx.
Смотрел Spreadsheet::XLSX и Spreadsheet::ParseXLSX - не работают, ругаются «format error: can't find EOCD signature».
xlsx создается в MS Office 2013.

★★★★★

не работают, ругаются «format error: can't find EOCD signature»

через цпан ставил? если да, то тесты проходили нормально когда устанавливал? ругань при попытка распарсить, или вообще при загрузке модуля?

reprimand ★★★★★
()
Ответ на: комментарий от reprimand

через цпан ставил?

И да и нет. В генточке есть утилитка g-cpan, которая создает ebuild-ы для модулей из cpan. Т.е. модули то из cpan, но без ручного пердолинга с установкой/поддержкой. :)

если да, то тесты проходили нормально когда устанавливал?

Не ругалось...

ругань при попытка распарсить, или вообще при загрузке модуля?

$ cat spreadshit-xlsx.pl 
#!/usr/bin/perl
use Spreadsheet::XLSX;
my $excel = Spreadsheet::XLSX -> new ('test.xlsx');

$ ./spreadshit-xlsx.pl 
format error: can't find EOCD signature 
 at /usr/lib64/perl5/vendor_perl/5.24.0/Archive/Zip/Archive.pm line 718.
	Archive::Zip::Archive::_findEndOfCentralDirectory(Archive::Zip::Archive=HASH(0x256f638), IO::File=GLOB(0x256f8a8)) called at /usr/lib64/perl5/vendor_perl/5.24.0/Archive/Zip/Archive.pm line 591
	Archive::Zip::Archive::readFromFileHandle(Archive::Zip::Archive=HASH(0x256f638), IO::File=GLOB(0x256f8a8), "test.xlsx") called at /usr/lib64/perl5/vendor_perl/5.24.0/Archive/Zip/Archive.pm line 559
	Archive::Zip::Archive::read(Archive::Zip::Archive=HASH(0x256f638), "test.xlsx") called at /usr/lib64/perl5/vendor_perl/5.24.0/Spreadsheet/XLSX.pm line 279
	Spreadsheet::XLSX::__load_zip("test.xlsx") called at /usr/lib64/perl5/vendor_perl/5.24.0/Spreadsheet/XLSX.pm line 25
	Spreadsheet::XLSX::new("Spreadsheet::XLSX", "test.xlsx") called at ./spreadshit-xlsx.pl line 3
Cannot open test.xlsx as Zip archive at /usr/lib64/perl5/vendor_perl/5.24.0/Spreadsheet/XLSX.pm line 279.

unzip test.xlsx что-то там распаковывает из файла, xml-ки какие-то.

Lavos ★★★★★
() автор топика
Ответ на: комментарий от Lavos

чем создаешь test.xlsx?

а то тут такой прикол, что
1)

EOCD is End of Central Directory marker in the Zip file format

2)

XLSX is just a collection of XML files in a zip container. There is no other magic.

If you decompress/unzip a valid XLSX files and then recompress/zip it and you can't read the resulting output then the problem in with the zipping software. Try a different library/utility or check the default compression type and levels that it uses and try match it to whatever Excel uses. Or check the zip file to make sure the directory structure was maintained.

reprimand ★★★★★
()
Ответ на: комментарий от reprimand

чем создаешь test.xlsx

Создаю не я, присылает коллега-виндузятник, у которого на PC ничего кроме MS Office 2013 нет.
Эту xlsx нормально отрывает libreoffice и gnumeric. А perl не хочет.

Lavos ★★★★★
() автор топика
Ответ на: комментарий от Lavos

Хмм, если эту xlsx открыть и пересохранить в другую в libreoffice, то полученную xlsx Spreadshit::XLSX кушает.
Хмм...

Lavos ★★★★★
() автор топика
Ответ на: комментарий от reprimand

бггг у матёрых гэнтушнегоф даже zip корректный не получается
наверна нужно реэмержнуть ворлд.

алсо, дело возможно в

spreadshit

ЗЫ помню юзал модуль, он был хоть и агностик по части xls(x), но в коде был прописан другой модуль, который использовался и умел только xls. пришлось заменить все вхождения на имя совместимого с этим модуля, но умеющего xlsx. даже заработало.

mos ★★☆☆☆
()
Ответ на: комментарий от mos

Кроме него я еще попробовал Spreadsheet::ParseXLSX, SimpleXlsx и Data::XLSX::Parser - ни один не хочет кушать мою xlsx. Печалька.

Lavos ★★★★★
() автор топика
Ответ на: комментарий от Lavos

очень странно

подозреваю что какой-то нестандатрный архив, или внутри xlsx не архив вовсе

исследуй, даже не знаю что сказать. Тест кейсов можно придумать много, мне в голову сразу 3 приходит

1) создать самому xlsx либреофисом и WPS офисом (есть под онтопик) и попытаться открыть
2) открыть как архив с помощью твоего любимого архиватора и посмотреть рунется ли оно (а если да - то на что)
3) выполнить $ file, в конце концов

reprimand ★★★★★
()
Ответ на: комментарий от reprimand

1) если эту xlsx открыть и пересохранить в другую в libreoffice, то полученную xlsx Spreadshit::XLSX кушает.
2) unzip распаковывает, не ругается.
3) test.xlsx: Composite Document File V2 Document, Cannot read short stream

Lavos ★★★★★
() автор топика
Ответ на: комментарий от Lavos

не знаю, я экспериментировал со Spreadsheet и проблем не было.
хотя меня больше интересовало создание. еще пытался с шаблонами что-то делать.
Офис наверное постарее 2013. Хотя не помню. Но вряд ли есть разница. может ФС проверить..))

mos ★★☆☆☆
()

можно в csv конвертить:

soffice --headless --convert-to "csv:Text - txt - csv (StarCalc):44,34,76,1" file.xlsx

vividsnow
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.