Skip to content

Commit

Permalink
feat: export multiple feature type to Excel
Browse files Browse the repository at this point in the history
HALE studio supports selecting multiple feature types for export to Excel.
Each selected feature type is added as a separate sheet in a single Excel workbook.

#1032
  • Loading branch information
emanuelaepure10 committed Jul 12, 2023
1 parent 5d33569 commit 0745856
Show file tree
Hide file tree
Showing 6 changed files with 341 additions and 57 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -45,4 +45,9 @@ public class InstanceTableIOConstants {
*/
public static final String EXPORT_TYPE = "selectedExportType";

/**
* Parameter for exporting empty feature types to XLS Export
*/
public static final String EXPORT_EMPTY_FEATURETYPES = "emptyFeatureTypes";

}
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
import static org.junit.Assert.assertTrue;

import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

Expand Down Expand Up @@ -157,9 +158,7 @@ public void testWriteComplexSchema() throws Exception {
Sheet sheet = wb.getSheetAt(0);

checkHeader(sheet, header);

checkSheetName(sheet, "person");

checkFirstDataRow(sheet, firstDataRow);
}

Expand Down Expand Up @@ -209,6 +208,49 @@ public void testWriteNotNestedProperties() throws Exception {
checkFirstDataRow(sheet, firstDataRow);
}

/**
* Test - write data of complex schema and analyze result
*
* @throws Exception , if an error occurs
*/
@Test
public void testExportMultiFeatureToExcel() throws Exception {
ArrayList<InstanceCollection> examples = new ArrayList<>();
TransformationExample example = TransformationExamples
.getExample(TransformationExamples.SIMPLE_COMPLEX);
TransformationExample example2 = TransformationExamples
.getExample(TransformationExamples.CARDINALITY_MOVE);
examples.add(example.getTargetInstances());
examples.add(example2.getTargetInstances());

// set instances to xls instance writer
XLSInstanceWriter writer = new XLSInstanceWriter();
IContentType contentType = HalePlatform.getContentTypeManager()
.getContentType("eu.esdihumboldt.hale.io.xls.xls");
writer.setParameter(InstanceTableIOConstants.SOLVE_NESTED_PROPERTIES, Value.of(false));
writer.setParameter(InstanceTableIOConstants.USE_SCHEMA, Value.of(false));
writer.setParameter(InstanceTableIOConstants.EXPORT_EMPTY_FEATURETYPES, Value.of(true));

File tmpFile = tmpFolder.newFile("excelWith2Sheets.xls");
// write instances to a temporary XLS file
writer.setTarget(new FileIOSupplier(tmpFile));
writer.setContentType(contentType);

for (InstanceCollection instanceCollection : examples) {
writer.setInstances(instanceCollection);
}
System.out.println("XLSInstanceWriterTest.testExportMultiFeatureToExcel()");

IOReport report = writer.execute(null);
Workbook wb;
// https: // poi.apache.org/components/spreadsheet/quick-guide.html#FileInputStream
try (POIFSFileSystem fs = new POIFSFileSystem(tmpFile)) {
wb = new HSSFWorkbook(fs.getRoot(), true);
}
int sheetNumber = wb.getNumberOfSheets();
assertEquals(examples.size(), sheetNumber);
}

/**
*
* @param sheet the excel file sheet
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,19 @@ Bundle-SymbolicName: eu.esdihumboldt.hale.io.xls.ui;singleton:=true
Bundle-Version: 5.1.0.qualifier
Require-Bundle: org.eclipse.ui,
org.eclipse.core.runtime,
eu.esdihumboldt.hale.ui
eu.esdihumboldt.hale.ui,
eu.esdihumboldt.hale.common.instance
Bundle-RequiredExecutionEnvironment: JavaSE-1.8
Import-Package: de.fhg.igd.eclipse.util.extension,
de.fhg.igd.slf4jplus,
eu.esdihumboldt.hale.common.core.io,
eu.esdihumboldt.hale.common.core.io.project.model,
eu.esdihumboldt.hale.common.core.io.supplier,
eu.esdihumboldt.hale.common.instance.io,
eu.esdihumboldt.hale.common.schema,
eu.esdihumboldt.hale.common.schema.io,
eu.esdihumboldt.hale.common.schema.model,
eu.esdihumboldt.hale.common.schema.model.constraint.type,
eu.esdihumboldt.hale.io.csv,
eu.esdihumboldt.hale.io.csv.ui,
eu.esdihumboldt.hale.io.xls,
Expand Down
2 changes: 1 addition & 1 deletion io/plugins/eu.esdihumboldt.hale.io.xls.ui/plugin.xml
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
</provider>
</configPage>
<configPage
class="eu.esdihumboldt.hale.io.csv.ui.InstanceExportConfigurationPage"
class="eu.esdihumboldt.hale.io.xls.ui.XLSInstanceExportConfigurationPage"
order="0">
<provider
ref="eu.esdihumboldt.hale.io.xls.writer.instance">
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,200 @@
/*
* Copyright (c) 2023 wetransform GmbH
*
* All rights reserved. This program and the accompanying materials are made
* available under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation, either version 3 of the License,
* or (at your option) any later version.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this distribution. If not, see <http://www.gnu.org/licenses/>.
*
* Contributors:
* wetransform GmbH <http://www.wetransform.to>
*/

package eu.esdihumboldt.hale.io.xls.ui;

import java.util.ArrayList;
import java.util.Collection;

import javax.xml.namespace.QName;

