Java怎么应用poi解析word文档中的数据
本文小编为大家详细介绍“Java怎么应用poi解析word文档中的数据”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java怎么应用poi解析word文档中的数据”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。
Apache POI是Apache软件基金会的开源项目,POI提供API给Java程序对Microsoft Office格式档案读和写的功能。 .NET的开发人员则可以利用NPOI (POI for .NET) 来存取 Microsoft Office文档的功能。
方法如下:
1、增加maven中的包
<dependency><groupId>org.apache.poi</groupId><artifactId>poi-scratchpad</artifactId><version>3.17</version></dependency><!--POI包--><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.17</version></dependency>
2、解析doc中的数据
获取文件,把MultipartFile对象的数据转成本地file
Filefile=newFile(FileUtils.getUserDirectoryPath()+"/"+multipartFile.getOriginalFilename());FileUtils.copyInputStreamToFile(multipartFile.getInputStream(),file);
StringfileName=file.getName().toLowerCase();FileInputStreamin=newFileInputStream(file);if(fileName.endsWith(".doc")){//处理doc格式即office2003版本handlerDoc(in);}if(fileName.endsWith(".docx")){handlerDocx(in);}
解析doc格式中的段落和第一个表格数据
/***doc格式解析**@paramin*@throwsIOException*/privatevoidhandlerDoc(FileInputStreamin)throwsIOException{POIFSFileSystempfs=newPOIFSFileSystem(in);HWPFDocumenthwpf=newHWPFDocument(pfs);//得到文档的读取范围Rangerange=hwpf.getRange();for(inti=0;i<range.numParagraphs();i++){//段落Paragraphp=range.getParagraph(i);//段落文本StringparagraphText=p.text().replace("","");log.info("paragraphText={}",paragraphText);if(paragraphText.contains(VALUE_YLYC)){analyze=false;}}TableIteratorit=newTableIterator(range);//迭代文档中的表格//如果有多个表格只读取需要的一个set是设置需要读取的第几个表格,total是文件中表格的总数intset=1,total=1;intnum=set;for(inti=0;i<set-1;i++){it.hasNext();it.next();}while(it.hasNext()){Map<String,List<String>>tabelText=DocUtils.getTabelDocText((Table)it.next());log.info("tabelText={}",tabelText);}//过滤多余的表格while(num<total){it.hasNext();it.next();num+=1;}}
3、解析docx中数据
解析docx格式中的段落和第一个表格数据
/***docx格式解析**@paramin*@throwsIOException*/privatevoidhandlerDocx(FileInputStreamin)throwsIOException{XWPFDocumentxwpf=newXWPFDocument(in);//获取word中的所有段落与表格List<IBodyElement>elements=xwpf.getBodyElements();//解析表格后续不解析for(IBodyElementelement:elements){//段落if(elementinstanceofXWPFParagraph){StringparagraphText=DocUtils.getParagraphText((XWPFParagraph)element);log.info("paragraphText={}",paragraphText);}elseif(elementinstanceofXWPFTable){//表格Map<String,List<String>>tabelText=DocUtils.getTabelText((XWPFTable)element);log.info("tabelText={}",tabelText);}else{log.info("其他内容");}}}
工具类
packagecom.hundsun.fais.innerreport.utils;importorg.apache.poi.hwpf.usermodel.Paragraph;importorg.apache.poi.hwpf.usermodel.Table;importorg.apache.poi.hwpf.usermodel.TableCell;importorg.apache.poi.hwpf.usermodel.TableRow;importorg.apache.poi.xwpf.usermodel.*;importjava.util.*;/***@authorlvbaolin*@date2021/4/210:39*/publicclassDocUtils{/***docx格式获取表格内容**@paramtable*/publicstaticMap<String,List<String>>getTabelText(XWPFTabletable){Map<String,List<String>>result=newLinkedHashMap<>();List<XWPFTableRow>rows=table.getRows();for(XWPFTableRowrow:rows){Stringkey=null;List<String>list=newArrayList<>(16);inti=0;List<XWPFTableCell>cells=row.getTableCells();for(XWPFTableCellcell:cells){//简单获取内容(简单方式是不能获取字体对齐方式的)StringBuffersb=newStringBuffer();//一个单元格可以理解为一个word文档,单元格里也可以加段落与表格List<XWPFParagraph>paragraphs=cell.getParagraphs();for(XWPFParagraphparagraph:paragraphs){sb.append(DocUtils.getParagraphText(paragraph));}if(i==0){key=sb.toString();}else{Stringvalue=sb.toString();list.add(value==null||Objects.deepEquals(value,"")?null:value.replace(",",""));}i++;}result.put(key,list);}returnresult;}/***docx获取段落字符串*获取段落内容**@paramparagraph*/publicstaticStringgetParagraphText(XWPFParagraphparagraph){StringBufferrunText=newStringBuffer();//获取段落中所有内容List<XWPFRun>runs=paragraph.getRuns();if(runs.size()==0){returnrunText.toString();}for(XWPFRunrun:runs){runText.append(run.text());}returnrunText.toString();}/***doc格式的字段解析表格*@paramtb*@return*/publicstaticMap<String,List<String>>getTabelDocText(Tabletb){Map<String,List<String>>result=newHashMap<>(16);//迭代行,默认从0开始,可以依据需要设置i的值,改变起始行数,也可设置读取到那行,只需修改循环的判断条件即可for(inti=0;i<tb.numRows();i++){List<String>list=newArrayList<>(16);intx=0;TableRowtr=tb.getRow(i);Stringkey=null;//迭代列,默认从0开始for(intj=0;j<tr.numCells();j++){//取得单元格TableCelltd=tr.getCell(j);StringBuffersb=newStringBuffer();//取得单元格的内容for(intk=0;k<td.numParagraphs();k++){Paragraphparagraph=td.getParagraph(k);Strings=paragraph.text();//去除后面的特殊符号if(null!=s&&!"".equals(s)){s=s.substring(0,s.length()-1);}sb.append(s);}if(x==0){key=sb.toString();}else{Stringvalue=sb.toString();list.add(value==null||Objects.deepEquals(value,"")?null:value.replace(",",""));}x++;}result.put(key,list);}returnresult;}}
读到这里,这篇“Java怎么应用poi解析word文档中的数据”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注亿速云行业资讯频道。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。