Issue2368Test.php 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. <?php
  2. namespace PhpOffice\PhpSpreadsheetTests\Writer\Xlsx;
  3. use PhpOffice\PhpSpreadsheet\Cell\DataValidation;
  4. use PhpOffice\PhpSpreadsheet\IOFactory;
  5. use PhpOffice\PhpSpreadsheet\Shared\File;
  6. use PhpOffice\PhpSpreadsheet\Spreadsheet;
  7. use PhpOffice\PhpSpreadsheet\Writer\Xlsx as Writer;
  8. use PhpOffice\PhpSpreadsheetTests\Functional\AbstractFunctional;
  9. class Issue2368Test extends AbstractFunctional
  10. {
  11. public function testBoolWrite(): void
  12. {
  13. // DataValidations were incorrectly written twice.
  14. $spreadsheet = new Spreadsheet();
  15. $sheet = $spreadsheet->getActiveSheet();
  16. $validation = $sheet->getDataValidation('A1:A10');
  17. $validation->setType(DataValidation::TYPE_LIST);
  18. $validation->setShowDropDown(true);
  19. $validation->setFormula1('"Option 1, Option 2"');
  20. $outputFilename = File::temporaryFilename();
  21. $writer = new Writer($spreadsheet);
  22. $writer->save($outputFilename);
  23. $zipfile = "zip://$outputFilename#xl/worksheets/sheet1.xml";
  24. $contents = file_get_contents($zipfile);
  25. unlink($outputFilename);
  26. $spreadsheet->disconnectWorksheets();
  27. if ($contents === false) {
  28. self::fail('Unable to open file');
  29. } else {
  30. self::assertSame(0, substr_count($contents, '<extLst>'));
  31. self::assertSame(2, substr_count($contents, 'dataValidations')); // start and end tags
  32. }
  33. }
  34. public function testMultipleRange(): void
  35. {
  36. // DataValidations which were identical except for sqref were incorrectly merged.
  37. $filename = 'tests/data/Writer/XLSX/issue.2368new.xlsx';
  38. $reader = IOFactory::createReader('Xlsx');
  39. $spreadsheet = $reader->load($filename);
  40. $sheet = $spreadsheet->getActiveSheet();
  41. $validations = $sheet->getDataValidationCollection();
  42. /** @var string[] */
  43. $ranges = [];
  44. foreach ($validations as $validation) {
  45. $ranges[] = $validation->getSqref();
  46. }
  47. self::assertContains('A1:A5', $ranges);
  48. self::assertContains('A10:A14', $ranges);
  49. self::assertContains('A20:A24', $ranges);
  50. self::assertSame('"yes,no"', $sheet->getCell('A3')->getDataValidation()->getFormula1());
  51. self::assertSame('"yes,no"', $sheet->getCell('A10')->getDataValidation()->getFormula1());
  52. self::assertSame('"yes,no"', $sheet->getCell('A24')->getDataValidation()->getFormula1());
  53. $reloadedSpreadsheet = $this->writeAndReload($spreadsheet, 'Xlsx');
  54. $spreadsheet->disconnectWorksheets();
  55. $sheet2 = $reloadedSpreadsheet->getActiveSheet();
  56. $validation2 = $sheet2->getDataValidationCollection();
  57. /** @var string[] */
  58. $range2 = [];
  59. foreach ($validation2 as $validation) {
  60. $range2[] = $validation->getSqref();
  61. }
  62. self::assertContains('A1:A5', $range2);
  63. self::assertContains('A10:A14', $range2);
  64. self::assertContains('A20:A24', $range2);
  65. self::assertSame('"yes,no"', $sheet2->getCell('A3')->getDataValidation()->getFormula1());
  66. self::assertSame('"yes,no"', $sheet2->getCell('A10')->getDataValidation()->getFormula1());
  67. self::assertSame('"yes,no"', $sheet2->getCell('A24')->getDataValidation()->getFormula1());
  68. $reloadedSpreadsheet->disconnectWorksheets();
  69. }
  70. }