2017-09-23 88 views
1

我是Apache POI的新手。无法在删除重复行后使用Apache POI编写新的excel

我写了一个小代码,用于从excel文件中删除重复的记录。我可以成功地识别跨页的重复记录,但在删除记录后写入新文件时,不会生成输出。

请帮我在哪里布莱恩错了?

我是否正确书写?或者我错过了什么?

public static void main(String args[]) { 
    DataFormatter formatter = new DataFormatter(); 
    HSSFWorkbook input_workbook; 
    HSSFWorkbook workbook_Output_Final; 

    HSSFSheet input_workbook_sheet; 

    HSSFRow row_Output; 
    HSSFRow row_1_index; 
    HSSFRow row_2_index; 

    String value1 = ""; 
    String value2 = ""; 
    int count; 


    //main try catch block starts 
    try { 

     FileInputStream input_file = new FileInputStream("E:\\TEST\\Output.xls"); //reading from input file 
     input_workbook = new HSSFWorkbook(new POIFSFileSystem(input_file)); 

     for (int sheetnum = 0; sheetnum < input_workbook.getNumberOfSheets(); sheetnum++) { //traversing sheets 

      input_workbook_sheet = input_workbook.getSheetAt(sheetnum); 

      int input_workbook_sheet_total_row = input_workbook_sheet.getLastRowNum(); //fetching last row nmber 

      for (int input_workbook_sheet_row_1 = 0; input_workbook_sheet_row_1 <= input_workbook_sheet_total_row; input_workbook_sheet_row_1++) { //traversing row 1 

       for (int input_workbook_sheet_row_2 = 0; input_workbook_sheet_row_2 <= input_workbook_sheet_total_row; input_workbook_sheet_row_2++) { 

        row_1_index = input_workbook_sheet.getRow(input_workbook_sheet_row_1); //fetching one iteration row index 
        row_2_index = input_workbook_sheet.getRow(input_workbook_sheet_row_2); //fetching sec iteration row index 

        if (row_1_index != row_2_index) { 
         count = 0; 
         value1 = ""; 
         value2 = ""; 
         for (int row_1_index_cell = 0; row_1_index_cell < row_1_index.getLastCellNum(); row_1_index_cell++) { //traversing cell for each row 
          try { 
           value1 = value1 + formatter.formatCellValue(row_1_index.getCell(row_1_index_cell)); //fetching row cells value 
           value2 = value2 + formatter.formatCellValue(row_2_index.getCell(row_1_index_cell)); //fetching row cells value 

          } catch (NullPointerException e) { 
          } 
          count++; 
          if (count == row_1_index.getLastCellNum()) { 

           if (value1.hashCode() == value2.hashCode()) { //remove the duplicate logic 
            System.out.println("deleted : " + row_2_index); 
            System.out.println("------------------"); 
            input_workbook_sheet.removeRow(row_2_index); 
           } 

          } 
         } 

        } 
       } 
      } 

     } 
     FileOutputStream fileOut = new FileOutputStream("E:\\TEST\\workbook.xls"); 
     input_workbook.write(fileOut); 
     fileOut.close(); 
     input_file.close(); 
    } catch (Exception e) { 
     //e.printStackTrace(); 
    } 
    //main try catch block ends 

} 

回答

1

几件事情需要注意:

  1. 你吞下任何一种异常的;与我的测试数据Igotsome nullpointers,这将阻止工作簿被写入

  2. 当删除行时,往回移动行号是一个古老的技巧,因为那么你不必调整行号您刚删除

  3. 该代码清空行,但它不会向上移动所有行(=删除后有间隙)。如果你想消除这个差距,你可以使用shiftRows

  4. 你用hashcode比较东西,这是可能的(在某些使用情况下),但我觉得你想要做.equals()。又见Relationship between hashCode and equals method in Java

下面是一些代码,工作了我的测试数据,随意评论,如果事情不与您的数据的工作:

public static void main(String args[]) throws IOException { 
    DataFormatter formatter = new DataFormatter(); 
    HSSFWorkbook input_workbook; 
    HSSFWorkbook workbook_Output_Final; 

    HSSFSheet input_workbook_sheet; 

    HSSFRow row_Output; 
    HSSFRow row_1_index; 
    HSSFRow row_2_index; 

    String value1 = ""; 
    String value2 = ""; 
    int count; 

    FileInputStream input_file = new FileInputStream("c:\\temp\\test.xls"); 
    input_workbook = new HSSFWorkbook(new POIFSFileSystem(input_file)); 

    for (int sheetnum = 0; sheetnum < input_workbook.getNumberOfSheets(); sheetnum++) { 

     input_workbook_sheet = input_workbook.getSheetAt(sheetnum); 

     int input_workbook_sheet_total_row = input_workbook_sheet.getLastRowNum(); 

     for (int input_workbook_sheet_row_1 = input_workbook_sheet_total_row; input_workbook_sheet_row_1 >=0; input_workbook_sheet_row_1--) { // traversing 

      for (int input_workbook_sheet_row_2 = input_workbook_sheet_total_row; input_workbook_sheet_row_2 >= 0 ; input_workbook_sheet_row_2--) { 

       row_1_index = input_workbook_sheet.getRow(input_workbook_sheet_row_1); 
       row_2_index = input_workbook_sheet.getRow(input_workbook_sheet_row_2); 

       if (row_1_index != null && row_2_index != null && row_1_index != row_2_index) { 
        count = 0; 
        value1 = ""; 
        value2 = ""; 

        int row_1_max = row_1_index.getLastCellNum() - 1; 
        for (int row_1_index_cell = 0; row_1_index_cell < row_1_max; row_1_index_cell++) { 
         try { 
          value1 = value1 + formatter.formatCellValue(row_1_index.getCell(row_1_index_cell)); 

          value2 = value2 + formatter.formatCellValue(row_2_index.getCell(row_1_index_cell)); 

         } catch (NullPointerException e) { 
          e.printStackTrace(); 
         } 
         count++; 

         if (value1.equals(value2)) { 
          System.out.println("deleted : " + row_2_index.getRowNum()); 
          System.out.println("------------------"); 
          input_workbook_sheet.removeRow(row_2_index); 


          input_workbook_sheet.shiftRows(
            row_2_index.getRowNum() + 1, 
            input_workbook_sheet_total_row, 
            -1, 
            true, 
            true); 
         } 


        } 

       } 
      } 
     } 

    } 
    FileOutputStream fileOut = new FileOutputStream("c:\\temp\\workbook.xls"); 
    input_workbook.write(fileOut); 
    fileOut.close(); 
    input_file.close(); 
    input_workbook.close(); 
} 
+0

非常感谢指针。 :) 我想提几点: 1.你的代码是删除所有重复的行,不像我的,只保留其中一个副本,删除其余的。也许我不清楚删除重复项目,对此抱歉。 2.像你说的那样,删除重复项是让行变空白但不删除它们。 3.为什么不会哈希比较比较好的方法? – Akash

+0

我已经添加了shiftRows和一个链接到hashcode/equals的更深入的解释。大约1:实际上它应该保留一行(最后一行)。它可以与我的测试数据一起工作,但如果它不适合你,我需要更多关于你比较的数据的信息。 – JensS

+0

感谢您的帮助。我能够修改我的代码并使其工作。:) – Akash