Как изменить угол для формы CHEVRON - PullRequest
0 голосов
/ 15 января 2019

Я пытаюсь нарисовать форму шеврона, используя Apache POI. Я хочу изменить угол стрелки в конце, чтобы я мог получить больше места для текстовой области. В настоящее время угол составляет почти 45 градусов. В документации API я не нашел ничего, что могло бы помочь мне изменить угол наклона стрелки.

ClientAnchor anchor = this.createClientAnchor(helper, x, y,a, b);
XSSFSimpleShape shape = ((XSSFDrawing) drawing).createSimpleShape((XSSFClientAnchor) anchor);
shape.setShapeType(ShapeTypes.CHEVRON);
shape.setLineWidth(1.5);
shape.setLineStyle(0);

1 Ответ

0 голосов
/ 15 января 2019

Если вы создадите фигуру по умолчанию ShapeTypes.CHEVRON и посмотрите на это в Excel, вы увидите ручку для установки угла стрелки. Управляйте им, а затем сохраните файл, а затем просто разархивируйте файл *.xlsx и посмотрите на /xl/drawings/drawing1.xml. Там вы найдете

...
<a:prstGeom prst="chevron">
 <a:avLst>
  <a:gd name="adj" fmla="val 160000"/>
 </a:avLst>
</a:prstGeom>
...

Итак, нам нужен AvLst, который является CTGeomGuideList, и тогда мы можем манипулировать дескриптором (adj) программным путем.

Единственное, что мы должны знать дополнительно - это возможные значения для val. Некоторые настройки теста позволяют понять, что 0 - это ручка регулировки, смещенная максимально вправо, что приведет к прямоугольной форме. Положение, где ручка регулировки смещена максимально влево, составляет 100,000 * cx / cy * 1, где cx - ширина, а cy - высота фигуры. Все остальные настройки ручек находятся между. Так что 100,000 * cx / cy * 0.5 будет иметь ручку регулировки, смещенную к середине.

Пример:

import java.io.FileOutputStream;

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.*;

public class CreateExcelShapes {

 public static void main(String[] args) throws Exception {

  Workbook wb = new XSSFWorkbook();
  Sheet sheet = wb.createSheet();

  XSSFDrawing drawing = (XSSFDrawing)sheet.createDrawingPatriarch();
  XSSFClientAnchor anchor;
  XSSFSimpleShape shape;
  long cx;
  long cy;
  long adjustPos;

  //default chevron
  anchor = drawing.createAnchor(0, 0, 0, 0, 2, 2, 4, 6);
  shape = drawing.createSimpleShape(anchor);
  shape.setShapeType(ShapeTypes.CHEVRON);
  shape.getCTShape().getNvSpPr().getCNvPr().setId(0);
  shape.getCTShape().getNvSpPr().getCNvPr().setName("CHEVRON 1");
  shape.setLineWidth(1.5);
  shape.setLineStyle(0);
  shape.setLineStyleColor(0,0,0);

  //chevron having adjust handle shifted maximum to left (100%) - 0 == adjust handle shifted maximum to right == rectangle
  anchor = drawing.createAnchor(0, 0, 0, 0, 2, 8, 5, 12);
  shape = drawing.createSimpleShape(anchor);
  shape.setShapeType(ShapeTypes.CHEVRON);
  shape.getCTShape().getNvSpPr().getCNvPr().setId(2);
  shape.getCTShape().getNvSpPr().getCNvPr().setName("CHEVRON 2");
  shape.setLineWidth(1.5);
  shape.setLineStyle(0);
  shape.setLineStyleColor(0,0,0);
  cx = Math.round(shape.getCTShape().getSpPr().getXfrm().getExt().getCx() * 1.142857143); //apache poi is not calculating cx properly, we are correcting it by factor 1.142857143
  cy = shape.getCTShape().getSpPr().getXfrm().getExt().getCy();
  adjustPos = Math.round(100000.0 * cx/cy * 1); //adjustment position 100%
  shape.getCTShape().getSpPr().getPrstGeom().getAvLst().addNewGd().setName("adj"); //adjustment
  shape.getCTShape().getSpPr().getPrstGeom().getAvLst().getGdArray(0).setFmla("val " + adjustPos); //adjustment position

  //chevron having adjust handle shifted to middle (50%)
  anchor = drawing.createAnchor(0, 0, 0, 0, 2, 14, 6, 18);
  shape = drawing.createSimpleShape(anchor);
  shape.setShapeType(ShapeTypes.CHEVRON);
  shape.getCTShape().getNvSpPr().getCNvPr().setId(4);
  shape.getCTShape().getNvSpPr().getCNvPr().setName("CHEVRON 3");
  shape.setLineWidth(1.5);
  shape.setLineStyle(0);
  shape.setLineStyleColor(0,0,0);
  cx = Math.round(shape.getCTShape().getSpPr().getXfrm().getExt().getCx() * 1.142857143);
  cy = shape.getCTShape().getSpPr().getXfrm().getExt().getCy();
  adjustPos = Math.round(100000.0 * cx/cy * 0.5); //adjustment position 50%
  shape.getCTShape().getSpPr().getPrstGeom().getAvLst().addNewGd().setName("adj"); //adjustment
  shape.getCTShape().getSpPr().getPrstGeom().getAvLst().getGdArray(0).setFmla("val " + adjustPos); //adjustment position

  wb.write(new FileOutputStream("CreateExcelShapes.xlsx"));
  wb.close();

 }

}
...