Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 删除重复行后,无法使用Apache POI编写新excel_Java_Excel_Apache_Apache Poi - Fatal编程技术网

Java 删除重复行后,无法使用Apache POI编写新excel

Java 删除重复行后,无法使用Apache POI编写新excel,java,excel,apache,apache-poi,Java,Excel,Apache,Apache Poi,我对ApachePOI是新手 我编写了一个小代码,用于从excel文件中删除重复记录。我能够成功地跨工作表识别重复记录,但在删除记录后写入新文件时,不会生成任何输出 请帮忙我哪里出了问题 我写得好吗??或者我错过了什么 public static void main(String args[]) { DataFormatter formatter = new DataFormatter(); HSSFWorkbook input_workbook; HSSFWorkboo

我对ApachePOI是新手

我编写了一个小代码,用于从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

}
publicstaticvoidmain(字符串参数[]){
DataFormatter formatter=新的DataFormatter();
HSSF工作手册输入\工作手册;
HSSF工作手册\输出\最终版;
HSSF表输入\工作手册\工作表;
HSSFRow行输出;
HSSFRow row_1_索引;
HSSFRow row_2_索引;
字符串值1=“”;
字符串值2=“”;
整数计数;
//主尝试捕捉块启动
试一试{
FileInputStream input_file=newfileinputstream(“E:\\TEST\\Output.xls”);//读取输入文件
input_工作簿=新的HSSF工作簿(新的POIFSFileSystem(input_文件));
对于(int sheetnum=0;sheetnum对于(int-input\u-workbook\u-sheet\u-row\u 1=0;input\u-workbook\u-sheet\u-row\u 1需要注意的几件事:

  • 您可以接受任何类型的异常;我的测试数据中有一些空指针,这将阻止工作簿的编写

  • 删除行时,向后移动行号是一个老把戏,因为这样您就不必调整刚刚删除的行号

  • 代码清空行,但不会将所有行向上移动(=删除后有一个间隙)。如果要删除该间隙,可以使用shiftRows

  • 您可以通过hashcode进行比较,这是可能的(在某些用例中),但我觉得.equals()是您想要做的

  • 以下是一些适用于我的测试数据的代码,如果您的数据出现问题,请随时发表评论:

    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();
    }
    
    publicstaticvoidmain(字符串args[])引发IOException{
    DataFormatter formatter=新的DataFormatter();
    HSSF工作手册输入\工作手册;
    HSSF工作手册\输出\最终版;
    HSSF表输入\工作手册\工作表;
    HSSFRow行输出;
    HSSFRow row_1_索引;
    HSSFRow row_2_索引;
    字符串值1=“”;
    字符串值2=“”;
    整数计数;
    FileInputStream输入文件=新的FileInputStream(“c:\\temp\\test.xls”);
    input_工作簿=新的HSSF工作簿(新的POIFSFileSystem(input_文件));
    对于(int sheetnum=0;sheetnum=0;输入\U WORKING\U sheet\U row\U 1--){//遍历
    对于(int input\U WORKING\U row\U 2=输入\U WORKING\U sheet\U total\U row;输入\U WORKING\U sheet\U row\U 2>=0;输入\U WORKING\U row\U 2--){
    row\u 1\u index=input\u workbook\u sheet.getRow(input\u workbook\u sheet\u row\u 1);
    row_2_index=input_工作簿_sheet.getRow(input_工作簿_sheet_row_2);
    if(row_1_index!=null和&row_2_index!=null和&row_1_index!=row_2_index){
    计数=0;
    值1=“”;
    值2=“”;
    int row_1_max=row_1_index.getLastCellNum()-1;
    for(int row_1_index_cell=0;row_1_index_cell
    非常感谢您的指点。:)我想提到的几点:1.你的代码删除了所有重复的行,不像我的代码只保留了一个重复行,删除了其余的行。也许我不清楚删除重复行,对此我很抱歉。2.就像你说的,删除重复行是将行变为空,但不删除它们。3.为什么不删除better方法大于等于?我添加了shiftRows和一个链接,以更深入地解释hashcode/equals。关于1:实际上它应该保留一行(最后一行)。它适用于我的测试数据,但如果它不适用于您,我需要有关您比较的数据的更多信息。感谢您的帮助。我可以修改代码并使其正常工作。:)