Example usage for org.apache.poi.ss.usermodel DataFormatter formatCellValue

List of usage examples for org.apache.poi.ss.usermodel DataFormatter formatCellValue

Introduction

In this page you can find the example usage for org.apache.poi.ss.usermodel DataFormatter formatCellValue.

Prototype

public String formatCellValue(Cell cell, FormulaEvaluator evaluator) 

Source Link

Document

Returns the formatted value of a cell as a String regardless of the cell type.

Usage

From source file:org.wise.portal.presentation.web.controllers.run.MergeSpreadsheetsController.java

License:Open Source License

@RequestMapping(method = RequestMethod.POST)
protected ModelAndView onSubmit(@RequestParam("uploadFile") MultipartFile uploadFile,
        @RequestParam("mergeColumnTitle") String mergeColumnTitle, HttpServletResponse response)
        throws Exception {

    // TODO: this line is saving uploadFile to home directory. Can we do without saving to home directory?
    File file = multipartToFile(uploadFile);
    String mergedResultFileName = "merged_" + file.getName();
    FileInputStream fis = new FileInputStream(file);

    // Finds the workbook instance of XLSX file
    XSSFWorkbook workbook = new XSSFWorkbook(fis);
    DataFormatter objDefaultFormat = new DataFormatter();
    FormulaEvaluator objFormulaEvaluator = new XSSFFormulaEvaluator((XSSFWorkbook) workbook);

    // number of sheets in the workbook
    int numberOfSheets = workbook.getNumberOfSheets();

    // contains all values of the merge column across all sheets
    ArrayList<String> mergeColumnValues = new ArrayList<String>();

    // maps mergeColumn value to a Map<SheetIndex, ArrayList<Row>>
    HashMap<String, HashMap<Integer, ArrayList<Row>>> mergeColumnValueToSheetRows = new HashMap<String, HashMap<Integer, ArrayList<Row>>>();

    // maps sheet index to the headers in that sheet
    HashMap<Integer, ArrayList<String>> sheetIndexToSheetColumnHeaders = new HashMap<Integer, ArrayList<String>>();

    // how many copies of headers need to be created for each sheet
    HashMap<Integer, Integer> sheetIndexToMaxSheetRowCount = new HashMap<Integer, Integer>();

    // loop through the sheets in the workbook and populate the variables
    for (int sheetIndex = 0; sheetIndex < numberOfSheets; sheetIndex++) {
        XSSFSheet sheet = workbook.getSheetAt(sheetIndex);

        int mergeColumnIndex = -1; // index of the merge column in this sheet
        int rowIteratorIndex = 0; // index of current row iteration

        // collect all of the merge column rows in each sheet
        Iterator<Row> rowIterator = sheet.rowIterator();

        int maxSheetRowCountForCurrentSheet = 0;
        while (rowIterator.hasNext()) {
            Row row = (Row) rowIterator.next();
            if (rowIteratorIndex == 0) {
                // for the very first row in this sheet, go through all the cells in the top row and add to sheetColumnHeaders
                // and add it to sheetIndexToSheetColumnHeaders
                ArrayList<String> sheetColumnHeaders = new ArrayList<String>();

                int rowCellIteratorIndex = 0;
                Iterator<Cell> topRowCellIterator = row.cellIterator();
                while (topRowCellIterator.hasNext()) {
                    Cell topRowCell = topRowCellIterator.next();
                    String topRowCellString = topRowCell.toString();
                    if (!topRowCellString.isEmpty()) {
                        sheetColumnHeaders.add(topRowCellString);
                    }/*w w  w . j a  v a2  s .  com*/
                    if (!topRowCellString.isEmpty() && topRowCellString.equals(mergeColumnTitle)) {
                        // this is the mergeColumn. Remember the column index
                        if (mergeColumnIndex == -1) {
                            mergeColumnIndex = rowCellIteratorIndex;
                        } else {
                            // there are multiple mergeColumnTitles in this sheet. Let the user know and exit
                            ModelAndView mav = new ModelAndView("/admin/run/mergespreadsheets");
                            mav.addObject("errorMsg", "You have multiple columns titled \"" + mergeColumnTitle
                                    + "\" in worksheet #" + (sheetIndex + 1)
                                    + ". You can have only one merge column per worksheet. Please fix and try again.");
                            return mav;
                        }
                    }
                    rowCellIteratorIndex++;
                }
                sheetIndexToSheetColumnHeaders.put(sheetIndex, sheetColumnHeaders);
            } else {
                // for rows that are not the top row (header)
                // 1. get all the mergeColumnValues
                // 2. populate mergeColumnValueToSheetRows
                // 3. calculate sheetIndexToMaxSheetRowCount
                Cell mergeColumnValueCell = row.getCell(mergeColumnIndex);
                if (mergeColumnValueCell != null && !mergeColumnValueCell.toString().isEmpty()) {

                    objFormulaEvaluator.evaluate(mergeColumnValueCell);
                    String mergeColumnValueString = objDefaultFormat.formatCellValue(mergeColumnValueCell,
                            objFormulaEvaluator);

                    HashMap<Integer, ArrayList<Row>> sheetIndexToSheetRows = mergeColumnValueToSheetRows
                            .get(mergeColumnValueString);
                    if (sheetIndexToSheetRows == null) {
                        sheetIndexToSheetRows = new HashMap<Integer, ArrayList<Row>>();
                        mergeColumnValueToSheetRows.put(mergeColumnValueString, sheetIndexToSheetRows);
                    }
                    ArrayList<Row> sheetRows = sheetIndexToSheetRows.get(sheetIndex);
                    if (sheetRows == null) {
                        sheetRows = new ArrayList<>();
                        sheetIndexToSheetRows.put(sheetIndex, sheetRows);
                    }
                    sheetRows.add(row);
                    if (sheetRows.size() > maxSheetRowCountForCurrentSheet) {
                        maxSheetRowCountForCurrentSheet = sheetRows.size();
                    }

                    Iterator<Cell> rowCellIterator = row.cellIterator();
                    int rowCellIteratorIndex = 0;
                    while (rowCellIterator.hasNext()) {
                        Cell rowCell = rowCellIterator.next();
                        if (rowCellIteratorIndex == mergeColumnIndex) {
                            // this is a merge column cell, so add its value to mergeColumnValues
                            if (!rowCell.toString().isEmpty()) {
                                objFormulaEvaluator.evaluate(rowCell);
                                String rowCellValueString = objDefaultFormat.formatCellValue(rowCell,
                                        objFormulaEvaluator);
                                if (!mergeColumnValues.contains(rowCellValueString)) {
                                    mergeColumnValues.add(rowCellValueString);
                                }
                            }
                        }
                        rowCellIteratorIndex++;
                    }
                }
            }
            rowIteratorIndex++;
        }
        sheetIndexToMaxSheetRowCount.put(sheetIndex, maxSheetRowCountForCurrentSheet);
    }

    // Now we are ready to make the merge sheet. We will be writing one row at a time.

    Workbook wb = new XSSFWorkbook(); // new output workbook
    Sheet mergedSheet = wb.createSheet("merged"); // output merged result in "merged" sheet

    // make the header row
    Row headerRow = mergedSheet.createRow(0);

    // (0,0) will be the merge cell header. Column 0 will contain mergeColumnValues.
    Cell mergeColumnHeaderCell = headerRow.createCell(0);
    mergeColumnHeaderCell.setCellValue(mergeColumnTitle);

    // current column index "cursor" where we will be writing to
    int cellIndexWithoutMergeColumn = 1;

    // make the header row
    for (int sheetIndex = 0; sheetIndex < numberOfSheets; sheetIndex++) {

        Integer maxSheetRowCount = sheetIndexToMaxSheetRowCount.get(sheetIndex);
        ArrayList<String> sheetColumnHeaders = sheetIndexToSheetColumnHeaders.get(sheetIndex);
        XSSFSheet sheet = workbook.getSheetAt(sheetIndex);
        String sheetName = sheet.getSheetName();

        for (int i = 0; i < maxSheetRowCount; i++) {
            for (int sheetColumnHeaderIndex = 0; sheetColumnHeaderIndex < sheetColumnHeaders
                    .size(); sheetColumnHeaderIndex++) {
                String sheetColumnHeader = sheetColumnHeaders.get(sheetColumnHeaderIndex);
                if (!sheetColumnHeader.isEmpty() && !sheetColumnHeader.equals(mergeColumnTitle)) {
                    String newSheetColumnHeader = sheetColumnHeader + " ( " + sheetName + " " + (i + 1) + " ) ";
                    Cell headerCell = headerRow.createCell(cellIndexWithoutMergeColumn);
                    headerCell.setCellValue(newSheetColumnHeader);
                    cellIndexWithoutMergeColumn++;
                }
            }
        }
    }

    // now make all the non-header rows
    for (int mergeColumnValueIndex = 0; mergeColumnValueIndex < mergeColumnValues
            .size(); mergeColumnValueIndex++) {
        String mergeColumnValue = mergeColumnValues.get(mergeColumnValueIndex);
        HashMap<Integer, ArrayList<Row>> mergeColumnValueSheetRow = mergeColumnValueToSheetRows
                .get(mergeColumnValue);
        if (mergeColumnValueSheetRow == null) {
            System.out.println("Null mergeColumnValueSheetRow, continuing. mergeColumnValueIndex: "
                    + mergeColumnValueIndex + " mergeColumnValue: " + mergeColumnValue);
            continue;
        }

        Row row = mergedSheet.createRow(mergeColumnValueIndex + 1); // + 1 is to account for the header row;

        // reset current cursor as we make each row
        cellIndexWithoutMergeColumn = 0;

        // first column will be the merge column value
        Cell mergeColumnCell = row.createCell(0);
        mergeColumnCell.setCellValue(mergeColumnValue);
        cellIndexWithoutMergeColumn++;

        for (int sheetIndex = 0; sheetIndex < numberOfSheets; sheetIndex++) {
            ArrayList<Row> sheetRows = mergeColumnValueSheetRow.get(sheetIndex);
            int currentSheetSheetRowIndex = 0;
            ArrayList<String> sheetHeaders = sheetIndexToSheetColumnHeaders.get(sheetIndex);

            if (sheetRows != null) {
                for (int sheetRowIndex = 0; sheetRowIndex < sheetRows.size(); sheetRowIndex++) {
                    Row sheetRow = sheetRows.get(sheetRowIndex);
                    for (int sheetHeaderIndex = 0; sheetHeaderIndex < sheetHeaders.size(); sheetHeaderIndex++) {
                        String sheetHeader = sheetHeaders.get(sheetHeaderIndex);
                        if (!sheetHeader.equals(mergeColumnTitle)) {
                            Cell cell = sheetRow.getCell(sheetHeaderIndex);
                            Cell exportCell = row.createCell(cellIndexWithoutMergeColumn);
                            objFormulaEvaluator.evaluate(cell);
                            String cellString = objDefaultFormat.formatCellValue(cell, objFormulaEvaluator);
                            exportCell.setCellValue(cellString);
                            cellIndexWithoutMergeColumn++;
                        }
                    }
                    currentSheetSheetRowIndex++;
                }
            }

            // some columns do not have any values to populate, so populate them with empty cells
            Integer maxSheetRowCount = sheetIndexToMaxSheetRowCount.get(sheetIndex);
            while (currentSheetSheetRowIndex < maxSheetRowCount) {
                for (int i = 0; i < sheetHeaders.size(); i++) {
                    String sheetHeader = sheetHeaders.get(i);
                    if (!sheetHeader.isEmpty() && !sheetHeader.equals(mergeColumnTitle)) {
                        Cell exportCell = row.createCell(cellIndexWithoutMergeColumn);
                        exportCell.setCellValue("");
                        cellIndexWithoutMergeColumn++;
                    }
                }
                currentSheetSheetRowIndex++;
            }
        }
    }

    // write to response output
    response.setHeader("Content-Disposition", "attachment; filename=\"" + mergedResultFileName + "\"");
    ServletOutputStream outputStream = response.getOutputStream();
    wb.write(outputStream);
    fis.close();

    return null;
}

