使用Symfony中的liuggio / ExcelBundle清空PHPExcel文件

时间:2015-12-29 10:34:04

标签: excel symfony bundle phpexcel

我有一些代码迭代Excel工作表的行和列,并用其他文本替换文本。这是通过一个具有excel文件和字典作为参数的服务来完成的。

$mappedTemplate = $this->get('app.entity.translate')->translate($phpExcelObject, $dictionary);

服务本身就是这样。

public function translate($template, $dictionary)
    {

        foreach ($template->getWorksheetIterator() as $worksheet) {

            foreach ($worksheet->getRowIterator() as $row) {
                $cellIterator = $row->getCellIterator();
                $cellIterator->setIterateOnlyExistingCells(false); // Loop all cells, even if it is not set
                foreach ($cellIterator as $cell) {
                    if (!is_null($cell)) {
                        if (!is_null($cell->getCalculatedValue())) {

                            if (array_key_exists((string)$cell->getCalculatedValue(), $dictionary)) {

                                $worksheet->setCellValue(
                                    $cell->getCoordinate(),
                                    $dictionary[$cell->getCalculatedValue()]
                                );

                            }
                        }
                    }
                }
            }
        }

        return $template;

    }

经过一些调试后,我发现文本实际上已被替换,并且服务的工作方式应该如此。问题是当我将新的PHPExcel文件作为下载响应返回时,excel为空。

这是我用来返回文件的代码。

// create the writer
        $writer = $this->get('phpexcel')->createWriter($mappedTemplate, 'Excel5');
        // create the response
        $response = $this->get('phpexcel')->createStreamedResponse($writer);
        // adding headers
        $dispositionHeader = $response->headers->makeDisposition(
            ResponseHeaderBag::DISPOSITION_ATTACHMENT,
            $file_name
        );
        $response->headers->set('Content-Type', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
        $response->headers->set('Pragma', 'public');
        $response->headers->set('Cache-Control', 'maxage=1');
        $response->headers->set('Content-Disposition', $dispositionHeader);

        return $response;

我错过了什么?

1 个答案:

答案 0 :(得分:2)

您的代码缺少对作者的调用。

您只创建编写器,但从不使用它,至少在共享代码示例中没有:

$objWriter = new PHPExcel_Writer_Excel2007($objPHPExcel);
$response = $this->get('phpexcel')->createStreamedResponse($objWriter)

另一件事是内容类型:您是否正确设置了apache内容类型?

$response->headers->set('Content-Type', 'application/vnd.ms-excel; charset=utf-8');