JAVA_Apache_POI操作EXCEL(与第一个sheet相同去重)

实现方式:

1.将对比数据不是重复的进行封装,然后进行输出

(第一种方法有效的躲避了POI中删除行的坑)

2.直接删除重复行进行保存。

(删除行后会留下空行,处理方式见代码之后VB方式处理,此处采用此种方法)

代码缺陷(已知BUG):

1.未对隐藏行进行处理

2.未对只有样式无数据单元格进行处理

3.未对单元格内容中间有空格情况的处理

3.需要包SAX 否则报错XMLOPTION...

4.JDK版本要求1.6.0.18以上

代码如下:

package cn.supporter;



import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;


import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;
import org.junit.Test;


public class POIResolver {
/*
* 第一步:获取第一个Sheet中数据并且封装为List<List<Cell>> 第二步:获取各个Sheet中数据与第一个Sheet进行对比
*/
final static File file = new File(
"C:/Users/Administrator/Desktop/demo.xlsx");


public static void main(String[] args) throws InvalidFormatException,
IOException {
POIResolver res = new POIResolver();
res.comparer();
}


/**
* 得到Excel,并解析内容 对2007及以上版本 使用XSSF解析

* @param file
* @throws FileNotFoundException
* @throws IOException
* @throws InvalidFormatException
*             第一步:获取第一个Sheet中数据并且封装为List<List<Cell>>
*/
public static List<List<String>> getExcelAsFile(String file)
throws FileNotFoundException, IOException, InvalidFormatException {
// 将每行数据放入List<List<String>>
List<List<String>> list1 = new ArrayList<List<String>>();
// 将每个Cell的内容放入List<String>


InputStream ins = null;
Workbook wb = null;
ins = new FileInputStream(new File(file));
// ins=ExcelService.class.getClassLoader().getResourceAsStream(filePath);
wb = WorkbookFactory.create(ins);
ins.close();
// 得到Excel工作表对象
Sheet sheet = wb.getSheetAt(0);
// 总行数
int trLength = sheet.getLastRowNum();
Row row;
Cell cell;
int t = 0;
for (int i = 2; i <= trLength; i++) {
// 得到Excel工作表的行
row = sheet.getRow(i);
//空行跳过
if(null==row){
continue;
}
List<String> list2 = new ArrayList<String>();
for (int k = 0,x=0; k <16; k++) {
//System.err.println("到达了第"+i+"行,第"+k+"单元格");
// 得到Excel工作表指定行的单元格
cell = row.getCell(k);
if (null != cell) {
cell.setCellType(Cell.CELL_TYPE_STRING);
list2.add(x, cell.getStringCellValue().trim());
x++;
}

}
/*空行list2不会加入到list1中去
null==list2||list2.isEmpty()
先判断有没有list容器再判断list中空不空
此处只需要判断list空不空即可
*/
if(!list2.isEmpty()){
list1.add(t, list2);
t++;
}
}
//System.err.println(list1);
return list1;
}


/*
* 第二步:获取各个Sheet中数据与第一个Sheet进行对比 
* 第三步:将对比过后相同的数据进行删除
*/


public void comparer() {
try {
// 将第一页对比数据拿过来
List<List<String>> FirstList = getExcelAsFile(file.toString());
List<String> FirstListSon = FirstList.get(0);
InputStream ins = null;
Workbook wb = null;
ins = new FileInputStream(new File(file.toString()));
wb = WorkbookFactory.create(ins);
ins.close();
Sheet sheet;
Row row;
Cell cell;
// 得到工作薄的每个Sheet
for (int i = 1; i < wb.getNumberOfSheets(); i++) {
// 得到当前Sheet
sheet = wb.getSheetAt(i);
System.err.println("正在进行第" + i + "个Sheet的遍历");
// 得到当前行
for (int k = 2; k <= sheet.getLastRowNum(); k++) {
Boolean b = true;
// 得到当前行并进行封装
row = sheet.getRow(k);
//空行跳过
if(null==row ){
         continue;
 }
// 将当前的工作表进行封装
List<String> list1 = new ArrayList<String>();
for (int m = 0,y=0; m < 16; m++) {
//System.err.println("到达了第"+k+"行,第"+m+"单元格");
cell = row.getCell(m);
if (null!= cell) {
cell.setCellType(Cell.CELL_TYPE_STRING);
list1.add(y, cell.getStringCellValue().trim());
y++;
}
}
for (int n = 0; n < FirstList.size(); n++) {
// 将第一页每行数据与此行进行对比,如果有一行相同就删除此行
FirstListSon = FirstList.get(n);
for (int p = 0; p < list1.size(); p++) {
// 有一个不同的也不删除
if (!list1.get(p).equals(FirstListSon.get(p))) {
b = false;
break;
}
if (p == list1.size() - 1) {
b = true;
}
}
//System.err.println(b);
if (b&&null!=row) {
//System.err.println("刪"+row.getRowNum());
sheet.removeRow(row);
}
}
}
}
//将修改完成的EXCEL进行保存
OutputStream out = new FileOutputStream(file);
wb.write(out);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (InvalidFormatException e) {
e.printStackTrace();
}
}
}
 

空行处理方式:利用EXCEL宏(VB)进行处理代码如下

Sub test()
Range("b:b").SpecialCells(xlCellTypeBlanks).EntireRow.Delete
End Sub

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值