使用Apache POI API在Excel文件中查找特定字符串

vfh0ocws  于 2023-01-27  发布在  Apache
关注(0)|答案(1)|浏览(379)

Hye我是新的Apache POI API阅读MS Office文档,但不知何故擅长Java。我只是想从Excel文件中搜索一个特定的字符串!我这样做:

private void processExcelFile(File f_path) throws Exception{
    File path=f_path;

    try{

        FileInputStream is=new FileInputStream(path);

        HSSFWorkbook wb = new HSSFWorkbook(is);
        HSSFSheet sheet = wb.getSheetAt(0);

        int rowcount_post=0;
        int rowcount_304=0;

                for(Row row: sheet){
                    for(Cell cell : row){

                        if (cell.getCellType() == Cell.CELL_TYPE_STRING){
                                if (cell.getRichStringCellValue().getString().trim().equals("GET")){
                                        rowcount_post=row.getRowNum();

                                        HSSFRow removingRow = sheet.getRow(rowcount_post);

                                            if (removingRow != null) {
                                            sheet.removeRow(removingRow);
                                            }

                                     try (FileOutputStream fileOut = new FileOutputStream("C:/juni.xls")) {
                                        wb.write(fileOut);
                                    }
                                    break;
                                }
                                else{
                                    System.out.print("NOT FOUND");

                                }

                        break;
                        }

                    }
                }

    }
    catch(Exception e){
           JOptionPane.showMessageDialog(this,e.getMessage(),"Error",JOptionPane.ERROR_MESSAGE);
    }
}

一切都很好!除了我有一个Web生成的日志文件。所以我必须搜索它的一些字符串,然后我必须删除包含该字符串的行。问题是,它只适用于Excel文件,我创建我的手,而不是计算机生成的(自动日志文件)文件。假设我必须搜索一个字符串“POST”,它只会在我生成的文件中找到,而不会在网站生成的文件中找到。它是任何编码问题,我的意思是文本编码或什么!请建议我一个解决方案,谢谢提前!(抱歉糟糕的英语,我一直在尝试解决方案,因为过去10个小时)

e3bfsja2

e3bfsja21#

我注意到你的代码中有两个错误。首先,你每次删除一行时都要写文件,这是低效的。其次,你只搜索行中的第一个字符串单元格,如果行中的第一个字符串单元格不正确,你就会破坏。如果你的自动生成文件将数字或空白单元格保存为字符串(可能),那么这将导致您手动生成的excel文件和您用脚本创建的文件之间存在差异。我建议删除第二个break语句。为了清理代码,我将整个if块重写如下:

if(cell.getCellType() == Cell.CELL_TYPE_STRING && cell.getStringCellValue().equals("GET")){
    sheet.removeRow(row);
    break;
} else {
    System.out.print("Not Found! ");
}

if语句的工作是因为短路。如果你是apache poi的新手,这将为你节省大量的时间。:)
删除行之后,我们应该写文件,将以下代码放在整个for块之后:

try (FileOutputStream fileOut = new FileOutputStream("C:/juni.xls")) {
    wb.write(fileOut);
}

我假设sheet.removeRow(row)可以在增强的for循环中工作,如果不能,你可能需要修复它或者让你的代码在while循环中工作。提示:while((行=工作表.getRow(i))!=空){ }

相关问题