2017-09-05 127 views
1

我使用herePHPExcel庫創建一個Excel文件擴展名.xlsx 的,我使用的這個phpmysql數據excel文件是從mysql數據庫。PHPExcel不能正常使用

後,我創建的代碼我收到此消息:

Excel can't open the file because the file format or file extension is not valid. Verify that the file has not been corrupted and that the file extension matches the format of the file

爲了解決這個問題,我使用:

ob_start(); ob_end_clean(); 

之後,我下載的文件,並嘗試打開Excel文件,我有此消息:

We found a problem with some content in your file.Do you want to us to try to recover as much as we can?if you trust the source of this workbook,click yes.

當我點擊是的,我有這樣的消息:

Excel completed file level validation and repair. Some parts of this workbook may have been repaired or discarded.

我點擊關閉excel文件打開,但在這個Excel文件中,我有一些空行與我的數據。

這是我的代碼使用PHPExcel

ob_start(); 
include("includes/connect.php"); 
require_once'PHPExcel/Classes/PHPExcel.php'; 
//Create PHPExcel object 
$excel=new PHPExcel(); 
//selecting active sheet 
$excel->setActiveSheetIndex(0); 
$row=21; 
while($data=mysqli_fetch_object($query)){ 
$excel->getActiveSheet()->setCellvalue('A'.$row,$data->db_maid) 
    ->setCellvalue('B'.$row,$data->db_date) 
    ->setCellvalue('C'.$row,$data->db_client) 
    ->setCellvalue('D'.$row,$data->db_esid) 
    ->setCellvalue('E'.$row,$data->db_type)  
    ->setCellvalue('F'.$row,$data->db_phone) 
    ->setCellvalue('G'.$row,$data->db_mobile) 
    ->setCellvalue('H'.$row,$data->db_contactperson) 
    ->setCellvalue('I'.$row,$data->db_competetivecompany) 
    ->setCellvalue('J'.$row,$data->db_category)  
    ->setCellvalue('K'.$row,$data->db_process) 
    ->setCellvalue('L'.$row,$data->db_status) 
    ->setCellvalue('M'.$row,$data->db_rate) 
    ->setCellvalue('N'.$row,$data->db_doc) 
    ->setCellvalue('O'.$row,$data->nextDate) 
    ->setCellvalue('P'.$row,$data->db_ndstatus) 
    ->setCellvalue('Q'.$row,$data->db_pnote) 
    ->setCellvalue('R'.$row,$data->meetingStatus) 
    ->setCellvalue('S'.$row,$data->db_ncam)  
    ->setCellvalue('T'.$row,$data->medit) 
    ->setCellvalue('U'.$row,$data->name); 
    //incriment the row 
$row++;  
} 
//set column width 
$excel->getActiveSheet()->getColumnDimension('A')->setWidth(10); 
$excel->getActiveSheet()->getColumnDimension('B')->setWidth(20); 
$excel->getActiveSheet()->getColumnDimension('B')->setWidth(20); 
$excel->getActiveSheet()->getColumnDimension('D')->setWidth(20); 
$excel->getActiveSheet()->getColumnDimension('E')->setWidth(20); 
$excel->getActiveSheet()->getColumnDimension('F')->setWidth(20); 
$excel->getActiveSheet()->getColumnDimension('G')->setWidth(20); 
$excel->getActiveSheet()->getColumnDimension('H')->setWidth(20); 
$excel->getActiveSheet()->getColumnDimension('I')->setWidth(20); 
$excel->getActiveSheet()->getColumnDimension('J')->setWidth(20); 
$excel->getActiveSheet()->getColumnDimension('K')->setWidth(20); 
$excel->getActiveSheet()->getColumnDimension('L')->setWidth(20); 
$excel->getActiveSheet()->getColumnDimension('M')->setWidth(20); 
$excel->getActiveSheet()->getColumnDimension('N')->setWidth(20); 
$excel->getActiveSheet()->getColumnDimension('O')->setWidth(20); 
$excel->getActiveSheet()->getColumnDimension('P')->setWidth(20); 
$excel->getActiveSheet()->getColumnDimension('Q')->setWidth(20); 
$excel->getActiveSheet()->getColumnDimension('R')->setWidth(20); 
$excel->getActiveSheet()->getColumnDimension('S')->setWidth(20); 
$excel->getActiveSheet()->getColumnDimension('T')->setWidth(20); 
$excel->getActiveSheet()->getColumnDimension('U')->setWidth(20); 
//make table headers 
$excel->getActiveSheet() 
     ->setCellValue('A1','List Of Marketing') 
     ->setCellValue('A3','#') 
     ->setCellValue('B3','Date') 
     ->setCellValue('C3','Client') 
     ->setCellValue('D3','ES') 
     ->setCellValue('E3','Type') 
     ->setCellValue('F3','Phone') 
     ->setCellValue('G3','Mobile') 
     ->setCellValue('H3','Contact Person') 
     ->setCellValue('I3','Competetive Company') 
     ->setCellValue('J3','Categoty') 
     ->setCellValue('K3','Process') 
     ->setCellValue('L3','Status') 
     ->setCellValue('M3','Rate') 
     ->setCellValue('N3','Date Of Calling') 
     ->setCellValue('O3','Next Date') 
     ->setCellValue('P3','Next Date Status') 
     ->setCellValue('K3','Phone Note') 
     ->setCellValue('R3','Meeting Status') 
     ->setCellValue('S3','Next Call After Meeting') 
     ->setCellValue('T3','Edit Date') 
     ->setCellValue('U3','Staff'); 
