package com.brightgenerous.jxl.delegate; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import jxl.Cell; import jxl.FormulaCell; import jxl.NumberFormulaCell; import jxl.Workbook; import jxl.WorkbookSettings; import jxl.biff.formula.FormulaException; import jxl.read.biff.BiffException; import jxl.write.Label; import jxl.write.WritableSheet; import jxl.write.WritableWorkbook; import jxl.write.WriteException; class JxlDelegaterImpl implements JxlDelegater { { check(); } private static void check() { try { Class.forName(jxl.Cell.class.getName()); Class.forName(jxl.FormulaCell.class.getName()); Class.forName(jxl.NumberFormulaCell.class.getName()); Class.forName(jxl.Workbook.class.getName()); Class.forName(jxl.WorkbookSettings.class.getName()); Class.forName(jxl.biff.formula.FormulaException.class.getName()); Class.forName(jxl.read.biff.BiffException.class.getName()); Class.forName(jxl.write.Label.class.getName()); Class.forName(jxl.write.WritableSheet.class.getName()); Class.forName(jxl.write.WritableWorkbook.class.getName()); Class.forName(jxl.write.WriteException.class.getName()); } catch (ClassNotFoundException e) { throw new RuntimeException(e); } } @Override public InputStream wrap(InputStream inputStream) throws IOException { return wrap(inputStream, true); } public InputStream wrap(InputStream inputStream, boolean defaultIsEmpty) throws IOException { ByteArrayInputStream ret; Workbook workbook = null; try { workbook = jxl.Workbook.getWorkbook(inputStream); ByteArrayOutputStream baos = new ByteArrayOutputStream(); WritableWorkbook writableWorkbook = null; try { WorkbookSettings settings = new WorkbookSettings(); settings.setWriteAccess(null); writableWorkbook = Workbook.createWorkbook(baos, workbook, settings); for (WritableSheet sheet : writableWorkbook.getSheets()) { final int rows = sheet.getRows(); for (int r = 0; r < rows; r++) { Cell[] cells = sheet.getRow(r); final int cols = cells.length; for (int c = 0; c < cols; c++) { Cell cell = cells[c]; String contents = cell.getContents(); if (cell instanceof FormulaCell) { boolean empty = false; if (cell instanceof NumberFormulaCell) { if ((contents == null) || (contents.length() == 0) || (defaultIsEmpty && contents.equals("0"))) { empty = true; } } else { if ((contents == null) || (contents.length() == 0)) { empty = true; } } if (empty) { try { contents = ((FormulaCell) cell).getFormula(); } catch (FormulaException e) { } } if ((contents != null) && (0 < contents.length())) { try { sheet.addCell(new Label(c, r, contents)); } catch (WriteException e) { } } } } } } writableWorkbook.write(); } finally { if (writableWorkbook != null) { try { writableWorkbook.close(); } catch (WriteException e) { } } } ret = new ByteArrayInputStream(baos.toByteArray()); } catch (BiffException e) { throw new IOException(e); } finally { if (workbook != null) { workbook.close(); } } return ret; } }