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