Как вставить фоновое изображение для комментария Excel в формате .xlsx (Apache POI XSSF)? - PullRequest
2 голосов
/ 13 января 2020

Есть вопрос, который решает, как добавить фоновое изображение для комментария Excel в версиях, предшествующих 2007 году (формат .xsl), с HSSF Apache POI.

apache poi вставить комментарий с картинкой

Но, глядя на do c, я не могу найти эквивалентный метод для XSSF Apache POI (форматы .xslx).

Кажется, это ключ метод был удален при переходе от HSSF к XSSF:

HSSFComment        comment;
...
comment.setBackgroundImage(picIndex); // set picture as background image

Ответы [ 2 ]

2 голосов
/ 13 января 2020

Не поддерживается с использованием метода XSSFComment. Но если кто-то знает, что нужно создать, то это не невозможно.

Сначала нам нужно создать комментарий по умолчанию, как показано в Quick-Quide CellComments .

Затем нам нужно добавить данные изображений в эту книгу, как показано в Краткое руководство по изображениям . Для добавления ссылок нам понадобится XSSFPictureData.

Затем нам нужно получить чертеж VML. XSSFComments хранятся в чертежах VML и не по умолчанию XSSFDrawings. Это не публикуется c, поэтому для этого нам нужно использовать отражение.

Теперь нам нужно установить отношение к данным изображения на чертеже VML.

Наконец нам нужно получить форма комментария из чертежа VML, чтобы задать заливку этой формы комментария для отображения изображения. Для этого нет методов высокого уровня. Поэтому нам нужно использовать методы низкоуровневых com.microsoft.schemas.vml.* классов.

В следующем примере необходим полный jar всех схем ooxml-schemas-1.4.jar, как указано в FAQ . Протестировано с использованием apache poi 4.1.1.

Полный пример:

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

class CreateXSSFCommentWithPicture {

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

  try (XSSFWorkbook workbook = new XSSFWorkbook(); 
       FileOutputStream fileout = new FileOutputStream("Excel.xlsx") ) {

   // First we create a default XSSFComment:

   XSSFCreationHelper factory = workbook.getCreationHelper();

   XSSFSheet sheet = workbook.createSheet("Sheet");
   XSSFRow row = sheet.createRow(3);
   XSSFCell cell = row.createCell(5);
   cell.setCellValue("F4");

   XSSFDrawing drawing = sheet.createDrawingPatriarch();

   XSSFClientAnchor anchor = factory.createClientAnchor();
   anchor.setCol1(cell.getColumnIndex());
   anchor.setCol2(cell.getColumnIndex()+2);
   anchor.setRow1(row.getRowNum());
   anchor.setRow2(row.getRowNum()+5);

   XSSFComment comment = drawing.createCellComment(anchor);
   XSSFRichTextString str = factory.createRichTextString("Hello, World!");
   comment.setString(str);
   comment.setAuthor("Apache POI");

   // assign the comment to the cell
   cell.setCellComment(comment);


   // Now we put the image as fill of the comment's shape:

   // add picture data to this workbook
   InputStream is = new FileInputStream("samplePict.jpeg");
   byte[] bytes = IOUtils.toByteArray(is);
   int pictureIdx = workbook.addPicture(bytes, XSSFWorkbook.PICTURE_TYPE_JPEG);
   is.close();
   // get picture data
   XSSFPictureData pictureData = workbook.getAllPictures().get(pictureIdx);

   // get VML drawing
   java.lang.reflect.Method getVMLDrawing = XSSFSheet.class.getDeclaredMethod("getVMLDrawing", boolean.class);
   getVMLDrawing.setAccessible(true);
   XSSFVMLDrawing vml = (XSSFVMLDrawing)getVMLDrawing.invoke(sheet, true);

   // set relation to the picture data in VML drawing
   org.apache.poi.ooxml.POIXMLDocumentPart.RelationPart rp = vml.addRelation(null, XSSFRelation.IMAGES, pictureData);

   // get comment shape
   com.microsoft.schemas.vml.CTShape commentShape = vml.findCommentShape(cell.getRow().getRowNum(), cell.getColumnIndex());
   // get fill of comment shape
   com.microsoft.schemas.vml.CTFill fill = commentShape.getFillArray(0);
   // already set color needs to be color2 now
   fill.setColor2(fill.getColor());
   fill.unsetColor();
   // set relation Id of the picture
   fill.setRelid(rp.getRelationship().getId());
   // set some other properties
   fill.setTitle("samplePict");
   fill.setRecolor(com.microsoft.schemas.vml.STTrueFalse.T);
   fill.setRotate(com.microsoft.schemas.vml.STTrueFalse.T);
   fill.setType(com.microsoft.schemas.vml.STFillType.FRAME);

   workbook.write(fileout);
  }

 }
}
0 голосов
/ 13 января 2020

Согласно this добавление изображения к комментариям было добавлено только для HSSF.

Я полагаю, вам придется использовать другой подход, как в apache poi guide .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...