Magento 2.3.1 Загрузите файл excel с помощью PhpSpreadsheet
Попытка создать кнопку загрузки для Xlsx-файла. Для этого используется PhpSpreadsheet, однако при загрузке файла он кажется поврежденным с трассировкой стека в нижней части файлов excel:
Stack trace:
#0 [internal function]: Magento\Framework\App\ErrorHandler->handler(2, 'Cannot modify h...', '/var/www/buzzma...', 148, Array)
#1 /var/www/mage2/public_html/vendor/magento/framework/Stdlib/Cookie/PhpCookieManager.php(148): setcookie('X-Magento-Vary', 'b5a9446b2918d35...', 1553779873, '/', '', true, true)
#2 /var/www/mage2/public_html/vendor/magento/framework/Stdlib/Cookie/PhpCookieManager.php(101): Magento\Framework\Stdlib\Cookie\PhpCookieManager->setCookie('X-Magento-Vary', 'b5a9446b2918d35...', Array)
#3 /var/www/mage2/public_html/vendor/magento/framework/App/Response/Http.php(108): Magento\Framework\Stdlib\Cookie\PhpCookieManager->setSensitiveCookie('X-Magento-Vary', 'b5a9446b2918d35...', Object(Magento\Framework\Stdlib\Cookie\SensitiveCookieMetadata))
#4 /var/www/mage2/public_html/generated/code/Magento/Framework/App/Response/Http/Interceptor.php(37): Magento\Framework\App\Response\Http->sendVary()
#5 /var/www/mage2/public_html/vendor/magento/module-page-cache/Model/App/Response/HttpPlugin.php(25): Magento\Framework\App\Response\Http\Interceptor->sendVary()
#6 /var/www/mage2/public_html/vendor/magento/framework/Interception/Interceptor.php(121): Magento\PageCache\Model\App\Response\HttpPlugin->beforeSendResponse(Object(Magento\Framework\App\Response\Http\Interceptor))
#7 /var/www/mage2/public_html/vendor/magento/framework/Interception/Interceptor.php(153): Magento\Framework\App\Response\Http\Interceptor->Magento\Framework\Interception\{closure}()
#8 /var/www/mage2/public_html/generated/code/Magento/Framework/App/Response/Http/Interceptor.php(117): Magento\Framework\App\Response\Http\Interceptor->___callPlugins('sendResponse', Array, Array)
#9 /var/www/mage2/public_html/vendor/magento/framework/App/Http.php(186): Magento\Framework\App\Response\Http\Interceptor->sendResponse()
#10 /var/www/mage2/public_html/vendor/magento/framework/App/Http.php(157): Magento\Framework\App\Http->handleDeveloperMode(Object(Magento\Framework\App\Bootstrap), Object(Exception))
#11 /var/www/mage2/public_html/vendor/magento/framework/Interception/Interceptor.php(58): Magento\Framework\App\Http->catchException(Object(Magento\Framework\App\Bootstrap), Object(Exception))
#12 /var/www/mage2/public_html/vendor/magento/framework/Interception/Interceptor.php(138): Magento\Framework\App\Http\Interceptor->___callParent('catchException', Array)
#13 /var/www/mage2/public_html/vendor/magento/framework/Interception/Interceptor.php(153): Magento\Framework\App\Http\Interceptor->Magento\Framework\Interception\{closure}(Object(Magento\Framework\App\Bootstrap), Object(Exception))
#14 /var/www/mage2/public_html/generated/code/Magento/Framework/App/Http/Interceptor.php(39): Magento\Framework\App\Http\Interceptor->___callPlugins('catchException', Array, Array)
#15 /var/www/mage2/public_html/vendor/magento/framework/App/Bootstrap.php(264): Magento\Framework\App\Http\Interceptor->catchException(Object(Magento\Framework\App\Bootstrap), Object(Exception))
#16 /var/www/mage2/public_html/pub/index.php(40): Magento\Framework\App\Bootstrap->run(Object(Magento\Framework\App\Http\Interceptor))
#17 {main}
Выход с выходом; после $objWriter->save("php://output");
, кажется, работает нормально, но кажется беспорядочным.
Это пример моего кода в моем контроллере:
public function buildXls($list) {
$fileName = $this->getFileName($list) . ".xlsx";
$rootPath = $this->directoryList->getRoot();
$objPHPExcel = new spreadsheet;
$objPHPExcel->setActiveSheetIndex(0)
->setCellValue('A1', "TEST");
/*Original Method*/
/*
$objWriter = io_factory::createWriter($objPHPExcel, 'Xlsx');
header("Content-Type: application/vnd.ms-excel");
header("Content-Disposition: attachment; filename=" . $fileName);
header("Cache-Control: max-age=0");
$objWriter->save("php://output");
//FIX
exit;
*/
/*Magento Method?*/
$fileDirectory = \Magento\Framework\App\Filesystem\DirectoryList::MEDIA;
$filePath = $this->directoryList->getPath($fileDirectory) . "/" . $fileName;
$objWriter = io_factory::createWriter($objPHPExcel, 'Xlsx');
$objWriter->save($filePath);
$resultRaw = $this->fileFactory->create(
$fileName,
@file_get_contents($filePath)
);
return $resultRaw;
/*Magento Method End*/
}
Используя метод Magento или оригинальный метод, используемый без выхода, однако все они отображаются как поврежденные, я считаю, потому что трассировка стека, которая отображается в файлах. Как я могу загрузить этот файл, который был сгенерирован правильно, предпочтительно "способом Magento"?
1 answers
Тадаа:
use Magento\Framework\App\Response\Http\FileFactory;
use Magento\Framework\Stdlib\DateTime\DateTime;
use Magento\Framework\App\Filesystem\DirectoryList;
public function __construct(
FileFactory $_fileFactory,
DateTime $dateTime
) {
$this->_fileFactory = $_fileFactory;
$this->dateTime = $dateTime;
}
return $this->_fileFactory->create(
sprintf('myreport%s.xlsx', $this->dateTime->date('Y-m-d_H-i-s')), //file name during download
[
'type' => 'filename',
'value' => 'spreadsheet_export/spreadsheets/' . $localName, //relative path to your locally saved spreadsheet with $writer->save($fullpath);
'rm' => true // can delete file after use
],
DirectoryList::MEDIA,
'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
);
Проверьте
vendor/magento/module-offline-shipping/Controller/Adminhtml/System/Config/ExportTablerates.php
vendor/magento/module-sales/Controller/Adminhtml/Order/Pdfinvoices.php
Я взял это из гораздо большего класса, поэтому, очевидно, добавьте все необходимые принадлежности контроллера