【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 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

 

时间: 2024-09-29 09:40:25

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

求助: Java POI如何输出带函数公式的单元格

问题描述 如图,我用JavaPOI代码输出生成的excel表格上的那个求平均数的格子里显示的是平均数函数公式的字符串,而不是函数,必须用鼠标点进去一次以后才会变成函数..如下图...:请问有什么办法可以让输出的单元格直接是函数形式而不是字符串形式呢?以下是相关代码..如果我启用了红色的那个代码,设置单元格数据类型为"公式",则单元格的值会直接"=0",平均数公式没有了,如果启用紫色的那个代码,则生成的excel会出错打不开说文件数据损坏..所以求能使单元格变成相应函

【POI xlsx】使用POI对xlsx的单元格样式进行设置 / 使用POI对xlsx的字体进行设置

涉及到的样式都在代码中有说明: 1 package com.it.poiTest; 2 3 import java.io.FileNotFoundException; 4 import java.io.FileOutputStream; 5 import java.io.IOException; 6 7 import org.apache.poi.hssf.util.HSSFColor; 8 import org.apache.poi.sl.usermodel.Sheet; 9 import o

poi-在使用POI的时候,如何给一个合并的单元格加上边框?

问题描述 在使用POI的时候,如何给一个合并的单元格加上边框? CellRangeAddress cra_f = new CellRangeAddress (colNow,colNow,0,12); sheet.addMergedRegion(cra_f); ```类似这种合并的单元格,如何为其设置边框 解决方案 NPOI合并单元格后的边框设置poi 合并单元格后添加边框POI 合并单元格 解决方案二: 可以设置单元格的样式属性的.实例: HSSFCellStyle style = getNew

arraylist-急 在线等 谢谢!java想要读取excel中某以特定单元格的值,现在是循环读出所有的值,请帮忙修改一下

问题描述 急 在线等 谢谢!java想要读取excel中某以特定单元格的值,现在是循环读出所有的值,请帮忙修改一下 package com.excel.action; import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java

对象-急!在线等!谢谢!java将excel特定的单元格写入另一个excel,已经读出来了,不会写入

问题描述 急!在线等!谢谢!java将excel特定的单元格写入另一个excel,已经读出来了,不会写入 package com.excel.action; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import jxl.Cell; import jxl.CellType; import jxl.LabelCell; import jxl.Sheet; import jxl.W

poi java excel-java poi 导出excel 把一样的数据动态合并单元格

问题描述 java poi 导出excel 把一样的数据动态合并单元格 急求,有一个list数据 导出成 这种格式 公司和年份两列是要有动态合并功能 并且年份合并的时候不能跨公司 有没有大神帮帮忙... HSSFWorkbook workbook = new HSSFWorkbook(); String[] columnNames = new String[]{"编号","公司", "年份","性质", "名称&qu

Java使用Apache POI操作excel文件

官方介绍 HSSF is the POI Project's pure Java implementation of the Excel '97(-2007) file format. XSSF is the POI Project's pure Java implementation of the Excel 2007 OOXML (.xlsx) file format. 从官方文档中了解到:POI提供的HSSF包用于操作 Excel '97(-2007)的.xls文件,而XSSF包则用于操作

java 使用 Apache POI批量导入导出excel教程及实例

一.定义 Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能. 二.所需jar包:   三.简单的一个读取excel的demo 1.读取文件方法      /**      * 读取出filePath中的所有数据信息      * @param filePath excel文件的绝对路径      *       */          public static void getDataFromEx

java中使用poi结合Struts 2来导出execl表格

第一步写action方法: public String exportActiveExcel() { String name ="活跃度列表.xls"; try { name = java.net.URLEncoder.encode(name, "UTF-8"); fileName = new String(name.getBytes(), "iso-8859-1"); } catch (UnsupportedEncodingException e