Первое изображение удаляется при вставке нескольких изображений в Excel с помощью Apache POI - PullRequest
0 голосов
/ 28 февраля 2019

Я пытаюсь вставить изображение в лист 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();
}

Вот результат

1 Ответ

0 голосов
/ 28 февраля 2019

Я запустил ваш код (я добавил объявление о пропущенных полях, которое вы не предоставили).Но не смог воспроизвести вашу проблему.Это выходной файл Excel.

enter image description here

В моем случае я использую 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>

Это полный код (на основе предоставленного вами кода):

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();
    }
}

Предлагаемое решение: попробуйте изменить версии poi и poi-ooxml на 3.11

...