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('');
- foreach ($header_row as $k => $v) {
- $this->writeCell($sheet->file_writer, 0, $k, $v, $cell_format_index = '0');//'0'=>'string'
+ $sheet->file_writer->write('');
+ foreach ($header_row as $k => $v) {
+ $this->writeCell($sheet->file_writer, 0, $k, $v, $cell_format_index = '0');//'0'=>'string'
+ }
+ $sheet->file_writer->write('
');
+ $sheet->row_count++;
}
- $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('');
- //$row = array_slice($row, 0, count($sheet->columns) );
+ $column_count=0;
foreach ($row as $k => $v) {
- $this->writeCell($sheet->file_writer, $sheet->row_count, $k, $v, $sheet->columns[$k]);
+ $this->writeCell($sheet->file_writer, $sheet->row_count, $column_count, $v, $sheet->columns[$column_count]);
+ $column_count++;
}
$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)).'');