91 lines
4.2 KiB
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;
|
|
}
|
|
}
|