vkr/csv-bundle

Symfony2/3 中创建 CSV 文件的包

安装: 203

依赖项: 0

建议者: 0

安全: 0

星标: 0

关注者: 2

分支: 0

开放问题: 0

类型:symfony-bundle

1.0.3 2017-06-02 01:42 UTC

This package is auto-updated.

Last update: 2024-09-20 23:39:15 UTC


README

这是一个在 Symfony 中创建 CSV 的简单包。它没有配置,也没有任何依赖(除了 Symfony),然而如果您使用 Doctrine 并想将查询结果解析为 CSV 格式,它将工作得最好。

安装

除了在 AppKernel.php 中启用包外,无需安装。

使用

基本用法

首先,您需要某种类型的数据源。此包对数据源的外观非常灵活 - 基本上,它必须是数组或类似数组的对象(任何可以使用 foreach 运行的对象),其元素可以是数组或对象。换句话说,它将与 Doctrine 的 getResult()getArrayResult() 返回的任何非空值一起工作。

您还需要定义将进入您的 CSV 的字段。如果您的数据源由数组组成,则这些字段只是数组的键。如果您使用对象,则字段名称必须遵守以下规则,即与对象的公共获取器相关

$fieldName = lcfirst(str_replace('get', '', $getterName));

一旦您有了数据源和字段名称,您就可以在控制器中构建 CSV 数据

$dataSource = [
    [
        'name' => 'name1',
        'value' => 'value1',
        'foo' => 'bar',
    ]
];
$fields = ['name', 'value'];
$CSVCreator = $this->get('vkr_csv.csv_creator');
$CSVData = $CSVCreator->parseDataToCSV($dataSource, $fields);

变量 $CSVData 将包含以下字符串

name,value\n
name1,value1\n

如果数据源值中包含逗号,则将用空格替换。

字段标签

如果您想为 CSV 的第一行创建“好看的”标题,可以使用 parseDataToCSV() 的第三个参数,即字段标签数组。如果不为空,它应包含与 $fields 相同数量的元素。例如

$dataSource = [
    [
        'element_name' => 'name1',
        'element_value' => 'value1',
    ]
];
$fields = ['element_name', 'element_value'];
$fieldLabels = ['Element name', 'Element value'];
$CSVData = $CSVCreator->parseDataToCSV($dataSource, $fields, $fieldLabels);

生成的数据将如下所示

Element name, Element value\n
name1,value1\n

请注意,$fields$fieldLabels 不能通常包含分隔符号,否则将抛出 MalformedCSVFieldsException。但是,如果您定义了一个带有分隔符号的字段以及一个不带分隔符号的对应标签,则脚本将正常工作

$separator = '-';
$fields = ['my-value'];
$fieldLabels = ['My value'];

自定义分隔符

如果您想使用除逗号以外的其他分隔符,可以指定 parseDataToCSV() 的第四个参数。您还可以通过指定第五个参数来更改分隔符替换字符串。请注意,分隔符替换不能同时出现在字段名称和字段标签中。

$dataSource = [
    [
        'name' => 'name 1',
        'value' => 'value 1',
    ]
];
$fields = ['name', 'value'];
$separator = ' ';
$replacement = '_';
$CSVData = $CSVCreator->parseDataToCSV($dataSource, $fields, [], $separator, $replacement);

生成的数据将如下所示

name value\n
name_1 value_1\n

处理数据中的日期

如果数据源的一个元素不能隐式转换为字符串,则该包将抛出 MalformedCSVObjectException。唯一的例外是 Doctrine 常返回的 DateTime 对象。如果您预期会收到一个 DateTime 对象,应指定 parseDataToCSV() 的第六个参数,它应是一个由 DateTime::format() 方法接受的格式字符串。

$dataSource = [
    [
        'name' => 'name1',
        'date' => new DateTime('2016-02-01'),
    ]
];
$fields = ['name', 'date'];
$format = 'd/m/Y';
$CSVData = $CSVCreator->parseDataToCSV($dataSource, $fields, [], null, null, $format);

生成的数据将如下所示

name,date\n
name1,01/02/2016\n

如果格式字符串包含分隔符号,这些符号也将被替换。

如果您未指定第六个参数或它格式不正确,则该包不会给出任何错误,而是会获得调用 DateTime::format() 而不带参数的标准结果,这取决于您的 PHP 设置。

填充器

parseDataToCSV() 的第七个(也是最后一个)参数确定如果您的数据源的一个或多个元素的字段值为空或未定义时应该做什么。如果未指定此参数,则返回空字符串。例如

$dataSource = [
    [
        'name' => 'name1',
    ]
];
$fields = ['name', 'price'];
$CSVData = $CSVCreator->parseDataToCSV($dataSource, $fields);

没有 $filler 的结果如下所示

name,price\n
name1,\n

如果您指定以下内容

$filler = '0.00';

您将得到以下内容

name,price\n
name1,0.00\n

填充器中的分隔符号将被替换。

从数据生成CSV文件

parseDataToCSV()返回的变量还不是CSV文件,它只是一个字符串。为了让Symfony返回一个文件,你需要定义头部并返回一个响应。这个包包含一个用于定义头部的简单辅助函数setHeaders()。它接受一个可选的$filename参数,这是一个不带扩展名的文件名。如果这个参数没有指定,文件将被命名为{current_timestamp}.csv

以下是控制器中返回文件的方式

$headers = $CSVCreator->setHeaders('foo');
$response = new Symfony\Component\HttpFoundation\Response();
foreach ($headers as $headerName => $headerValue) {
    $response->headers->set($headerName, $headerValue);
}
$response->setContent($CSVData);
return $response;

生成的文件将命名为foo.csv

API

string CSVCreator::parseDataToCSV(array|Traversable $dataSource, string[] $fields, string[] $fieldLabels = [], string $separator = ',', string $replacement = ' ', string $dateFormat = '', string $filler = '')

string[] CSVCreator::setHeaders(string $filename = '')