OdsTest.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297
  1. <?php
  2. namespace PhpOffice\PhpSpreadsheetTests\Reader\Ods;
  3. use PhpOffice\PhpSpreadsheet\Cell\DataType;
  4. use PhpOffice\PhpSpreadsheet\Document\Properties;
  5. use PhpOffice\PhpSpreadsheet\Reader\Exception as ReaderException;
  6. use PhpOffice\PhpSpreadsheet\Reader\Ods;
  7. use PhpOffice\PhpSpreadsheet\Spreadsheet;
  8. use PhpOffice\PhpSpreadsheet\Style\Font;
  9. use PHPUnit\Framework\TestCase;
  10. /**
  11. * @TODO The class doesn't read the bold/italic/underline properties (rich text)
  12. */
  13. class OdsTest extends TestCase
  14. {
  15. /** @var string */
  16. private $incompleteMessage = 'Features not implemented yet';
  17. /**
  18. * @var string
  19. */
  20. private $timeZone;
  21. protected function setUp(): void
  22. {
  23. $this->timeZone = date_default_timezone_get();
  24. date_default_timezone_set('UTC');
  25. }
  26. protected function tearDown(): void
  27. {
  28. date_default_timezone_set($this->timeZone);
  29. }
  30. /**
  31. * @var ?Spreadsheet
  32. */
  33. private $spreadsheetOdsTest;
  34. /**
  35. * @var ?Spreadsheet
  36. */
  37. private $spreadsheetData;
  38. /**
  39. * @return Spreadsheet
  40. */
  41. private function loadOdsTestFile()
  42. {
  43. if (isset($this->spreadsheetOdsTest)) {
  44. return $this->spreadsheetOdsTest;
  45. }
  46. $filename = 'samples/templates/OOCalcTest.ods';
  47. // Load into this instance
  48. $reader = new Ods();
  49. $this->spreadsheetOdsTest = $reader->loadIntoExisting($filename, new Spreadsheet());
  50. return $this->spreadsheetOdsTest;
  51. }
  52. /**
  53. * @return Spreadsheet
  54. */
  55. protected function loadDataFile()
  56. {
  57. if (isset($this->spreadsheetData)) {
  58. return $this->spreadsheetData;
  59. }
  60. $filename = 'tests/data/Reader/Ods/data.ods';
  61. // Load into this instance
  62. $reader = new Ods();
  63. $this->spreadsheetData = $reader->load($filename);
  64. return $this->spreadsheetData;
  65. }
  66. public function testLoadWorksheets(): void
  67. {
  68. $spreadsheet = $this->loadDataFile();
  69. self::assertInstanceOf('PhpOffice\PhpSpreadsheet\Spreadsheet', $spreadsheet);
  70. self::assertEquals(2, $spreadsheet->getSheetCount());
  71. $firstSheet = $spreadsheet->getSheet(0);
  72. self::assertInstanceOf('PhpOffice\PhpSpreadsheet\Worksheet\Worksheet', $firstSheet);
  73. $secondSheet = $spreadsheet->getSheet(1);
  74. self::assertInstanceOf('PhpOffice\PhpSpreadsheet\Worksheet\Worksheet', $secondSheet);
  75. self::assertEquals('Sheet1', $spreadsheet->getSheet(0)->getTitle());
  76. self::assertEquals('Second Sheet', $spreadsheet->getSheet(1)->getTitle());
  77. }
  78. public function testLoadOneWorksheet(): void
  79. {
  80. $filename = 'tests/data/Reader/Ods/data.ods';
  81. // Load into this instance
  82. $reader = new Ods();
  83. $reader->setLoadSheetsOnly(['Sheet1']);
  84. $spreadsheet = $reader->load($filename);
  85. self::assertEquals(1, $spreadsheet->getSheetCount());
  86. self::assertEquals('Sheet1', $spreadsheet->getSheet(0)->getTitle());
  87. }
  88. public function testLoadOneWorksheetNotActive(): void
  89. {
  90. $filename = 'tests/data/Reader/Ods/data.ods';
  91. // Load into this instance
  92. $reader = new Ods();
  93. $reader->setLoadSheetsOnly(['Second Sheet']);
  94. $spreadsheet = $reader->load($filename);
  95. self::assertEquals(1, $spreadsheet->getSheetCount());
  96. self::assertEquals('Second Sheet', $spreadsheet->getSheet(0)->getTitle());
  97. }
  98. public function testLoadBadFile(): void
  99. {
  100. $this->expectException(ReaderException::class);
  101. $reader = new Ods();
  102. $spreadsheet = $reader->load(__FILE__);
  103. self::assertInstanceOf('PhpOffice\PhpSpreadsheet\Spreadsheet', $spreadsheet);
  104. self::assertEquals(2, $spreadsheet->getSheetCount());
  105. $firstSheet = $spreadsheet->getSheet(0);
  106. self::assertInstanceOf('PhpOffice\PhpSpreadsheet\Worksheet\Worksheet', $firstSheet);
  107. $secondSheet = $spreadsheet->getSheet(1);
  108. self::assertInstanceOf('PhpOffice\PhpSpreadsheet\Worksheet\Worksheet', $secondSheet);
  109. }
  110. public function testLoadCorruptFile(): void
  111. {
  112. $this->expectException(ReaderException::class);
  113. $filename = 'tests/data/Reader/Ods/corruptMeta.ods';
  114. $reader = new Ods();
  115. $spreadsheet = $reader->load($filename);
  116. self::assertInstanceOf('PhpOffice\PhpSpreadsheet\Spreadsheet', $spreadsheet);
  117. self::assertEquals(2, $spreadsheet->getSheetCount());
  118. $firstSheet = $spreadsheet->getSheet(0);
  119. self::assertInstanceOf('PhpOffice\PhpSpreadsheet\Worksheet\Worksheet', $firstSheet);
  120. $secondSheet = $spreadsheet->getSheet(1);
  121. self::assertInstanceOf('PhpOffice\PhpSpreadsheet\Worksheet\Worksheet', $secondSheet);
  122. }
  123. public function testReadValueAndComments(): void
  124. {
  125. $spreadsheet = $this->loadOdsTestFile();
  126. $firstSheet = $spreadsheet->getSheet(0);
  127. self::assertEquals(29, $firstSheet->getHighestRow());
  128. self::assertEquals('N', $firstSheet->getHighestColumn());
  129. // Simple cell value
  130. self::assertEquals('Test String 1', $firstSheet->getCell('A1')->getValue());
  131. // Merged cell
  132. self::assertEquals('BOX', $firstSheet->getCell('B18')->getValue());
  133. // Comments/Annotations
  134. self::assertEquals(
  135. 'Test for a simple colour-formatted string',
  136. $firstSheet->getComment('A1')->getText()->getPlainText()
  137. );
  138. // Data types
  139. self::assertEquals(DataType::TYPE_STRING, $firstSheet->getCell('A1')->getDataType());
  140. self::assertEquals(DataType::TYPE_NUMERIC, $firstSheet->getCell('B1')->getDataType()); // Int
  141. self::assertEquals(DataType::TYPE_NUMERIC, $firstSheet->getCell('B6')->getDataType()); // Float
  142. self::assertEquals(1.23, $firstSheet->getCell('B6')->getValue());
  143. self::assertEquals(0, $firstSheet->getCell('G10')->getValue());
  144. self::assertEquals(DataType::TYPE_NUMERIC, $firstSheet->getCell('A10')->getDataType()); // Date
  145. self::assertEquals('19-Dec-60', $firstSheet->getCell('A10')->getFormattedValue());
  146. self::assertEquals(DataType::TYPE_NUMERIC, $firstSheet->getCell('A13')->getDataType()); // Time
  147. self::assertEquals('2:30:00', $firstSheet->getCell('A13')->getFormattedValue());
  148. self::assertEquals(DataType::TYPE_NUMERIC, $firstSheet->getCell('A15')->getDataType()); // Date + Time
  149. self::assertEquals('19-Dec-60 1:30:00', $firstSheet->getCell('A15')->getFormattedValue());
  150. self::assertEquals(DataType::TYPE_NUMERIC, $firstSheet->getCell('A11')->getDataType()); // Fraction
  151. self::assertEquals(DataType::TYPE_BOOL, $firstSheet->getCell('D6')->getDataType());
  152. self::assertTrue($firstSheet->getCell('D6')->getValue());
  153. self::assertEquals(DataType::TYPE_FORMULA, $firstSheet->getCell('C6')->getDataType()); // Formula
  154. self::assertEquals('=TRUE()', $firstSheet->getCell('C6')->getValue()); // Formula
  155. // Percentage, Currency
  156. $spreadsheet = $this->loadDataFile();
  157. $firstSheet = $spreadsheet->getSheet(0);
  158. self::assertEquals(DataType::TYPE_NUMERIC, $firstSheet->getCell('A1')->getDataType()); // Percentage (10%)
  159. self::assertEquals(0.1, $firstSheet->getCell('A1')->getValue());
  160. self::assertEquals(DataType::TYPE_NUMERIC, $firstSheet->getCell('A2')->getDataType()); // Percentage (10.00%)
  161. self::assertEquals(0.1, $firstSheet->getCell('A2')->getValue());
  162. self::assertEquals(DataType::TYPE_NUMERIC, $firstSheet->getCell('A4')->getDataType()); // Currency (€10.00)
  163. self::assertEquals(10, $firstSheet->getCell('A4')->getValue());
  164. self::assertEquals(DataType::TYPE_NUMERIC, $firstSheet->getCell('A5')->getDataType()); // Currency ($20)
  165. self::assertEquals(20, $firstSheet->getCell('A5')->getValue());
  166. }
  167. public function testReadColors(): void
  168. {
  169. $spreadsheet = $this->loadOdsTestFile();
  170. $firstSheet = $spreadsheet->getSheet(0);
  171. // Background color
  172. $style = $firstSheet->getCell('K3')->getStyle();
  173. self::assertEquals('none', $style->getFill()->getFillType());
  174. self::assertEquals('FFFFFFFF', $style->getFill()->getStartColor()->getARGB());
  175. self::assertEquals('FF000000', $style->getFill()->getEndColor()->getARGB());
  176. }
  177. public function testReadRichText(): void
  178. {
  179. $spreadsheet = $this->loadOdsTestFile();
  180. $firstSheet = $spreadsheet->getSheet(0);
  181. self::assertEquals(
  182. "I don't know if OOCalc supports Rich Text in the same way as Excel, " .
  183. 'And this row should be autofit height with text wrap',
  184. $firstSheet->getCell('A28')->getValue()
  185. );
  186. }
  187. public function testReadCellsWithRepeatedSpaces(): void
  188. {
  189. $spreadsheet = $this->loadDataFile();
  190. $firstSheet = $spreadsheet->getSheet(0);
  191. self::assertEquals('This has 4 spaces before and 2 after ', $firstSheet->getCell('A8')->getValue());
  192. self::assertEquals('This only one after ', $firstSheet->getCell('A9')->getValue());
  193. self::assertEquals('Test with DIFFERENT styles and multiple spaces: ', $firstSheet->getCell('A10')->getValue());
  194. self::assertEquals("test with new \nLines", $firstSheet->getCell('A11')->getValue());
  195. }
  196. public function testReadHyperlinks(): void
  197. {
  198. $spreadsheet = $this->loadOdsTestFile();
  199. $firstSheet = $spreadsheet->getSheet(0);
  200. $hyperlink = $firstSheet->getCell('A29');
  201. self::assertEquals(DataType::TYPE_STRING, $hyperlink->getDataType());
  202. self::assertEquals('PhpSpreadsheet', $hyperlink->getValue());
  203. self::assertEquals('https://github.com/PHPOffice/phpspreadsheet', $hyperlink->getHyperlink()->getUrl());
  204. }
  205. // Below some test for features not implemented yet
  206. public function testReadBoldItalicUnderline(): void
  207. {
  208. if ($this->incompleteMessage !== '') {
  209. self::markTestIncomplete($this->incompleteMessage);
  210. }
  211. $spreadsheet = $this->loadOdsTestFile();
  212. $firstSheet = $spreadsheet->getSheet(0);
  213. // Font styles
  214. $style = $firstSheet->getCell('A1')->getStyle();
  215. self::assertEquals('FF000000', $style->getFont()->getColor()->getARGB());
  216. self::assertEquals(11, $style->getFont()->getSize());
  217. self::assertEquals(Font::UNDERLINE_NONE, $style->getFont()->getUnderline());
  218. $style = $firstSheet->getCell('E3')->getStyle();
  219. self::assertEquals(Font::UNDERLINE_SINGLE, $style->getFont()->getUnderline());
  220. $style = $firstSheet->getCell('E1')->getStyle();
  221. self::assertTrue($style->getFont()->getBold());
  222. self::assertTrue($style->getFont()->getItalic());
  223. }
  224. }