gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 06:30:47 24 4
gpt4 key购买 nike

我使用 Apache POI 库将 Excel 表导入、导出到应用程序 (tableView)。我在从 Excel 中的应用程序中删除行时遇到一些问题。删除行工作正常,但如果我删除一行并重新启动应用程序,它将导入最后一个条目两次。如果我删除 4 或 5 个条目,则重新启动时最后一个条目将显示 4 或 5 次。我认为最后一个行号将不会保存或更新。删除 Excel 文件中的行效果很好,仅在我的表格 View 中,在我删除行并导入文件后 - 最后一个条目将显示两次。启动应用程序lastRowNum()= 6; -> 删除一个条目(行)并重新开始导入 -> lastRowNum() = 6;这是 Excel Bug 还是类似的问题?如果有任何帮助,我将非常感激。多谢。

删除方法:

FileInputStream inp = new 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();

}
}

}

最佳答案

我遇到了同样的问题,并通过添加行解决了它
sheet.createRow(sheet.getLastRowNum()+1);//在最后一个位置添加空行
调用后
sheet.removeRow(removingRow);
我认为在这种情况下你不应该太认真地对待 getLastRowNum() 方法,因为 Excel 工作表的想法是它们应该被视为无限。

关于java - Apache POI - 从 Excel 中的应用程序中删除行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46186788/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com