code: func (sb *StreamFileBuilder) Build() (*StreamFile, error) {
  	if sb.built {
  		return nil, BuiltStreamFileBuilderError
  	}
  	sb.built = true
  	parts, err := sb.xlsxFile.MarshallParts()
  	if err != nil {
  		return nil, err
  	}
  	es := &StreamFile{
  		zipWriter:      sb.zipWriter,
  		xlsxFile:       sb.xlsxFile,
  		sheetXmlPrefix: make([]string, len(sb.xlsxFile.Sheets)),
  		sheetXmlSuffix: make([]string, len(sb.xlsxFile.Sheets)),
  		styleIds:       sb.styleIds,
  	}
  	for path, data := range parts {
  		// If the part is a sheet, don't write it yet. We only want to write the XLSX metadata files, since at this
  		// point the sheets are still empty. The sheet files will be written later as their rows come in.
  		if strings.HasPrefix(path, sheetFilePathPrefix) {
  			if err := sb.processEmptySheetXML(es, path, data); err != nil {
  				return nil, err
  			}
  			continue
  		}
  		metadataFile, err := sb.zipWriter.Create(path)
  		if err != nil {
  			return nil, err
  		}
  		_, err = metadataFile.Write([]byte(data))
  		if err != nil {
  			return nil, err
  		}
  	}
  
  	if err := es.NextSheet(); err != nil {
  		return nil, err
  	}
  	return es, nil
  }
docs: // Build begins streaming the XLSX file to the io, by writing all the XLSX metadata. It creates a StreamFile struct
  // that can be used to write the rows to the sheets.