bfinlay/laravel-excel-seeder

使用 Excel、XLSX、XLS、CSV、ODS、Gnumeric、XML、HTML、SLK 文件在 Laravel 中填充数据库

v3.4.1 2024-08-17 18:57 UTC

README

PHPUnit tests

使用 CSV 文件、XLSX 文件等通过 Laravel 填充您的数据库

使用此包,您可以节省数据库填充的时间。您无需编写填充文件,而可以使用 CSV、XLSX 或任何受支持的电子表格文件格式来加载项目数据库。有配置选项可供控制从电子表格文件中插入数据。

该项目是从 laravel-csv-seeder 分支出来的,并重写以支持处理多个输入文件,并使用 PhpSpreadsheet 库来支持 XLSX 和其他文件格式。

功能

  • 通过 PhpSpreadsheet 库支持 CSV、XLS、XLSX、ODF、Gnumeric、XML、HTML、SLK 文件
  • 每个 Laravel 填充类可从多个电子表格文件进行填充
  • 生成 XLS 电子表格的文本输出版本,以便在分支合并时确定 XLS 的更改
  • 自动将 CSV 文件名解析为表名。
  • 自动将 XLSX 的工作表标签解析为表名。
  • 自动将 CSV 和 XLSX 的标题映射到表列名。
  • 自动确定 CSV 文件的分隔符,包括逗号 ,、制表符 \t、竖线 | 和分号 ;
  • 通过在电子表格列标题中使用前缀字符跳过填充数据列。
  • 使用给定的一组列名对值进行哈希处理。
  • 将默认值填充到表列中。
  • 调整填充时的 Laravel 时间戳。

扩展性

此包已用于具有 500 万行每文件的 CSV 文件,同时保持平坦的内存使用(无内存泄漏)。

测试

此包由 Github Actions 自动运行 PHPUnit 测试。在做出改进或发现和修复错误时添加测试。

PHPUnit tests
此包针对以下 Laravel 版本进行测试

  • Laravel 5.8
  • Laravel 6.x
  • Laravel 7.x
  • Laravel 8.x
  • Laravel 9.x
  • Laravel 10.x
  • Laravel 11.x

内容

安装

Laravel 8.x, 9.x, 10.x, 11.x

  • 直接通过 composer require --dev -W bfinlay/laravel-excel-seeder 需要此包

  • 或在您的 composer.json 中添加此包并运行 composer update

    "require-dev": {
      ...
      "bfinlay/laravel-excel-seeder": "^3.0",
      ...
    }
    

Laravel 5.8, 6.x, 7.x

Laravel 5.8、6.x 和 7.x 需要 DBAL 2.x。由于 DBAL 是 laravel 的 require-dev 依赖项,因此当安装子包时,composer 不会解决其版本约束。但是,通过指定 DBAL 2.x 作为附加依赖项,这很容易解决。

请注意,Laravel 5.8、6.x、7.x、8.x 和 9.x 已达到 EOL。有关更多信息,请参阅 https://laravelversions.com/en。由于 github actions 的测试,这些版本将在合理的时间内继续得到此包的支持。

为 Laravel 5.8、6.x 和 7.x 安装

  • 直接通过 composer require --dev -W bfinlay/laravel-excel-seeder 需要此包

  • 直接通过 composer require --dev -W doctrine/dbal:^2.6 需要dbal包

  • 或在您的 composer.json 中添加这些包并运行 composer update

    "require-dev": {
      ...
      "bfinlay/laravel-excel-seeder": "^3.0",
      "doctrine/dbal": "^2.6"
      ...
    }
    

最简单用法

在最简单的情况下,您可以直接使用 bfinlay\SpreadsheetSeeder\SpreadsheetSeeder,它将处理 Laravel 项目基础路径下 /database/seeds/*.xlsx/database/seeders/*.xlsx 目录中所有的 XLSX 文件。

只需将 SpreadsheetSeeder 添加到您的 /database/seeds/DatabaseSeeder.php 类(Laravel 5.8, 6.x, 7.x)或 /database/seeders/DatabaseSeeder.php 类(Laravel 8.X 和更高版本)中。

use Illuminate\Database\Seeder;
use bfinlay\SpreadsheetSeeder\SpreadsheetSeeder;

class DatabaseSeeder extends Seeder
{
    /**
     * Seed the application's database.
     *
     * @return void
     */
    public function run()
    {
        $this->call([
            SpreadsheetSeeder::class,
        ]);
    }
}

