最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

利用Java實現讀取WPS?Excel中嵌入的圖片

 更新時間:2024年11月17日 10:21:37   作者:猴子請來的坑逼  
許多數據文件中可能包含嵌入式圖片,這些圖片對于數據分析和可視化非常重要,下面我們就來看看如何使用Java讀取WPS?Excel中嵌入的圖片吧

引言

許多數據文件中可能包含嵌入式圖片,這些圖片對于數據分析和可視化非常重要。然而,從 WPS 在 Excel 中讀取這些圖片可能會有一些技術挑戰(zhàn)。在本文中,我將展示如何從 WPS Excel 文件中讀取嵌入的圖片,并提供代碼示例。

提取圖片資源的方法

以下是用于從 WPS Excel 文件中讀取圖片資源的方法。我們使用了 Apache POI 庫來處理 Excel 文件,并使用了 cn.hutool.json 庫來處理 XML 數據。這些庫可以幫助我們解析 Excel 文件中的嵌入式圖片。

主函數

首先,我們定義了主函數 main,用于測試圖片提取功能:

public static void main(String[] args) {
    PicturesUtils picturesUtils = new PicturesUtils();
    byte[] fileData = picturesUtils.getFileStream(new File("你的文件路徑"));
    Map<String, XSSFPictureData> pictures = picturesUtils.getPictures(fileData);
    pictures.forEach((id, xssfPictureData) -> {
        System.out.println("id:" + id);
        String fileName = xssfPictureData.getPackagePart().getPartName().getName();
        System.out.println("fileName:" + fileName);
        File file = new File("D:\\" + fileName);
        File dir = file.getParentFile();
        dir.mkdirs();
        try {
            Files.write(Path.of(file.getPath()), xssfPictureData.getData());
        } catch (IOException e) {
            e.printStackTrace();
        }
    });
}

在這個函數中,我們創(chuàng)建了一個 PicturesUtils 實例,并從文件路徑中獲取文件數據。然后,我們調用 getPictures 方法來提取圖片資源,并遍歷結果將圖片寫入本地文件。

獲取浮動圖片

接下來,我們展示了如何從 Excel 文件中獲取浮動圖片:

public static Map<String, XSSFPictureData> getFloatingPictures(XSSFSheet xssfSheet) {
    Map<String, XSSFPictureData> mapFloatingPictures = new HashMap<>();
    XSSFDrawing drawingPatriarch = xssfSheet.getDrawingPatriarch();
    if (drawingPatriarch != null) {
        List<XSSFShape> shapes = drawingPatriarch.getShapes();
        for (XSSFShape shape : shapes) {
            if (shape instanceof XSSFPicture picture) {
                XSSFClientAnchor anchor = (XSSFClientAnchor) picture.getAnchor();
                XSSFPictureData pictureData = picture.getPictureData();
                String key = anchor.getRow1() + "-" + anchor.getCol1();
                mapFloatingPictures.put(key, pictureData);
            }
        }
    }
    return mapFloatingPictures;
}

該方法接收一個 XSSFSheet 對象,并返回一個包含浮動圖片的映射。它遍歷工作表中的所有形狀,并將圖片數據存儲在映射中。

處理圖片數據

最后,我們展示了如何處理 Excel 文件中的圖片數據,包括嵌入式圖片和浮動式圖片:

public Map<String, XSSFPictureData> getPictures(byte[] data) {
    try {
        Map<String, String> mapConfig = processZipEntries(new ByteArrayInputStream(data));
        Map<String, XSSFPictureData> mapPictures = processPictures(new ByteArrayInputStream(data), mapConfig);
        Iterator<Sheet> sheetIterator = WorkbookFactory.create(new ByteArrayInputStream(data)).sheetIterator();
        while (sheetIterator.hasNext()) {
            mapPictures.putAll(getFloatingPictures((XSSFSheet) sheetIterator.next()));
        }
        return mapPictures;
    } catch (IOException e) {
        return new HashedMap<>();
    }
}

在該方法中,我們使用 processZipEntries 和 processPictures 方法來處理 Zip 文件中的條目和圖片數據。然后,通過遍歷 Excel 文件中的所有工作表,獲取浮動圖片。

完整代碼

實際在程序中讀取的內容為=DISPIMG(“ID_03BC802DDAB24510A9883DB157EAC0F8”,1)公式

將公式中的id提取出來ID_03BC802DDAB24510A9883DB157EAC0F8,最后就可以使用下面方法拿到當前id獲取到的圖片資源 jdk版本17

import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import cn.hutool.json.XML;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.map.HashedMap;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.openxml4j.opc.PackagePartName;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;
import org.apache.poi.xssf.usermodel.*;

import java.io.*;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;


