FIXED : Work item 8916 - Support for Rich-Text in PHPExcel_Writer_Excel5

git-svn-id: https://phpexcel.svn.codeplex.com/svn/trunk@87070 2327b42d-5241-43d6-9e2a-de5ac946f064
This commit is contained in:
Progi1984 2012-02-27 22:05:21 +00:00
parent e0751201b8
commit 41199626d8
5 changed files with 114 additions and 36 deletions

View File

@ -430,19 +430,29 @@ class PHPExcel_Shared_String
* @param string $value UTF-8 encoded string * @param string $value UTF-8 encoded string
* @return string * @return string
*/ */
public static function UTF8toBIFF8UnicodeShort($value) public static function UTF8toBIFF8UnicodeShort($value, $arrcRuns = array())
{ {
// character count // character count
$ln = self::CountCharacters($value, 'UTF-8'); $ln = self::CountCharacters($value, 'UTF-8');
// option flags // option flags
$opt = (self::getIsIconvEnabled() || self::getIsMbstringEnabled()) ? if(empty($arrcRuns)){
0x0001 : 0x0000; $opt = (self::getIsIconvEnabled() || self::getIsMbstringEnabled()) ?
0x0001 : 0x0000;
// characters $data = pack('CC', $ln, $opt);
$chars = self::ConvertEncoding($value, 'UTF-16LE', 'UTF-8'); // characters
$data .= self::ConvertEncoding($value, 'UTF-16LE', 'UTF-8');
$data = pack('CC', $ln, $opt) . $chars; }
else {
$data = pack('vC', $ln, 0x08);
$data .= pack('v', count($arrcRuns));
// characters
$data .= $value;
foreach ($arrcRuns as $cRun){
$data .= pack('v', $cRun['strlen']);
$data .= pack('v', $cRun['fontidx']);
}
}
return $data; return $data;
} }

View File

@ -156,6 +156,23 @@ class PHPExcel_Writer_Excel5 implements PHPExcel_Writer_IWriter
$this->_writerWorkbook->addXfWriter($style, false); $this->_writerWorkbook->addXfWriter($style, false);
} }
// add fonts from rich text eleemnts
for ($i = 0; $i < $countSheets; ++$i) {
foreach ($this->_writerWorksheets[$i]->_phpSheet->getCellCollection() as $cellID) {
$cell = $this->_writerWorksheets[$i]->_phpSheet->getCell($cellID);
$cVal = $cell->getValue();
if ($cVal instanceof PHPExcel_RichText) {
$elements = $cVal->getRichTextElements();
foreach ($elements as $element) {
if ($element instanceof PHPExcel_RichText_Run) {
$font = $element->getFont();
$this->_writerWorksheets[$i]->_fntHashIndex[$font->getHashCode()] = $this->_writerWorkbook->_addFont($font);
}
}
}
}
}
// initialize OLE file // initialize OLE file
$workbookStreamName = 'Workbook'; $workbookStreamName = 'Workbook';
$OLE = new PHPExcel_Shared_OLE_PPS_File(PHPExcel_Shared_OLE::Asc2Ucs($workbookStreamName)); $OLE = new PHPExcel_Shared_OLE_PPS_File(PHPExcel_Shared_OLE::Asc2Ucs($workbookStreamName));

View File