//Margin The title 
$excel->getActiveSheet()->mergeCells('A1:U1'); 
//aligning 
$excel->getActiveSheet()->getStyle('A1')->getAlignment()->setHorizontal('center'); 
//styling 
$excel->getActiveSheet()->getStyle('A1')->applyFromArray(
array(
     'font'=>array(
      'size'=>24, 
    ) 
) 
); 
$excel->getActiveSheet()->getStyle('A3:U3')->applyFromArray(
array(
    'font'=>array(
     'bold'=>true 
    ), 
    'borders'=>array(
     'allborders'=>array(
      'style'=>PHPExcel_Style_Border::BORDER_THIN 
     ) 
    ) 
) 
); 
//give border to data 
$excel->getActiveSheet()->getStyle('A4:U'.($row-1))->applyFromArray(
array(
    'borders'=>array(
     'outline'=>array(
      'style'=>PHPExcel_Style_Border::BORDER_THIN 
     ), 
     'vertical'=>array(
      'style'=>PHPExcel_Style_Border::BORDER_THIN 
     ) 
    ) 
) 
); 
//write the result to a file 
$file=PHPExcel_IOFactory::createWriter($excel,'Excel2007'); 
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); 
header('Content-Disposition: attachment; filename="marketing.xlsx"'); 
header('Cache-Control:max-age=0'); 
ob_end_clean(); 

//output to php output instead of filename 
$file->save('php://output'); 

我的問題是如何解決這個問題,我不希望這個消息似乎也下載一個Excel文件,我不希望有一個空行我的excel也是ob_end_clean()是第一條消息的真正解決方案,因爲我在互聯網上看到了一個教程,並且他的代碼在沒有使用ob_end_clean()ob_start()的情況下正常工作?

+0

使用'ob_start()'和'ob_end_clean()'這種方式是指任何PHP正在輸出的錯誤被丟棄。如果您刪除這兩個電話並將文檔保存到實際文件會發生什麼?你有沒有看到任何錯誤?那麼如果你下載並打開保存的文件會發生什麼? – rickdenhaan

+0

@rickdenhaan如果我刪除這兩個電話我不能打開文件,我收到第一條消息把它放在上面,你的意思是將文件保存到一個實際的文件? –

+0

我的意思是代替'$ file-> save('php:// output');'保存到一個實際的文件,例如''file-> save('/ tmp/marketing.xlsx');'並移除'header()'調用(暫時只用於測試) – rickdenhaan

回答

1

你是這樣做的。您需要進入緩衝區的唯一部分是$file->save("php://output");。如果因爲任何原因保存到輸出後根本exit荷蘭國際集團是不夠的你,刪除第一ob_start();和最後一行試試這個:

ob_start(); 
$file->save("php://output"); 
$content = ob_get_contents(); 
ob_end_clean(); 
die($content);