文档章节

Java poi读取word文档(本篇只能读取text内容)

太黑_thj
 太黑_thj
发布于 2017/08/28 16:28
字数 749
阅读 344
收藏 1

注意:word存在版本问题  分别为2003版本和2007版本(两个版本的操作是不一样的,已解决不同版本读取问题

 

1.既然是使用poi  当然是先看需要什么包咯

maven导入依赖(三个依赖都是必须的)

        <!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->
		<dependency>
			<groupId>org.apache.poi</groupId>
			<artifactId>poi</artifactId>
			<version>3.16</version>
		</dependency>
		<!-- https://mvnrepository.com/artifact/org.apache.poi/poi-scratchpad -->
		<dependency>
			<groupId>org.apache.poi</groupId>
			<artifactId>poi-scratchpad</artifactId>
			<version>3.16</version>
		</dependency>


		<!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml -->
		<dependency>
			<groupId>org.apache.poi</groupId>
			<artifactId>poi-ooxml</artifactId>
			<version>3.16</version>
		</dependency>

2.创建一个枚举(也可以不创建,反正现在也就2003和2007的区别 )

public enum MicOffWordType {

	MOW2003("d0cf11e"), MOW2007("504b0");

	private String type;

	public String getType() {
		return type;
	}

	public void setType(String type) {
		this.type = type;
	}

	private MicOffWordType(String type) {
		this.type = type;
	}

	/**
	 * 根据文件头获取文件类型
	 * 
	 * @param value
	 * @return
	 */
	public static String getTypeByValue(String value) {
		for (MicOffWordType mow : values()) {
			if (value.toUpperCase().startsWith(mow.getType().toUpperCase())) {
				return mow.name();
			}
		}
		return null;
	}

}

3.获取文件头工具类


/**
 * 
 * @author thj
 *
 */
public class FileHandle {

	/**
	 * 得到文件头
	 * 
	 * @param file
	 *            文件
	 * @return 文件头
	 * @throws IOException
	 */
	public static String getFileHead(File file) {

		byte[] b = new byte[28];

		InputStream inputStream = null;

		try {
			inputStream = new FileInputStream(file);
			inputStream.read(b, 0, 28);
		} catch (IOException e) {
			
		} finally {
			if (inputStream != null) {
				try {
					inputStream.close();
				} catch (IOException e) {

				}
			}
		}
		return bytesToHexString(b);
	}

	/**
	 * 将文件头转换成16进制字符串
	 * 
	 * @param 原生byte
	 * @return 16进制字符串
	 */
	private static String bytesToHexString(byte[] src) {

		StringBuilder stringBuilder = new StringBuilder();
		if (src == null || src.length <= 0) {
			return null;
		}
		for (int i = 0; i < src.length; i++) {
			int v = src[i] & 0xFF;
			String hv = Integer.toHexString(v);
			if (hv.length() < 2) {
				stringBuilder.append(0);
			}
			stringBuilder.append(hv);
		}
		return stringBuilder.toString();
	}
}

 

4.正餐来咯,获取word内的内容

/**
 * 
 * @author thj
 *
 */
public class MicOffWordUtil {

	/**
	 * 根据word文件路径获取文件内的内容
	 * 
	 * @param filePath
	 * @return 如果解析失败则返回null
	 */
	@SuppressWarnings("resource")
	public static String getContent(String filePath) {
		// 路径必传
		if (null == filePath || filePath.replaceAll(" ", "").length() == 0) {
			return null;
		}
		// 获取文件格式
		// 1.获取文件头
		File f = new File(filePath);
		String fh = FileHandle.getFileHead(f);
		// 判断文件类型
		String wt = MicOffWordType.getTypeByValue(fh);
		if (null == wt) {
			return null;
		}
		try {
			// 判断是否是2003格式的word
			if (wt.equals(MicOffWordType.MOW2003.toString())) {// 判断是否是2003格式的word
				System.out.println("2003");
				WordExtractor ex = new WordExtractor(new FileInputStream(f));
				String text2003 = ex.getText();
				return text2003;

			} else if (wt.equals(MicOffWordType.MOW2007.toString())) {// 判断是否是2007格式的word
				System.out.println("2007");
				OPCPackage op = POIXMLDocument.openPackage(filePath);
				POIXMLTextExtractor pte = new XWPFWordExtractor(op);
				String text2007 = pte.getText();
				return text2007;
			}
		} catch (Exception e) {
			return null;
		}
		return null;

	}

	/**
	 * 根据word文件获取文件内的内容
	 * 
	 * @param file
	 *            word文件
	 * @return
	 */
	@SuppressWarnings("resource")
	public static String getContent(File file) {
		// 判断文件是否存在
		if (null == file || !file.exists()) {
			return null;
		}
		// 获取文件格式
		// 1.获取文件头
		String fh = FileHandle.getFileHead(file);
		// 判断文件类型
		String wt = MicOffWordType.getTypeByValue(fh);
		if (null == wt) {
			return null;
		}
		try {
			// 判断是否是2003格式的word
			if (wt.equals(MicOffWordType.MOW2003.toString())) {// 判断是否是2003格式的word
				System.out.println("2003");
				WordExtractor ex = new WordExtractor(new FileInputStream(file));
				String text2003 = ex.getText();
				return text2003;

			} else if (wt.equals(MicOffWordType.MOW2007.toString())) {// 判断是否是2007格式的word
				System.out.println("2007");
				OPCPackage op = OPCPackage.open(file);
				POIXMLTextExtractor pte = new XWPFWordExtractor(op);
				String text2007 = pte.getText();
				return text2007;
			}
		} catch (Exception e) {
			return null;
		}
		return null;

	}

}

 

© 著作权归作者所有

太黑_thj

太黑_thj

粉丝 15
博文 127
码字总数 66852
作品 0
福州
程序员
私信 提问
Java程序员从笨鸟到菜鸟之(一百零三)java操作office和pdf文件(一)java读取word,excel和pdf文档内容

在平常应用程序中,对office和pdf文档进行读取数据是比较常见的功能,尤其在很多web应用程序中。所以今天我们就简单来看一下java对word、excel、pdf文件的读取。本篇博客只是讲解简单应用。如...

长平狐
2012/11/12
349
0
使用 Apache POI 和 OpenOffice API 在 Linux 中统计 Office 文档的页数

简介: 在实际的项目开发中经常会遇到需要在不同的操作系统平台上统计 Microsoft Office 系列文档页数的要求。Apache POI 提供了一套完整的用于访问微软格式文档的 Java API。但是 Apache P...

IBMdW
2012/10/26
1K
0
poi操作doc文档

http://haofenglemon.iteye.com/blog/568897 关键字:POI JAVA 批注 总页数 总字符数 一:认识POI Apache POI是一个开源的利用Java读写Excel、WORD等微软OLE2组件文档的项目。最新的3.5版本有...

yunlong090614
2015/01/30
2
0
Apache POI 操作Word部分

Apache POI ----Word部分 最近在研究Apache POI,不过只研究了如何做word的部分。网上对于Excel等的介绍也很多例子也很多,但是对于word缺少的可怜,导致我学的也很费劲,只能算是会了皮毛。...

QH_C
2014/11/15
0
0
Java程序员从笨鸟到菜鸟之(一百零四)java操作office和pdf文件(二)利用POI实现数据导出excel报表

在上一篇博客中,我们简单介绍了java读取word,excel和pdf文档内容 ,但在实际开发中,我们用到最多的是把数据库中数据导出excel报表形式。不仅仅简单的读取office中的数据.尤其是在生产管理...

长平狐
2012/11/12
1K
0

没有更多内容

加载失败,请刷新页面

加载更多

spring mvc主流程源码阅读(剖析)

第一步,通过web.xml的配置可以知道,用户访问url第一次先走到DispatchServlet,(默认你学过基本的java的Servlet开发) <servlet><servlet-name>springServlet</servlet-name><serv......

小海bug
18分钟前
2
0
vmstat命令详解

https://www.cnblogs.com/ggjucheng/archive/2012/01/05/2312625.html

流光韶逝
52分钟前
1
0
如何理解算法时间复杂度的表示

先从O(1) 来说,理论上哈希表就是O(1)。因为哈希表是通过哈希函数来映射的,所以拿到一个关键 字,用哈希函数转换一下,就可以直接从表中取出对应的值。和现存数据有多少毫无关系,故而每次执...

yky20190625
今天
5
0
分布式架构 实现分布式锁的常见方式

一、我们为什么需要分布式锁? 在单机时代,虽然不需要分布式锁,但也面临过类似的问题,只不过在单机的情况下,如果有多个线程要同时访问某个共享资源的时候,我们可以采用线程间加锁的机制...

太猪-YJ
今天
9
0
GitLab Docker 安装记录

安装环境 环境Centos7.4 64 1.拉取镜像文件 docker pull gitlab/gitlab-ce:latest 2.docker 安装 git.zddts.com 为访问域名或换成可以访问的IP docker run -d --hostname git.***.com -p ......

侠者圣
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部