poi读取excel数据(poi读取excel数字类型)

poi读取excel数据(poi读取excel数字类型)

cnblogs.com/swordfall/p/8298386.html

1. Excel2003与Excel2007

两个版本的最大行数和列数不同,2003版最大行数是65536行,最大列数是256列,2007版及以后的版本最大行数是1048576行,最大列数是16384列。

excel2003是以二进制的方式存储,这种格式不易被其他软件读取使用;而excel2007采用了基于XML的ooxml开放文档标准,ooxml使用XML和ZIP技术结合进行文件存储,XML是一个基于文本的格式,而且ZIP容器支持内容的压缩,所以其一大优势是可以大大减小文件的尺寸。

2. 大批量数据读写

2.1 大批量数据写入

对于大数据的Xlsx文件的写入,POI3.8提供了SXSSFSXSSFWorkbook类,采用缓存方式进行大批量写文件。

详情可以查看poi官网示例:

http://poi.apache.org/spreadsheet/how-to.html#sxssf

http://blog.csdn.net/daiyutage/article/details/53010491

2.2 大批量数据读取

POI读取Excel有两种模式,一种是用户模式,一种是SAX事件驱动模式,将xlsx格式的文档转换成CSV格式后进行读取。用户模式API接口丰富,使用POI的API可以很容易读取Excel,但用户模式消耗的内存很大,当遇到很大sheet、大数据网格,假空行、公式等问题时,很容易导致内存溢出。

POI官方推荐解决内存溢出的方式使用CVS格式解析,即SAX事件驱动模式。下面主要是讲解如何读取大批量数据:

2.2.1 pom.xml所需jar包<projectxmlns=”http://maven.apache.org/POM/4.0.0″xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”xsi:schemaLocation=”http://maven.apache.org/POM/4.0.0http://maven.apache.org/maven-v4_0_0.xsd”><modelVersion>4.0.0</modelVersion><groupId>POIExcel</groupId><artifactId>POIExcel</artifactId><packaging>war</packaging><version>1.0-SNAPSHOT</version><name>POIExcelMavenWebapp</name><url>http://maven.apache.org</url><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>3.8.1</version><scope>test</scope></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.17</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.17</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml-schemas</artifactId><version>3.17</version></dependency><dependency><groupId>com.syncthemall</groupId><artifactId>boilerpipe</artifactId><version>1.2.1</version></dependency><dependency><groupId>xerces</groupId><artifactId>xercesImpl</artifactId><version>2.11.0</version></dependency><dependency><groupId>xml-apis</groupId><artifactId>xml-apis</artifactId><version>1.4.01</version></dependency><dependency><groupId>org.apache.xmlbeans</groupId><artifactId>xmlbeans</artifactId><version>2.6.0</version></dependency><dependency><groupId>sax</groupId><artifactId>sax</artifactId><version>2.0.1</version></dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.7</version></dependency></dependencies><build><finalName>POIExcel</finalName></build></project>2.2.2 POI以SAX解析excel2007文件

解决思路:通过继承DefaultHandler类,重写process(),startElement(),characters(),endElement()这四个方法。推荐:Java面试练题宝典

