【POI xls Java map】使用POI处理xls 抽取出异常信息 --java1.8Group by ---map迭代 -- 设置单元格高度

简介:  代码处理逻辑:  代码流程: 1.首先需要创建一个实体 用来存储 相关信息 1 package com.sxd.test.unusualName; 2 3 public class NameEntity { 4 5 private String ...

 

代码处理逻辑:

 

 

代码流程:

 

1.首先需要创建一个实体 用来存储 相关信息

 1 package com.sxd.test.unusualName;
 2 
 3 public class NameEntity {
 4     
 5     private String name;//姓名
 6     private String num;//编号
 7     private String rsNum;//RS号
 8     private String disease;//疾病
 9     private String rsInfo;//rs值
10     
11     public NameEntity() {
12         // TODO Auto-generated constructor stub
13     }
14 
15     public NameEntity(String name, String num, String rsNum, String disease,
16             String rsInfo) {
17         super();
18         this.name = name;
19         this.num = num;
20         this.rsNum = rsNum;
21         this.disease = disease;
22         this.rsInfo = rsInfo;
23     }
24 
25     public String getName() {
26         return name;
27     }
28 
29     public void setName(String name) {
30         this.name = name;
31     }
32 
33     public String getNum() {
34         return num;
35     }
36 
37     public void setNum(String num) {
38         this.num = num;
39     }
40 
41     public String getRsNum() {
42         return rsNum;
43     }
44 
45     public void setRsNum(String rsNum) {
46         this.rsNum = rsNum;
47     }
48 
49     public String getDisease() {
50         return disease;
51     }
52 
53     public void setDisease(String disease) {
54         this.disease = disease;
55     }
56 
57     public String getRsInfo() {
58         return rsInfo;
59     }
60 
61     public void setRsInfo(String rsInfo) {
62         this.rsInfo = rsInfo;
63     }
64     
65 }
View Code

2.具体的处理方法

  1 package com.sxd.test.unusualName;
  2 
  3 import java.io.File;
  4 import java.io.FileInputStream;
  5 import java.io.FileOutputStream;
  6 import java.io.IOException;
  7 import java.util.ArrayList;
  8 import java.util.List;
  9 import java.util.Map;
 10 import java.util.Set;
 11 import java.util.stream.Collectors;
 12 
 13 import org.apache.poi.hssf.usermodel.HSSFCellStyle;
 14 import org.apache.poi.hssf.usermodel.HSSFFont;
 15 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
 16 import org.apache.poi.hssf.util.HSSFColor;
 17 import org.apache.poi.ss.usermodel.Cell;
 18 import org.apache.poi.ss.usermodel.Row;
 19 import org.apache.poi.ss.usermodel.Sheet;
 20 import org.junit.Test;
 21 
 22 
 23 public class Xls4Name {
 24     
 25     /**
 26      * 主方法--处理多份xls文件中 不同sheet[疾病]下  姓名/位点一致||订单编号一致,但是位点值不同的信息
 27      * @throws IOException
 28      */
 29     @Test
 30     public void mainTest() throws IOException{
 31         
 32         test1();
 33         test2();
 34         test3();
 35         
 36         
 37     }
 38     /**
 39      * 处理 肝癌  冠心病 脑梗  位点信息为rs1801133
 40      * @throws IOException
 41      */
 42     public void test1() throws IOException{
 43         File file = new File("D:/20161110-时代基因大批量检测结果/");
 44         File [] allFile = file.listFiles();
 45         if(allFile.length > 0){
 46             List<NameEntity> listAll = new ArrayList<NameEntity>();
 47             String outPath = null;
 48             for (int i = 0; i < allFile.length; i++) {
 49                 String fileName = allFile[i].getName();
 50                 String filePath = "D:/20161110-时代基因大批量检测结果/"+fileName;
 51                 String [] sheetName = {"肝癌","冠心病","脑梗(缺血性脑卒中)"};
 52                 String RsNum = "rs1801133";
 53                 outPath = "d:/异常/"+"异常1---"+fileName.substring(0,fileName.lastIndexOf("."))+".xls";
 54                 //获取原始数据
 55                 listAll = just4ListArr(filePath,RsNum,sheetName);
 56             }
 57             //对原始数据分组
 58             List<NameEntity> list = groupByList(listAll);
 59             //将处理好的数据存入异常文件
 60             if(list.size() > 0){
 61                 just4Result(list,outPath);
 62             }
 63         }
 64     }
 65     /**
 66      * 处理 胃癌  食管癌  位点信息  rs2274223
 67      * @throws IOException
 68      */
 69     public void test2() throws IOException{
 70         File file = new File("D:/20161110-时代基因大批量检测结果/");
 71         File [] allFile = file.listFiles();
 72         if(allFile.length > 0){
 73             List<NameEntity> listAll = new ArrayList<NameEntity>();//listAll放在循环内部 可以单独处理多个文件 放在循环外面可以将多个文件统一处理
 74             String outPath = null;
 75             for (int i = 0; i < allFile.length; i++) {
 76                 String fileName = allFile[i].getName();
 77                 String filePath = "D:/20161110-时代基因大批量检测结果/"+fileName;
 78                 String [] sheetName = {"胃癌","食管癌"};
 79                 String RsNum = "rs2274223";
 80                 outPath = "d:/异常/"+"异常2---"+fileName.substring(0,fileName.lastIndexOf("."))+".xls";
 81                 //获取原始数据
 82                 listAll = just4ListArr(filePath,RsNum,sheetName);
 83                 
 84             }
 85             //对原始数据分组
 86             List<NameEntity> list = groupByList(listAll);
 87             //将处理好的数据存入异常文件
 88             if(list.size() > 0){
 89                 just4Result(list,outPath);
 90             }
 91         }
 92     }
 93     /**
 94      * 高血压  脑梗  位点信息rs699
 95      * @throws IOException
 96      */
 97     public void test3() throws IOException{
 98         File file = new File("D:/20161110-时代基因大批量检测结果/");
 99         File [] allFile = file.listFiles();
100         if(allFile.length > 0){
101             List<NameEntity> listAll = new ArrayList<NameEntity>();
102             String outPath = null;
103             for (int i = 0; i < allFile.length; i++) {
104                 String fileName = allFile[i].getName();
105                 String filePath = "D:/20161110-时代基因大批量检测结果/"+fileName;
106                 String [] sheetName = {"高血压","脑梗(缺血性脑卒中)"};
107                 String RsNum = "rs699";
108                 outPath = "d:/异常/"+"异常3---"+fileName.substring(0,fileName.lastIndexOf("."))+".xls";
109                 
110                 //获取原始数据
111                 listAll = just4ListArr(filePath,RsNum,sheetName);
112             }
113             //对原始数据分组
114             List<NameEntity> list = groupByList(listAll);
115             //将处理好的数据存入异常文件
116             if(list.size() > 0){
117                 just4Result(list,outPath);
118             }
119         }
120     }
121     
122     /**
123      * 根据传入的 文件路径以及sheet名称  分别创建sheet,并传入just4List(listAll,sheet)进行处理
124      * @param filePath
125      * @param sheetName
126      * @return
127      * @throws IOException
128      */
129     public List<NameEntity> just4ListArr(String filePath,String RsNum,String ...sheetName) throws IOException{
130         FileInputStream in = new FileInputStream(new File(filePath));
131         HSSFWorkbook work = new HSSFWorkbook(in);
132         
133         List<NameEntity> listAll = new ArrayList<>();
134         for (String sName : sheetName) {
135             Sheet sheet =  work.getSheet(sName);//根据sheet名称 获取几种疾病的信息
136             listAll = just4List(listAll,sheet,RsNum);
137         }
138         
139         work.close();
140         in.close();
141         return  listAll;
142         
143     }
144     
145     /**
146      * 对xls中抽取出来的原始数据进行分组处理  按照用户名name称分组/或者按照订单号num分组  java1.8
147      * @param listAll
148      * @return
149      */
150     public List<NameEntity> groupByList(List<NameEntity> listAll){
151         List<NameEntity> result = new ArrayList<NameEntity>();
152         
153 //            Map<String,List<NameEntity>> map = listAll.stream().collect(Collectors.groupingBy(e->((NameEntity) e).getName()));
154             Map<String,List<NameEntity>> map = listAll.stream().collect(Collectors.groupingBy(e->((NameEntity) e).getNum()));
155             //下面对map进行迭代
156             Set<String> set = map.keySet();
157             for (String string : set) {
158                 int listSize = map.get(string).size();
159                 if(listSize > 1){
160                     String rs = map.get(string).get(0).getRsInfo();//获取第一个的rs号
161                     for (int i = 1; i < listSize; i++) {//循环判断  若出现rs号不一致 即抽取出同组的多条信息 保存
162                         if(!map.get(string).get(i).getRsInfo().equals(rs)){
163                             result.addAll(map.get(string));
164                             break;
165                         }
166                     }
167                 }
168             }
169             
170         
171         return result;
172     }
173     
174     
175     /**
176      * 根据最终传入的list  
177      * @param list
178      * @throws IOException
179      */
180     public void just4Result(List<NameEntity> list,String outPath) throws IOException{
181         //输出文档
182                 FileOutputStream out = new FileOutputStream(new File(outPath));
183                 HSSFWorkbook workOut = new HSSFWorkbook();
184                 //设置sheet名称
185                 Sheet sheet = workOut.createSheet("异常名称");
186                 //设置第2列的宽度为 100*256
187                 sheet.setColumnWidth(1, 50 * 256);
188                 sheet.setColumnWidth(2, 15 * 256);
189                 sheet.setColumnWidth(3, 30 * 256);
190                 //创建首行
191                 Row row1 = sheet.createRow(0);
192                 //首行 行高
193                 row1.setHeight((short)500);
194                 //首行 列名数组
195                 String []rowName = {"姓名","编号(采样号)","RS号","疾病","RS值"};
196                 //设置首行样式
197                 HSSFCellStyle cellStyle = workOut.createCellStyle(); 
198                 //创建字体
199                 HSSFFont font = workOut.createFont();
200                 //设置加粗
201                 font.setBold(true);
202                 //设置字体颜色
203                 font.setColor(HSSFColor.AQUA.index);
204                 //设置字体大小
205                 font.setFontHeightInPoints((short)14);
206                 cellStyle.setFont(font);
207                 for (int i = 0; i < 5; i++) {
208                     Cell cell = row1.createCell(i);
209                     cell.setCellValue(rowName[i]);
210                     cell.setCellStyle(cellStyle);
211                 }
212                 
213                 //对应列放入对应数据
214                 for (int i = 0; i < list.size(); i++) {
215                     Row row2 = sheet.createRow(i+1);
216                     NameEntity nameEntity = list.get(i);
217                     for (int j = 0; j < 5; j++) {
218                         Cell cell = row2.createCell(j);
219                         switch (j) {
220                         case 0: cell.setCellValue(nameEntity.getName()); break;
221                         case 1: cell.setCellValue(nameEntity.getNum()); break;
222                         case 2: cell.setCellValue(nameEntity.getRsNum()); break;
223                         case 3: cell.setCellValue(nameEntity.getDisease()); break;
224                         case 4: cell.setCellValue(nameEntity.getRsInfo()); break;
225 
226                         default: cell.setCellValue("数据异常");
227                             break;
228                         }
229                         
230                     }
231                 }
232                 
233                 workOut.write(out);
234                 out.close();
235                 workOut.close();
236     }
237     
238     
239     
240     /**
241      * 从原始xls文件中抽取出来最原始的数据  存放如listAll中
242      * @param listAll
243      * @param sheet
244      * @return
245      */
246     public List<NameEntity> just4List(List<NameEntity> listAll,Sheet sheet,String RsNum){
247         String diseaseName = sheet.getSheetName();
248         
249         Row row1 = sheet.getRow(0);
250         Cell cell = row1.getCell(0);
251         int maxRowNum = just4MaxRowNum(sheet);//先计算出 最大行数
252         int maxCellNum = row1.getLastCellNum();//最大列数
253         row1 = sheet.getRow(2);                    //固定 rsNum放在第三行 故 获取第三行
254         int rsNum = 0;
255         //判断对应的rsNum在第几列  记录列号
256             cell = row1.getCell(4);
257             String value = cell.getRichStringCellValue().toString();
258             if(RsNum.equals(value)){
259                 rsNum = 4;
260             }else {
261                 rsNum = 5;
262             }
263         
264             //循环从5开始  因为原始文件中的前5行非数据
265         for (int i = 5; i < maxRowNum ; i++) {//然后纵向提取  获取所有rs信息
266             NameEntity nameEntity = new NameEntity();//实例化对象
267             row1 = sheet.getRow(i);
268             String  rs = row1.getCell(rsNum).getStringCellValue();//获取rs  由于rs号不确定在第几列  故进行判断
269             String name = row1.getCell(3).getStringCellValue();//获取name   name列确定列号为3  即在第四行  也可以自行判断
270             String num = null;
271             if(row1.getCell(2).getCellType() == Cell.CELL_TYPE_NUMERIC){
272                  num = String.valueOf(row1.getCell(2).getNumericCellValue());//获取num  编号 条形码
273             }else{
274                  num = String.valueOf(row1.getCell(2).getStringCellValue());
275             }
276             nameEntity.setNum(num);
277             nameEntity.setName(name);
278             nameEntity.setRsNum(RsNum);
279             nameEntity.setDisease(diseaseName);
280             nameEntity.setRsInfo(rs);
281             listAll.add(nameEntity);
282         }
283         
284         return listAll;
285     }
286     
287     /**
288      * 获取最大行数  由于人为原因  xls中某个单元格中内容虽然已经删除 但是单元格的对象依旧创建,因此需要自己获取有效行数
289      * @param sheet
290      * @return
291      */
292     public int just4MaxRowNum(Sheet sheet){
293         int maxRowNum = sheet.getLastRowNum();//获取最大行号  但不是有效行号
294         
295         for (int i = 5; i < maxRowNum; i++) {
296             Row row = sheet.getRow(i);
297             Cell cell = row.getCell(3);
298             if(cell == null || cell.getCellType() == Cell.CELL_TYPE_BLANK){//判断cell单元格为null或者单元格类型为blank就表示此单元格没有数据  那这一行的上一行就是有效行数
299                 maxRowNum = i-1;
300                 break;
301             }
302         }    
303         return maxRowNum;
304     }
305 }
View Code

3.在处理完成业务之后   可以调用方法将文件夹中的 使用过的文件删除

 1 package com.sxd.test.unusualName;
 2 
 3 import java.io.File;
 4 
 5 import org.junit.Test;
 6 
 7 /**
 8  * 一键删除   异常文件以及 源文件
 9  * @author Administrator
10  *
11  */
12 public class DeleteUnusualFile {
13 
14     @Test
15     public void deleteFile(){
16         deleteSourceFile();
17         deleteUnusualFile();
18     }
19     
20     /**
21      *删除源文件 
22      */
23     public void deleteSourceFile(){
24         File file = new File("D:/20161110-时代基因大批量检测结果");
25         File[] fileArr = file.listFiles();
26         if(file.isDirectory() && fileArr.length > 0){//若此路径是文件夹 且 下面的子文件不为null
27             for (int i = 0; i < fileArr.length; i++) {
28                 if(fileArr[i].isFile()){
29                     fileArr[i].delete();
30                 }
31             }
32         }
33         
34     }
35     /**
36      * 删除异常文件
37      */
38     public void deleteUnusualFile(){
39         File file = new File("D:/异常");
40         File[] fileArr = file.listFiles();
41         if(file.isDirectory() && fileArr.length > 0){//若此路径是文件夹 且 下面的子文件不为null
42             for (int i = 0; i < fileArr.length; i++) {
43                 if(fileArr[i].isFile()){
44                     fileArr[i].delete();
45                 }
46             }
47         }
48     }
49 }
View Code

 

相关文章
|
Java API 调度
如何避免 Java 中的 TimeoutException 异常
在Java中,`TimeoutException`通常发生在执行操作超过预设时间时。要避免此异常,可以优化代码逻辑,减少不必要的等待;合理设置超时时间,确保其足够完成正常操作;使用异步处理或线程池管理任务,提高程序响应性。
674 13
|
Java 程序员 数据库连接
我们详细地讲解一下 Java 异常及要如何处理
我是小假 期待与你的下一次相遇 ~
289 1
|
SQL Java 中间件
【YashanDB知识库】yasdb jdbc驱动集成BeetISQL中间件,业务(java)报autoAssignKey failure异常
在BeetISQL 2.13.8版本中,客户使用batch insert向yashandb表插入数据并尝试获取自动生成的sequence id时,出现类型转换异常。原因是beetlsql在prepareStatement时未指定返回列,导致yashan JDBC驱动返回rowid(字符串),与Java Bean中的数字类型tid不匹配。此问题影响业务流程,使无法正确获取sequence id。解决方法包括:1) 在batchInsert时不返回自动生成的sequence id;2) 升级至BeetISQL 3,其已修正该问题。
【YashanDB知识库】yasdb jdbc驱动集成BeetISQL中间件,业务(java)报autoAssignKey failure异常
|
SQL druid Oracle
【YashanDB知识库】yasdb jdbc驱动集成druid连接池,业务(java)日志中有token IDENTIFIER start异常
客户Java日志中出现异常,影响Druid的merge SQL功能(将SQL字面量替换为绑定变量以统计性能),但不影响正常业务流程。原因是Druid在merge SQL时传入null作为dbType,导致无法解析递归查询中的`start`关键字。
|
Java 程序员 开发者
Java社招面试题:一个线程运行时发生异常会怎样?
大家好,我是小米。今天分享一个经典的 Java 面试题:线程运行时发生异常,程序会怎样处理?此问题考察 Java 线程和异常处理机制的理解。线程发生异常,默认会导致线程终止,但可以通过 try-catch 捕获并处理,避免影响其他线程。未捕获的异常可通过 Thread.UncaughtExceptionHandler 处理。线程池中的异常会被自动处理,不影响任务执行。希望这篇文章能帮助你深入理解 Java 线程异常处理机制,为面试做好准备。如果你觉得有帮助,欢迎收藏、转发!
839 14
|
缓存 Java 应用服务中间件
java语言后台管理若依框架-登录提示404-接口异常-系统接口404异常如何处理-登录验证码不显示prod-api/captchaImage 404 (Not Found) 如何处理-解决方案优雅草卓伊凡
java语言后台管理若依框架-登录提示404-接口异常-系统接口404异常如何处理-登录验证码不显示prod-api/captchaImage 404 (Not Found) 如何处理-解决方案优雅草卓伊凡
5053 5
|
监控 JavaScript 数据可视化
建筑施工一体化信息管理平台源码,支持微服务架构,采用Java、Spring Cloud、Vue等技术开发。
智慧工地云平台是专为建筑施工领域打造的一体化信息管理平台,利用大数据、云计算、物联网等技术,实现施工区域各系统数据汇总与可视化管理。平台涵盖人员、设备、物料、环境等关键因素的实时监控与数据分析,提供远程指挥、决策支持等功能,提升工作效率,促进产业信息化发展。系统由PC端、APP移动端及项目、监管、数据屏三大平台组成,支持微服务架构,采用Java、Spring Cloud、Vue等技术开发。
650 7
|
SQL Java
使用java在未知表字段情况下通过sql查询信息
使用java在未知表字段情况下通过sql查询信息
279 8
|
安全 Java 数据库连接
让我们讲解一下 Map 集合遍历的方式
我是小假 期待与你的下一次相遇 ~
405 43