java.lang.NullPointerException; XSSFClientAnchor anchor = picture.getPreferredSize()空指针;poi读取excel图片

poi 专栏收录该内容
1 篇文章 0 订阅

poi jar包下载地址:https://search.maven.org/artifact/org.apache.poi/poi/4.1.0/jar

 

XSSFClientAnchor anchor = picture.getPreferredSize();空指针问题

不啰嗦,先看报错信息

 

然后就是卡在这里三天 ,在网上也找不到太多有用的信息。

最后呢,看了这篇文章给了我启发https://www.cnblogs.com/kevinfuture/p/4775973.html

我发现我的jar包版本不一。

 

 

针对这个错误我另外去下载了一个3.9版本的jar包,重新运行,这个问题就不存在了

 

下面是我的代码:

public static void main(String[] args) { //
		try {
			new ReadExcel().getValues("c:\\aa1.xlsx");
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

//读取excel表的内容
public void getValues(String filePath) throws IOException {
		String values = null;
		// try {
		InputStream is = new FileInputStream(filePath);
		// 构造 XSSFWorkbook 对象,strPath 传入文件路径
		XSSFWorkbook xwb = new XSSFWorkbook(is);

		// 读取第一章表格内容
		XSSFSheet sheet = xwb.getSheetAt(0);

		System.out.println("获取图片");
		// 获取图片
		Map<String, PictureData> map = getPicture1(sheet);
		System.out.println("输出map:" + map);
		System.out.println("写入图片");
		printImg(map);

		// 定义 row、cell
		XSSFRow row;
		String cell;
		System.out.println(sheet.getPhysicalNumberOfRows());
		// 循环输出表格中的内容
		for (int i = sheet.getFirstRowNum(); i < sheet.getPhysicalNumberOfRows(); i++) {
			// 获取表的行
			row = sheet.getRow(i);
			List list = new ArrayList();
			// System.out.println(row.getPhysicalNumberOfCells());
			for (int j = row.getFirstCellNum(); j < row.getPhysicalNumberOfCells(); j++) {
				// 通过 row.getCell(j).toString() 获取单元格内容,
				if (row.getCell(j) != null) {
					cell = row.getCell(j).toString();
					list.add(cell);
					// System.out.println(cell);
					System.out.print(cell + "\t");
				}

			}
			
			System.out.println("");
		}
		
	}


public Map<String, PictureData> getPicture1(XSSFSheet sheet) {
		Map<String, PictureData> map = new HashMap<String, PictureData>();
		List<POIXMLDocumentPart> list = sheet.getRelations();

		System.out.println("输出POIXMLDocumentPart对象集合:" + list);
		for (POIXMLDocumentPart part : list) {
			if (part instanceof XSSFDrawing) {
				XSSFDrawing drawing = (XSSFDrawing) part;
				System.out.println("XSSFDrawing对象:" + drawing);
				List<XSSFShape> shapes = drawing.getShapes();
				System.out.println("XSSFShape对象集合:" + shapes);
				for (XSSFShape shape : shapes) {
					if (shape instanceof XSSFPicture) {
						XSSFPicture picture = (XSSFPicture) shape;
						System.out.println("XSSFPicture对象:" + picture);
						XSSFClientAnchor anchor = picture.getPreferredSize();
						System.out.println("XSSFClientAnchor对象:" + anchor);
						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 {

		System.out.println("map是否有值:" + sheetList.size());
		// for (Map<String, PictureData> map : sheetList) {
		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("G:\\img\\pic" + picName + "." + ext);
			out.write(data);
			out.close();
		}
		// }

	}

 

  • 0
    点赞
  • 3
    评论
  • 0
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页

打赏作者

easy忘记

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值