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

Java POI解析Word提取数据存储在Excel

一、了解POI

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

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

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

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

想要实现的效果

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

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

二、POI解析word

maven添加jar依赖

全部的POI的依赖

org.apache.poi

poi

3.17

org.apache.poi

poi-ooxml

3.17

org.apache.poi

poi-scratchpad

3.17

org.apache.poi

ooxml-schemas

1.1

org.apache.poi

poi-ooxml-schemas

3.17

关键代码

public class GetWord1 {

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 run2

run2=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 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的操作不同的类型的文件流有了新的认识。

四、参考文献

​公众号:

thelostworld:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/564389.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android studio viewo,Android Studio 之 ViewModel

ViewModel 是 JetPack 类库中的一个功能&#xff0c;可以保存控件的状态 &#xff0c;在整个Activity 生命周期中&#xff0c;状态不会失效如屏幕翻转时&#xff0c;状态可保留&#xff0c;不会失效&#xff01;与 LiveData 配合使用&#xff01;配合 Room 进行 Sqlite 操作数据…

git安装 perl ubuntu_ubuntu下安装git

最近在做自己的个人博客项目&#xff0c;部署在阿里云主机上&#xff0c;系统为ubuntu 16.04.4。项目开发在自己的Windows电脑上&#xff0c;每次项目进行改动后都需要手动上传文件到服务器上&#xff0c;感觉很是麻烦。所以准备在服务器上安装git并关联github账号&#xff0c;…

android 图片传递,如何使用包在Android活动之间传递图像(位图)?

按照EboMike的建议&#xff0c;我将位图保存在一个名为MyImage在我的应用程序的内部存储中&#xff0c;无法访问我的其他应用程序。这部分的代码如下&#xff1a;public String createImageFromBitmap(Bitmap bitmap) {String fileName "myImage";//no .png or .jpg…

php调用restful接口_分享一个PHP调用RestFul接口的函数

/*** [http 调用接口函数]* Date 2016-07-11* Author GeorgeHao* param string $url [接口地址]* param array $params [数组]* param string $method [GET\POST\DELETE\PUT]* param array $header [HTTP头信息]* param integer $timeout [超时时间]* return [type] [接口返回数…

graphpad如何换柱状图与折线图能否混合一起_excel柱状图加折线图组合怎么做,原来是这样的...

今天小编教大家如Excel柱状图加折线图组合怎么做。操作方法01以下图表格为例&#xff0c;我们就用这个年份、销量和增长率来做个柱状图与折线图的组合形式图表。首先&#xff0c;拖动鼠标&#xff0c;选中销量和增长率两项的所有数据。02选中数据后&#xff0c;点击上面菜单栏中…

ucache灾备云报价_UCACHE灾备云功能

(IDC彭帅)未来互联网、移动互联网、物联网、工业互联网行业将迎来迅猛发展&#xff0c;作为数据安全最后一道防线&#xff0c;灾备技术具有巨大的应用前景。当前&#xff0c;企业的每一个业务系统所关心的最主要问题就是业务如何连续运转的问题&#xff0c;这其中&#xff0c;既…

html下拉框选择后自动刷新,html select 下拉框刷新页面后保留上一次选择的值

常用场景组合条件查询点击查询/刷新页面&#xff0c;包括input输入框\复选框等在内的组件都可以通过前端设置value"{{id}}"&#xff0c;后台发送的数据包括对应的字段&#xff0c;从而实现刷新后保留上一次的值&#xff0c;提高用户体验&#xff0c;但是发现select不…

极域电子书包课堂管理系统_朝阳群众说小康 | 从黑板课本到VR互动课堂、电子书包,朝阳的课堂如此有趣!...

教育变迁一支粉笔、一块黑板、一本教材曾经是教师上课沿袭了几十年的“三大法宝”随着时代发展当科技遇上了教育课堂上又会擦出什么样的火花呢&#xff1f;今天&#xff0c;小朝带你走进咱朝阳的校园一探究竟不一young的朝阳教育近日&#xff0c;教育部“基于教学改革、融合信息…

MySQL的优点

MySQL 使用的 SQL 语言是用于访问数据库的最常用的标准化语言。 由于 MySQL 数据库体积小、速度快、总体拥有成本低、开放源代码&#xff0c;其有着广泛的应用&#xff0c;一般中小型网站的开发都选择 MySQL 作为网站数据库。由于其社区版的性能卓越&#xff0c;因此搭配 PHP …

鸿蒙行车记录仪,百度导航新增行车记录仪功能 可消除碰瓷风险

年关将至&#xff0c;市区内各类大型商场、超市、菜市场等地人流密集&#xff0c;此类地点非常容易出现意外状况&#xff0c;市民在驾车出行时千万要提高注意力&#xff0c;警惕碰瓷者倒在你面前。如果事先装载行车记录仪&#xff0c;就能避免一桩“冤案”的发生。日前&#xf…

安装引导黑屏_给电脑安装系统老是装不上,重启就黑屏,原来是这项设置在作怪!...

很多人和我反映说&#xff1a;给电脑安装系统重启电脑后就黑屏无法正确解压系统&#xff0c;这个问题大家有没有遇到呢&#xff1f;遇到这个问题的人可能会认为自己电脑的硬盘坏了&#xff0c;明明已经把需要的Windows操作系统拷贝到硬盘已经成功了&#xff0c;重启电脑准备解压…

MySQL创建数据库

MySQL 中&#xff0c;我们可以使用 CREATE DATABASE 语句创建数据库&#xff0c;语法格式如下&#xff1a; CREATE DATABASE [IF NOT EXISTS] <数据库名> [[DEFAULT] CHARACTER SET <字符集名>] [[DEFAULT] COLLATE <校对规则名>];[ ]中的内容是可选的。语…

如果表不存在则创建_当创建一个文件的时候,操作系统发生了什么

操作文件是我们平时经常有的操作。但是我们可能并不是很了解他们原理&#xff0c;比如为什么删除一个很大的文件&#xff0c;会非常快&#xff1f;创建一个文件的时候&#xff0c;系统发生了什么&#xff1f;为什么删除的文件&#xff0c;还可以恢复&#xff1f;知其然知其所以…

两个html页面之间通讯,面试官:前端跨页面通信,你知道哪些方法?

引言在浏览器中&#xff0c;我们可以同时打开多个Tab页&#xff0c;每个Tab页可以粗略理解为一个“独立”的运行环境&#xff0c;即使是全局对象也不会在多个Tab间共享。然而有些时候&#xff0c;我们希望能在这些“独立”的Tab页面之间同步页面的数据、信息或状态。正如下面这…

MySQL查看或显示数据库

MySQL 中&#xff0c;可使用 SHOW DATABASES 语句来查看或显示当前用户权限范围以内的数据库。查看数据库的语法格式为&#xff1a; SHOW DATABASES [LIKE 数据库名];语法说明如下&#xff1a; LIKE 从句是可选项&#xff0c;用于匹配指定的数据库名称。LIKE 从句可以部分匹配…

默认选中_双击dwg图纸,怎么设置默认天正打开?

文尾左下角阅读原文看视频教程好课推荐&#xff1a;零基础CAD&#xff1a;点我CAD室内&#xff1a;点我 周站长CAD&#xff1a;点我CAD机械&#xff1a;点我 Bim教程&#xff1a;点我CAD建筑&#xff1a;点我CAD三维&#xff1a;点我全屋定制&#xff1a;点我 ps教程&#xff1…

MySQL修改数据库

MySQL 中&#xff0c;使用 ALTER DATABASE 来修改已经被创建或者存在的数据库的相关参数。修改数据库的语法格式为&#xff1a; ALTER DATABASE [数据库名] { [ DEFAULT ] CHARACTER SET <字符集名> | [ DEFAULT ] COLLATE <校对规则名>}语法说明如下&#xff1a…

临颖一高2021高考成绩查询,临颍一高举办2021年决战高考百日冲刺誓师大会

原标题&#xff1a;临颍一高举办2021年决战高考百日冲刺誓师大会3月4日&#xff0c;县一高举办2021年决战高考百日冲刺誓师大会&#xff0c;擂响了百日冲刺的战鼓&#xff0c;全校5800余名师生参加誓师大会。誓师大会在激昂雄壮的国歌声中拉开了序幕。县一高校长巩海生满怀深情…

ddos源码 ntp_详解 NTP反射型DDos攻击

简介NTP Reply Flood Attack (NTP射型Ddos 攻击)以下简称NTP_Flood是一种利用网络中 NTP服务器的脆弱性(无认证&#xff0c;不等价数据交换&#xff0c;UDP协议)&#xff0c;来进行DDos行为的攻击&#xff0c;本文将就此种攻击的产生原因&#xff0c;利用方法等进行阐述&#x…

MySQL删除数据库

MySQL 中&#xff0c;当需要删除已创建的数据库时&#xff0c;可以使用 DROP DATABASE 语句。其语法格式为&#xff1a; DROP DATABASE [ IF EXISTS ] <数据库名>语法说明如下&#xff1a; <数据库名>&#xff1a;指定要删除的数据库名。IF EXISTS&#xff1a;用于…