当前位置: 首页 > 知识库问答 >
问题:

在Apache POI中嵌入Excel中的对象时,如何保持预览图像的原始大小?

巫马浩言
2023-03-14

以下是关于使用Apache POI将对象嵌入到Excel电子表格的答案:

Workbook wb1 = new XSSFWorkbook();
Sheet sh = wb1.createSheet();
int picIdx = wb1.addPicture(getSamplePng(), Workbook.PICTURE_TYPE_PNG);
byte samplePPTX[] = getSamplePPT(true);
int oleIdx = wb1.addOlePackage(samplePPTX, "dummy.pptx", "dummy.pptx", "dummy.pptx");

Drawing<?> pat = sh.createDrawingPatriarch();
ClientAnchor anchor = pat.createAnchor(0, 0, 0, 0, 1, 1, 3, 6);
pat.createObjectData(anchor, oleIdx, picIdx);

这将使用getSamplePng()中的图像作为预览图像创建嵌入对象。此图像锚定到行=1、列=1的单元格,并延伸到行=6、列=3。除非图像纵横比完全匹配,否则会导致图像失真。

Picture接口提供了Resize方法,但是似乎没有从ObjectData获取Picture实例的方法。

ClientAnchor anchor = drawing.createAnchor(0, 
                                           0, 
                                           imgDim.width * Units.EMU_PER_PIXEL,
                                           imgDim.height * Units.EMU_PER_PIXEL,
                                           columnIndex,
                                           rowIndex,
                                           columnIndex,
                                           rowIndex);

我还尝试了setAnchorType(Anchortype.move_dont_resize),这似乎没有任何效果。

使用CreateObjectData嵌入对象时,如何将预览图像调整到原来的大小?

共有1个答案

秦弘亮
2023-03-14

XSSFClientAnchor类提供了一个构造函数,允许提供左上角单元格(作为CTPoint2D对象)和对象大小(以CTPositiveSize2D的形式)。但是,此构造函数受到保护。

解决办法是将该类扩展为接受左上角单元格坐标以及宽度和高度(以EMU为单位)的类:

class SizedClientAnchor extends XSSFClientAnchor
{
    private SizedClientAnchor(XSSFSheet sheet, int columnIndex, int rowIndex, int w, int h)
    {
        super((XSSFSheet) cell.getSheet(), createCTMarker(columnIndex, rowIndex), getSize2D(w, h));
    }

    private static CTMarker createCTMarker(int columnIndex, int rowIndex)
    {
        CTMarker ret = CTMarker.Factory.newInstance();
        ret.setCol(columnIndex);
        ret.setColOff(0);
        ret.setRow(rowIndex);
        ret.setRowOff(0);
        return ret;
    }

    private static CTPositiveSize2D getSize2D(int w, int h)
    {
        CTPositiveSize2D ret = CTPositiveSize2D.Factory.newInstance();
        ret.setCx(w);
        ret.setCy(h);
        return ret;
    }
}

原始代码如下所示:

ClientAnchor anchor = new SizedClientAnchor(sh, 
                                            columnIndex, 
                                            rowIndex, 
                                            imgDim.width * Units.EMU_PER_PIXEL,
                                            imgDim.height * Units.EMU_PER_PIXEL);
 类似资料:
  • 问题内容: 是否有可靠的,独立于框架的方法来确定客户端调整大小的物理尺寸? 问题答案: 您有2个选项: 选项1: 删除和属性,然后读取和 选项2: 创建一个JavaScript 对象,设置,然后读取和(您甚至不必将其添加到页面中即可执行此操作)。 由Pekka编辑 :按照评论中的约定,我更改了功能以在图像的“ onload”事件上运行。否则,大图像,而不会因为在拍摄时尚未加载任何回报。

  • 问题内容: 在Java中,如何将图像的大小调整为任何类型或大小的默认大小? 问题答案: 网上有很多关于如何执行此操作的文章,类似的内容应该可以帮助您: 最终的Java图像处理(包括 许多 其他图像功能)

  • 问题内容: 即时通讯试图在Java的内存中调整bufferdImage的大小,但要保持图像的长宽比,即时通讯有类似这样的内容,但这不好 问题答案: 您可以查看perils-of-image- getscaledinstance.html ,它解释了为什么应避免在某些答案中使用的原因。 本文还提供了替代代码。

  • 问题内容: 我正在尝试使用来使我的图像在某些flexbox容器内响应,并且在调整图像的大小时,布局似乎保持原始图像的大小,从而导致出现滚动条。 使用Chrome开发工具检查图像的宽度后,该宽度仍然为1024(但是高度已适当减小)。 我是否缺少一些其他CSS属性? 问题答案: 您拥有的是合乎逻辑的,您只需要了解其工作原理即可。让我们从一个简单的例子开始: 如您所见,我使用了在框内拉伸的图像,因此破坏

  • 我已经发布了一个与此相关的问题(电子邮件中的HTML嵌入式图像未显示),并更新了我的脚本以包含cid,但现在我的图像是附加的,而不是内联的。我不确定如何在outlook对象中使用内联图像。 然后创建一个outlook对象并将其与附件一起发送。 它是附加的,没有任何问题,但不嵌入内联。有谁能帮上忙吗。 我没有smtp服务器的详细信息,所以我不能使用smtp客户端。所以我试着像下面这样使用这个类Sys

  • 我找到了这条线索-如何拉伸图像以填充 我有一个具有一定大小的div和其中的图像。无论图像是横向还是纵向,我都想始终用图像填充div。图像是否被切断也没关系(div本身隐藏了溢出)。 因此,如果图像是纵向的,我希望宽度是100%,高度是自动的,所以它保持成比例。如果图像是横向的,我希望高度为100%,宽度为自动。听起来很复杂对吧? 因为我不知道怎么做,我只是简单地创建了一个我的意思的快速图像。我甚至