我正在尝试使用apache poi读取excel文件(xls)文件。在那里,在读取行期间,如果缺少一个单元格(cellIterator)正在跳过该单元格并将下一个值放入不同的标题。
A B C
1 2 3
4空白6
在上述情况下,它将6个放入' B'空白单元格中的列,我需要B作为空白字符串。
`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();
}
}
`
这是代码段。我试过了workbook.setMissingCellPolicy(Row.CREATE_NULL_AS_BLANK);但它不起作用。 有什么建议吗?
答案 0 :(得分:1)
我使用了行的迭代器来逐行读取行,使rowIterator类成为级别,然后使用for循环迭代列并对行数据进行完全控制并将策略设置为'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;
}
}
}
apache poi的有用链接。
答案 1 :(得分:0)
使用POI 3.10工作的简化代码。下面的代码返回表单数据列表,适用于具有NULL值的单元格。
/**
* 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;
}