http://qs321.pair.com?node_id=11107168


in reply to Excel-Writer-XLSX : Excel file with warning messages

Just speculation, but have you closed the Excel file at the perl end before the link is sent and accessed?

See https://metacpan.org/pod/Excel::Writer::XLSX#close()

Otherwise it is probably perhaps not a perl issue, as per the comment by marto in 11107125.

  • Comment on Re: Excel-Writer-XLSX : Excel file with warning messages

Replies are listed 'Best First'.
Re^2: Excel-Writer-XLSX : Excel file with warning messages
by swl (Parson) on Oct 08, 2019 at 06:23 UTC

    Here is some code to get to the same error message.

    Run the code to the point it pauses, then try to open the perl.xlsx file using Excel.

    It uses an undocumented internal method, so hopefully is not what is actually being done. I tried a few variants of deferred close etc. but without success as all files were zero sized until the close method is called (or objects destroyed). Perhaps there is a point where Excel::Writer::XLSX reaches a memory or size threshold and writes the data to file, and this is being hit by the OP.

    # adapted from the Excel::Writer::XLSX synopsis use 5.010; use warnings; use Excel::Writer::XLSX; my $workbook = Excel::Writer::XLSX->new( 'perl.xlsx' ); # Add a worksheet $worksheet = $workbook->add_worksheet(); # some data for my $row (0..5) { for my $col (0..2) { $worksheet->write( $row, $col, $row ); } } # internal method used in ->close() $workbook->_store_workbook(); $workbook->close(); { # defer garbage collection to test file local $| = 1; say 'Pausing, press any key to continue'; my $pause = <>; }

      Dear Friends: Thanks for taking patience in answering the question. I have the issue resolved like this but I am not sure how it works. Here is the code

      my $subject="Monthly Report"; my $file_link="\n Dear Customer: Please click on the link below to dow +nload the Monthly Report for the month of 2019-05. <br><br> <a href=\ +"https://$hostname/ui_report/download_report?file=$fileloc\">Download + Report</a></center> \n\n"; # $fileloc contains the path of the store +d file in our server. &SendEmail($from,$toAddress,$cc,$bcc,$subject,'text/html',$file_link,$ +from); # This module sends an email with link - by clicking will down +load the excel report. In the "download_report" script: if ($file =~ /\.xlsx$/) { print "Content-type: application/vnd.openxmlformats-officedocument.spr +eadsheetml.sheet\n"; # The Content-Disposition will generate a prompt to save the file. print "Content-Disposition: attachment; filename=$file\n"; print "\n"; &download ($fileloc); exit 0; # NEWLY ADDED DUE TO ISSUE IN EXCEL REPORT OPENING } print "Content-Type: text/html\r\n\r\n"; my $cgi = new CGI; print $cgi->redirect("tent"); print "The redirect seems to have failed."; die;

      By simply adding "exit 0; " statement I am able to download and view the report without any warnings. I believe previously after the execution of if block, it continued the execution and it might have created the problem. Please let me know if my explanation is not sufficient.

      Above
        it continued the execution and it might have created the problem

        Yes, adding Content-Type: text/html to the end of the downloaded file.

        poj

        I can only speculate that your email script is sending the link before the file is completely written, but the fact that it has all the content makes me think that is unlikely. Maybe you are using an older version of Excel::Writer::XLSX and it has been since fixed? (The change log does not indicate anything, though, and the git log has the most recent changes to the close() method at eight years ago).

        You also say you use scripts, which suggests you are calling them using system, exec or similar instead of loading code from .pm files. Maybe there is something in that.

        It is easier to diagnose issues if you provide a short, self contained, correct example.