【问题标题】:PHPExcel - Fatal error: Uncaught exception 'Exception' with messagePHPExcel - 致命错误:带有消息的未捕获异常“异常”
【发布时间】:2014-02-26 16:36:15
【问题描述】:

每次尝试导出 Excel 电子表格时都会出错。错误如下:

Fatal error: Uncaught exception 'Exception' with message 'Worksheet!J6 -> Worksheet!J6 -> Cyclic Reference in Formula' in /classes/PHPExcel/Cell.php:293 Stack trace: 
    #0 /classes/PHPExcel/Writer/Excel2007/Worksheet.php(997): PHPExcel_Cell->getCalculatedValue() 
    #1 /classes/PHPExcel/Writer/Excel2007/Worksheet.php(943): PHPExcel_Writer_Excel2007_Worksheet->_writeCell(Object(PHPExcel_Shared_XMLWriter), Object(PHPExcel_Worksheet), 'J6', Array, Array) 
    #2 /classes/PHPExcel/Writer/Excel2007/Worksheet.php(83): PHPExcel_Writer_Excel2007_Worksheet->_writeSheetData(Object(PHPExcel_Shared_XMLWriter), Object(PHPExcel_Worksheet), Array) 
    #3 /classes/PHPExcel/Writer/Excel2007.php(282): PHPExcel_Writer_Excel2007_Worksheet->writeWorksheet(Object(PHPExcel_Worksheet), Array, false) 
    #4 /includes/reports_funcs.php(620): PHPExcel_Writer_Excel2007->save('reports/risk-bo...') #5 /createXlsxReport. in /classes/PHPExcel/Cell.php on line 293

我试图寻找解决方案,但到目前为止没有运气。我发现另一个stackoverflow 问题建议在文件保存之前添加$objWriter->setPreCalculateFormulas(FALSE);,但这给了我一个空的电子表格。

它最近才开始发生,所以我真的很困惑为什么会发生这种情况。任何帮助将不胜感激,干杯

示例代码 - 编辑

$objPHPExcel->getActiveSheet(0)
    ->setCellValueByColumnAndRow(0, $row, $pol_ref . 'e' . $end_numb)
    ->setCellValueByColumnAndRow(1, $row, $insured_name)
    ->setCellValueByColumnAndRow(2, $row, $vessel_name)
    ->setCellValueByColumnAndRow(3, $row, $insurance_type . ' - ' . $end_type)
    ->setCellValueByColumnAndRow(4, $row, $insured_domicile)
    ->setCellValueByColumnAndRow(5, $row, gmdate("d-m-Y",$date_logged))
    ->setCellValueByColumnAndRow(6, $row, $inception_date)
    ->setCellValueByColumnAndRow(7, $row, $expiry_date)
    ->setCellValueByColumnAndRow(8, $row, ($policy_limit == 0.00?$loh_limit:$policy_limit))
    ->setCellValueByColumnAndRow(9, $row, $premium)
    ->setCellValueByColumnAndRow(10, $row, "=sum(J".($row)."*".($seacurus_percent/100).")")
    ->setCellValueByColumnAndRow(11, $row, "=sum(J".($row)."*".($placing_percent/100).")")
    ->setCellValueByColumnAndRow(12, $row, "=sum(J".($row)."*".($rebate_percent/100).")")
    ->setCellValueByColumnAndRow(13, $row, "=sum(J".($row)."*".($iptpercent/100).")")
    ->setCellValueByColumnAndRow(14, $row, "=sum(".($binder_id==6?"(J".$row." - (P".$row."+L".$row."+O".$row."+P".$row."))":"J".($row))."*".$bgn_percent.")")
    ->setCellValueByColumnAndRow(15, $row, "=sum(J".($row)."*".$ghc_percent.")")
    ->setCellValueByColumnAndRow(16, $row, "=sum(J".($row)."*".($commission_percentage_sum/100).")");
$row++;

【问题讨论】:

  • 什么版本的 PHPExcel?

标签: php excel-formula phpexcel


【解决方案1】:

如果您的公式包含循环引用,那么您需要选择如何处理它们,就像您在 MS Excel 本身中所做的那样。默认行为是像这样抛出异常,这类似于 MS Excel 默认的行为方式。 另一种方法是通过将计算引擎设置为来告诉 PHPExcel 遵循循环进行固定次数的迭代:

PHPExcel_Calculation::getInstance()->cyclicFormulaCount = 1;

或任何值 > =1 表示循环的迭代次数

PHPExcel_Calculation::getInstance()->cyclicFormulaCount = 10;

// 10 次迭代

【讨论】:

  • 这个会放在哪里?文件导出前?
  • 不幸的是不起作用。当我添加它时,我得到一个内存错误。当我修复内存错误时,它不会将数据放入电子表格中
  • 您应该在任何公式评估之前使用它。所以它可以在发生之前处理它
  • 在单元格中设置值之前尝试
  • 如果OP运行的是PHPExcel 1.7.9或以上版本,那么每个PHPExcel对象都有自己的计算引擎,使用PHPExcel_Calculation::getInstance($objPHPExcel)->cyclicFormulaCount = 1;调用PHPExcel_Calculation::getInstance()时需要识别这一点
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-07-09
  • 1970-01-01
  • 1970-01-01
  • 2015-01-04
  • 2013-08-24
  • 2012-04-25
  • 1970-01-01
相关资源
最近更新 更多