Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在使用ApachePOI将多个图像插入Excel时,第一个图像被删除_Java_Excel_Image_Apache_Apache Poi - Fatal编程技术网

Java 在使用ApachePOI将多个图像插入Excel时,第一个图像被删除

Java 在使用ApachePOI将多个图像插入Excel时,第一个图像被删除,java,excel,image,apache,apache-poi,Java,Excel,Image,Apache,Apache Poi,我正在尝试将图像插入Excel工作表。 成功插入Excel工作表,但问题出现在这里 当我尝试将多个图像插入excel工作表时,第一个图像将被删除。从两天开始,我一直在努力解决这个问题,但在任何地方我都看不到绿色信号。如果有人有任何想法,请帮助我 下面是我的代码: public static void main(String args[]) throws IOException { openExcel(); pasteInExcel(); openExcel();

我正在尝试将图像插入Excel工作表。 成功插入Excel工作表,但问题出现在这里

当我尝试将多个图像插入excel工作表时,第一个图像将被删除。从两天开始,我一直在努力解决这个问题,但在任何地方我都看不到绿色信号。如果有人有任何想法,请帮助我

下面是我的代码:

public static void main(String args[]) throws IOException {
    openExcel();
    pasteInExcel();

    openExcel();
    pasteInExcel();


    openExcel();
    pasteInExcel();
}

private static void pasteInExcel() throws IOException {
    InputStream my_banner_image = new FileInputStream(imgPath);
    byte[] bytes = org.apache.poi.util.IOUtils.toByteArray(my_banner_image);
    int my_picture_id = my_workbook.addPicture(bytes, Workbook.PICTURE_TYPE_PNG);
    my_banner_image.close();
    XSSFDrawing drawing = my_sheet.createDrawingPatriarch();
    XSSFPicture my_picture = drawing.createPicture(getAnchorPoint(), my_picture_id);
    my_picture.resize();
    fileClose();
}

public static void openExcel() throws IOException {
    File f = new File(excelPath);
    if (!f.exists()) {
        my_workbook = new XSSFWorkbook();
        my_sheet = my_workbook.createSheet("MyLogo");
    } else {
        my_workbook = new XSSFWorkbook(new FileInputStream(excelPath));
        my_sheet = my_workbook.getSheet("MyLogo");
    }
}

public static XSSFClientAnchor getAnchorPoint() {
    System.out.println("Row is "+row);
    XSSFClientAnchor my_anchor = new XSSFClientAnchor();
    my_anchor.setCol1(2);
    my_anchor.setRow1(row);
    row = row + 5;
    return my_anchor;
}

public static void fileClose() throws IOException {
    FileOutputStream fos = new FileOutputStream(excelPath);
    my_workbook.write(fos);
    fos.close();
}

我已经运行了您的代码(我添加了一些您没有提供的缺少字段声明)。但无法重现您的问题。这是输出的excel文件

在我的例子中,我使用的maven具有以下依赖项:

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>3.11</version>
</dependency>
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>3.11</version>
</dependency>
提议的解决办法:
尝试将poi和poi ooxml的版本更改为3.11

不要每次都调用
CreateDrawingParator
,而是获取当前版本为什么建议使用
ApachePOI
3.11
?这个版本很古老。当前的稳定版本是
4.0.1
。我建议使用一个已经在本地机器上测试过的版本来解决这个特定问题。如果你设法用不同的版本解决了这个问题,那就去做吧。
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;

import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFClientAnchor;
import org.apache.poi.xssf.usermodel.XSSFDrawing;
import org.apache.poi.xssf.usermodel.XSSFPicture;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class Main{

    private static Workbook my_workbook;
    private static Sheet my_sheet;
    private static String imgPath;
    private static String excelPath;
    private static int row=0;

    public static void main(String args[]) throws IOException {
        init();

        openExcel();
        pasteInExcel();

        openExcel();
        pasteInExcel();

        openExcel();
        pasteInExcel();
    }

    private static void init() {
        excelPath = "C:\\temp\\test.xlsx";
        imgPath = "C:\\temp\\test-image.png";
    }

    private static void pasteInExcel() throws IOException {
        InputStream my_banner_image = new FileInputStream(imgPath);
        byte[] bytes = org.apache.poi.util.IOUtils.toByteArray(my_banner_image);
        int my_picture_id = my_workbook.addPicture(bytes, Workbook.PICTURE_TYPE_PNG);
        my_banner_image.close();
        XSSFDrawing drawing = (XSSFDrawing) my_sheet.createDrawingPatriarch();
        XSSFPicture my_picture = drawing.createPicture(getAnchorPoint(), my_picture_id);
        my_picture.resize();
        fileClose();
    }

    public static void openExcel() throws IOException {
        File f = new File(excelPath);

        if (!f.exists()) {
            my_workbook = new XSSFWorkbook();
           my_sheet = my_workbook.createSheet("MyLogo");
        } else {
            my_workbook = new XSSFWorkbook(new FileInputStream(excelPath));
            my_sheet = my_workbook.getSheet("MyLogo");
        }
    }

    public static XSSFClientAnchor getAnchorPoint() {
        System.out.println("Row is "+row);
        XSSFClientAnchor my_anchor = new XSSFClientAnchor();
        my_anchor.setCol1(2);
        my_anchor.setRow1(row);
        row = row + 5;
        return my_anchor;
    }

    public static void fileClose() throws IOException {
        FileOutputStream fos = new FileOutputStream(excelPath);
        my_workbook.write(fos);
        fos.close();
    }
}