PHP创build的Excel工作表打开时会产生错误

所以,我当前的代码工作100%,文件被制作,并在Excel中打开。 但是打开之后,有一些错误必须点击才能打开文件。 他们如下:

“address-book.xls”的文件格式和扩展名不匹配。 该文件可能已损坏或不安全。 除非你信任它的来源,否则不要打开它。 你想打开吗?

然后:

Excel检测到'address-book.xls是一个SYLK文件,但无法加载它。 文件有错误或者它不是SYLK文件格式。 单击确定以尝试以不同的格式打开文件。

最后:

“address-book.xls”的文件格式和扩展名不匹配。 该文件可能已损坏或不安全。 除非你信任它的来源,否则不要打开它。 你想打开吗?

之后,它不情愿地打开。 这是创build它的代码。 格式化电子表格的任何帮助,比如让单元格足够大以满足内容将是非常好的。 但摆脱开幕式的错误是我的首要任务。

<?PHP require_once('conn.php'); $colnames = array( 'id' => "ID", 'Title' => "Title", 'First_Name' => "First name", 'Last_Name' => "Last Name", 'Address' => "Address", 'City' => "City", 'State' => "State", 'Zipcode' => "Zipcode", 'Home_Phone' => "Home Phone", 'Cell_Phone' => "Cell Phone", 'Email1' => "Email #1", 'Email2' => "Email #2" ); function map_colnames($input){ global $colnames; return isset($colnames[$input]) ? $colnames[$input] : $input; } function cleanData(&$str){ $str = preg_replace("/\t/", "\\t", $str); $str = preg_replace("/\r?\n/", "\\n", $str); if(strstr($str, '"')) $str = '"' . str_replace('"', '""', $str) . '"'; } $filename = "address-book"; header("Content-type: application/octet-stream"); header("Content-Disposition: attachment; filename=".$filename.".xls"); header("Pragma: no-cache"); header("Expires: 0"); $flag = false; $sql = "SELECT * FROM ".$sDB_table." ORDER BY Last_Name"; $query = $sDBConn -> prepare($sql); $query -> execute(); while(false !== ($row = $query->fetch(PDO::FETCH_ASSOC))) { if(!$flag){ $firstline = array_map(__NAMESPACE__ . '\map_colnames', array_keys($row)); echo implode("\t", $firstline) . "\r\n"; $flag = true; } array_walk($row, __NAMESPACE__ . '\cleanData'); echo implode("\t", array_values($row)) . "\r\n"; } exit; 

?>

PHPExcel错误:

 $colnames = array("Title","First name","Last Name","Address","City","State","Zipcode","Home Phone","Cell Phone","Email #1","Email #2"); $col = array('A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'); // Add Headers for($i=0;$i<count($colnames);$i++){ $objPHPExcel->setActiveSheetIndex(0) ->setCellValue($col[$i]."1", $colnames[$i]); } $sql = "SELECT * FROM ".$sDB_table." ORDER BY Last_Name"; $query = $sDBConn -> prepare($sql); $query -> execute(); $rownum = 1; //Add Content while(false !== ($row = $query->fetch(PDO::FETCH_ASSOC))) { $rownum++; for($i=0;$i<count($row);$i++){ $objPHPExcel->setActiveSheetIndex(0) ->setCellValue($col[$i]."".$rownum, $row[$i]); } } 

当它碰到while语句时会发生这个错误,如果我把这个部分拿出来,它就会起作用。

问题是ID作为您的文件的前两个字节。 这是SYLK文件的签名,是由Microsoft Excel的前身Multiplan(符号链接交换 – SYLK – 文件格式)使用的旧电子表格格式。

解决这个问题的最简单方法是避免将ID作为标题,并使用Id (IIRC,SYLK签名区分大小写)或Key或其他文本值


你用xls扩展名保存你的文件,但你实际上并没有使用Excel格式,只是一个csv格式; 所以MS Excel会抱怨格式不符合扩展名….要么扩展名为.csv以匹配您正在创build的文件的实际格式; 或创build一个真正的BIFF格式的Excel文件


Any help with formatting the spreadsheet, such as having the cells be big enough for the content would be great.

您使用的格式,csv(带有制表符分隔符)不支持任何types的格式,包括列宽。 如果你想这样做,那么你需要切换到一个真正的电子表格格式(巧合,SYLK是一个真正的电子表格格式,虽然它是相当过时的,我不会特别推荐它),如真正的XLS文件的BIFF,OfficeOpenXML的XLSX文件,用于ods文件的OASIS。


我用于OfficeOpenXML xlsx文件的标题:

 // Redirect output to a client's web browser (Excel2007) header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); header('Content-Disposition: attachment;filename="01simple.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 MYH:i:s').' GMT'); // always modified header ('Cache-Control: cache, must-revalidate'); // HTTP/1.1 header ('Pragma: public'); // HTTP/1.0