125 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			PHP
		
	
	
		
		
			
		
	
	
			125 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			PHP
		
	
	
| 
								 | 
							
								<?php
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								include_once __DIR__.'/../vendor/autoload.php';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								//TODO test double:writeSheetHeader
							 | 
						||
| 
								 | 
							
								//TODO test invalid UTF8
							 | 
						||
| 
								 | 
							
								//TODO test outoforder writeSheetRow('Sheet1',());
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class _XLSXWriter_ extends XLSXWriter
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    public function writeCell(XLSXWriter_BuffererWriter &$file, $row_number, $column_number, $value, $cell_format) {
							 | 
						||
| 
								 | 
							
										return call_user_func_array('parent::writeCell', func_get_args());
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								//Just a simple test, by no means comprehensive
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class XLSXWriterTest extends PHPUnit_Framework_TestCase
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * @covers XLSXWriter::writeCell
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
									public function testWriteCell()
							 | 
						||
| 
								 | 
							
									{
							 | 
						||
| 
								 | 
							
										$filename = tempnam("/tmp", "xlsx_writer");
							 | 
						||
| 
								 | 
							
										$file_writer = new XLSXWriter_BuffererWriter($filename);
							 | 
						||
| 
								 | 
							
										
							 | 
						||
| 
								 | 
							
								        $xlsx_writer = new _XLSXWriter_();
							 | 
						||
| 
								 | 
							
								        $xlsx_writer->writeCell($file_writer, 0, 0, '0123', 'string');
							 | 
						||
| 
								 | 
							
								        $file_writer->close();
							 | 
						||
| 
								 | 
							
								        $cell_xml = file_get_contents($filename);
							 | 
						||
| 
								 | 
							
								        $this->assertNotEquals('<c r="A1" s="0" t="n"><v>123</v></c>', $cell_xml);
							 | 
						||
| 
								 | 
							
								        $this->assertEquals('<c r="A1" s="0" t="s"><v>0</v></c>', $cell_xml);//0123 should be the 0th index of the shared string array
							 | 
						||
| 
								 | 
							
								        @unlink($filename);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * @covers XLSXWriter::writeToFile
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
									public function testWriteToFile()
							 | 
						||
| 
								 | 
							
									{
							 | 
						||
| 
								 | 
							
										$filename = tempnam("/tmp", "xlsx_writer");
							 | 
						||
| 
								 | 
							
										
							 | 
						||
| 
								 | 
							
										$header = array('0'=>'string','1'=>'string','2'=>'string','3'=>'string');
							 | 
						||
| 
								 | 
							
										$sheet = array(
							 | 
						||
| 
								 | 
							
												array('55','66','77','88'),
							 | 
						||
| 
								 | 
							
												array('10','11','12','13'),
							 | 
						||
| 
								 | 
							
										);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										$xlsx_writer = new XLSXWriter();
							 | 
						||
| 
								 | 
							
										$xlsx_writer->writeSheet($sheet,'mysheet',$header);
							 | 
						||
| 
								 | 
							
										$xlsx_writer->writeToFile($filename);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										$zip = new ZipArchive();
							 | 
						||
| 
								 | 
							
										$r = $zip->open($filename);
							 | 
						||
| 
								 | 
							
										$this->assertTrue($r);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										$r = $zip->numFiles>0 ? true : false;
							 | 
						||
| 
								 | 
							
										$this->assertTrue($r);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										$out_sheet = array();
							 | 
						||
| 
								 | 
							
										for($z=0; $z<$zip->numFiles; $z++)
							 | 
						||
| 
								 | 
							
										{
							 | 
						||
| 
								 | 
							
											$inside_zip_filename = $zip->getNameIndex($z);
							 | 
						||
| 
								 | 
							
											if (preg_match("/sheet(\d+).xml/", basename($inside_zip_filename)))
							 | 
						||
| 
								 | 
							
											{
							 | 
						||
| 
								 | 
							
												$out_sheet = $this->stripCellsFromSheetXML($zip->getFromName($inside_zip_filename));
							 | 
						||
| 
								 | 
							
												array_shift($out_sheet);
							 | 
						||
| 
								 | 
							
												$out_sheet = array_values($out_sheet);
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										$zip->close();
							 | 
						||
| 
								 | 
							
										@unlink($filename);
							 | 
						||
| 
								 | 
							
										
							 | 
						||
| 
								 | 
							
										$r1 = self::array_diff_assoc_recursive($out_sheet, $sheet);
							 | 
						||
| 
								 | 
							
										$r2 = self::array_diff_assoc_recursive($sheet, $out_sheet);
							 | 
						||
| 
								 | 
							
										$this->assertEmpty($r1);
							 | 
						||
| 
								 | 
							
										$this->assertEmpty($r2);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									private function stripCellsFromSheetXML($sheet_xml)
							 | 
						||
| 
								 | 
							
									{
							 | 
						||
| 
								 | 
							
										$output=array();
							 | 
						||
| 
								 | 
							
										$xml = new SimpleXMLElement($sheet_xml);
							 | 
						||
| 
								 | 
							
										$i=0;
							 | 
						||
| 
								 | 
							
										foreach($xml->sheetData->row as $row)
							 | 
						||
| 
								 | 
							
										{
							 | 
						||
| 
								 | 
							
											$j=0;
							 | 
						||
| 
								 | 
							
											foreach($row->c as $c)
							 | 
						||
| 
								 | 
							
											{
							 | 
						||
| 
								 | 
							
												$output[$i][$j] = (string)$c->v;
							 | 
						||
| 
								 | 
							
												$j++;
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
											$i++;
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										return $output;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public static function array_diff_assoc_recursive($array1, $array2)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        foreach($array1 as $key => $value)
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            if(is_array($value))
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                if(!isset($array2[$key]) || !is_array($array2[$key]))
							 | 
						||
| 
								 | 
							
								                {
							 | 
						||
| 
								 | 
							
								                    $difference[$key] = $value;
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								                else
							 | 
						||
| 
								 | 
							
								                {
							 | 
						||
| 
								 | 
							
								                    $new_diff = self::array_diff_assoc_recursive($value, $array2[$key]);
							 | 
						||
| 
								 | 
							
								                    if(!empty($new_diff))
							 | 
						||
| 
								 | 
							
								                    {
							 | 
						||
| 
								 | 
							
								                        $difference[$key] = $new_diff;
							 | 
						||
| 
								 | 
							
								                    }
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            else if(!isset($array2[$key]) || $array2[$key] != $value)
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                $difference[$key] = $value;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        return !isset($difference) ? array() : $difference;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 |