PHPexcel заголовок в Laravel

Я практикую phpExcel в Laravel 4. Следующий код основан на этом упражнении phpExcel. Он отлично работает за пределами Laravel. Поскольку я изменил только необходимый код, чтобы он соответствовал пути установки, я считаю, что многие пользователи Laravel столкнутся с той же проблемой, если будут использовать phpExcel. Я верю, что некоторые эксперты уже решили эту проблему, и надеюсь, что они могли бы помочь мне.

header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Disposition: attachment;filename="01simple.xlsx"');
header('Cache-Control: max-age=0');
ob_clean();
flush();
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
$objWriter->save('d:/l4/test/01simple.xlsx');
ob_end();
exit;

Тем не менее, я получаю это сообщение об ошибке, когда я помещаю код в View:

Excel не может открыть файл 01simple.xlsx, так как формат файла или расширение файла недопустимы.

Я много гуглил и пробовал несколько вариантов, но пока не повезло. Я видел похожий вопрос, где кто-то решил это, добавив ob_clean() а также flush() просто под заголовком, но это не работает в Laravel.

У меня MS Excel 2010 и загруженный файл можно открыть вручную. Я использую WAMP (php 5.4) и протестировал как Firefox, так и IE. Вот полный код в представлении:

<?php
/** Error reporting */
error_reporting(E_ALL);
ini_set('display_errors', TRUE);
ini_set('display_startup_errors', TRUE);
date_default_timezone_set('Asia/Taipei');

if (PHP_SAPI == 'cli')
die('This example should only be run from a Web Browser');

/** Include PHPExcel */
$pRoot=dirname(dirname(dirname(__FILE__))).'/vendor';
require_once $pRoot.'/phpoffice/phpexcel/Classes/PHPExcel.php';


// Create new PHPExcel object
$objPHPExcel = new PHPExcel();

// Set document properties
$objPHPExcel->getProperties()->setCreator("Maarten Balliauw")
                         ->setLastModifiedBy("Maarten Balliauw")
                         ->setTitle("Office 2007 XLSX Test  Document")
                         ->setSubject("Office 2007 XLSX Test Document")
                         ->setDescription("Test document for Office 2007 XLSX, generated using PHP classes.")
                         ->setKeywords("office 2007 openxml php")
                         ->setCategory("Test result file");


// Add some data
$objPHPExcel->setActiveSheetIndex(0)
        ->setCellValue('A1', 'Hello')
        ->setCellValue('B2', 'world!')
        ->setCellValue('C1', 'Hello')
        ->setCellValue('D2', 'world!');

// Miscellaneous glyphs, UTF-8
$objPHPExcel->setActiveSheetIndex(0)
        ->setCellValue('A4', 'Miscellaneous glyphs')
        ->setCellValue('A5', 'TW');

// 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);


// Redirect output to a client’s web browser (Excel2007)

//$file = "myfile.xlsx";
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Disposition: attachment;filename="01simple.xlsx"');
header('Cache-Control: max-age=0');
ob_clean();
flush();
//readfile($file);
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
$objWriter->save('d:/l4/test/01simple.xlsx');
ob_end();
exit;

1 ответ

Первый:

"phpexcel/phpexcel": "dev-master"

поместите строку выше в вашем composer.json'е, в опции require для Laravel. Затем сделайте composer update после этого вам не нужно выполнять работу require_once, Laravel должен был сделать это для вас.

во-вторых: вы запрашиваете это действие, генерирующее Excel с Ajax? если вы делаете, я предлагаю вам использовать обычный способ. причина, по которой метод запроса Ajax повлияет на формат данных.

третье: не используйте это:
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');чтобы создать объект записи "Excel2007", вы можете использовать его только для создания объекта записи "Excel2005". используйте метод ниже:

   $objWriter = new PHPExcel_Writer_Excel2007($objPHPExcel);
   $objWriter->setOffice2003Compatibility(true);
   $objWriter->save($path);

желаю удачи!

Другие вопросы по тегам