2016-05-29 3 views
3

Итак, мой текущий код работает на 100%, файл создан и открыт в excel. Но после открытия есть несколько ошибок, которые нужно щелкнуть, чтобы открыть файл. Они заключаются в следующем:Созданный PHP лист 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]);   
    } 
} 

ошибка происходит, когда он попадает в то время как заявление, если я возьму эту часть, она работает.

ответ

4

Проблема ID как первые два байта вашего файла. Это подпись для файла SYLK, старого формата таблиц, используемого Multiplan (Symbolic Link Interchange - 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.


Заголовки, которые я использую для файлов XLSX OfficeOpenXML:

// 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 
+0

Если вы хотите, чтобы дать ему расширение 'xls', то Excel будет жаловаться, если это что-то другое, чем BIFF-формате; лично я предпочитаю «xlsx» с использованием формата OfficeOpenXML ... OfficeOpenXML был форматом MS Excel по умолчанию за последние 9 лет. –

+0

Хорошо, я попытаюсь реализовать это, любой шанс показать вам, как мои измененные заголовки будут выглядеть, если Я должен был изменить его на xlsx? –

+0

Вам понравится, если вы захотите создать формат 'xlsb', вы не найдете никаких библиотек, которые могут вам помочь –

Смежные вопросы