import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.CheckStateChangedEvent;
import org.eclipse.jface.viewers.CheckboxTableViewer;
import org.eclipse.jface.viewers.ICheckStateListener;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Table;
import org.eclipse.ui.PlatformUI;

import eu.esdihumboldt.hale.common.core.io.Value;
import eu.esdihumboldt.hale.common.instance.io.InstanceWriter;
import eu.esdihumboldt.hale.common.schema.model.TypeDefinition;
import eu.esdihumboldt.hale.io.csv.InstanceTableIOConstants;
import eu.esdihumboldt.hale.io.csv.ui.InstanceExportConfigurationPage;

/**
* Configuration page for exporting Excel
*
* @author Emanuela Epure
*/
public class XLSInstanceExportConfigurationPage extends InstanceExportConfigurationPage {

private CheckboxTableViewer featureTypeTable;
private Button selectAll = null;
private Button exportEmptyData = null;
private Group chooseFeatureTypes;
private Table table;

/**
*
*/
public XLSInstanceExportConfigurationPage() {
super();
}

/**
* @see eu.esdihumboldt.hale.io.csv.ui.InstanceExportConfigurationPage#createContent(org.eclipse.swt.widgets.Composite)
*/
@Override
protected void createContent(Composite page) {
this.page = page;

page.setLayout(new GridLayout(1, false));

solveNestedProperties = new Button(page, SWT.CHECK);
solveNestedProperties.setText("Solve nested properties");
solveNestedProperties.setSelection(true);

useSchema = new Button(page, SWT.CHECK);
useSchema.setText("Use the source schema for the order of the exported columns");
useSchema.setSelection(true);

GridDataFactory groupData = GridDataFactory.fillDefaults().grab(true, false);
chooseFeatureTypes = new Group(page, SWT.NONE);
chooseFeatureTypes.setLayout(new GridLayout(1, false));
chooseFeatureTypes.setText("Choose your Type you want to export");
groupData.applyTo(chooseFeatureTypes);

page.pack();

// wait for selected type
setPageComplete(false);
}

/**
* @see eu.esdihumboldt.hale.io.csv.ui.InstanceExportConfigurationPage#onShowPage(boolean)
*/
@Override
protected void onShowPage(boolean firstShow) {
if (firstShow) {

exportEmptyData = new Button(chooseFeatureTypes, SWT.CHECK);
exportEmptyData.setText("Ignore feature types without data");
exportEmptyData.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 2, 1));

exportEmptyData.addSelectionListener(new SelectionAdapter() {

@Override
public void widgetSelected(SelectionEvent e) {
}
});
exportEmptyData.setSelection(false);

selectAll = new Button(chooseFeatureTypes, SWT.CHECK);
selectAll.setText("Select all");
selectAll.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 2, 1));

selectAll.addSelectionListener(new SelectionAdapter() {

@Override
public void widgetSelected(SelectionEvent e) {
featureTypeTable.setAllChecked(((Button) e.getSource()).getSelection());
page.layout();
page.pack();
setPageComplete(validate());
}
});

table = new Table(chooseFeatureTypes, SWT.CHECK | SWT.MULTI | SWT.SCROLL_PAGE);
table.setHeaderVisible(false);
table.setLinesVisible(false);
table.setBackground(
PlatformUI.getWorkbench().getDisplay().getSystemColor(SWT.COLOR_GRAY));
GridDataFactory groupData = GridDataFactory.fillDefaults().grab(true, false);
groupData.applyTo(table);

featureTypeTable = new CheckboxTableViewer(table);
featureTypeTable.setLabelProvider(new LabelProvider() {

@Override
public String getText(Object element) {
return ((TypeDefinition) element).getDisplayName();
}

});
featureTypeTable.setContentProvider(ArrayContentProvider.getInstance());

Collection<? extends TypeDefinition> relevantTypes = getWizard().getProvider()
.getTargetSchema().getMappingRelevantTypes();

ArrayList<QName> tableContent = new ArrayList<>();
for (TypeDefinition typeDefinition : relevantTypes) {
tableContent.add(typeDefinition.getName());
}

featureTypeTable.setInput(relevantTypes);

featureTypeTable.addCheckStateListener(new ICheckStateListener() {

@Override
public void checkStateChanged(CheckStateChangedEvent event) {
page.layout();
page.pack();
setPageComplete(validate());
}
});

page.layout();
page.pack();
}
}

private boolean validate() {
return (featureTypeTable.getCheckedElements().length > 0);
}

/**
* @see eu.esdihumboldt.hale.io.csv.ui.InstanceExportConfigurationPage#updateConfiguration(eu.esdihumboldt.hale.common.instance.io.InstanceWriter)
*/
@Override
public boolean updateConfiguration(InstanceWriter provider) {
provider.setParameter(InstanceTableIOConstants.SOLVE_NESTED_PROPERTIES,
Value.of(solveNestedProperties.getSelection()));
provider.setParameter(InstanceTableIOConstants.USE_SCHEMA,
Value.of(useSchema.getSelection()));

provider.setParameter(InstanceTableIOConstants.EXPORT_EMPTY_FEATURETYPES,
Value.of(exportEmptyData.getSelection()));

Object[] elements = featureTypeTable.getCheckedElements();
String param = "";
for (Object el : elements) {
param = param + ((TypeDefinition) el).getName().toString() + ",";
}
provider.setParameter(InstanceTableIOConstants.EXPORT_TYPE, Value.of(param));

return true;
}

}
Loading

0 comments on commit 0745856

Please sign in to comment.