Java操作xls文件,数据去重
前言
根据 表格数据的某一列唯一值生成key,将要进行数据合并列的值作value进行value值得去重合并
用到Map,poi jar包,输入输出流(io流)
一、读取磁盘文件,进行数据去重处理
public void excel() throws Exception {
//用流的方式先读取到你想要的excel的文件
FileInputStream fis=new FileInputStream(new File("D:\\ww.xls"));
//解析excel
POIFSFileSystem pSystem=new POIFSFileSystem(fis);
//获取整个excel
HSSFWorkbook hb=new HSSFWorkbook(pSystem);
System.out.println(hb.getNumCellStyles());
//获取第一个表单sheet
HSSFSheet sheet=hb.getSheetAt(0);
//循环行数依次获取列数
Map<String, String> map = new HashMap<>();
for (int i = sheet.getFirstRowNum()+1; i < sheet.getLastRowNum()+1; i++) {
//获取哪一行i
Row row=sheet.getRow(i);
if (row!=null) {
//创建一个集合,用处将每一行的每一列数据都存入集合中
Cell cell0=row.getCell(0); //这里我以第一列为key
String key = cell0.getStringCellValue();
Cell cell5=row.getCell(5);//这里我以第二列为value
String value = cell5.getStringCellValue();
if(map.get(key) == null){
map.put(key,value);
}else{
String s = map.get(key);
String valueNew = s+","+ value;//以逗号拼接value
map.put(key,valueNew);
}
}
}
fis.close();
System.out.println(map);
for (Map.Entry<String, String> stringStringEntry : map.entrySet()) {
List<String> list = new ArrayList<>();
String value = stringStringEntry.getValue();
String[] split = value.split(",");
for (String s : split) {
if (!list.contains(s)){
list.add(s);
}
}
String join = StringUtils.join(list, ",");
stringStringEntry.setValue(join);
}
System.out.println(map);
sss(map);//输出文件
}
二、将合并的数据写入到源文件建中
代码如下(示例):
public void sss(Map<String, String> map) throws Exception {
//对一个文件的读写,一定要注意是否有其他的进程在读写改文件,不然会写操作失败
FileInputStream fis=new FileInputStream(new File("D:\\ww.xls"));
//解析excel
POIFSFileSystem pSystem=new POIFSFileSystem(fis);
//获取整个excel
HSSFWorkbook hb=new HSSFWorkbook(pSystem);
System.out.println(hb.getNumCellStyles());
//获取第一个表单sheet
HSSFSheet sheet=hb.getSheetAt(0);
//循环行数依次获取列数
for (int i = sheet.getFirstRowNum()+1; i < sheet.getLastRowNum()+1; i++) {
//获取哪一行i
Row row = sheet.getRow(i);
if (row!=null) {
//创建一个集合,用处将每一行的每一列数据都存入集合中
Cell cell0=row.getCell(0);
String key = cell0.getStringCellValue();
if(map.get(key) != null){
String s = map.get(key);
Cell cell5=row.createCell(5);
cell5.setCellValue(s);
}
}
}
fis.close();
FileOutputStream outPutStream=new FileOutputStream(new File("D:\\ww.xls"));
hb.write(outPutStream);//利用io流更改写入新数据
outPutStream.flush();
outPutStream.close();
}
总结
主要是理解poi jar包中对表格数据进行封装的个个对象,表格,行,列,单元格相关对象的一个操作。粗陋理解,还望大家指正和补充。