ConditionalFormattingDataBarXlsxTest.php 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336
  1. <?php
  2. namespace PhpOffice\PhpSpreadsheetTests\Reader\Xlsx;
  3. use PhpOffice\PhpSpreadsheet\IOFactory;
  4. use PhpOffice\PhpSpreadsheet\Shared\File;
  5. use PhpOffice\PhpSpreadsheet\Style\Color;
  6. use PhpOffice\PhpSpreadsheet\Style\Conditional;
  7. use PhpOffice\PhpSpreadsheet\Style\ConditionalFormatting\ConditionalDataBar;
  8. use PhpOffice\PhpSpreadsheet\Style\ConditionalFormatting\ConditionalFormatValueObject;
  9. use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet;
  10. use PHPUnit\Framework\TestCase;
  11. class ConditionalFormattingDataBarXlsxTest extends TestCase
  12. {
  13. public function testLoadXlsxConditionalFormattingDataBar(): void
  14. {
  15. // Make sure Conditionals are read correctly from existing file
  16. $filename = 'tests/data/Reader/XLSX/conditionalFormattingDataBarTest.xlsx';
  17. $reader = IOFactory::createReader('Xlsx');
  18. $spreadsheet = $reader->load($filename);
  19. $worksheet = $spreadsheet->getActiveSheet();
  20. $this->pattern1Assertion($worksheet);
  21. $this->pattern2Assertion($worksheet);
  22. $this->pattern3Assertion($worksheet);
  23. $this->pattern4Assertion($worksheet);
  24. }
  25. public function testReloadXlsxConditionalFormattingDataBar(): void
  26. {
  27. // Make sure conditionals from existing file are maintained across save
  28. $filename = 'tests/data/Reader/XLSX/conditionalFormattingDataBarTest.xlsx';
  29. $outfile = File::temporaryFilename();
  30. $reader = IOFactory::createReader('Xlsx');
  31. $spreadshee1 = $reader->load($filename);
  32. $writer = IOFactory::createWriter($spreadshee1, 'Xlsx');
  33. $writer->save($outfile);
  34. $spreadsheet = $reader->load($outfile);
  35. unlink($outfile);
  36. $worksheet = $spreadsheet->getActiveSheet();
  37. $this->pattern1Assertion($worksheet);
  38. $this->pattern2Assertion($worksheet);
  39. $this->pattern3Assertion($worksheet);
  40. $this->pattern4Assertion($worksheet);
  41. }
  42. public function testNewXlsxConditionalFormattingDataBar(): void
  43. {
  44. // Make sure blanks/non-blanks added by PhpSpreadsheet are handled correctly
  45. $outfile = File::temporaryFilename();
  46. $spreadshee1 = new \PhpOffice\PhpSpreadsheet\Spreadsheet();
  47. $sheet = $spreadshee1->getActiveSheet();
  48. $sheet->setCellValue('A1', 1);
  49. $sheet->setCellValue('A2', 2);
  50. $sheet->setCellValue('A3', 3);
  51. $sheet->setCellValue('A4', 4);
  52. $sheet->setCellValue('A5', 5);
  53. $cond1 = new Conditional();
  54. $cond1->setConditionType(Conditional::CONDITION_DATABAR);
  55. $cond1->setDataBar(new ConditionalDataBar());
  56. $dataBar = $cond1->getDataBar();
  57. self::assertNotNull($dataBar);
  58. $dataBar
  59. ->setMinimumConditionalFormatValueObject(new ConditionalFormatValueObject('min'))
  60. ->setMaximumConditionalFormatValueObject(new ConditionalFormatValueObject('max'))
  61. ->setColor(Color::COLOR_GREEN);
  62. $cond = [$cond1];
  63. $sheet->getStyle('A1:A5')->setConditionalStyles($cond);
  64. $writer = IOFactory::createWriter($spreadshee1, 'Xlsx');
  65. $writer->save($outfile);
  66. $reader = IOFactory::createReader('Xlsx');
  67. $spreadsheet = $reader->load($outfile);
  68. unlink($outfile);
  69. $worksheet = $spreadsheet->getActiveSheet();
  70. $conditionalStyle = $worksheet->getConditionalStyles('A1:A5');
  71. self::assertNotEmpty($conditionalStyle);
  72. /** @var Conditional $conditionalRule */
  73. $conditionalRule = $conditionalStyle[0];
  74. $conditions = $conditionalRule->getConditions();
  75. self::assertNotEmpty($conditions);
  76. self::assertEquals(Conditional::CONDITION_DATABAR, $conditionalRule->getConditionType());
  77. self::assertNotEmpty($conditionalRule->getDataBar());
  78. $dataBar = $conditionalRule->getDataBar();
  79. self::assertNotNull($dataBar);
  80. self::assertNotNull($dataBar->getMinimumConditionalFormatValueObject());
  81. self::assertNotNull($dataBar->getMaximumConditionalFormatValueObject());
  82. self::assertEquals('min', $dataBar->getMinimumConditionalFormatValueObject()->getType());
  83. self::assertEquals('max', $dataBar->getMaximumConditionalFormatValueObject()->getType());
  84. self::assertEquals(Color::COLOR_GREEN, $dataBar->getColor());
  85. }
  86. private function pattern1Assertion(Worksheet $worksheet): void
  87. {
  88. self::assertEquals(
  89. "Type: Automatic, Automatic\nDirection: Automatic\nFills: Gradient\nAxis Position: Automatic",
  90. $worksheet->getCell('A2')->getValue()
  91. );
  92. $conditionalStyle = $worksheet->getConditionalStyles('A3:A23');
  93. self::assertNotEmpty($conditionalStyle);
  94. /** @var Conditional $conditionalRule */
  95. $conditionalRule = $conditionalStyle[0];
  96. $dataBar = $conditionalRule->getDataBar();
  97. self::assertNotEmpty($dataBar);
  98. self::assertEquals(Conditional::CONDITION_DATABAR, $conditionalRule->getConditionType());
  99. self::assertNotNull($dataBar);
  100. self::assertNotNull($dataBar->getMinimumConditionalFormatValueObject());
  101. self::assertNotNull($dataBar->getMaximumConditionalFormatValueObject());
  102. self::assertEquals('min', $dataBar->getMinimumConditionalFormatValueObject()->getType());
  103. self::assertEquals('max', $dataBar->getMaximumConditionalFormatValueObject()->getType());
  104. self::assertEquals('FF638EC6', $dataBar->getColor());
  105. self::assertNotEmpty($dataBar->getConditionalFormattingRuleExt());
  106. //ext
  107. $rule1ext = $dataBar->getConditionalFormattingRuleExt();
  108. self::assertNotNull($rule1ext);
  109. self::assertEquals('{72C64AE0-5CD9-164F-83D1-AB720F263E79}', $rule1ext->getId());
  110. self::assertEquals('dataBar', $rule1ext->getCfRule());
  111. self::assertEquals('A3:A23', $rule1ext->getSqref());
  112. $extDataBar = $rule1ext->getDataBarExt();
  113. self::assertNotEmpty($extDataBar);
  114. $pattern1 = [
  115. 'minLength' => 0,
  116. 'maxLength' => 100,
  117. 'border' => true,
  118. 'gradient' => null,
  119. 'direction' => null,
  120. 'axisPosition' => null,
  121. 'negativeBarBorderColorSameAsPositive' => false,
  122. 'borderColor' => 'FF638EC6',
  123. 'negativeFillColor' => 'FFFF0000',
  124. 'negativeBorderColor' => 'FFFF0000',
  125. ];
  126. foreach ($pattern1 as $key => $value) {
  127. $funcName = 'get' . ucwords($key);
  128. self::assertEquals($value, $extDataBar->$funcName(), __METHOD__ . '::' . $funcName . ' function patten');
  129. }
  130. self::assertNotEmpty($extDataBar->getMinimumConditionalFormatValueObject());
  131. self::assertNotEmpty($extDataBar->getMaximumConditionalFormatValueObject());
  132. self::assertEquals('autoMin', $extDataBar->getMinimumConditionalFormatValueObject()->getType());
  133. self::assertEquals('autoMax', $extDataBar->getMaximumConditionalFormatValueObject()->getType());
  134. self::assertArrayHasKey('rgb', $extDataBar->getAxisColor());
  135. self::assertEquals('FF000000', $extDataBar->getAxisColor()['rgb']);
  136. }
  137. private function pattern2Assertion(Worksheet $worksheet): void
  138. {
  139. self::assertEquals(
  140. "Type: Number, Number\nValue: -5, 5\nDirection: Automatic\nFills: Solid\nAxis Position: Automatic",
  141. $worksheet->getCell('B2')->getValue()
  142. );
  143. $conditionalStyle = $worksheet->getConditionalStyles('B3:B23');
  144. self::assertNotEmpty($conditionalStyle);
  145. /** @var Conditional $conditionalRule */
  146. $conditionalRule = $conditionalStyle[0];
  147. $dataBar = $conditionalRule->getDataBar();
  148. self::assertNotEmpty($dataBar);
  149. self::assertEquals(Conditional::CONDITION_DATABAR, $conditionalRule->getConditionType());
  150. self::assertNotNull($dataBar);
  151. self::assertNotNull($dataBar->getMinimumConditionalFormatValueObject());
  152. self::assertNotNull($dataBar->getMaximumConditionalFormatValueObject());
  153. self::assertEquals('num', $dataBar->getMinimumConditionalFormatValueObject()->getType());
  154. self::assertEquals('num', $dataBar->getMaximumConditionalFormatValueObject()->getType());
  155. self::assertEquals('-5', $dataBar->getMinimumConditionalFormatValueObject()->getValue());
  156. self::assertEquals('5', $dataBar->getMaximumConditionalFormatValueObject()->getValue());
  157. self::assertEquals('FF63C384', $dataBar->getColor());
  158. self::assertNotEmpty($dataBar->getConditionalFormattingRuleExt());
  159. //ext
  160. $rule1ext = $dataBar->getConditionalFormattingRuleExt();
  161. self::assertNotNull($rule1ext);
  162. self::assertEquals('{98904F60-57F0-DF47-B480-691B20D325E3}', $rule1ext->getId());
  163. self::assertEquals('dataBar', $rule1ext->getCfRule());
  164. self::assertEquals('B3:B23', $rule1ext->getSqref());
  165. $extDataBar = $rule1ext->getDataBarExt();
  166. self::assertNotEmpty($extDataBar);
  167. $pattern1 = [
  168. 'minLength' => 0,
  169. 'maxLength' => 100,
  170. 'border' => null,
  171. 'gradient' => false,
  172. 'direction' => null,
  173. 'axisPosition' => null,
  174. 'negativeBarBorderColorSameAsPositive' => null,
  175. 'borderColor' => null,
  176. 'negativeFillColor' => 'FFFF0000',
  177. 'negativeBorderColor' => null,
  178. ];
  179. foreach ($pattern1 as $key => $value) {
  180. $funcName = 'get' . ucwords($key);
  181. self::assertEquals($value, $extDataBar->$funcName(), $funcName . ' function patten');
  182. }
  183. self::assertNotEmpty($extDataBar->getMinimumConditionalFormatValueObject());
  184. self::assertNotEmpty($extDataBar->getMaximumConditionalFormatValueObject());
  185. self::assertEquals('num', $extDataBar->getMinimumConditionalFormatValueObject()->getType());
  186. self::assertEquals('num', $extDataBar->getMaximumConditionalFormatValueObject()->getType());
  187. self::assertEquals('-5', $extDataBar->getMinimumConditionalFormatValueObject()->getCellFormula());
  188. self::assertEquals('5', $extDataBar->getMaximumConditionalFormatValueObject()->getCellFormula());
  189. self::assertArrayHasKey('rgb', $extDataBar->getAxisColor());
  190. self::assertEquals('FF000000', $extDataBar->getAxisColor()['rgb']);
  191. }
  192. private function pattern3Assertion(Worksheet $worksheet): void
  193. {
  194. self::assertEquals(
  195. "Type: Automatic, Automatic\nDirection: rightToLeft\nFills: Solid\nAxis Position: None",
  196. $worksheet->getCell('C2')->getValue()
  197. );
  198. $conditionalStyle = $worksheet->getConditionalStyles('C3:C23');
  199. self::assertNotEmpty($conditionalStyle);
  200. /** @var Conditional $conditionalRule */
  201. $conditionalRule = $conditionalStyle[0];
  202. $dataBar = $conditionalRule->getDataBar();
  203. self::assertNotEmpty($dataBar);
  204. self::assertEquals(Conditional::CONDITION_DATABAR, $conditionalRule->getConditionType());
  205. self::assertNotNull($dataBar);
  206. self::assertNotNull($dataBar->getMinimumConditionalFormatValueObject());
  207. self::assertNotNull($dataBar->getMaximumConditionalFormatValueObject());
  208. self::assertEquals('min', $dataBar->getMinimumConditionalFormatValueObject()->getType());
  209. self::assertEquals('max', $dataBar->getMaximumConditionalFormatValueObject()->getType());
  210. self::assertEmpty($dataBar->getMinimumConditionalFormatValueObject()->getValue());
  211. self::assertEmpty($dataBar->getMaximumConditionalFormatValueObject()->getValue());
  212. self::assertEquals('FFFF555A', $dataBar->getColor());
  213. self::assertNotEmpty($dataBar->getConditionalFormattingRuleExt());
  214. //ext
  215. $rule1ext = $dataBar->getConditionalFormattingRuleExt();
  216. self::assertNotNull($rule1ext);
  217. self::assertEquals('{453C04BA-7ABD-8548-8A17-D9CFD2BDABE9}', $rule1ext->getId());
  218. self::assertEquals('dataBar', $rule1ext->getCfRule());
  219. self::assertEquals('C3:C23', $rule1ext->getSqref());
  220. $extDataBar = $rule1ext->getDataBarExt();
  221. self::assertNotEmpty($extDataBar);
  222. $pattern1 = [
  223. 'minLength' => 0,
  224. 'maxLength' => 100,
  225. 'border' => null,
  226. 'gradient' => false,
  227. 'direction' => 'rightToLeft',
  228. 'axisPosition' => 'none',
  229. 'negativeBarBorderColorSameAsPositive' => null,
  230. 'borderColor' => null,
  231. 'negativeFillColor' => 'FFFF0000',
  232. 'negativeBorderColor' => null,
  233. ];
  234. foreach ($pattern1 as $key => $value) {
  235. $funcName = 'get' . ucwords($key);
  236. self::assertEquals($value, $extDataBar->$funcName(), $funcName . ' function patten');
  237. }
  238. self::assertNotEmpty($extDataBar->getMinimumConditionalFormatValueObject());
  239. self::assertNotEmpty($extDataBar->getMaximumConditionalFormatValueObject());
  240. self::assertEquals('autoMin', $extDataBar->getMinimumConditionalFormatValueObject()->getType());
  241. self::assertEquals('autoMax', $extDataBar->getMaximumConditionalFormatValueObject()->getType());
  242. self::assertEmpty($extDataBar->getMinimumConditionalFormatValueObject()->getCellFormula());
  243. self::assertEmpty($extDataBar->getMaximumConditionalFormatValueObject()->getCellFormula());
  244. self::assertArrayHasKey('rgb', $extDataBar->getAxisColor());
  245. self::assertEmpty($extDataBar->getAxisColor()['rgb']);
  246. }
  247. private function pattern4Assertion(Worksheet $worksheet): void
  248. {
  249. self::assertEquals(
  250. "type: formula, formula\nValue: =2+3, =10+10\nDirection: leftToRight\nShowDataBarOnly\nFills: Solid\nBorder: Solid\nAxis Position: Midpoint",
  251. $worksheet->getCell('D2')->getValue()
  252. );
  253. $conditionalStyle = $worksheet->getConditionalStyles('D3:D23');
  254. self::assertNotEmpty($conditionalStyle);
  255. /** @var Conditional $conditionalRule */
  256. $conditionalRule = $conditionalStyle[0];
  257. $dataBar = $conditionalRule->getDataBar();
  258. self::assertNotEmpty($dataBar);
  259. self::assertEquals(Conditional::CONDITION_DATABAR, $conditionalRule->getConditionType());
  260. self::assertNotNull($dataBar);
  261. self::assertTrue($dataBar->getShowValue());
  262. self::assertNotNull($dataBar->getMinimumConditionalFormatValueObject());
  263. self::assertNotNull($dataBar->getMaximumConditionalFormatValueObject());
  264. self::assertEquals('formula', $dataBar->getMinimumConditionalFormatValueObject()->getType());
  265. self::assertEquals('formula', $dataBar->getMaximumConditionalFormatValueObject()->getType());
  266. self::assertEquals('3+2', $dataBar->getMinimumConditionalFormatValueObject()->getValue());
  267. self::assertEquals('10+10', $dataBar->getMaximumConditionalFormatValueObject()->getValue());
  268. self::assertEquals('FFFF555A', $dataBar->getColor());
  269. self::assertNotEmpty($dataBar->getConditionalFormattingRuleExt());
  270. //ext
  271. $rule1ext = $dataBar->getConditionalFormattingRuleExt();
  272. self::assertNotNull($rule1ext);
  273. self::assertEquals('{6C1E066A-E240-3D4A-98F8-8CC218B0DFD2}', $rule1ext->getId());
  274. self::assertEquals('dataBar', $rule1ext->getCfRule());
  275. self::assertEquals('D3:D23', $rule1ext->getSqref());
  276. $extDataBar = $rule1ext->getDataBarExt();
  277. self::assertNotEmpty($extDataBar);
  278. $pattern1 = [
  279. 'minLength' => 0,
  280. 'maxLength' => 100,
  281. 'border' => true,
  282. 'gradient' => false,
  283. 'direction' => 'leftToRight',
  284. 'axisPosition' => 'middle',
  285. 'negativeBarBorderColorSameAsPositive' => null,
  286. 'borderColor' => 'FF000000',
  287. 'negativeFillColor' => 'FFFF0000',
  288. 'negativeBorderColor' => null,
  289. ];
  290. foreach ($pattern1 as $key => $value) {
  291. $funcName = 'get' . ucwords($key);
  292. self::assertEquals($value, $extDataBar->$funcName(), $funcName . ' function patten');
  293. }
  294. self::assertNotEmpty($extDataBar->getMaximumConditionalFormatValueObject());
  295. self::assertNotEmpty($extDataBar->getMinimumConditionalFormatValueObject());
  296. self::assertEquals('formula', $extDataBar->getMinimumConditionalFormatValueObject()->getType());
  297. self::assertEquals('formula', $extDataBar->getMaximumConditionalFormatValueObject()->getType());
  298. self::assertEquals('3+2', $extDataBar->getMinimumConditionalFormatValueObject()->getCellFormula());
  299. self::assertEquals('10+10', $extDataBar->getMaximumConditionalFormatValueObject()->getCellFormula());
  300. self::assertArrayHasKey('rgb', $extDataBar->getAxisColor());
  301. self::assertEquals('FF000000', $extDataBar->getAxisColor()['rgb']);
  302. }
  303. }