/**
 * @author bianhl
 * @version 1.0
 * @description 獲取圖片資源
 * @date 2024年4月28日08:44:42
 */
@Slf4j
public class PicturesUtils {

    public static void main(String[] args) {
        PicturesUtils picturesUtils = new PicturesUtils();
        byte[] fileData = picturesUtils.getFileStream(new File("你的文件路徑"));
        Map<String, XSSFPictureData> pictures = picturesUtils.getPictures(fileData);
        pictures.forEach((id, xssfPictureData) -> {
            System.out.println("id:" + id);
            String fileName = xssfPictureData.getPackagePart().getPartName().getName();
            System.out.println("fileName:" + fileName);
            File file = new File("C:\\Users\\XXX\\Desktop\\" + fileName);
            File dir = file.getParentFile();
            dir.mkdirs();
            try {
                Files.write(Path.of(file.getPath()), xssfPictureData.getData());
            } catch (IOException e) {
                e.printStackTrace();
            }
        });
    }

    /**
     * 獲取浮動圖片,以 map 形式返回,鍵為行列格式 x-y。
     *
     * @param xssfSheet WPS 工作表
     * @return 浮動圖片的 map
     */
    public static Map<String, XSSFPictureData> getFloatingPictures(XSSFSheet xssfSheet) {
        Map<String, XSSFPictureData> mapFloatingPictures = new HashMap<>();
        XSSFDrawing drawingPatriarch = xssfSheet.getDrawingPatriarch();
        if (drawingPatriarch != null) {
            List<XSSFShape> shapes = drawingPatriarch.getShapes();
            for (XSSFShape shape : shapes) {
                if (shape instanceof XSSFPicture picture) {
                    XSSFClientAnchor anchor = (XSSFClientAnchor) picture.getAnchor();
                    XSSFPictureData pictureData = picture.getPictureData();
                    String key = anchor.getRow1() + "-" + anchor.getCol1();
                    mapFloatingPictures.put(key, pictureData);
                }
            }
        }
        return mapFloatingPictures;
    }

    /**
     * 處理 WPS 文件中的圖片數據,返回圖片信息 map。
     *
     * @param stream    輸入流
     * @param mapConfig 配置映射
     * @return 圖片信息的 map
     * @throws IOException
     */
    private Map<String, XSSFPictureData> processPictures(ByteArrayInputStream stream, Map<String, String> mapConfig) throws IOException {
        Map<String, XSSFPictureData> mapPictures = new HashedMap<>();
        Workbook workbook = WorkbookFactory.create(stream);
        List<XSSFPictureData> allPictures = (List<XSSFPictureData>) workbook.getAllPictures();
        for (XSSFPictureData pictureData : allPictures) {
            PackagePartName partName = pictureData.getPackagePart().getPartName();
            String uri = partName.getURI().toString();
            if (mapConfig.containsKey(uri)) {
                String strId = mapConfig.get(uri);
                mapPictures.put(strId, pictureData);
            }
        }
        return mapPictures;
    }

    /**
     * 獲取 WPS 文檔中的圖片,包括嵌入式圖片和浮動式圖片。
     *
     * @param data 二進制數據
     * @return 圖片信息的 map
     * @throws IOException
     */
    public Map<String, XSSFPictureData> getPictures(byte[] data) {
        try {
            Map<String, String> mapConfig = processZipEntries(new ByteArrayInputStream(data));
            Map<String, XSSFPictureData> mapPictures = processPictures(new ByteArrayInputStream(data), mapConfig);
            Iterator<Sheet> sheetIterator = WorkbookFactory.create(new ByteArrayInputStream(data)).sheetIterator();
            while (sheetIterator.hasNext()) {
                mapPictures.putAll(getFloatingPictures((XSSFSheet) sheetIterator.next()));
            }
            return mapPictures;
        } catch (IOException e) {
            return new HashedMap<>();
        }
    }

    /**
     * 處理 Zip 文件中的條目,更新圖片配置信息。
     *
     * @param stream Zip 輸入流
     * @return 配置信息的 map
     * @throws IOException
     */
    private Map<String, String> processZipEntries(ByteArrayInputStream stream) throws IOException {
        Map<String, String> mapConfig = new HashedMap<>();
        ZipInputStream zipInputStream = new ZipInputStream(stream);
        ZipEntry zipEntry;
        while ((zipEntry = zipInputStream.getNextEntry()) != null) {
            try {
                final String fileName = zipEntry.getName();
                if ("xl/cellimages.xml".equals(fileName)) {
                    processCellImages(zipInputStream, mapConfig);
                } else if ("xl/_rels/cellimages.xml.rels".equals(fileName)) {
                    return processCellImagesRels(zipInputStream, mapConfig);
                }
            } finally {
                zipInputStream.closeEntry();
            }
        }
        return new HashedMap<>();
    }

