From c4f72672c5553cf30b219df19d28755263919f7a Mon Sep 17 00:00:00 2001 From: skodak Date: Fri, 22 Dec 2006 22:30:11 +0000 Subject: [PATCH] MDL-7996 Add ods export support - more formatting improvements and other fixes --- lib/odslib.class.php | 224 +++++++++++++++++++++++++++++++++++++------ 1 file changed, 195 insertions(+), 29 deletions(-) diff --git a/lib/odslib.class.php b/lib/odslib.class.php index 2e2dc6d13d..8b2c2a97bf 100644 --- a/lib/odslib.class.php +++ b/lib/odslib.class.php @@ -251,6 +251,8 @@ class MoodleODSWorksheet { function set_row($row, $height, $format = 0, $hidden = false, $level = 0) { $this->rows[$row] = new object(); $this->rows[$row]->height = $height; + $this->rows[$row]->format = $format; + $this->rows[$row]->hidden = $hidden; } /* Sets the width (and other settings) of one column @@ -265,6 +267,9 @@ class MoodleODSWorksheet { for($i=$firstcol; $i<=$lastcol; $i++) { $this->columns[$i] = new object(); $this->columns[$i]->width = $width; + $this->columns[$i]->format = $format; + $this->columns[$i]->hidden = $hidden; + } } @@ -274,7 +279,7 @@ class MoodleODSWorksheet { * Define and operate over one Format. */ class MoodleODSFormat { - var $formatid; + var $id; var $properties; /* Constructs one Moodle Format. @@ -284,7 +289,7 @@ class MoodleODSFormat { static $fid = 1; $this->properties = $properties; - $this->formatid = $fid++; + $this->id = $fid++; } /* Set weight of the format @@ -293,23 +298,27 @@ class MoodleODSFormat { * It's Optional, default is 1 (bold). */ function set_bold($weight = 1) { + $this->properties['bold'] = $weight; } /* Set underline of the format * @param integer $underline The value for underline. Possible values are: * 1 => underline, 2 => double underline */ - function set_underline($underline) { + function set_underline($underline = 1) { + $this->properties['underline'] = $underline; } /* Set italic of the format */ function set_italic() { + $this->properties['italic'] = true; } /* Set strikeout of the format */ function set_strikeout() { + $this->properties['strikeout'] = true; } /* Set outlining of the format @@ -333,6 +342,7 @@ class MoodleODSFormat { * @param mixed $color either a string (like 'blue'), or an integer (range is [8...63]) */ function set_color($color) { + $this->properties['color'] = $this->_get_color($color); } /* Set foreground color of the format @@ -345,6 +355,7 @@ class MoodleODSFormat { * @param mixed $color either a string (like 'blue'), or an integer (range is [8...63]) */ function set_bg_color($color) { + $this->properties['bg_color'] = $this->_get_color($color); } /* Set the fill pattern of the format @@ -363,18 +374,44 @@ class MoodleODSFormat { * @param string $location alignment for the cell ('left', 'right', etc...) */ function set_align($location) { + switch ($location) { + case 'start': + case 'left': + $this->properties['align'] = 'start'; + break; + case 'center': + $this->properties['align'] = 'center'; + break; + case 'end': + case 'right': + $this->properties['align'] = 'end'; + break; + default: + //ignore the rest == start + } } /* Set the cell horizontal alignment of the format * @param string $location alignment for the cell ('left', 'right', etc...) */ function set_h_align($location) { + set_align($location); } /* Set the cell vertical alignment of the format * @param string $location alignment for the cell ('top', 'vleft', etc...) */ function set_v_align($location) { + switch ($location) { + case 'top': + $this->properties['v_align'] = 'top'; + break; + case 'bottom': + $this->properties['v_align'] = 'bottom'; + break; + default: + //ignore the rest == middle + } } /* Set the top border of the format @@ -416,6 +453,37 @@ class MoodleODSFormat { */ function set_num_format($num_format) { } + + function _get_color($name_color = '') { + if (strpos($name_color, '#') === 0) { + return $name_color; // no conversion needed + } + + $colors = array('aqua' => '#00FFFF', + 'cyan' => '#00FFFF', + 'black' => '#FFFFFF', + 'blue' => '#0000FF', + 'brown' => '#A52A2A', + 'magenta' => '#FF00FF', + 'fuchsia' => '#FF00FF', + 'gray' => '#A0A0A0', + 'grey' => '#A0A0A0', + 'green' => '#00FF00', + 'lime' => '#00FF00', + 'navy' => '#000080', + 'orange' => '#FF8000', + 'purple' => '#800080', + 'red' => '#FF0000', + 'silver' => '#DCDCDC', + 'white' => '#FFFFFF', + 'yellow' => '#FFFF00'); + + if(array_key_exists($name_color, $colors)) { + return $colors[$name_color]; + } else { + return false; + } + } } @@ -425,29 +493,39 @@ class MoodleODSFormat { function get_ods_content(&$worksheets) { - // find out the size of worksheets and used formats + // find out the size of worksheets and used styles $formats = array(); $formatstyles = ''; $rowstyles = ''; $colstyles = ''; foreach($worksheets as $wsnum=>$ws) { - $ws->maxr = 0; - $ws->maxc = 0; + $worksheets[$wsnum]->maxr = 0; + $worksheets[$wsnum]->maxc = 0; foreach($ws->data as $rnum=>$row) { - if ($rnum > $ws->maxr) { - $ws->maxr = $rnum; + if ($rnum > $worksheets[$wsnum]->maxr) { + $worksheets[$wsnum]->maxr = $rnum; } - foreach($row as $cnum=>$col) { - if ($cnum > $ws->maxc) { - $ws->maxc = $cnum; + foreach($row as $cnum=>$cell) { + if ($cnum > $worksheets[$wsnum]->maxc) { + $worksheets[$wsnum]->maxc = $cnum; + } + if (!empty($cell->format)) { + if (!array_key_exists($cell->format->id, $formats)) { + $formats[$cell->format->id] = $cell->format; + } } } } foreach($ws->rows as $rnum=>$row) { - if ($rnum > $ws->maxr) { - $ws->maxr = $rnum; + if (!empty($row->format)) { + if (!array_key_exists($row->format->id, $formats)) { + $formats[$row->format->id] = $row->format; + } + } + if ($rnum > $worksheets[$wsnum]->maxr) { + $worksheets[$wsnum]->maxr = $rnum; } //define all column styles if (!empty($ws->rows[$rnum])) { @@ -459,8 +537,13 @@ function get_ods_content(&$worksheets) { } foreach($ws->columns as $cnum=>$col) { - if ($cnum > $ws->maxc) { - $ws->maxc = $cnum; + if (!empty($col->format)) { + if (!array_key_exists($col->format->id, $formats)) { + $formats[$col->format->id] = $col->format; + } + } + if ($cnum > $worksheets[$wsnum]->maxc) { + $worksheets[$wsnum]->maxc = $cnum; } //define all column styles if (!empty($ws->columns[$cnum])) { @@ -472,6 +555,70 @@ function get_ods_content(&$worksheets) { } } + foreach($formats as $format) { + $textprop = ''; + $cellprop = ''; + $parprop = ''; + foreach($format->properties as $pname=>$pvalue) { + switch ($pname) { + case 'bold': + if (!empty($pvalue)) { + $textprop .= ' fo:font-weight="bold"'; + } + break; + case 'italic': + if (!empty($pvalue)) { + $textprop .= ' fo:font-style="italic"'; + } + break; + case 'underline': + if (!empty($pvalue)) { + $textprop .= ' style:text-underline-color="font-color" style:text-underline-style="solid" style:text-underline-width="auto"'; + } + break; + case 'strikeout': + if (!empty($pvalue)) { + $textprop .= ' style:text-line-through-style="solid"'; + } + break; + case 'color': + if ($pvalue !== false) { + $textprop .= ' fo:color="'.$pvalue.'"'; + } + break; + case 'bg_color': + if ($pvalue !== false) { + $cellprop .= ' fo:background-color="'.$pvalue.'"'; + } + break; + case 'align': + $parprop .= ' fo:text-align="'.$pvalue.'"'; + break; + case 'v_align': + $cellprop .= ' style:vertical-align="'.$pvalue.'"'; + break; + } + } + if (!empty($textprop)) { + $textprop = ' + '; + } + + if (!empty($cellprop)) { + $cellprop = ' + '; + } + + if (!empty($parprop)) { + $parprop = ' + '; + } + + $formatstyles .= ' + '.$textprop.$cellprop.$parprop.' + '; + } + /// header $buffer = ' @@ -499,8 +646,15 @@ $buffer .= $colstyles; // define column properties for($c=0; $c<=$ws->maxc; $c++) { - if (!empty($ws->columns[$c])) { - $buffer .= ''."\n"; + if (array_key_exists($c, $ws->columns)) { + $extra = ''; + if (!empty($ws->columns[$c]->format)) { + $extra .= ' table:default-cell-style-name="format'.$ws->columns[$c]->format->id.'"'; + } + if ($ws->columns[$c]->hidden) { + $extra .= ' table:visibility="collapse"'; + } + $buffer .= ''."\n"; } else { $buffer .= ''."\n"; } @@ -508,27 +662,39 @@ $buffer .= $colstyles; // print all rows for($r=0; $r<=$ws->maxr; $r++) { - if (!empty($ws->rows[$r])) { - $buffer .= ''."\n"; + if (array_key_exists($r, $ws->rows)) { + $extra = ''; + if (!empty($ws->rows[$r]->format)) { + $extra .= ' table:default-cell-style-name="format'.$ws->rows[$r]->format->id.'"'; + } + if ($ws->rows[$r]->hidden) { + $extra .= ' table:visibility="collapse"'; + } + $buffer .= ''."\n"; } else { $buffer .= ''."\n"; } for($c=0; $c<=$ws->maxc; $c++) { if (isset($ws->data[$r][$c])) { - if ($ws->data[$r][$c]->type == 'date') { - $buffer .= '' - . '' . strftime('%Y-%m-%dT%H:%M:%S', $ws->data[$r][$c]->value) . '' + $cell = $ws->data[$r][$c]; + $extra = ' '; + if (!empty($cell->format)) { + $extra = ' table:style-name="format'.$cell->format->id.'"'; + } + if ($cell->type == 'date') { + $buffer .= '' + . '' . strftime('%Y-%m-%dT%H:%M:%S', $cell->value) . '' . ''."\n"; - } else if ($ws->data[$r][$c]->type == 'float') { - $buffer .= '' - . '' . htmlspecialchars($ws->data[$r][$c]->value) . '' + } else if ($cell->type == 'float') { + $buffer .= '' + . '' . htmlspecialchars($cell->value) . '' . ''."\n"; - } else if ($ws->data[$r][$c]->type == 'string') { - $buffer .= '' - . '' . htmlspecialchars($ws->data[$r][$c]->value) . '' + } else if ($cell->type == 'string') { + $buffer .= '' + . '' . htmlspecialchars($cell->value) . '' . ''."\n"; } else { - $buffer .= '' + $buffer .= '' . '!!Error - unknown type!!' . ''."\n"; } -- 2.39.5