因此,我当前的代码100%工作,文件生成并在excel中打开。但在打开时,必须点击一些错误才能打开文件。它们如下:
' address-book.xls'的文件格式和扩展名。不匹配。该文件可能已损坏或不安全。除非你相信它的来源,否则不要打开它。你想打开吗?
然后:
Excel检测到' address-book.xls是一个SYLK文件,但无法加载它。文件有错误或不是SYLK文件格式。单击“确定”以尝试以其他格式打开文件。
最后:
' address-book.xls'的文件格式和扩展名。不匹配。该文件可能已损坏或不安全。除非你相信它的来源,否则不要打开它。你想打开吗?
之后,它不情愿地打开了。这是创建它的代码。 任何有关格式化电子表格的帮助,例如让单元格足够大以容纳内容都会很棒。但是在开放时摆脱错误是我的首要任务。
<?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;
&GT;
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语句时会发生错误,如果我把那部分拿出来,它就可以了。
答案 0 :(得分:4)
问题是ID
作为文件的前两个字节。这是SYLK文件的签名,这是Multiplan(符号链接交换 - SYLK - 文件格式)使用的旧电子表格格式,是Microsoft Excel的前身。
解决此问题的最简单方法是避免将ID
作为标题,并使用Id
(IIRC,SYLK签名区分大小写)或Key
或其他一些文本值代替
您使用xls
扩展程序保存文件,但实际上并不是使用Excel格式,只是csv格式;所以MS Excel会抱怨格式与扩展名不匹配....要么将扩展名更改为.csv
以匹配您正在创建的文件的实际格式;或创建一个真正的BIFF格式Excel文件
Any help with formatting the spreadsheet, such as having the cells be big enough for the content would be great.
您正在使用的格式,csv(带有标签分隔符)不支持任何类型的格式,包括列宽。如果你想要,那么你需要切换到一个真正的电子表格格式(巧合的是,SYLK是一个真正的电子表格格式,虽然它很过时,我不会特别推荐它),如真正的xls文件的BIFF,xlsx的OfficeOpenXML文件,OASIS for ods文件。
我用于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 M Y H:i:s').' GMT'); // always modified
header ('Cache-Control: cache, must-revalidate'); // HTTP/1.1
header ('Pragma: public'); // HTTP/1.0