docs: protected void generateHeaderBand(JRDesignBand band) {
          log.debug("Adding column names in header band.");
          band.setHeight(report.getOptions().getHeaderHeight());
  
          for (AbstractColumn col : getVisibleColumns()) {
  
              if (col.getTitle() == null)
                  continue;
  
              Style headerStyle = col.getHeaderStyle();
              if (headerStyle == null)
                  headerStyle = report.getOptions().getDefaultHeaderStyle();
  
              this.generateColspanHeader(col, band);
  
              JRDesignExpression expression = new JRDesignExpression();
              JRDesignTextField textField = new JRDesignTextField();
              expression.setText("\"" + col.getTitle() + "\"");
  
              //sets header markup (if any)
              if (col.getHeaderMarkup() != null)
                  textField.setMarkup(col.getHeaderMarkup().toLowerCase());
  
              expression.setValueClass(String.class);
  
              textField.setKey("header_" + col.getTitle());
              textField.setExpression(expression);
  
              if (col.hasParentCol()) {
                  textField.setY(col.getPosY() + band.getHeight() / 2);
                  textField.setHeight(band.getHeight() / 2);
  
              } else {
                  textField.setY(col.getPosY());
                  textField.setHeight(band.getHeight());
              }
  
              textField.setX(col.getPosX());
              textField.setWidth(col.getWidth());
  
              textField.setPrintWhenDetailOverflows(true);
              textField.setBlankWhenNull(true);
  
              applyStyleToElement(headerStyle, textField);
              band.addElement(textField);
          }
      }