2015-03-20 1 views
1

Я хочу, чтобы вставить эту формулу массива:PHPExcel формула вставки массива

{=SUM(IF(FREQUENCY(IF(T9:T977=1,MATCH(U9:U977,U9:U977,0)),ROW(U9:U977)-ROW(U9)+1),1))} 

, но когда я использую:

$sheet->getCell("C1")->setValue("{=SUM(IF(FREQUENCY(IF(T9:T977=1,MATCH(U9:U977,U9:U977,0)),ROW(U9:U977)-ROW(U9)+1),1))}"); 

Это не работает, я проверил документацию, но все еще ничего не нашли.

+0

Работает ли формула в excel без ошибок? – Drazisil

+1

Формулы массива не поддерживаются PHPExcel –

+1

Сделано решение ниже. –

ответ

2

я не мог найти ответ, так что я прошел через PHPExcel и сделал себе решение:

in /PHPExcel/Cell.php в строке 251 в switch($pDataType) добавить следующее:

case PHPExcel_Cell_DataType::TYPE_FORMULA_ARRAY: 
$this->_value = (string)$pValue; 
break; 

in /PHPExcel/Cell/DataType.php добавить эту константу:

const TYPE_FORMULA_ARRAY = 't'; 

Наконец-то в /PHPExcel/Writer/Excel2007/Worksheet.php Я добавил это в переключатель, начинающийся в строке 1095:

case 't':   // Array Formulae 
    $objWriter->startElement('f'); 
    $objWriter->writeAttribute('t', 'array'); 
    $objWriter->writeAttribute('ref', $pCellAddress); 
    $objWriter->writeAttribute('aca', '1'); 
    $objWriter->writeAttribute('ca', '1'); 
    $objWriter->text($cellValue); 
    $objWriter->endElement();    
    if ($this->getParentWriter()->getOffice2003Compatibility() === false) { 
     if ($this->getParentWriter()->getPreCalculateFormulas()) { 
      $calculatedValue = $pCell->getCalculatedValue(); 
      if (!is_array($calculatedValue) && substr($calculatedValue, 0, 1) != '#') { 
       $objWriter->writeElement('v', PHPExcel_Shared_String::FormatNumber($calculatedValue)); 
      } else { 
       $objWriter->writeElement('v', '0'); 
      } 
     } else { 
      $objWriter->writeElement('v', '0'); 
    } 
} 
break; 

Тогда я использовал функцию так:

$sheet->getCell("C1")->setValueExplicit("=SUM(IF(FREQUENCY(IF(T9:T977=1,MATCH(U9:U977,U9:U977,0)),ROW(U9:U977)-ROW(U9)+1),1))", PHPExcel_Cell_DataType::TYPE_FORMULA_ARRAY); 

И это работает все хорошо, когда я создаю файл размером первенствует!

+0

Вы сделали здесь хорошую работу, но почему бы не завершить ее? На данный момент вы можете установить функцию массива только для 1 ячейки? – Tom