code: public function writeWorkbook(array $pWorksheetSizes)
      {
          $this->worksheetSizes = $pWorksheetSizes;
  
          // Calculate the number of selected worksheet tabs and call the finalization
          // methods for each worksheet
          $total_worksheets = $this->spreadsheet->getSheetCount();
  
          // Add part 1 of the Workbook globals, what goes before the SHEET records
          $this->storeBof(0x0005);
          $this->writeCodepage();
          $this->writeWindow1();
  
          $this->writeDateMode();
          $this->writeAllFonts();
          $this->writeAllNumberFormats();
          $this->writeAllXfs();
          $this->writeAllStyles();
          $this->writePalette();
  
          // Prepare part 3 of the workbook global stream, what goes after the SHEET records
          $part3 = '';
          if ($this->countryCode != -1) {
              $part3 .= $this->writeCountry();
          }
          $part3 .= $this->writeRecalcId();
  
          $part3 .= $this->writeSupbookInternal();
          /* TODO: store external SUPBOOK records and XCT and CRN records
          in case of external references for BIFF8 */
          $part3 .= $this->writeExternalsheetBiff8();
          $part3 .= $this->writeAllDefinedNamesBiff8();
          $part3 .= $this->writeMsoDrawingGroup();
          $part3 .= $this->writeSharedStringsTable();
  
          $part3 .= $this->writeEof();
  
          // Add part 2 of the Workbook globals, the SHEET records
          $this->calcSheetOffsets();
          for ($i = 0; $i < $total_worksheets; ++$i) {
              $this->writeBoundSheet($this->spreadsheet->getSheet($i), $this->worksheetOffsets[$i]);
          }
  
          // Add part 3 of the Workbook globals
          $this->_data .= $part3;
  
          return $this->_data;
      }
docs: Assemble worksheets into a workbook and send the BIFF data to an OLE
  storage.
  
  @param array $pWorksheetSizes The sizes in bytes of the binary worksheet streams
  
  @return string Binary data for workbook stream