Java 如何通过docx4j将图像插入xlsx

Java 如何通过docx4j将图像插入xlsx,java,excel,docx4j,Java,Excel,Docx4j,我尝试使用docx4j在xlsx文件中插入图像,但是图像的大小只有一个单元格 到目前为止,我的代码是: 以及调用的方法: public static void addBarcode(CTDrawing drawing, BarcodeData data, String imageRelID, int col, int row) { org.docx4j.dml.ObjectFactory dmlObjectFactory = new org.docx4j.dml.ObjectFactor

我尝试使用docx4j在xlsx文件中插入图像,但是图像的大小只有一个单元格

到目前为止,我的代码是: 以及调用的方法:

public static void addBarcode(CTDrawing drawing, BarcodeData data, String imageRelID, int col, int row) {
    org.docx4j.dml.ObjectFactory dmlObjectFactory = new org.docx4j.dml.ObjectFactory();
    org.docx4j.dml.spreadsheetdrawing.ObjectFactory dmlspreadsheetdrawingObjectFactory = new org.docx4j.dml.spreadsheetdrawing.ObjectFactory();
    // <twoCellAnchor>
    CTTwoCellAnchor twoCellAnchor = dmlspreadsheetdrawingObjectFactory.createCTTwoCellAnchor();
    twoCellAnchor.setEditAs(org.docx4j.dml.spreadsheetdrawing.STEditAs.ONE_CELL);
    drawing.getEGAnchor().add(twoCellAnchor);
    // <twoCellAnchor/from>
    CTMarker from = dmlspreadsheetdrawingObjectFactory.createCTMarker();
    twoCellAnchor.setFrom(from);
    from.setCol(col);
    from.setColOff(0);
    from.setRow(row);
    from.setRowOff(0);
    // <twoCellAnchor/to>
    CTMarker to = dmlspreadsheetdrawingObjectFactory.createCTMarker();
    twoCellAnchor.setTo(to);
    to.setCol(col);
    to.setColOff(data.width * 9525);
    to.setRow(row);
    to.setRowOff(data.height * 9525);
    // <twoCellAnchor/pic>
    CTPicture pic = dmlspreadsheetdrawingObjectFactory.createCTPicture();
    twoCellAnchor.setPic(pic);
    pic.setMacro(null);
    // <twoCellAnchor/clientData>
    CTAnchorClientData clientData = dmlspreadsheetdrawingObjectFactory.createCTAnchorClientData();
    twoCellAnchor.setClientData(clientData);
    // <twoCellAnchor/pic/nvPicPr>
    CTPictureNonVisual nvPicPr = dmlspreadsheetdrawingObjectFactory.createCTPictureNonVisual();
    pic.setNvPicPr(nvPicPr);
    // <twoCellAnchor/pic/nvPicPr/cNvPr>
    CTNonVisualDrawingProps cNvPr = dmlObjectFactory.createCTNonVisualDrawingProps();
    nvPicPr.setCNvPr(cNvPr);
    cNvPr.setDescr(null);
    cNvPr.setName("Barcode");
    cNvPr.setId(1);
    // <twoCellAnchor/pic/nvPicPr/cNvPicPr>
    CTNonVisualPictureProperties cNvPicPr = dmlObjectFactory.createCTNonVisualPictureProperties();
    nvPicPr.setCNvPicPr(cNvPicPr);
    // <twoCellAnchor/pic/nvPicPr/cNvPr/picLocks>
    CTPictureLocking picLocks = dmlObjectFactory.createCTPictureLocking();
    cNvPicPr.setPicLocks(picLocks);
    picLocks.setNoChangeAspect(true);
    // <twoCellAnchor/pic/blipFill>
    CTBlipFillProperties blipFill = dmlObjectFactory.createCTBlipFillProperties();
    pic.setBlipFill(blipFill);
    // <twoCellAnchor/pic/blipFill/blip>
    CTBlip blip = dmlObjectFactory.createCTBlip();
    blipFill.setBlip(blip);
    blip.setLink(null);
    blip.setEmbed(imageRelID);
    blip.setCstate(null); // org.docx4j.dml.STBlipCompression.NONE);
    // <twoCellAnchor/pic/blipFill/blip/extLst>
    CTOfficeArtExtensionList extLst = dmlObjectFactory.createCTOfficeArtExtensionList();
    blip.setExtLst(extLst);
    // <twoCellAnchor/pic/blipFill/blip/extLst/ext>
    // CTOfficeArtExtension ext =
    // dmlObjectFactory.createCTOfficeArtExtension();
    // ext.setUri("{28A0092B-C50C-407E-A947-70E740481C1C}");
    // extLst.getExt().add(ext);
    // <twoCellAnchor/pic/blipFill/stretch>
    CTStretchInfoProperties stretch = dmlObjectFactory.createCTStretchInfoProperties();
    blipFill.setStretch(stretch);
    // <twoCellAnchor/pic/blipFill/stretch/fillRect>
    CTRelativeRect fillRect = dmlObjectFactory.createCTRelativeRect();
    stretch.setFillRect(fillRect);
    fillRect.setR(null);
    fillRect.setT(null);
    fillRect.setL(null);
    fillRect.setB(null);
    // <twoCellAnchor/pic/spPr>
    CTShapeProperties spPr = dmlObjectFactory.createCTShapeProperties();
    pic.setSpPr(spPr);
    // <twoCellAnchor/pic/spPr/xfrm>
    CTTransform2D xfrm = dmlObjectFactory.createCTTransform2D();
    spPr.setXfrm(xfrm);
    xfrm.setRot(null); // Rotation 0
    // <twoCellAnchor/pic/spPr/xfrm/off>
    CTPoint2D off = dmlObjectFactory.createCTPoint2D();
    xfrm.setOff(off);
    off.setY(0);
    off.setX(0);
    // <twoCellAnchor/pic/spPr/xfrm/ext>
    CTPositiveSize2D ext = dmlObjectFactory.createCTPositiveSize2D();
    xfrm.setExt(ext);
    ext.setCx(data.width * 9525);
    ext.setCy(data.height * 9525);
    // <twoCellAnchor/pic/spPr/prstGeom>
    CTPresetGeometry2D prstGeom = dmlObjectFactory.createCTPresetGeometry2D();
    spPr.setPrstGeom(prstGeom);
    prstGeom.setPrst(org.docx4j.dml.STShapeType.RECT);
    // <twoCellAnchor/pic/spPr/prstGeom/avLst>
    CTGeomGuideList avLst = dmlObjectFactory.createCTGeomGuideList();
    prstGeom.setAvLst(avLst);
}

我猜您已经使用docx4j webapp从示例xlsx生成了该代码,但是您需要检查xlsx xml以了解图像大小是如何确定的。如果你不能解决这个问题,就发布一个新的问题。这是一个通用的openxml、xlsx问题,而不是docx4j问题。一旦您了解了它是如何完成的,那么您就可以修改这个问题,以解决您在用docx4j表达时遇到的任何问题;导入org.docx4j.openpackaging.io.SaveToZipFile;导入org.docx4j.openpackaging.packages.SpreadsheetMLPackage;导入org.docx4j.openpackaging.parts.*;导入org.docx4j.openpackaging.parts.WordprocessingML.BinaryPartAbstractImage;导入org.docx4j.openpackaging.parts.relationships.RelationshipsPart.addPartBehavior;导入org.docx4j.relationships.Relationship;导入org.xlsx4j.sml.*;----并且使用docx4j而不是openxml
public static void addBarcode(CTDrawing drawing, BarcodeData data, String imageRelID, int col, int row) {
    org.docx4j.dml.ObjectFactory dmlObjectFactory = new org.docx4j.dml.ObjectFactory();
    org.docx4j.dml.spreadsheetdrawing.ObjectFactory dmlspreadsheetdrawingObjectFactory = new org.docx4j.dml.spreadsheetdrawing.ObjectFactory();
    // <twoCellAnchor>
    CTTwoCellAnchor twoCellAnchor = dmlspreadsheetdrawingObjectFactory.createCTTwoCellAnchor();
    twoCellAnchor.setEditAs(org.docx4j.dml.spreadsheetdrawing.STEditAs.ONE_CELL);
    drawing.getEGAnchor().add(twoCellAnchor);
    // <twoCellAnchor/from>
    CTMarker from = dmlspreadsheetdrawingObjectFactory.createCTMarker();
    twoCellAnchor.setFrom(from);
    from.setCol(col);
    from.setColOff(0);
    from.setRow(row);
    from.setRowOff(0);
    // <twoCellAnchor/to>
    CTMarker to = dmlspreadsheetdrawingObjectFactory.createCTMarker();
    twoCellAnchor.setTo(to);
    to.setCol(col);
    to.setColOff(data.width * 9525);
    to.setRow(row);
    to.setRowOff(data.height * 9525);
    // <twoCellAnchor/pic>
    CTPicture pic = dmlspreadsheetdrawingObjectFactory.createCTPicture();
    twoCellAnchor.setPic(pic);
    pic.setMacro(null);
    // <twoCellAnchor/clientData>
    CTAnchorClientData clientData = dmlspreadsheetdrawingObjectFactory.createCTAnchorClientData();
    twoCellAnchor.setClientData(clientData);
    // <twoCellAnchor/pic/nvPicPr>
    CTPictureNonVisual nvPicPr = dmlspreadsheetdrawingObjectFactory.createCTPictureNonVisual();
    pic.setNvPicPr(nvPicPr);
    // <twoCellAnchor/pic/nvPicPr/cNvPr>
    CTNonVisualDrawingProps cNvPr = dmlObjectFactory.createCTNonVisualDrawingProps();
    nvPicPr.setCNvPr(cNvPr);
    cNvPr.setDescr(null);
    cNvPr.setName("Barcode");
    cNvPr.setId(1);
    // <twoCellAnchor/pic/nvPicPr/cNvPicPr>
    CTNonVisualPictureProperties cNvPicPr = dmlObjectFactory.createCTNonVisualPictureProperties();
    nvPicPr.setCNvPicPr(cNvPicPr);
    // <twoCellAnchor/pic/nvPicPr/cNvPr/picLocks>
    CTPictureLocking picLocks = dmlObjectFactory.createCTPictureLocking();
    cNvPicPr.setPicLocks(picLocks);
    picLocks.setNoChangeAspect(true);
    // <twoCellAnchor/pic/blipFill>
    CTBlipFillProperties blipFill = dmlObjectFactory.createCTBlipFillProperties();
    pic.setBlipFill(blipFill);
    // <twoCellAnchor/pic/blipFill/blip>
    CTBlip blip = dmlObjectFactory.createCTBlip();
    blipFill.setBlip(blip);
    blip.setLink(null);
    blip.setEmbed(imageRelID);
    blip.setCstate(null); // org.docx4j.dml.STBlipCompression.NONE);
    // <twoCellAnchor/pic/blipFill/blip/extLst>
    CTOfficeArtExtensionList extLst = dmlObjectFactory.createCTOfficeArtExtensionList();
    blip.setExtLst(extLst);
    // <twoCellAnchor/pic/blipFill/blip/extLst/ext>
    // CTOfficeArtExtension ext =
    // dmlObjectFactory.createCTOfficeArtExtension();
    // ext.setUri("{28A0092B-C50C-407E-A947-70E740481C1C}");
    // extLst.getExt().add(ext);
    // <twoCellAnchor/pic/blipFill/stretch>
    CTStretchInfoProperties stretch = dmlObjectFactory.createCTStretchInfoProperties();
    blipFill.setStretch(stretch);
    // <twoCellAnchor/pic/blipFill/stretch/fillRect>
    CTRelativeRect fillRect = dmlObjectFactory.createCTRelativeRect();
    stretch.setFillRect(fillRect);
    fillRect.setR(null);
    fillRect.setT(null);
    fillRect.setL(null);
    fillRect.setB(null);
    // <twoCellAnchor/pic/spPr>
    CTShapeProperties spPr = dmlObjectFactory.createCTShapeProperties();
    pic.setSpPr(spPr);
    // <twoCellAnchor/pic/spPr/xfrm>
    CTTransform2D xfrm = dmlObjectFactory.createCTTransform2D();
    spPr.setXfrm(xfrm);
    xfrm.setRot(null); // Rotation 0
    // <twoCellAnchor/pic/spPr/xfrm/off>
    CTPoint2D off = dmlObjectFactory.createCTPoint2D();
    xfrm.setOff(off);
    off.setY(0);
    off.setX(0);
    // <twoCellAnchor/pic/spPr/xfrm/ext>
    CTPositiveSize2D ext = dmlObjectFactory.createCTPositiveSize2D();
    xfrm.setExt(ext);
    ext.setCx(data.width * 9525);
    ext.setCy(data.height * 9525);
    // <twoCellAnchor/pic/spPr/prstGeom>
    CTPresetGeometry2D prstGeom = dmlObjectFactory.createCTPresetGeometry2D();
    spPr.setPrstGeom(prstGeom);
    prstGeom.setPrst(org.docx4j.dml.STShapeType.RECT);
    // <twoCellAnchor/pic/spPr/prstGeom/avLst>
    CTGeomGuideList avLst = dmlObjectFactory.createCTGeomGuideList();
    prstGeom.setAvLst(avLst);
}