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

使用Apache POI删除(不删除)excel行的内容

马德宇
2023-03-14

-我发现shiftRows函数存在一个导致excel中断的错误。https://bz.apache.org/bugzilla/show_bug.cgi?id=57423我不确定这是否已经修复。我已经在bugzilla上添加了一个评论来进一步了解这一点。

如果满足特定的单元格值条件,我正尝试从excel文件中删除行(而不是删除的内容)。

我成功地实现了这一点,但问题是它破坏了我的excel并且当我重新打开文件(手动)时,excel显示一个它破坏的错误,并且当我打开修复的值时,文件已经丢失了它的所有格式。下面是我用过的代码。我想罪魁祸首是鬼才。这是因为如果我使用隐藏单元格的其他选项,则excel不会中断,而且它也能正常工作。但问题是我想删除行而不是隐藏它。

void shiftRows(int startRow, int endRow, int n);

在startRow和endRow之间移动行n行数。*如果使用负数,它会向上移动行。*代码确保行不环绕。

假设我在Row1并将删除它的内容,那么我应该传递什么参数来将整个工作表移到Row1下面,1行上面。我尝试了下面的操作,但它失败了,因为T=it在第二次循环迭代时给了我null指针异常。

shiftRows(row1+1,最后一行编号值,最后一行与当前行的差值);

for(int r=sh.getFirstRowNum(); r<=sh.getLastRowNum(); r++){ //iterating through all the rows of excel
            Row currentRow = sh.getRow(r);                              //get r'th row
            if(currentRow.getCell(1).getStringCellValue().equalsIgnoreCase("Assigned to Duration")){
                int tempRowNum = (currentRow.getRowNum()+1);
                System.out.println("Working on Row: " + (currentRow.getRowNum()+1) + " value " + currentRow.getCell(0).getStringCellValue());
                int tempValue = sh.getLastRowNum() - currentRow.getRowNum();
                System.out.println("Difference: " +tempValue);
                sh.removeRow(currentRow);
//              currentRow.setZeroHeight(true);
                sh.shiftRows(tempRowNum, sh.getLastRowNum(), tempValue);
                r--;
//              System.out.print(" row number below the current row is " + (tempRowNum+1) + " and value is " + sh.getRow(tempRowNum).getCell(0).getStringCellValue());
            }
            countfilter++;
        }
        System.out.println("Total Rows after removing: " + sh.getLastRowNum());
        System.out.println("Loop iterated for " + countfilter + " times.");

        fos = new FileOutputStream(file);
        wb.write(fos);
        wb.close();
        fis.close();
        System.out.println("Row filtering completed");

运行上述代码后遇到Excel打开错误:

共有1个答案

欧桐
2023-03-14

相信你想要使用shiftRows的方式如下:

如果您根据单元格值1找到要删除的行,那么根据您的for循环,我们知道这是行r,因此:

if(currentRow.getCell(1).getStringCellValue().equalsIgnoreCase("Assigned to Duration")){
    sh.removeRow(currentRow);
    // shift rows 1 row up starting from the row after the row you just removed
    shiftRows(r+1, sh.getLastRowNum(), -1); 
    r--;
}
 类似资料:
  • 我修改了一小段代码,但无法运行。我总是发现一个例外: 保存失败:保存包时出错:重复条目:docProps/core.xml 错误抛出在这行: 我认为出现了这个例外,因为我不允许在同一个工作簿上读写,但是如果没有现有的Excel文件,我如何初始化新工作簿? 代码:(来自这里(感谢发起者):如何使用ApachePOI删除行) 和 [编辑2016-06-21]: 我加了 给我的POM,现在它产生了 线程

  • 我在excel表中有从A列到F列的数据。 我在页面中间的其他列中创建了一个按钮,比如H5 有什么方法可以保留按钮,即使整个行被删除。我尝试锁定单元格,窗格和拆分。 但运气不好。你能帮我做这件事吗?

  • 我有一个有3000行的excel文件。我删除了2000(用ms excel应用程序),但是当我从代码中调用sheet.getLastRowNum()时,它给我3000(而不是1000)...我如何删除空白行? 我尝试从这里的代码,但它不工作......

  • 我有一个spring 4应用程序,我试图删除一个实体的实例,从我的数据库。我有以下实体: 我定义了一个JPararePository接口: 我有一个与内存数据库(H2)一起工作的单元测试设置,我正在用两个令牌预先填充数据库: 第一个断言通过,第二个失败。我尝试了另一个测试,它更改了令牌值并将其保存到数据库中,它确实起作用了,所以我不确定为什么delete不起作用。它也不抛出任何异常,只是不将其持久

  • 我有5张不同的表格。sheet3和sheet4我希望根据单个列单元格值删除行。在表3中,我希望根据H列单元格值删除行,如果h2=“#n/a”和h503=“#n/a”,则删除整个行。在表4中,如果b2=“320857876”、b3=“32085678”、b4=“12133435”删除b列单元格值以302开头的整个行,我希望根据b列单元格值删除行。我想删除'C'列中的所有数据我的excel表如下所示

  • 我无法解释,因为所有其他select和insert语句都工作得很好。