如何用Laravel Excel制作美观表格并导入现有文件保存(Laravel 8.1.10)
Laravel 8 + Laravel Excel 3.1 操作现有Excel文件解决方案
核心思路
Laravel Excel 3.1 底层依赖 PhpSpreadsheet,不用局限于框架封装的方法,直接借助PhpSpreadsheet的API就能加载现有Excel文件,完成样式设置、数据填充后再保存回原文件(或指定路径),无需新建文件。
具体步骤
1. 确认依赖安装
确保Laravel Excel 3.1已正确安装,未安装的话执行以下命令:
composer require maatwebsite/excel:^3.1
2. 实操代码示例
以下是完整的业务实现代码,包含加载现有文件、设置订单/库存表格样式、填充数据、保存修改的全流程:
use PhpOffice\PhpSpreadsheet\IOFactory; use PhpOffice\PhpSpreadsheet\Style\Alignment; use PhpOffice\PhpSpreadsheet\Style\Border; use PhpOffice\PhpSpreadsheet\Style\Fill; // 现有Excel模板文件路径(示例:storage/app下的template.xlsx) $filePath = storage_path('app/template.xlsx'); // 1. 加载现有Excel文件 $spreadsheet = IOFactory::load($filePath); // 2. 操作订单工作表(默认选中第一个工作表,也可按名称指定) $orderSheet = $spreadsheet->getActiveSheet(); // 若要指定名为"订单表"的工作表: // $orderSheet = $spreadsheet->getSheetByName('订单表'); // 填充订单数据 $orderData = [ ['订单ID', '客户名称', '订单金额', '创建时间'], ['ORD-001', '张三', 1200.00, '2024-05-20'], ['ORD-002', '李四', 850.50, '2024-05-21'], ]; // 从A1单元格开始插入数据 $orderSheet->fromArray($orderData, null, 'A1'); // 设置订单表头样式:深色背景、白字加粗、居中对齐、带细边框 $headerStyle = $orderSheet->getStyle('A1:D1'); $headerStyle->getFont()->setBold(true)->getColor()->setRGB('FFFFFF'); $headerStyle->getFill()->setFillType(Fill::FILL_SOLID)->getStartColor()->setRGB('2C3E50'); $headerStyle->getAlignment()->setHorizontal(Alignment::HORIZONTAL_CENTER)->setVertical(Alignment::VERTICAL_CENTER); $headerStyle->getBorders()->getAllBorders()->setBorderStyle(Border::BORDER_THIN)->getColor()->setRGB('000000'); // 设置订单数据区域样式:居中对齐、带细边框 $dataRange = 'A2:D' . count($orderData); $dataStyle = $orderSheet->getStyle($dataRange); $dataStyle->getAlignment()->setHorizontal(Alignment::HORIZONTAL_CENTER)->setVertical(Alignment::VERTICAL_CENTER); $dataStyle->getBorders()->getAllBorders()->setBorderStyle(Border::BORDER_THIN)->getColor()->setRGB('000000'); // 自动调整列宽,适配内容 foreach(range('A', 'D') as $col) { $orderSheet->getColumnDimension($col)->setAutoSize(true); } // 3. 操作库存工作表(复用样式逻辑) $inventorySheet = $spreadsheet->getSheetByName('库存表'); $inventoryData = [ ['商品ID', '商品名称', '库存数量', '单价'], ['PROD-001', '笔记本电脑', 25, 4999.00], ['PROD-002', '无线鼠标', 120, 89.00], ]; $inventorySheet->fromArray($inventoryData, null, 'A1'); // 复制订单表的样式逻辑到库存表(省略重复代码,可封装成公共方法复用) $inventoryHeaderStyle = $inventorySheet->getStyle('A1:D1'); $inventoryHeaderStyle->applyFromArray($headerStyle->getArrayStyle()); $inventoryDataStyle = $inventorySheet->getStyle('A2:D' . count($inventoryData)); $inventoryDataStyle->applyFromArray($dataStyle->getArrayStyle()); foreach(range('A', 'D') as $col) { $inventorySheet->getColumnDimension($col)->setAutoSize(true); } // 4. 保存修改后的文件 $writer = IOFactory::createWriter($spreadsheet, 'Xlsx'); // 覆盖原文件 $writer->save($filePath); // 如需保存到新路径: // $writer->save(storage_path('app/updated_orders_inventory.xlsx')); // 释放内存,避免溢出 $spreadsheet->disconnectWorksheets(); unset($spreadsheet);
3. 注意事项
- 确保现有Excel文件路径正确,且服务器对该路径拥有读写权限;
- 原文件的复杂样式(如合并单元格、公式)会被保留,仅需修改目标区域的样式即可;
- Laravel Excel 3.1 已弃用
Excel::load()方法,直接使用PhpSpreadsheet的IOFactory更灵活; - 若需多次复用该逻辑,可封装成服务类,抽离样式、加载保存等公共代码。
内容的提问来源于stack exchange,提问作者Marzanur Zarif
相关产品推荐
相关产品推荐