将您的电子表格放入 Laravel 项目的 /database/seeds/ 路径(Laravel 5.8, 6.x, 7.x)或 /database/seeders/ 路径(Laravel 8.x 和更高版本)。

默认设置下,种子器对 XLSX 文件做出了一些假设

  • 工作表(标签)名称与 --> 数据库中的表名称匹配
  • 工作表(标签)具有标题行,列名称与 --> 数据库中的表列名称匹配
  • 如果 XLSX 工作簿中只有一个工作表,则工作表(标签)名称或工作簿文件名必须与数据库中的一个表匹配。

一个 Excel 示例

一个 CSV 示例

    first_name,last_name,birthday
    Foo,Bar,1970-01-01
    John,Doe,1980-01-01

基本用法

在大多数情况下,您需要配置设置。创建一个扩展 bfinlay\SpreadsheetSeeder\SpreadsheetSeeder 的种子类并在类中配置设置。种子类将看起来像这样

use bfinlay\SpreadsheetSeeder\SpreadsheetSeeder;

class UsersTableSeeder extends SpreadsheetSeeder
{    
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function settings(SpreadsheetSeederSettings $set)
    {
        // By default, the seeder will process all XLSX files in /database/seeds/*.xlsx (relative to Laravel project base path)
        
        // Example setting
        $set->worksheetTableMapping = ['Sheet1' => 'first_table', 'Sheet2' => 'second_table'];
    }
}

注意:过载 run() 的较旧方法仍然适用于向后兼容。

填充单个工作表

默认情况下,执行 db:seed Artisan 命令将播种工作簿中的所有工作表。

如果您想指定要播种的单个工作表,可以使用带有 --sheet 选项的 xl:seed Artisan 命令。您可以指定多个 --sheet 选项。

php artisan xl:seed --sheet=users --sheet=posts 

上面的命令将运行 Database\Seeders\DatabaseSeeder 类,对于调用的任何 SpreadsheetSeeders,将仅播种名称为 usersposts 的工作表。您可以使用 --class 选项指定要单独运行的特定播种器类

php artisan xl:seed --class=MySpreadsheetSeederClass --sheet=users --sheet=posts

如果您想运行默认的 SpreadsheetSeeder 类,可以指定 --class=#。(# 类似于工作表。)

php artisan xl:seed --class=# --sheet=users --sheet=posts

为了更简单的语法,您也可以将这些作为参数传递,并省略 --class--seed。当使用参数时,
第一个参数必须是类,后续参数将是工作表。

php artisan xl:seed # users posts

重要提示:与单独播种传统播种器类一样,在播种单个工作表时,如果 truncate 选项为 true,则还会删除具有级联删除关系的项。

分支差异的 Excel 文本输出

在运行数据库播种器后,将创建一个与输入文件同名的子目录。将使用工作表名称创建每个工作表的文本输出文件。此文本文件包含工作簿中每个工作表(标签)的文本表示形式,可用于确定合并其他贡献者分支时的 XLSX 中的更改。

目前支持两种格式。较旧的格式是 'markdown',是向后兼容的默认格式。较新的格式是 'yaml',旨在与典型的基于行的差异软件更好地协同工作。

将此文件提交到存储库,以便它可以作为比较的基础。

您必须手动合并 XLSX 电子表格。

可以通过将 textOutput 设置为 FALSE 来禁用 TextOutput。

有关更多信息,请参阅 文本输出