    /**
     * 處理 Zip 文件中的 cellimages.xml 文件,更新圖片配置信息。
     *
     * @param zipInputStream Zip 輸入流
     * @param mapConfig      配置信息的 map
     * @throws IOException
     */
    private void processCellImages(ZipInputStream zipInputStream, Map<String, String> mapConfig) throws IOException {
        String content = IOUtils.toString(zipInputStream, StandardCharsets.UTF_8);
        JSONObject jsonObject = XML.toJSONObject(content);
        if (jsonObject != null) {
            JSONObject cellImages = jsonObject.getJSONObject("etc:cellImages");
            if (cellImages != null) {
                JSONArray cellImageArray = null;
                Object cellImage = cellImages.get("etc:cellImage");
                if (cellImage != null && cellImage instanceof JSONArray) {
                    cellImageArray = (JSONArray) cellImage;
                } else if (cellImage != null && cellImage instanceof JSONObject cellImageObj) {
                    if (cellImageObj != null) {
                        cellImageArray = new JSONArray();
                        cellImageArray.add(cellImageObj);
                    }
                }
                if (cellImageArray != null) {
                    processImageItems(cellImageArray, mapConfig);
                }
            }
        }
    }

    /**
     * 處理 cellImageArray 中的圖片項,更新圖片配置信息。
     *
     * @param cellImageArray 圖片項的 JSONArray
     * @param mapConfig      配置信息的 map
     */
    private void processImageItems(JSONArray cellImageArray, Map<String, String> mapConfig) {
        for (int i = 0; i < cellImageArray.size(); i++) {
            JSONObject imageItem = cellImageArray.getJSONObject(i);
            if (imageItem != null) {
                JSONObject pic = imageItem.getJSONObject("xdr:pic");
                if (pic != null) {
                    processPic(pic, mapConfig);
                }
            }
        }
    }

    /**
     * 處理 pic 中的圖片信息,更新圖片配置信息。
     *
     * @param pic       圖片的 JSONObject
     * @param mapConfig 配置信息的 map
     */
    private void processPic(JSONObject pic, Map<String, String> mapConfig) {
        JSONObject nvPicPr = pic.getJSONObject("xdr:nvPicPr");
        if (nvPicPr != null) {
            JSONObject cNvPr = nvPicPr.getJSONObject("xdr:cNvPr");
            if (cNvPr != null) {
                String name = cNvPr.getStr("name");
                if (StringUtils.isNotEmpty(name)) {
                    String strImageEmbed = updateImageEmbed(pic);
                    if (strImageEmbed != null) {
                        mapConfig.put(strImageEmbed, name);
                    }
                }
            }
        }
    }

    /**
     * 獲取嵌入式圖片的 embed 信息。
     *
     * @param pic 圖片的 JSONObject
     * @return embed 信息
     */
    private String updateImageEmbed(JSONObject pic) {
        JSONObject blipFill = pic.getJSONObject("xdr:blipFill");
        if (blipFill != null) {
            JSONObject blip = blipFill.getJSONObject("a:blip");
            if (blip != null) {
                return blip.getStr("r:embed");
            }
        }
        return null;
    }

    /**
     * 處理 Zip 文件中的 relationship 條目,更新配置信息。
     *
     * @param zipInputStream Zip 輸入流
     * @param mapConfig      配置信息的 map
     * @return 配置信息的 map
     * @throws IOException
     */
    private Map<String, String> processCellImagesRels(ZipInputStream zipInputStream, Map<String, String> mapConfig) throws IOException {
        String content = IOUtils.toString(zipInputStream, StandardCharsets.UTF_8);
        JSONObject jsonObject = XML.toJSONObject(content);
        JSONObject relationships = jsonObject.getJSONObject("Relationships");
        if (relationships != null) {
            JSONArray relationshipArray = null;
            Object relationship = relationships.get("Relationship");

            if (relationship != null && relationship instanceof JSONArray) {
                relationshipArray = (JSONArray) relationship;
            } else if (relationship != null && relationship instanceof JSONObject relationshipObj) {
                if (relationshipObj != null) {
                    relationshipArray = new JSONArray();
                    relationshipArray.add(relationshipObj);
                }
            }
            if (relationshipArray != null) {
                return processRelationships(relationshipArray, mapConfig);
            }
        }
        return null;
    }

    /**
     * 處理 relationshipArray 中的關系項,更新配置信息。
     *
     * @param relationshipArray 關系項的 JSONArray
     * @param mapConfig         配置信息的 map
     * @return 配置信息的 map
     */
    private Map<String, String> processRelationships(JSONArray relationshipArray, Map<String, String> mapConfig) {
        Map<String, String> mapRelationships = new HashedMap<>();
        for (int i = 0; i < relationshipArray.size(); i++) {
            JSONObject relaItem = relationshipArray.getJSONObject(i);
            if (relaItem != null) {
                String id = relaItem.getStr("Id");
                String value = "/xl/" + relaItem.getStr("Target");
                if (mapConfig.containsKey(id)) {
                    String strImageId = mapConfig.get(id);
                    mapRelationships.put(value, strImageId);
                }
            }
        }
        return mapRelationships;
    }

