PhpSpreadsheet provides extensive support for number formatting, allowing you to control how values are displayed in cells. Number formats only affect the display of values - the underlying data remains unchanged.
The NumberFormat class provides many predefined format constants:
use PhpOffice\PhpSpreadsheet\Style\NumberFormat;// Apply a predefined format$spreadsheet->getActiveSheet()->getStyle('A1')->getNumberFormat() ->setFormatCode(NumberFormat::FORMAT_NUMBER_COMMA_SEPARATED1);
use PhpOffice\PhpSpreadsheet\Cell\AdvancedValueBinder;use PhpOffice\PhpSpreadsheet\Style\NumberFormat;// Use AdvancedValueBinder to automatically recognize dates$spreadsheet->setValueBinder(new AdvancedValueBinder());$spreadsheet->getActiveSheet()->setCellValue('D1', '2008-12-31');$spreadsheet->getActiveSheet()->getStyle('D1') ->getNumberFormat() ->setFormatCode(NumberFormat::FORMAT_DATE_YYYYMMDDSLASH);
PhpSpreadsheet provides wizards to help create date and time format masks:
use PhpOffice\PhpSpreadsheet\Style\NumberFormat\Wizard\Date as DateWizard;use PhpOffice\PhpSpreadsheet\Style\NumberFormat\Wizard\Time as TimeWizard;use PhpOffice\PhpSpreadsheet\Style\NumberFormat\Wizard\DateTime as DateTimeWizard;// Create a date format: yyyy-mm-dd$dateFormat = new DateWizard( DateWizard::SEPARATOR_DASH, DateWizard::YEAR_FULL, DateWizard::MONTH_NUMBER_LONG, DateWizard::DAY_NUMBER_LONG);$spreadsheet->getActiveSheet()->getStyle('A1') ->getNumberFormat() ->setFormatCode($dateFormat);// Create a time format: hh:mm$timeFormat = new TimeWizard( TimeWizard::SEPARATOR_COLON, TimeWizard::HOURS_LONG, TimeWizard::MINUTES_LONG);$spreadsheet->getActiveSheet()->getStyle('A2') ->getNumberFormat() ->setFormatCode($timeFormat);// Combine date and time: yyyy-mm-dd hh:mm$dateTimeFormat = new DateTimeWizard(' ', $dateFormat, $timeFormat);$spreadsheet->getActiveSheet()->getStyle('A3') ->getNumberFormat() ->setFormatCode($dateTimeFormat);
Number format codes can have up to 4 sections separated by semicolons:
[Positive];[Negative];[Zero];[Text]
If you only specify one section, it applies to all numbers. Two sections apply to positive/zero and negative. Three sections apply to positive, negative, and zero.
You can also use built-in format codes by their index:
use PhpOffice\PhpSpreadsheet\Style\NumberFormat;// Get format code by index$formatCode = NumberFormat::builtInFormatCode(14); // Returns 'm/d/yyyy'// Set format by index$spreadsheet->getActiveSheet()->getStyle('A1')->getNumberFormat() ->setBuiltInFormatCode(14);// Get index of a format code$index = NumberFormat::builtInFormatCodeIndex('0.00%'); // Returns 10
// Get the format code$formatCode = $spreadsheet->getActiveSheet() ->getStyle('A1') ->getNumberFormat() ->getFormatCode();// Get built-in format code (returns false or int)$builtInCode = $spreadsheet->getActiveSheet() ->getStyle('A1') ->getNumberFormat() ->getBuiltInFormatCode();
// Accounting format with currency symbol$spreadsheet->getActiveSheet()->getStyle('A1:A10')->getNumberFormat() ->setFormatCode('_("$"* #,##0.00_);_("$"* \(#,##0.00\);_("$"* "-"??_);_(@_)');
PhpSpreadsheet can convert system date format placeholders:
use PhpOffice\PhpSpreadsheet\Style\NumberFormat;// These system formatsNumberFormat::FORMAT_SYSDATE_X // '[$-x-sysdate]'NumberFormat::FORMAT_SYSTIME_X // '[$-x-systime]'// Are converted to the configured formats:NumberFormat::setLongDateFormat('dddd, mmmm d, yyyy');NumberFormat::setTimeFormat('h:mm:ss AM/PM');// Retrieve configured formats$longDate = NumberFormat::getLongDateFormat();$shortDate = NumberFormat::getShortDateFormat();$dateTime = NumberFormat::getDateTimeFormat();$time = NumberFormat::getTimeFormat();