process()方式主要是遍历所有的sheet,并依次调用startElement()、characters()方法、endElement()这三个方法。startElement()用于设定单元格的数字类型(如日期、数字、字符串等等)。characters()用于获取该单元格对应的索引值或是内容值(如果单元格类型是字符串、INLINESTR、数字、日期则获取的是索引值;其他如布尔值、错误、公式则获取的是内容值)。endElement()根据startElement()的单元格数字类型和characters()的索引值或内容值,最终得出单元格的内容值,并打印出来。packageorg.poi;importorg.apache.poi.openxml4j.opc.OPCPackage;importorg.apache.poi.ss.usermodel.BuiltinFormats;importorg.apache.poi.ss.usermodel.DataFormatter;importorg.apache.poi.xssf.eventusermodel.XSSFReader;importorg.apache.poi.xssf.model.SharedStringsTable;importorg.apache.poi.xssf.model.StylesTable;importorg.apache.poi.xssf.usermodel.XSSFCellStyle;importorg.apache.poi.xssf.usermodel.XSSFRichTextString;importorg.xml.sax.Attributes;importorg.xml.sax.InputSource;importorg.xml.sax.SAXException;importorg.xml.sax.XMLReader;importorg.xml.sax.helpers.DefaultHandler;importorg.xml.sax.helpers.XMLReaderFactory;importjava.io.InputStream;importjava.util.ArrayList;importjava.util.List;/***@authory*@descPOI读取excel有两种模式,一种是用户模式,一种是事件驱动模式*采用SAX事件驱动模式解决XLSX文件,可以有效解决用户模式内存溢出的问题,*该模式是POI官方推荐的读取大数据的模式,*在用户模式下,数据量较大,Sheet较多,或者是有很多无用的空行的情况下,容易出现内存溢出*<p>*用于解决.xlsx2007版本大数据量问题**/publicclassExcelXlsxReaderextendsDefaultHandler{/***单元格中的数据可能的数据类型*/enumCellDataType{BOOL,ERROR,FORMULA,INLINESTR,SSTINDEX,NUMBER,DATE,NULL}/***共享字符串表*/privateSharedStringsTablesst;/***上一次的索引值*/privateStringlastIndex;/***文件的绝对路径*/privateStringfilePath=””;/***工作表索引*/privateintsheetIndex=0;/***sheet名*/privateStringsheetName=””;/***总行数*/privateinttotalRows=0;/***一行内cell集合*/privateList<String>cellList=newArrayList<String>();/***判断整行是否为空行的标记*/privatebooleanflag=false;/***当前行*/privateintcurRow=1;/***当前列*/privateintcurCol=0;/***T元素标识*/privatebooleanisTElement;/***判断上一单元格是否为文本空单元格*/privatebooleanstartElementFlag=true;privatebooleanendElementFlag=false;privatebooleancharactersFlag=false;/***异常信息,如果为空则表示没有异常*/privateStringexceptionMessage;/***单元格数据类型,默认为字符串类型*/privateCellDataTypenextDataType=CellDataType.SSTINDEX;privatefinalDataFormatterformatter=newDataFormatter();/***单元格日期格式的索引*/privateshortformatIndex;/***日期格式字符串*/privateStringformatString;//定义前一个元素和当前元素的位置,用来计算其中空的单元格数量,如A6和A8等privateStringprePreRef=”A”,preRef=null,ref=null;//定义该文档一行最大的单元格数,用来补全一行最后可能缺失的单元格privateStringmaxRef=null;/***单元格*/privateStylesTablestylesTable;/***遍历工作簿中所有的电子表格*并缓存在mySheetList中**@paramfilename*@throwsException*/publicintprocess(Stringfilename)throwsException{filePath=filename;OPCPackagepkg=OPCPackage.open(filename);XSSFReaderxssfReader=newXSSFReader(pkg);stylesTable=xssfReader.getStylesTable();SharedStringsTablesst=xssfReader.getSharedStringsTable();XMLReaderparser=XMLReaderFactory.createXMLReader(“org.apache.xerces.parsers.SAXParser”);this.sst=sst;parser.setContentHandler(this);XSSFReader.SheetIteratorsheets=(XSSFReader.SheetIterator)xssfReader.getSheetsData();while(sheets.hasNext()){//遍历sheetcurRow=1;//标记初始行为第一行sheetIndex ;InputStreamsheet=sheets.next();//sheets.next()和sheets.getSheetName()不能换位置,否则sheetName报错sheetName=sheets.getSheetName();InputSourcesheetSource=newInputSource(sheet);parser.parse(sheetSource);//解析excel的每条记录,在这个过程中startElement()、characters()、endElement()这三个函数会依次执行sheet.close();}returntotalRows;//返回该excel文件的总行数,不包括首列和空行}/***第一个执行**@paramuri*@paramlocalName*@paramname*@paramattributes*@throwsSAXException*/@OverridepublicvoidstartElement(Stringuri,StringlocalName,Stringname,Attributesattributes)throwsSAXException{//c=>单元格if(“c”.equals(name)){//前一个单元格的位置if(preRef==null){preRef=attributes.getValue(“r”);}else{//中部文本空单元格标识‘endElementFlag’判断前一次是否为文本空字符串,true则表明不是文本空字符串,false表明是文本空字符串跳过把空字符串的位置赋予preRefif(endElementFlag){preRef=ref;}}//当前单元格的位置ref=attributes.getValue(“r”);//首部文本空单元格标识‘startElementFlag’判断前一次,即首部是否为文本空字符串,true则表明不是文本空字符串,false表明是文本空字符串,且已知当前格,即第二格带“B”标志,则ref赋予preRefif(!startElementFlag&&!flag){//上一个单元格为文本空单元格,执行下面的,使ref=preRef;flag为true表明该单元格之前有数据值,即该单元格不是首部空单元格,则跳过//这里只有上一个单元格为文本空单元格,且之前的几个单元格都没有值才会执行preRef=ref;}//设定单元格类型this.setNextDataType(attributes);endElementFlag=false;charactersFlag=false;startElementFlag=false;}//当元素为t时if(“t”.equals(name)){isTElement=true;}else{isTElement=false;}//置空lastIndex=””;}/***第二个执行*得到单元格对应的索引值或是内容值*如果单元格类型是字符串、INLINESTR、数字、日期,lastIndex则是索引值*如果单元格类型是布尔值、错误、公式,lastIndex则是内容值*@paramch*@paramstart*@paramlength*@throwsSAXException*/@Overridepublicvoidcharacters(char[]ch,intstart,intlength)throwsSAXException{startElementFlag=true;charactersFlag=true;lastIndex =newString(ch,start,length);}/***第三个执行**@paramuri*@paramlocalName*@paramname*@throwsSAXException*/@OverridepublicvoidendElement(Stringuri,StringlocalName,Stringname)throwsSAXException{//t元素也包含字符串if(isTElement){//这个程序没经过//将单元格内容加入rowlist中,在这之前先去掉字符串前后的空白符Stringvalue=lastIndex.trim();cellList.add(curCol,value);endElementFlag=true;curCol ;isTElement=false;//如果里面某个单元格含有值,则标识该行不为空行if(value!=null&&!””.equals(value)){flag=true;}}elseif(“v”.equals(name)){//v=>单元格的值,如果单元格是字符串,则v标签的值为该字符串在SST中的索引Stringvalue=this.getDataValue(lastIndex.trim(),””);//根据索引值获取对应的单元格值//补全单元格之间的空单元格if(!ref.equals(preRef)){intlen=countNullCell(ref,preRef);for(inti=0;i<len;i ){cellList.add(curCol,””);curCol ;}}elseif(ref.equals(preRef)&&!ref.startWith(“A”)){//ref等于preRef,且以B或者C…开头,表明首部为空格271intlen=countNullCell(ref,”A”);for(inti=0;i<=len;i ){cellList.add(curCol,””);curCol ;}}cellList.add(curCol,value);curCol ;endElementFlag=true;//如果里面某个单元格含有值,则标识该行不为空行if(value!=null&&!””.equals(value)){flag=true;}}else{//如果标签名称为row,这说明已到行尾,调用optRows()方法if(“row”.equals(name)){//默认第一行为表头,以该行单元格数目为最大数目if(curRow==1){maxRef=ref;}//补全一行尾部可能缺失的单元格if(maxRef!=null){intlen=-1;//前一单元格,true则不是文本空字符串,false则是文本空字符串if(charactersFlag){len=countNullCell(maxRef,ref);}else{len=countNullCell(maxRef,preRef);}for(inti=0;i<=len;i ){cellList.add(curCol,””);curCol ;}}if(flag&&curRow!=1){//该行不为空行且该行不是第一行,则发送(第一行为列名,不需要)ExcelReaderUtil.sendRows(filePath,sheetName,sheetIndex,curRow,cellList);totalRows ;}cellList.clear();curRow ;curCol=0;preRef=null;prePreRef=null;ref=null;flag=false;}}}/***处理数据类型**@paramattributes*/publicvoidsetNextDataType(Attributesattributes){nextDataType=CellDataType.NUMBER;//cellType为空,则表示该单元格类型为数字formatIndex=-1;formatString=null;StringcellType=attributes.getValue(“t”);//单元格类型StringcellStyleStr=attributes.getValue(“s”);//StringcolumnData=attributes.getValue(“r”);//获取单元格的位置,如A1,B1if(“b”.equals(cellType)){//处理布尔值nextDataType=CellDataType.BOOL;}elseif(“e”.equals(cellType)){//处理错误nextDataType=CellDataType.ERROR;}elseif(“inlineStr”.equals(cellType)){nextDataType=CellDataType.INLINESTR;}elseif(“s”.equals(cellType)){//处理字符串nextDataType=CellDataType.SSTINDEX;}elseif(“str”.equals(cellType)){nextDataType=CellDataType.FORMULA;}if(cellStyleStr!=null){//处理日期intstyleIndex=Integer.parseInt(cellStyleStr);XSSFCellStylestyle=stylesTable.getStyleAt(styleIndex);formatIndex=style.getDataFormat();formatString=style.getDataFormatString();if(formatString.contains(“m/d/yyyy”)||formatString.contains(“yyyy/mm/dd”)||formatString.contains(“yyyy/m/d”)){nextDataType=CellDataType.DATE;formatString=”yyyy-MM-ddhh:mm:ss”;}if(formatString==null){nextDataType=CellDataType.NULL;formatString=BuiltinFormats.getBuiltinFormat(formatIndex);}}}/***对解析出来的数据进行类型处理*@paramvalue单元格的值,* value代表解析:BOOL的为0或1, ERROR的为内容值,FORMULA的为内容值,INLINESTR的为索引值需转换为内容值,*SSTINDEX的为索引值需转换为内容值,NUMBER为内容值,DATE为内容值*@paramthisStr一个空字符串*@return*/@SuppressWarnings(“deprecation”)publicStringgetDataValue(Stringvalue,StringthisStr){switch(nextDataType){//这几个的顺序不能随便交换,交换了很可能会导致数据错误caseBOOL://布尔值charfirst=value.charAt(0);thisStr=first==’0′?”FALSE”:”TRUE”;break;caseERROR://错误thisStr=”\”ERROR:” value.toString() ‘”‘;break;caseFORMULA://公式thisStr='”‘ value.toString() ‘”‘;break;caseINLINESTR:XSSFRichTextStringrtsi=newXSSFRichTextString(value.toString());thisStr=rtsi.toString();rtsi=null;break;caseSSTINDEX://字符串StringsstIndex=value.toString();try{intidx=Integer.parseInt(sstIndex);XSSFRichTextStringrtss=newXSSFRichTextString(sst.getEntryAt(idx));//根据idx索引值获取内容值thisStr=rtss.toString();System.out.println(thisStr);//有些字符串是文本格式的,但内容却是日期rtss=null;}catch(NumberFormatExceptionex){thisStr=value.toString();}break;caseNUMBER://数字if(formatString!=null){thisStr=formatter.formatRawCellContents(Double.parseDouble(value),formatIndex,formatString).trim();}else{thisStr=value;}thisStr=thisStr.replace(“_”,””).trim();break;caseDATE://日期thisStr=formatter.formatRawCellContents(Double.parseDouble(value),formatIndex,formatString);//对日期字符串作特殊处理,去掉TthisStr=thisStr.replace(“T”,””);break;default:thisStr=””;break;}returnthisStr;}publicintcountNullCell(Stringref,StringpreRef){//excel2007最大行数是1048576,最大列数是16384,最后一列列名是XFDStringxfd=ref.replaceAll(“\\d “,””);Stringxfd_1=preRef.replaceAll(“\\d “,””);xfd=fillChar(xfd,3,’@’,true);xfd_1=fillChar(xfd_1,3,’@’,true);char[]letter=xfd.toCharArray();char[]letter_1=xfd_1.toCharArray();intres=(letter[0]-letter_1[0])*26*26 (letter[1]-letter_1[1])*26 (letter[2]-letter_1[2]);returnres-1;}publicStringfillChar(Stringstr,intlen,charlet,booleanisPre){intlen_1=str.length();if(len_1<len){if(isPre){for(inti=0;i<(len-len_1);i ){str=let str;}}else{for(inti=0;i<(len-len_1);i ){str=str let;}}}returnstr;}/***@returntheexceptionMessage*/publicStringgetExceptionMessage(){returnexceptionMessage;}}2.2.3 POI通过继承HSSFListener类来解决Excel2003文件

解决思路:重写process(),processRecord()两个方法,其中processRecord是核心方法,用于处理sheetName和各种单元格数字类型。推荐:Java面试练题宝典

packageorg.poi;importorg.apache.poi.hssf.eventusermodel.*;importorg.apache.poi.hssf.eventusermodel.dummyrecord.LastCellOfRowDummyRecord;importorg.apache.poi.hssf.eventusermodel.dummyrecord.MissingCellDummyRecord;importorg.apache.poi.hssf.model.HSSFFormulaParser;importorg.apache.poi.hssf.record.*;importorg.apache.poi.hssf.usermodel.HSSFDataFormatter;importorg.apache.poi.hssf.usermodel.HSSFWorkbook;importorg.apache.poi.poifs.filesystem.POIFSFileSystem;importjava.io.FileInputStream;importjava.util.ArrayList;importjava.util.List;/***@authory*@desc用于解决.xls2003版本大数据量问题**/publicclassExcelXlsReaderimplementsHSSFListener{privateintminColums=-1;privatePOIFSFileSystemfs;/***总行数*/privateinttotalRows=0;/***上一行row的序号*/privateintlastRowNumber;/***上一单元格的序号*/privateintlastColumnNumber;/***是否输出formula,还是它对应的值*/privatebooleanoutputFormulaValues=true;/***用于转换formulas*/privateEventWorkbookBuilder.SheetRecordCollectingListenerworkbookBuildingListener;//excel2003工作簿privateHSSFWorkbookstubWorkbook;privateSSTRecordsstRecord;privateFormatTrackingHSSFListenerformatListener;privatefinalHSSFDataFormatterformatter=newHSSFDataFormatter();/***文件的绝对路径*/privateStringfilePath=””;//表索引privateintsheetIndex=0;privateBoundSheetRecord[]orderedBSRs;@SuppressWarnings(“unchecked”)privateArrayListboundSheetRecords=newArrayList();privateintnextRow;privateintnextColumn;privatebooleanoutputNextStringRecord;//当前行privateintcurRow=0;//存储一行记录所有单元格的容器privateList<String>cellList=newArrayList<String>();/***判断整行是否为空行的标记*/privatebooleanflag=false;@SuppressWarnings(“unused”)privateStringsheetName;/***遍历excel下所有的sheet**@paramfileName*@throwsException*/publicintprocess(StringfileName)throwsException{filePath=fileName;this.fs=newPOIFSFileSystem(newFileInputStream(fileName));MissingRecordAwareHSSFListenerlistener=newMissingRecordAwareHSSFListener(this);formatListener=newFormatTrackingHSSFListener(listener);HSSFEventFactoryfactory=newHSSFEventFactory();HSSFRequestrequest=newHSSFRequest();if(outputFormulaValues){request.addListenerForAllRecords(formatListener);}else{workbookBuildingListener=newEventWorkbookBuilder.SheetRecordCollectingListener(formatListener);request.addListenerForAllRecords(workbookBuildingListener);}factory.processWorkbookEvents(request,fs);returntotalRows;//返回该excel文件的总行数,不包括首列和空行}/***HSSFListener监听方法,处理Record*处理每个单元格*@paramrecord*/@SuppressWarnings(“unchecked”)publicvoidprocessRecord(Recordrecord){intthisRow=-1;intthisColumn=-1;StringthisStr=null;Stringvalue=null;switch(record.getSid()){caseBoundSheetRecord.sid:boundSheetRecords.add(record);break;caseBOFRecord.sid://开始处理每个sheetBOFRecordbr=(BOFRecord)record;if(br.getType()==BOFRecord.TYPE_WORKSHEET){//如果有需要,则建立子工作簿if(workbookBuildingListener!=null&&stubWorkbook==null){stubWorkbook=workbookBuildingListener.getStubHSSFWorkbook();}if(orderedBSRs==null){orderedBSRs=BoundSheetRecord.orderByBofPosition(boundSheetRecords);}sheetName=orderedBSRs[sheetIndex].getSheetname();sheetIndex ;}break;caseSSTRecord.sid:sstRecord=(SSTRecord)record;break;caseBlankRecord.sid://单元格为空白BlankRecordbrec=(BlankRecord)record;thisRow=brec.getRow();thisColumn=brec.getColumn();thisStr=””;cellList.add(thisColumn,thisStr);break;caseBoolErrRecord.sid://单元格为布尔类型BoolErrRecordberec=(BoolErrRecord)record;thisRow=berec.getRow();thisColumn=berec.getColumn();thisStr=berec.getBooleanValue() “”;cellList.add(thisColumn,thisStr);checkRowIsNull(thisStr);//如果里面某个单元格含有值,则标识该行不为空行break;caseFormulaRecord.sid://单元格为公式类型FormulaRecordfrec=(FormulaRecord)record;thisRow=frec.getRow();thisColumn=frec.getColumn();if(outputFormulaValues){if(Double.isNaN(frec.getValue())){outputNextStringRecord=true;nextRow=frec.getRow();nextColumn=frec.getColumn();}else{thisStr='”‘ HSSFFormulaParser.toFormulaString(stubWorkbook,frec.getParsedExpression()) ‘”‘;}}else{thisStr='”‘ HSSFFormulaParser.toFormulaString(stubWorkbook,frec.getParsedExpression()) ‘”‘;}cellList.add(thisColumn,thisStr);checkRowIsNull(thisStr);//如果里面某个单元格含有值,则标识该行不为空行break;caseStringRecord.sid://单元格中公式的字符串if(outputNextStringRecord){StringRecordsrec=(StringRecord)record;thisStr=srec.getString();thisRow=nextRow;thisColumn=nextColumn;outputNextStringRecord=false;}break;caseLabelRecord.sid:LabelRecordlrec=(LabelRecord)record;curRow=thisRow=lrec.getRow();thisColumn=lrec.getColumn();value=lrec.getValue().trim();value=value.equals(“”)?””:value;cellList.add(thisColumn,value);checkRowIsNull(value);//如果里面某个单元格含有值,则标识该行不为空行break;caseLabelSSTRecord.sid://单元格为字符串类型LabelSSTRecordlsrec=(LabelSSTRecord)record;curRow=thisRow=lsrec.getRow();thisColumn=lsrec.getColumn();if(sstRecord==null){cellList.add(thisColumn,””);}else{value=sstRecord.getString(lsrec.getSSTIndex()).toString().trim();value=value.equals(“”)?””:value;cellList.add(thisColumn,value);checkRowIsNull(value);//如果里面某个单元格含有值,则标识该行不为空行}break;caseNumberRecord.sid://单元格为数字类型NumberRecordnumrec=(NumberRecord)record;curRow=thisRow=numrec.getRow();thisColumn=numrec.getColumn();//第一种方式//value=formatListener.formatNumberDateCell(numrec).trim();//这个被写死,采用的m/d/yyh:mm格式,不符合要求//第二种方式,参照formatNumberDateCell里面的实现方法编写DoublevalueDouble=((NumberRecord)numrec).getValue();StringformatString=formatListener.getFormatString(numrec);if(formatString.contains(“m/d/yy”)){formatString=”yyyy-MM-ddhh:mm:ss”;}intformatIndex=formatListener.getFormatIndex(numrec);value=formatter.formatRawCellContents(valueDouble,formatIndex,formatString).trim();value=value.equals(“”)?””:value;//向容器加入列值cellList.add(thisColumn,value);checkRowIsNull(value);//如果里面某个单元格含有值,则标识该行不为空行break;default:break;}//遇到新行的操作if(thisRow!=-1&&thisRow!=lastRowNumber){lastColumnNumber=-1;}//空值的操作if(recordinstanceofMissingCellDummyRecord){MissingCellDummyRecordmc=(MissingCellDummyRecord)record;curRow=thisRow=mc.getRow();thisColumn=mc.getColumn();cellList.add(thisColumn,””);}//更新行和列的值if(thisRow>-1)lastRowNumber=thisRow;if(thisColumn>-1)lastColumnNumber=thisColumn;//行结束时的操作if(recordinstanceofLastCellOfRowDummyRecord){if(minColums>0){//列值重新置空if(lastColumnNumber==-1){lastColumnNumber=0;}}lastColumnNumber=-1;if(flag&&curRow!=0){//该行不为空行且该行不是第一行,发送(第一行为列名,不需要)ExcelReaderUtil.sendRows(filePath,sheetName,sheetIndex,curRow 1,cellList);//每行结束时,调用sendRows()方法totalRows ;}//清空容器cellList.clear();flag=false;}}/***如果里面某个单元格含有值,则标识该行不为空行*@paramvalue*/publicvoidcheckRowIsNull(Stringvalue){if(value!=null&&!””.equals(value)){flag=true;}}}2.2.4 辅助类ExcelReaderUtil

调用ExcelXlsReader类和ExcelXlsxReader类对excel2003和excel2007两个版本进行大批量数据读取:

https://github.com/SwordfallYeung/POIExcel

END推荐好文

分享一套基于SpringBoot和Vue的企业级中后台开源项目,代码很规范!

能挣钱的,开源 SpringBoot 商城系统,功能超全,超漂亮!

发表评论

登录后才能评论