首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在PhpSpreadsheet中创建excel文件时如何计算公式

在PhpSpreadsheet中创建excel文件时如何计算公式
EN

Stack Overflow用户
提问于 2019-07-03 18:21:15
回答 1查看 374关注 0票数 0

我的代码有问题。我使用PhpSpreadsheet lib生成了一个excel文件。所以我可以写我的数据,它工作得很好。我使用另一个工作表在单元格中添加了一个数据验证列表,它也可以工作。因此,我尝试在单元格中添加一个公式,当有人在我的数据验证列表中选择某些内容时,该公式可以更改值(使用VLOOKUP),这也是可行的。

但我的问题是,当我打开我的文件时,我的公式是不计算的。当我打开文件时,我只看到了公式,我想看看结果。

这是我的代码:

代码语言:javascript
复制
$i=2;
    $j=6;
   $filename = "export-excel.xlsx";
    $spreadsheet = new Spreadsheet();
    $dataSheet = $spreadsheet->getSheet(0);

    $dataSheet1 = $spreadsheet->createSheet(1);
    $dataSheet1->setTitle("Materiel");
    $dataSheet1->setCellValue('A1','Modèle');
    $dataSheet1->setCellValue('B1','Marque');
    $dataSheet1->setCellValue('C1','Calibre');
    $dataSheet1->setCellValue('D1','ITH');
    $dataSheet1->setCellValue('E1','IMG');
    $dataSheet1->setCellValue('F1','Type Matériel');

    //remplissage matériel
    $listMateriel = $this->entityManager->getRepository(Materiel::class)->findAll();
    $nbrMateriel = count($listMateriel) +1;
    foreach($listMateriel as $materiel){
        $dataSheet1->setCellValue('A'.$i,$materiel->getModele());
        $dataSheet1->setCellValue('B'.$i,$materiel->getMarque());
        $dataSheet1->setCellValue('C'.$i,$materiel->getCalibre());
        $dataSheet1->setCellValue('D'.$i,$materiel->getIth());
        $dataSheet1->setCellValue('E'.$i,$materiel->getImg());
        $dataSheet1->setCellValue('F'.$i,$materiel->getTypeMateriel()->getLibelle());

        $i++;
    }

    //remplissage enveloppe
   $enveloppe = $appareil->getEnveloppe();
    $dataSheet->setCellValue('A5',1);
    $dataSheet->setCellValue('B5',1);
    $dataSheet->setCellValue('C5',$enveloppe->getLieu()->getLibelle());
    $dataSheet->setCellValue('D5',$enveloppe->getNom());
    $dataSheet->setCellValue('E5',$enveloppe->getNumeroschema());
    $dataSheet->setCellValue('F5',$enveloppe->getCodegmao());
    $dataSheet->setCellValue('G5',$enveloppe->getCodemire());
    $dataSheet->setCellValue('H5',$enveloppe->getIk());
    $dataSheet->setCellValue('I5',$enveloppe->getResponsable());
    $dataSheet->setCellValue('J5',$enveloppe->getUnitegeo());
    $dataSheet->setCellValue('K5',$enveloppe->getCentreMainteneur());

    //remplissage appareil
   foreach($enveloppe->getAppareils() as $app){
       $dataSheet->setCellValue('A'.$j,1);
       $dataSheet->setCellValue('B'.$j,2);
       $dataSheet->setCellValue('C'.$j,$app->getRepere());
       $dataSheet->setCellValue('D'.$j,$app->getNom());
       $dataSheet->setCellValue('E'.$j,$app->getOrdreDansArmoire());
       $dataSheet->setCellValue('F'.$j,$app->getMonotri());
       $dataSheet->setCellValue('G'.$j,$app->getDepart());
       $dataSheet->setCellValue('H'.$j,$app->getDdr());
       $dataSheet->setCellValue('I'.$j,$app->getCalibreddr());
       $dataSheet->setCellValue('J'.$j,$app->getMotorise());
       $dataSheet->setCellValue('K'.$j,$app->getAlarme());
       $dataSheet->setCellValue('L'.$j,(null === $app->getNaturealimentation()) ? '' : $app->getNaturealimentation()->getLibLong());
       $dataSheet->setCellValue('M'.$j,$app->getSimultaneite());
       $dataSheet->setCellValue('N'.$j,$app->getCompteur());
       $dataSheet->setCellValue('O'.$j,(null === $app->getTypeconsommateur()) ? '' : $app->getTypeconsommateur()->getLibelle());
       $dataSheet->setCellValue('P'.$j,$app->getTypecable());
       $dataSheet->setCellValue('Q'.$j,$app->getNumcable());
       $dataSheet->setCellValue('R'.$j,$app->getLongueurcable());
       $dataSheet->setCellValue('S'.$j,$app->getSectioncable());
       $dataSheet->setCellValue('T'.$j,$app->getMateriel()->getModele());
       $this->dataValidation('T'.$j, $spreadsheet, $nbrMateriel);
       $dataSheet->setCellValue('U'.$j,$app->getReglageIth());
       $dataSheet->setCellValue('V'.$j,$app->getReglageImag());
       $dataSheet->setCellValue('W'.$j,$app->getObservation());
    //This is my formula who work fine      
$dataSheet->setCellValueExplicit('X'.$j,'=SI(T'.$j.'<>"";RECHERCHEV(T'.$j.';Materiel!$A$2:$F$'.$nbrMateriel.';4;FAUX);"SO")', \PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_STRING);
           $spreadsheet->getActiveSheet()->getCell('X'.$j)->getCalculatedValue();
           Calculation::getInstance($spreadsheet)->disableCalculationCache();
           $dataSheet->setCellValue('Y'.$j,$app->getMateriel()->getImg());

           $j++;
       }

        $tmpPath = $this->getTmpFile2();
        $writer = \PhpOffice\PhpSpreadsheet\IOFactory::createWriter($spreadsheet, 'Xlsx');
        $writer->setPreCalculateFormulas(true);
        $writer->save($tmpPath);

当我打开我的文件时,我看到的是:

我希望将公式保留在单元格中,并在打开文件时仅显示结果。所以有人知道如何在打开我的文件之前计算我的公式了吗?我尝试使用文档,但它不起作用。

比提前

EN

回答 1

Stack Overflow用户

发布于 2019-07-03 20:06:01

问题是您在下面的代码中使用了\PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_STRING

代码语言:javascript
复制
$dataSheet->setCellValueExplicit('X'.$j,'=SI(T'.$j.'<>"";RECHERCHEV(T'.$j.';
Materiel!$A$2:$F$'.$nbrMateriel.';4;FAUX);"SO")', \PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_STRING);

您应该使用TYPE_FORMULA

非calculate的另一个常见问题是字符串运算符,而不是公式中的number类型运算符。如果将字符串类型作为运算符,则通过打开公式来拒绝执行excel计算。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56867947

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档