code: File appendSheet(final List<WorksheetContent> worksheetContents) throws IOException {
          final ImmutableSet<String> worksheetNames = FluentIterable.from(worksheetContents)
                  .transform(new Function<WorksheetContent, String>() {
                      @Nullable @Override public String apply(@Nullable final WorksheetContent worksheetContent) {
                          return worksheetContent.getSpec().getSheetName();
                      }
                  }).toSet();
          if(worksheetNames.size() < worksheetContents.size()) {
              throw new IllegalArgumentException("Sheet names must have distinct names");
          }
          for (final String worksheetName : worksheetNames) {
              if(worksheetName.length() > 30) {
                  throw new IllegalArgumentException(
                          String.format("Sheet name cannot exceed 30 characters (invalid name: '%s')",
                                  worksheetName));
              }
          }
  
          final XSSFWorkbook workbook = new XSSFWorkbook();
          final File tempFile =
                  File.createTempFile(ExcelConverter.class.getName(), UUID.randomUUID().toString() + XLSX_SUFFIX);
          final FileOutputStream fos = new FileOutputStream(tempFile);
  
          for (WorksheetContent worksheetContent : worksheetContents) {
              final WorksheetSpec spec = worksheetContent.getSpec();
              appendSheet(workbook, worksheetContent.getDomainObjects(), spec.getFactory(), spec.getSheetName());
          }
          workbook.write(fos);
          fos.close();
          return tempFile;
      }
docs: //////////////////////////////////////