配置

  • 添加列 - 要添加到工作表中发现的列之外的列名称数组
  • 别名 - (全局)将列名称映射到替代列名称
  • 批量插入大小 - 每批插入的行数
  • 日期格式 - 当 Carbon 无法自动解析日期时,通过列配置日期格式
  • 默认值 - (全局)将列名称映射到默认值
  • 分隔符 - 指定CSV分隔符(默认:自动检测)
  • 扩展名 - 指定目录时的默认文件扩展名(默认:xlsx)
  • 文件 - 要处理的数据源文件路径或路径(默认:/database/seeds/*.xlsx)
  • 可哈希 -(全局)使用Hash外观哈希的列名数组
  • 标题 -(全局)当为true时跳过第一行(默认:true)
  • 输入编码 -(全局)输入数据源的可能编码数组
  • 限制 -(全局)限制从工作表加载的最大行数(默认:无限制)
  • 映射 - 列“映射”;用作标题的列名数组
  • 偏移量 -(全局)在数据源开始处跳过的行数(默认:0)
  • 输出编码 -(全局)输出到数据库的编码
  • 解析器 -(全局)数据源中应使用指定解析器解析的列名关联数组
  • 读取块大小 - 每块读取的行数
  • 跳过器 -(全局)表示列或工作表应跳过的前缀字符串(默认:%)
  • 跳过列 - 将跳过的工作表中的列名数组
  • 跳过工作表 - 将跳过的工作簿中的工作表名数组
  • 表名 -(过时)单工作表文件的数据库插入表名
  • 文本输出 - 启用文本markdown输出(默认:true)
  • 文本输出路径 - 文本输出路径
  • 时间戳 - 当为true时,将Laravel的'timestamp'列'created_at'和'updated_at'设置为当前日期/时间(默认:true)
  • 截断 - 在播种之前截断表(默认:true)
  • 截断忽略外键约束 - 在播种之前截断表(默认:true)
  • Unix时间戳 - 将指定列的日期/时间值解释为Unix时间戳而不是Excel时间戳(默认:无列)
  • UUID - 将为生成UUID的列名数组
  • 验证 - 将列名映射到Laravel验证规则
  • 工作表表映射 - 将工作表名称映射到表名称

添加列

$addColumns (数组 [])

这是一个将作为列名添加到工作表中,除了在工作表中找到的那些列名之外的列名数组。

这些额外的列将按照工作表中的列相同的方式进行处理。单元格值将按照工作表中的“空”单元格相同的方式进行考虑。这些列可以通过解析器、默认值或uuid进行填充。

示例:['uuid', 'column1', 'column2']

默认:[]

列别名

$aliases (数组 [])

这是一个关联数组,用于将数据源的列名映射到替代列名(别名)。

示例:['CSV Header 1' => 'Table Column 1', 'CSV Header 2' => 'Table Column 2']

默认:[]

批量插入大小

$batchInsertSize (整数)

每批插入的行数。

默认:5000

日期格式

$dateFormats (数组 [])

这是一个关联数组,将数据源中的列名映射到Carbon应使用的日期格式字符串。构建日期格式字符串的信息在此:[https://php.ac.cn/manual/en/datetime.createfromformat.php](https://php.ac.cn/manual/en/datetime.createfromformat.php)

当数据库表的目标列是日期时间格式,而源数据是字符串时,生成器将使用Carbon来解析日期格式。在许多情况下,Carbon可以自动解析日期而无需指定日期格式。

当Carbon无法自动解析日期时,将此数组中的列名映射到日期格式字符串。当源列被映射时,Carbon将使用日期格式字符串而不是自动解析。

如果使用列映射(请参阅[映射](#user-content-mapping)),则列名应与$mapping数组中的值匹配,而不是文件中的值(如果有的话)。

示例

[
  'order_date' => 'Y-m-d H:i:s.u+',  // parses "2020-10-04 05:31:02.440000000"
]

默认:[]

默认值

$defaults (数组 [])

这是一个关联数组,将数据源中的列名映射到将覆盖数据源中任何值的默认值。

示例:['created_by' => 'seed', 'updated_by' => 'seed']

默认:[]

分隔符

$delimiter (字符串 NULL)

CSV、制表符分隔的文件和其他文本分隔文件中使用的分隔符。当此值未设置时,phpspreadsheet库将自动检测文本分隔符

默认:null

数据源文件默认扩展名

$extension (字符串 'xlsx')

指定目录在 $this->file 中时使用的默认扩展名

默认:"xlsx"

use bfinlay\SpreadsheetSeeder\SpreadsheetSeeder;

class UsersTableSeeder extends SpreadsheetSeeder
{    
    /**
     * Run the database seeds.
     *
     * @return void
     */
     
    public function settings(SpreadsheetSeederSettings $set)
    {
        // specify relative to Laravel project base path
        // feature directories specified
        $set->file = [
            '/database/seeds/feature1', 
            '/database/seeds/feature2',
            '/database/seeds/feature3', 
            ]; 
        
        // process all xlsx and csv files in paths specified above
        $set->extension = ['xlsx', 'csv'];        
    }
}

