java读取excel的图片

java读取excel中的图片

1、第一步要导入相关的依赖

这里我使用了阿里云的OSS对象存储、XFileStorage一键上传、apachePOI

       
        
            org.apache.poi
            poi-ooxml
        

        
            org.dromara.x-file-storage
            x-file-storage-spring
            2.1.0
        

        
            com.aliyun.oss
            aliyun-sdk-oss
            3.17.4
        

2、 获取工作表

			InputStream photoInputStream = file.getInputStream();
            XSSFWorkbook workbook = new XSSFWorkbook(photoInputStream);

我这里用的是文件上传,然后将上传的file文件转换成InputStream文件流,再将文件流转换成XSS对象,
然后,获取工作表sheet,

XSSFSheet sheet = workbook.getSheetAt(0);

我确定我的excel里面只有一个工作表,所以我直接get(0);如果不确定有几个,可以从0 开始遍历。

3、获取excel里的图片集合


		//为一个excel的不同图片设置不同名字,可选
        int photoId = 0;

        // 获取工作表的绘图父对象,用于后续在工作表中添加形状、图片等绘图元
        XSSFDrawing drawing = sheet.getDrawingPatriarch();
        //获取excel的图片集合
        List shapes = drawing.getShapes();

4、遍历集合,获取图片数据

我这里将图片数据读取出来后,转换成二进制文件,然后再创建一个文件输出流,将二进制文件写入一个临时文件里面,再将临时文件改名使用Xfile存入OSS中,也可以直接把临时文件取好名字保存起来存在本地,然后数据库存储本地文件路径,两种存储方式不一样而已。如果存入第三方的话,记得要删掉临时文件,并且,为了不产生更多临时文件,我把临时文件的名字都写成一样的,他们就会一直覆盖,只会有一份文件。下面那个方法包含了创建临时文件,编写文件,程序结束时删除文件。

                //XSSFPicture类型转化成MultipartFile,否则存不了
                // 获取图片数据
                XSSFPicture picture = (XSSFPicture) shape;
                // 获取建议的文件扩展名
                String extension = picture.getPictureData().suggestFileExtension();
                // 创建文件名
                String fileName = farm.getFarmName() + photoId + extension;
				//获取二进制
                byte[] pictureData = picture.getPictureData().getData();

				//这个名字似乎没有什么用,但是不写报错。
                FileOutputStream fileOutputStream = new FileOutputStream("临时文件");
                //往流里面写数据
                fileOutputStream.write(pictureData);

                // 转换byte[]到File
                File  photoFile= convertByteArrayToFile(pictureData, fileName);

                System.out.println("文件已保存为: 临时文件.png");
                //关闭流
                fileOutputStream.close();
				
				//这个是使用XFileStorage存数据,特别好用,号称一行代码完成文件上传
                FileInfo upload = fileStorageService.of(photoFile)
                        .setSaveFilename("养殖场/" + farm.getFarmName()+photoId+".jpg")
                        .upload();
                photoId++;
                detailImages.setImagePath(upload.getUrl());
                detailImagesMapper.insertDetailImages(detailImages);
            }
        }

private static File convertByteArrayToFile(byte[] byteArray, String fileName) {
        // 创建一个临时文件或者指定具体的文件路径
        File tempFile = new File("临时文件.png"); // 

        try (FileOutputStream fos = new FileOutputStream(tempFile)) {
            fos.write(byteArray);
        } catch (IOException e) {
            e.printStackTrace();
        }
        //删除临时文件
        tempFile.deleteOnExit();

        return tempFile;
    }

你可能感兴趣的:(java,excel,spring,gitee)