首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Apache POI中获取Excel空白单元格值?

如何在Apache POI中获取Excel空白单元格值?
EN

Stack Overflow用户
提问于 2011-02-08 12:45:23
回答 9查看 103.4K关注 0票数 43

我有一个巨大的excel文件,里面有很多列,看起来像这样:

代码语言:javascript
运行
复制
Column1 Column2 Column3 Column4 Column5
abc             def             ghi
        mno             pqr
......

这是我用来打印这些值的代码:

代码语言:javascript
运行
复制
try {
    FileInputStream inputStr = new FileInputStream(fileName);
    XSSFWorkbook xssfWork = new XSSFWorkbook(inputStr) ;
    XSSFSheet sheet1 = xssfWork.getSheetAt(0);
    Iterator rowItr = sheet1.rowIterator();

    while ( rowItr.hasNext() ) {
        XSSFRow row = (XSSFRow) rowItr.next();
        System.out.println("ROW:-->");
        Iterator cellItr = row.cellIterator();

        while ( cellItr.hasNext() ) {
            XSSFCell cell = (XSSFCell) cellItr.next();
            System.out.println("CELL:-->"+cell.toString());
        }
    }
} catch (Exception e) {
    e.printStackTrace();
}

此代码生成的输出为:-

代码语言:javascript
运行
复制
ROW:-->
CELL:-->Column1
CELL:-->Column2
CELL:-->Column3
CELL:-->Column4
CELL:-->Column5
ROW:-->
CELL:-->abc
CELL:-->def
CELL:-->ghi
ROW:-->
CELL:-->mno
CELL:-->pqr

因此,如果我们查看上面的输出,我们可以注意到POI库没有选取我留下空值的单元格,有没有一种方法可以将这些值作为null。或者是一种识别显示的值跳过了空白单元格的方法?

谢谢。

EN

回答 9

Stack Overflow用户

发布于 2011-07-13 22:50:28

如果你想得到所有的单元格,不管它们是否存在,那么迭代器不适合你。取而代之的是,您需要手动获取适当的单元,很可能是缺少单元策略

代码语言:javascript
运行
复制
for(Row row : sheet) {
   for(int cn=0; cn<row.getLastCellNum(); cn++) {
       // If the cell is missing from the file, generate a blank one
       // (Works by specifying a MissingCellPolicy)
       Cell cell = row.getCell(cn, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK);
       // Print the cell for debugging
       System.out.println("CELL: " + cn + " --> " + cell.toString());
   }
}

the Apache POI documentation on iterating over cells中有更多关于这一切的详细信息

票数 71
EN

Stack Overflow用户

发布于 2011-03-09 09:48:30

同样的问题也让我很沮丧。这是我在poi-3.7-20101029和poi-3.8中找到的结果。

RowIterator和CellIterator不支持迭代空单元格或行--仅支持物理定义的单元格(可以为空)。

返回我期望的结果的解决方案需要使用从0开始的Row.getCell([int], Row.CREATE_NULL_AS_BLANK),就像Chavira的答案所暗示的那样(假设有8个单元格行)。或者,您可以在迭代时使用Cell.columnIndex值来检查跳跃数字...

令人恼火的是,在使用方法#1创建空单元格之后,迭代器将返回现在创建的空单元格。我认为CellIterator忽略MissingCellPolicy是一个错误。

票数 14
EN

Stack Overflow用户

发布于 2011-07-14 15:50:04

原因很简单: Excel文件可以包含尽可能多的行和列,因此返回所有可用的空白行和列将使单元格变得巨大且占用大量内存。

假设您有一个10x10的工作表,在Excel中,它不是“确切的”10x10,因为您可以很容易地用空白单元格添加11x10,那么POI是否应该返回第11列?

完成请求的一种方法是使用HSSFCell.getColumnIndex()

示例:

代码语言:javascript
运行
复制
//Assuming your have a 2 dimensional array.
String[][] values = ......;// It is assigned

POIFSFileSystem fileSystem = new POIFSFileSystem(new FileInputStream(fileName));
HSSFWorkbook workbook = new HSSFWorkbook(fileSystem);

//Going through every worksheet.
for (int sheetPos = 0; sheetPos < workbook.getNumberOfSheets(); sheetPos++) {
    HSSFSheet sheet = workbook.getSheetAt(sheetPos);

    int rowPos = 0;
    Iterator<Row> rows = sheet.rowIterator();
    while (rows.hasNext()) {
        HSSFRow row = (HSSFRow) rows.next();

        Iterator<Cell> cells = row.cellIterator();
        while (cells.hasNext()) {
            HSSFCell cell = (HSSFCell) cells.next();
            String value = "";

            switch (cell.getCellType()) {
                case HSSFCell.CELL_TYPE_NUMERIC:
                    value = BigDecimal.valueOf(cell.getNumericCellValue()).toPlainString();
                    break;

                case HSSFCell.CELL_TYPE_STRING:
                    value = cell.getStringCellValue();
                    break;

                case HSSFCell.CELL_TYPE_BLANK:
                    value = "";
                    break;

                case HSSFCell.CELL_TYPE_FORMULA:
                    value = cell.getCellFormula();
                    break;

                default:
                    break;
            }

            values[rowPos][cell.getColumnIndex()] = value;
        }

        rowPos++;
    }
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4929646

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档