数据源文件

$file (字符串)(数组 [])(Symfony\Component\Finder\Finder)

此值是作为数据源使用的Excel或CSV文件的路径。这是一个字符串或数组[],是一个要处理的文件或目录列表,可以包括通配符。它还可以设置为Laravel中已包含的Symfony Finder的实例。

默认情况下,生成器将处理 /database/seeds (对于Laravel 5.8 - 7.x) 和 /database/seeders (对于Laravel 8.x和更高版本) 中的所有XLSX文件。

路径相对于项目根目录指定

默认:"/database/seeds/*.xlsx"

use bfinlay\SpreadsheetSeeder\SpreadsheetSeeder;

class UsersTableSeeder extends SpreadsheetSeeder
{    
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function settings(SpreadsheetSeederSettings $set)
    {
        // specify relative to Laravel project base path
        $set->file = [
            '/database/seeds/file1.xlsx', 
            '/database/seeds/file2.xlsx',
            '/database/seeds/seed*.xlsx', 
            '/database/seeds/*.csv']; 
    }
}

此设置还可以配置为Symfony Finder的实例,这是Laravel中已包含的组件。

使用Finder时,默认情况下路径不相对于 base_path()。要使路径相对于 base_path(),请将其添加到finder路径之前。您还可以使用其他Laravel路径辅助函数

示例

use bfinlay\SpreadsheetSeeder\SpreadsheetSeeder;

class UsersTableSeeder extends SpreadsheetSeeder
{    
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function settings(SpreadsheetSeederSettings $set)
    {
        // specify relative to Laravel project base path
        $set->file =
            (new Finder)
                ->in(base_path() . '/database/seeds/')
                ->name('*.xlsx')
                ->notName('*customers*')
                ->sortByName();
    }
}

可哈希

$hashable (数组 ['password'])

这是数据源中需要使用Laravel的Hash门面进行哈希的列名数组。

哈希算法在config/hashing.php中配置,请参阅https://laravel.net.cn/docs/master/hashing

示例:['password']

默认:[]

标题

$header (布尔值 TRUE)

如果数据源的第一行有标题,将此设置为true将跳过第一行。

默认:TRUE

输入编码

$inputEncodings (数组 [])

从输入数据源中可能的输入编码数组,请参阅https://php.ac.cn/manual/en/mbstring.supported-encodings.php

此值用作mb_convert_encoding的"from_encoding"参数。如果没有指定,则使用内部编码。

默认:[]

限制

$limit (整数)

限制从工作表加载的最大行数。这在开发中可以保持快速加载时间。

这可以与环境文件中的设置或App::environment() (APP_ENV)一起使用,以限制开发环境中的数据行。

示例

use bfinlay\SpreadsheetSeeder\SpreadsheetSeeder;

class SalesTableSeeder extends SpreadsheetSeeder
{    
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function settings(SpreadsheetSeederSettings $set)
    {
        $set->file = '/database/seeds/sales.xlsx';
        if (App::environment('local'))
            $set->limit = 10000;
    }
}

默认:null

列"映射"

$mapping (数组 [])

与laravel-csv-seeder的向后兼容性

这是一个将用作标题的列名数组。

如果$this->header为true,则将跳过数据的第一行。这允许CSV文件中的现有标题被覆盖。

这被称为"映射",因为其预期用途是将没有标题行的CSV文件的字段映射到数据库表的列。

示例:['Header Column 1', 'Header Column 2']

默认:[]

偏移量

$offset (整数)

在数据源开始处跳过的行数,不包括标题行。

默认:0

输出编码

$outputEncoding (字符串)

输出编码到数据库,请参阅https://php.ac.cn/manual/en/mbstring.supported-encodings.php

此值用作mb_convert_encoding的"to_encoding"参数。

默认:UTF-8

解析器

$parsers (数组 ['column' => function($value) {}])

这是一个关联数组,其中包含数据源中的列名,这些列名应使用指定的解析器进行解析。

示例

['email' => function ($value) {
     return strtolower($value);
}];

默认:[]

读取块大小

$readChunkSize (整数)

每次块读取的行数。

默认:5000

跳过器

$skipper (字符串 %)

