我有一些代码迭代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;
我错过了什么?
答案 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');