@@ -265,6 +265,18 @@ protected function loadSpreadsheetFromFile(string $filename): Spreadsheet
265
265
return $ this ->loadIntoExisting ($ filename , $ spreadsheet );
266
266
}
267
267
268
+ /**
269
+ * Loads Spreadsheet from string.
270
+ */
271
+ public function loadSpreadsheetFromString (string $ contents ): Spreadsheet
272
+ {
273
+ // Create new Spreadsheet
274
+ $ spreadsheet = new Spreadsheet ();
275
+
276
+ // Load into this instance
277
+ return $ this ->loadStringOrFile ('data://text/plain, ' . urlencode ($ contents ), $ spreadsheet , true );
278
+ }
279
+
268
280
private function openFileOrMemory (string $ filename ): void
269
281
{
270
282
// Open file
@@ -314,16 +326,43 @@ public function castFormattedNumberToNumeric(
314
326
$ this ->preserveNumericFormatting = $ preserveNumericFormatting ;
315
327
}
316
328
329
+ /**
330
+ * Open data uri for reading.
331
+ */
332
+ private function openDataUri (string $ filename ): void
333
+ {
334
+ $ fileHandle = fopen ($ filename , 'rb ' );
335
+ if ($ fileHandle === false ) {
336
+ // @codeCoverageIgnoreStart
337
+ throw new ReaderException ('Could not open file ' . $ filename . ' for reading. ' );
338
+ // @codeCoverageIgnoreEnd
339
+ }
340
+
341
+ $ this ->fileHandle = $ fileHandle ;
342
+ }
343
+
317
344
/**
318
345
* Loads PhpSpreadsheet from file into PhpSpreadsheet instance.
319
346
*/
320
347
public function loadIntoExisting (string $ filename , Spreadsheet $ spreadsheet ): Spreadsheet
348
+ {
349
+ return $ this ->loadStringOrFile ($ filename , $ spreadsheet , false );
350
+ }
351
+
352
+ /**
353
+ * Loads PhpSpreadsheet from file into PhpSpreadsheet instance.
354
+ */
355
+ private function loadStringOrFile (string $ filename , Spreadsheet $ spreadsheet , bool $ dataUri ): Spreadsheet
321
356
{
322
357
// Deprecated in Php8.1
323
358
$ iniset = $ this ->setAutoDetect ('1 ' );
324
359
325
360
// Open file
326
- $ this ->openFileOrMemory ($ filename );
361
+ if ($ dataUri ) {
362
+ $ this ->openDataUri ($ filename );
363
+ } else {
364
+ $ this ->openFileOrMemory ($ filename );
365
+ }
327
366
$ fileHandle = $ this ->fileHandle ;
328
367
329
368
// Skip BOM, if any
@@ -395,8 +434,8 @@ private function convertBoolean(&$rowDatum, bool $preserveBooleanString): void
395
434
} elseif (strcasecmp (Calculation::getFALSE (), $ rowDatum ) === 0 || strcasecmp ('false ' , $ rowDatum ) === 0 ) {
396
435
$ rowDatum = false ;
397
436
}
398
- } elseif ( $ rowDatum === null ) {
399
- $ rowDatum = '' ;
437
+ } else {
438
+ $ rowDatum = $ rowDatum ?? '' ;
400
439
}
401
440
}
402
441
0 commit comments