这是一个字符串,用作前缀,以指示数据源中的列应被跳过。对于Excel工作簿,以该字符串为前缀的工作表也将被跳过。跳过器前缀可以是多字符字符串。

  • 示例:数据源列%id_copy将通过跳过器%被跳过。
  • 示例:数据源列#id_copy将通过跳过器#被跳过。
  • 示例:数据源列[skip]id_copy将通过跳过器[skip]被跳过。
  • 示例:工作表%worksheet1将通过跳过器%被跳过。

默认:"%";

跳过列

$skipColumns (数组 [])

这是一个将跳过的工作表列名数组。

这可以用来以与跳过器字符相同的方式跳过列,但不会修改工作表。

示例:['column1', 'column2']

默认:[]

跳过工作表

$skipSheets (数组 [])

这是一个将跳过的工作表名数组。

这可以用来以与跳过器字符相同的方式跳过工作表,但不会修改工作簿。

示例:['Sheet1', 'Sheet2']

默认:[]

目标表名

$tablename (字符串)

与laravel-csv-seeder的向后兼容性

数据库中要插入的表名。如果没有设置,则根据以下规则自动解析表名

  • 如果文件中只有一个工作表且工作表不是表名,则使用基本文件名
  • 否则使用工作表名称

使用worksheetTableMapping代替,将工作表名称映射到备用表名

默认:null

use bfinlay\SpreadsheetSeeder\SpreadsheetSeeder;

class UsersTableSeeder extends SpreadsheetSeeder
{    
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function settings(SpreadsheetSeederSettings $set)
    {
        // specify relative to Laravel project base path
        // specify filename that is automatically dumped from an external process
        $set->file = '/database/seeds/autodump01234456789.xlsx';  // note: could alternatively be a csv
        
        // specify the table this is loaded into
        $set->tablename = 'sales';
        
        // in this example, table truncation also needs to be disabled so previous sales records are not deleted
        $set->truncate = false;
    }
}

文本输出

$textOutput (布尔值)(字符串)(数组 [])

  • 设置为false以禁用文本格式表的输出。
  • true 默认为 'markdown' 输出,以保持向后兼容。
  • 'markdown' 用于markdown输出
  • 'yaml' 用于yaml输出
  • ['markdown', 'yaml'] 用于markdown和yaml输出

默认:TRUE

文本输出路径

$textOutputPath (字符串) 注意:在开发中,可能发生变化

文本输出的路径

处理工作簿后,播种器将输出工作表的文本格式,以帮助进行工作簿的diff和合并。默认路径与输入工作簿相同。设置此路径将输出文件放置在不同的位置。

默认值: "";

时间戳

$timestamps (字符串/布尔值 TRUE)

true 时,将Laravel时间戳列 'created_at' 和 'updated_at' 设置为当前日期和时间。

false 时,字段将被设置为NULL

默认值: true

截断目标表

$truncate (布尔值 TRUE)

在播种前截断表。

默认:TRUE

注意:目前不支持排除表名的数组

请参见上面的 tablename 示例

在播种前忽略外键约束截断目标表

$truncateIgnoreForeign (布尔值 TRUE)

在播种前截断表时忽略外键约束。

false 时,如果违反外键完整性,则不会截断表。

默认:TRUE

注意:目前不支持排除表名的数组

Unix时间戳

$unixTimestamps (数组 [])

这是一个包含应解释为Unix时间戳而不是Excel时间戳的值的列名的数组。参见 转换:日期/时间值

如果使用列映射(见映射),则列名应与 $mapping 数组中的值匹配,而不是文件中的值(如果有的话)。

注意:此设置目前是全局的,适用于所有文件或工作表。所有文件或工作表中具有指定名称的所有列都将解释为Unix时间戳。要针对不同的文件应用不同的设置,请使用单独的 Seeder 实例处理文件。

示例: ['start_date', 'finish_date'];

默认:[]

UUID

$uuid (数组 [])

这是一个数组,包含数据源中的列名,播种器将为这些列生成UUID。

生成的UUID是类型4 "随机" UUID,使用laravel Str::uuid() 辅助函数 https://laravel.net.cn/docs/10.x/helpers#method-str-uuid

如果电子表格有该列且有UUID值在该列中,播种器将使用电子表格中的UUID值。

如果电子表格在该列中有任何其他值或为空,播种器将生成一个新的UUID值。

如果电子表格没有该列,使用 $addColumns 添加该列,并使用 $uuid(此设置)为添加的列生成UUID。

