ExcelReader workbook.setMissingCellPolicy(Row.CREATE_NULL_AS_BLANK) is not working

隐身守侯 提交于 2019-12-24 11:35:59

问题


I am trying to read excel file(xls) file using apache poi. In that, during read row if a cell is missing (cellIterator) is skipping that cell and putting the next value to different header.

A B C

1 2 3

4 blank 6

In above case it is putting 6 in 'B' column at blank cell and i need B as blank String.

`package com.howtodoinjava.demo.poi;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;

public class ReadExcelDemo {

    Integer rowNum;
    Iterator<Row> rowIterator;
    HSSFWorkbook workbook;
    HSSFSheet sheet;
    FileInputStream file;

    public ReadExcelDemo(File file1) throws IOException{
         this.file = new FileInputStream(file1);

        // Create Workbook instance holding reference to .xlsx file
        this.workbook = new HSSFWorkbook(file);
        workbook.setMissingCellPolicy(Row.CREATE_NULL_AS_BLANK);

        // Get first/desired sheet from the workbook
     this.sheet = workbook.getSheetAt(0);
    }

    public static void main(String[] args) throws IOException {


        for(int i =0;i<5;i++) {
            List<String> rowData = new ReadExcelDemo(new File(
                    "howtodoinjava_demo_xls.xls")).readRow();
            System.out.println(rowData);
        }

    }

    private List<String> readRow() throws IOException {
        List<String> rowData = new ArrayList<String>();

            // Iterate through each rows one by one
            rowIterator = sheet.iterator();
            if (getNext()) {
                Row row = rowIterator.next();
                // For each row, iterate through all the columns
                Iterator<Cell> cellIterator = row.cellIterator();

                while (cellIterator.hasNext()) {
                    Cell cell = cellIterator.next();
                    // Check the cell type and format accordingly
                    switch (cell.getCellType()) {
                    case Cell.CELL_TYPE_NUMERIC:
                        rowData.add(String.valueOf(cell.getNumericCellValue()));
                        System.out.print(cell.getNumericCellValue() + "\t");
                        break;
                    case Cell.CELL_TYPE_STRING:
                        rowData.add(cell.getStringCellValue());
                        System.out.print(cell.getStringCellValue() + "\t");
                        break;
                    case Cell.CELL_TYPE_BLANK:
                        rowData.add("");
                        System.out.println("");
                    }
                }
                System.out.println("");
            }
            rowNum++;
            close();


        return rowData;
    }

    private void close() throws IOException {
        file.close();
    }

    private boolean getNext() {
        // TODO Auto-generated method stub
        if (null == rowNum) {
            rowNum = 0;
        }
        return rowIterator.hasNext();
    }
}
`

This is the code snippet. I tried workbook.setMissingCellPolicy(Row.CREATE_NULL_AS_BLANK); but it is not working. Any suggestion why it is happening ??


回答1:


I have used iterator for row to read the row one by one,making the rowIterator class level and then using for loop to iterate over columns and to take the full control over row data and set the policy to 'create null as blank'.

final Row row = this.sheet.getRow(rowNum);

if (null != row) {

    int lastColumn = row.getLastCellNum();
    // Removing cellIterator as it was not supporting
    // MissingCellPolicy and doing the column iteration through for
    // loop
    for (int cn = Constants.EMPTY_INT; cn < lastColumn; cn++) {
        Cell cell = row.getCell(cn, Row.CREATE_NULL_AS_BLANK);

        switch (cell.getCellType()) {
        case Cell.CELL_TYPE_NUMERIC:
            addNumericCell(rowData, cell);
            break;
        case Cell.CELL_TYPE_STRING:
            rowData.add(cell.getStringCellValue());
            break;
        case Cell.CELL_TYPE_BLANK:
            rowData.add(Constants.EMPTY_STRING);
            break;
        default:
            break;

        }
    }
}

Useful link for apache poi.




回答2:


Simplified code which works using POI 3.10. Below code return sheet data as List and works for Cell having NULL values.

/**
     * Read XLSx and return sheet data as List
     * 
     * @param inputFile
     * @param sheetNo
     * @return
     * @throws FileNotFoundException
     * @throws IOException
     */
    public static List<String> readXlsxAsList(File inputFile, int sheetNo) throws FileNotFoundException,
            IOException {

        List<String> sheetAsList = new ArrayList<String>();
        /**
         * Get workbook
         */
        XSSFWorkbook wb = new XSSFWorkbook(new FileInputStream(inputFile));
        /**
         * Get sheet
         */
        XSSFSheet sheet = wb.getSheetAt(sheetNo);
        Iterator<Row> rowIterator = sheet.iterator();
        /**
         * Iterate Rows
         */
        while (rowIterator.hasNext()) {
            Row row = rowIterator.next();
            StringBuffer sb = new StringBuffer();
            for (int col = 0; col < row.getLastCellNum(); col++) {
                /**
                 * Create cell to force as BLANK when NULL
                 */
                Cell cell = row.getCell(col, Row.CREATE_NULL_AS_BLANK);
                /**
                 * Force cell type as String
                 */
                cell.setCellType(Cell.CELL_TYPE_STRING);
                /**
                 * Add to buffer
                 */
                sb.append(cell.getStringCellValue() + "|");
            }
            /**
             * Add buffer to list
             */
            sheetAsList.add(sb.toString());
        }
        return sheetAsList;
    }


来源:https://stackoverflow.com/questions/28220489/excelreader-workbook-setmissingcellpolicyrow-create-null-as-blank-is-not-worki

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!