Skip to content

Commit 45a0c7e

Browse files
committed
Merge pull request #37 from mk-j/dev
Merge Cells from dev branch
2 parents 7c7a516 + 512a23c commit 45a0c7e

File tree

2 files changed

+59
-14
lines changed

2 files changed

+59
-14
lines changed

example-cli-merge-cells.php

+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
<?php
2+
include_once("xlsxwriter.class.php");
3+
4+
$header = array("string","string","string","string","string");
5+
$row1 = array("Merge Cells Example");
6+
$row2 = array(100, 200, 300, 400, 500);
7+
$row3 = array(110, 210, 310, 410, 510);
8+
9+
$sheet_name = 'Sheet1';
10+
$writer = new XLSXWriter();
11+
$writer->writeSheetHeader($sheet_name, $header, $suppress_header_row = true);
12+
$writer->writeSheetRow($sheet_name, $row1);
13+
$writer->writeSheetRow($sheet_name, $row2);
14+
$writer->writeSheetRow($sheet_name, $row3);
15+
$writer->markMergedCell($sheet_name, $start_row=0, $start_col=0, $end_row=0, $end_col=4);
16+
$writer->writeToFile('example.xlsx');
17+
18+

xlsxwriter.class.php

+41-14
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,7 @@ protected function initializeSheet($sheet_name)
121121
'row_count' => 0,
122122
'file_writer' => new XLSXWriter_BuffererWriter($sheet_filename),
123123
'columns' => array(),
124+
'merge_cells' => array(),
124125
'max_cell_tag_start' => 0,
125126
'max_cell_tag_end' => 0,
126127
'finalized' => false,
@@ -162,7 +163,7 @@ private function determineCellType($cell_format)
162163
if (preg_match("/0/", $cell_format)) return 'numeric';
163164
return 'string';
164165
}
165-
166+
166167
private function escapeCellFormat($cell_format)
167168
{
168169
$ignore_until='';
@@ -210,7 +211,7 @@ private function addCellFormat($cell_format)
210211
return $position;
211212
}
212213

213-
public function writeSheetHeader($sheet_name, array $header_types)
214+
public function writeSheetHeader($sheet_name, array $header_types, $suppress_row = false)
214215
{
215216
if (empty($sheet_name) || empty($header_types) || !empty($this->sheets[$sheet_name]))
216217
return;
@@ -222,14 +223,17 @@ public function writeSheetHeader($sheet_name, array $header_types)
222223
{
223224
$sheet->columns[] = $this->addCellFormat($v);
224225
}
225-
$header_row = array_keys($header_types);
226+
if (!$suppress_row)
227+
{
228+
$header_row = array_keys($header_types);
226229

227-
$sheet->file_writer->write('<row collapsed="false" customFormat="false" customHeight="false" hidden="false" ht="12.1" outlineLevel="0" r="' . (1) . '">');
228-
foreach ($header_row as $k => $v) {
229-
$this->writeCell($sheet->file_writer, 0, $k, $v, $cell_format_index = '0');//'0'=>'string'
230+
$sheet->file_writer->write('<row collapsed="false" customFormat="false" customHeight="false" hidden="false" ht="12.1" outlineLevel="0" r="' . (1) . '">');
231+
foreach ($header_row as $k => $v) {
232+
$this->writeCell($sheet->file_writer, 0, $k, $v, $cell_format_index = '0');//'0'=>'string'
233+
}
234+
$sheet->file_writer->write('</row>');
235+
$sheet->row_count++;
230236
}
231-
$sheet->file_writer->write('</row>');
232-
$sheet->row_count++;
233237
$this->current_sheet = $sheet_name;
234238
}
235239

@@ -246,9 +250,10 @@ public function writeSheetRow($sheet_name, array $row)
246250
}
247251

248252
$sheet->file_writer->write('<row collapsed="false" customFormat="false" customHeight="false" hidden="false" ht="12.1" outlineLevel="0" r="' . ($sheet->row_count + 1) . '">');
249-
//$row = array_slice($row, 0, count($sheet->columns) );
253+
$column_count=0;
250254
foreach ($row as $k => $v) {
251-
$this->writeCell($sheet->file_writer, $sheet->row_count, $k, $v, $sheet->columns[$k]);
255+
$this->writeCell($sheet->file_writer, $sheet->row_count, $column_count, $v, $sheet->columns[$column_count]);
256+
$column_count++;
252257
}
253258
$sheet->file_writer->write('</row>');
254259
$sheet->row_count++;
@@ -263,6 +268,15 @@ protected function finalizeSheet($sheet_name)
263268
$sheet = &$this->sheets[$sheet_name];
264269

