Excel表格在java中使用apache poi合并单元格读取

时间:2017-01-04 11:03:29

标签: java excel apache

我正在使用Java中的Apache poi阅读excel表,我正在使用CellRangeAddress来获取该区域。

案例1:如果我提供2-3个数据用于合并和下一个单元格,那么它没问题。 我正在进入下一个合并区域。

案例2:如果我提供的值超过6并进入下一个区域,那么合并区域显示IndexOutofBoundException

此处代码:

List<OrganizationDB> orgList = new ArrayList<OrganizationDB>();
List<EmployeeDB> empList;
XSSFWorkbook workBook;
XSSFSheet excelSheet;
XSSFRow row;
XSSFCell cells;
TreeViewer treeViewer = null;


File excelFile = new File("D:\\ExcelExport\\ExcelSheet2.xls");
FileInputStream fis;

if (excelFile.exists()) {
    fis = new FileInputStream(excelFile);

    workBook = new XSSFWorkbook(fis);
    excelSheet = workBook.getSheetAt(0);

    int count  = 1;     

    while (count <= excelSheet.getLastRowNum()) {               

        CellRangeAddress region = excelSheet.getMergedRegion(count);
        row = excelSheet.getRow(count);
        //XSSFCell cell = row.getCell(0);

        orgDb = new OrganizationDB();

        orgDb.setOrganizationName(row.getCell(0).getStringCellValue());
        orgDb.setCityName(row.getCell(4).getStringCellValue());
        orgDb.setStateName(row.getCell(5).getStringCellValue());

        empList = new ArrayList<EmployeeDB>();

        while(count<=region.getLastRow()) {

            row = excelSheet.getRow(count);
            empDb = new EmployeeDB();

            empDb.setCompanyName(row.getCell(0).getStringCellValue());
            empDb.setEmpID(row.getCell(1).getStringCellValue());
            empDb.setEmpName(row.getCell(2).getStringCellValue());
            empDb.setPhoneNo((int) row.getCell(3).getNumericCellValue());
            empList.add(empDb);
            orgDb.setEmpList(empList);
            count++;
        }
        orgList.add(orgDb);
    }

1 个答案:

答案 0 :(得分:0)

我在你的代码中看到了一个我不完全理解的逻辑。你能检查一下吗? 您有两个嵌套while循环使用的计数器count

while (count <= excelSheet.getLastRowNum()) {
            CellRangeAddress region      = excelSheet.getMergedRegion(count);
...
    while(count<=region.getLastRow()){
...
        count++;

也许有两个合并区域包含第1行到第3行和第4行到第6行,然后在第一次运行顶部while后,您的计数= 3,因为嵌套while增加了它。 然后代码尝试获取mergedRegion(3)和 没有mergedRegion与索引3。 必须将mergedRegion(2)与下一组行合并而不是......

我猜你必须为mergedRegions和行使用不同的计数器。