diff --git a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/xls/export/helper/AbstractXLSEntityExportHelper.java b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/xls/export/helper/AbstractXLSEntityExportHelper.java
index a8d11335f75f429f1e043a1384f5c73a90ccd8c3..2dd2f06520432d43b285673e918f47f9221cd970 100644
--- a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/xls/export/helper/AbstractXLSEntityExportHelper.java
+++ b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/xls/export/helper/AbstractXLSEntityExportHelper.java
@@ -80,7 +80,7 @@ public abstract class AbstractXLSEntityExportHelper<ENTITY extends IPermIdHolder
             warnings.addAll(addRow(rowNumber++, true, typeExportableKind, typePermId, entityTypeName));
             warnings.addAll(addRow(rowNumber++, false, typeExportableKind, typePermId, typePermId));
 
-            final Attribute[] possibleAttributes = getAttributes(entry.getValue().get(0));
+            final Attribute[] possibleAttributes = getAttributes(entry.getValue());
             final List<PropertyType> propertyTypes = entry.getKey().getPropertyAssignments().stream().map(PropertyAssignment::getPropertyType)
                     .collect(Collectors.toList());
             if (entityTypeExportFieldsMap == null || entityTypeExportFieldsMap.isEmpty() ||
@@ -221,7 +221,7 @@ public abstract class AbstractXLSEntityExportHelper<ENTITY extends IPermIdHolder
 
     protected abstract Function<ENTITY, ENTITY_TYPE> getTypeFunction();
 
-    protected abstract Attribute[] getAttributes(final ENTITY entity);
+    protected abstract Attribute[] getAttributes(final Collection<ENTITY> entities);
 
     protected abstract String getAttributeValue(final ENTITY entity, final Attribute attribute);
 
diff --git a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/xls/export/helper/XLSDataSetExportHelper.java b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/xls/export/helper/XLSDataSetExportHelper.java
index 9c84d374233b7f1fcbbe14207e8ba63701ad33d7..492ada932ecf4fb21957e77083db71cfdfcbba12 100644
--- a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/xls/export/helper/XLSDataSetExportHelper.java
+++ b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/xls/export/helper/XLSDataSetExportHelper.java
@@ -42,9 +42,12 @@ import org.apache.poi.ss.usermodel.Workbook;
 import ch.ethz.sis.openbis.generic.asapi.v3.IApplicationServerApi;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.dataset.DataSet;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.dataset.DataSetType;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.dataset.PhysicalData;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.dataset.fetchoptions.DataSetFetchOptions;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.dataset.id.DataSetPermId;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.experiment.Experiment;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.person.Person;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.Sample;
 import ch.ethz.sis.openbis.generic.server.xls.export.Attribute;
 import ch.ethz.sis.openbis.generic.server.xls.export.ExportableKind;
 import ch.ethz.sis.openbis.generic.server.xls.export.XLSExport;
@@ -116,10 +119,21 @@ public class XLSDataSetExportHelper extends AbstractXLSEntityExportHelper<DataSe
     }
 
     @Override
-    protected Attribute[] getAttributes(final DataSet dataSet)
+    protected Attribute[] getAttributes(final Collection<DataSet> dataSets)
     {
-        return new Attribute[] { PERM_ID, CODE, ARCHIVING_STATUS, PRESENT_IN_ARCHIVE, STORAGE_CONFIRMATION,
-                dataSet.getSample() != null ? SAMPLE : EXPERIMENT, PARENTS, CHILDREN, REGISTRATOR, REGISTRATION_DATE, MODIFIER, MODIFICATION_DATE };
+        final boolean includeSample = dataSets.stream().anyMatch(dataSet -> dataSet.getSample() != null);
+        final boolean includeExperiment = dataSets.stream().anyMatch(dataSet -> dataSet.getSample() == null && dataSet.getExperiment() != null);
+
+        return Stream.concat(
+                Stream.concat(
+                        Stream.of(PERM_ID, CODE, ARCHIVING_STATUS, PRESENT_IN_ARCHIVE, STORAGE_CONFIRMATION),
+                        Stream.ofNullable(includeSample ? SAMPLE : null)
+                ),
+                Stream.concat(
+                        Stream.ofNullable(includeExperiment ? EXPERIMENT : null),
+                        Stream.of(PARENTS, CHILDREN, REGISTRATOR, REGISTRATION_DATE, MODIFIER, MODIFICATION_DATE)
+                )
+        ).toArray(Attribute[]::new);
     }
 
     @Override
