# php-excel **Repository Path**: liuxiaojinla/php-excel ## Basic Information - **Project Name**: php-excel - **Description**: 基于OpenSpout封装的轻量级高性能表格处理类库,仅占用3M内存,即可轻松实现上百万行数据的高效导入与导出。 你还在为 PhpSpreadsheet 封装的类库占用内存过大,无法满足业务需求时,而苦恼吗? 那么,Xin-Excel 就是你的救星,它基于OpenSpout封装的轻量级高性能表格处理类库,仅占用3M内存,即可轻松实现上百万行数据的高效导入与导出。 从此你就可以轻松实现Excel表 - **Primary Language**: PHP - **License**: Apache-2.0 - **Default Branch**: v2.x - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 3 - **Forks**: 0 - **Created**: 2022-04-25 - **Last Updated**: 2025-08-14 ## Categories & Tags **Categories**: Uncategorized **Tags**: Excel, 表格 ## README # Excel | 数据表格处理库 #### 介绍 基于`OpenSpout`封装的轻量级高性能表格处理类库,仅占用3M内存,即可轻松实现上百万行数据的高效导入与导出。 你还在为 PhpSpreadsheet 封装的类库占用内存过大,无法满足业务需求时,而苦恼吗? 那么,`Xin-Excel` 就是你的救星,它基于`OpenSpout`封装的轻量级高性能表格处理类库,仅占用3M内存,即可轻松实现上百万行数据的高效导入与导出。 从此你就可以轻松实现Excel表格数据的导出与导入,轻松解决Excel表格数据导出与导入的问题,专注于业务逻辑,不再为表格数据导出与导入而烦恼。 #### 安装教程 `composer require xin/excel` #### 使用说明 ```php setWidth(10), Column::price('goods_price', '单价'), Column::RMB('total_price', '合计'), Column::custom(function ($row) { return "{$row['master_order']['user_nickname']}(用户ID:{$row['master_order']['user_id']})"; }, '买家信息')->setWidth(20), Column::create('master_order.receiver_name', '收货人姓名')->setWidth(15), Column::phone('master_order.receiver_phone', '收货人手机号'), Column::custom(function ($row) { return "{$row['master_order']['receiver_province']}{$row['master_order']['receiver_city']}{$row['master_order']['receiver_city']}{$row['master_order']['receiver_address']}"; }, '收货人地址'), Column::create('master_order.pay_type_text', '支付方式')->setWidth(10), Column::create('master_order.order_no', '订单编号'), Column::create('master_order.order_status_text', '订单状态'), Column::datetime('create_time', '下单时间'), ]; // 快速导出数据 Export::data(new MakeBigData(), $columns, $excelFilepath, '订单数据'); // 快速导出多个数据源 $dataset = new Dataset(new MakeBigData(), , '订单数据'); $dataset2 = clone $dataset; $dataset2->setTitle('订单数据2'); Export::make([$dataset])->addDataset($dataset2)->save($excelFilepath); //======================数据导出==================================== //======================数据导入==================================== // 列映射,支持索引和首行标题两种方式进行映射 $columnsMapping = [ 'id' => 'ID', 'goods_time' => 1, 'create_time' => '下单时间', ]; // 加载单个工作表 $data = Import::load( $excelFilepath, // 加载的文件 $columnsMapping, // 列的映射关系 0, // 读取的起始工作表索引 [ 'max_count' => 10, ], // 读取的参数 ); var_dump($data); // 加载多个工作表 $data = Import::loadMultiple( $excelFilepath, // 加载的文件 [ $columnsMapping, $columnsMapping, ],// 每个工作表列的映射关系 [0, 2], // 要读取的工作表索引或名称 [ 0 => [ 'max_count' => 100, ], ],// 读取的参数 ); var_dump($data); // 遍历工作表数据 Import::make($excelFilepath)->each( 0, function ($row) { var_dump($row); }, $columnsMapping, [ 'max_count' => 100, ] ); Import::make($excelFilepath)->chunk( 0, function ($rows) { var_dump($rows); }, $columnsMapping, 10, [ 'max_count' => 100, ] ); // 遍历所有工作表数据 Import::make($excelFilepath)->eachAll( function ($row, $count) { var_dump($row, $count); return $count < 50; }, [$columnsMapping], [], [ [Import::OPTION_MAX_COUNT => 100], ] ); // 使用分块遍历所有工作表数据 Import::make($excelFilepath)->chunkAll( function ($row) { var_dump($row); }, [$columnsMapping], [], 1000, [ [Import::OPTION_MAX_COUNT => 1000], ] ); //======================数据导入==================================== echo "处理后内存: " . (memory_get_usage() / 1024 / 1024) . " MB\n"; echo "内存峰值: " . (memory_get_peak_usage() / 1024 / 1024) . " MB\n"; class MakeBigData implements \Iterator { /** * @var int */ protected $index = 0; /** * @var int */ protected $max = 10000; const content = <<max = $max; } public function current(): mixed { return [ 'id' => $this->index + 1, 'goods_title' => '商品名称', 'goods_num' => random_int(0, 9999), 'content' => self::content, 'goods_price' => floatval(random_int(0, 99999) . "." . random_int(0, 99)), 'create_time' => date('Y-m-d H:i:s'), 'master_order' => [ 'user_id' => '1', 'user_nickname' => 'xxxx', 'receiver_phone' => '13653975075', 'receiver_province' => '', 'receiver_city' => '', 'receiver_address' => '', ], ]; } public function next(): void { $this->index++; } public function key(): mixed { return $this->index; } public function valid(): bool { return $this->index < $this->max; } public function rewind(): void { $this->index = 0; } } ```