0

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 小时以来我一直在尝试解决方案)

4

1 回答 1

0

我注意到您的代码中有两个错误。首先,每次删除低效的行时都会写入文件。其次,您只搜索该行中的第一个字符串单元格,如果该行中的第一个字符串单元格不是正确的,则中断。如果您自动生成的文件将数字或空白单元格保存为字符串(可能),那么这将导致您手动生成的 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((row = sheet.getRow(i)) != null ){ }

于 2013-06-21T13:38:05.467 回答