@@ -133,15 +147,18 @@ public class XLSDataSetExportHelper extends AbstractXLSEntityExportHelper<DataSe
             }
             case ARCHIVING_STATUS:
             {
-                return dataSet.getPhysicalData().getStatus().toString();
+                final PhysicalData physicalData = dataSet.getPhysicalData();
+                return physicalData != null ? physicalData.getStatus().toString() : null;
             }
             case PRESENT_IN_ARCHIVE:
             {
-                return dataSet.getPhysicalData().isPresentInArchive().toString().toUpperCase();
+                final PhysicalData physicalData = dataSet.getPhysicalData();
+                return physicalData != null ? physicalData.isPresentInArchive().toString().toUpperCase() : null;
             }
             case STORAGE_CONFIRMATION:
             {
-                return dataSet.getPhysicalData().isStorageConfirmation().toString().toUpperCase();
+                final PhysicalData physicalData = dataSet.getPhysicalData();
+                return physicalData != null ? physicalData.isStorageConfirmation().toString().toUpperCase() : null;
             }
             case CODE:
             {
@@ -149,11 +166,14 @@ public class XLSDataSetExportHelper extends AbstractXLSEntityExportHelper<DataSe
             }
             case SAMPLE:
             {
-                return dataSet.getSample().getIdentifier().getIdentifier();
+                final Sample sample = dataSet.getSample();
+                return sample != null ? sample.getIdentifier().getIdentifier() : null;
             }
             case EXPERIMENT:
             {
-                return dataSet.getExperiment().getIdentifier().getIdentifier();
+                final Sample sample = dataSet.getSample();
+                final Experiment experiment = dataSet.getExperiment();
+                return sample == null && experiment != null ? experiment.getIdentifier().getIdentifier() : null;
             }
             case REGISTRATOR:
             {
diff --git a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/xls/export/helper/XLSExperimentExportHelper.java b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/xls/export/helper/XLSExperimentExportHelper.java
index bd81f0798053d19d98501d94aec042844a675c1d..70a4e3cb86ea0604f4de22d3e7039f3269c42bb7 100644
--- a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/xls/export/helper/XLSExperimentExportHelper.java
+++ b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/xls/export/helper/XLSExperimentExportHelper.java
@@ -51,7 +51,7 @@ public class XLSExperimentExportHelper extends AbstractXLSEntityExportHelper<Exp
     }
 
     @Override
-    protected Attribute[] getAttributes(final Experiment entity)
+    protected Attribute[] getAttributes(final Collection<Experiment> entities)
     {
         return new Attribute[] { PERM_ID, IDENTIFIER, CODE, PROJECT, REGISTRATOR, REGISTRATION_DATE, MODIFIER, MODIFICATION_DATE };
     }
diff --git a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/xls/export/helper/XLSSampleExportHelper.java b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/xls/export/helper/XLSSampleExportHelper.java
index a43cf2457a348f29eb0118590f5300b4779225ec..194dec109f482ed726f5642c378bd5ceb37e4790 100644
--- a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/xls/export/helper/XLSSampleExportHelper.java
+++ b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/xls/export/helper/XLSSampleExportHelper.java
@@ -39,11 +39,14 @@ import java.util.stream.Collectors;
 import org.apache.poi.ss.usermodel.Workbook;
 
 import ch.ethz.sis.openbis.generic.asapi.v3.IApplicationServerApi;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.experiment.Experiment;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.person.Person;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.project.Project;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.Sample;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.SampleType;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.fetchoptions.SampleFetchOptions;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.id.SamplePermId;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.space.Space;
 import ch.ethz.sis.openbis.generic.server.xls.export.Attribute;
 import ch.ethz.sis.openbis.generic.server.xls.export.ExportableKind;
 
@@ -86,7 +89,7 @@ public class XLSSampleExportHelper extends AbstractXLSEntityExportHelper<Sample,
     }
 
     @Override
-    protected Attribute[] getAttributes(final Sample entity)
+    protected Attribute[] getAttributes(final Collection<Sample> entities)
     {
         return new Attribute[] { $, AUTO_GENERATE_CODE, PERM_ID, IDENTIFIER, CODE, SPACE, PROJECT, EXPERIMENT, PARENTS, CHILDREN,
                 REGISTRATOR, REGISTRATION_DATE, MODIFIER, MODIFICATION_DATE };
@@ -129,15 +132,18 @@ public class XLSSampleExportHelper extends AbstractXLSEntityExportHelper<Sample,
             }
             case SPACE:
             {
-                return sample.getSpace() != null ? sample.getSpace().getPermId().getPermId() : "";
+                final Space space = sample.getSpace();
+                return space != null ? space.getPermId().getPermId() : null;
             }
             case PROJECT:
             {
-                return sample.getProject() != null ? sample.getProject().getIdentifier().getIdentifier() : "";
+                final Project project = sample.getProject();
+                return project != null ? project.getIdentifier().getIdentifier() : null;
             }
             case EXPERIMENT:
             {
-                return sample.getExperiment() != null ? sample.getExperiment().getIdentifier().getIdentifier() : "";
+                final Experiment experiment = sample.getExperiment();
+                return experiment != null ? experiment.getIdentifier().getIdentifier() : null;
             }
             case PARENTS:
             {
@@ -171,10 +177,6 @@ public class XLSSampleExportHelper extends AbstractXLSEntityExportHelper<Sample,
                 final Date modificationDate = sample.getModificationDate();
                 return modificationDate != null ? DATE_FORMAT.format(modificationDate) : null;
             }
-            case $:
-            {
-                return "";
-            }
             case AUTO_GENERATE_CODE:
             {
                 return "FALSE";