PHPExcel导出给了我垃圾

时间:2015-11-30 15:19:30

标签: php phpexcel

所以,我正在尝试从db中导出PHPExcel导出som数据,并为用户打开Save dialog以保存excel文件。

在我的网络预览中,我得到了这个:

  

PK%Y〜GGD²Xð[CONTENT_TYPES].xmlMNÃ0÷“ò%NY   vAa(0ö¤±êØgúw{& i @ÕnbEö{ßøyìÑdÛ¸l     mð¥×ÁX¿(ÅÛü)¿òF¹à¡; @1_æ»±Øc)j¢x /%êEày|©QÄ¿i!£Kμy3ÜJ<§Z1½0?YÙL%zV   cäÖIb7Øûìa/lÙ¥P1:«qáríÍjªÊj0A¯Íuë“”íàÙ(ÁWìMä)Tjå({ܲû>óOãÂ,XÙÁÚÆ>Bÿ~×ÏõÓ¤6ÜJ=¡oBZ¾°¼tìíX4Êú¾Cgñ,QgmrLÙÙ¯cïeëàtø±Zõ?'»hPvÃð±úÿuÕjÀ¼Râæ¸øûî }¬CvÖøPK%Y〜G¶78éK_rels/.relsÍjÃ0ï{........

只是很多什么?

当然没有save dialog打开。 如果我选择将文件保存在服务器上而不是打开“保存对话框”,我就会使用此代码。

PHP

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

//Load phpexcel includes    
require '../Classes/PHPExcel.php';

/** PHPExcel_Writer_Excel2007 */
include '../Classes/PHPExcel/Writer/Excel2007.php';

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

// Add some data
$objPHPExcel->setActiveSheetIndex(0);
$objPHPExcel->getActiveSheet()->SetCellValue('A1', 'Nr');
$objPHPExcel->getActiveSheet()->SetCellValue('B1', 'Höjd');
$objPHPExcel->getActiveSheet()->SetCellValue('C1', 'Typ');
$objPHPExcel->getActiveSheet()->SetCellValue('D1', 'Längd');
$objPHPExcel->getActiveSheet()->SetCellValue('E1', 'AV');
$objPHPExcel->getActiveSheet()->SetCellValue('F1', 'Öppningar');

$objPHPExcel->getActiveSheet()->SetCellValue('G1', 'Vikt');


//Fetch data from DB
$query = "SELECT * FROM table WHERE objekt_nr = '$objNr' ORDER BY length(element_nr), element_nr ASC";
try{
    $stmt = $db->prepare($query);
    $result = $stmt->execute();
}
catch(PDOException $ex){
    die("Failed to run query: " . $ex->getMessage());
}
//Insert on first row after heading 
$row = 2;
while($value = $stmt->fetch()){
    //Set start Column
    $column = "A";

    $objPHPExcel->getActiveSheet()->SetCellValue($column++.$row, $value['element_nr']);
    $objPHPExcel->getActiveSheet()->SetCellValue($column++.$row, $value['hojd']);
    $objPHPExcel->getActiveSheet()->SetCellValue($column++.$row, $value['typ']);
    $objPHPExcel->getActiveSheet()->SetCellValue($column++.$row, $value['langd']);
    $objPHPExcel->getActiveSheet()->SetCellValue($column++.$row, $value['avdrag']."");
    $objPHPExcel->getActiveSheet()->SetCellValue($column++.$row, $value['oppningar']."");

    $objPHPExcel->getActiveSheet()->SetCellValue($column++.$row, $value['vikt']);

    //INCREASE Row Nr
    $row++;
}

// Rename sheet
$objPHPExcel->getActiveSheet()->setTitle($objNr);

header("Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
header("Content-Disposition: attachment; filename=\"results.xlsx\"");
header("Cache-Control: max-age=0");

// Write file to the browser
$objWriter = new PHPExcel_Writer_Excel2007($objPHPExcel);
$objWriter->save('php://output');

}

这有效:$objWriter->save('file.xlsx');
这给了我垃圾:$objWriter->save('php://output');

为什么?

1 个答案:

答案 0 :(得分:3)

你得到了你所要求的:一个(压缩的)XLSX文件。但是,您的浏览器可能并不期望 - 您需要告诉它"嘿,这不是HTML,这是一个Excel文件!"

在您的代码中,您必须在任何其他输出之前发送Content-Type标头

>>> recursive_render("Hello {{X}}!", dict(X="{{name}}", name="world"))
u'Hello world!'

也许还有标题说"你想要save this as a file":

header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');

你的代码中确实有这些;但是,在代码到达这些行之前,您可能正在向浏览器发送其他内容。检查您的脚本是否输出 no 数据(甚至不是空白或BOM) - 如果您的网络预览有十六进制视图,例如Fiddler,您应该看到响应正文中发送的0个字节,如果您没有'在调用header('Content-Disposition: attachment; filename=' . $whateverFileName . '.xlsx'); 函数之前调用->save()方法)。见How to fix "Headers already sent" error in PHP