PHPExcel无法打开保存的文件

时间:2015-04-24 17:14:42

标签: php phpexcel

我正在尝试打开现有的excel文件,修改一些单元格并保存它。我正在使用Excel2007作为读者和作家。

输入文件大约1 MB,它有很少的公式,受保护的数据和隐藏的行和列以及我不修改的工作表。

我能够加载数据并读入和写入一些值,我会在代码中查看各种var_dumps。

问题在于保存它。它会在超时时抛出一些致命错误,如果它写入文件,文件大小也会膨胀到9.2 MB,如果我可以打开它就没关系。

代码段 - 没什么特别的。

$objReader = PHPExcel_IOFactory::createReader('Excel2007');
$objPHPExcel = $objReader->load($inputFile);

$objPHPExcel->setActiveSheetIndex(2);
$activeSheet = $objPHPExcel->getActiveSheet();

$currCell = $activeSheet->getCell("O3");
$cellValidation = $currCell->getDataValidation("O3");
$values = array();
if ($cellValidation->getShowDropDown() == true)
{
    $values = $cellValidation->getFormula1();
    $valArray = explode(",", $values);
    $currCell->setValue($valArray[0]);
}

$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
$objWriter -> setPreCalculateFormulas(false);
$objWriter->save($outputFile);

我使用MS Excel 2010打开生成的文件,但它只需要一次,并且甚至没有打开过一次。

请指教我应该在哪里寻找帮助我解决这个问题。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

将其保存到php://output­Docs

,而不是将其保存到文件中
$objWriter->save('php://output');

这将按原样将其发送到浏览器。

您想首先添加一些headers­Docs,就像文件下载一样,所以浏览器知道该文件的类型以及应该如何命名(文件名):

// We'll be outputting an excel file
header('Content-type: application/vnd.ms-excel');

// It will be called file.xls
header('Content-Disposition: attachment; filename="file.xls"');

// Write file to the browser
$objWriter->save('php://output');

首先执行标题,然后保存。对于excel标题,请参阅以下问题:Setting mime type for excel document

所以最终的代码会有以下几行 -

// Save Excel 2007 file
#echo date('H:i:s') . " Write to Excel2007 format\n";
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
ob_end_clean();
// We'll be outputting an excel file
header('Content-type: application/vnd.ms-excel');
// It will be called file.xls
header('Content-Disposition: attachment; filename="file.xlsx"');
$objWriter->save('php://output');

我认为这一行:

ob_end_clean();

应该解决你的问题。

谢谢!

答案 1 :(得分:0)

有很多原因导致这种情况"臃肿"它在很大程度上取决于工作表中的实际数据,但MS Excel本身使用了许多不同的技术来保持文件大小,而PHPExcel则编写了一个简单版本的OfficeOpenXML格式。

例如,MS Excel查看所有单元格的字符串内容,并将各个字符串存储在字符串表中。如果两个或多个单元格使用字符串,则字符串表中只有一个条目。但是,检查字符串表中是否已存在字符串会产生性能开销,因此PHPExcel不会执行该检查,但会复制字符串表中的条目。这意味着它会因为重复而创建一个大文件,但会尽可能快地保存。

类似地,MS Excel会查看所有公式,如果公式与现有公式类似(只有行/列偏移差异),它会将其存储为共享公式而不是单元格公式,因此实际公式数据只存储一次。同样,PHPExcel不会执行此检查,因为它在保存中是一个很大的性能开销,因此它将每个公式存储为单元格公式而不是共享公式。

不,我无法解释为什么文件不会在MS Excel 2010中加载,也无法解释它而无法通过调试运行整个事情