示例: ['uuid']

默认:[]

验证

$validate (数组 [])

这是一个关联数组,将数据源中的列名映射到Laravel Validator验证规则。可用的验证规则在此处描述: https://laravel.net.cn/docs/master/validation#available-validation-rules

示例

[
  'email' => 'unique:users,email_address',
  'start_date' => 'required|date|after:tomorrow',
  'finish_date' => 'required|date|after:start_date'
]

默认:[]

工作表表映射

$worksheetTableMapping (数组 [])

这是一个关联数组,用于将Excel文件中工作表的名称映射到表名称。

Excel工作表有31个字符的限制。

当表名长度超过工作表字符限制时,这很有用。

示例: ['Sheet1' => 'first_table', 'Sheet2' => 'second_table']

默认:[]

use bfinlay\SpreadsheetSeeder\SpreadsheetSeeder;

class UsersTableSeeder extends SpreadsheetSeeder
{    
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function settings(SpreadsheetSeederSettings $set)
    {
        // specify the table this is loaded into
        $set->worksheetTableMapping = [
            'first_table_name_abbreviated' => 'really_rather_very_super_long_first_table_name', 
            'second_table_name_abbreviated' => 'really_rather_very_super_long_second_table_name'
            ];
    }
}

详细信息

空值

  • 字符串转换:'null' 转换为 NULL,'true' 转换为 TRUE,'false' 转换为 FALSE
  • 'null' 字符串转换为 NULL 被视为显式空值。它们不受隐式转换为默认值的影响。
  • 空单元格设置为数据库表数据定义中指定的默认值,除非整行都是空的
  • 如果整行都是空单元格,则跳过该行。要故意插入空行,请在每个单元格中放置字符串值 'null'。

日期/时间值

当目标表列是日期/时间类型时,单元格值被转换为日期/时间格式。

  • 如果值是数值,则假定它是Excel日期值
  • 如果值是字符串,则使用 Carbon::parse 进行解析,并格式化为SQL查询。
  • 如果值是Unix时间戳,请指定具有 Unix 时间戳 设置的列名,将其转换为Unix时间戳而不是Excel时间戳。

示例

指定时间戳和指定表名的表

使用特定的'created_at'和'updated_at'时间戳,并给seeder指定特定的表名,而不是使用CSV文件名;

use bfinlay\SpreadsheetSeeder\SpreadsheetSeeder;

class UsersTableSeeder extends SpreadsheetSeeder
{    
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function settings(SpreadsheetSeederSettings $set)
    {
        $set->file = '/database/seeds/csvs/users.csv';
        $set->tablename = 'email_users';
        $set->timestamps = '1970-01-01 00:00:00';
    }
}

工作表到表映射

将工作表标签名称映射到表名称。

Excel工作表标签有31个字符的限制。当表名长度应超过工作表标签字符限制时,这很有用。

参见上面的 示例

映射

使用以下CSV将工作表或CSV的标题映射到表列中;

XLSX
CSV
1,Foo,Bar
2,John,Doe

示例

use bfinlay\SpreadsheetSeeder\SpreadsheetSeeder;

class UsersTableSeeder extends SpreadsheetSeeder
{    
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function settings(SpreadsheetSeederSettings $set)
    {
        $set->file = '/database/seeds/users.xlsx';
        $set->mapping = ['id', 'firstname', 'lastname'];
        $set->header = FALSE;
    }
}

注意:此映射是laravel-csv-seeder的旧选项。当前,此映射适用于工作簿中的所有工作表,并且目前是为单张工作表和工作簿设计的。

有两种方法可以解决为不同输入文件或工作表映射不同列标题的问题

  1. 向多工作表工作簿添加标题列
  2. 使用CSV或单工作表工作簿,并为每个需要不同列映射的工作簿创建单独的seeder

带有默认值的别名

使用别名和默认值播种表,如下所示;

use bfinlay\SpreadsheetSeeder\SpreadsheetSeeder;

class UsersTableSeeder extends SpreadsheetSeeder
{    
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function settings(SpreadsheetSeederSettings $set)
    {
        $set->file = '/database/seeds/csvs/users.csv';
        $set->aliases = ['csvColumnName' => 'table_column_name', 'foo' => 'bar'];
        $set->defaults = ['created_by' => 'seeder', 'updated_by' => 'seeder'];
    }
}

