aboutsummaryrefslogtreecommitdiff
path: root/src/org/traccar/reports/Events.java
diff options
context:
space:
mode:
authorAbyss777 <abyss@fox5.ru>2016-10-17 14:02:23 +0500
committerAbyss777 <abyss@fox5.ru>2016-10-17 14:02:23 +0500
commitc613143105d9f7c898dd3fb236d683b76cf8a42c (patch)
tree0facff2ac16b5d0067fc651fd5024aa2b668ebaf /src/org/traccar/reports/Events.java
parent83ca0476167d91f16f18ae3cc532d56cd97f743e (diff)
downloadtrackermap-server-c613143105d9f7c898dd3fb236d683b76cf8a42c.tar.gz
trackermap-server-c613143105d9f7c898dd3fb236d683b76cf8a42c.tar.bz2
trackermap-server-c613143105d9f7c898dd3fb236d683b76cf8a42c.zip
- Implement export reports to excel
- Migrate csv export to /api/positions
Diffstat (limited to 'src/org/traccar/reports/Events.java')
-rw-r--r--src/org/traccar/reports/Events.java87
1 files changed, 80 insertions, 7 deletions
diff --git a/src/org/traccar/reports/Events.java b/src/org/traccar/reports/Events.java
index ed7e9e411..9f58e1bf4 100644
--- a/src/org/traccar/reports/Events.java
+++ b/src/org/traccar/reports/Events.java
@@ -16,16 +16,36 @@
*/
package org.traccar.reports;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
import java.sql.SQLException;
+import java.util.ArrayList;
import java.util.Collection;
+import java.util.Comparator;
import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.SortedSet;
+import java.util.TreeSet;
import javax.json.Json;
import javax.json.JsonArrayBuilder;
+import org.jxls.area.Area;
+import org.jxls.builder.xls.XlsCommentAreaBuilder;
+import org.jxls.common.CellRef;
+import org.jxls.formula.StandardFormulaProcessor;
+import org.jxls.transform.Transformer;
+import org.jxls.transform.poi.PoiTransformer;
+import org.jxls.util.TransformerFactory;
import org.traccar.Context;
+import org.traccar.model.Device;
import org.traccar.model.Event;
-import org.traccar.web.CsvBuilder;
+import org.traccar.model.Geofence;
+import org.traccar.model.Group;
+import org.traccar.reports.model.DeviceReport;
import org.traccar.web.JsonConverter;
public final class Events {
@@ -47,16 +67,69 @@ public final class Events {
return json.build().toString();
}
- public static String getCsv(long userId, Collection<Long> deviceIds, Collection<Long> groupIds,
- Collection<String> types, Date from, Date to) throws SQLException {
- CsvBuilder csv = new CsvBuilder();
- csv.addHeaderLine(new Event());
+ public static void getExcel(OutputStream outputStream,
+ long userId, Collection<Long> deviceIds, Collection<Long> groupIds,
+ Collection<String> types, Date from, Date to) throws SQLException, IOException {
+ ArrayList<DeviceReport> devicesEvents = new ArrayList<>();
+ ArrayList<String> sheetNames = new ArrayList<>();
+ HashMap<Long, String> geofenceNames = new HashMap<>();
for (long deviceId: ReportUtils.getDeviceList(deviceIds, groupIds)) {
Context.getPermissionsManager().checkDevice(userId, deviceId);
+ SortedSet<Event> eventReports = new TreeSet<Event>(new Comparator<Event>() {
+ @Override
+ public int compare(Event e1, Event e2) {
+ return e1.getServerTime().compareTo(e2.getServerTime());
+ }
+ });
for (String type : types) {
- csv.addArray(Context.getDataManager().getEvents(deviceId, type, from, to));
+ Collection<Event> events = Context.getDataManager().getEvents(deviceId, type, from, to);
+ for (Event event : events) {
+ long geofenceId = event.getGeofenceId();
+ if (geofenceId != 0) {
+ Geofence geofence = Context.getGeofenceManager().getGeofence(geofenceId);
+ if (geofence != null) {
+ geofenceNames.put(geofenceId, geofence.getName());
+ } else {
+ geofenceNames.put(geofenceId, Long.toString(geofenceId));
+ }
+ }
+ eventReports.add(event);
+ }
+ }
+ if (!eventReports.isEmpty()) {
+ DeviceReport deviceEvents = new DeviceReport();
+ Device device = Context.getIdentityManager().getDeviceById(deviceId);
+ deviceEvents.setDeviceName(device.getName());
+ sheetNames.add(deviceEvents.getDeviceName());
+ if (device.getGroupId() != 0) {
+ Group group = Context.getDeviceManager().getGroupById(device.getGroupId());
+ if (group != null) {
+ deviceEvents.setGroupName(group.getName());
+ }
+ }
+ deviceEvents.setObjects(eventReports);
+ devicesEvents.add(deviceEvents);
+ }
+ }
+ String templatePath = Context.getConfig().getString("report.events.template.excel",
+ "templates/export/events.xlsx");
+ try (InputStream inputStream = new FileInputStream(templatePath)) {
+ org.jxls.common.Context jxlsContext = PoiTransformer.createInitialContext();
+ jxlsContext.putVar("devices", devicesEvents);
+ jxlsContext.putVar("sheetNames", sheetNames);
+ jxlsContext.putVar("geofenceNames", geofenceNames);
+ jxlsContext.putVar("from", from);
+ jxlsContext.putVar("to", to);
+ jxlsContext.putVar("bracketsRegex", "[\\{\\}\"]");
+ Transformer transformer = TransformerFactory.createTransformer(inputStream, outputStream);
+ List<Area> xlsAreas = new XlsCommentAreaBuilder(transformer).build();
+ for (Area xlsArea : xlsAreas) {
+ xlsArea.applyAt(new CellRef(xlsArea.getStartCellRef().getCellName()), jxlsContext);
+ xlsArea.setFormulaProcessor(new StandardFormulaProcessor());
+ xlsArea.processFormulas();
}
+ transformer.deleteSheet(xlsAreas.get(0).getStartCellRef().getSheetName());
+ transformer.write();
}
- return csv.build();
}
}