2017-08-25 158 views
0

我想使用PHPExcel库将CSV文件转换为XLSX文件。一旦将csv文件读入PHPExcel对象并将其保存为xlsx文件之前,我将根据相关列内容重新计算并设置列宽。PHPExcel防止计算公式

$objReader = PHPExcel_IOFactory::createReader('CSV'); 
$objPHPExcel = $objReader->load("test.csv"); 

$activesheet = $objPHPExcel->getActiveSheet(); 
$lastColumn = $activesheet->getHighestColumn(); // get last column with data 
$lastColumn++; 
for ($column = 'A'; $column != $lastColumn; $column++) { // for each column until last 
    $activesheet->getColumnDimension($column)->setAutoSize(true); // set autowidth 
} 

$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007'); 
$objWriter->save("downloads/test.xls"); 

与研究,我发现,如果有该文件中的任何公式,调用setAutoSize(位)计算为他们计算列的宽度时,可利用的价值。 我的问题是,我的一些csv文件包含以=(等号)开头的值,这些值不是公式。为前。像'===='这样的单元格值。这会导致以上代码引发错误PHPExcel_Calculation_Exception Formula Error: An unexpected error occured

因为我知道我的任何输入csv文件不能包含公式,有没有办法阻止PHPExcel计算包含以符号开头的值的单元格值?

+1

在输入值之前将单元格设置为文本(或者在设置后重新输入)或在其前面添加一个'''=>运行其他代码...并且是的,这很烦人:/ –

+0

As @DirkReichel says ;你可以通过使用自定义绑定来简化这个自定义绑定,该绑定会覆盖用'='将这些单元格转换为公式的逻辑 –

回答

0

经过研究和给出的建议,我最终遍历所有单元格并重写单元格值(以=符号开头),以防止PHPExcel将它们视为公式。 setCellValueExplicit()方法指示PHPExcel在此情况下不考虑单元格值作为公式。

foreach ($objPHPExcel->getWorksheetIterator() as $worksheet) { 
    foreach ($worksheet->getRowIterator() as $row) { 
     $cellIterator = $row->getCellIterator(); 
     $cellIterator->setIterateOnlyExistingCells(true); 
     foreach ($cellIterator as $cell) { 
      if (preg_match('/^=/', $cell->getValue())) { 
       $cellcoordinate = $cell->getCoordinate(); 
       $worksheet->setCellValueExplicit($cellcoordinate,$worksheet->getCell($cellcoordinate)); 
      } 
     } 
    } 
} 

这很痛苦,但找不到更好的解决方案。