1 回答
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()应用于适用单元格的适用字体。
添加回答
举报