前言  

  此方法是利用了poi读取excel然后将其写入到excel指定单元格位置处,并且图片在excle中是处于悬浮状态的,图片最终展示的大小为指定单元格的大小

导入poi相关jar包:

        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>4.1.2</version>
        </dependency>

 

 工具类代码:

package test;

import org.apache.poi.xssf.usermodel.XSSFClientAnchor;
import org.apache.poi.xssf.usermodel.XSSFDrawing;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.*;
import java.util.HashMap;
import java.util.Map;

public class WriteImgUtil {

    /**
     * 写入图片到Excel指定的位置
     *
     * @param patriarch 画图的顶级管理器,一个sheet只能获取一次,多次插入图片请使用同一个patriarch对象
     * @param wb        HSSFWorkbook对象
     * @param filepath      图片文件路径
     * @param cellPoint 自定义的对象,指定要插入图片的坐标(x, y)
     * @return cellPoint 自定义的对象,返回下一个要插入图片的坐标(x, y)
     * @throws IOException
     */
    public static void whiteImg(XSSFDrawing patriarch, XSSFWorkbook wb, String filepath, CellPoint cellPoint) throws IOException {

        ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream();
        BufferedImage bufferImg = ImageIO.read(new File(filepath));
        ImageIO.write(bufferImg, filepath.substring(filepath.lastIndexOf(".") + 1), byteArrayOut);

        // 起点坐标
        int x1 = cellPoint.getRow1();
        int y1 = cellPoint.getCol1();
        // 终点坐标
        int x2 = cellPoint.getRow2();
        int y2 = cellPoint.getCol2();
        // anchor主要用于设置图片的属性
        XSSFClientAnchor anchor1 = new XSSFClientAnchor(0, 0, 0, 0, (short) x1, y1, (short) x2, y2);
        // 插入图片
        int index = wb.addPicture(byteArrayOut.toByteArray(), XSSFWorkbook.PICTURE_TYPE_PICT);
        patriarch.createPicture(anchor1, index);
    }


    public static class CellPoint {
        // 起点横坐标
        private int row1;
        // 起点纵坐标
        private int col1;
        // 终点横坐标
        private int row2;
        // 终点纵坐标
        private int col2;

        public CellPoint(int row1, int col1, int row2, int col2) {
            this.row1 = row1;
            this.col1 = col1;
            this.row2 = row2;
            this.col2 = col2;
        }

        public int getRow1() {
            return row1;
        }

        public void setRow1(int row1) {
            this.row1 = row1;
        }

        public int getCol1() {
            return col1;
        }

        public void setCol1(int col1) {
            this.col1 = col1;
        }

        public int getRow2() {
            return row2;
        }

        public void setRow2(int row2) {
            this.row2 = row2;
        }

        public int getCol2() {
            return col2;
        }

        public void setCol2(int col2) {
            this.col2 = col2;
        }
    }

    /**
     * * 插入图片到指定excel
     *
     * @param file       待插入excel文件
     * @param sheetIndex 待插入excel的Sheet序号(从0开始)
     * @param map        key: 待插入图片路径  value: 图片在excel中的坐标
     * @return
     * @Date: 2020/11/28 10:09
     */
    public static void addImageToExcel(File file, Integer sheetIndex, Map<String, CellPoint> map) {
        FileOutputStream fileOut = null;
        try {
            FileInputStream inputstream = new FileInputStream(file);
            XSSFWorkbook wb = new XSSFWorkbook(inputstream);
            XSSFSheet sheet1 = wb.getSheetAt(sheetIndex);
            // 画图的顶级管理器,一个sheet只能获取一个(一定要注意这点)
            XSSFDrawing patriarch = sheet1.createDrawingPatriarch();
            for (Map.Entry<String, CellPoint> entry : map.entrySet()) {
                String key = entry.getKey(); // 图片路径
                CellPoint point = entry.getValue(); // 图片插入坐标
                whiteImg(patriarch, wb, key, point);
            }
            fileOut = new FileOutputStream(file);
            // 写入excel文件
            wb.write(fileOut);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (fileOut != null) {
                try {
                    fileOut.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    public static void main(String[] args) throws IOException {
        Map<String, CellPoint> map = new HashMap<>();
        map.put("D:\\1.png",new CellPoint(5,13,7,14));
        addImageToExcel(new File("D:\\2.xlsx"),0,map);
        System.out.println("ok");
    }

}

 

posted on 2021-01-19 16:53  蓝色恋人  阅读(2108)  评论(0编辑  收藏  举报