PHPExcel export not working : displays "the website cannot be reached" - php

I have cloned a project from server and installed in my local setup.
I am trying to export excel file to the browser using PHPExcel. It is working fine in the server. But there is problem with the local setup.
Also I checked number of columns and fields and they are fine.
Below is the code:
<?php
//PHPExcel starts from here
error_reporting(E_ALL);
ini_set('display_errors', TRUE);
ini_set('display_startup_errors', TRUE);
date_default_timezone_set('Asia/Kathmandu');
if (PHP_SAPI == 'cli')
die('Error in loading PHPExcel');
// Create new PHPExcel object
$objPHPExcel = new PHPExcel();
// Set document properties
$objPHPExcel->getProperties()->setCreator("GBD Admin")
->setLastModifiedBy("GBD Admin")
->setTitle("Weekly checkin/checkout log")
->setDescription("Test document for PHPExcel, generated using PHP classes.")
->setKeywords("Checkin/Checkout Logs")
->setCategory("Checkin/Checkout Logs");
// Add some data
$objPHPExcel->setActiveSheetIndex(0)
->setCellValue('A1', 'Date of Export')
->setCellValue('B1', $now)
->setCellValue('A3', 'Employee Name')
->setCellValue('B3', ' Checkin-date')
->setCellValue('C3', ' Checkin-time')
->setCellValue('D3', ' Checkout-date')
->setCellValue('E3', ' Checkout-time')
// ->setCellValue('F3', ' Total-time Spent')
// ->setCellValue('G3', ' Over-time')
->setCellValue('F3', ' Early checkout-remarks')
->setCellValue('G3', ' Late checkin-remarks');
// Newly added statement below
// ->setCellValue('H3', ' Absent/Leave Remarks');
$objPHPExcel->getActiveSheet()->getStyle('A1:B1')->getFont()->setBold(true);
$objPHPExcel->getActiveSheet()->getStyle('A3:H3')->getFont()->setBold(true);
$objPHPExcel->getActiveSheet()->fromArray($results, null, 'A5');
$objPHPExcel->getActiveSheet()->getColumnDimension('A')->setWidth(20);
$objPHPExcel->getActiveSheet()->getColumnDimension('B')->setWidth(15);
$objPHPExcel->getActiveSheet()->getColumnDimension('C')->setWidth(15);
$objPHPExcel->getActiveSheet()->getColumnDimension('D')->setWidth(15);
$objPHPExcel->getActiveSheet()->getColumnDimension('E')->setWidth(15);
$objPHPExcel->getActiveSheet()->getColumnDimension('F')->setWidth(45);
$objPHPExcel->getActiveSheet()->getColumnDimension('G')->setWidth(45);
// Rename worksheet
$objPHPExcel->getActiveSheet()->setTitle('Login-data-' . $now);
// Set active sheet index to the first sheet, so Excel opens this as the first sheet
$objPHPExcel->setActiveSheetIndex(0);
// Redirect output to a client’s web browser (Excel5)
header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment;filename="Login_data_' . $now . '.xls"');
header('Cache-Control: max-age=0');
// If you're serving to IE 9, then the following may be needed
header('Cache-Control: max-age=1');
// If you're serving to IE over SSL, then the following may be needed
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); // Date in the past
header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT'); // always modified
header('Cache-Control: cache, must-revalidate'); // HTTP/1.1
header('Pragma: public'); // HTTP/1.0
$objWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
$objWriter->save('php://output');
exit;
?>
I have been getting this error:
This site can’t be reached
The webpage at http://localhost/gbdportal-new/Export might be
temporarily down or it may have moved permanently to a new web
address. ERR_INVALID_RESPONSE
It is working fine with the live version currently running on the server. What could be the problem?

This is a bug in phpExcel in combination with php7:
https://github.com/PHPOffice/PHPExcel/issues/716

on Line 581 of file PHPExcel/Classes/PHPExcel/Calculation/Functions.php there is a " break" , simply comment.

Related

Export mysql table data as xlsx format using phpspreadsheet,can't not importing

