gpt4 book ai didi

java - 如何为 .xlsx 格式的 Excel 注释插入背景图像(Apache POI XSSF)?

转载 作者:行者123 更新时间:2023-12-04 10:45:48 29 4
gpt4 key购买 nike

有一个问题解决了如何使用 HSSF Apache POI 在 2007 之前的版本(格式 .xsl)中为 Excel 注释添加背景图像。

apache poi insert comment with picture

但是查看文档,我找不到 XSSF Apache POI(.xslx 格式)的等效方法。

好像这个关键 从 HSSF 移动到 XSSF 时删除了方法:

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

最佳答案

不支持使用 XSSFComment 的方法.但如果一个人知道需要创造什么,那也不是不可能的。

首先,我们需要创建一个默认注释,如 Quick-Quide CellComments 所示。 .

然后我们需要将图片数据添加到此工作簿中,如 Quick-Guide Images 所示。 .我们需要 XSSFPictureData用于稍后添加引用。

然后我们需要获取 VML 绘图。 XSSFComments存储在 VML 图纸中,而不是默认 XSSFDrawings .这不是公开提供的,所以我们需要使用反射来做到这一点。

现在我们需要在 VML 绘图中设置与图片数据的关系。

最后,我们需要从 VML 绘图中获取注释形状,以设置该注释形状的填充以显示图片。对此没有高级方法。所以我们需要使用低级的方法com.microsoft.schemas.vml.*类。

以下示例需要所有模式的完整 jar ooxml-schemas-1.4.jarFAQ 中所述.使用 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);
}

}
}

关于java - 如何为 .xlsx 格式的 Excel 注释插入背景图像(Apache POI XSSF)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59714756/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com