| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313 | <?php/** * PHPExcel_Writer_Excel2007_StringTable * * Copyright (c) 2006 - 2015 PHPExcel * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA * * @category   PHPExcel * @package    PHPExcel_Writer_Excel2007 * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL * @version    ##VERSION##, ##DATE## */class PHPExcel_Writer_Excel2007_StringTable extends PHPExcel_Writer_Excel2007_WriterPart{    /**     * Create worksheet stringtable     *     * @param     PHPExcel_Worksheet     $pSheet                Worksheet     * @param     string[]                 $pExistingTable     Existing table to eventually merge with     * @return     string[]                 String table for worksheet     * @throws     PHPExcel_Writer_Exception     */    public function createStringTable($pSheet = null, $pExistingTable = null)    {        if ($pSheet !== null) {            // Create string lookup table            $aStringTable = array();            $cellCollection = null;            $aFlippedStringTable = null;    // For faster lookup            // Is an existing table given?            if (($pExistingTable !== null) && is_array($pExistingTable)) {                $aStringTable = $pExistingTable;            }            // Fill index array            $aFlippedStringTable = $this->flipStringTable($aStringTable);            // Loop through cells            foreach ($pSheet->getCellCollection() as $cellID) {                $cell = $pSheet->getCell($cellID);                $cellValue = $cell->getValue();                if (!is_object($cellValue) &&                    ($cellValue !== null) &&                    $cellValue !== '' &&                    !isset($aFlippedStringTable[$cellValue]) &&                    ($cell->getDataType() == PHPExcel_Cell_DataType::TYPE_STRING || $cell->getDataType() == PHPExcel_Cell_DataType::TYPE_STRING2 || $cell->getDataType() == PHPExcel_Cell_DataType::TYPE_NULL)) {                        $aStringTable[] = $cellValue;                        $aFlippedStringTable[$cellValue] = true;                } elseif ($cellValue instanceof PHPExcel_RichText &&                          ($cellValue !== null) &&                          !isset($aFlippedStringTable[$cellValue->getHashCode()])) {                                $aStringTable[] = $cellValue;                                $aFlippedStringTable[$cellValue->getHashCode()] = true;                }            }            return $aStringTable;        } else {            throw new PHPExcel_Writer_Exception("Invalid PHPExcel_Worksheet object passed.");        }    }    /**     * Write string table to XML format     *     * @param     string[]     $pStringTable     * @return     string         XML Output     * @throws     PHPExcel_Writer_Exception     */    public function writeStringTable($pStringTable = null)    {        if ($pStringTable !== null) {            // Create XML writer            $objWriter = null;            if ($this->getParentWriter()->getUseDiskCaching()) {                $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory());            } else {                $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_MEMORY);            }            // XML header            $objWriter->startDocument('1.0', 'UTF-8', 'yes');            // String table            $objWriter->startElement('sst');            $objWriter->writeAttribute('xmlns', 'http://schemas.openxmlformats.org/spreadsheetml/2006/main');            $objWriter->writeAttribute('uniqueCount', count($pStringTable));            // Loop through string table            foreach ($pStringTable as $textElement) {                $objWriter->startElement('si');                if (! $textElement instanceof PHPExcel_RichText) {                    $textToWrite = PHPExcel_Shared_String::ControlCharacterPHP2OOXML($textElement);                    $objWriter->startElement('t');                    if ($textToWrite !== trim($textToWrite)) {                        $objWriter->writeAttribute('xml:space', 'preserve');                    }                    $objWriter->writeRawData($textToWrite);                    $objWriter->endElement();                } elseif ($textElement instanceof PHPExcel_RichText) {                    $this->writeRichText($objWriter, $textElement);                }                $objWriter->endElement();            }            $objWriter->endElement();            return $objWriter->getData();        } else {            throw new PHPExcel_Writer_Exception("Invalid string table array passed.");        }    }    /**     * Write Rich Text     *     * @param     PHPExcel_Shared_XMLWriter    $objWriter         XML Writer     * @param     PHPExcel_RichText            $pRichText        Rich text     * @param     string                        $prefix            Optional Namespace prefix     * @throws     PHPExcel_Writer_Exception     */    public function writeRichText(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_RichText $pRichText = null, $prefix = null)    {        if ($prefix !== null) {            $prefix .= ':';        }                    // Loop through rich text elements        $elements = $pRichText->getRichTextElements();        foreach ($elements as $element) {            // r            $objWriter->startElement($prefix.'r');            // rPr            if ($element instanceof PHPExcel_RichText_Run) {                // rPr                $objWriter->startElement($prefix.'rPr');                // rFont                $objWriter->startElement($prefix.'rFont');                $objWriter->writeAttribute('val', $element->getFont()->getName());                $objWriter->endElement();                // Bold                $objWriter->startElement($prefix.'b');                $objWriter->writeAttribute('val', ($element->getFont()->getBold() ? 'true' : 'false'));                $objWriter->endElement();                // Italic                $objWriter->startElement($prefix.'i');                $objWriter->writeAttribute('val', ($element->getFont()->getItalic() ? 'true' : 'false'));                $objWriter->endElement();                // Superscript / subscript                if ($element->getFont()->getSuperScript() || $element->getFont()->getSubScript()) {                    $objWriter->startElement($prefix.'vertAlign');                    if ($element->getFont()->getSuperScript()) {                        $objWriter->writeAttribute('val', 'superscript');                    } elseif ($element->getFont()->getSubScript()) {                        $objWriter->writeAttribute('val', 'subscript');                    }                    $objWriter->endElement();                }                // Strikethrough                $objWriter->startElement($prefix.'strike');                $objWriter->writeAttribute('val', ($element->getFont()->getStrikethrough() ? 'true' : 'false'));                $objWriter->endElement();                // Color                $objWriter->startElement($prefix.'color');                $objWriter->writeAttribute('rgb', $element->getFont()->getColor()->getARGB());                $objWriter->endElement();                // Size                $objWriter->startElement($prefix.'sz');                $objWriter->writeAttribute('val', $element->getFont()->getSize());                $objWriter->endElement();                // Underline                $objWriter->startElement($prefix.'u');                $objWriter->writeAttribute('val', $element->getFont()->getUnderline());                $objWriter->endElement();                $objWriter->endElement();            }            // t            $objWriter->startElement($prefix.'t');            $objWriter->writeAttribute('xml:space', 'preserve');            $objWriter->writeRawData(PHPExcel_Shared_String::ControlCharacterPHP2OOXML($element->getText()));            $objWriter->endElement();            $objWriter->endElement();        }    }    /**     * Write Rich Text     *     * @param     PHPExcel_Shared_XMLWriter    $objWriter         XML Writer     * @param     string|PHPExcel_RichText    $pRichText        text string or Rich text     * @param     string                        $prefix            Optional Namespace prefix     * @throws     PHPExcel_Writer_Exception     */    public function writeRichTextForCharts(PHPExcel_Shared_XMLWriter $objWriter = null, $pRichText = null, $prefix = null)    {        if (!$pRichText instanceof PHPExcel_RichText) {            $textRun = $pRichText;            $pRichText = new PHPExcel_RichText();            $pRichText->createTextRun($textRun);        }        if ($prefix !== null) {            $prefix .= ':';        }                    // Loop through rich text elements        $elements = $pRichText->getRichTextElements();        foreach ($elements as $element) {            // r            $objWriter->startElement($prefix.'r');            // rPr            $objWriter->startElement($prefix.'rPr');            // Bold            $objWriter->writeAttribute('b', ($element->getFont()->getBold() ? 1 : 0));            // Italic            $objWriter->writeAttribute('i', ($element->getFont()->getItalic() ? 1 : 0));            // Underline            $underlineType = $element->getFont()->getUnderline();            switch ($underlineType) {                case 'single':                    $underlineType = 'sng';                    break;                case 'double':                    $underlineType = 'dbl';                    break;            }            $objWriter->writeAttribute('u', $underlineType);            // Strikethrough            $objWriter->writeAttribute('strike', ($element->getFont()->getStrikethrough() ? 'sngStrike' : 'noStrike'));            // rFont            $objWriter->startElement($prefix.'latin');                $objWriter->writeAttribute('typeface', $element->getFont()->getName());            $objWriter->endElement();                // Superscript / subscript//                    if ($element->getFont()->getSuperScript() || $element->getFont()->getSubScript()) {//                        $objWriter->startElement($prefix.'vertAlign');//                        if ($element->getFont()->getSuperScript()) {//                            $objWriter->writeAttribute('val', 'superscript');//                        } elseif ($element->getFont()->getSubScript()) {//                            $objWriter->writeAttribute('val', 'subscript');//                        }//                        $objWriter->endElement();//                    }//            $objWriter->endElement();            // t            $objWriter->startElement($prefix.'t');//                    $objWriter->writeAttribute('xml:space', 'preserve');    //    Excel2010 accepts, Excel2007 complains            $objWriter->writeRawData(PHPExcel_Shared_String::ControlCharacterPHP2OOXML($element->getText()));            $objWriter->endElement();            $objWriter->endElement();        }    }    /**     * Flip string table (for index searching)     *     * @param     array    $stringTable    Stringtable     * @return     array     */    public function flipStringTable($stringTable = array())    {        // Return value        $returnValue = array();        // Loop through stringtable and add flipped items to $returnValue        foreach ($stringTable as $key => $value) {            if (! $value instanceof PHPExcel_RichText) {                $returnValue[$value] = $key;            } elseif ($value instanceof PHPExcel_RichText) {                $returnValue[$value->getHashCode()] = $key;            }        }        return $returnValue;    }}
 |