Files
PhpSpreadsheet/samples/Basic5/55_DefinedStyles.php
T
2026-02-11 17:15:52 -08:00

141 lines
6.6 KiB
PHP

<?php
require __DIR__ . '/../Header.php';
/** @var PhpOffice\PhpSpreadsheet\Helper\Sample $helper */
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Style\NumberFormat;
use PhpOffice\PhpSpreadsheet\Writer\BaseWriter;
use PhpOffice\PhpSpreadsheet\Writer\Ods\Cell\Style;
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
$array = [
['NUMBER', 1, NumberFormat::FORMAT_NUMBER],
['NUMBER_0', 1, NumberFormat::FORMAT_NUMBER_0],
['NUMBER_00', 1, NumberFormat::FORMAT_NUMBER_00],
['NUMBER_COMMA_SEPARATED1', 1234, NumberFormat::FORMAT_NUMBER_COMMA_SEPARATED1],
['NUMBER_COMMA_SEPARATED2', 1234, NumberFormat::FORMAT_NUMBER_COMMA_SEPARATED2],
['PERCENTAGE', 0.98, NumberFormat::FORMAT_PERCENTAGE],
['PERCENTAGE_0', 0.985, NumberFormat::FORMAT_PERCENTAGE_0],
['PERCENTAGE_00', 0.9856, NumberFormat::FORMAT_PERCENTAGE_00],
['DATE_YYYYMMDD', 46000, NumberFormat::FORMAT_DATE_YYYYMMDD],
['DATE_DDMMYYYY', 46000, NumberFormat::FORMAT_DATE_DDMMYYYY],
['DATE_DMYSLASH', 46000, NumberFormat::FORMAT_DATE_DMYSLASH],
['DATE_DMYMINUS', 46000, NumberFormat::FORMAT_DATE_DMYMINUS],
['DATE_DMMINUS', 46000, NumberFormat::FORMAT_DATE_DMMINUS],
['DATE_MYMINUS', 46000, NumberFormat::FORMAT_DATE_MYMINUS],
['DATE_XLSX14', 46000, NumberFormat::FORMAT_DATE_XLSX14],
['DATE_XLSX14_ACTUAL', 46000, NumberFormat::FORMAT_DATE_XLSX14_ACTUAL],
['DATE_XLSX15', 46000, NumberFormat::FORMAT_DATE_XLSX15],
['DATE_XLSX15_YYYY', 46000, NumberFormat::FORMAT_DATE_XLSX15_YYYY],
['DATE_XLSX16', 46000, NumberFormat::FORMAT_DATE_XLSX16],
['DATE_XLSX17', 46000, NumberFormat::FORMAT_DATE_XLSX17],
['DATE_XLSX22', 46000, NumberFormat::FORMAT_DATE_XLSX22],
['DATE_XLSX22_ACTUAL', 46000, NumberFormat::FORMAT_DATE_XLSX22_ACTUAL],
['DATE_DATETIME', 46000.25, NumberFormat::FORMAT_DATE_DATETIME],
['DATE_DATETIME_BETTER', 46000.25, NumberFormat::FORMAT_DATE_DATETIME_BETTER],
['DATE_TIME1', 46000.25, NumberFormat::FORMAT_DATE_TIME1],
['DATE_TIME2', 46000.25, NumberFormat::FORMAT_DATE_TIME2],
['DATE_TIME3', 46000.25, NumberFormat::FORMAT_DATE_TIME3],
['DATE_TIME4', 46000.25, NumberFormat::FORMAT_DATE_TIME4],
['DATE_TIME5', 46000.25, NumberFormat::FORMAT_DATE_TIME5],
['DATE_TIME6', 46000.25, NumberFormat::FORMAT_DATE_TIME6],
['DATE_TIME7', 46000.25, NumberFormat::FORMAT_DATE_TIME7],
['DATE_TIME8', 46000.25, NumberFormat::FORMAT_DATE_TIME8],
[' DATE_TIME_INTERVAL_HMS', 0.0087731481481482, NumberFormat::FORMAT_DATE_TIME_INTERVAL_HMS],
['DATE_YYYYMMDDSLASH', 46000, NumberFormat::FORMAT_DATE_YYYYMMDDSLASH],
['DATE_LONG_DATE', 46000, NumberFormat::FORMAT_DATE_LONG_DATE],
['CURRENCY_USD_INTEGER', 1234.56, NumberFormat::FORMAT_CURRENCY_USD_INTEGER],
['CURRENCY_USD', 1234.56, NumberFormat::FORMAT_CURRENCY_USD],
['CURRENCY_EUR_INTEGER', 1234.56, NumberFormat::FORMAT_CURRENCY_EUR_INTEGER],
['CURRENCY_EUR', 1234.56, NumberFormat::FORMAT_CURRENCY_EUR],
['CURRENCY_GBP_INTEGER', 1234.56, NumberFormat::FORMAT_CURRENCY_GBP_INTEGER],
['CURRENCY_GBP', 1234.56, NumberFormat::FORMAT_CURRENCY_GBP],
['CURRENCY_YEN_YUAN_INTEGER', 1234.56, NumberFormat::FORMAT_CURRENCY_YEN_YUAN_INTEGER],
['CURRENCY_YEN_YUAN', 1234.56, NumberFormat::FORMAT_CURRENCY_YEN_YUAN],
['ACCOUNTING_USD', 1234.56, NumberFormat::FORMAT_CURRENCY_USD],
['ACCOUNTING_EUR', 1234.56, NumberFormat::FORMAT_CURRENCY_EUR],
['CUSTOM1', 1234.56, '0.000'],
['CUSTOM2', 1234.56, '"$"#,##0.00_);[Red]\("$"#,##0.00\)'],
];
$row = 0;
$helper->log('Populate spreadsheet');
foreach ($array as $cells) {
++$row;
$sheet->getCell("A$row")->setValue($cells[0]);
$sheet->getCell("B$row")->setValue($cells[1]);
if (!str_starts_with($cells[0], 'DATE')) {
$sheet->getCell("C$row")->setValue(-$cells[1]);
}
$sheet->getStyle("B$row:C$row")
->getNumberFormat()
->setFormatCode($cells[2]);
}
$sheet->getColumnDimension('A')->setAutoSize(true);
$sheet->getColumnDimension('B')->setAutoSize(true);
$sheet->getColumnDimension('C')->setAutoSize(true);
$sheet->setSelectedCells('A1');
function threeDecimalPlaces(Style $obj, string $name): void
{
$writer = $obj->getWriter();
$writer->startElement('number:number-style');
$writer->writeAttribute('style:name', $name);
$writer->startElement('number:number');
$writer->writeAttribute('number:decimal-places', '3');
$writer->writeAttribute('number:min-decimal-places', '3');
$writer->writeAttribute('number:min-integer-digits', '1');
$writer->endElement(); // number:number
$writer->endElement(); // number:number-style
}
function redBrackets(Style $obj, string $name): void
{
$writer = $obj->getWriter();
$writer->startElement('number:currency-style');
$writer->writeAttribute('style:name', $name . 'P0');
$writer->writeElement('number:currency-symbol', '$');
$writer->startElement('number:number');
$writer->writeAttribute('number:decimal-places', '2');
$writer->writeAttribute('number:min-decimal-places', '2');
$writer->writeAttribute('number:min-integer-digits', '1');
$writer->writeAttribute('number:grouping', 'true');
$writer->endElement(); // number:number
$writer->writeElement('number:text', ' ');
$writer->endElement(); // number:currency-style
$writer->startElement('number:currency-style');
$writer->writeAttribute('style:name', $name);
$writer->startElement('style:text-properties');
$writer->writeAttribute('fo:color', '#FF0000');
$writer->endElement(); // style:text-properties
$writer->writeElement('number:text', '($');
$writer->startElement('number:number');
$writer->writeAttribute('number:decimal-places', '2');
$writer->writeAttribute('number:min-decimal-places', '2');
$writer->writeAttribute('number:min-integer-digits', '1');
$writer->writeAttribute('number:grouping', 'true');
$writer->endElement(); // number:number
$writer->writeElement('number:text', ')');
$writer->startElement('style:map');
$writer->writeAttribute('style:condition', 'value()>=0');
$writer->writeAttribute('style:apply-style-name', $name . 'P0');
$writer->endElement(); // style:map
$writer->endElement(); // number:currency-style
}
function writeAdditional(BaseWriter $writer): void
{
if (method_exists($writer, 'useAdditionalNumberFormats')) {
$array = [
'0.000' => threeDecimalPlaces(...),
'"$"#,##0.00_);[Red]\("$"#,##0.00\)' => redBrackets(...),
];
$writer->useAdditionalNumberFormats($array);
}
}
$helper->write($spreadsheet, __FILE__, ['Xlsx', 'Ods'], writerCallback: writeAdditional(...));
$spreadsheet->disconnectWorksheets();