Adding data to an Excel file using jxl

Hurdler picture Hurdler · Mar 11, 2012 · Viewed 11k times · Source

I'm creating an excel file using jxl. At first is should contain only some formatting and information about styles. Then, it should be updated every time someone adds new data to it.

public class WriteExcel {

    private static WritableWorkbook workbook;
    private static WritableCellFormat timesStandard;
    private String inputFile;
    final private static int FONT_SIZE = 12;


    public void setOutputFile(String inputFile) {
        this.inputFile = inputFile;
    }

    private void prepareSheet(WritableSheet sheet) throws WriteException {
        sheet.mergeCells(0, 0, 1, 0);
        sheet.mergeCells(3, 0, 4, 0);
        sheet.mergeCells(6, 0, 7, 0);

        WritableFont times12pt = new WritableFont(WritableFont.TIMES, FONT_SIZE);
        timesStandard = new WritableCellFormat(times12pt);

        CellView cv = new CellView();
        cv.setFormat(timesStandard);
    }

    public void write() throws IOException, WriteException {
        File file = new File(inputFile);
        WorkbookSettings wbSettings = new WorkbookSettings();
        wbSettings.setLocale(new Locale("en", "EN"));       

        WritableWorkbook workbook = Workbook.createWorkbook(file, wbSettings);
        workbook.createSheet("First", 0); 
        WritableSheet excelSheet = workbook.getSheet(0);
        prepareSheet(excelSheet);

        workbook.write();
        workbook.close();
    }

    public static void main(String[] args) throws WriteException, IOException {
        WriteExcel test = new WriteExcel();
        test.setOutputFile("c:/Users/H/Desktop/test.xls");
        test.write();
    }
}

I understand that I need another class that would let me access the file and add some data to it:

class Modify {

    private static Logger logger = Logger.getLogger(Modify.class);
    private File inputWorkbook;
    private File outputWorkbook;

    public Modify(String input, String output) {
        inputWorkbook = new File(input);
        outputWorkbook = new File(output);
        logger.info("Input file:  " + input);
        logger.info("Output file:  " + output);
    }

    public void readWrite() throws IOException, BiffException, WriteException {
        logger.info("Reading...");
        Workbook w1 = Workbook.getWorkbook(inputWorkbook);

        logger.info("Copying...");
        WritableWorkbook w2 = Workbook.createWorkbook(outputWorkbook, w1);

        if (inputWorkbook.getName().equals("test.xls")) {
            modify(w2);
        }

        w2.write();
        w2.close();
        logger.info("Done");
    }

    private void modify(WritableWorkbook w) throws WriteException {
        logger.info("Modifying...");

        WritableSheet sheet = w.getSheet("First");

        //createContent(sheet); // contains methods responsible for adding data, for example:
        addNumber(sheet, cols, rows, 2);

    private static void addNumber(WritableSheet sheet, int column, int row, double d) throws WriteException, RowsExceededException {
        Number number;
        number = new Number(column, row, d, timesStandard);
        sheet.addCell(number);

    }
}

But I end up with a blank Excel file with the merged cells only.

How do I introduce the modifications?

Answer

FrenchFigaro picture FrenchFigaro · Oct 30, 2013

Since you're manipulating a WritableWorkbook object which is not a member of your class for w2, shouldn't you have your modify() method not be void but instead return a WritableWorkbook ?

As I see it, a new one is instanciated when you call modify() but all changes at the end are dropped due to scope.

In the end you'll get something like

    private WritableWorkbook modify(WritableWorkbook w) throws WriteException {
    logger.info("Modifying...");

    WritableSheet sheet = w.getSheet("First");

    //createContent(sheet); // contains methods responsible for adding data, for example:
    addNumber(sheet, cols, rows, 2);
    return sheet;
    }

quite basically. And a similar modification for addNumber seems in order too. Then the respective calls would be sheet = addNumber(sheet, cols, rows, 2); and w2 = modify(w2);