PHPOffice / PHPExcel

ARCHIVED
Other
11.46k stars 4.19k forks source link

Loop with richtext produces incorrect table #692

Open 3cees opened 9 years ago

3cees commented 9 years ago

Hello,

this:

    date_default_timezone_set('Europe/London');
    define('EOL',(PHP_SAPI == 'cli') ? PHP_EOL : '<br />');
    require_once dirname(__FILE__) . '/inc/php_excel/PHPExcel.php';
    $objPHPExcel = new PHPExcel();
    $wizard = new PHPExcel_Helper_HTML;

    $objPHPExcel->setActiveSheetIndex(0);       

    for ($i = 0; $i <= 50; $i++) {
        $richText   = $wizard->toRichTextObject( 'test' );
        $richText1  = $wizard->toRichTextObject( '' );
        #$richText  = "test";
        #var_dump($richText );
        $objPHPExcel->getActiveSheet()->setCellValue('A'.$i, $richText);
        $objPHPExcel->getActiveSheet()->setCellValue('B'.$i, 'test');
        $objPHPExcel->getActiveSheet()->getColumnDimension('A')->setWidth(48);
        $objPHPExcel->getActiveSheet()->getRowDimension(1)->setRowHeight(-1);
        $objPHPExcel->getActiveSheet()->getStyle('A'.$i)->getAlignment()->setWrapText(true);
    }

    $objWriter = new PHPExcel_Writer_Excel2007($objPHPExcel);
    $objWriter->save(str_replace('functions.php', '/inc/exports/export_'.sanitize_title_with_dashes( $page ).'.xlsx', __FILE__));

Produces this:

image

Is that a bug, or is my function wrong?

MarkBaker commented 9 years ago

Unable to replicate, using your own code.... what version of PHPExcel are you running?

3cees commented 9 years ago

It should be the lkates from here. I will download it again and retry it. If i take lesse then 10 values, it works as expected

3cees commented 9 years ago

Yes. Just checked. I use the lates version from github. Set the loop to 200 items and got the result in the attached file. https://wsi.li/DTo3psiE4cZ2/168001

MarkBaker commented 9 years ago

Which branch on github? develop or 1.8?

I've tested with up to 20000 iterations in the loop, and still haven't managed to replicate this problem

3cees commented 9 years ago

Yes. 1.8. Could it be a server issue?

MarkBaker commented 9 years ago

It's certainly an oddity, though PHP should behave the same regardless of platform (32-bit/64-bit discrepancies aside)

3cees commented 9 years ago

I am calling that function through an ajax call. It runs inside a worpdress installation and it only happens when I use $wizard->toRichTextObject(). If you need any more info, or should know any workaraund, let me know. Maybe there is an easy way, to debug this.

MarkBaker commented 9 years ago

Unless I can find some way of replicating it, I'm unlikely ever to find a fix.... fiddling with the code blindfold, and never being able to know if anything I've changed will fix the problem is almost impossible.

3cees commented 9 years ago

You can check it via TeamViewer. If you want.

3cees commented 9 years ago

By the way: this problem only appears, when the line break property is set.

ProfessorComputer commented 8 years ago

Hi Mark!

I've got a similar problem, too (PHPExcel 1.8, PHP 5.3.x, OpenOffice 4.1.2).

You may reproduce it by using the example "42richText.php". I used this modified version (no saving, just direct output):

<?php
error_reporting(E_ALL);
ini_set('display_errors', TRUE);
ini_set('display_startup_errors', TRUE);
date_default_timezone_set('Europe/London');
define('EOL',(PHP_SAPI == 'cli') ? PHP_EOL : '<br />');
/** Include PHPExcel */
require_once dirname(__FILE__) . '/Classes/PHPExcel.php';
// Create new PHPExcel object
$objPHPExcel = new PHPExcel();
// Set document properties
$objPHPExcel->getProperties()->setCreator("Maarten Balliauw")
                             ->setLastModifiedBy("Maarten Balliauw")
                             ->setTitle("PHPExcel Test Document")
                             ->setSubject("PHPExcel Test Document")
                             ->setDescription("Test document for PHPExcel, generated using PHP classes.")
                             ->setKeywords("office PHPExcel php")
                             ->setCategory("Test result file");
// Add some data
$html1 = '<font color="#0000ff">
<h1 align="center">My very first example of rich text<br />generated from html markup</h1>
<p>
<font size="14" COLOR="rgb(0,255,128)">
<b>This block</b> contains an <i>italicized</i> word;
while this block uses an <u>underline</u>.
</font>
</p>
<p align="right"><font size="9" color="red">
I want to eat <ins><del>healthy food</del> <strong>pizza</strong></ins>.
</font>
';
$html2 = '<p>
<font color="#ff0000">
    100&deg;C is a hot temperature
</font>
<br>
<font color="#0080ff">
    10&deg;F is cold
</font>
</p>';
$html3 = '2<sup>3</sup> equals 8';
$html4 = 'H<sub>2</sub>SO<sub>4</sub> is the chemical formula for Sulphuric acid';
$html5 = '<strong>bold</strong>, <em>italic</em>, <strong><em>bold+italic</em></strong>';
$wizard = new PHPExcel_Helper_HTML;
$richText = $wizard->toRichTextObject($html1);
$objPHPExcel->setActiveSheetIndex(0)
    ->setCellValue('A1', $richText);
$objPHPExcel->getActiveSheet()->getColumnDimension('A')->setWidth(48);
$objPHPExcel->getActiveSheet()->getRowDimension(1)->setRowHeight(-1);
$objPHPExcel->getActiveSheet()->getStyle('A1')
    ->getAlignment()
    ->setWrapText(true);
$richText = $wizard->toRichTextObject($html2);
$objPHPExcel->getActiveSheet()
    ->setCellValue('A2', $richText);
$objPHPExcel->getActiveSheet()->getRowDimension(1)->setRowHeight(-1);
$objPHPExcel->getActiveSheet()->getStyle('A2')
    ->getAlignment()
    ->setWrapText(true);
$objPHPExcel->getActiveSheet()
    ->setCellValue('A3', $wizard->toRichTextObject($html3));
$objPHPExcel->getActiveSheet()
    ->setCellValue('A4', $wizard->toRichTextObject($html4));
$objPHPExcel->getActiveSheet()
    ->setCellValue('A5', $wizard->toRichTextObject($html5));

// Here comes the loop ;)
for($i = 6; $i<100; $i++){
  $objPHPExcel->getActiveSheet()
    ->setCellValue('A'.$i, $wizard->toRichTextObject('<strong>Test #'.$i.'</strong>bla<br>blubb'));
}

// Rename worksheet
$objPHPExcel->getActiveSheet()->setTitle('Simple');
// Set active sheet index to the first sheet, so Excel opens this as the first sheet
$objPHPExcel->setActiveSheetIndex(0);

// NEW
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Disposition: attachment;filename="Test"');
header('Cache-Control: max-age=0');

$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
$objWriter->save('php://output');
exit;
?>

Any idea?