    /**
     * @param file 數據文件
     * @return {@link byte[]}
     * @description
     * @author bianhl
     * @date 2024/4/26 13:52
     */
    private byte[] getFileStream(File file) {
        try (InputStream inputStream = new FileInputStream(file)) {
            // 創(chuàng)建 ByteArrayOutputStream 來暫存流數據
            ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
            // 將 inputStream 讀取到 byteArrayOutputStream 中
            byte[] buffer = new byte[1024];
            int length;
            while ((length = inputStream.read(buffer)) != -1) {
                byteArrayOutputStream.write(buffer, 0, length);
            }
            // 將 byteArrayOutputStream 的內容獲取為字節(jié)數組
            return byteArrayOutputStream.toByteArray();
        } catch (IOException e) {
            return null;
        }
    }


}

輸出結果:

拿到的圖片數據

以上就是利用Java實現讀取WPS Excel中嵌入的圖片的詳細內容,更多關于Java讀取Excel嵌入的圖片的資料請關注腳本之家其它相關文章!

相關文章

  • java必學必會之GUI編程

    java必學必會之GUI編程

    這篇文章主要為大家詳細介紹了java GUI編程,對于GUI編程小編也不是很了解,通過這篇文章和大家一起學習GUI編程,感興趣的小伙伴們可以參考一下
    2015-12-12
  • 一篇文章讀懂Java哈希與一致性哈希算法

    一篇文章讀懂Java哈希與一致性哈希算法

    下面是小編為大家分享的關于哈希與一致性哈希算法的一篇文章,結合了大量圖片以及文字詳細講解,大家感興趣的可以自己參考一下
    2021-08-08
  • 利用Java的Struts框架實現電子郵件發(fā)送功能

    利用Java的Struts框架實現電子郵件發(fā)送功能

    這篇文章主要介紹了利用Java的Struts框架實現電子郵件發(fā)送功能,Struts框架是Java的SSH三大web開發(fā)框架之一,需要的朋友可以參考下
    2015-12-12
  • Java 向上轉型和向下轉型的詳解

    Java 向上轉型和向下轉型的詳解

    這篇文章主要介紹了 Java 向上轉型和向下轉型的詳解的相關資料,需要的朋友可以參考下
    2017-04-04
  • 實例詳解SpringMVC入門使用

    實例詳解SpringMVC入門使用

    大家好,本篇文章主要講的是實例詳解SpringMVC入門使用,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • elasticsearch源碼分析index?action實現方式

    elasticsearch源碼分析index?action實現方式

    這篇文章主要為大家介紹了elasticsearch源碼分析index?action實現方式,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-04-04
  • SpringBoot后端進行數據校驗JSR303的使用詳解

    SpringBoot后端進行數據校驗JSR303的使用詳解

    這篇文章主要介紹了SpringBoot后端進行數據校驗JSR303的使用詳解,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03
  • jar包同目錄生成文件實現方式

    jar包同目錄生成文件實現方式

    文章介紹了如何在Windows環(huán)境下將Java程序打包成jar文件,并在Linux環(huán)境下運行時生成JSON文件,關鍵點是確保生成的JSON文件與jar包在同一目錄下,而不是當前工作目錄(pwd)
    2025-11-11
  • 解決springboot使用logback日志出現LOG_PATH_IS_UNDEFINED文件夾的問題

    解決springboot使用logback日志出現LOG_PATH_IS_UNDEFINED文件夾的問題

    這篇文章主要介紹了解決springboot使用logback日志出現LOG_PATH_IS_UNDEFINED文件夾的問題,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-04-04
  • springboot項目啟動慢的問題排查方式

    springboot項目啟動慢的問題排查方式

    這篇文章主要介紹了springboot項目啟動慢的問題排查方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09

最新評論

巩留县| 城口县| 达尔| 清徐县| 中阳县| 达日县| 屏山县| 驻马店市| 合肥市| 宜川县| 饶河县| 大新县| 蓬莱市| 迭部县| 乌拉特后旗| 扶沟县| 江安县| 宜丰县| 自治县| 延长县| 钦州市| 镇康县| 大竹县| 阳信县| 平邑县| 松溪县| 淳安县| 青冈县| 铁岭县| 滦平县| 丁青县| 大埔县| 峡江县| 新乐市| 玛多县| 巨野县| 同心县| 那坡县| 平和县| 卓资县| 雅江县|