package org.jboss.seam.excel.csv; import java.util.HashMap; import java.util.List; import java.util.Map; import org.jboss.seam.document.DocumentData; import org.jboss.seam.document.DocumentData.DocumentType; import org.jboss.seam.excel.ExcelWorkbook; import org.jboss.seam.excel.ExcelWorkbookException; import org.jboss.seam.excel.WorksheetItem; import org.jboss.seam.excel.ui.UICell; import org.jboss.seam.excel.ui.UIColumn; import org.jboss.seam.excel.ui.UIHyperlink; import org.jboss.seam.excel.ui.UILink; import org.jboss.seam.excel.ui.UIWorkbook; import org.jboss.seam.excel.ui.UIWorksheet; import org.jboss.seam.excel.ui.command.Command; import org.jboss.seam.log.Log; import org.jboss.seam.log.Logging; /** * @author Daniel Roth (danielc.roth@gmail.com) */ public class CsvExcelWorkbook implements ExcelWorkbook { private int currentColumn = 0; private int currentRow = 0; private int maxRow = 0; private int maxColumn = 0; private int sheetStartRow = 0; private final static String DEFAULT_COLUMN_DELIMITER = "\""; private final static String DEFAULT_COLUMN_DELIMITER_REPLACEMENT = "\"\""; private final static String DEFAULT_LINEBREAK = "\n"; private final static String DEFAULT_COLUMN_SEPERATOR = ","; private Map<String, String> table = null; private String sheetName = null; private Log log = Logging.getLog(getClass()); protected String getColumnDelimeterReplacement() { return DEFAULT_COLUMN_DELIMITER_REPLACEMENT; } protected String getColumnDelimeter() { return DEFAULT_COLUMN_DELIMITER; } protected String getLineBreak() { return DEFAULT_LINEBREAK; } protected String getColumnSeparator() { return DEFAULT_COLUMN_SEPERATOR; } public void createWorkbook(UIWorkbook uiWorkbook) throws ExcelWorkbookException { table = new HashMap<String, String>(); } public void createOrSelectWorksheet(UIWorksheet uiWorksheet) { createOrSelectWorksheet(uiWorksheet.getName(), uiWorksheet.getStartRow(), uiWorksheet.getStartColumn()); } private void createOrSelectWorksheet(String worksheetName, Integer startRow, Integer startColumn) { if (sheetName != null && !sheetName.equals(worksheetName)) { throw new RuntimeException("You cannot export multiple sheet workbooks to excel."); } sheetName = worksheetName; currentColumn = (startColumn == null) ? 0 : startColumn; currentRow = (startRow == null) ? 0 : startRow; sheetStartRow = currentRow; } public byte[] getBytes() { StringBuffer buffer = new StringBuffer(); for (int i = 0; i <= maxRow; i++) { for (int j = 0; j <= maxColumn; j++) { String value = table.get(hash(i, j)); value = (value == null) ? "" : value; if(value.contains(getColumnDelimeter())) value = value.replace(getColumnDelimeter(), getColumnDelimeterReplacement()); //JBSEAM-4187 buffer.append(getColumnDelimeter()).append(value).append(getColumnDelimeter()).append(getColumnSeparator()); } buffer.deleteCharAt(buffer.length() - 1); buffer.append(getLineBreak()); } return buffer.toString().getBytes(); } public void nextColumn() { currentColumn++; currentRow = sheetStartRow; } public DocumentType getDocumentType() { return new DocumentData.DocumentType("csv", "text/csv"); } public void addItem(WorksheetItem item) { switch (item.getItemType()) { case cell: addCell((UICell) item); break; case hyperlink: addHyperLink((UIHyperlink) item); break; case image: log.trace("You cannot export an image to CSV", new Object[0]); break; } } private void addCell(UICell cell) { int row = (cell.getRow() == null) ? currentRow : cell.getRow(); int column = (cell.getColumn() == null) ? currentColumn : cell.getColumn(); addCsvCell(column, row, String.valueOf(cell.getValue())); if (cell.getColumn() == null && cell.getRow() == null) currentRow++; } private void addHyperLink(UIHyperlink link) { int row = (link.getStartRow() == null) ? currentRow : link.getStartRow(); int column = (link.getStartColumn() == null) ? currentColumn : link.getStartColumn(); if (link.getEndColumn() != null || link.getEndRow() != null) log.warn("endColumn/endRow is not supported by csv exporter", new Object[0]); addCsvCell(column, row, String.valueOf(link.getURL())); } private void addCsvCell(int column, int row, String value) throws ExcelWorkbookException { table.put(hash(row, column), value); maxRow = (row > maxRow) ? row : maxRow; maxColumn = (column > maxColumn) ? column : maxColumn; } private String hash(int row, int column) { StringBuffer buffer = new StringBuffer(); buffer.append(row).append(getColumnSeparator()).append(column); return buffer.toString(); } public void applyWorksheetSettings(UIWorksheet uiWorksheet) { log.trace("applyWorksheetSettings() is not supported by CSV exporter", new Object[0]); } public void applyColumnSettings(UIColumn uiColumn) { log.trace("applyColumnSettings() is not supported by CSV exporter", new Object[0]); } public void executeCommand(Command command) { log.trace("executeCommand() is not supported by CSV exporter", new Object[0]); } public void addWorksheetFooter(WorksheetItem item, int colspan) { if (colspan > 0) log.warn("footer colspan are not supported by CSV exporter", new Object[0]); addItem(item); } public void addWorksheetHeader(WorksheetItem item, int colspan) { if (colspan > 0) log.warn("header colspan are not supported by CSV exporter", new Object[0]); addItem(item); } public void setStylesheets(List<UILink> stylesheets) { log.trace("styleSheets are not supported by CSV exporter", new Object[0]); } }