微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

PHP创建的Excel工作表在打开时创建错误

因此,我当前的代码可以100%工作,文件已经制作好并在excel中打开.但是在打开时,必须点击一些错误才能打开文件.它们如下:

The file format and extension of ‘address-book.xls’ don’t match. The file Could be corrupted or unsafe. Unless you trust its source, don’t open it. Do you want to open it anyway?

然后:

Excel has detected that ‘address-book.xls is a SYLK file, but cannot load it. Either the file has errors or it is not a SYLK file format. Click OK to try to open the file in a different format.

然后最后:

The file format and extension of ‘address-book.xls’ don’t match. The file Could be corrupted or unsafe. Unless you trust its source, don’t open it. Do you want to open it anyway?

之后,它无奈地打开.这是创建它的代码.
格式化电子表格的任何帮助,例如使单元格足够大以容纳内容,都将非常有用.但是消除打开时的错误是我的首要任务.

<?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文件

格式化电子表格的任何帮助,例如使单元格足够大以容纳内容,都将非常有用.

您正在使用的格式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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