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

TA貢獻(xiàn)1829條經(jīng)驗 獲得超9個贊
的XSSFClientAnchor類提供一個構(gòu)造,允許以供應(yīng)左上角單元(作為一個CTPoint2D對象)和對象的大?。ㄒ缘男问紺TPositiveSize2D)。但是,此構(gòu)造函數(shù)是受保護(hù)的。
解決方法是將此類擴(kuò)展為接受左上角單元格坐標(biāo)以及寬度和高度(以 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);
但是請注意,如果圖像經(jīng)過的列的字體與“標(biāo)準(zhǔn)”字體(Calibri 或 Arial 11pt)不同,則生成的圖像的寬度將不正確。
尺寸代碼calcCell()在XSSFClientAnchor. 這使用Units.columnWidthToEMU(),而后者又使用Units.charactersToEMU(). 這使用DEFAULT_CHARACTER_WIDTH,記錄為僅適用于默認(rèn)字體(Calibri 或 Arial)。
解決此問題的方法將涉及重新實現(xiàn)Units.charactersToEMU()和XSSFClientAnchor.calcCell()應(yīng)用于適用單元格的適用字體。
添加回答
舉報