web-dev-qa-db-ja.com

PHPExcelを使用してxlsxにエクスポートする

私はPHPEXxcelを使用して、MYSQLなどを使用して生成されたHTMLテーブルをエクスポートしています。

<?php $query = "SELECT `Firstname`,`Lastname`,`Branch`,`Gender`,`Mobileno`, `Email`  
      FROM `student_details` WHERE Branch IN ('$branch') and `Year`='$year' 
         and Tenthresult > '$tenth' and 
      Twelthresult > '$twelth' and (CGPA > '$cgpa' || CGPA = '$cgpa')";  

$result = mysql_query($query);
confirm_query($result);
$objPHPExcel = new PHPExcel(); 
$objPHPExcel->setActiveSheetIndex(0); 

$rowCount = 1; 
$objPHPExcel->getActiveSheet()->SetCellValue('A'.$rowCount,'Firstname');
$objPHPExcel->getActiveSheet()->SetCellValue('B'.$rowCount,'Lastname');
$objPHPExcel->getActiveSheet()->SetCellValue('C'.$rowCount,'Branch');
$objPHPExcel->getActiveSheet()->SetCellValue('D'.$rowCount,'Gender');
$objPHPExcel->getActiveSheet()->SetCellValue('E'.$rowCount,'Mobileno');
$objPHPExcel->getActiveSheet()->SetCellValue('F'.$rowCount,'Email');

while($row = mysql_fetch_array($result)){ 
    $rowCount++;
    $objPHPExcel->getActiveSheet()->SetCellValue('A'.$rowCount, $row['0']);
    $objPHPExcel->getActiveSheet()->SetCellValue('B'.$rowCount, $row['1']);
    $objPHPExcel->getActiveSheet()->SetCellValue('C'.$rowCount, $row['2']);
    $objPHPExcel->getActiveSheet()->SetCellValue('D'.$rowCount, $row['3']);
    $objPHPExcel->getActiveSheet()->SetCellValue('E'.$rowCount, $row['4']);
    $objPHPExcel->getActiveSheet()->SetCellValue('F'.$rowCount, $row['5']);
} 

$objWriter = new PHPExcel_Writer_Excel2007($objPHPExcel); 
$objWriter->save('some_Excel_file.xlsx'); 
?>

動作しますが、ダウンロードされていることをユーザーに示すことなく、xlsxファイルをルートフォルダーに保存します。このコードは、button.nowをクリックすると実行されます。メールの添付ファイルをダウンロードし、ダウンロードしていることをフロントエンドのユーザーに場所と一緒に表示するようにダウンロードできます。

使ってみた

header('Content-Type: application/vnd.ms-Excel');
header('Content-Disposition: attachment;filename="01simple.xls"');
header('Cache-Control: max-age=0'); 

これで、私は上で欲しいものを手に入れていますが、開いたときにダウンロードされたxlsファイルには、「 'filename'を開こうとしているファイルは指定された拡張子とは異なる形式です...」というメッセージが表示されます今すぐ開ける?

開くと、HTMLページ全体または単に空白のいずれかが含まれます...誰か助けてもらえますか?

12
Ankur

スプレッドシート101

さまざまなスプレッドシートファイル形式があり、それぞれに独自のファイル名拡張子があり、さまざまなMIMEタイプを使用してWebブラウザーに送信できます。これらは、PHPExcelのドキュメントで説明されており、それぞれにPHPExcelの異なるライターがあります。 2つの異なる形式が一致していません

BIFF形式

  • バージョン95と2003の間でMicrosoft Excelによって使用されるファイル

  • 拡張子: xls

  • PHPEXcel Writer: PHPExcel_Writer_Excel5

  • MIMEタイプ: application/vnd.ms-Excel

OfficeOpenXML形式

  • バージョン2007以降のMicrosoft Excelで使用

  • ファイル拡張子: xlsx

  • PHPEXcel Writer: PHPExcel_Writer_Excel2007

  • MIMEタイプ: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet

混ぜて一致させないでください。そうすると、Excelが(そして正当な理由で)文句を言います。 BIFFファイルが必要な場合は、PHPExcelのBIFFライター(Excel5)、. xlsのファイル拡張子、およびBIFF形式用に上記のMIMEタイプを使用します。 OfficeOpenXMLファイルが必要な場合は、PHPExcelのExcel2007 Writer、ファイル拡張子.xlsx、および上記のOfficeOpenXMLのMIMEタイプを使用します。

[〜#〜] edit [〜#〜]

PHPExcelディストリビューションで提供されるサンプルには、01simple-download-xls.phpおよび01simple-download-xlsx.phpが含まれており、目的を正確に示すことができます。

18
Mark Baker

それらのヘッダーを追加するだけで、それらのヘッダーのみが送信されます。コードの残りの部分は同じなので、以前と同じようにxlsをルートフォルダーに保存しています。

ヘッダーを送信しても、通常表示されるページはxlsヘッダーで送信されます。あなたが望んでいるものではない何か、あなたはあなたのHTMLページを取得していますが、間違ったヘッダーを持っています。

必要なのは、それらのヘッダーを送信してから、xlsxをストリーミングすることです。

ランダムなスレッドを見る(悪いアイデアは知っていますが、これで何をすべきかがすぐにわかります) here 、次のような例を見つけることができます:

header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Content-Type: application/force-download");
header("Content-Type: application/octet-stream");
header("Content-Type: application/download");;
header("Content-Disposition: attachment;filename=$filename.xls");
header("Content-Transfer-Encoding: binary ");
$objWriter = new PHPExcel_Writer_Excel2007($objPHPExcel); 
$objWriter->setOffice2003Compatibility(true);
$objWriter->save('php://output');
8
Nanne

以下のスニペットを使用してそれを行います。

// Redirect output to a client’s web browser (Excel2007)
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Disposition: attachment;filename="test_file.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');
1
Zaid Bin Khalid

これを試して ..

header('Content-Type: application/vnd.ms-Excel');
    $filename = "Reports".date("d-m-Y-His").".xls";
    header('Content-Disposition: attachment;filename='.$filename .' ');
    header('Cache-Control: max-age=0');
    $objWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
    $objWriter->save('php://output');
0
Yusuf Mawahid