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; | ||
|  |     } | ||
|  | } |