web-dev-qa-db-ja.com

PHPExcelファイルは、ファイル形式またはファイル拡張子が無効であるため、ファイルを開くことができません

この問題に悩まされています。実際のExcelファイルが表示されません。以下の私のコードを確認してください:

/** Error reporting */
error_reporting(E_ALL);

/** PHPExcel */
require_once 'PHPExcel.php';
include 'PHPExcel/Writer/Excel2007.php';


// Create new PHPExcel object
#echo date('H:i:s') . " Create new PHPExcel object\n";
$objPHPExcel = new PHPExcel();
$Excel = new PHPExcel();

$objPHPExcel->getProperties()->setTitle("Payroll");

if(!$result){
die("Error");
}
$col = 0; 
$row = 2; 
while($mrow = mysql_fetch_assoc($result)) { 
$col = 0; 
foreach($mrow as $key=>$value) { 
    $objPHPExcel->getActiveSheet()->setCellValueByColumnAndRow($col, $row, $value); 
    $col++; 
} 
$row++;  
} 

 // Set active sheet index to the first sheet, so Excel opens this as the first sheet
 $objPHPExcel->setActiveSheetIndex(0)
        ->setCellValue('A1', 'Scholar Id')
        ->setCellValue('B1', 'Lastname')
        ->setCellValue('C1', 'Middlename')
        ->setCellValue('D1', 'Firstname')
        ->setCellValue('E1', 'Barangay')
        ->setCellValue('F1', 'Level')
        ->setCellValue('G1', 'Allowance')
        ->setCellValue('H1', 'Has claimed?');
        $objPHPExcel->getActiveSheet()->getStyle('A1:H1')->getFont()->setBold(true);
        $objPHPExcel->getActiveSheet()->getColumnDimension('A')->setWidth(12);
        $objPHPExcel->getActiveSheet()->getColumnDimension('B')->setWidth(18);
        $objPHPExcel->getActiveSheet()->getColumnDimension('C')->setWidth(18);
        $objPHPExcel->getActiveSheet()->getColumnDimension('D')->setWidth(18);
        $objPHPExcel->getActiveSheet()->getColumnDimension('E')->setWidth(18);
        $objPHPExcel->getActiveSheet()->getColumnDimension('F')->setWidth(12);
$objPHPExcel->getActiveSheet()->getColumnDimension('G')->setWidth(12);
$objPHPExcel->getActiveSheet()->getColumnDimension('H')->setWidth(14);
$objPHPExcel->getActiveSheet()->getStyle('A1:H1')->getAlignment()- >setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
$objPHPExcel->getActiveSheet()->setShowGridlines(true);

$objPHPExcel->getActiveSheet()->getStyle('A1:H1')->applyFromArray(
array(
    'fill' => array(
        'type' => PHPExcel_Style_Fill::FILL_SOLID,
        'color' => array('rgb' => 'FFFF00')
    )
)
); 


// Save Excel 2007 file
echo date('H:i:s') . " Write to Excel2007 format\n";
#$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
$objWriter = new PHPExcel_Writer_Excel2007($objPHPExcel);
header('Content-Type: application/vnd.ms-Excel');
header('Content-Disposition: attachment;filename="payroll.xlsx"');
header('Cache-Control: max-age=0'); 
$writer->save('php://output');
11
user1410081

私はそれを今働かせました!これのおかげで phpexcel to download

私はコードをこれに変更しました:

// Save Excel 2007 file
#echo date('H:i:s') . " Write to Excel2007 format\n";
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
ob_end_clean();
// We'll be outputting an Excel file
header('Content-type: application/vnd.ms-Excel');
header('Content-Disposition: attachment; filename="payroll.xlsx"');
$objWriter->save('php://output');

私はこの行を考えます:

ob_end_clean();

私の問題を解決しました。

54
user1410081

私が同じ問題を抱えていて、私が解決したことを助けることができるかどうかわかりません

ob_end_clean();

私は直後にそれを置きます

$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');

ですから、ヘッダーを変更してxslxとして保存しないでください。問題はバッファです。

5
marco burrometo

すべてのファイル(含まれているファイルなど)がUTF-8 BOMなしエンコーディングであることを確認してください。
これはさまざまな方法で識別できます。これを見てください link

UTF-8が必要な場合のみBOM付き-他の回答で指摘されているように、ブラウザにデータを出力する前にob_end_clean();を使用してください。

2
Andron

これがスクリプトのカットアンドペーストである場合、最も可能性の高い原因は

echo date('H:i:s') . " Write to Excel2007 format\n";

ダウンロードのためにブラウザーに送信する場合、phpExcel自体によってphp:// outputに生成された出力以外の出力(エコー、印刷ステートメント、PHPのドロップアウト)があってはなりません。

2
Mark Baker

この答えは私の命を救います。ありがとう@ARN

$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, "Excel2007");
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Disposition: attachment; filename="export_result.xlsx"');
for ($i = 0; $i < ob_get_level(); $i++) {
   ob_end_flush();
}
ob_implicit_flush(1);
ob_clean();
$objWriter->save("php://output");
0
Python

同じ問題がありましたが、ob_end_clean()の呼び出しが機能しませんでした。私のCMS(drupal 7)はヘッダーをめちゃくちゃにしていたので、ファイル出力の前にob_end_clean()を呼び出した場合でも、コンテンツの先頭に新しい行(hex 0A)を取得しました。

以下のコードで、私は最終的に先頭の新しい行を取り除きました:

 for ($i = 0; $i < ob_get_level(); $i++) { ob_end_flush(); }
      ob_implicit_flush(1);

 ob_clean();
0
ARN

この問題の解決策は次と同じだと思います: Google Chrome PHPを使用してXLSファイルをエクスポートする際のエラー

attachement;filenameの間にスペースを追加するだけで、次のようになります。

header("Content-Disposition: attachment; filename=\"Past_Due_Report.xls\"");

あなた自身の答えで私が見ることができるように、それはあなたがしたことであり、おそらくあなたの問題を解決したものです。

0
cetipabo

私にも同じ問題があります。問題は単純です。以下のコードを入力してください:

ob_end_clean();

後:

$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
0
Ahmad Wijaya