Java 删除重复行后,无法使用Apache POI编写新excel
我对ApachePOI是新手 我编写了一个小代码,用于从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
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:实际上它应该保留一行(最后一行)。它适用于我的测试数据,但如果它不适用于您,我需要有关您比较的数据的更多信息。感谢您的帮助。我可以修改代码并使其正常工作。:)