package com.aspose.spreadsheeteditor;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.Serializable;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Logger;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.faces.context.FacesContext;
import javax.faces.view.ViewScoped;
import javax.inject.Inject;
import javax.inject.Named;
import org.primefaces.event.FileUploadEvent;
import org.primefaces.model.DefaultStreamedContent;
import org.primefaces.model.StreamedContent;
/**
*
* @author Saqib Masood
*/
@Named(value = "workbook")
@ViewScoped
public class WorkbookService implements Serializable {
private static final Logger LOGGER = Logger.getLogger(WorkbookService.class.getName());
private String current;
private Format outputFormat = Format.XLSX;
private String sourceUrl;
@Inject
private MessageService msg;
@Inject
private LoaderService loader;
@Inject
private CellsService cells;
@PostConstruct
/*private*/ void init() {
String requestedSourceUrl = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("url");
if (requestedSourceUrl != null) {
try {
this.sourceUrl = new URL(requestedSourceUrl).toString();
this.loadFromUrl();
} catch (MalformedURLException x) {
LOGGER.throwing(null, null, x);
msg.sendMessageDialog("The specified URL is invalid", requestedSourceUrl);
}
}
}
@PreDestroy
/*private*/ void destroy() {
loader.unload(this.current);
cells.removeColumnWidth(this.current);
cells.removeRowHeight(this.current);
cells.removeColumns(this.current);
cells.removeRows(this.current);
}
public boolean isLoaded() {
return this.current != null;
}
public Format getOutputFormat() {
return this.outputFormat;
}
public void setOutputFormat(Format outputFormat) {
this.outputFormat = outputFormat;
}
public void loadBlank() {
this.current = loader.fromBlank();
}
public StreamedContent getOutputFile(int saveFormat) {
if (!isLoaded()) {
return null;
}
byte[] buf;
String ext = getExtensionForSaveFormat(saveFormat);
try {
ByteArrayOutputStream out = new ByteArrayOutputStream();
getAsposeWorkbook().save(out, saveFormat);
buf = out.toByteArray();
} catch (Exception x) {
LOGGER.throwing(null, null, x);
msg.sendMessageDialog("Could not export", x.getMessage());
return null;
}
return new DefaultStreamedContent(new ByteArrayInputStream(buf), "application/octet-stream", "Spreadsheet." + ext);
}
public void loadFromUrl() {
if (this.sourceUrl == null) {
return;
}
this.current = loader.fromUrl(this.sourceUrl);
}
public void onFileUpload(FileUploadEvent e) {
try {
this.current = loader.fromInputStream(e.getFile().getInputstream(), e.getFile().getFileName());
} catch (IOException x) {
LOGGER.throwing(null, null, x);
msg.sendMessage("Could not read the uploaded file", x.getMessage());
}
}
public com.aspose.cells.Workbook getAsposeWorkbook() {
return loader.get(this.current);
}
public com.aspose.cells.WorksheetCollection getAsposeWorksheets() {
return getAsposeWorkbook().getWorksheets();
}
/**
* Get ID of loaded workbook
*
* @return A workbook ID which is acceptable by <code>LoaderService</code>
*/
public String getCurrent() {
return current;
}
public void setCurrent(String id) {
this.current = id;
}
public String getSourceUrl() {
return sourceUrl;
}
public void setSourceUrl(String sourceUrl) {
this.sourceUrl = sourceUrl;
}
public List<String> getSheets() {
List<String> list = new ArrayList<>();
if (this.isLoaded()) {
for (int i = 0; i < getAsposeWorksheets().getCount(); i++) {
list.add(String.valueOf(getAsposeWorksheets().get(i).getName()));
}
}
return list;
}
public String getActiveSheet() {
if (this.isLoaded()) {
int i = getAsposeWorksheets().getActiveSheetIndex();
return getAsposeWorksheets().get(i).getName();
}
return null;
}
/**
* Switch to `name`d sheet. If there does not exist any sheet with the given
* name, the active sheet is renamed to the given name.
*
* The rule is derived from the following use-case.
*
* If the user select a sheet from drop-down menu, this means that the sheet
* already exist. So we can switch to that sheet. If the sheet does not
* exist, we can say that the user has not selected it from drop-down but
* directly modified the name of existing in the input text box.
*
* @param name Worksheet name
*/
public void setActiveSheet(String name) {
com.aspose.cells.Worksheet ws = getAsposeWorksheets().get(name);
if (ws != null) {
int i = ws.getIndex();
getAsposeWorksheets().setActiveSheetIndex(i);
} else {
com.aspose.cells.Workbook wb = getAsposeWorkbook();
wb.getWorksheets().get(wb.getWorksheets().getActiveSheetIndex()).setName(name);
}
purge();
}
public void onAddNewSheet() {
if (isLoaded()) {
try {
int i = getAsposeWorksheets().add();
getAsposeWorksheets().setActiveSheetIndex(i);
purge();
} catch (com.aspose.cells.CellsException cx) {
LOGGER.throwing(null, null, cx);
msg.sendMessage("New Worksheet", cx.getMessage());
}
}
}
public void onRemoveActiveSheet() {
if (isLoaded()) {
try {
int i = getAsposeWorksheets().getActiveSheetIndex();
getAsposeWorksheets().removeAt(i);
if (getAsposeWorksheets().getCount() == 0) {
int j = getAsposeWorksheets().add();
getAsposeWorksheets().setActiveSheetIndex(j);
}
purge();
} catch (com.aspose.cells.CellsException cx) {
LOGGER.throwing(null, null, cx);
msg.sendMessage("Could not remove sheet", cx.getMessage());
}
}
}
public void purge() {
loader.buildCellsCache(this.current);
}
private String getExtensionForSaveFormat(int saveFormat) {
String ext = null;
switch (saveFormat) {
case com.aspose.cells.SaveFormat.EXCEL_97_TO_2003:
ext = "xls";
break;
case com.aspose.cells.SaveFormat.XLSX:
ext = "xlsx";
break;
case com.aspose.cells.SaveFormat.XLSM:
ext = "xlsm";
break;
case com.aspose.cells.SaveFormat.XLSB:
ext = "xlsb";
break;
case com.aspose.cells.SaveFormat.XLTX:
ext = "xltx";
break;
case com.aspose.cells.SaveFormat.XLTM:
ext = "xltm";
break;
case com.aspose.cells.SaveFormat.SPREADSHEET_ML:
ext = "xml";
break;
case com.aspose.cells.SaveFormat.PDF:
ext = "pdf";
break;
case com.aspose.cells.SaveFormat.ODS:
ext = "ods";
break;
default:
}
return ext;
}
}