我正在开发一个Symfony 2应用程序,该应用程序应该创建一个CSV文件供下载:
sep=;
{% for header in headers %}{{ header|trans({}, 'app') }};{% endfor %}
{% for row in data %}
{% for column in row %}{{ column }};{% endfor %}
{% endfor %}
和控制器:
...
$response = new Response();
$response->headers->set('Content-Type', 'text/csv; charset=UTF-16LE');
$response->headers->set('Content-Disposition', 'attachment;filename="PaymentList.csv"');
$variables = array(
'headers' => $headers,
'data' => $data,
);
// Use UTF-16LE with BOM to be compatible with Excel on Win and Mac
$content = $this->renderView('AppBundle:Shop:export.csv.twig', $variables);
$content = chr(255) . chr(254) . mb_convert_encoding($content, 'UTF-16LE', 'UTF-8');
$response->setContent($content);
return $response;
这非常有效,CSV文件可以在Windows和Mac OS X上的Excel中使用。但是,该文件也应该用于需要\r\n
换行符的相当旧的会计工具中,而Twig产生\n
换行符。
有没有办法告诉Twig改为使用\r\n
?
当然,我可以在渲染视图后简单地搜索/替换PHP中的换行符。另一个解决方案是,在PHP中完全创建CSV数据而根本不涉及Twig。
这两种解决方案都可行,但我形成的观点并不是很干净。我想控制由Twig创建的输出。这可能吗?
答案 0 :(得分:3)
Twig将行结尾标准化为\ n,请参阅此处的Github问题: https://github.com/twigphp/Twig/issues/1481
如上所述,如果你想使用Twig生成这个输出,你需要扩展默认词法分析器,或者手动替换输出中的结尾。
答案 1 :(得分:1)
行结尾取决于模板行结尾。但是,如果模板被存储"在VCS中,它可以被转换 - 没有你的直接控制。
开:https://www.designopsy.com/symfony2-export-csv/我发现了类似的内容:
$response = new StreamedResponse();
$response->setCallback(function(){
$handle = fopen('php://output', 'w+');
// Add the header of the CSV file
fputcsv($handle, array('Name', 'Surname', 'Age', 'Sex'),';');
// Query data from database
$results = $this->connection->query( "Replace this with your query" );
// Add the data queried from database
while( $row = $results->fetch() )
{
fputcsv(
$handle, // The file pointer
array($row['name'], $row['surname'], $row['age'], $row['sex']), // The fields
';' // The delimiter
);
}
fclose($handle);
});