2011-01-10 17 views
1

私はKohana 3とPHPExcelライブラリを統合しましたが、出力xlsファイルに問題があります。私はサーバー上でxlsファイルを作成しようとすると(サーバーファイルシステム上に保存)すべての問題はありませんが、私は出力ファイルをheader()で出力しようとしたときにファイルが破損しています。Kohana 3 + PhpExcelに問題がありました。

コントローラ/ 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ファイルと同じようにしようとすると、すべてがすべて右に見えますが、問題は

答えて

0

Kohanaのは「send_file」と呼ばれるダウンロードを強制的に本当に素晴らしい機能を持っている...だけXLSとXLSXです。これを試してみてください:

$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'); 

おそらく、charsetエンコーディングを除いてリクエストヘッダーを変更する必要はありません。

Kohanaは魔法を実行します(たとえば、ファイル名 "01simple.xls"でMIMEタイプをチェックします)。 http://kohanaframework.org/guide/api/Request#send_file

+0

いけない仕事、sendedではファイルが(0Bytes)は空です。しかし、面白い関数のおかげで、send_file()について知りませんでした... –

+0

あなたのコードをペーストできますか? –

0

this articleを参照してください:ところで、あなたはsend_file()関数以降auto_renderを無効にする必要はありませんし、それは

詳細を:)します。 Excel5形式の場合

あなたが使用する必要があります。

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

それとも既製module kohana-phpexcelを使用することができます:Excel2007形式の場合

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

を。

+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->対応 - >体()は何も取得しませんゲッターとして機能します。事実上NOPです。

これをController_Templateクラスから呼び出す場合は、auto_renderがfalseに設定されていることを確認する必要があります。

0

これは遠いですが、私はgithubでこれに関する問題を読んでいます。クイックフィックスは、xlsのようなヘッダ形式をtext/csvに変更することです。だからあなたのコードでこれを試してみてください。

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

または

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