/** * Copyright 2012 Universitat Pompeu Fabra. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * */ package org.onexus.website.api.widgets.download.formats; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.CreationHelper; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.onexus.collection.api.Collection; import org.onexus.collection.api.Field; import org.onexus.collection.api.IEntity; import org.onexus.collection.api.IEntityTable; import org.onexus.collection.api.utils.QueryUtils; import org.onexus.resource.api.IResourceManager; import org.onexus.resource.api.ORI; import org.onexus.website.api.WebsiteApplication; import javax.inject.Inject; import java.io.IOException; import java.io.OutputStream; import java.util.Iterator; import java.util.List; import java.util.Map; public class ExcelFormat extends AbstractFormat { @Inject private IResourceManager resourceManager; public ExcelFormat() { super("xls", "application/vnd.ms-excel", "Microsoft Excel file (max. 50000 rows)"); } @Override public Long getMaxRowsLimit() { return Long.valueOf(50000); } @Override public void write(IEntityTable result, OutputStream out) throws IOException { Workbook wb = new HSSFWorkbook(); CreationHelper createHelper = wb.getCreationHelper(); Sheet sheet = wb.createSheet("new sheet"); // Header row int rowIndex = 0; Row row = sheet.createRow(rowIndex); writeHeader(row, createHelper, result); while (result.next()) { rowIndex++; row = sheet.createRow(rowIndex); writeRow(row, result); } // Write the output to a file wb.write(out); } private void writeHeader(Row header, CreationHelper helper, IEntityTable table) { Iterator<Map.Entry<String, List<String>>> selectIt = table.getQuery().getSelect().entrySet().iterator(); int cell = 0; while (selectIt.hasNext()) { Map.Entry<String, List<String>> select = selectIt.next(); ORI collectionUri = QueryUtils.getCollectionOri(table.getQuery(), select.getKey()); Collection collection = getResourceManager().load(Collection.class, collectionUri); Iterator<String> fieldId = select.getValue().iterator(); while (fieldId.hasNext()) { Field field = collection.getField(fieldId.next()); if (field == null) { continue; } String label = field.getLabel(); if (label == null) { label = field.getId(); } header.createCell(cell).setCellValue(helper.createRichTextString(label)); cell++; } } } private void writeRow(Row row, IEntityTable table) { Iterator<Map.Entry<String, List<String>>> selectIt = table.getQuery().getSelect().entrySet().iterator(); int cell = 0; while (selectIt.hasNext()) { Map.Entry<String, List<String>> select = selectIt.next(); ORI collectionUri = QueryUtils.getCollectionOri(table.getQuery(), select.getKey()); IEntity entity = table.getEntity(collectionUri); Iterator<String> fieldId = select.getValue().iterator(); while (fieldId.hasNext()) { String field = fieldId.next(); Object value = entity.get(field); if (value != null) { if (value instanceof Number) { Number number = (Number) value; row.createCell(cell).setCellValue(number.doubleValue()); } else { row.createCell(cell).setCellValue(String.valueOf(value)); } } cell++; } } } private IResourceManager getResourceManager() { if (resourceManager == null) { WebsiteApplication.inject(this); } return resourceManager; } }