dmachehin/sheet-mapper
Composer 安装命令:
composer require dmachehin/sheet-mapper
包简介
Map spreadsheet rows to structured PHP data objects
关键字:
README 文档
README
PHP библиотека, которая превращает строки CSV/XLS/XLSX в DTO-классы на основе атрибутов-схем. Внутри используется PhpSpreadsheet, так что поддерживаются как таблицы с заголовками, так и файлы с фиксированными колонками.
Возможности
#[SheetMapping]на классе описывает лист и наличие строки заголовков. Еслиtarget_sheetне указан, при чтении файла будут обработаны все листы книги.#[SheetField]на свойствах задаёт номер колонки (с нуля) либо имя заголовка.- Для merge-ячеек можно точечно включить наследование значения из master-ячейки через
allow_merge. - Поиск колонок по регулярным выражениям:
header_regexpпомогает, если заголовки динамические. - Опциональная проверка значений по регулярному выражению через
value_regexp. - Кастомные преобразования значений перед приведением типов через
value_callback. - Проверка структуры листа:
enforce_field_mapping=trueгарантирует наличие всех обязательных колонок/заголовков и отсутствие лишних. По умолчаниюenforce_field_mapping=false.ignored_columnsпозволяет пометить исключения (по индексу колонки или имени заголовка). - Автоматическое приведение типов для
string,int,float,bool, а такжеDateTimeInterfaceи enum. - Пропуск полностью пустых строк и понятные исключения, если значения отсутствуют или заголовок не найден.
Быстрый старт
DTO с атрибутами:
<?php use SheetMapper\Attributes\SheetMapping; use SheetMapper\Attributes\SheetField; #[SheetMapping(target_sheet: 'Sheet1', has_header_row: true)] class Item { #[SheetField(header: 'Name')] public string $name; #[SheetField(header: 'Amount')] public float $amount; #[SheetField(header: 'Active')] public bool $active; }
Чтение файла:
<?php use SheetMapper\SheetMapper; require __DIR__ . '/vendor/autoload.php'; $mapper = new SheetMapper(); $items = $mapper->map(__DIR__ . '/storage/items.xlsx', Item::class); foreach ($items as $item) { echo $item->name . ' => ' . $item->amount . PHP_EOL; } // Если данные уже загружены, можно передать массив строк: $rows = [ ['Name', 'Amount', 'Active'], ['Apple', 10.5, true], ]; $items = $mapper->mapFromArray($rows, Item::class);
Если target_sheet не задан, map() пройдёт по всем листам workbook и вернёт объединённый результат.
Чтение без заголовков
Если в листе нет строки заголовков, установите has_header_row: false и укажите индекс колонки:
#[SheetMapping(has_header_row: false)] class ColumnItem { #[SheetField(column: 0)] public string $name; #[SheetField(column: 1)] public DateTimeImmutable $purchasedAt; }
Merge-ячейки
По умолчанию merge-ячейки не разворачиваются: дочерние ячейки диапазона считаются пустыми. Если для конкретного поля нужно читать значение из верхней левой ячейки merge-диапазона, включите allow_merge: true.
#[SheetMapping(has_header_row: true)] class MergedItem { #[SheetField(header: 'Category', allow_merge: true)] public string $category; #[SheetField(header: 'Amount')] public int $amount; }
Это полезно для вертикально объединённых ячеек, где значение задано только в первой строке группы.
Проверка структуры листа
#[SheetMapping(
has_header_row: true,
enforce_field_mapping: true,
ignored_columns: ['optional', 5] // строка заголовка или индекс колонки
)]
class ValidatedItem
{
#[SheetField(header: 'Name')]
public string $name;
#[SheetField(header: 'Optional')]
public ?string $optional = null;
#[SheetField(column: 5)]
public ?float $legacyAmount = null;
}
Если обязательная колонка/заголовок не найден, будет выброшено SheetMapperException. Лишние заголовки тоже приводят к ошибке. Все элементы из ignored_columns допускается пропустить и/или оставить в файле как исключения — полю останется значение по умолчанию.
Регулярные выражения для заголовков
#[SheetMapping(has_header_row: true)] class RegexItem { #[SheetField(header_regexp: '/^product/i')] public string $name; #[SheetField(header: 'Amount')] public int $amount; }
Поле name найдёт любую колонку, чей заголовок начинается со слова «Product». Можно комбинировать header и header_regexp, но как минимум одно из column, header, header_regexp должно быть задано.
Регулярные выражения для значений
#[SheetMapping(has_header_row: true)] class ValueItem { #[SheetField(header: 'Code', value_regexp: '/^[A-Z]{3}-\d{3}$/')] public string $code; }
value_regexp проверяет каждое непустое значение и выбрасывает SheetMapperException, если оно не совпало с шаблоном.
Кастомные преобразования значений
Если стандартного приведения типов недостаточно, используйте value_callback — он получает исходное значение ячейки и должен вернуть преобразованный результат (подойдёт любая callable: 'trim', ['ClassName', 'method'] и т.п.).
final class FieldCallbacks { public static function ruYesNoToBool(mixed $value): bool { return strtolower(trim((string) $value)) === 'да'; } } #[SheetMapping(has_header_row: true)] class CallbackItem { #[SheetField(header: 'Active', value_callback: [FieldCallbacks::class, 'ruYesNoToBool'])] public bool $active; }
При ошибке внутри callback будет выброшено SheetMapperException, так что можно смело кидать собственные исключения с пояснениями.
dmachehin/sheet-mapper 适用场景与选型建议
dmachehin/sheet-mapper 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 10.49k 次下载、GitHub Stars 达 0, 最近一次更新时间为 2025 年 11 月 18 日, 在 PHP 生态内属于活跃度较高的组件。
它主要适用于以下技术方向: 「spreadsheet」 「mapper」 「sheet」 等业务场景。在实际项目中,围绕这些方向常见需要落地的问题包括:接口对接、性能调优、并发安全、与既有框架(Laravel / ThinkPHP / Yii / Webman 等)的兼容适配,以及生产环境的日志埋点与稳定性保障。
我们在过去多个企业项目中使用过 dmachehin/sheet-mapper 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。
基于 dmachehin/sheet-mapper 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。
线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。
承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。
与 dmachehin/sheet-mapper 相关的其它包
同方向 / 同关键字的高下载量 PHP Composer 包推荐,方便对比选型:
data-mapper php library
This Symfony bundle integrates PhpSpreadsheet into Symfony using Twig.
Convention-based Alternative ORM
PHPExcel - OpenXML - Read, Create and Write Spreadsheet documents in PHP - Spreadsheet engine
PHPExcel - OpenXML - Read, Create and Write Spreadsheet documents in PHP - Spreadsheet engine
PHPExcel - OpenXML - Read, Create and Write Spreadsheet documents in PHP - Spreadsheet engine
统计信息
- 总下载量: 10.49k
- 月度下载量: 0
- 日度下载量: 0
- 收藏数: 0
- 点击次数: 31
- 依赖项目数: 0
- 推荐数: 0
其他信息
- 授权协议: Unknown
- 更新时间: 2025-11-18