使用poi导出Excel中的图片

高跟叩石

按理说这个功能在网上应该有很多教程,我不需要再发一次的。但是搜索发现结果全是“导出图片到Excel”之类的内容。我实在是有些不能理解,明明应该是叫“将图片插入Excel”或者“导出Excel中的图片”,那些“导出图片到Excel”是什么鬼?到底哪个是主,哪个是次?至少说成“导出数据到Excel”都行啊。

这些不是关键,关键是即便说的没问题,搜索引擎也未必能理解,所以我搜的时候找到想要的内容还真不容易。

网上找了一篇:https://blog.csdn.net/wy123123000/article/details/81330712

帖代码不帖import语句真是耍流氓,稍作修改后:


import org.apache.poi.POIXMLDocumentPart;

import org.apache.poi.hssf.usermodel.HSSFClientAnchor;

import org.apache.poi.hssf.usermodel.HSSFPicture;

import org.apache.poi.hssf.usermodel.HSSFShape;

import org.apache.poi.hssf.usermodel.HSSFSheet;

import org.apache.poi.ss.usermodel.PictureData;

import org.apache.poi.xssf.usermodel.*;

import org.openxmlformats.schemas.drawingml.x2006.spreadsheetDrawing.CTMarker;


import java.io.FileOutputStream;

import java.io.IOException;

import java.util.HashMap;

import java.util.List;

import java.util.Map;


public class Test {

public static void main(String[] args) {

System.out.println(1);

}


/**

* 获取图片和位置 (xls)

*/

public static Map<String, PictureData> getPictures1(HSSFSheet sheet) throws IOException {

Map<String, PictureData> map = new HashMap<String, PictureData>();

List<HSSFShape> list = sheet.getDrawingPatriarch().getChildren();

for (HSSFShape shape : list) {

if (shape instanceof HSSFPicture) {

HSSFPicture picture = (HSSFPicture) shape;

HSSFClientAnchor cAnchor = (HSSFClientAnchor) picture.getAnchor();

PictureData pdata = picture.getPictureData();

String key = cAnchor.getRow1() + "-" + cAnchor.getCol1(); // 行号-列号

map.put(key, pdata);

}

}

return map;

}


/**

* 获取图片和位置 (xlsx)

*/

public static Map<String, PictureData> getPictures2(XSSFSheet sheet) throws IOException {

Map<String, PictureData> map = new HashMap<String, PictureData>();

List<POIXMLDocumentPart> list = sheet.getRelations();

for (POIXMLDocumentPart part : list) {

if (part instanceof XSSFDrawing) {

XSSFDrawing drawing = (XSSFDrawing) part;

List<XSSFShape> shapes = drawing.getShapes();

for (XSSFShape shape : shapes) {

XSSFPicture picture = (XSSFPicture) shape;

XSSFClientAnchor anchor = picture.getPreferredSize();

CTMarker marker = anchor.getFrom();

String key = marker.getRow() + "-" + marker.getCol();

map.put(key, picture.getPictureData());

}

}

}

return map;

}


//图片写出

public static void printImg(Map<String, PictureData> sheetList) throws IOException {

Object key[] = sheetList.keySet().toArray();

for (int i = 0; i < sheetList.size(); i++) {

// 获取图片流

PictureData pic = sheetList.get(key[i]);

// 获取图片索引

String picName = key[i].toString();

// 获取图片格式

String ext = pic.suggestFileExtension();


byte[] data = pic.getData();


//图片保存路径

FileOutputStream out = new FileOutputStream("D:\\img\\pic" + picName + "." + ext);

out.write(data);

out.close();

}

}

}

以上也不是理想的流程,不过基本方法如此,如何用就看需求了。

主 楼 发布于:2018-11-20 16:15:57 编辑于:2018-11-20 16:19:06回复
高跟叩石

网上很多不知道哪个旮旯拐复制粘贴来的代码真是服了,很多前言不搭后语的,没头没尾的东西也帖上来,能不能运行也是未知数,看那些简直是浪费生命,还是自己修改、验证后的靠谱。虽然我这个也是复制来的,但通常能直接搜到的我是懒得帖进来,像现在这样搜索结果牛头不对马嘴的,那就没办法了,靠别人不如靠自己。

还有很多在不同平台都有相同文章的情况,严重怀疑是那些平台放爬虫去爬取然后自己发布的。

2 楼 发布于:2018-11-20 16:25:25
回复
大展夫人

数钱数到手抽筋,睡觉睡到自然醒!

3 楼 发布于:2019-01-29 17:37:48
回复
王小花王小花

笑摸二楼狗头

4 楼 发布于:2019-02-07 03:26:04
回复
乖乖的小沐

流氓不害怕,就怕流氓有文化……

5 楼 发布于:2019-03-08 07:03:14
回复

发表回复: