当前位置: 首页 > 知识库问答 >
问题:

在阿帕奇·波伊Ppt形状中设置线条连接样式

赖运珧
2023-03-14

我在Apache Poi < code > XSLFFreeformShape 中有一条多段线。

默认情况下,拐角连接样式显示为圆形。

如何设置为斜面或斜面?

我在超类<code>XSLFSimpleShape</code>支持的笔划样式方法中找不到连接样式。

编辑

这是我对其他行属性所做的:

private void applyLineState( @Nonnull XSLFFreeformShape shape) {
    shape.setLineWidth( ...);
    shape.setLineDash( ... );
    shape.setLineColor( ... );
    shape.setLineHeadDecoration(DecorationShape.NONE);
    shape.setLineCap(LineCap.FLAT);

    // Q: How to set join style for corners?
}

共有1个答案

司空俊雅
2023-03-14

似乎直到现在,<code>apachepoi</code>还没有提供任何行连接属性的设置。但我们可以看看XSLFSimpleShape的源代码,了解如何设置其他CTLineProperties。然后使用低级<code>org.openxmlformats.schemas.drawingml.x2006.main对所需的方法进行编程*类。

以下完整示例显示了这一点:

import java.io.FileOutputStream;

import org.apache.poi.xslf.usermodel.*;
import org.apache.poi.sl.usermodel.*;

import org.apache.xmlbeans.XmlObject;
import org.openxmlformats.schemas.drawingml.x2006.main.*;
import org.openxmlformats.schemas.presentationml.x2006.main.CTShape;

import java.awt.Rectangle;
import java.awt.geom.Path2D;

public class CreatePPTXFreeformShapeFromPath {
    
 private static CTLineProperties getLn(XSLFShape shape) {
  XmlObject o = shape.getXmlObject();
  if (!(o instanceof CTShape)) return null; 
  CTShape sp = (CTShape)o;
  CTShapeProperties spr = sp.getSpPr();
  if (spr == null) return null;
  return (spr.isSetLn()) ? spr.getLn() : spr.addNewLn();
 }
 
 private enum LineJoinProperty {
  ROUND, MITER, BEVEL
 }
 
 public static void setLineJoinProperty(XSLFSimpleShape shape, LineJoinProperty property) {
  CTLineProperties ln = getLn(shape);
  if (ln == null) return;
  if (ln.isSetBevel()) ln.unsetBevel();
  if (ln.isSetMiter()) ln.unsetMiter();
  if (ln.isSetRound()) ln.unsetRound();
  if (property == LineJoinProperty.BEVEL) {
   CTLineJoinBevel bevel = ln.addNewBevel();
  } else if (property == LineJoinProperty.MITER) { 
   CTLineJoinMiterProperties miter = ln.addNewMiter();
  } else if (property == LineJoinProperty.ROUND) { 
   CTLineJoinRound round = ln.addNewRound();
  }
 }

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

  XMLSlideShow slideShow = new XMLSlideShow();
  XSLFSlide slide = slideShow.createSlide();

  Path2D.Double path2D = new Path2D.Double();
  path2D.moveTo(0d,0d);
  path2D.lineTo(20d,0d);
  path2D.lineTo(20d,20d);
  path2D.lineTo(40d,20d);
  path2D.lineTo(40d,40d);
  path2D.lineTo(60d,40d);
  path2D.lineTo(60d,60d);
  path2D.lineTo(80d,60d);
  path2D.lineTo(80d,80d);
  path2D.lineTo(100d,80d);
  path2D.lineTo(100d,100d);
  path2D.closePath();

  XSLFFreeformShape shape;
  
  //default
  shape = slide.createFreeform();
  shape.setPath(path2D);
  shape.setLineWidth(5.0);
  shape.setLineColor(java.awt.Color.BLACK);
  shape.setAnchor(new Rectangle(50, 100, 300, 300));

  //miter
  shape = slide.createFreeform();
  shape.setPath(path2D);
  shape.setLineWidth(5.0);
  shape.setLineColor(java.awt.Color.BLACK);
  shape.setAnchor(new Rectangle(200, 100, 300, 300));
  setLineJoinProperty(shape, LineJoinProperty.MITER);

  //bevel
  shape = slide.createFreeform();
  shape.setPath(path2D);
  shape.setLineWidth(5.0);
  shape.setLineColor(java.awt.Color.BLACK);
  shape.setAnchor(new Rectangle(350, 100, 300, 300));
  setLineJoinProperty(shape, LineJoinProperty.BEVEL);
  
  FileOutputStream out = new FileOutputStream("CreatePPTXFreeformShapeFromPath.pptx");
  slideShow.write(out);
  out.close();
 }
}

这是使用 apache poi 4.1.2ooxml-schema-1.4.jar进行测试的。请注意,此示例需要 ooxml-模式-1.4.jar因为 poi-ooxml-模式-4.1.2.jar只包含 apache poi 4.1.2 直接使用的组织.

 类似资料:
  • 我使用的是Apace POI 3.12操作系统:Mac操作系统

  • 当我想部署我的项目时,我对tomcat有一个问题。构建步骤工作正常,但在部署期间,它给我以下错误: 我导入了apachepoi需要的所有库。以下是我在buildpath中的库: commons-csv-1.5。罐子 希望你能帮我

  • Apache Kafka:分布式消息传递系统 Apache Storm:实时消息处理 我们如何在实时数据管道中使用这两种技术来处理事件数据? 在实时数据管道方面,我觉得两者做的工作是一样的。如何在数据管道上同时使用这两种技术?

  • 我正在使用Flink从Apache Pulsar读取数据。我在pulsar中有一个分区主题,有8个分区。在本主题中,我生成了1000条消息,分布在8个分区中。我的笔记本电脑中有8个内核,因此我有8个子任务(默认情况下,并行度=#个内核)。在执行Eclipse中的代码后,我打开了Flink UI,发现一些子任务没有收到任何记录(空闲)。我希望所有8个子任务都能得到利用(我希望每个子任务都映射到我的主

  • 我们需要的是直接的API来设置和使用集群消息队列。我们最初的计划是使用Camel在集群JMS或ActiveMQ队列上进行消费/生产。Kafka如何使这项任务变得更容易?在任何一种情况下,应用程序本身都将在WebLogic服务器上运行。 消息传递将是点对点类型,其中有多个相同服务的实例在运行,但根据负载平衡策略,只有一个实例应该处理消息并发出结果。消息队列也是群集的,因此服务实例或队列实例的失败都不