2015-08-17 2 views
0

Я пытаюсь разобрать файл .xlsx используя Spreadsheet::Read же код работает для .xls файлов, но выдает ошибку .xlsx ниже процедура:не смог разобрать XLSX с Spreadsheet :: Read

  1. Мы создаем кнопку файл для загрузки (просмотра) в .cgi файл с именем "csv_path".
  2. , когда пользователь отправляет форму (конечно, его многочастному/форма-данные)
  3. код на следующей странице

    use CGI; 
    use Spreadsheet::Read; 
    use Spreadsheet::ParseExcel; 
    use Data::Dumper qw(Dumper); 
    
    #will catch uploaded file. 
    my $fname = $query->param("csv_path"); 
    
    print Dumper($fname); 
    #just for confirmation we printed variable $fname 
    #when .xls is uploaded $fname contains: 
    #$VAR1 = bless(\*{'Fh::fh00001308_4_template.xls'}, 'Fh'); 
    #when .xlsx is uploaded $fname contains: 
    #$VAR1 = bless(\*{'Fh::fh00001308_4_template.xlsx'}, 'Fh'); 
    
    #now read the file with "Spreadsheet::Read" 
    my $data_xls = ReadData ($fname, "strip"=>3, "dtfmt" => "mm/dd/yyyy");#here if we pass .xlsx file name(stored on server) to ReadData() it works properly. 
    
    
    #print out of Spreadsheet::Read 
    print "<pre>"; 
    print Dumper($data_xls); 
    
    #when .xls is uploaded $data_xls comes up with all required data 
    
    #when .xlsx is uploaded below error occurs 
    # XLSX parser cannot parse data: Undefined subroutine Fh::opened 
    

Просьба предложить, если какие-либо изменения, требуется или любая вещь отсутствует.

+1

use [Spreadsheet :: XLSX] (http://search.cpan.org/~dmow/Spreadsheet-XLSX-0.13-withoutworldwriteables/lib/Spreadsheet/XLSX.pm) для синтаксического анализа файлов xlsx – Jens

+0

уже есть код, написанный для синтаксического анализа .xls с использованием «Spreadsheet :: Read», я просто хочу улучшить то же самое для файлов .xlsx, если использовать Spreadsheet :: XLSX не потребует каких-либо изменений кода, тогда это нормально для меня. [также у меня нет таблицы: XLSX установлен и нет доступа для установок] – Ganesh

+0

ok, но если мы передадим файл .xlsx, хранящийся на сервере, в ту же функцию, он вернет надлежащий выход. Я предполагаю, что есть некоторая проблема с данными потока (благословить (\ * {'Fh :: fh00001308_4_template.xls'}, 'Fh')) здесь. – Ganesh

ответ

0

Здесь вместо прямого передачи данных потока мы должны хранить файл во временном местоположении, а затем передавать имя файла с указанием местоположения функции ReadData().
см ниже код:

use CGI; 
use Spreadsheet::Read; 
use Spreadsheet::ParseExcel; 
use Data::Dumper qw(Dumper); 

my $corrected_filename = $query->param('csv_path'); 
$corrected_filename =~ s/ /_/g; 
# $corrected_filename .= "$username"; 
#store file locally 
local $| = 1; 
my ($bytesread,$buffer,$file); 
my $fh = $query->upload('csv_path'); 
open(OUTF, '>' . "/tmp/upload-".$corrected_filename); 
while ($bytesread = read($fh, $buffer, 1024)) { 
    print(OUTF $buffer); 
} 
close(OUTF); 
my $data_xls = ReadData ("/tmp/upload-".$corrected_filename, "strip"=>3, "dtfmt" => "mm/dd/yyyy");#here if we pass .xlsx file name(stored on server) to ReadData() it works properly. 


#print out of Spreadsheet::Read 
print "<pre>"; 
print Dumper($data_xls); 

И когда код, считанный отделку можно разъединить файл.

Смежные вопросы