265270
$sheet->file_writer->write( '</sheetData>');
271+
272+
if (!empty($sheet->merge_cells)) {
273+
$sheet->file_writer->write( '<mergeCells>');
274+
foreach ($sheet->merge_cells as $range) {
275+
$sheet->file_writer->write( '<mergeCell ref="' . $range . '"/>');
276+
}
277+
$sheet->file_writer->write( '</mergeCells>');
278+
}
279+
266280
$sheet->file_writer->write( '<printOptions headings="false" gridLines="false" gridLinesSet="true" horizontalCentered="false" verticalCentered="false"/>');
267281
$sheet->file_writer->write( '<pageMargins left="0.5" right="0.5" top="1.0" bottom="1.0" header="0.5" footer="0.5"/>');
268282
$sheet->file_writer->write( '<pageSetup blackAndWhite="false" cellComments="none" copies="1" draft="false" firstPageNumber="1" fitToHeight="1" fitToWidth="1" horizontalDpi="300" orientation="portrait" pageOrder="downThenOver" paperSize="1" scale="100" useFirstPageNumber="true" usePrinterDefaults="false" verticalDpi="300"/>');
@@ -280,8 +294,21 @@ protected function finalizeSheet($sheet_name)
280294
$sheet->file_writer->close();
281295
$sheet->finalized=true;
282296
}
297+
298+
public function markMergedCell($sheet_name, $start_cell_row, $start_cell_column, $end_cell_row, $end_cell_column)
299+
{
300+
if (empty($sheet_name) || $this->sheets[$sheet_name]->finalized)
301+
return;
283302

284-
public function writeSheet(array $data, $sheet_name='', array $header_types=array() )
303+
self::initializeSheet($sheet_name);
304+
$sheet = &$this->sheets[$sheet_name];
305+
306+
$startCell = self::xlsCell($start_cell_row, $start_cell_column);
307+
$endCell = self::xlsCell($end_cell_row, $end_cell_column);
308+
$sheet->merge_cells[] = $startCell . ":" . $endCell;
309+
}
310+
311+
public function writeSheet(array $data, $sheet_name='', array $header_types=array())
285312
{
286313
$sheet_name = empty($sheet_name) ? 'Sheet1' : $sheet_name;
287314
$data = empty($data) ? array(array('')) : $data;
@@ -300,7 +327,7 @@ protected function writeCell(XLSXWriter_BuffererWriter &$file, $row_number, $col
300327
{
301328
$cell_type = $this->cell_types[$cell_format_index];
302329
$cell_name = self::xlsCell($row_number, $column_number);
303-
330+
304331
if (!is_scalar($value) || $value==='') { //objects, array, empty
305332
$file->write('<c r="'.$cell_name.'" s="'.$cell_format_index.'"/>');
306333
} elseif (is_string($value) && $value{0}=='='){
@@ -311,9 +338,9 @@ protected function writeCell(XLSXWriter_BuffererWriter &$file, $row_number, $col
311338
$file->write('<c r="'.$cell_name.'" s="'.$cell_format_index.'" t="n"><v>'.self::convert_date_time($value).'</v></c>');
312339
} elseif ($cell_type=='currency' || $cell_type=='percent' || $cell_type=='numeric') {
313340
$file->write('<c r="'.$cell_name.'" s="'.$cell_format_index.'" t="n"><v>'.self::xmlspecialchars($value).'</v></c>');//int,float,currency
314-
} else if (!is_string($value)){
341+
} else if (!is_string($value)){
315342
$file->write('<c r="'.$cell_name.'" s="'.$cell_format_index.'" t="n"><v>'.($value*1).'</v></c>');
316-
} else if ($value{0}!='0' && $value{0}!='+' && filter_var($value, FILTER_VALIDATE_INT, array('options'=>array('max_range'=>2147483647)))){
343+
} else if ($value{0}!='0' && $value{0}!='+' && filter_var($value, FILTER_VALIDATE_INT, array('options'=>array('max_range'=>2147483647)))){
317344
$file->write('<c r="'.$cell_name.'" s="'.$cell_format_index.'" t="n"><v>'.($value*1).'</v></c>');
318345
} else { //implied: ($cell_format=='string')
319346
$file->write('<c r="'.$cell_name.'" s="'.$cell_format_index.'" t="s"><v>'.self::xmlspecialchars($this->setSharedString($value)).'</v></c>');

0 commit comments

Comments
 (0)