From source file:swift.selenium.WebHelper.java

License:Open Source License

/**
 * This method reads and returns data from each cell of a provided worksheet
 * /*from  w  w  w.j  a v  a  2s  .co  m*/
 * @param reqValue
 * @param reqSheet
 * @param rowIndex
 * @param inputHashTable
 * @return
 * @throws IOException
 */
@SuppressWarnings("null")
public static String getCellData(String reqValue, HSSFSheet reqSheet, int rowIndex,
        HashMap<String, Object> inputHashTable) throws IOException {
    HSSFCell reqCell = null;
    Object actualvalue = null;
    String req = "";
    DataFormatter fmt = new DataFormatter();

    if (inputHashTable.isEmpty() == true) {
        inputHashTable = getValueFromHashMap(reqSheet);
    }
    HSSFRow rowActual = reqSheet.getRow(rowIndex);
    if (inputHashTable.get(reqValue) == null) {

        TransactionMapping.report.setStrMessage("Column " + reqValue + " not Found. Please Check input Sheet");
        TransactionMapping.pauseFun("Column " + reqValue + " not Found. Please Check input Sheet");
    } else {
        actualvalue = inputHashTable.get(reqValue);//rowHeader.getCell(colIndex).toString();         
        if (actualvalue != null) {
            int colIndex = Integer.parseInt(actualvalue.toString());
            reqCell = rowActual.getCell(colIndex);
            //TM 27-04-2015: Updated the code for formula in cells
            if (reqCell == null) {
                System.out.println(reqValue + " is Null");
            } else {
                HSSFWorkbook wb = reqCell.getSheet().getWorkbook(); //TM-05/05/2015: Get workbook instance from the worksheet
                HSSFFormulaEvaluator.evaluateAllFormulaCells(wb); //TM-05/05/2015: To refresh all the formulas in the worksheet
                FormulaEvaluator evaluator = wb.getCreationHelper().createFormulaEvaluator();

                CellValue cellValue = evaluator.evaluate(reqCell);
                int type = 0;
                if (cellValue != null) {
                    type = cellValue.getCellType();
                } else {
                    type = reqCell.getCellType();
                }

                switch (type) {
                case HSSFCell.CELL_TYPE_BLANK:
                    req = "";
                    break;
                case HSSFCell.CELL_TYPE_NUMERIC:
                    if (DateUtil.isCellDateFormatted(reqCell)) {
                        SimpleDateFormat form = new SimpleDateFormat(
                                Automation.configHashMap.get("DATEFORMAT").toString());
                        req = form.format(reqCell.getDateCellValue());
                    } else
                        req = fmt.formatCellValue(reqCell, evaluator);
                    break;
                case HSSFCell.CELL_TYPE_STRING:
                    req = reqCell.getStringCellValue();
                    break;
                case HSSFCell.CELL_TYPE_BOOLEAN:
                    req = Boolean.toString(reqCell.getBooleanCellValue());
                    break;
                case HSSFCell.CELL_TYPE_ERROR:
                    req = "error";
                    break;
                }
            }
        }

        else {
            req = reqCell.getStringCellValue();
            System.out.println("null");
        }
    }
    return req;
}