function cbMakeXlsSheet(data) {
    var outString =
      gen_private.plugs.type.msoffice.cbMakeMsOfficeBasicXml(data) +
      '<worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships">'
    var maxX = 0
    var maxY = 0
    var curColMax
    var rowId
    var columnId
    var colsFound = 0
    var total_size_y
    var total_size_x

    // Find the maximum cells area:
    maxY = data.sheet.data.length ? data.sheet.data.length - 1 : 0
    for (
      rowId = 0, total_size_y = data.sheet.data.length;
      rowId < total_size_y;
      rowId++
    ) {
      if (data.sheet.data[rowId]) {
        curColMax = data.sheet.data[rowId].length
          ? data.sheet.data[rowId].length - 1
          : 0
        maxX = maxX < curColMax ? curColMax : maxX
      } // Endif.
    } // End of for loop.

    outString +=
      '<dimension ref="A1:' +
      cbNumberToCell(maxX) +
      '' +
      (maxY + 1) +
      '"/><sheetViews>'
    outString += '<sheetView tabSelected="1" workbookViewId="0"/>'
    // outString += '<selection activeCell="A1" sqref="A1"/>'
    outString += '</sheetViews><sheetFormatPr defaultRowHeight="15"/>'

    if (data.sheet.width) {
      data.sheet.width.forEach(function (value, indexId) {
        if (typeof value === 'object') {
          var outAttr = ''

          /* eslint-disable no-self-compare */
          if (typeof value.width === 'number' && value.width === value.width) {
            outAttr = ' width="' + value.width + '" customWidth="1"'
          } // Endif.

          /* eslint-disable no-self-compare */
          if (
            typeof value.styleCode === 'number' &&
            value.styleCode === value.styleCode
          ) {
            outAttr = ' style="' + value.styleCode + '"'
          } // Endif.

          if (!colsFound) {
            outString += '<cols>'
          } // Endif.

          outString +=
            '<col min="' +
            (value.colId + 1) +
            '" max="' +
            (value.colId + 1) +
            '"' +
            outAttr +
            '/>'
          colsFound++

          // Support for old code, not recommended:
        } else if (typeof value === 'number') {
          if (!colsFound) {
            outString += '<cols>'
          } // Endif.

          outString +=
            '<col min="' +
            (indexId + 1) +
            '" max="' +
            (indexId + 1) +
            '" width="' +
            value +
            '" customWidth="1"/>'
          colsFound++
        } // Endif.
      })

      if (colsFound) {
        outString += '</cols>'
      } // Endif.
    } // Endif.

    outString += '<sheetData>'

    for (
      rowId = 0, total_size_y = data.sheet.data.length;
      rowId < total_size_y;
      rowId++
    ) {
      if (data.sheet.data[rowId]) {
        // Patch by arnesten <notifications@github.com>: Automatically support line breaks if used in cell + calculates row height:
        var rowLines = 1
        data.sheet.data[rowId].forEach(function (cellData) {
          if (typeof cellData === 'string') {
            var candidate = cellData.split('\n').length
            rowLines = Math.max(rowLines, candidate)
          }
        })
        outString +=
          '<row r="' +
          (rowId + 1) +
          '" spans="1:' +
          data.sheet.data[rowId].length +
          '" ht="' +
          rowLines * 15 +
          '">'
        // End of patch.

        for (
          columnId = 0, total_size_x = data.sheet.data[rowId].length;
          columnId < total_size_x;
          columnId++
        ) {
          var cellData = data.sheet.data[rowId][columnId]
          if (typeof cellData !== 'undefined') {
            var isString = ''
            var cellOutData = '0'

            switch (typeof cellData) {
              case 'number':
                cellOutData = cellData
                break

              case 'string':
                cellOutData =
                  genobj.generate_data.cell_strings[data.id][rowId][columnId]
                if (cellData.indexOf('\n') >= 0) {
                  isString = ' s="1" t="s"'
                } else {
                  isString = ' t="s"'
                }
                break
            } // End of switch.

            outString +=
              '<c r="' +
              cbNumberToCell(columnId) +
              '' +
              (rowId + 1) +
              '"' +
              isString +
              '><v>' +
              cellOutData +
              '</v></c>'
          } // Endif.
        } // End of for loop.

        outString += '</row>'
      } // Endif.
    } // End of for loop.

    outString +=
      '</sheetData><pageMargins left="0.7" right="0.7" top="0.75" bottom="0.75" header="0.3" footer="0.3"/></worksheet>'
    return outString
  }
???.

@param {object} data The main sheet object.
@return Text string.