Если вы создадите фигуру по умолчанию 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();
}
}