因此,我当前的代码可以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;
?>
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文件的签名,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是真正的电子表格格式,尽管它已经过时了,我不特别推荐),例如BIFF(用于真正的xls文件),OfficeOpenXML(用于xlsx)文件,OASIS用于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
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句