2011-01-10 1 views
1

У меня встроенная библиотека PHPExcel с Kohana 3, и у вас есть проблема с выходом xls-файла. Когда я попытался создать файл xls на сервере (сохранить в файловой системе сервера), все в порядке, но когда я попытался вывести его с помощью header(), то файл поврежден и покажет мне в Excel некоторые странные символы.Kohana 3 + PhpExcel проблема с экспортом xls

Мой код в контроллер/action_index:

$this->auto_render = FALSE; 

$objPHPExcel = new PHPExcel(); 
$objPHPExcel->setActiveSheetIndex(0) 
    ->setCellValue('A1', 'Hello world!'); 

$type = 'xls'; 
$mimes = Kohana::config('mimes'); 
$mime = $mimes[$type][0]; 

$this->request->headers['Content-Type'] = "$mime; charset=utf-8;"; 
$this->request->headers['Content-Disposition'] = 'attachment;filename="01simple.xls"'; 
$this->request->headers['Cache-Control'] = 'max-age=0'; 

$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5'); 
$objWriter->save("php://output");` 

Спасибо за помощь и извините за мой английский.

PS: когда я пытаюсь Вывод PDF таким же образом, все выглядит хорошо, проблема только с XLS и XLSX ...

ответ

0

Kohana имеет очень удобную функцию, чтобы заставить загрузки называемые «send_file». Попробуйте это:

$objPHPExcel = new PHPExcel(); 
$objPHPExcel->setActiveSheetIndex(0) 
    ->setCellValue('A1', 'Hello world!'); 
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5'); 

$this->request->response = $objWriter->save('php://output'); 
$this->request->send_file(TRUE, '01simple.xls'); 

Я не думаю, что вам нужно изменить заголовки запроса, для кодировки кодирования, может быть, за исключением.

Позвольте Kohana сделать магию (он проверяет тип MIME по имени файла «01simple.xls», например);). Кстати, вам не нужно отключить auto_render, так как функция send_file() делает это :)

Подробнее: http://kohanaframework.org/guide/api/Request#send_file

+0

не работают, отослано файл пуст (0Bytes). Но спасибо за интересную функцию, не знаю о send_file() ... –

+0

вы могли бы скопировать свой код? –

0

См this article.

Для формата Excel5 вы должны использовать:

$this->request->headers['Content-Type'] = 'application/vnd.ms-excel';

Для формата Excel2007:

$this->request->headers['Content-Type'] = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';

Или можно использовать готовые module kohana-phpexcel.

+1

Спасибо, но эти форматы не помогли, выведенный файл по-прежнему поврежден. На данный момент я решил свою проблему следующим образом: сохранить сгенерированные xls на сервере, а затем загрузить его с там, где есть гиперссылка ..., а не идеально, но работать пока ... –

1

Я использую Kohana 3.2, а также следующее:

$objPHPExcel = new PHPExcel(); 
$objPHPExcel->setActiveSheetIndex(0)->setCellValue('A1', 'Hello world!'); 
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5'); 

$this->response->body($objWriter->save('php://output')); 
$this->response->send_file(TRUE, '01simple.xls'); 

Обратите внимание на $this->response->body() и $this->response->send_file().

Это имеет смысл для меня, вы хотите отправить файл в RESPONSE, а не отправлять файл в REQUEST.

0

Я использую это, и он работает.

$writer = PHPExcel_IOFactory::createWriter($excel, 'Excel2007'); 

// Save to the output buffer. Internally the writer creates a temporary 
// file to zip it up, then copies it to the php output buffer/stream. 
$writer->save('php://output'); 

$mime = File::mime_by_ext(strtolower(pathinfo($filename, PATHINFO_EXTENSION))); 
$size = ob_get_length(); 

$this->response->header('content-disposition', 'attachment; filename="'.$filename.'"'); 
$this->response->header('content-type', $mime); 
$this->response->header('content-length', (string) $size); 

// Send all headers now 
$this->response->send_headers(); 

Я не могу видеть, как другие ответы будут работать -> Сохранить ('PHP: // выход') не возвращает ничего, так что $ this-> response-> тело() получает ничего и просто действует как геттер - эффективно NOP.

Если вы вызываете это из класса Controller_Template, вам нужно убедиться, что auto_render установлен на false, я верю.

0

Это далеко, но я прочел проблему об этом на github. Предлагаемое быстрое решение состоит в том, чтобы изменить заголовок, созданный с помощью xls-like, до text/csv.Так что в вашем коде, попробуйте следующее:

$this->request->headers['Content-Type'] = "text/csv; charset=utf-8;";

или

$this->request->headers['Content-Type'] = "text/csv;";