CaiWuXiTong/app/Business/FundForecastTemplate.php

91 lines
4.2 KiB
PHP

<?php
namespace App\Business;
use App\Models\Business\FundForecast;
use PhpOffice\PhpSpreadsheet\Cell\Coordinate;
use PhpOffice\PhpSpreadsheet\Cell\DataType;
use PhpOffice\PhpSpreadsheet\IOFactory;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Style\Alignment;
use PhpOffice\PhpSpreadsheet\Style\Border;
use PhpOffice\PhpSpreadsheet\Style\Fill;
use PhpOffice\PhpSpreadsheet\Style\NumberFormat;
use Symfony\Component\HttpFoundation\StreamedResponse;
class FundForecastTemplate
{
private const MAX_ROWS = 5000;
public function download(): StreamedResponse
{
$spreadsheet = $this->makeSpreadsheet();
return response()->streamDownload(function () use ($spreadsheet): void {
$writer = IOFactory::createWriter($spreadsheet, 'Xlsx');
$writer->setPreCalculateFormulas(false);
$writer->save('php://output');
$spreadsheet->disconnectWorksheets();
}, '资金预测表-导入模板.xlsx', [
'Content-Type' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
'Cache-Control' => 'no-store, no-cache, must-revalidate',
]);
}
private function makeSpreadsheet(): Spreadsheet
{
$spreadsheet = new Spreadsheet();
$spreadsheet->getProperties()->setTitle('资金预测表导入模板')->setSubject('资金预测表批量导入');
$sheet = $spreadsheet->getActiveSheet();
$sheet->setTitle('资金预测表');
$sheet->setShowGridlines(false);
$sheet->freezePane('C3');
$sheet->getRowDimension(1)->setRowHeight(26);
$sheet->getRowDimension(2)->setRowHeight(24);
$sheet->setCellValueExplicit('A1', '预测月份', DataType::TYPE_STRING);
$sheet->setCellValueExplicit('B1', '公司名称', DataType::TYPE_STRING);
$sheet->mergeCells('A1:A2');
$sheet->mergeCells('B1:B2');
$labels = FundForecast::columnLabels();
$columnIndex = 3;
foreach (FundForecastPage::GROUPS as $group) {
$startColumn = Coordinate::stringFromColumnIndex($columnIndex);
$endColumn = Coordinate::stringFromColumnIndex($columnIndex + count($group['fields']) - 1);
$sheet->setCellValueExplicit("{$startColumn}1", $group['label'], DataType::TYPE_STRING);
$sheet->mergeCells("{$startColumn}1:{$endColumn}1");
foreach ($group['fields'] as $field) {
$column = Coordinate::stringFromColumnIndex($columnIndex++);
$sheet->setCellValueExplicit("{$column}2", $labels[$field], DataType::TYPE_STRING);
$sheet->getColumnDimension($column)->setWidth(16);
}
}
$lastColumn = Coordinate::stringFromColumnIndex($columnIndex - 1);
$sheet->getColumnDimension('A')->setWidth(14);
$sheet->getColumnDimension('B')->setWidth(28);
$sheet->getStyle("A1:{$lastColumn}2")->getAlignment()
->setHorizontal(Alignment::HORIZONTAL_CENTER)->setVertical(Alignment::VERTICAL_CENTER);
$sheet->getStyle("A1:{$lastColumn}2")->getFont()->setBold(true);
$sheet->getStyle("A1:{$lastColumn}1")->getFont()->getColor()->setARGB('FFFFFFFF');
$sheet->getStyle("A1:{$lastColumn}1")->getFill()->setFillType(Fill::FILL_SOLID)->getStartColor()->setARGB('FF856632');
$sheet->getStyle("A2:{$lastColumn}2")->getFill()->setFillType(Fill::FILL_SOLID)->getStartColor()->setARGB('FFF7F0DE');
$sheet->getStyle("A1:{$lastColumn}2")->getBorders()->getAllBorders()
->setBorderStyle(Border::BORDER_THIN)->getColor()->setARGB('FFD8D2C7');
$sheet->getStyle('A3:A' . (self::MAX_ROWS + 2))->getNumberFormat()->setFormatCode(NumberFormat::FORMAT_TEXT);
$sheet->getStyle('C3:AD' . (self::MAX_ROWS + 2))->getNumberFormat()->setFormatCode('#,##0.00');
for ($row = 3; $row <= self::MAX_ROWS + 2; $row++) {
$sheet->setCellValue("AA{$row}", "=SUM(C{$row}:H{$row})");
$sheet->setCellValue("AB{$row}", "=SUM(I{$row}:N{$row})");
$sheet->setCellValue("AC{$row}", "=SUM(O{$row}:Z{$row})");
$sheet->setCellValue("AD{$row}", "=AA{$row}+AB{$row}-AC{$row}");
$sheet->setCellValue("AE{$row}", "=IF(AD{$row}<0,\"是\",\"否\")");
}
return $spreadsheet;
}
}