@ -255,20 +255,7 @@ class PHPExcel_Writer_Excel5_Workbook extends PHPExcel_Writer_Excel5_BIFFwriter
$xfWriter->setIsStyleXf($isStyleXf); $xfWriter->setIsStyleXf($isStyleXf);
// Add the font if not already added // Add the font if not already added
$fontHashCode = $style->getFont()->getHashCode(); $fontIndex = $this->_addFont($style->getFont());
if (isset($this->_addedFonts[$fontHashCode])) {
$fontIndex = $this->_addedFonts[$fontHashCode];
} else {
$countFonts = count($this->_fontWriters);
$fontIndex = ($countFonts < 4) ? $countFonts : $countFonts + 1;
$fontWriter = new PHPExcel_Writer_Excel5_Font($style->getFont());
$fontWriter->setColorIndex($this->_addColor($style->getFont()->getColor()->getRGB()));
$this->_fontWriters[] = $fontWriter;
$this->_addedFonts[$fontHashCode] = $fontIndex;
}
// Assign the font index to the xf record // Assign the font index to the xf record
$xfWriter->setFontIndex($fontIndex); $xfWriter->setFontIndex($fontIndex);
@ -306,6 +293,29 @@ class PHPExcel_Writer_Excel5_Workbook extends PHPExcel_Writer_Excel5_BIFFwriter
return $xfIndex; return $xfIndex;
} }
/**
* Add a font to added fonts
*
* @param PHPExcel_Style_Font $font
* @return int Index to FONT record
*/
public function _addFont(PHPExcel_Style_Font $font)
{
$fontHashCode = $font->getHashCode();
if(isset($this->_addedFonts[$fontHashCode])){
$fontIndex = $this->_addedFonts[$fontHashCode];
} else {
$countFonts = count($this->_fontWriters);
$fontIndex = ($countFonts < 4) ? $countFonts : $countFonts + 1;
$fontWriter = new PHPExcel_Writer_Excel5_Font($font);
$fontWriter->setColorIndex($this->_addColor($font->getColor()->getRGB()));
$this->_fontWriters[] = $fontWriter;
$this->_addedFonts[$fontHashCode] = $fontIndex;
}
return $fontIndex;
}
/** /**
* Alter color palette adding a custom color * Alter color palette adding a custom color
* *
@ -633,7 +643,6 @@ class PHPExcel_Writer_Excel5_Workbook extends PHPExcel_Writer_Excel5_BIFFwriter
} }
} }
/** /**
* Writes all the DEFINEDNAME records (BIFF8). * Writes all the DEFINEDNAME records (BIFF8).
* So far this is only used for repeating rows/columns (print titles) and print areas * So far this is only used for repeating rows/columns (print titles) and print areas
@ -937,7 +946,6 @@ class PHPExcel_Writer_Excel5_Workbook extends PHPExcel_Writer_Excel5_BIFFwriter
$this->_append($header . $data); $this->_append($header . $data);
} }
/** /**
* Writes Excel FORMAT record for non "built-in" numerical formats. * Writes Excel FORMAT record for non "built-in" numerical formats.
* *
@ -973,7 +981,6 @@ class PHPExcel_Writer_Excel5_Workbook extends PHPExcel_Writer_Excel5_BIFFwriter
$this->_append($header . $data); $this->_append($header . $data);
} }
/** /**
* Write BIFF record EXTERNCOUNT to indicate the number of external sheet * Write BIFF record EXTERNCOUNT to indicate the number of external sheet
* references in the workbook. * references in the workbook.
@ -996,7 +1003,6 @@ class PHPExcel_Writer_Excel5_Workbook extends PHPExcel_Writer_Excel5_BIFFwriter
$this->_append($header . $data); $this->_append($header . $data);
} }
/** /**
* Writes the Excel BIFF EXTERNSHEET record. These references are used by * Writes the Excel BIFF EXTERNSHEET record. These references are used by
* formulas. NAME record is required to define the print area and the repeat * formulas. NAME record is required to define the print area and the repeat
@ -1019,7 +1025,6 @@ class PHPExcel_Writer_Excel5_Workbook extends PHPExcel_Writer_Excel5_BIFFwriter
$this->_append($header . $data . $sheetname); $this->_append($header . $data . $sheetname);
} }
/** /**
* Store the NAME record in the short format that is used for storing the print * Store the NAME record in the short format that is used for storing the print
* area, repeat rows only and repeat columns only. * area, repeat rows only and repeat columns only.
@ -1082,7 +1087,6 @@ class PHPExcel_Writer_Excel5_Workbook extends PHPExcel_Writer_Excel5_BIFFwriter
$this->_append($header . $data); $this->_append($header . $data);
} }
/** /**
* Store the NAME record in the long format that is used for storing the repeat * Store the NAME record in the long format that is used for storing the repeat
* rows and columns when both are specified. This shares a lot of code with * rows and columns when both are specified. This shares a lot of code with

View File

@ -176,7 +176,7 @@ class PHPExcel_Writer_Excel5_Worksheet extends PHPExcel_Writer_Excel5_BIFFwriter
* Sheet object * Sheet object
* @var PHPExcel_Worksheet * @var PHPExcel_Worksheet
*/ */
private $_phpSheet; public $_phpSheet;
/** /**
* Count cell style Xfs * Count cell style Xfs
@ -192,6 +192,13 @@ class PHPExcel_Writer_Excel5_Worksheet extends PHPExcel_Writer_Excel5_BIFFwriter
*/ */
private $_escher; private $_escher;
/**
* Array of font hashes associated to FONT records index
*
* @var array
*/
public $_fntHashIndex;
/** /**
* Constructor * Constructor
* *
@ -234,6 +241,8 @@ class PHPExcel_Writer_Excel5_Worksheet extends PHPExcel_Writer_Excel5_BIFFwriter
$this->_outline_below = 1; $this->_outline_below = 1;
$this->_outline_right = 1; $this->_outline_right = 1;
$this->_outline_on = 1; $this->_outline_on = 1;
$this->_fntHashIndex = array();
// calculate values for DIMENSIONS record // calculate values for DIMENSIONS record
$minR = 1; $minR = 1;
@ -406,7 +415,24 @@ class PHPExcel_Writer_Excel5_Worksheet extends PHPExcel_Writer_Excel5_BIFFwriter
$cVal = $cell->getValue(); $cVal = $cell->getValue();
if ($cVal instanceof PHPExcel_RichText) { if ($cVal instanceof PHPExcel_RichText) {
$this->_writeString($row, $column, $cVal->getPlainText(), $xfIndex); // $this->_writeString($row, $column, $cVal->getPlainText(), $xfIndex);
$arrcRun = array();
$str_len = strlen($cVal->getPlainText());
$str_pos = 0;
$elements = $cVal->getRichTextElements();
foreach ($elements as $element) {
// FONT Index
if ($element instanceof PHPExcel_RichText_Run) {
$str_fontidx = $this->_fntHashIndex[$element->getFont()->getHashCode()];
}
else {
$str_fontidx = 0;
}
$arrcRun[] = array('strlen' => $str_pos, 'fontidx' => $str_fontidx);
// Position FROM
$str_pos += strlen($element->getText());
}
$this->_writeRichTextString($row, $column, $cVal->getPlainText(), $xfIndex, $arrcRun);
} else { } else {
switch ($cell->getDatatype()) { switch ($cell->getDatatype()) {
case PHPExcel_Cell_DataType::TYPE_STRING: case PHPExcel_Cell_DataType::TYPE_STRING:
@ -609,7 +635,32 @@ class PHPExcel_Writer_Excel5_Worksheet extends PHPExcel_Writer_Excel5_BIFFwriter
{ {
$this->_writeLabelSst($row, $col, $str, $xfIndex); $this->_writeLabelSst($row, $col, $str, $xfIndex);
} }
/**
* Write a LABELSST record or a LABEL record. Which one depends on BIFF version
* It differs from _writeString by the writing of rich text strings.
* @param int $row Row index (0-based)
* @param int $col Column index (0-based)
* @param string $str The string
* @param mixed $format The XF format for the cell
* @param array $arrcRun Index to Font record and characters beginning
*/
private function _writeRichTextString($row, $col, $str, $xfIndex, $arrcRun){
$record = 0x00FD; // Record identifier
$length = 0x000A; // Bytes to follow
$str = PHPExcel_Shared_String::UTF8toBIFF8UnicodeShort($str, $arrcRun);
/* check if string is already present */
if (!isset($this->_str_table[$str])) {
$this->_str_table[$str] = $this->_str_unique++;
}
$this->_str_total++;
$header = pack('vv', $record, $length);
$data = pack('vvvV', $row, $col, $xfIndex, $this->_str_table[$str]);
$this->_append($header.$data);
}
/** /**
* Write a string to the specified row and column (zero indexed). * Write a string to the specified row and column (zero indexed).
* NOTE: there is an Excel 5 defined limit of 255 characters. * NOTE: there is an Excel 5 defined limit of 255 characters.
@ -906,10 +957,8 @@ class PHPExcel_Writer_Excel5_Worksheet extends PHPExcel_Writer_Excel5_BIFFwriter
* @param string $url URL string * @param string $url URL string
* @return integer * @return integer
*/ */
function _writeUrlRange($row1, $col1, $row2, $col2, $url) function _writeUrlRange($row1, $col1, $row2, $col2, $url)
{ {
// Check for internal/external sheet links or default to web link // Check for internal/external sheet links or default to web link
if (preg_match('[^internal:]', $url)) { if (preg_match('[^internal:]', $url)) {
return($this->_writeUrlInternal($row1, $col1, $row2, $col2, $url)); return($this->_writeUrlInternal($row1, $col1, $row2, $col2, $url));
@ -920,7 +969,6 @@ class PHPExcel_Writer_Excel5_Worksheet extends PHPExcel_Writer_Excel5_BIFFwriter
return($this->_writeUrlWeb($row1, $col1, $row2, $col2, $url)); return($this->_writeUrlWeb($row1, $col1, $row2, $col2, $url));
} }
/** /**
* Used to write http, ftp and mailto hyperlinks. * Used to write http, ftp and mailto hyperlinks.
* The link type ($options) is 0x03 is the same as absolute dir ref without * The link type ($options) is 0x03 is the same as absolute dir ref without
@ -2034,7 +2082,6 @@ class PHPExcel_Writer_Excel5_Worksheet extends PHPExcel_Writer_Excel5_BIFFwriter
$this->_append($header.$data); $this->_append($header.$data);
} }
/** /**
* Write the WSBOOL BIFF record, mainly for fit-to-page. Used in conjunction * Write the WSBOOL BIFF record, mainly for fit-to-page. Used in conjunction
* with the SETUP record. * with the SETUP record.
@ -2246,7 +2293,6 @@ class PHPExcel_Writer_Excel5_Worksheet extends PHPExcel_Writer_Excel5_BIFFwriter
$this->_append($header . $data); $this->_append($header . $data);
} }
/** /**
* Insert a 24bit bitmap image in a worksheet. * Insert a 24bit bitmap image in a worksheet.
* *

View File

@ -38,6 +38,7 @@ configuration settings, allowing more flexibility.
Fixed in SVN: Fixed in SVN:
- Bugfix: (Progi1984) Work item 8916 - Support for Rich-Text in PHPExcel_Writer_Excel5
- Feature: (MBaker) Options for cell caching using Igbinary and SQLite/SQlite3. - Feature: (MBaker) Options for cell caching using Igbinary and SQLite/SQlite3.
- Feature: (MBaker) Additional row iterator options: allow a start row to be defined in the constructor; seek(), and prev() methods added. - Feature: (MBaker) Additional row iterator options: allow a start row to be defined in the constructor; seek(), and prev() methods added.
- Feature: (Progi1984) Work item 9759 - Implement document properties in Excel5 writer - Feature: (Progi1984) Work item 9759 - Implement document properties in Excel5 writer