计算数据矩阵xlsx

时间:2017-08-03 10:05:46

标签: java excel apache-poi

我在excel文档中有3列数据。 例如,在中间列上,有一些没有数据的空格。

我已经按行按排序方式创建了一个对象来检索数据。

我遇到的问题是我无法将空单元格存储为空,在我的对象中,并且我在这个问题上丢失了数据。 就像在下面的示例中一样,我只从每列中写入内容的行中获取数据。如果一列为空,则不返回任何内容。

enter image description here

我以通用方式获取单元格值:

public static Object getCellValue(Cell cell)
{

    Object cellValue = null;
    if(cell.getCellTypeEnum() == CellType.STRING){

        cellValue = cell.getStringCellValue();

    }else if(cell.getCellTypeEnum() == CellType.NUMERIC){

        cellValue = cell.getNumericCellValue();

    }else if(cell.getCellTypeEnum() == CellType.BOOLEAN){

        cellValue = cell.getBooleanCellValue();

    }else if(cell.getCellTypeEnum() == CellType.BLANK){

        cellValue = "";

    }
    return cellValue;

}

创建单元格对象。例如,对输出进行排序非常重要:第1列第1行必须严格分配到同一行的第2列和第3列。即使单元格为空/空,我必须按顺序保留它们,在数据矩阵内。

public class ColumnsOrder {

 private String fristColumn;
 private String secondColumn;
 private String thirdColumn;

 public ColumnsOrder() {

 }

 public ColumnsOrder(String fristColumn) {
    super();
    this.fristColumn = fristColumn;
 }

 public ColumnsOrder(String fristColumn, String secondColumn) {
    super();
    this.fristColumn = fristColumn;
    this.secondColumn = secondColumn;
 }

 public ColumnsOrder(String fristColumn, String secondColumn,
        String thirdColumn) {
    super();
    this.fristColumn = fristColumn;
    this.secondColumn = secondColumn;
    this.thirdColumn = thirdColumn;
 }

 public String getFristColumn() {
    return fristColumn;
 }

 public String getSecondColumn() {
    return secondColumn;
 }

 public String getThirdColumn() {
    return thirdColumn;
 }

}

我在这里从xlsx中取出数据,可能在这里我做错了。

for( rowIndex = rowStart; rowIndex <= rowEnd; rowIndex++ ) {

                Cell cellOne = null;
                Cell cellTwo = null;
                Cell cellThree = null;

                row = sheet.getRow( rowIndex );

                if (row != null ) {
// getting data from each column
                            cellOne     =  (Cell) (( !CheckIfCellIsEmpty.isCellEmpty( row.getCell(0) ) ) ? row.getCell(0) : "" );
                            cellTwo     =  (Cell) (( !CheckIfCellIsEmpty.isCellEmpty( row.getCell(1) ) ) ? row.getCell(1) : " ");
                            cellThree   =  (Cell) (( !CheckIfCellIsEmpty.isCellEmpty( row.getCell(2) ) ) ? row.getCell(2) : " ");

                            // Creating the object using its constructor
                            columnsExcelTemp.add( new ColumnsOrder( 
                                                                    (String)GetCellValue.getCellValue(cellOne), 
                                                                    (String)GetCellValue.getCellValue(cellTwo),
                                                                    (String)GetCellValue.getCellValue(cellThree) 
                                                                  ) 
                                                );
    }
workbook.close();
}

检查isEmpty函数是否

public static boolean isCellEmpty(final Cell cell) 
{

    if (cell == null )
    {
        return true;
    }

    /*
    if ( cell.getCellTypeEnum() == CellType.BLANK ) { 
        return false;
    }

    if (cell.getCellTypeEnum() == CellType.STRING) 
    {
        return false;
    }

    if( cell.getStringCellValue().isEmpty() )
    {
        return false;
    }
    */

    return false;

}

2 个答案:

答案 0 :(得分:1)

问题是,您在Excel工作表中看到的空单元格可以是具有类似值的单元格,也可能不存在于Excel中。如果你使用row.getCell(),总是检查它是否为null!

答案 1 :(得分:0)

似乎我已经用Apache POI库中的内置函数解决了这个问题。

                            cellOne     =  row.getCell( 0, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK );
                            cellTwo     =  row.getCell( 1, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK );
                            cellThree   =  row.getCell( 2, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK );

Row.MissingCellPolicy.CREATE_NULL_AS_BLANK 作为第二个参数添加,为表格中的空单元格提供BLANK值,从而解决了实际问题。

如果有人需要Java帮助--Apache POI,请在此处给我发表评论。