POI对于Doc的支持冒失对于新版本的Word不支持,支持的是Word老版本,对于docx结尾的,支持不是特别的好,本文主要分三部分,1、Word的文字不分的读取,2、Wrod图片的读取,3、Word表格读取
环境搭建
<!-- excel -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.17</version>
</dependency>
<!-- word -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-scratchpad</artifactId>
<version>3.17</version>
</dependency>
<!-- xlsx -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.17</version>
</dependency>
<!-- xlsx 依赖这个包 -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-schemas</artifactId>
<version>3.17</version>
</dependency>
文字读取
文字操作中,可以通过
HWPFDocument
直接读取,也可以获取到Range
对象后读取
String BASE_PATH = "D:\\笔记\\服务器学习\\bae\\";
File file = new File(BASE_PATH + "BAE 服务器文件目录问题.doc");
HWPFDocument doc = new HWPFDocument(new FileInputStream(file));
//通过 Doc对象直接获取Text
StringBuilder sb = doc.getText();
//System.out.println(sb.toString());
//通过Range对象获取Text
Range range = doc.getRange();
String text = range.text();
图片读取
Doc获取文档中的所有图片,并存储,其中
Picture
对象中,getContent()
可获取字节流,然后获取字节数据,自己写出来,也可以通过writeImageContent
来直接写,图片的开始位置可以获取,但是结束位置没有
//获取doc中的图片数
//获取doc中的图片数
List<Picture> pics = doc.getPicturesTable().getAllPictures();
for(Picture pic:pics){
//图片在doc文件中的位置,分析Doc 转化成其他文本时需要用到
int start = pic.getStartOffset();
int width = pic.getWidth();
int height = pic.getHeight();
String mimeType = pic.getMimeType();
//文件名称
String name = pic.suggestFullFileName();
//文件后缀
String exts= pic.suggestFileExtension();
//文件类型
PictureType type = pic.suggestPictureType();
System.out.printf("开始位置%d\t图片大小度%d,高%d,\t图片类型%s\r\n",start,width,height,mimeType);
}
/**
* 也可以自己写方法
* @param imgByte
* @throws Exception
*/
public static void copyByteToFile(byte[] imgByte,String path) throws Exception {
InputStream in = new ByteInputStream(imgByte, 0, imgByte.length);
byte[] buff = new byte[1024];
String fileName = UUID.randomUUID().toString().substring(0, 6);
OutputStream out = new FileOutputStream(new File(path + fileName + ".jpg"));
int len = 0;
while ((len = in.read(buff)) > 0) {
out.write(buff, 0, len);
}
out.flush();
out.close();
in.close();
}
/**
* 通过Picture 自己类中的读写方法
* @param pics
* @param path
*/
public static void copyPic2Disk(List<Picture> pics,File path){
if(pics == null || pics.size() <=0){
return;
}
if(!path.isDirectory()){
throw new RuntimeException("路径填写不正确");
}
//当文件夹路径不存在的情况下,我们自己创建文件夹目录
if(!path.exists() ){
path.mkdirs();
}
try {
for(Picture pic:pics){
//写出数据,我们使用的是Poi类中,Picture自己所带的函数
pic.writeImageContent(new FileOutputStream(new File(path,pic.suggestFullFileName())));
/*byte [] picBytes = pic.getContent(); //获取字节流,也可以自己写入数据
copyByteToFile(picBytes);*/
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
Doc的表格读取
//遍历range范围内的table。
TableIterator tableIter = new TableIterator(range);
while (tableIter.hasNext()) {
Table table = tableIter.next();
//开始位置
int start = table.getStartOffset();
//结束位置
int end = table.getEndOffset();
System.out.printf("开始位置%d,结束为止%d\r\n",start,end);
//获取行的数目
int rowNum = table.numRows();
for (int j = 0; j < rowNum; j++) {
//获取每一行
TableRow row = table.getRow(j);
int cellNum = row.numCells();
for (int k = 0; k < cellNum; k++) {
//获取每一列
TableCell cell = row.getCell(k);
// 输出单元格的文本
System.out.println(cell.text().trim());
}
}
}
完整代码
package com.yellowcong.test;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;
import java.util.UUID;
import org.apache.poi.hwpf.HWPFDocument;
import org.apache.poi.hwpf.usermodel.Picture;
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 com.sun.xml.internal.messaging.saaj.util.ByteInputStream;
public class DocText {
public static void main(String[] args) throws Exception, IOException {
String BASE_PATH = "D:\\笔记\\服务器学习\\bae\\";
File file = new File(BASE_PATH + "BAE 服务器文件目录问题.doc");
HWPFDocument doc = new HWPFDocument(new FileInputStream(file));
//通过 Doc对象直接获取Text
StringBuilder sb = doc.getText();
//System.out.println(sb.toString());
//通过Range对象获取Text
Range range = doc.getRange();
String text = range.text();
//System.out.println(text);
//获取段落数目
//在Word中,一个回车符就是一个段落了
int nums = range.numParagraphs();
//System.out.println(nums);
//获取doc中的图片数
List<Picture> pics = doc.getPicturesTable().getAllPictures();
for(Picture pic:pics){
//图片在doc文件中的位置,分析Doc 转化成其他文本时需要用到
int start = pic.getStartOffset();
int width = pic.getWidth();
int height = pic.getHeight();
String mimeType = pic.getMimeType();
System.out.printf("开始位置%d\t图片大小度%d,高%d,\t图片类型%s\r\n",start,width,height,mimeType);
}
//1.通过Picture的writeImageContent方法 写文件
//2.获取Picture的byte 自己写
copyPic2Disk(pics, new File(BASE_PATH));
//遍历range范围内的table。
TableIterator tableIter = new TableIterator(range);
while (tableIter.hasNext()) {
Table table = tableIter.next();
//开始位置
int start = table.getStartOffset();
//结束位置
int end = table.getEndOffset();
System.out.printf("开始位置%d,结束为止%d\r\n",start,end);
//获取行的数目
int rowNum = table.numRows();
for (int j = 0; j < rowNum; j++) {
//获取每一行
TableRow row = table.getRow(j);
int cellNum = row.numCells();
for (int k = 0; k < cellNum; k++) {
//获取每一列
TableCell cell = row.getCell(k);
// 输出单元格的文本
System.out.println(cell.text().trim());
}
}
}
}
/**
* 也可以自己写方法
* @param imgByte
* @throws Exception
*/
public static void copyByteToFile(byte[] imgByte,String path) throws Exception {
InputStream in = new ByteInputStream(imgByte, 0, imgByte.length);
byte[] buff = new byte[1024];
String fileName = UUID.randomUUID().toString().substring(0, 6);
OutputStream out = new FileOutputStream(new File(path + fileName + ".jpg"));
int len = 0;
while ((len = in.read(buff)) > 0) {
out.write(buff, 0, len);
}
out.flush();
out.close();
in.close();
}
/**
* 通过Picture 自己类中的读写方法
* @param pics
* @param path
*/
public static void copyPic2Disk(List<Picture> pics,File path){
if(pics == null || pics.size() <=0){
return;
}
if(!path.isDirectory()){
throw new RuntimeException("路径填写不正确");
}
//当文件夹路径不存在的情况下,我们自己创建文件夹目录
if(!path.exists() ){
path.mkdirs();
}
try {
for(Picture pic:pics){
//写出数据,我们使用的是Poi类中,Picture自己所带的函数
pic.writeImageContent(new FileOutputStream(new File(path,pic.suggestFullFileName())));
/*byte [] picBytes = pic.getContent(); //获取字节流,也可以自己写入数据
copyByteToFile(picBytes);*/
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
完整代码
package com.yellowcong.test;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;
import java.util.UUID;
import org.apache.poi.hwpf.HWPFDocument;
import org.apache.poi.hwpf.usermodel.Picture;
import org.apache.poi.hwpf.usermodel.PictureType;
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 com.sun.xml.internal.messaging.saaj.util.ByteInputStream;
public class DocText {
public static void main(String[] args) throws Exception, IOException {
String BASE_PATH = "D:\\笔记\\服务器学习\\bae\\";
File file = new File(BASE_PATH + "BAE 服务器文件目录问题.doc");
HWPFDocument doc = new HWPFDocument(new FileInputStream(file));
//通过 Doc对象直接获取Text
StringBuilder sb = doc.getText();
//System.out.println(sb.toString());
//通过Range对象获取Text
Range range = doc.getRange();
String text = range.text();
//System.out.println(text);
//获取段落数目
//在Word中,一个回车符就是一个段落了
int nums = range.numParagraphs();
//System.out.println(nums);
//获取doc中的图片数
List<Picture> pics = doc.getPicturesTable().getAllPictures();
for(Picture pic:pics){
//图片在doc文件中的位置,分析Doc 转化成其他文本时需要用到
//文件开始位置,结束位置没有
int start = pic.getStartOffset();
//图片的宽高
int width = pic.getWidth();
int height = pic.getHeight();
//文件名称
String name = pic.suggestFullFileName();
//文件后缀
String exts= pic.suggestFileExtension();
//文件类型
PictureType type = pic.suggestPictureType();
String mimeType = pic.getMimeType();
System.out.printf("开始位置%d\t图片大小度%d,高%d,\t图片类型%s\r\n",start,width,height,mimeType);
}
//1.通过Picture的writeImageContent方法 写文件
//2.获取Picture的byte 自己写
copyPic2Disk(pics, new File(BASE_PATH));
//遍历range范围内的table。
TableIterator tableIter = new TableIterator(range);
while (tableIter.hasNext()) {
Table table = tableIter.next();
//开始位置
int start = table.getStartOffset();
//结束位置
int end = table.getEndOffset();
System.out.printf("开始位置%d,结束为止%d\r\n",start,end);
//获取行的数目
int rowNum = table.numRows();
for (int j = 0; j < rowNum; j++) {
//获取每一行
TableRow row = table.getRow(j);
int cellNum = row.numCells();
for (int k = 0; k < cellNum; k++) {
//获取每一列
TableCell cell = row.getCell(k);
// 输出单元格的文本
System.out.println(cell.text().trim());
}
}
}
}
/**
* 也可以自己写方法
* @param imgByte
* @throws Exception
*/
public static void copyByteToFile(byte[] imgByte,String path) throws Exception {
InputStream in = new ByteInputStream(imgByte, 0, imgByte.length);
byte[] buff = new byte[1024];
String fileName = UUID.randomUUID().toString().substring(0, 6);
OutputStream out = new FileOutputStream(new File(path + fileName + ".jpg"));
int len = 0;
while ((len = in.read(buff)) > 0) {
out.write(buff, 0, len);
}
out.flush();
out.close();
in.close();
}
/**
* 通过Picture 自己类中的读写方法
* @param pics
* @param path
*/
public static void copyPic2Disk(List<Picture> pics,File path){
if(pics == null || pics.size() <=0){
return;
}
if(!path.isDirectory()){
throw new RuntimeException("路径填写不正确");
}
//当文件夹路径不存在的情况下,我们自己创建文件夹目录
if(!path.exists() ){
path.mkdirs();
}
try {
for(Picture pic:pics){
//写出数据,我们使用的是Poi类中,Picture自己所带的函数
pic.writeImageContent(new FileOutputStream(new File(path,pic.suggestFullFileName())));
/*byte [] picBytes = pic.getContent(); //获取字节流,也可以自己写入数据
copyByteToFile(picBytes);*/
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}