PHPExcel 导出给我垃圾
PHPExcel export gives me rubbish
所以,我正在尝试 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
打开。
如果我选择将文件保存在服务器上而不是打开 "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');
为什么?
您得到的正是您所要求的:一份(压缩的)XLSX 文档。但是,您的浏览器可能不希望如此 - 您需要告诉它 "hey, this is not HTML, this is an Excel file!"
在您的代码中,您必须在 任何其他输出之前发送 Content-Type header、:
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
也许还有 header 说 "you want to save this as a file":
header('Content-Disposition: attachment; filename=' . $whateverFileName . '.xlsx');
你的代码中确实有这些;但是,您可能在代码到达这些行之前向浏览器发送了其他内容。检查您的脚本是否输出 no 数据(甚至不包括空格或 BOM - 如果您的网络预览有十六进制视图,例如 Fiddler,您应该看到响应中发送了 0 个字节 body 如果你不调用 ->save()
方法)在它到达 header()
函数之前。参见 How to fix "Headers already sent" error in PHP
所以,我正在尝试 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
打开。
如果我选择将文件保存在服务器上而不是打开 "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');
为什么?
您得到的正是您所要求的:一份(压缩的)XLSX 文档。但是,您的浏览器可能不希望如此 - 您需要告诉它 "hey, this is not HTML, this is an Excel file!"
在您的代码中,您必须在 任何其他输出之前发送 Content-Type header、:
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
也许还有 header 说 "you want to save this as a file":
header('Content-Disposition: attachment; filename=' . $whateverFileName . '.xlsx');
你的代码中确实有这些;但是,您可能在代码到达这些行之前向浏览器发送了其他内容。检查您的脚本是否输出 no 数据(甚至不包括空格或 BOM - 如果您的网络预览有十六进制视图,例如 Fiddler,您应该看到响应中发送了 0 个字节 body 如果你不调用 ->save()
方法)在它到达 header()
函数之前。参见 How to fix "Headers already sent" error in PHP