我使用 PHPExcel
来自 here 的图书馆创建 excel 文件扩展名 .xlsx
为此,我使用 php
和 mysql
这个excel文件的数据来自mysql
数据库。
创建代码后,我收到此消息:
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.
当我单击"is"时,我收到此消息:
Excel completed file level validation and repair. Some parts of this workbook may have been repaired or discarded.
我单击关闭打开的 excel 文件,但在这个 excel 文件中,我的数据有一些空行。
这是我使用 PHPExcel
下载 excel 文件的代码
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 中有空行ob_end_clean()
是第一条消息的真正解决方案,因为我在互联网上看到了一个教程,他的代码在不使用 ob_end_clean()
的情况下也能正常工作。或 ob_start()
?
最佳答案
你正在做相反的事情。您唯一需要进入缓冲区的部分是 $file->save("php://output");
。如果出于任何原因在保存到输出后简单地 exit
ing 对您来说还不够,请删除第一行 ob_start();
和最后一行,然后试试这个:
ob_start();
$file->save("php://output");
$content = ob_get_contents();
ob_end_clean();
die($content);
关于PHPExcel 无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46054805/