I used phpspreadsheet to export mysql table data as XLSX format but after exporting when I import the XLSX file its not importing.the exported xlsx file data is ok.If I copy the data in another XLSX file then it works perfectly.
Thanks in advance!
<?php
require 'connect.php';
require 'vendor/autoload.php';
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
use PhpOffice\PhpSpreadsheet\IOFactory;
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
$sheet->setCellValue('A1', 'Program');
$sheet->setCellValue('B1', 'FormalCode');
$sheet->setCellValue('C1', 'Title');
$sql = "select * from class_routine";
$result = $conn->query($sql);
if($result->num_rows > 0){
$n = 1;
while($row = $result->fetch_assoc()){
$rowNum = $n + 1;
$sheet->setCellValue('A' .$rowNum, $row['Program']);
$sheet->setCellValue('B' .$rowNum, $row['FormalCode']);
$sheet->setCellValue('C' .$rowNum, $row['Title']);
$n++;
}
}
$filename = 'ClassRoutine-template-'.time().'.xlsx';
// Redirect output to a client's web browser (Xlsx)
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Disposition: attachment;filename="'.$filename.'"');
header('Cache-Control: max-age=0');
// If you're serving to IE 9, then the following may be needed
header('Cache-Control: max-age=1');
// If you're serving to IE over SSL, then the following may be needed
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); // Date in the past
header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT'); // always modified
header('Cache-Control: cache, must-revalidate'); // HTTP/1.1
header('Pragma: public'); // HTTP/1.
$writer = IOFactory::createWriter($spreadsheet, 'Xlsx');
$writer->save('php://output');
Full Code Here https://pastebin.com/imP2QdLm
Giving this warnings when importing the exported xlsx file in import page:
Warning: XMLReader::open(): Empty string supplied as input in C:\xampp\htdocs\corap\vendor\SpreadsheetReader_XLSX.php on line 959
Warning: XMLReader::read(): Load Data before trying to read in C:\xampp\htdocs\corap\vendor\SpreadsheetReader_XLSX.php on line 995
Warning: XMLReader::read(): Load Data before trying to read in C:\xampp\htdocs\corap\vendor\SpreadsheetReader_XLSX.php on line 995

Change saving directory in phpspreadsheet

Im using PhpSpreadsheet to generate XLS files, all the functions work perfect except that it saves local files in temporary directories and I want to save them in a specific folder.
use PhpOffice\PhpSpreadsheet\IOFactory;
require __DIR__ . '/Header.php';
$spreadsheet = require __DIR__ . '/templates/MyTemplate.php';
$filename = $helper->getFilename("MyFilename", 'xls');
$writer = IOFactory::createWriter($spreadsheet, 'Xls');
$callStartTime = microtime(true);
$writer->save($filename);
$helper->logWrite($writer, $filename, $callStartTime);
But the output is located in
Write Xls format to /var/folders/pn/lyj970q90lq20mjv39bpgx_80000gn/T/phpspreadsheet/MyFilename.xls in 0.0640 seconds
Is there an other function to set the saving directory I want the files in?
Use dot in path
$writer->save("./templates/MyFilename.xls");
On this line:
$filename = $helper->getFilename("MyFilename", 'xls');
Change to:
$filename = basename($helper->getFilename("MyFilename", 'xls'));
This way, $filename will only contain the file name. Then you can insert your path and make it work as you want, as I did with mine:
$writer->save('C:/xampp/htdocs/tmp/' . $outputFileName);
Make sure these lines are commented out. Since this parameter will tell the server to export Xlsx as downloadable file. Not in specific custom location.
// Redirect output to a client’s web browser (Xlsx)
// header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
// header('Content-Disposition: attachment;filename="'.$FileName.'"');
// header('Cache-Control: max-age=0');
// // If you're serving to IE 9, then the following may be needed
// header('Cache-Control: max-age=1');
// If you're serving to IE over SSL, then the following may be needed
// header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); // Date in the past
// header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT'); // always modified
// header('Cache-Control: cache, must-revalidate'); // HTTP/1.1
// header('Pragma: public'); // HTTP/1.0
And finally you can save your file :
$writer->save("Location/Of/YourFolder".$YourFileName);
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Disposition: attachment;filename="myfile.xlsx"');
header('Cache-Control: max-age=0');
$writer = \PhpOffice\PhpSpreadsheet\IOFactory::createWriter($spreadsheet, 'Xlsx');
$writer->save('php://output');
source
https://phpspreadsheet.readthedocs.io/en/latest/topics/recipes/#redirect-output-to-a-clients-web-browser

PhpExcel - Can't open the downloaded file

