使用Sonata Admin Bundle更改xls导出中的日期格式

时间:2014-09-02 13:29:41

标签: symfony export-to-excel sonata-admin date-formatting

我接管了基于Symfony2构建的Sonata Admin Bundle应用程序的责任,并被要求用户进行一些小的更改。在列表页面的xls导出中,所有日期都显示为例如Wed, 01 Aug 2012 00:00:00 +0200,但Excel格式为General。用户希望此列中的数据是Excel日期类型,以便它可以排序。

我能够找到有关导出自定义的一些信息,但这主要涉及选择列表导出文件类型或要包含的字段,而不是如何更改导出文档中的格式。有一个类似的问题被问到here(我认为),但没有答案。

我认为这会(或应该)非常简单,但肯定不是很明显。任何帮助将不胜感激。

5 个答案:

答案 0 :(得分:4)

马西亚诺的答案略有改善。 使代码更有弹性抵御奏鸣曲更新。

public function getDataSourceIterator()
{
    $datasourceit = parent::getDataSourceIterator();
    $datasourceit->setDateTimeFormat('d/m/Y'); //change this to suit your needs
    return $datasourceit;
}

答案 1 :(得分:2)

这是我的代码。它的工作!

use Exporter\Source\DoctrineORMQuerySourceIterator;
use Sonata\DoctrineORMAdminBundle\Datagrid\ProxyQuery;
use Sonata\AdminBundle\Datagrid\ProxyQueryInterface;

和功能:

/**
 * {@inheritdoc}
 */
public function getDataSourceIterator()
{

    $datagrid = $this->getDatagrid();
    $datagrid->buildPager();
    $fields=$this->getExportFields();
    $query = $datagrid->getQuery();


    $query->select('DISTINCT ' . $query->getRootAlias());
    $query->setFirstResult(null);
    $query->setMaxResults(null);



    if ($query instanceof ProxyQueryInterface) {
        $query->addOrderBy($query->getSortBy(), $query->getSortOrder());

        $query = $query->getQuery();
    }


    return new DoctrineORMQuerySourceIterator($query, $fields,'d.m.Y');
    }

答案 2 :(得分:2)

只需在您的管理员中添加此项(覆盖您正在扩展的管理类的方法)。发现它正在阅读代码。它不在文档中。

public function getDataSourceIterator()
{
    $datagrid = $this->getDatagrid();
    $datagrid->buildPager();

    $datasourceit = $this->getModelManager()->getDataSourceIterator($datagrid, $this->getExportFields());
    $datasourceit->setDateTimeFormat('d/m/Y'); //change this to suit your needs

    return $datasourceit;
}

答案 3 :(得分:2)

在我的管理类EmployeeAdmin中,我使用getExportFields函数指定我们要导出的字段:

   public function getExportFields() {
       return array(
            $this->trans('list.label_interview_date') => 'interviewDateFormatted'           
       );
}

interviewDateFormatted 实际上是对相应实体(Employee)方法getInterviewDateFormatted的调用,如下所示:

    public function getInterviewDateFormatted() {
    return ($this->interviewDate instanceof \DateTime) ? $this->interviewDate->format("Y-m-d") : "";
}

这样我可以更改日期格式或对我要导出的字段进行其他必要的更改。

答案 4 :(得分:0)

你设法让它成功吗?

日期格式定义为新DoctrineORMQuerySourceIterator.php(https://github.com/sonata-project/exporter/blob/master/lib/Exporter/Source/DoctrineORMQuerySourceIterator.php)的参数

DoctrineORMQuerySourceIterator.php是在getDataSourceIterator函数(https://github.com/sonata-project/SonataDoctrineORMAdminBundle/blob/2705f193d6a441b9140fef0996ca392887130ec0/Model/ModelManager.php

中创建的

Admin.php内部有函数调用它:

   public function getDataSourceIterator()
   {
        $datagrid = $this->getDatagrid();
        $datagrid->buildPager();
        return $this->getModelManager()->getDataSourceIterator($datagrid, $this->getExportFields());
    }

如果您自己编写getDataSourceIterator(),则可以更改日期格式。

相关问题