Java读取word表格中图片,重命名后保存到文件夹中

一、背景

在做大数据分析的时候,需要将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中的信息

 

关注

如果有问题,请在下方评论

想获得更多的学习知识请关注微信公众号:西北码农或扫下方二维码


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值