[This guy seems to have the same problem as me but it's Java and I don't understand anything :/ excel can not open the downloaded file through jsp ]
Hello everyone,
First of all, I want to say that English isn't my mother language so you might see some mistakes but I hope you will understand me.
So I'm a student and I have a 'student job', creating a website for a micro-bakery! They need to have a file with all their clients and I decided to use PhpExcel to generate it!
I did everything properly but it still doesn't work! I looked for help on google of course but nobody has the same error message as me. Here is what I get.
Error message I get when I try to open the file : In english : "Impossible to open the file "....xlsx" because it's format or extension is not valid. Please verify that the file is not broken and that it's extension match the file format"
The source code is here : `
if($action=="client-excel"){
/** Error reporting */
error_reporting(E_ALL);
ini_set('display_errors', TRUE);
ini_set('display_startup_errors', TRUE);
date_default_timezone_set('Europe/London');
/** Include PHPExcel */
require_once '../libs/phpExcel/PHPExcel.php';
// Create new PHPExcel object
$objPHPExcel = new PHPExcel();
// Set document properties
$objPHPExcel->getProperties()->setCreator("BakeryName")
->setLastModifiedBy("Clients")
->setTitle("Liste Clients ")
->setSubject("Liste Clients ")
->setDescription("Liste Clients ")
->setKeywords("Liste Clients ")
->setCategory("Liste Clients");
$toSupp=array();
$objPHPExcel->createSheet();
$array=array();
$array['header'][]="#client";
$array['header'][]="Nom";
$array['header'][]="Mail";
$array['header'][]="Nombre de pain(s) acheté(s)";
$array['data']=array();
$list = Client::getAllClients($order="id_client",$letter="",$valid=false,$start=0,$limit=100000); foreach($list as $client){
$client_array=array(
$client->getId(),
$client->getName(),
$client->getEmail(),
$client->getNbPainsCmd(),
);
$array['data'][]=$client_array;
}
if(sizeof($array['data'])==0){
$toSupp = $z;
}
$objPHPExcel->setActiveSheetIndex(0);
$j=0;
foreach($array['header'] as $h){
$objRichText = new PHPExcel_RichText();
$objRichText->createTextRun($h)->getFont()->setBold(true);
$objPHPExcel->getActiveSheet()->setCellValueByColumnAndRow ($j,1, $objRichText);
$objPHPExcel->getActiveSheet()->getColumnDimensionByColumn($j)->setAutoSize(true);
$j++;
}
for($i=0;$i<sizeof($array['data']);$i++){
for($j=0;$j<sizeof($array['data'][$i]);$j++){
$objPHPExcel->getActiveSheet()->setCellValueByColumnAndRow ($j,$i+2, $array['data'][$i][$j]);
}
}
// Rename worksheet
$objPHPExcel->getActiveSheet()->setTitle("Liste clients");
// Redirect output to a client’s web browser (Excel2007)
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Disposition: attachment;filename="filename.xlsx"');
header('Cache-Control: max-age=0');
header('Cache-Control: max-age=1');
header ('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); // Date in the past
header ('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT'); // always modified
header ('Cache-Control: cache, must-revalidate'); // HTTP/1.1
header ('Pragma: public'); // HTTP/1.0
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
$objWriter->save('php://output');
exit;
}`
Thank you very much for all your potential answers!

Download an Excel file from web server folder

