Skip to content

Commit 66f22ad

Browse files
committed
implement new pivot single widget export
(cherry picked from commit e131d6d)
1 parent 593c5ea commit 66f22ad

9 files changed

Lines changed: 667 additions & 554 deletions

File tree

knowage-core/src/main/java/it/eng/knowage/dashboardexport/DashboardExportResource.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
package it.eng.knowage.dashboardexport;
22

3+
import it.eng.knowage.commons.multitenant.OrganizationImageManager;
34
import it.eng.knowage.engine.api.export.dashboard.excel.DashboardExcelExporter;
45
import it.eng.knowage.engine.api.export.dashboard.pdf.DashboardPdfExporter;
6+
import it.eng.spagobi.tenant.TenantManager;
57
import it.eng.spagobi.utilities.exceptions.SpagoBIRuntimeException;
68
import it.eng.spagobi.utilities.mime.MimeUtils;
79
import it.eng.spagobi.utilities.rest.RestUtilities;
@@ -38,7 +40,7 @@ public void downloadExcel(@Context HttpServletRequest req) {
3840
JSONObject body = RestUtilities.readBodyAsJSONObject(req);
3941
String token = request.getHeader(TOKEN_HEADER);
4042
String userId = token.substring(7);
41-
DashboardExcelExporter excelExporter = new DashboardExcelExporter(userId, body);
43+
DashboardExcelExporter excelExporter = new DashboardExcelExporter(userId, body, OrganizationImageManager.getOrganizationB64ImageWide(TenantManager.getTenant().getName()));
4244
String mimeType = excelExporter.getMimeType();
4345

4446
if (!MimeUtils.isValidMimeType(mimeType))
@@ -47,7 +49,11 @@ public void downloadExcel(@Context HttpServletRequest req) {
4749
if (mimeType != null) {
4850
byte[] data;
4951
boolean isDashboardSingleWidgetExport = !body.has("widgets");
50-
data = excelExporter.getDashboardBinaryData(body, isDashboardSingleWidgetExport);
52+
if (isDashboardSingleWidgetExport && body.getString("type").equals("static-pivot-table")) {
53+
data = excelExporter.getPivotBinaryData(body);
54+
} else {
55+
data = excelExporter.getDashboardBinaryData(body, isDashboardSingleWidgetExport);
56+
}
5157
if (!isDashboardSingleWidgetExport) {
5258
String documentLabel = body.getJSONObject("document").getString("label");
5359
response.setHeader("Content-Disposition", "attachment; fileName=" + documentLabel + ".xlsx");

knowage-export/src/main/java/it/eng/knowage/engine/api/export/dashboard/DashboardExporter.java

Lines changed: 448 additions & 5 deletions
Large diffs are not rendered by default.

knowage-export/src/main/java/it/eng/knowage/engine/api/export/dashboard/excel/DashboardExcelExporter.java

Lines changed: 69 additions & 525 deletions
Large diffs are not rendered by default.
Lines changed: 114 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,52 +1,154 @@
11
package it.eng.knowage.engine.api.export.dashboard.excel.exporters;
22

3+
import it.eng.knowage.commons.multitenant.OrganizationImageManager;
34
import it.eng.knowage.engine.api.export.IWidgetExporter;
45
import it.eng.knowage.engine.api.export.dashboard.excel.DashboardExcelExporter;
56
import it.eng.spagobi.commons.SingletonConfig;
7+
import it.eng.spagobi.tenant.TenantManager;
68
import it.eng.spagobi.utilities.exceptions.SpagoBIRuntimeException;
79
import org.apache.log4j.Logger;
8-
import org.apache.poi.ss.usermodel.Sheet;
10+
import org.apache.poi.ss.SpreadsheetVersion;
11+
import org.apache.poi.ss.usermodel.DataConsolidateFunction;
912
import org.apache.poi.ss.usermodel.Workbook;
13+
import org.apache.poi.ss.util.AreaReference;
14+
import org.apache.poi.ss.util.CellReference;
15+
import org.apache.poi.xssf.streaming.SXSSFSheet;
16+
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
17+
import org.apache.poi.xssf.usermodel.XSSFPivotTable;
18+
import org.apache.poi.xssf.usermodel.XSSFSheet;
19+
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
1020
import org.json.JSONArray;
21+
import org.json.JSONException;
1122
import org.json.JSONObject;
1223

1324
import java.util.Map;
1425

26+
import static org.apache.poi.ss.usermodel.DataConsolidateFunction.*;
27+
1528
public class DashboardPivotExporter extends GenericDashboardWidgetExporter implements IWidgetExporter {
1629

1730
public static Logger logger = Logger.getLogger(DashboardPivotExporter.class);
1831

19-
public DashboardPivotExporter(DashboardExcelExporter excelExporter, Workbook wb, JSONObject widget, String documentName, Map<String, Map<String, JSONArray>> selections, JSONObject drivers, JSONObject parameters, String userUniqueIdentifier) {
20-
super(excelExporter, wb, widget, documentName, selections, drivers, parameters, userUniqueIdentifier);
32+
public DashboardPivotExporter(DashboardExcelExporter excelExporter, JSONObject widget, String documentName, Map<String, Map<String, JSONArray>> selections, JSONObject drivers, JSONObject parameters, String userUniqueIdentifier, String imageB64) {
33+
super(excelExporter, null, widget, documentName, selections, drivers, parameters, userUniqueIdentifier, imageB64);
2134
}
2235

23-
@Override
24-
public int export() {
36+
public Workbook exportPivot() {
2537
String widgetId = widget.optString("id");
2638
try {
2739
JSONObject settings = widget.getJSONObject("settings");
28-
String dashboardSheetName = documentName != null ? documentName : "Dashboard";
2940
String widgetName = getJsonObjectUtils().replacePlaceholderIfPresent(getJsonObjectUtils().getDashboardWidgetName(widget), drivers);
30-
Sheet sheet = excelExporter.createUniqueSafeSheet(wb, widgetName, dashboardSheetName);
3141

3242
int offset = 0;
3343
int fetchSize = Integer.parseInt(SingletonConfig.getInstance().getConfigValue("SPAGOBI.API.DATASET.MAX_ROWS_NUMBER"));
3444
JSONObject dataStore = getDataStoreForDashboardWidget(widget, offset, fetchSize, selections, drivers, parameters);
3545
if (dataStore != null) {
46+
String imageB64 = OrganizationImageManager.getOrganizationB64ImageWide(TenantManager.getTenant().getName());
47+
3648
int totalNumberOfRows = dataStore.getInt("results");
49+
XSSFWorkbook xssfWorkbook = new XSSFWorkbook();
50+
XSSFSheet xssfSheet = xssfWorkbook.createSheet("Source_sheet");
51+
52+
excelExporter.fillTableSheetWithData(dataStore, xssfWorkbook, xssfSheet, widgetName, offset, settings);
53+
54+
XSSFSheet pivotSheet = xssfWorkbook.createSheet("Pivot_sheet");
55+
56+
int startRow = 0;
57+
float rowHeight = 35; // in points
58+
int rowspan = 2;
59+
int startCol = 0;
60+
int colWidth = 25;
61+
int colspan = 2;
62+
int namespan = 10;
63+
int dataspan = 10;
64+
65+
createBrandedHeaderSheet(
66+
pivotSheet,
67+
imageB64,
68+
startRow,
69+
rowHeight,
70+
rowspan,
71+
startCol,
72+
colWidth,
73+
colspan,
74+
namespan,
75+
dataspan,
76+
"Dashboard",
77+
widgetName);
78+
79+
80+
int xssfSheetLastRowNum = xssfSheet.getLastRowNum();
81+
int sourceSheetLastColumn = xssfSheet.getRow(xssfSheetLastRowNum).getLastCellNum();
82+
String lastColLetter = CellReference.convertNumToColString(sourceSheetLastColumn - 1);
83+
84+
boolean isImagePresent = imageB64 != null;
85+
XSSFPivotTable pivotTable = pivotSheet.createPivotTable(
86+
new AreaReference(isImagePresent? new CellReference("Source_sheet!A4") : new CellReference("Source_sheet!A2"),
87+
new CellReference("Source_sheet!" + lastColLetter + (totalNumberOfRows + (isImagePresent ? 3 : 1))), //make the reference big enough for later data
88+
SpreadsheetVersion.EXCEL2007),
89+
new CellReference("A5"));
90+
91+
formatPivot(pivotTable);
92+
93+
SXSSFWorkbook swb = new SXSSFWorkbook(xssfWorkbook);
94+
SXSSFSheet ssheet = swb.getSheet("Source_sheet");
95+
3796
while (offset < totalNumberOfRows) {
38-
excelExporter.fillTableSheetWithData(dataStore, wb, sheet, widgetName, offset, settings);
3997
offset += fetchSize;
4098
dataStore = getDataStoreForDashboardWidget(widget, offset, fetchSize, selections, drivers, parameters);
99+
excelExporter.fillTableSheetWithData(dataStore, swb, ssheet, widgetName, offset, settings);
41100
}
42-
excelExporter.createPivotTable(wb, sheet, widget, widgetName);
43-
return 1;
101+
102+
return swb;
44103
}
45104
} catch (Exception e) {
46105
throw new SpagoBIRuntimeException("Unable to export table widget: " + widgetId, e);
47106
}
48-
return 0;
107+
return null;
49108
}
50109

110+
private void formatPivot(XSSFPivotTable pivotTable) {
111+
try {
112+
JSONObject fields = widget.getJSONObject("fields");
113+
JSONArray columns = fields.getJSONArray("columns");
114+
JSONArray rows = fields.getJSONArray("rows");
115+
JSONArray data = fields.getJSONArray("data");
116+
117+
int counter = 0;
51118

52-
}
119+
for (int i = 0; i < columns.length(); ++i) {
120+
pivotTable.addRowLabel(counter);
121+
counter++;
122+
}
123+
124+
for (int i = 0; i < rows.length(); ++i) {
125+
pivotTable.addRowLabel(counter);
126+
counter++;
127+
}
128+
129+
for (int i = 0; i < data.length(); ++i) {
130+
JSONObject datum = data.getJSONObject(i);
131+
DataConsolidateFunction function = getAggregationFunction(datum.getString("aggregation").toUpperCase());
132+
pivotTable.addColumnLabel(function, counter, datum.getString("alias"));
133+
counter++;
134+
}
135+
136+
} catch (JSONException e) {
137+
logger.error("Error while creating pivot table", e);
138+
}
139+
}
140+
141+
private DataConsolidateFunction getAggregationFunction(String aggregation) {
142+
143+
return switch (aggregation) {
144+
case "SUM" -> SUM;
145+
case "COUNT" -> COUNT;
146+
case "AVG" -> AVERAGE;
147+
case "MAX" -> MAX;
148+
case "MIN" -> MIN;
149+
default -> null;
150+
};
151+
}
152+
153+
154+
}

knowage-export/src/main/java/it/eng/knowage/engine/api/export/dashboard/excel/exporters/DashboardTableExporter.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@
1515
public class DashboardTableExporter extends GenericDashboardWidgetExporter implements IWidgetExporter {
1616
public static Logger logger = Logger.getLogger(DashboardTableExporter.class);
1717

18-
public DashboardTableExporter(DashboardExcelExporter excelExporter, Workbook wb, JSONObject widget, String documentName, Map<String, Map<String, JSONArray>> selections, JSONObject drivers, JSONObject parameters, String userUniqueIdentifier) {
19-
super(excelExporter, wb, widget, documentName, selections, drivers, parameters, userUniqueIdentifier);
18+
public DashboardTableExporter(DashboardExcelExporter excelExporter, Workbook wb, JSONObject widget, String documentName, Map<String, Map<String, JSONArray>> selections, JSONObject drivers, JSONObject parameters, String userUniqueIdentifier, String imageB64) {
19+
super(excelExporter, wb, widget, documentName, selections, drivers, parameters, userUniqueIdentifier, imageB64);
2020
}
2121

2222
@Override

knowage-export/src/main/java/it/eng/knowage/engine/api/export/dashboard/excel/exporters/DashboardWidgetExporterFactory.java

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,22 @@
1313
public class DashboardWidgetExporterFactory {
1414
public static Logger logger = Logger.getLogger(WidgetExporterFactory.class);
1515

16-
public static IWidgetExporter getExporter(DashboardExcelExporter exporter, Workbook wb, JSONObject widget, String documentName, Map<String, Map<String, JSONArray>> selections, JSONObject drivers, JSONObject parameters, String userUniqueIdentifier) {
16+
public static IWidgetExporter getExporter(DashboardExcelExporter exporter,
17+
Workbook wb,
18+
JSONObject widget,
19+
String documentName,
20+
Map<String, Map<String, JSONArray>> selections,
21+
JSONObject drivers,
22+
JSONObject parameters,
23+
String userUniqueIdentifier,
24+
String imageB64) {
1725
if (widget.optString("type").equalsIgnoreCase("table")) {
18-
return new DashboardTableExporter(exporter, wb, widget, documentName, selections, drivers, parameters, userUniqueIdentifier);
26+
return new DashboardTableExporter(exporter, wb, widget, documentName, selections, drivers, parameters, userUniqueIdentifier, imageB64);
1927
} else if (widget.optString("type").equalsIgnoreCase("static-pivot-table")) {
20-
return new DashboardPivotExporter(exporter, wb, widget, documentName, selections, drivers, parameters, userUniqueIdentifier);
28+
return new DashboardPivotExporter(exporter, widget, documentName, selections, drivers, parameters, userUniqueIdentifier, imageB64);
2129
}
2230
else {
23-
return new GenericDashboardWidgetExporter(exporter, wb, widget, documentName, selections, drivers, parameters, userUniqueIdentifier);
31+
return new GenericDashboardWidgetExporter(exporter, wb, widget, documentName, selections, drivers, parameters, userUniqueIdentifier, imageB64);
2432
}
2533
}
2634
}

knowage-export/src/main/java/it/eng/knowage/engine/api/export/dashboard/excel/exporters/GenericDashboardWidgetExporter.java

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,16 @@ class GenericDashboardWidgetExporter extends DashboardExporter implements IWidge
3939
JSONObject drivers;
4040
JSONObject parameters;
4141

42-
public GenericDashboardWidgetExporter(DashboardExcelExporter excelExporter, Workbook wb, JSONObject widget, String documentName, Map<String, Map<String, JSONArray>> selections, JSONObject drivers, JSONObject parameters, String userUniqueIdentifier) {
43-
super(userUniqueIdentifier);
42+
public GenericDashboardWidgetExporter(DashboardExcelExporter excelExporter,
43+
Workbook wb,
44+
JSONObject widget,
45+
String documentName,
46+
Map<String, Map<String, JSONArray>> selections,
47+
JSONObject drivers,
48+
JSONObject parameters,
49+
String userUniqueIdentifier,
50+
String imageB64) {
51+
super(userUniqueIdentifier, imageB64);
4452
this.excelExporter = excelExporter;
4553
this.wb = wb;
4654
this.widget = widget;

knowage-export/src/main/java/it/eng/knowage/engine/api/export/dashboard/pdf/DashboardPdfExporter.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ public class DashboardPdfExporter extends DashboardExporter {
4343
private float[] columnPercentWidths;
4444

4545
public DashboardPdfExporter(String userUniqueIdentifier, JSONObject body) {
46-
super(userUniqueIdentifier);
46+
super(userUniqueIdentifier, null);
4747
locale = getLocaleFromBody(body);
4848
}
4949

knowagecockpitengine/src/main/java/it/eng/knowage/engine/cockpit/api/page/PageResource.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,9 @@
5454
import javax.ws.rs.core.MediaType;
5555
import javax.ws.rs.core.Response;
5656

57+
import it.eng.knowage.commons.multitenant.OrganizationImageManager;
5758
import it.eng.knowage.engine.api.export.dashboard.excel.DashboardExcelExporter;
59+
import it.eng.spagobi.tenant.TenantManager;
5860
import org.apache.commons.lang3.StringUtils;
5961
import org.apache.http.client.utils.URIBuilder;
6062
import org.apache.logging.log4j.LogManager;
@@ -377,7 +379,7 @@ private Response openPageSpreadsheetInternal(String pageName)
377379
String userId = request.getParameter("user_id");
378380
String documentLabel = request.getParameter("DOCUMENT_LABEL");
379381

380-
DashboardExcelExporter excelExporter = new DashboardExcelExporter(getIOManager().getTemplateAsJSONObject(), role, requestURL, organization, userId);
382+
DashboardExcelExporter excelExporter = new DashboardExcelExporter(getIOManager().getTemplateAsJSONObject(), role, requestURL, organization, userId, OrganizationImageManager.getOrganizationB64ImageWide(TenantManager.getTenant().getName()));
381383
String mimeType = excelExporter.getMimeType();
382384
byte[] data = excelExporter.getScheduledBinaryData(documentLabel);
383385

0 commit comments

Comments
 (0)