| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297 |
- <?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 const CELL_VALUES = [
- 'A1' => '2020-06-03',
- 'B1' => '000123',
- 'C1' => '06.53',
- 'D1' => 14.22,
- 'A2' => '2020-06-04',
- 'B2' => '000234',
- 'C2' => '07.12',
- 'D2' => '15.44',
- ];
- private static function getFileData(string $filename): string
- {
- return file_get_contents($filename) ?: '';
- }
- public function testNormalEnclosure(): void
- {
- $delimiter = ';';
- $enclosure = '"';
- $spreadsheet = new Spreadsheet();
- $sheet = $spreadsheet->getActiveSheet();
- foreach (self::CELL_VALUES as $key => $value) {
- $sheet->setCellValue($key, $value);
- }
- $writer = new CsvWriter($spreadsheet);
- $writer->setDelimiter($delimiter);
- $writer->setEnclosure($enclosure);
- $filename = File::temporaryFilename();
- $writer->save($filename);
- $filedata = self::getFileData($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::CELL_VALUES as $key => $value) {
- self::assertEquals($value, $sheet->getCell($key)->getValue());
- $expected .= "$enclosure$value$enclosure$delimiter";
- }
- self::assertEquals($expected, $filedata);
- $spreadsheet->disconnectWorksheets();
- $newspreadsheet->disconnectWorksheets();
- }
- public function testNoEnclosure(): void
- {
- $delimiter = ';';
- $enclosure = '';
- $spreadsheet = new Spreadsheet();
- $sheet = $spreadsheet->getActiveSheet();
- foreach (self::CELL_VALUES as $key => $value) {
- $sheet->setCellValue($key, $value);
- }
- $writer = new CsvWriter($spreadsheet);
- $writer->setDelimiter($delimiter);
- $writer->setEnclosure($enclosure);
- self::assertEquals('', $writer->getEnclosure());
- $filename = File::temporaryFilename();
- $writer->save($filename);
- $filedata = self::getFileData($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::CELL_VALUES as $key => $value) {
- self::assertEquals($value, $sheet->getCell($key)->getValue());
- $expected .= "$enclosure$value$enclosure$delimiter";
- }
- self::assertEquals($expected, $filedata);
- $spreadsheet->disconnectWorksheets();
- $newspreadsheet->disconnectWorksheets();
- }
- public function testNotRequiredEnclosure1(): void
- {
- $delimiter = ';';
- $enclosure = '"';
- $spreadsheet = new Spreadsheet();
- $sheet = $spreadsheet->getActiveSheet();
- foreach (self::CELL_VALUES as $key => $value) {
- $sheet->setCellValue($key, $value);
- }
- $writer = new CsvWriter($spreadsheet);
- self::assertTrue($writer->getEnclosureRequired());
- $writer->setEnclosureRequired(false)->setDelimiter($delimiter)->setEnclosure($enclosure);
- $filename = File::temporaryFilename();
- $writer->save($filename);
- $filedata = self::getFileData($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::CELL_VALUES as $key => $value) {
- self::assertEquals($value, $sheet->getCell($key)->getValue());
- $expected .= "$value$delimiter";
- }
- self::assertEquals($expected, $filedata);
- $spreadsheet->disconnectWorksheets();
- $newspreadsheet->disconnectWorksheets();
- }
- 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',
- 'A5' => false,
- 'B5' => true,
- 'C5' => null,
- 'D5' => 0,
- ];
- $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';
- $expected5 = 'FALSE,TRUE,,0';
- $expectedfile = "$expected1\n$expected2\n$expected3\n$expected4\n$expected5\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 = File::temporaryFilename();
- $writer->save($filename);
- $filedata = self::getFileData($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(), "Failure for cell $key");
- }
- self::assertEquals($expectedfile, $filedata);
- $spreadsheet->disconnectWorksheets();
- $newspreadsheet->disconnectWorksheets();
- }
- public function testRequiredEnclosure2(): 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',
- 'A5' => false,
- 'B5' => true,
- 'C5' => null,
- 'D5' => 0,
- ];
- $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"';
- $expected5 = '"FALSE","TRUE","","0"';
- $expectedfile = "$expected1\n$expected2\n$expected3\n$expected4\n$expected5\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(true)->setDelimiter($delimiter)->setEnclosure($enclosure);
- $filename = File::temporaryFilename();
- $writer->save($filename);
- $filedata = self::getFileData($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(), "Failure for cell $key");
- }
- self::assertEquals($expectedfile, $filedata);
- $spreadsheet->disconnectWorksheets();
- $newspreadsheet->disconnectWorksheets();
- }
- 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 = File::temporaryFilename();
- $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());
- $spreadsheet->disconnectWorksheets();
- $newspreadsheet->disconnectWorksheets();
- }
- 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 = File::temporaryFilename();
- $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());
- $spreadsheet->disconnectWorksheets();
- $newspreadsheet->disconnectWorksheets();
- }
- }
|