首页 > 解决方案 > cyber-duck/laravel-excel 文件损坏/格式无效

问题描述

我花了几个小时找出为什么使用包cyber-duck / laravel-excel导出的excel导出在数据源是查询时可以使用excel,但是当使用自定义序列化程序时,它只会停止正确格式化excel

代码没有错误,超级简单的excel。甚至尝试文档中发布的代码:

用法:

$serialiser = new CustomSerialiser();
$excel = Exporter::make('Excel');
$excel->load($collection);
$excel->setSerialiser($serialiser);
return $excel->stream('filename.xlsx');

自定义序列化器:

namespace App\Serialisers;

use Illuminate\Database\Eloquent\Model;
use Cyberduck\LaravelExcel\Contract\SerialiserInterface;

class ExampleSerialiser implements SerialiserInterface
{
    public function getData($data)
    {
        $row = [];

        $row[] = $data->field1;
        $row[] = $data->relationship->field2;

        return $row;
    }

    public function getHeaderRow()
    {
        return [
            'Field 1',
            'Field 2 (from a relationship)'
        ];
    }
}

有什么想法吗?

标签: excellaravellaravel-excel

解决方案


你用什么软件打开文件?Excel?开发办公室?

如果您打开测试文件夹 > Unit > ExporterTest.php,您应该会在 test_can_use_a_custom_serialiser 中看到一个工作示例。

您可以将第 155$exporter = $this->app->make('cyber-duck/exporter')->make('Excel');行更改为 ,将第 160 行更改为$reader = ReaderFactory::create(Type::XLSX);(否则它将使用 CSV)并注释掉第 174 行以保留文件,以便您可以在测试运行后打开它。

您发布的 ExampleSerializer 需要修改以匹配您的 Eloquent 模型和关系。此外,该示例使用 Eloquent 版本,并且您提到了查询构建器。如果要使用 Query builder 版本,则需要使用 loadQuery(我将尝试在下周更新文档以涵盖此用户案例)。请随时给我发送一封包含您的代码的电子邮件,以便我查看并尝试提供帮助(如果没有看到实际实现,这有点难以理解这个问题)。你应该在 github 上找到我,我是从事我们项目的 Cyber​​-Duck 人员之一。


推荐阅读