Apache POI 插入图片

18

我在制作Excel表格时遇到了插入图片的问题。 关于这个主题有很多问题,但我简单地无法弄清楚我做错了什么。 我的代码可以运行,没有错误,但是我没有看到插入的图像 :(

以下是代码:

    InputStream is = new FileInputStream("nasuto_tlo.png");
    byte [] bytes = IOUtils.toByteArray(is); 
    int pictureIndex = wb.addPicture(bytes, Workbook.PICTURE_TYPE_PNG);
    is.close();

    CreationHelper helper = wb.getCreationHelper();
    Drawing drawingPatriarch = sheet.createDrawingPatriarch();
    ClientAnchor anchor = helper.createClientAnchor();

    anchor.setCol1(2);
    anchor.setRow1(3);
    Picture pict = drawingPatriarch.createPicture(anchor, pictureIndex);
    pict.resize();

    try {
        FileOutputStream out = new FileOutputStream(root+"/Busotina/Busotina1.xls");
        wb.write(out);
        out.close();
    } catch (Exception e) {
        e.printStackTrace();
    }

POI在插入Word文档中的图片方面存在问题,因此我认为这是相关的。 - dkatzel
1
它能在新工作表上工作吗?POI 只能添加到没有任何现有图像的工作表中,如果您试图将它们添加到已有图像的工作表中,它就不会起作用。 - Gagravarr
1个回答

27
问题在于您的锚点不正确。您需要设置所有4个值,因为默认值为0 - 但是您的第一列不能比第二列更靠右;) 您将获得负范围。当您打开Excel文件时,应该会收到警告,表明文件已损坏。
所以请尝试:
anchor.setCol1(2);
anchor.setCol2(3);
anchor.setRow1(3);
anchor.setRow2(4);

我写的一段代码中的一个实际工作示例:

// read the image to the stream
final FileInputStream stream =
        new FileInputStream( imagePath );
final CreationHelper helper = workbook.getCreationHelper();
final Drawing drawing = sheet.createDrawingPatriarch();

final ClientAnchor anchor = helper.createClientAnchor();
anchor.setAnchorType( ClientAnchor.MOVE_AND_RESIZE );


final int pictureIndex =
        workbook.addPicture(IOUtils.toByteArray(stream), Workbook.PICTURE_TYPE_PNG);


anchor.setCol1( 0 );
anchor.setRow1( LOGO_ROW ); // same row is okay
anchor.setRow2( LOGO_ROW );
anchor.setCol2( 1 );
final Picture pict = drawing.createPicture( anchor, pictureIndex );
pict.resize();

1
你好!我需要插入一张不来自磁盘的图片。我的图片存储在内存中的位图数组中,我不想将其保存到硬盘上。我能直接从位图数组中插入数据到 .docx 文件中吗? - Art B
抱歉,我从未使用过docx。但为什么不呢?据我所知,poi需要输入流,您可以使用ByteArrayInputStream。 - Mirco

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接