Java使用poi读取word文档中的表格_java poi 读取word表格-程序员宅基地

技术标签: Java  POI  读取word表格  

使用poi读取文档中的表格,当有多个表格时可以指定需要读取的表格,同时支持读取docx和doc格式。需要添加poi的jar包

测试文档如下图:

程序代码: 

package com.fise19.read;

import java.io.FileInputStream;
import java.util.Iterator;
import java.util.List;
import org.apache.poi.hwpf.HWPFDocument;
import org.apache.poi.hwpf.usermodel.Paragraph;
import org.apache.poi.hwpf.usermodel.Range;
import org.apache.poi.hwpf.usermodel.Table;
import org.apache.poi.hwpf.usermodel.TableCell;
import org.apache.poi.hwpf.usermodel.TableIterator;
import org.apache.poi.hwpf.usermodel.TableRow;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFTable;
import org.apache.poi.xwpf.usermodel.XWPFTableCell;
import org.apache.poi.xwpf.usermodel.XWPFTableRow;

/**
 * 
 * 读取word文档中表格数据,支持doc、docx
 * @author Fise19
 * 
 */
public class ExportDoc {
	public static void main(String[] args) {
		ExportDoc test = new ExportDoc();
		String filePath = "D:\\new\\测试.docx";
//		String filePath = "D:\\new\\测试.doc";
		test.testWord(filePath);
	}
	/**
	 * 读取文档中表格
	 * @param filePath
	 */
	public void testWord(String filePath){
		try{
			FileInputStream in = new FileInputStream(filePath);//载入文档
			// 处理docx格式 即office2007以后版本
			if(filePath.toLowerCase().endsWith("docx")){
				//word 2007 图片不会被读取, 表格中的数据会被放在字符串的最后   
				XWPFDocument xwpf = new XWPFDocument(in);//得到word文档的信息
				Iterator<XWPFTable> it = xwpf.getTablesIterator();//得到word中的表格
				// 设置需要读取的表格  set是设置需要读取的第几个表格,total是文件中表格的总数
				int set = 2, total = 4;
				int num = set;
				// 过滤前面不需要的表格
				for (int i = 0; i < set-1; i++) {
					it.hasNext();
					it.next();
				}
				while(it.hasNext()){
					XWPFTable table = it.next();  
					System.out.println("这是第" + num + "个表的数据");
					List<XWPFTableRow> rows = table.getRows(); 
					//读取每一行数据
					for (int i = 0; i < rows.size(); i++) {
						XWPFTableRow  row = rows.get(i);
						//读取每一列数据
						List<XWPFTableCell> cells = row.getTableCells(); 
						for (int j = 0; j < cells.size(); j++) {
							XWPFTableCell cell = cells.get(j);
							//输出当前的单元格的数据
							System.out.print(cell.getText() + "\t");
						}
						System.out.println();
					}
					// 过滤多余的表格
					while (num < total) {
						it.hasNext();
						it.next();
						num += 1;
					}
				}
			}else{
				// 处理doc格式 即office2003版本
				POIFSFileSystem pfs = new POIFSFileSystem(in);   
				HWPFDocument hwpf = new HWPFDocument(pfs);   
				Range range = hwpf.getRange();//得到文档的读取范围
				TableIterator it = new TableIterator(range);
				// 迭代文档中的表格
				// 如果有多个表格只读取需要的一个 set是设置需要读取的第几个表格,total是文件中表格的总数
				int set = 1, total = 4;
				int num = set;
				for (int i = 0; i < set-1; i++) {
					it.hasNext();
					it.next();
				}
				while (it.hasNext()) {   
					Table tb = (Table) it.next();   
					System.out.println("这是第" + num + "个表的数据");
					//迭代行,默认从0开始,可以依据需要设置i的值,改变起始行数,也可设置读取到那行,只需修改循环的判断条件即可
					for (int i = 0; i < tb.numRows(); i++) {   
						TableRow tr = tb.getRow(i);   
						//迭代列,默认从0开始
						for (int j = 0; j < tr.numCells(); j++) {   
							TableCell td = tr.getCell(j);//取得单元格
							//取得单元格的内容
							for(int k = 0; k < td.numParagraphs(); k++){   
								Paragraph para = td.getParagraph(k); 
								String s = para.text();
								//去除后面的特殊符号
								if(null != s && !"".equals(s)){
									s = s.substring(0, s.length()-1);
								}
								System.out.print(s + "\t");
							}
						}
						System.out.println();
					} 
					// 过滤多余的表格
					while (num < total) {
						it.hasNext();
						it.next();
						num += 1;
					}
				}
			}
		}catch(Exception e){
			e.printStackTrace();
		}
	}
}

运行结果:

这是第2个表的数据
123	1	2	3	
表2-1	1	2	3	
表2-2	1	2	3	

 

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/fise19/article/details/82702723

智能推荐

javascript的getElementsByTagName() 方法-程序员宅基地

文章浏览阅读2k次。定义和用法getElementsByTagName() 方法用于获取指定标签名的对象的集合。语法document.getElementsByTagName(tagname)参数描述tagname指定标签名,不区分大小写如果把特殊字符串 "*" 传递给 getElementsByTagName() 方法,它将返回文档中所_getelementsbytagname

全网零信任如何构建新一代无界办公安全体系?_零信任在本地安全办公的解决方案-程序员宅基地

