亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在 Apache POI 中嵌入 Excel 中的對象時,如何保持預覽圖像的原始大?。?/h1>

從這個關于使用 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方法,但似乎沒有成為一個方式來獲得Picture從實例ObjectData。如果圖像尺寸在其錨定到的單元格內,則以下操作有效: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 回答

?
PIPIONE

TA貢獻1829條經驗 獲得超9個贊

的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);

但是請注意,如果圖像經過的列的字體與“標準”字體(Calibri 或 Arial 11pt)不同,則生成的圖像的寬度將不正確。


尺寸代碼calcCell()在XSSFClientAnchor. 這使用Units.columnWidthToEMU(),而后者又使用Units.charactersToEMU(). 這使用DEFAULT_CHARACTER_WIDTH,記錄為僅適用于默認字體(Calibri 或 Arial)。


解決此問題的方法將涉及重新實現Units.charactersToEMU()和XSSFClientAnchor.calcCell()應用于適用單元格的適用字體。


查看完整回答
反對 回復 2021-06-02
  • 1 回答
  • 0 關注
  • 1014 瀏覽
慕課專欄
更多

添加回答

了解更多

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號