当前位置: 首页 > 知识库问答 >
问题:

Apache POI-在Excel中从应用程序中删除行

宇文曦
2023-03-14

我使用Apache POI libary导入、导出Excel表格到应用程序(tableView)。我有一些问题从应用程序中删除行在Excel。行的移除工作正常,但是如果我移除一行并重新启动应用程序,它会将最后一个条目导入两次。如果我删除了4或5个条目,在重新启动时,最后一个条目将显示4或5次。我认为最后一行的数字将不会保存或更新。删除excel文件中的行工作良好,只有在我的tableview中,在我删除一行并导入文件之后--最后一个条目将显示两次。启动应用程序lastRowNum()=6;->删除一个条目(行)并重新设置导入->lastRowNum()=6;是Excel Bug还是类似的问题?如果有任何帮助,我将不胜感激。多谢.

删除方法:

FileInputStream inp=新的FileInputStream(“.....”);

    HSSFWorkbook wb = (HSSFWorkbook) WorkbookFactory.create(inp);
    HSSFSheet sheet = wb.getSheetAt(0);

    String selectedid = "4";
    int rowIndex = getRowIndexOfId(sheet, selectedid);

    removeRow(sheet, rowIndex);

    inp.close();

    OutputStream out = new FileOutputStream(
            ".........");

    wb.write(out);
    out.close();
}

private static int getRowIndexOfId(HSSFSheet sheet, String selectedid) {
    DataFormatter formatter = new DataFormatter();
    for (Row row : sheet) {
        for (Cell cell : row) {
            if (formatter.formatCellValue(cell).trim().equals(selectedid)) {
                return row.getRowNum();
            }
        }
    }
    return -1;
}

private static void removeRow(HSSFSheet sheet, int rowIndex) {
    if (rowIndex >= 0) {
        sheet.removeRow(sheet.getRow(rowIndex));
        if (rowIndex < sheet.getLastRowNum()) {
            sheet.shiftRows(rowIndex + 1, sheet.getLastRowNum(), -1);
        }
    }

}

导入(不带InputStream和变量):

    Iterator<Row> rows = sheet.iterator();

    System.out.println(sheet.getLastRowNum());

    while (rows.hasNext()) {
        nextRow = rows.next();
        Iterator<Cell> cellIterator = nextRow.cellIterator();

        while (cellIterator.hasNext()) {
            cell = (HSSFCell) cellIterator.next();

            if (nextRow.getRowNum() == 0) {
                nextRow = rows.next();
                continue;
            }

            try {

                if (cell.getCellType() == HSSFCell.CELL_TYPE_STRING
                        || cell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC) {

                    auftragsnr = nextRow.getCell(0).getStringCellValue();
                    empfaenger = nextRow.getCell(1).getStringCellValue();
                    auftrag1 = nextRow.getCell(2).getStringCellValue();
                    beschreibung = nextRow.getCell(3).getStringCellValue();
                    zimmernr = nextRow.getCell(4).getNumericCellValue();
                    datum = nextRow.getCell(5).getDateCellValue();
                    absender = nextRow.getCell(6).getStringCellValue();
                    status = nextRow.getCell(7).getStringCellValue();

                    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy");

                    Instant instant = datum.toInstant();
                    ZonedDateTime zdt = instant.atZone(ZoneId.systemDefault());
                    date = zdt.toLocalDate();

                }

            } catch (NullPointerException e) {
                System.out.println("leer");
            }

        }

        if (nextRow.getRowNum() <= sheet.getLastRowNum()) {

            tableview.add(
                    new Auftrag(auftragsnr, empfaenger, auftrag1, beschreibung, zimmernr, date, absender, status));

            excelFile.close();

        }
    }

}

共有1个答案

籍英叡
2023-03-14

我也遇到了同样的问题,并通过添加行
sheet.createrow(Sheet.GetLastRowNum()+1)解决了这个问题;//调用
Sheet.RemoveRow(removingRow);
后在最后一个位置添加空行

我认为在此上下文中不应太认真地对待GetLastRowNum()方法,因为Excel工作表的想法是,它们应被视为无限制的。

 类似资料:
  • 我修改了一小段代码,但无法运行。我总是发现一个例外: 保存失败:保存包时出错:重复条目:docProps/core.xml 错误抛出在这行: 我认为出现了这个例外,因为我不允许在同一个工作簿上读写,但是如果没有现有的Excel文件,我如何初始化新工作簿? 代码:(来自这里(感谢发起者):如何使用ApachePOI删除行) 和 [编辑2016-06-21]: 我加了 给我的POM,现在它产生了 线程

  • 在Intellij中,可以在同一端口上同时部署多个应用程序(部署在Tomcat实例中配置的应用程序)。在Tomcat start上应该部署的应用程序列表中,您在哪里添加/删除应用程序? Intellij文档这么说,但我找不到它描述的是什么文件。 除其他外,Tomcat配置文件可能会列出应在服务器启动时部署的应用程序。

  • 我遇到了以下问题: 我发布了一个与科罗纳有关的应用程序。我不知道谷歌不允许这样做(除非你的政府以某种方式批准),所以谷歌直接禁用了这个应用。 我试着删除它,这样它就不会再出现在仪表板上了,但我找不到该怎么做。我在互联网上搜索过如何删除禁用的应用程序,但这似乎是不可能的。 现在这样就可以了,但有以下问题:由于它被禁用,谷歌Admob称“我的一个应用违反了Admob的使用条款”。这也没有直接的问题,但

  • 问题内容: 有没有一种方法可以在运行时从家庭启动器中删除活动?我的意思是从其属性或类似的东西删除。 问题答案: 您可以通过禁用组件,将其从启动器中删除。

  • 我没有找到有用的信息,如何编程或使用设备的设置删除特定的应用程序从白名单。 在Android6.0中引入了打瞌睡模式,在列出的同时,最后一个术语允许忽略部分打瞌睡模式。 要将应用程序放入白名单中,应用程序需要执行代码: 我尝试了下一个动作来将该应用程序从白名单中删除,它刚刚被放置,但没有什么帮助我: 在设置中清除数据应用程序 删除应用程序并重新安装 真正的帮助是改变应用程序的包名。我有一个意见,如

  • 在我的应用程序中,我在回收商视图中显示项目列表。我为回收商视图中的每个项目创建了两个功能编辑和删除。使用此应用程序,用户可以创建任务列表,可以编辑项目,也可以从回收器视图中删除项目。现在,如果我单击“编辑”,它就可以完美地工作。但是,如果我单击删除选项,则应用程序崩溃,并且消息数组索引在adaper类中因rance异常而崩溃。 这是我的适配器代码。我还提到了 代码中的行 ,其中我遇到了应用程序崩溃