1

POI を使用して xls-document に形状 (具体的には円) を追加する必要があります。だから、私は次のコードを書きました:

private void drawLabel(HSSFSheet sheet, HSSFCell cell) {
    final short columnIndex = (short) cell.getColumnIndex();
    final int rowIndex = cell.getRowIndex();
    HSSFClientAnchor anchor = new HSSFClientAnchor(60, 60, 200, 200, columnIndex, rowIndex, columnIndex, rowIndex);
    anchor.setAnchorType(ClientAnchor.MOVE_DONT_RESIZE);
    HSSFSimpleShape shape = sheet.getDrawingPatriarch().createSimpleShape(anchor);
    shape.setShapeType(HSSFSimpleShape.OBJECT_TYPE_OVAL);
    ...
}

できます。しかし、プログラムで列幅を変更しようとすると (たとえばsheet.setColumnWidth(0, 5 * 256);、列インデックス == 0 のセルに形状が追加されたとします)、円が歪んで楕円のようになります (ただし、アンカーのタイプは に設定されていMOVE_DONT_RESIZEます)。私のアプローチの何が問題なのですか?対応するセルと一緒にサイズが変更されない形状を描画する方法はありますか?

4

1 に答える 1

0

この問題の適切な解決策が見つかりません。しかし、問題を解決する 1 つの方法は、実際のサイズに応じて形状 (具体的にはそのアンカー) をスケーリングすることです。

private void drawLabel(HSSFSheet sheet, HSSFCell cell) {
    final int defaultColumnWidth = 2048; // column width before resizing
    final int defaultRowHeight = 255; // row height before resizing
    final double xDistortionFactor = 1.0 * defaultColumnWidth / sheet.getColumnWidth(cell.getColumnIndex());
    final double yDistortionFactor = 1.0 * defaultRowHeight / cell.getRow().getHeight();

    final int dx1 = (int) (60 * xDistortionFactor);
    final int dy1 = (int) (60 * yDistortionFactor);
    final int dx2 = (int) (200 * xDistortionFactor);
    final int dy2 = (int) (200 * yDistortionFactor);
    final short columnIndex = (short) cell.getColumnIndex();
    final int rowIndex = cell.getRowIndex();
    final HSSFClientAnchor anchor = new HSSFClientAnchor(dx1, dy1, dx2, dy2, columnIndex, rowIndex, columnIndex, rowIndex);
    anchor.setAnchorType(ClientAnchor.MOVE_DONT_RESIZE);

    HSSFSimpleShape shape = sheet.getDrawingPatriarch().createSimpleShape(anchor);
    shape.setShapeType(HSSFSimpleShape.OBJECT_TYPE_OVAL);
    ...
}

このソリューションは優雅ではありませんが、機能します。

于 2012-12-07T13:00:43.607 に答える