注意:word存在版本问题 分别为2003版本和2007版本(两个版本的操作是不一样的,已解决不同版本读取问题)
1.既然是使用poi 当然是先看需要什么包咯
maven导入依赖(三个依赖都是必须的)
org.apache.poi
poi
3.16
org.apache.poi
poi-scratchpad
3.16
org.apache.poi
poi-ooxml
3.16
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;
}
}