feat: 添加 PHPSpreadsheet 支持以增强报表导出功能
- 在 `composer.json` 中新增 `phpoffice/phpspreadsheet` 依赖。 - 更新 `ReportJobDownloadController` 以使用 `AdminReportSpreadsheetExporter` 进行 XLSX 格式的报表导出,简化导出逻辑并确保文件名包含动态生成的输出路径后缀。 - 更新 `AdminAuthorizationRegistry` 中的权限定义,扩展相关权限以支持新的设置管理功能。
This commit is contained in:
34
app/Services/Admin/AdminReportSpreadsheetExporter.php
Normal file
34
app/Services/Admin/AdminReportSpreadsheetExporter.php
Normal file
@@ -0,0 +1,34 @@
|
||||
<?php
|
||||
|
||||
namespace App\Services\Admin;
|
||||
|
||||
use PhpOffice\PhpSpreadsheet\Spreadsheet;
|
||||
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
|
||||
use Symfony\Component\HttpFoundation\StreamedResponse;
|
||||
|
||||
/** 将 {@see AdminReportQueryService::reportRows} 的二维数组导出为真实 xlsx。 */
|
||||
final class AdminReportSpreadsheetExporter
|
||||
{
|
||||
/**
|
||||
* @param list<array<int, string|int|float|null>> $rows
|
||||
*/
|
||||
public function streamDownload(array $rows, string $filename): StreamedResponse
|
||||
{
|
||||
return response()->streamDownload(function () use ($rows): void {
|
||||
$spreadsheet = new Spreadsheet;
|
||||
$sheet = $spreadsheet->getActiveSheet();
|
||||
|
||||
foreach ($rows as $rowIndex => $row) {
|
||||
foreach ($row as $colIndex => $cell) {
|
||||
$sheet->setCellValue([$colIndex + 1, $rowIndex + 1], $cell ?? '');
|
||||
}
|
||||
}
|
||||
|
||||
$writer = new Xlsx($spreadsheet);
|
||||
$writer->save('php://output');
|
||||
$spreadsheet->disconnectWorksheets();
|
||||
}, $filename, [
|
||||
'Content-Type' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
|
||||
]);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user