我正在尝试打开现有的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打开生成的文件,但它只需要一次,并且甚至没有打开过一次。
请指教我应该在哪里寻找帮助我解决这个问题。
非常感谢任何帮助。
答案 0 :(得分:0)
将其保存到php://outputDocs:
,而不是将其保存到文件中$objWriter->save('php://output');
这将按原样将其发送到浏览器。
您想首先添加一些headersDocs,就像文件下载一样,所以浏览器知道该文件的类型以及应该如何命名(文件名):
// 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中加载,也无法解释它而无法通过调试运行整个事情