JavaPOI解析word提取数据到excel


一、了解POI


POI以前有了解,这次需求是解析word读取其中标题,还有内容赛选获取自己想要的内容

经过两天的学习,开始熟悉Java这么读取word和解析。

本文中运用是读取整个页面模块的range,通过对range里面的数据进行筛选,获取自己想要的数据。

https://github.com/zxiang179/POI

http://deepoove.com/poi-tl/#_why_poi_tl

主要是了解POI的数据调用的解析。

https://poi.apache.org/官方的文档API

想要实现的效果


以下测试的IP或是域名都是随便找不同类型:IP+port /url/http://www.XXX.com/www.xxx.net:8080等等存在的url组合。

目前需求是抓取这个几个关键的内容。



二、POI解析word


maven添加jar依赖

全部的POI的依赖

<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-scratchpad</artifactId><version>3.17</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>ooxml-schemas</artifactId><version>1.1</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml-schemas</artifactId><version>3.17</version></dependency>

关键代码

public class GetWord {
public static void main(String[] args) {try {InputStream is = new FileInputStream(new File("path"));  //需要将文件路更改为word文档所在路径。POIFSFileSystem fs = new POIFSFileSystem(is);HWPFDocument document = new HWPFDocument(fs);Range range = document.getRange();CharacterRun run1 = null;//用来存储第一行内容的属性CharacterRun run2 = null;//用来存储第二行内容的属性int q=1;for (int i = 0; i < range.numParagraphs()-2; i++) {Paragraph para1 = range.getParagraph(i);// 获取第i段Paragraph para2 = range.getParagraph(i+1);// 获取第i段int t=i;              //记录当前分析的段落数String paratext1 = para1.text();   //当前段落和下一段String paratext2 = para2.text();run1=para1.getCharacterRun(0);run2=para2.getCharacterRun(0);if (paratext1.length() > 0&&paratext2.length() > 0) {//这个if语句为的是去除大标题,连续三个段落字体大小递减就跳过if(run1.getFontSize()>run2.getFontSize()&&run2.getFontSize()>range.getParagraph(i+2).getCharacterRun(0).getFontSize()) {break;}//连续两段字体格式不同if(run1.getFontSize()>run2.getFontSize()) {content=paratext2;run1=run2;  //从新定位run1  run2run2=range.getParagraph(t+2).getCharacterRun(0);t=t+1;while(run1.getFontSize()==run2.getFontSize()) {//连续的相同Content+=range.getParagraph(t+1).text();if(content.matches("是否系统自身渗透结果")) break;                            if(content.contains(":")||content.contains("/")){//如果是http或者是IP+端口形式word.setName(getDomain(content));//ip}else{//纯IP形式word.setName(content);//ip}word.setAsset_name(paratext1);//标题run1=run2;run2=range.getParagraph(t+i).getCharacterRun(0);t++;……..}………}if(paratext1.matches("中危")||paratext1.matches("很高")||paratext1.matches("低危")){list2.add(paratext1);}}}if(word1.getAsset_name()==wordname.getAsset_name())){
…..wordend.setId(num);wordend.setName(word1.getName());wordend.setAsset_name(word1.getAsset_name());if(wordname.getAvailability_assignment().equals("很高")){wordend.setAvailability_assignment("5");}if(wordname.getAvailability_assignment().equals("高危")){wordend.setAvailability_assignment("4");}if(wordname.getAvailability_assignment().equals("中危")){wordend.setAvailability_assignment("3");}if(wordname.getAvailability_assignment().equals("低危")){wordend.setAvailability_assignment("2");}wordend.setRisk("网络攻击");wordmax.add(wordend);num++;……}}}System.out.println("------------------Finished-详情查看-中间文档转excel.xlsx------------------");//Excel无模版导出ExcelUtil.getInstar ().exportl(wordmax, Word.class, "中间文档转excel.xlsx");} catch (Exception e) {e.printStackTrace();}}} }

其中有URl获取IP或者Domain

public class Test{public static void main(String[] args){String url = "www.abc.def.com.cn/123456 ";String url1 = "192.168.1.100/admin";System.out.println(getDomain(url));System.out.println(getDomain(url1));}private static String getDomain(String url){String regex = "^(?:[a-zA-Z]+[.])?(\\w+([.]\\w+)*)/.*$";Matcher matcher = Pattern.compile(regex).matcher(url);String result = null;if(matcher.find()){result = matcher.group(1);}return result;}
}

运行结果:

完整的测试数据

输出到excel

GUI界面化数据操作完成和输出excel

三、总结


1、接触POI三天左右,主要是通过对文档的整个的range遍历获取数据,再通过自己的不同数据的需求进行筛选和数据处理。

2、相比HTml获取数据java获取word解析里面的数据更加的难一些,html里面有标签,可以通过操作js、css、html的标签来实现数据的获取,但是word没有特定的标签去获取,这个只能通过遍历,对比文本的大小、文本的字体等等相关信息。

3、这次word解析,结合上次的html的解析获取数据,对应java的操作不同的类型的文件流有了新的认识。

