一、背景
在做大数据分析的时候,需要将word表格中的图片重命名成指定名字然后保存到文件夹中,一个个复制粘贴肯定不行,就研究了一下Java读取word表格中图片的事情,在此做个记录
如下图,将表格中第二列的图片以第四列的名称命名然后保存到文件夹中
二、实现步骤
1.随便建个maven项目(因为需要导包,使用maven更方便一些,gradle当然也可以)
2.pom.xml添加maven依赖包
<!-- poi包 -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.8</version>
</dependency>
<!-- poi处理xlsx格式,用于处理word中的表格 -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.8</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-scratchpad</artifactId>
<version>3.8</version>
</dependency>
3.写个test方法处理文件
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Iterator;
import java.util.List;
import java.util.UUID;
import org.apache.poi.POIDocument;
import org.apache.poi.POIXMLDocument;
import org.apache.poi.POIXMLTextExtractor;
import org.apache.poi.hwpf.HWPFDocument;
import org.apache.poi.hwpf.model.PicturesTable;
import org.apache.poi.hwpf.usermodel.Picture;
import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.xwpf.extractor.XWPFWordExtractor;
import org.apache.poi.xwpf.usermodel.*;
import org.junit.jupiter.api.Test;
public class WordTest {
/**
* @Author: zoe
* @Date: 2020/9/10 16:30
* @Description: 循环word文档中表格中的图片,重命名固定保存在文件夹中
* @Param: []
* @Return: void
*/
@Test
public void testimg(){
String path = "D:\\word\\test1.docx";
String imgpath = "D:\\word\\img\\";
String content = null;
try {
File file = new File(path);
if (file.exists() && file.isFile()) {
//文件流
InputStream is = new FileInputStream(file);
XWPFDocument xwpfDocument = new XWPFDocument(is);
Iterator<XWPFTable> it = xwpfDocument.getTablesIterator();
while (it.hasNext()){//循环表格
XWPFTable table = it.next();
int rcount = table.getNumberOfRows();
System.out.println(rcount);
StringBuffer str = new StringBuffer();
for (int i = 1; i < rcount; i++) {//行
XWPFTableRow row = table.getRow(i);
XWPFTableCell ce = row.getCell(2);
System.out.println("cell2"+ce);
List<XWPFTableCell> cells = row.getTableCells();
if(cells.size()>0){
//因为需要第二列图片信息和第四列信息做图片名称
// 所以我们这里只需取第二列和第四列信息即可不需要循环每一列
XWPFTableCell cell = cells.get(3);//图片名称
List<XWPFRun> runs = cell.getParagraphs().get(0).getRuns();
XWPFRun r = runs.get(0); //序号 图示 说明
String textname = r.getText(r.getTextPosition());
System.out.println(textname+"gggggg");
XWPFTableCell cell2 = cells.get(1);//图片
List<XWPFRun> runs2 = cell2.getParagraphs().get(0).getRuns();
XWPFRun r2 = runs2.get(0); //序号 图示 说明
String text = r2.getText(r.getTextPosition());
if(text == null){//图片
List<XWPFPicture> pictureList = r2.getEmbeddedPictures();
for (int m = 0; m <pictureList.size() ; m++) {
XWPFPicture pic = pictureList.get(m);
byte[] picbyte = pic.getPictureData().getData();
FileOutputStream fos = new FileOutputStream(imgpath+"/"+textname+".png");
fos.write(picbyte);
//图片保存
System.out.println("add picpure"+r.getEmbeddedPictures().size()+imgpath+"/"+textname+".png");
}
}
}
//正常是循环列表中的每一列处理信息
/* for (int j = 0; j < cells.size()-1 ; j++) {//列
XWPFTableCell cell = cells.get(3);
for (int k = 0; k < cell.getParagraphs().size(); k++) {
List<XWPFRun> runs = cell.getParagraphs().get(j).getRuns();
for (int l = 0; l <runs.size() ; l++) {
XWPFRun r = runs.get(l); //序号 图示 说明
String textname = r.getText(r.getTextPosition());
str.append(textname);
System.out.println(r.getText(2)+"gggggg");
System.out.println(r.getSubscript().toString());
System.out.println(r.getFontFamily());
XWPFRun r1 = runs.get(1);
String text = r.getText(r.getTextPosition());
if(text == null){//图片
List<XWPFPicture> pictureList = r.getEmbeddedPictures();
for (int m = 0; m <pictureList.size() ; m++) {
XWPFPicture pic = pictureList.get(m);
byte[] picbyte = pic.getPictureData().getData();
FileOutputStream fos = new FileOutputStream(imgpath+"/"+textname+".png");
fos.write(picbyte);
System.out.println("add picpure"+r.getEmbeddedPictures().size());
}
}
}
// }
str.append("\n");
}
}*/
}
}
is.close();//关闭流
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
结果:
这只是个简单的范例,有更复杂的操作需要优化过程 ,封装一个通用的工具类来处理word中的信息
关注
如果有问题,请在下方评论
想获得更多的学习知识请关注微信公众号:西北码农或扫下方二维码