Защитить / заморозить положение и размер изображения в листе xslx с помощью apache POI - PullRequest
0 голосов
/ 28 июня 2019

Я создаю файл xlsx, используя Apache POI, в который логотип вставляется в верхнем левом углу.Проблема в том, что когда размер ячейки увеличивается, изображение также увеличивается.Как заморозить или защитить размер и положение изображения, чтобы при увеличении размера ячейки изображение оставалось прежним (не расширялось).

Ниже приведен код для вставки изображения.

rowNo = 1;
row = sheet.createRow(rowNo);
//For Adding sample Logo
addImage(1, 1, 3, 4, appPath + "/images/sample_logo.png"); 

public boolean addImage(int col1, int row1, int col2, int row2, String FileName) {
        try {
            FileInputStream fileInputStream = null;
            try {
                fileInputStream = new FileInputStream(FileName);
            } catch (FileNotFoundException e) {
                return false;
            }
            ByteArrayOutputStream imgBytes = new ByteArrayOutputStream();
            int b;

            try {
                while ((b = fileInputStream.read()) != -1) {
                    imgBytes.write(b);
                }
                fileInputStream.close();
            } catch (IOException e) {
                return false;
            }
        sheet.addMergedRegion(new CellRangeAddress(row1, row2 - 1, col1, col2 - 1)); 
       // sheet.addMergedRegion(new CellRangeAddress(1, 3, 1, 2));
            XSSFClientAnchor anchor = new XSSFClientAnchor(0, 0, 0, 0, col1, row1, col2, row2);
            int index = workBook.addPicture(imgBytes.toByteArray(), HSSFWorkbook.PICTURE_TYPE_JPEG); //index = 4
            XSSFDrawing patriarch = sheet.createDrawingPatriarch();
            patriarch.createPicture(anchor, index);
            anchor.setAnchorType(2);
        } catch (Exception ex) {
            LOGGER.error(ex);
        }
        return true;
    }

Пожалуйста, помогите мне.

1 Ответ

3 голосов
/ 28 июня 2019

Значение Format Picture - Size and Properties - Don't move or size with cells будет установлено в apache poi с использованием XSSFClientAnchor.setAnchorType , установленным в ClientAnchor.AnchorType DONT_MOVE_AND_RESIZE.

Пример:

import java.io.InputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import org.apache.poi.util.IOUtils;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.ClientAnchor;
import org.apache.poi.xssf.usermodel.*;

class CreateExcelPictures {

 static String excelPath = "./ExcelWithLogo.xlsx";
 static String appPath = "./";
 static XSSFWorkbook workbook;
 static XSSFSheet sheet;

 static void addImage(int col1, int row1, int col2, int row2, String imageFileName, ClientAnchor.AnchorType anchorType) throws Exception {

  InputStream imageInputStream = new FileInputStream(imageFileName);
  byte[] bytes = IOUtils.toByteArray(imageInputStream);
  int pictureId = workbook.addPicture(bytes, Workbook.PICTURE_TYPE_PNG);
  imageInputStream .close();

  XSSFClientAnchor anchor = workbook.getCreationHelper().createClientAnchor();
  anchor.setAnchorType(anchorType);
  anchor.setCol1(col1);
  anchor.setRow1(row1);
  anchor.setCol2(col2);
  anchor.setRow2(row2);

  XSSFDrawing drawing = sheet.createDrawingPatriarch();

  XSSFPicture picture = drawing.createPicture(anchor, pictureId);

 }

 public static void main(String args[]) throws Exception {

  workbook = new XSSFWorkbook();
  sheet = workbook.createSheet();

  addImage(1, 1, 3, 4, appPath + "sample_logo.png", ClientAnchor.AnchorType.DONT_MOVE_AND_RESIZE); 

  FileOutputStream fos = new FileOutputStream(excelPath);
  workbook.write(fos);
  fos.close();
  workbook.close();

 }
}

После этого изображение sample_logo.png, привязанное к B4:C4, не будет перемещено и / или не изменено в размере при изменении размеров ячейки.

...