217 lines
		
	
	
		
			8.5 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
		
		
			
		
	
	
			217 lines
		
	
	
		
			8.5 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
|   | <?php | ||
|  | 
 | ||
|  | namespace PhpOffice\PhpSpreadsheetTests\Writer\Csv; | ||
|  | 
 | ||
|  | use PhpOffice\PhpSpreadsheet\Reader\Csv as CsvReader; | ||
|  | use PhpOffice\PhpSpreadsheet\Shared\File; | ||
|  | use PhpOffice\PhpSpreadsheet\Spreadsheet; | ||
|  | use PhpOffice\PhpSpreadsheet\Writer\Csv as CsvWriter; | ||
|  | use PhpOffice\PhpSpreadsheetTests\Functional; | ||
|  | 
 | ||
|  | class CsvEnclosureTest extends Functional\AbstractFunctional | ||
|  | { | ||
|  |     private static $cellValues = [ | ||
|  |         'A1' => '2020-06-03', | ||
|  |         'B1' => '000123', | ||
|  |         'C1' => '06.53', | ||
|  |         'D1' => '14.22', | ||
|  |         'A2' => '2020-06-04', | ||
|  |         'B2' => '000234', | ||
|  |         'C2' => '07.12', | ||
|  |         'D2' => '15.44', | ||
|  |     ]; | ||
|  | 
 | ||
|  |     public function testNormalEnclosure(): void | ||
|  |     { | ||
|  |         $delimiter = ';'; | ||
|  |         $enclosure = '"'; | ||
|  |         $spreadsheet = new Spreadsheet(); | ||
|  |         $sheet = $spreadsheet->getActiveSheet(); | ||
|  |         foreach (self::$cellValues as $key => $value) { | ||
|  |             $sheet->setCellValue($key, $value); | ||
|  |         } | ||
|  |         $writer = new CsvWriter($spreadsheet); | ||
|  |         $writer->setDelimiter($delimiter); | ||
|  |         $writer->setEnclosure($enclosure); | ||
|  |         $filename = tempnam(File::sysGetTempDir(), 'phpspreadsheet-test'); | ||
|  |         $writer->save($filename); | ||
|  |         $filedata = file_get_contents($filename); | ||
|  |         $filedata = preg_replace('/\\r?\\n/', $delimiter, $filedata); | ||
|  |         $reader = new CsvReader(); | ||
|  |         $reader->setDelimiter($delimiter); | ||
|  |         $reader->setEnclosure($enclosure); | ||
|  |         $newspreadsheet = $reader->load($filename); | ||
|  |         unlink($filename); | ||
|  |         $sheet = $newspreadsheet->getActiveSheet(); | ||
|  |         $expected = ''; | ||
|  |         foreach (self::$cellValues as $key => $value) { | ||
|  |             self::assertEquals($value, $sheet->getCell($key)->getValue()); | ||
|  |             $expected .= "$enclosure$value$enclosure$delimiter"; | ||
|  |         } | ||
|  |         self::assertEquals($expected, $filedata); | ||
|  |     } | ||
|  | 
 | ||
|  |     public function testNoEnclosure(): void | ||
|  |     { | ||
|  |         $delimiter = ';'; | ||
|  |         $enclosure = ''; | ||
|  |         $spreadsheet = new Spreadsheet(); | ||
|  |         $sheet = $spreadsheet->getActiveSheet(); | ||
|  |         foreach (self::$cellValues as $key => $value) { | ||
|  |             $sheet->setCellValue($key, $value); | ||
|  |         } | ||
|  |         $writer = new CsvWriter($spreadsheet); | ||
|  |         $writer->setDelimiter($delimiter); | ||
|  |         $writer->setEnclosure($enclosure); | ||
|  |         self::assertEquals('', $writer->getEnclosure()); | ||
|  |         $filename = tempnam(File::sysGetTempDir(), 'phpspreadsheet-test'); | ||
|  |         $writer->save($filename); | ||
|  |         $filedata = file_get_contents($filename); | ||
|  |         $filedata = preg_replace('/\\r?\\n/', $delimiter, $filedata); | ||
|  |         $reader = new CsvReader(); | ||
|  |         $reader->setDelimiter($delimiter); | ||
|  |         $reader->setEnclosure($enclosure); | ||
|  |         self::assertEquals('"', $reader->getEnclosure()); | ||
|  |         $newspreadsheet = $reader->load($filename); | ||
|  |         unlink($filename); | ||
|  |         $sheet = $newspreadsheet->getActiveSheet(); | ||
|  |         $expected = ''; | ||
|  |         foreach (self::$cellValues as $key => $value) { | ||
|  |             self::assertEquals($value, $sheet->getCell($key)->getValue()); | ||
|  |             $expected .= "$enclosure$value$enclosure$delimiter"; | ||
|  |         } | ||
|  |         self::assertEquals($expected, $filedata); | ||
|  |     } | ||
|  | 
 | ||
|  |     public function testNotRequiredEnclosure1(): void | ||
|  |     { | ||
|  |         $delimiter = ';'; | ||
|  |         $enclosure = '"'; | ||
|  |         $spreadsheet = new Spreadsheet(); | ||
|  |         $sheet = $spreadsheet->getActiveSheet(); | ||
|  |         foreach (self::$cellValues as $key => $value) { | ||
|  |             $sheet->setCellValue($key, $value); | ||
|  |         } | ||
|  |         $writer = new CsvWriter($spreadsheet); | ||
|  |         self::assertTrue($writer->getEnclosureRequired()); | ||
|  |         $writer->setEnclosureRequired(false)->setDelimiter($delimiter)->setEnclosure($enclosure); | ||
|  |         $filename = tempnam(File::sysGetTempDir(), 'phpspreadsheet-test'); | ||
|  |         $writer->save($filename); | ||
|  |         $filedata = file_get_contents($filename); | ||
|  |         $filedata = preg_replace('/\\r?\\n/', $delimiter, $filedata); | ||
|  |         $reader = new CsvReader(); | ||
|  |         $reader->setDelimiter($delimiter); | ||
|  |         $reader->setEnclosure($enclosure); | ||
|  |         $newspreadsheet = $reader->load($filename); | ||
|  |         unlink($filename); | ||
|  |         $sheet = $newspreadsheet->getActiveSheet(); | ||
|  |         $expected = ''; | ||
|  |         foreach (self::$cellValues as $key => $value) { | ||
|  |             self::assertEquals($value, $sheet->getCell($key)->getValue()); | ||
|  |             $expected .= "$value$delimiter"; | ||
|  |         } | ||
|  |         self::assertEquals($expected, $filedata); | ||
|  |     } | ||
|  | 
 | ||
|  |     public function testNotRequiredEnclosure2(): void | ||
|  |     { | ||
|  |         $cellValues2 = [ | ||
|  |             'A1' => '2020-06-03', | ||
|  |             'B1' => 'has,separator', | ||
|  |             'C1' => 'has;non-separator', | ||
|  |             'D1' => 'has"enclosure', | ||
|  |             'A2' => 'has space', | ||
|  |             'B2' => "has\nnewline", | ||
|  |             'C2' => '', | ||
|  |             'D2' => '15.44', | ||
|  |             'A3' => ' leadingspace', | ||
|  |             'B3' => 'trailingspace ', | ||
|  |             'C3' => '=D2*2', | ||
|  |             'D3' => ',leadingcomma', | ||
|  |             'A4' => 'trailingquote"', | ||
|  |             'B4' => 'unused', | ||
|  |             'C4' => 'unused', | ||
|  |             'D4' => 'unused', | ||
|  |         ]; | ||
|  |         $calcc3 = '30.88'; | ||
|  |         $expected1 = '2020-06-03,"has,separator",has;non-separator,"has""enclosure"'; | ||
|  |         $expected2 = 'has space,"has' . "\n" . 'newline",,15.44'; | ||
|  |         $expected3 = ' leadingspace,trailingspace ,' . $calcc3 . ',",leadingcomma"'; | ||
|  |         $expected4 = '"trailingquote""",unused,unused,unused'; | ||
|  |         $expectedfile = "$expected1\n$expected2\n$expected3\n$expected4\n"; | ||
|  |         $delimiter = ','; | ||
|  |         $enclosure = '"'; | ||
|  |         $spreadsheet = new Spreadsheet(); | ||
|  |         $sheet = $spreadsheet->getActiveSheet(); | ||
|  |         foreach ($cellValues2 as $key => $value) { | ||
|  |             $sheet->setCellValue($key, $value); | ||
|  |         } | ||
|  |         $writer = new CsvWriter($spreadsheet); | ||
|  |         self::assertTrue($writer->getEnclosureRequired()); | ||
|  |         $writer->setEnclosureRequired(false)->setDelimiter($delimiter)->setEnclosure($enclosure); | ||
|  |         $filename = tempnam(File::sysGetTempDir(), 'phpspreadsheet-test'); | ||
|  |         $writer->save($filename); | ||
|  |         $filedata = file_get_contents($filename); | ||
|  |         $filedata = preg_replace('/\\r/', '', $filedata); | ||
|  |         $reader = new CsvReader(); | ||
|  |         $reader->setDelimiter($delimiter); | ||
|  |         $reader->setEnclosure($enclosure); | ||
|  |         $newspreadsheet = $reader->load($filename); | ||
|  |         unlink($filename); | ||
|  |         $sheet = $newspreadsheet->getActiveSheet(); | ||
|  |         foreach ($cellValues2 as $key => $value) { | ||
|  |             self::assertEquals(($key === 'C3') ? $calcc3 : $value, $sheet->getCell($key)->getValue()); | ||
|  |         } | ||
|  |         self::assertEquals($expectedfile, $filedata); | ||
|  |     } | ||
|  | 
 | ||
|  |     public function testGoodReread(): void | ||
|  |     { | ||
|  |         $delimiter = ','; | ||
|  |         $enclosure = '"'; | ||
|  |         $spreadsheet = new Spreadsheet(); | ||
|  |         $sheet = $spreadsheet->getActiveSheet(); | ||
|  |         $sheet->setCellValue('A1', '1'); | ||
|  |         $sheet->setCellValue('B1', '2,3'); | ||
|  |         $sheet->setCellValue('C1', '4'); | ||
|  |         $writer = new CsvWriter($spreadsheet); | ||
|  |         $writer->setEnclosureRequired(false)->setDelimiter($delimiter)->setEnclosure($enclosure); | ||
|  |         $filename = tempnam(File::sysGetTempDir(), 'phpspreadsheet-test'); | ||
|  |         $writer->save($filename); | ||
|  |         $reader = new CsvReader(); | ||
|  |         $reader->setDelimiter($delimiter); | ||
|  |         $reader->setEnclosure($enclosure); | ||
|  |         $newspreadsheet = $reader->load($filename); | ||
|  |         unlink($filename); | ||
|  |         $sheet = $newspreadsheet->getActiveSheet(); | ||
|  |         self::assertEquals('1', $sheet->getCell('A1')->getValue()); | ||
|  |         self::assertEquals('2,3', $sheet->getCell('B1')->getValue()); | ||
|  |         self::assertEquals('4', $sheet->getCell('C1')->getValue()); | ||
|  |     } | ||
|  | 
 | ||
|  |     public function testBadReread(): void | ||
|  |     { | ||
|  |         $delimiter = ','; | ||
|  |         $enclosure = ''; | ||
|  |         $spreadsheet = new Spreadsheet(); | ||
|  |         $sheet = $spreadsheet->getActiveSheet(); | ||
|  |         $sheet->setCellValue('A1', '1'); | ||
|  |         $sheet->setCellValue('B1', '2,3'); | ||
|  |         $sheet->setCellValue('C1', '4'); | ||
|  |         $writer = new CsvWriter($spreadsheet); | ||
|  |         $writer->setDelimiter($delimiter)->setEnclosure($enclosure); | ||
|  |         $filename = tempnam(File::sysGetTempDir(), 'phpspreadsheet-test'); | ||
|  |         $writer->save($filename); | ||
|  |         $reader = new CsvReader(); | ||
|  |         $reader->setDelimiter($delimiter); | ||
|  |         $reader->setEnclosure($enclosure); | ||
|  |         $newspreadsheet = $reader->load($filename); | ||
|  |         unlink($filename); | ||
|  |         $sheet = $newspreadsheet->getActiveSheet(); | ||
|  |         self::assertEquals('1', $sheet->getCell('A1')->getValue()); | ||
|  |         self::assertEquals('2', $sheet->getCell('B1')->getValue()); | ||
|  |         self::assertEquals('3', $sheet->getCell('C1')->getValue()); | ||
|  |         self::assertEquals('4', $sheet->getCell('D1')->getValue()); | ||
|  |     } | ||
|  | } |