Java爬虫&html解析-Jsoup(绿盟极光报告)(https://mp.weixin.qq.com/s?__biz=MzIyNjk0ODYxMA==&mid=2247483708&idx=1&sn=4734ff8b79069eef3d47b9f7eedca269&chksm=e869e251df1e6b471ac158e121b845ed0fe0d0a88fe7b16d8124db5180eb3b6d4091d1444f72&token=1606015301&lang=zh_CN#rd)

四、参考文献


https://github.com/zxiang179/POI

http://deepoove.com/poi-tl/#_why_poi_tl

https://poi.apache.org

公众号:

thelostworld:

个人知乎:https://www.zhihu.com/people/fu-wei-43-69/columns

个人简书:https://www.jianshu.com/u/bf0e38a8d400

Java POI解析Word提取数据存储在Excel相关推荐

  1. poi 顺序解析word_JavaPOI解析word提取数据到excel

    Java POI解析Word提取数据存储在Excel 一.了解POI POI以前有了解,这次需求是解析word读取其中标题,还有内容赛选获取自己想要的内容 经过两天的学习,开始熟悉Java这么读取wo ...

  2. java POI对word中的表格动态插入固定数据,以及插入不确定数量的的数据

    java POI对word中的表格动态插入固定数据,以及插入不具体的数据 遇到个项目本来是用Execl导出的,相对简单,客户要求用Word导出,并按照他们给的模板进行导出: 从网上百度了一下,然后自己 ...

  3. python读取word指定内容_python解析html提取数据,并生成word文档实例解析

    简介 今天试着用ptyhon做了一个抓取网页内容,并生成word文档的功能,功能很简单,做一下记录以备以后用到. 生成word用到了第三方组件python-docx,所以先进行第三方组件的安装.由于w ...

  4. POI操作word填充数据,合并多个word为一个,遇到一些问题的解决

    POI操作word填充数据,合并多个word为一个,遇到一些问题的解决 最近搞一个向word模板中替换占位符 填充数据,然后将多个word合并在一起的方法.网上一搜有很多资料,现在在这儿对过程中遇到的 ...

  5. JAVA POI处理WORD

    JAVA POI处理WORD 转载:http://w26.iteye.com/blog/974442 JavaApacheSVN 关键字:POI WORD HWPF WORD文本组成:文本.图.表和宏 ...

  6. java poi 操作word遇到的问题

    java poi 操作word文本,图表,遇到的问题 直接上问题 模板字段匹配问题 图表问题 图表导出 问题:模板找不到对应图表 问题:数据填充后效果不达目标 图表中为零的数值去掉(!!!模板层面解决 ...

  7. 如何使用poi解析word生成html目录结构

    POI解析word目录结构 简介说明 认识下Word 我们先看下doc版本的word 我们再看下docx版本的word(今天的主角) 目录解析的原理介绍 写word文档时,我们是怎么设置目录? 我们看 ...

  8. poi解析word中的表格

    解析word简历,使用poi解析word表格研究记录如下: package poi;import java.io.File; import java.io.FileInputStream; impor ...

  9. poi解析word文档(解析表格,emf,wmf,svg转jpg图片)

    POI解析word文档 poi解析word的表格:   提前先准备需要的jar包:   <!-- poi --><dependency><groupId>org.a ...

最新文章

  1. 全线衰退:PC产业一枝孤秀
  2. 用子函数的方法求一维数组中所有元素之和
  3. BugkuCTF-Misc:Linux
  4. Linux产生随机数的几种常见方法
  5. python科学计数法输出_python不以科学计数法输出的实例方法总结
  6. jQuery、jQury UI、jQuery Mobile----读书笔记
  7. 全面解析Java的垃圾回收机制(转)
  8. 导航视图栏左右键自定义
  9. APUE学习(一)基础知识
  10. 在ARM+LINUX上使用pppd拔号上网(GPRS)流程
  11. matlab创建wps服务器,wps设置云服务器地址(wps放到服务器)
  12. 内网穿透干货教程,1分钟极速穿透内网端口
  13. VSCode去除.pytest_cache文件夹
  14. win7 系统定时开关机
  15. 关于python使用pandas导入dat数据文件的方法(可导入任意dat数据文件和csv数据文件)
  16. 一些bugku的题目wp
  17. poi word转html 根号,根号算法 - 作业部落 Cmd Markdown 编辑阅读器
  18. 【Java】检查二叉树是否平衡。
  19. python读取heic/heif后缀的图像
  20. 物种多样性学习之Beta多样性

热门文章

  1. RTC(run time clock)实时时钟
  2. 天河二号属于微型计算机吗,【单选题】我国的“天河二号”计算机在规模上属于( )。 A. 巨型机 B. 大型机 C. 微型机 D. 工作站...
  3. VVC spec中文翻译
  4. Android集成极光聊天SDK
  5. nginx-GET /favicon.ico HTTP/1.1
  6. 服务重启后 云硬盘,无法使用
  7. 印象笔记,为知笔记和Effie哪个更适合商业机构提案人员?
  8. 冰河浅析 - 揭开木马的神秘面纱(下)
  9. 怎么把文件发给商家打印?如何给商家发送需打印的文件
  10. word里的表格出现换页表格不会自动跳到下一页(已解决)