跳过器

跳过工作簿中的工作表,或在XLSX或CSV中具有前缀的列。例如,你使用工作表中的 id,它只能在你的工作簿中使用。工作表文件可能看起来像以下这样

每一行的第一个和第四个值将在播种时被跳过。默认前缀是'%'且可更改。在这个例子中,跳过前缀被更改为'skip:'

use bfinlay\SpreadsheetSeeder\SpreadsheetSeeder;

class UsersTableSeeder extends SpreadsheetSeeder
{    
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function settings(SpreadsheetSeederSettings $set)
    {
        $set->file = '/database/seeds/users.xlsx';
        $set->skipper = 'skip:';
    }
}

要跳过工作簿中的工作表,请使用'%'或指定的跳过前缀前缀工作表名称。

验证

像这样验证XLSX或CSV的每一行;

use bfinlay\SpreadsheetSeeder\SpreadsheetSeeder;

class UsersTableSeeder extends SpreadsheetSeeder
{    
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function settings(SpreadsheetSeederSettings $set)
    {
        $set->file = '/database/seeds/users.xlsx';
        $set->validate = [ 'name'              => 'required',
                            'email'             => 'email',
                            'email_verified_at' => 'date_format:Y-m-d H:i:s',
                            'password'          => ['required', Rule::notIn([' '])]];
    }
}

散列

在播种XLSX或CSV时散列值如下;

use bfinlay\SpreadsheetSeeder\SpreadsheetSeeder;

class UsersTableSeeder extends SpreadsheetSeeder
{    
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function settings(SpreadsheetSeederSettings $set)
    {
        $set->file = '/database/seeds/users.xlsx';
        $set->hashable = ['password'];
    }
}

输入和输出编码

mb_convert_encodings函数用于转换编码。

use bfinlay\SpreadsheetSeeder\SpreadsheetSeeder;

class UsersTableSeeder extends SpreadsheetSeeder
{    
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function settings(SpreadsheetSeederSettings $set)
    {
        $set->file = '/database/seeds/users.xlsx';
        $set->inputEncodings = ['UTF-8', 'ISO-8859-1'];
        $set->outputEncoding = 'UTF-8';
    }
}

Postgres序列计数器

当使用Postgres时,Excel Seeder for Laravel将自动更新Postgres自动递增ID列的序列计数器。

MySQL自动处理其自动递增列的序列计数器。

许可证

Excel Seeder for Laravel 是一个开源软件,许可协议为 MIT 协议。

更改

3.4.1

  • 修复问题 #27。添加 MariaDB 容器和 MariaDB 测试。改进了对空值和显式空值的测试用例。

3.4.0

  • 添加对 Laravel 11 的支持,问题 #25
  • 针对问题 #26 的初步修复,Orchestra 测试框架中的不兼容更新

3.3.3

  • RefreshDatabase 修复,问题 #19

3.3.2

  • 更新 Laravel 10.x 的测试用例

3.3.1

  • 完成 SQLite、MySQL 和 Postgres 上截断表的测试

3.3.0

  • 增强 Postgres 序列计数器的鲁棒性

3.2.0

  • 添加 解析器 设置,允许在列上运行闭包

3.1.0

  • 添加 YAML 文本输出 作为 markdown 的替代方案,旨在更好地与面向行的 diff 编辑器配合使用
  • 通过添加传递设置对象的设置方法来改进 设置配置,支持代码自动完成,而不是覆盖 run 方法并使用防止代码自动完成的魔法方法。原始方法仍然支持向后兼容。

3.0.0

  • 更新 composer.json 以添加对 Laravel 9.x 和 doctrine\dbal 3.x 的支持
  • 请参阅 安装 部分以获取针对 Laravel 5.8、6.x、7.x 旧版本要求 DBAL 2.x 包的新说明。
  • 更新到 3.0.0,因为 DBAL 更新破坏了 安装 过程的向后兼容性,要求 Laravel 5.8、6.x、7.x 旧版本使用 DBAL 2.x 包。

2.3.1

  • 修复编号为 #10 的错误(由 @tezu35 贡献)
  • 添加与编号 #10 相关的日期时间测试用例
  • 重构代码库,将表头和行导入转换器从电子表格阅读器解耦
  • 实现 GitHub Actions 以自动测试所有支持的 PHP 和 Laravel 框架版本