文章浏览阅读108次。全网零信任如何构建新一代无界办公安全体系?_零信任在本地安全办公的解决方案

与aspect长得像的单词_托福单词:正序背 or 乱序背?-程序员宅基地

文章浏览阅读138次。有苦战英语多年的学生感叹:我的英语学习之路从背单词开始,并以背单词结束。 背单词是一道坎儿,为什么总是跨不过去?托福对考生的单词要求是8000-10000,从新东方红宝书的A开始背起,先树立一个小目标,每天50个,差50个,30个,10个,都不算完成任务。然而,最后的结局总是A还没有背完,考试已经结束了。..._aspect相近的

springboot195文理医院预约挂号系统-程序员宅基地

文章浏览阅读927次,点赞25次,收藏18次。本系统的研发具有重大的意义,在安全性方面,用户使用浏览器访问网站时,采用注册和密码等相关的保护措施,提高系统的可靠性,维护用户的个人信息和财产的安全。IDEA平台都是目前比较常用的开发环境。本文围绕着文理医院预约挂号系统的整个开发过程,展开了详细的描述和说明,设计和实现本系统的主要工作有:首先分析研究背景、研究状态,其次介绍设计系统时使用到的相关技术,然后通过系统分析确定系统的功能需求,接着通过编码工作详细设计和实现系统,最后再通过系统测试,找出系统存在的问题和解决问题的方法,不断地修改和完善系统。

ImportError: cannot import name 'TYPE_CHECKING'-程序员宅基地

文章浏览阅读5.5k次。import aiohttp报错内容:Traceback (most recent call last): File "<pyshell#0>", line 1, in <module> import aiohttp File "D:\Python\Python35\lib\site-packages\aiohttp\__init__.py", ..._importerror: cannot import name 'type_checking

浏览器和服务器之间交换数据通过什么协议,HTTP协议-程序员宅基地

文章浏览阅读5.6k次。一、什么是HTTP协议HTTP是hypertext transfer protocol(超文本传输协议)的简写,它是TCP/IP协议的一个应用层协议,用于定义WEB浏览器与WEB服务器之间交换数据的过程。客户端连上web服务器后,若想获得web服务器中的某个web资源,需遵守一定的通讯格式,HTTP协议用于定义客户端与web服务器通迅的格式。二、HTTP协议的版本HTTP协议的版本:HTTP/1...._数据交换 http

随便推点

系统分析与设计作业4-绘制用例图_如何着手从自然语言描述的用户需求中画出用例图-程序员宅基地

文章浏览阅读6.2k次。1、简答题用例的概念用例和场景的关系?什么是主场景或 happy path?用例有哪些形式?对于复杂业务,为什么编制完整用例非常难?什么是用例图?用例图的基本符号与元素?用例图的画法与步骤用例图给利益相关人与开发者的价值有哪些?2、建模练习题(用例模型)选择2-3个你熟悉的类似业务的在线服务系统(或移动 APP),如定旅馆(携程、去哪儿等)、定电影票、背单词APP等,分别绘制它..._如何着手从自然语言描述的用户需求中画出用例图

android客户端使用网络数据压缩-程序员宅基地

文章浏览阅读66次。GZIPInputStream面试遇到了网络数据压缩的问题,本来问道这个问题前我也看过Gzip,不是很理解,龙哥提示要把网络两个字去掉就有思路了,再次提示下我才看到gzip方式。Gzip也是android客户端支持的方式,官网解释:GZIPInputStream此类类是用来读取在GZIP格式存储的数据,从底层的流进它的缓冲区读取和解压GZIP数据。InputStream is..._数据压缩吴乐南第二版答案

VMware桥接模式无法使用问题_vm设置桥接模式不生效-程序员宅基地

文章浏览阅读1k次。如果你的虚拟机能ping通主机,而主机无法ping通虚拟机,这样就会导致无法做冰蝎等实验。遇到这种情况就需要在虚拟机设置中把使用物理驱动改成使用ISO映像文件。如果你本身就是使用ISO映像文件,还是不能ping通,那就先改成物理驱动,重启一下,再改成使用ISO映像文件,再重启一下,这样就可以主机ping通虚拟机。有时候我们在学习的时候,突然发现桥接模式连不上网,怎么调试都不行,可以试试下面我这个方法。找到Intel(R) Wi-Fi 6 AX201 160MHz,应用并且保存。打开VMware,找到编辑。_vm设置桥接模式不生效

ESP32S3无法打开idf.py menuconfig — windows环境-程序员宅基地

文章浏览阅读948次。ESP32S3无法打开idf.py menuconfig — windows环境_idf.py menuconfig

【SpringBoot项目实战】瑞吉外卖优化篇-程序员宅基地

文章浏览阅读1.5k次,点赞6次,收藏14次。本文涉及优化背景、搭建环境、缓存短信验证码、缓存菜品数据、SpringCache、缓存套餐数据、读写分离、Nginx、前后端分离开发、Yapi、Swagger等内容。_瑞吉外卖优化篇

C语言将时间戳转换为16进制数组_时间戳转16进制工具-程序员宅基地

文章浏览阅读511次。如:时间戳 = 1684322444 , 转换为 %10x 为 6464b88c。_时间戳转16进制工具

推荐文章

热门文章

相关标签