diff --git a/example-cli-merge-cells.php b/example-cli-merge-cells.php new file mode 100644 index 000000000..e6652a873 --- /dev/null +++ b/example-cli-merge-cells.php @@ -0,0 +1,18 @@ +writeSheetHeader($sheet_name, $header, $suppress_header_row = true); +$writer->writeSheetRow($sheet_name, $row1); +$writer->writeSheetRow($sheet_name, $row2); +$writer->writeSheetRow($sheet_name, $row3); +$writer->markMergedCell($sheet_name, $start_row=0, $start_col=0, $end_row=0, $end_col=4); +$writer->writeToFile('example.xlsx'); + + diff --git a/xlsxwriter.class.php b/xlsxwriter.class.php index 33cd30b8a..d6a2d6da9 100644 --- a/xlsxwriter.class.php +++ b/xlsxwriter.class.php @@ -121,6 +121,7 @@ protected function initializeSheet($sheet_name) 'row_count' => 0, 'file_writer' => new XLSXWriter_BuffererWriter($sheet_filename), 'columns' => array(), + 'merge_cells' => array(), 'max_cell_tag_start' => 0, 'max_cell_tag_end' => 0, 'finalized' => false, @@ -162,7 +163,7 @@ private function determineCellType($cell_format) if (preg_match("/0/", $cell_format)) return 'numeric'; return 'string'; } - + private function escapeCellFormat($cell_format) { $ignore_until=''; @@ -210,7 +211,7 @@ private function addCellFormat($cell_format) return $position; } - public function writeSheetHeader($sheet_name, array $header_types) + public function writeSheetHeader($sheet_name, array $header_types, $suppress_row = false) { if (empty($sheet_name) || empty($header_types) || !empty($this->sheets[$sheet_name])) return; @@ -222,14 +223,17 @@ public function writeSheetHeader($sheet_name, array $header_types) { $sheet->columns[] = $this->addCellFormat($v); } - $header_row = array_keys($header_types); + if (!$suppress_row) + { + $header_row = array_keys($header_types); - $sheet->file_writer->write(''); - $sheet->row_count++; $this->current_sheet = $sheet_name; } @@ -246,9 +250,10 @@ public function writeSheetRow($sheet_name, array $row) } $sheet->file_writer->write(''); $sheet->row_count++; @@ -263,6 +268,15 @@ protected function finalizeSheet($sheet_name) $sheet = &$this->sheets[$sheet_name]; $sheet->file_writer->write( ''); + + if (!empty($sheet->merge_cells)) { + $sheet->file_writer->write( ''); + foreach ($sheet->merge_cells as $range) { + $sheet->file_writer->write( ''); + } + $sheet->file_writer->write( ''); + } + $sheet->file_writer->write( ''); $sheet->file_writer->write( ''); $sheet->file_writer->write( ''); @@ -280,8 +294,21 @@ protected function finalizeSheet($sheet_name) $sheet->file_writer->close(); $sheet->finalized=true; } + + public function markMergedCell($sheet_name, $start_cell_row, $start_cell_column, $end_cell_row, $end_cell_column) + { + if (empty($sheet_name) || $this->sheets[$sheet_name]->finalized) + return; - public function writeSheet(array $data, $sheet_name='', array $header_types=array() ) + self::initializeSheet($sheet_name); + $sheet = &$this->sheets[$sheet_name]; + + $startCell = self::xlsCell($start_cell_row, $start_cell_column); + $endCell = self::xlsCell($end_cell_row, $end_cell_column); + $sheet->merge_cells[] = $startCell . ":" . $endCell; + } + + public function writeSheet(array $data, $sheet_name='', array $header_types=array()) { $sheet_name = empty($sheet_name) ? 'Sheet1' : $sheet_name; $data = empty($data) ? array(array('')) : $data; @@ -300,7 +327,7 @@ protected function writeCell(XLSXWriter_BuffererWriter &$file, $row_number, $col { $cell_type = $this->cell_types[$cell_format_index]; $cell_name = self::xlsCell($row_number, $column_number); - + if (!is_scalar($value) || $value==='') { //objects, array, empty $file->write(''); } elseif (is_string($value) && $value{0}=='='){ @@ -311,9 +338,9 @@ protected function writeCell(XLSXWriter_BuffererWriter &$file, $row_number, $col $file->write(''.self::convert_date_time($value).''); } elseif ($cell_type=='currency' || $cell_type=='percent' || $cell_type=='numeric') { $file->write(''.self::xmlspecialchars($value).'');//int,float,currency - } else if (!is_string($value)){ + } else if (!is_string($value)){ $file->write(''.($value*1).''); - } else if ($value{0}!='0' && $value{0}!='+' && filter_var($value, FILTER_VALIDATE_INT, array('options'=>array('max_range'=>2147483647)))){ + } else if ($value{0}!='0' && $value{0}!='+' && filter_var($value, FILTER_VALIDATE_INT, array('options'=>array('max_range'=>2147483647)))){ $file->write(''.($value*1).''); } else { //implied: ($cell_format=='string') $file->write(''.self::xmlspecialchars($this->setSharedString($value)).'');