2.3.0

  • 重构代码库,将阅读器和写入器解耦并消除中介
  • 添加将 $this->file 设置为 Symfony Finder 实例的能力
  • 在使用 Postgres 时自动更新 Postgres 序列号
  • 在 5.8、6.x、7.x、8.x 上运行测试,更新 composer.json 和文档

2.2.0

  • 添加 xl:seed 命令,以根据问题 #8 的建议指定单个工作表

2.1.15

  • 更新截断表以禁用外键完整性约束问题 #8

2.1.14

  • 修复 PHP 8 中 mb_convert_encoding 的更改问题 #7(由 @mw7147 贡献)

2.1.13

  • 修复文本输出表中的错误:已删除的工作表未从文本输出表中删除
  • 重构文本输出表

2.1.12

  • 增强进度消息,以显示每个分块的进度:处理的行数、内存使用情况和处理时间
  • 修复 laravel-excel-seeder 中的内存泄漏
  • 修复 laravel 框架中的内存泄漏
  • 添加配置设置,以指定 Carbon 无法自动解析的列的日期格式
  • 添加日期解析的单元测试

2.1.11

  • 改进日期支持

2.1.10

  • 添加 limit 功能
  • 组织文档
  • 添加 limit 测试

2.1.9

  • 修复错误:当工作表名称映射时,v2.1.8 的表名未正确确定
  • Markdown 输出:将公式和注释保存到由表头列定义的区域之外(到右边)
  • 测试
    • 添加当工作表名称映射时的表名确定测试
    • 重构测试命名空间以与测试名称相对应
    • 将测试特定示例数据移动到 laravel-excel-seeder-test-data
    • 锁定 laravel-excel-seeder-test-data 到特定版本,以确保测试数据与包保持同步

2.1.8

  • 修复 "hashable" 设置,使其按文档工作。添加 "hashable" 测试。
  • 添加 batchInsertSize 设置以控制插入的批次大小。默认 5000 行。
    • 这将解决 SQLSTATE[HY000]: General error: 7 number of parameters must be between 0 and 65535 问题
  • 添加分块读取以分块读取电子表格以节省内存。默认 5000 行。
    • 这将解决读取大型工作表时的内存不足错误

2.1.7

  • 添加对测试此包的初始单元测试用例
  • 优化表名自动解析
    • 如果文件中只有一个工作表且工作表不是表名,则使用基本文件名
    • 否则使用工作表名称
  • 实现了DBAL库中当列包含大写字母时出现的问题的修复

2.1.6

  • 修复了未使用tablename设置的bug #5(由@MeowKim贡献)
  • 添加设置以禁用文本输出(默认启用)(由@MeowKim贡献)

2.1.5

  • 更改文本输出markdown文件的方法。为每个工作表创建一个包含独立markdown的目录,而不是一个长文件。

2.1.4

  • 修复了如果跳过字符串前缀的工作表是工作簿中的第一个工作表则不会跳过的bug

2.1.3

  • 参数化文本表格输出以实现不同的文本表格呈现
  • 修复了markdown问题,其中一些空列的表格在没有外部列'|'符号的情况下不会渲染

2.1.2

  • 更新文本表格输出以输出为markdown文件

2.1.1

  • 修复了调用服务容器时的问题,导致设置无法正确使用

2.1.0

  • 重构代码以提高关注点的分离并减少类之间的耦合
  • 添加功能以输出输入源工作表的文本表示,用于diff

2.0.6

  • 添加输入编码和输出编码参数

2.0.5

  • 添加tablesSeeded属性以跟踪哪些表已被播种

2.0.4

  • 添加工作表到表映射,用于将工作表标签名称映射到不同的表名称
  • 添加示例Excel工作表 '/database/seeds/xlsx/classicmodels.xlsx'

2.0.3

  • 设置默认的'skipper'前缀为'%'
  • 识别长度大于1个字符的'skipper'前缀字符串

2.0.2

  • 跳过完全为空单元格的行
  • 跳过以skipper字符为前缀的工作表标签。这允许使用额外的表用于文档、替代设计或中间计算。
  • 问题#2 - 跳过读取和计算跳过的列中单元格的解决方案。常见用例是在跳过的列中使用=index(X:X,match(Y,Z:Z,0))来验证外键。