Overview
PhpSpreadsheet provides comprehensive styling capabilities through theStyle class. Styles can be applied to individual cells or ranges of cells.
The Style Class
TheStyle class is the main container for all style components:
$style = $spreadsheet->getActiveSheet()->getStyle('A1');
// Access style components
$font = $style->getFont();
$fill = $style->getFill();
$borders = $style->getBorders();
$alignment = $style->getAlignment();
$numberFormat = $style->getNumberFormat();
$protection = $style->getProtection();
Applying Styles with Arrays
The most efficient way to apply multiple style properties is usingapplyFromArray():
$styleArray = [
'font' => [
'name' => 'Arial',
'bold' => true,
'italic' => false,
'underline' => \PhpOffice\PhpSpreadsheet\Style\Font::UNDERLINE_DOUBLE,
'strikethrough' => false,
'color' => ['rgb' => '808080']
],
'borders' => [
'bottom' => [
'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_DASHDOT,
'color' => ['rgb' => '808080']
],
'top' => [
'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_DASHDOT,
'color' => ['rgb' => '808080']
]
],
'alignment' => [
'horizontal' => \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER,
'vertical' => \PhpOffice\PhpSpreadsheet\Style\Alignment::VERTICAL_CENTER,
'wrapText' => true,
],
'fill' => [
'fillType' => \PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID,
'startColor' => ['rgb' => 'FFFF00']
]
];
$spreadsheet->getActiveSheet()->getStyle('B2')->applyFromArray($styleArray);
Font Styling
Font Properties
use PhpOffice\PhpSpreadsheet\Style\Font;
$font = $spreadsheet->getActiveSheet()->getStyle('A1')->getFont();
// Font name and size
$font->setName('Arial');
$font->setSize(14);
// Font styles
$font->setBold(true);
$font->setItalic(true);
$font->setStrikethrough(true);
// Underline
$font->setUnderline(Font::UNDERLINE_SINGLE);
// Options: UNDERLINE_NONE, UNDERLINE_SINGLE, UNDERLINE_DOUBLE,
// UNDERLINE_SINGLEACCOUNTING, UNDERLINE_DOUBLEACCOUNTING
// Superscript and subscript
$font->setSuperscript(true);
// OR
$font->setSubscript(true);
// Font color
$font->getColor()->setRGB('FF0000');
// OR
$font->getColor()->setARGB('FFFF0000');
Font Constants
use PhpOffice\PhpSpreadsheet\Style\Font;
Font::UNDERLINE_NONE
Font::UNDERLINE_SINGLE
Font::UNDERLINE_DOUBLE
Font::UNDERLINE_SINGLEACCOUNTING
Font::UNDERLINE_DOUBLEACCOUNTING
Font::DEFAULT_FONT_NAME // 'Calibri'
Using Array Format
$spreadsheet->getActiveSheet()->getStyle('A1')->getFont()->applyFromArray([
'name' => 'Arial',
'bold' => true,
'italic' => false,
'underline' => Font::UNDERLINE_DOUBLE,
'strikethrough' => false,
'color' => ['rgb' => '808080']
]);
Colors
Colors can be specified in multiple ways:use PhpOffice\PhpSpreadsheet\Style\Color;
// RGB (without alpha)
$color->setRGB('FF0000');
// ARGB (with alpha/transparency)
$color->setARGB('FFFF0000');
// Predefined colors
$color->setARGB(Color::COLOR_RED);
$color->setARGB(Color::COLOR_BLUE);
$color->setARGB(Color::COLOR_GREEN);
$color->setARGB(Color::COLOR_BLACK);
$color->setARGB(Color::COLOR_WHITE);
$color->setARGB(Color::COLOR_YELLOW);
$color->setARGB(Color::COLOR_DARKRED);
$color->setARGB(Color::COLOR_DARKBLUE);
$color->setARGB(Color::COLOR_DARKGREEN);
$color->setARGB(Color::COLOR_DARKYELLOW);
// Array format
['color' => ['rgb' => 'FF0000']]
['color' => ['argb' => 'FFFF0000']]
Fill Patterns
Solid Fill
use PhpOffice\PhpSpreadsheet\Style\Fill;
$fill = $spreadsheet->getActiveSheet()->getStyle('A1')->getFill();
$fill->setFillType(Fill::FILL_SOLID);
$fill->getStartColor()->setARGB('FFCCFFCC');
Gradient Fill
use PhpOffice\PhpSpreadsheet\Style\Fill;
$fill->setFillType(Fill::FILL_GRADIENT_LINEAR);
$fill->setRotation(90);
$fill->getStartColor()->setRGB('000000');
$fill->getEndColor()->setARGB('FFFFFFFF');
Pattern Fills
use PhpOffice\PhpSpreadsheet\Style\Fill;
// Available pattern types
Fill::FILL_NONE
Fill::FILL_SOLID
Fill::FILL_GRADIENT_LINEAR
Fill::FILL_GRADIENT_PATH
Fill::FILL_PATTERN_DARKDOWN
Fill::FILL_PATTERN_DARKGRAY
Fill::FILL_PATTERN_DARKGRID
Fill::FILL_PATTERN_DARKHORIZONTAL
Fill::FILL_PATTERN_DARKTRELLIS
Fill::FILL_PATTERN_DARKUP
Fill::FILL_PATTERN_DARKVERTICAL
Fill::FILL_PATTERN_GRAY0625
Fill::FILL_PATTERN_GRAY125
Fill::FILL_PATTERN_LIGHTDOWN
Fill::FILL_PATTERN_LIGHTGRAY
Fill::FILL_PATTERN_LIGHTGRID
Fill::FILL_PATTERN_LIGHTHORIZONTAL
Fill::FILL_PATTERN_LIGHTTRELLIS
Fill::FILL_PATTERN_LIGHTUP
Fill::FILL_PATTERN_LIGHTVERTICAL
Fill::FILL_PATTERN_MEDIUMGRAY
Using Array Format
$spreadsheet->getActiveSheet()->getStyle('A1')->applyFromArray([
'fill' => [
'fillType' => Fill::FILL_SOLID,
'color' => ['argb' => 'FFCCFFCC']
]
]);
// Gradient fill
$spreadsheet->getActiveSheet()->getStyle('A1')->applyFromArray([
'fill' => [
'fillType' => Fill::FILL_GRADIENT_LINEAR,
'rotation' => 0.0,
'startColor' => ['rgb' => '000000'],
'endColor' => ['argb' => 'FFFFFFFF']
]
]);
Borders
Basic Borders
use PhpOffice\PhpSpreadsheet\Style\Border;
$borders = $spreadsheet->getActiveSheet()->getStyle('A1')->getBorders();
// Individual borders
$borders->getTop()->setBorderStyle(Border::BORDER_THIN);
$borders->getBottom()->setBorderStyle(Border::BORDER_THIN);
$borders->getLeft()->setBorderStyle(Border::BORDER_THIN);
$borders->getRight()->setBorderStyle(Border::BORDER_THIN);
// Border colors
$borders->getTop()->getColor()->setRGB('FF0000');
// Diagonal borders
$borders->getDiagonal()->setBorderStyle(Border::BORDER_THIN);
$borders->setDiagonalDirection(Border::DIAGONAL_UP);
// Options: DIAGONAL_NONE, DIAGONAL_UP, DIAGONAL_DOWN, DIAGONAL_BOTH
Border Styles
use PhpOffice\PhpSpreadsheet\Style\Border;
Border::BORDER_NONE
Border::BORDER_DASHDOT
Border::BORDER_DASHDOTDOT
Border::BORDER_DASHED
Border::BORDER_DOTTED
Border::BORDER_DOUBLE
Border::BORDER_HAIR
Border::BORDER_MEDIUM
Border::BORDER_MEDIUMDASHDOT
Border::BORDER_MEDIUMDASHDOTDOT
Border::BORDER_MEDIUMDASHED
Border::BORDER_SLANTDASHDOT
Border::BORDER_THICK
Border::BORDER_THIN
Border Shortcuts
Apply borders to ranges efficiently:// Apply outline border
$styleArray = [
'borders' => [
'outline' => [
'borderStyle' => Border::BORDER_THICK,
'color' => ['argb' => 'FFFF0000'],
],
],
];
$spreadsheet->getActiveSheet()->getStyle('B2:G8')->applyFromArray($styleArray);
// All borders
$styleArray = [
'borders' => [
'allBorders' => [
'borderStyle' => Border::BORDER_THIN,
'color' => ['argb' => 'FF000000'],
],
],
];
// Inside borders (vertical and horizontal)
$styleArray = [
'borders' => [
'inside' => [
'borderStyle' => Border::BORDER_THIN,
'color' => ['argb' => 'FF000000'],
],
],
];
// Vertical borders only
$styleArray = [
'borders' => [
'vertical' => [
'borderStyle' => Border::BORDER_THIN,
],
],
];
// Horizontal borders only
$styleArray = [
'borders' => [
'horizontal' => [
'borderStyle' => Border::BORDER_THIN,
],
],
];
Border hierarchy (weakest to strongest):
allBorders, outline/inside, vertical/horizontal, left/right/top/bottom/diagonalAdvanced Border Mode
The second parameter$advancedBorders controls how borders are applied:
// Advanced mode (default: true) - applies to range as a whole
$sheet->getStyle('B2:C3')->applyFromArray($styleArray, true);
// Simple mode (false) - applies to each cell individually
$sheet->getStyle('B5:C6')->applyFromArray($styleArray, false);
Alignment
Horizontal Alignment
use PhpOffice\PhpSpreadsheet\Style\Alignment;
$alignment = $spreadsheet->getActiveSheet()->getStyle('A1')->getAlignment();
$alignment->setHorizontal(Alignment::HORIZONTAL_CENTER);
// Options:
Alignment::HORIZONTAL_GENERAL
Alignment::HORIZONTAL_LEFT
Alignment::HORIZONTAL_RIGHT
Alignment::HORIZONTAL_CENTER
Alignment::HORIZONTAL_CENTER_CONTINUOUS
Alignment::HORIZONTAL_JUSTIFY
Alignment::HORIZONTAL_FILL
Alignment::HORIZONTAL_DISTRIBUTED
Vertical Alignment
use PhpOffice\PhpSpreadsheet\Style\Alignment;
$alignment->setVertical(Alignment::VERTICAL_CENTER);
// Options:
Alignment::VERTICAL_TOP
Alignment::VERTICAL_CENTER
Alignment::VERTICAL_BOTTOM
Alignment::VERTICAL_JUSTIFY
Alignment::VERTICAL_DISTRIBUTED
Text Control
// Wrap text
$alignment->setWrapText(true);
// Shrink to fit
$alignment->setShrinkToFit(true);
// Text rotation (0 to 180, or -1 to -90)
$alignment->setTextRotation(45);
// Use -165 (or TEXTROTATION_STACK_PHPSPREADSHEET) for stacked text
// Indent (only with left/right alignment)
$alignment->setIndent(2);
// Read order
$alignment->setReadOrder(Alignment::READORDER_LTR);
// Options: READORDER_CONTEXT, READORDER_LTR, READORDER_RTL
Using Array Format
$spreadsheet->getActiveSheet()->getStyle('A1')->applyFromArray([
'alignment' => [
'horizontal' => Alignment::HORIZONTAL_CENTER,
'vertical' => Alignment::VERTICAL_CENTER,
'textRotation' => 0,
'wrapText' => true,
'shrinkToFit' => false,
'indent' => 0,
]
]);
Applying Styles to Ranges
Styles can be applied to cell ranges efficiently:// Apply to single cell
$spreadsheet->getActiveSheet()->getStyle('A1')->applyFromArray($styleArray);
// Apply to range
$spreadsheet->getActiveSheet()->getStyle('A1:D4')->applyFromArray($styleArray);
// Apply to entire row
$spreadsheet->getActiveSheet()->getStyle('5:5')->applyFromArray($styleArray);
// Apply to entire column
$spreadsheet->getActiveSheet()->getStyle('C:C')->applyFromArray($styleArray);
// Apply to multiple ranges (using duplicateStyle)
$spreadsheet->getActiveSheet()->duplicateStyle(
$spreadsheet->getActiveSheet()->getStyle('A1'),
'B1:B10'
);
Default Workbook Style
Set default styles for the entire workbook:// Set default font
$spreadsheet->getDefaultStyle()->getFont()->setName('Arial');
$spreadsheet->getDefaultStyle()->getFont()->setSize(10);
// Set default alignment
$spreadsheet->getDefaultStyle()->getAlignment()
->setHorizontal(Alignment::HORIZONTAL_LEFT);
Protection
Control cell locking and visibility:$protection = $spreadsheet->getActiveSheet()->getStyle('A1')->getProtection();
// Lock cell (prevents editing when sheet is protected)
$protection->setLocked(Protection::PROTECTION_PROTECTED);
// Hide formula (formula bar is empty when cell is selected)
$protection->setHidden(Protection::PROTECTION_PROTECTED);
// Unlock cells
$protection->setLocked(Protection::PROTECTION_UNPROTECTED);
Cell protection only takes effect when worksheet protection is enabled:
$spreadsheet->getActiveSheet()->getProtection()->setSheet(true);
Complete Example
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Style\Alignment;
use PhpOffice\PhpSpreadsheet\Style\Border;
use PhpOffice\PhpSpreadsheet\Style\Fill;
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
// Set values
$sheet->setCellValue('A1', 'Header');
$sheet->setCellValue('A2', 1234.56);
// Apply comprehensive styling
$sheet->getStyle('A1:E1')->applyFromArray([
'font' => [
'bold' => true,
'color' => ['rgb' => 'FFFFFF'],
'size' => 14,
'name' => 'Arial'
],
'fill' => [
'fillType' => Fill::FILL_SOLID,
'startColor' => ['rgb' => '4472C4']
],
'alignment' => [
'horizontal' => Alignment::HORIZONTAL_CENTER,
'vertical' => Alignment::VERTICAL_CENTER,
],
'borders' => [
'outline' => [
'borderStyle' => Border::BORDER_THICK,
'color' => ['rgb' => '000000']
]
]
]);
Best Practices
- Use
applyFromArray()for better performance when setting multiple properties - Apply styles to ranges rather than individual cells when possible
- PhpSpreadsheet minimizes memory by reusing identical styles
- Set default styles at the workbook level for consistency

