问题
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