Perl SpreadSheet::XLSX Ошибка: невозможно открыть как Zip-архив

Я пытаюсь использовать Spreadsheet:XLSX для чтения файлов Excel, но получаю это сообщение об ошибке с CSV, Загрузка файлов XLS и XLSX. Раньше он работал с файлами Spreadsheet::Read и CSV.

Код настолько прост, что я просто не знаю, что устранять.

Файл загружается правильно, и у меня есть правильный путь и имя файла.

Сообщение об ошибке:

Cannot open c:\Website\cgi-bin\bidprocess\files\SEIPA-request-0307123509.xlsx as Zip archive at C:/strawberry/perl/site/lib/Spreadsheet/XLSX.pm line 279.

Код:

# CHECK FOR VALID FILE 
my $filename = shift or die "ERROR: File not received.  Please try again.";

#DEBUG
print $filename;

# READ EXCEL FILE 
my $workbook = Spreadsheet::XLSX->new($filename);

person Cole Tarbet    schedule 12.03.2016    source источник
comment
Не уверен, почему это будет работать с файлами CSV или XLS: ни один из них не хранится в формате zip...   -  person Tim Williams    schedule 12.03.2016
comment
Кроме того, проверьте файл xlsx, с которым у вас возникла проблема, чтобы убедиться, что это правильный формат. Измените расширение на zip и попробуйте открыть его и просмотреть содержимое.   -  person Tim Williams    schedule 12.03.2016
comment
Откуда вы знаете, что файл загружается правильно? Вы пытались открыть его с помощью Excel?   -  person Borodin    schedule 12.03.2016


Ответы (3)


Вау, на такую ​​простую вещь ушла целая вечность.

Решение состояло в том, чтобы открыть файл в «двоичном режиме», потому что я использую Windows, которая различает текстовые и двоичные данные.

http://perldoc.perl.org/functions/binmode.html

use CGI qw(:standard);

# upload file
my $upload_filehandle = upload("filename"); 

# open the uploaded file
open ( UPLOADFILE, ">$upload_dir/$filename" ) or die "$!";

# use binary mode (for Excel files on Windows)
binmode UPLOADFILE;
person Cole Tarbet    schedule 12.03.2016
comment
Ваше решение нуждается в дополнительной информации, прежде чем оно сможет быть полезным для других. Вы не показали никакого кода, который открывает загруженный файл. Это в коде, который загружает файл, или где он читается на сервере? Не Windows, а Perl ведет себя по-другому. Windows завершает каждую строку текстового файла с помощью CR LF, тогда как Linux использует только CR. По умолчанию Perl в системе Windows удаляет CR, но это явно плохая новость для zip-файла, где 0x0D (CR) может быть просто частью данных. - person Borodin; 12.03.2016
comment
Честно говоря, я не смог найти никакой реальной документации или примеров по этому поводу, кроме той ссылки, которую я разместил. Я не претендую на роль кроссплатформенного эксперта по необработанным данным. :) Я могу только представить, что это относительно неизвестно, потому что веб-сайты Perl обычно работают в Linux. - person Cole Tarbet; 14.03.2016
comment
Спасибо за обновление вашего решения, но я хотел бы получить информацию, которую, я уверен, вы знаете. Например, какая библиотека предоставляет функцию upload и является ли этот код серверной или клиентской стороной? - person Borodin; 14.03.2016

Вы не можете открывать файлы CSV или XLS с помощью Spreadsheet:XLSX. Как следует из названия, это для файлов XLSX, которые представляют собой заархивированные XML-файлы. Если он не откроет их, ваш файл, вероятно, поврежден.

person Borodin    schedule 12.03.2016
comment
Это работает для всех из них, если вы используете Spreadsheet::Read. - person Cole Tarbet; 12.03.2016
comment
@ColeTarbet: Тогда я думаю, что ваш файл XLSX на самом деле является чем-то другим. Можете ли вы разместить его в Интернете, чтобы я мог проверить с ним? - person Borodin; 12.03.2016

Поскольку кажется, что вы работаете в Windows, у вас есть один вариант, если у вас установлен Excel в этой системе, — использовать Модуль Win32::OLE для прямого управления Excel для чтения/записи файлов Excel.

Для файлов CSV может быть проще анализировать содержимое напрямую, как если бы это был текстовый файл, или использовать что-то вроде Text::CSV.

person dasgar    schedule 12.03.2016