I am using PHPExcel to get Oracle SQL query results to an .xlsx file. I wrote my PHP code in node--18769.tpl.php and node--18769.tpl.xlsx file is downloading to webroot (/root/themes/bartik/templates) folder with result.
My requirement:
Can I rename node--18769.tpl.xlsx to report.xlsx?
Is it possible to prepend UNIX TIMESTAMP to file name? (like 1442223364_report.xlsx)
How can I download report.xlsx to my local system once after the file is generated?
This is my code:
require_once dirname(__FILE__) . '/Classes/PHPExcel.php';
// Create new PHPExcel object
$objPHPExcel = new PHPExcel();
// Set document properties
// Add some data
$query = "SELECT DISTINCT TITLE, PID, TYPE, SUM(DAYCOUNT) AS tot, ROUND(SUM(DAYCOUNT)/( SELECT SUM(DAYCOUNT) FROM REPORT_LIST_VIEW), 4) AS per FROM REPORT_LIST_VIEW WHERE DAYCOUNT > '0' GROUP BY TITLE, PID, TYPE ORDER BY tot DESC";
//print $query; exit;
$res = db_query($query);
$rowNumber = 1;
while ( $dataFetched = $res->fetchAssoc() ) {
$objPHPExcel->setActiveSheetIndex(0)
->setCellValue('A'.$rowNumber, $dataFetched['title'])
->setCellValue('B'.$rowNumber, $dataFetched['tot'])
->setCellValue('C'.$rowNumber, $dataFetched['per']);
$rowNumber++;
}
// Miscellaneous glyphs, UTF-8
$objPHPExcel->getActiveSheet()->getRowDimension(8)->setRowHeight(-1);
$objPHPExcel->getActiveSheet()->getStyle('A8')->getAlignment()->setWrapText(true);
// Rename worksheet
$objPHPExcel->getActiveSheet()->setTitle('Page & Files Reports ');
// Set active sheet index to the first sheet, so Excel opens this as the first sheet
$objPHPExcel->setActiveSheetIndex(0);
$objPHPExcel->getActiveSheet()->setCellValue('A8',"Hello\nWorld");
$objPHPExcel->getActiveSheet()->getRowDimension(8)->setRowHeight(-1);
$objPHPExcel->getActiveSheet()->getStyle('A8')->getAlignment()->setWrapText(true);
// Rename worksheet
$objPHPExcel->getActiveSheet()->setTitle('Simple');
// Set active sheet index to the first sheet, so Excel opens this as the first sheet
$objPHPExcel->setActiveSheetIndex(0);
// Save Excel 2007 file
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
$objWriter->save(str_replace('.php', '.xlsx', __FILE__));
Code updated:
$objPHPExcel->getActiveSheet()->setTitle('Simple');
// Set active sheet index to the first sheet, so Excel opens this as the first sheet
$objPHPExcel->setActiveSheetIndex(0);
// Redirect output to a client’s web browser (Excel2007)
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Disposition: attachment;filename="01simple.xlsx"');
header('Cache-Control: max-age=0');
// If you're serving to IE 9, then the following may be needed
header('Cache-Control: max-age=1');
// If you're serving to IE over SSL, then the following may be needed
header ('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); // Date in the past
header ('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT'); // always modified
header ('Cache-Control: cache, must-revalidate'); // HTTP/1.1
header ('Pragma: public'); // HTTP/1.0
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
$objWriter->save('php://output');
exit;
This line
$objWriter->save(str_replace('.php', '.xlsx', __FILE__));
tells PHPExcel what filename to use when you save the file.... simply change it to
$objWriter->save("WHATEVER_YOU_WANT_TO_CALL_THE_FILE.xlsx);
If you want to download the file to local, then save to php://output and send the appropriate headers to the browser, exactly as described in the documentation and shown in the examples provided with PHPExcel
// write the file
$objWriter->save('Excel_report/'filename');
//Redirect output to a client’s web browser (Excel2007)
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Disposition: attachment;filename="Contact.xlsx"');
header('Cache-Control: max-age=0');
// If you're serving to IE 9, then the following may be needed
header('Cache-Control: max-age=1');
header ('Cache-Control: cache, must-revalidate'); // HTTP/1.1
header ('Pragma: public'); // HTTP/1.0
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
$objWriter->save('php://output');
exit;

Generating and downloading an excel file generates a ERR_INVALID_RESPONSE

This is my code:
public function downloadexcel($requestId) {
$this->loadModel('MaterialsRequest');
$materialsRequests = $this->MaterialsRequest->find('all', array('conditions' => array('MaterialsRequest.request_id' => $requestId)));
date_default_timezone_set('Europe/London');
if (PHP_SAPI == 'cli')
die('This example should only be run from a Web Browser');
/** Include PHPExcel */
//require_once dirname(__FILE__) . '/../Classes/PHPExcel.php';
// Create new PHPExcel object
$objPHPExcel = new PHPExcel();
// Set document properties
$objPHPExcel->getProperties()->setCreator("mez")
->setLastModifiedBy("mez")
->setTitle("Supply Template")
->setSubject("Supply Template")
->setDescription("Supply Template , please fill and upload.")
->setKeywords("office 2007 openxml php")
->setCategory("Supply");
$objPHPExcel->getActiveSheet()->getColumnDimension('A')->setWidth(10);
$objPHPExcel->getActiveSheet()->getColumnDimension('B')->setWidth(40);
$objPHPExcel->getActiveSheet()->getColumnDimension('C')->setWidth(30);
$objPHPExcel->getActiveSheet()->getColumnDimension('D')->setWidth(30);
$objPHPExcel->getActiveSheet()->getStyle('A')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_LEFT);
$objPHPExcel->getActiveSheet()->getStyle('B')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::VERTICAL_CENTER);
$objPHPExcel->getActiveSheet()->getStyle('C')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::VERTICAL_CENTER);
$objPHPExcel->getActiveSheet()->getStyle('D')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::VERTICAL_CENTER);
// Add some data
$objPHPExcel->setActiveSheetIndex(0)
->setCellValue('A1', 'Material ID')
->setCellValue('B1', 'Material Name')
->setCellValue('C1', 'Quantity')
->setCellValue('D1', 'Your offer');
$index = 2;
foreach ($materialsRequests as $oneMaterialsRequests) {
$objPHPExcel->setActiveSheetIndex(0)
->setCellValue('A' . $index, $oneMaterialsRequests['MaterialsRequest']['material_id'])
->setCellValue('B' . $index, $oneMaterialsRequests['Material']['name'])
->setCellValue('C' . $index, $oneMaterialsRequests['MaterialsRequest']['qty'])
->setCellValue('E' . $index, $oneMaterialsRequests['MaterialsRequest']['id']);
$index++;
}
/// Set sheet security
$MaterialsRequestsNo = count($materialsRequests);
$MaterialsRequestsNo+=1; //add count for header
$objPHPExcel->getActiveSheet()->getProtection()->setSheet(true);
$objPHPExcel->getActiveSheet()
->getStyle('D2:D' . $MaterialsRequestsNo)
->getProtection()->setLocked(
PHPExcel_Style_Protection::PROTECTION_UNPROTECTED
);
// Miscellaneous glyphs, UTF-8
// Rename worksheet
$objPHPExcel->getActiveSheet()->setTitle('Supply');
// Set active sheet index to the first sheet, so Excel opens this as the first sheet
$objPHPExcel->setActiveSheetIndex(0);
// Redirect output to a client’s web browser (Excel2007)
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Disposition: attachment;filename="Supply.xlsx"');
header('Cache-Control: max-age=0');
// If you're serving to IE 9, then the following may be needed
header('Cache-Control: max-age=1');
// If you're serving to IE over SSL, then the following may be needed
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); // Date in the past
header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT'); // always modified
header('Cache-Control: cache, must-revalidate');// HTTP/1.1
header('Pragma: public'); // HTTP/1.0
$objWriter=PHPExcel_IOFactory::createWriter($objPHPExcel,'Excel2007');
$objWriter->save('php://output');
exit;
}
From my local server operating on lamp when I call this function I can get the excel sheet and the web page would close after I call the function, when I'm calling it however on my apache server it brings out the error: ERR_INVALID_RESPONSE, I went through the code putting a die(); after each line to see how it would respond and up until putting a die() after $objWriter=PHPExcel_IOFactory::createWriter($objPHPExcel,'Excel2007'); it would download the spreadsheet but it would be corrupted and wouldn't close the page and it wouldn't bring up that error message, however apparently $objWriter->save('php://output'); is causing the error to come up, the page would freeze and the excel file wouldn't get downloaded.
I debugging someone else's code but I can't figure this part out.
Eventually the issue was in the ZipArchive class, that's why it worked on one server and didn't work on the other.
More documentation here: http://www.php.net/manual/en/zip.installation.php
I had the same problem. Check with "php -m" It gives you a list of modules and check if You have the "zip" module installed. http://php.net/manual/en/book.zip.php
This module is needed for PhpExcel. If you don´t have it, try to install or change your php version. In my case I solved changing my php from 7 to php 5.5
You can try saving to temp file and serving it with the redirect instead:
$objWriter->save('wwwroot/some-file.xlsx');
header("Location: /some-file.xlsx");
exit();
Now with php 7.4 you have to use --with-zip option
in php 7.4
//$objWriter=PHPExcel_IOFactory::createWriter($objPHPExcel,'Excel2007');
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
$objWriter->save('php://output');
exit;

Categories