code: public function getStream($blockIdOrPps)
      {
          static $isRegistered = false;
          if (!$isRegistered) {
              stream_wrapper_register('ole-chainedblockstream', ChainedBlockStream::class);
              $isRegistered = true;
          }
  
          // Store current instance in global array, so that it can be accessed
          // in OLE_ChainedBlockStream::stream_open().
          // Object is removed from self::$instances in OLE_Stream::close().
          $GLOBALS['_OLE_INSTANCES'][] = $this;
          $instanceId = end(array_keys($GLOBALS['_OLE_INSTANCES']));
  
          $path = 'ole-chainedblockstream://oleInstanceId=' . $instanceId;
          if ($blockIdOrPps instanceof OLE\PPS) {
              $path .= '&blockId=' . $blockIdOrPps->startBlock;
              $path .= '&size=' . $blockIdOrPps->Size;
          } else {
              $path .= '&blockId=' . $blockIdOrPps;
          }
  
          return fopen($path, 'r');
      }
docs: Returns a stream for use with fread() etc. External callers should
  use \PhpOffice\PhpSpreadsheet\Shared\OLE\PPS\File::getStream().
  
  @param int|OLE\PPS $blockIdOrPps block id or PPS
  
  @return resource read-only stream