Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何通过Apache POI将文本大纲添加到Powerpoint中的文本:_Java_Scala_Apache Poi_Powerpoint_Scala Placeholder Syntax - Fatal编程技术网

Java 如何通过Apache POI将文本大纲添加到Powerpoint中的文本:

Java 如何通过Apache POI将文本大纲添加到Powerpoint中的文本:,java,scala,apache-poi,powerpoint,scala-placeholder-syntax,Java,Scala,Apache Poi,Powerpoint,Scala Placeholder Syntax,有人知道如何使用ApachePOI在powerpoint模板(ppxt)中向文本(文本大纲)添加大纲吗?到目前为止,我收集的信息是,xsltextrun类没有一个方法来获取/设置给定run元素的文本大纲 因此,我只能保留以下字体/文本样式: def fontStyles(textBox: XSLFTextBox, textRun: XSLFTextRun): Unit = { val fontFamily = textRun.getFontFamily val fontColor

有人知道如何使用ApachePOI在powerpoint模板(ppxt)中向文本(文本大纲)添加大纲吗?到目前为止,我收集的信息是,xsltextrun类没有一个方法来
获取/设置给定run元素的文本大纲

因此,我只能保留以下字体/文本样式:

def fontStyles(textBox: XSLFTextBox, textRun: XSLFTextRun): Unit = {
    val fontFamily = textRun.getFontFamily
    val fontColor = textRun.getFontColor
    val fontSize = textRun.getFontSize
    val fontBold = textRun.isBold
    val fontItalic = textRun.isItalic
    val textAlign = textRun.getParagraph.getTextAlign

    textBox.getTextParagraphs.foreach { p =>
      p.getTextRuns.foreach { tr =>
        tr.setFontFamily(fontFamily)
        tr.setFontColor(fontColor)
        tr.setFontSize(fontSize)
        tr.setBold(fontBold)
        tr.setItalic(fontItalic)
        tr.getParagraph.setTextAlign(textAlign)
      }
    }
  }
可以添加文本大纲吗


任何帮助/建议都将不胜感激。

apachepoi
使用底层
ooxml模式
类。这些是从Office Open XML标准中自动生成的。因此,它们比高级的
XSLF
类更完整。当然,它们不太方便

因此,如果没有在高级
XSLF
类中实现,我们可以获得底层
CT
类,并使用它们来实现。在
XSLFTextRun
的情况下,我们可以获得
CTRegularTextRun
对象。然后我们可以查看是否已经存在运行属性。如果没有,我们添加一个。然后我们看看是否已经设置了大纲。如果是这样,我们将其取消设置,因为我们希望将其设置为新的。然后我们制定了一个新的大纲。这只是一条具有特殊颜色的线。该行由
CTLineProperties
对象表示。因此,我们需要有方法来创建
CTLineProperties
,将
CTLineProperties
设置为
xsltextrun
并从
xsltextrun
获取
CTLineProperties

使用
Java
code完成示例:

import java.io.FileOutputStream;
import java.io.FileInputStream;

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

import java.awt.Rectangle;

public class PPTXTextRunOutline {
    
 static org.openxmlformats.schemas.drawingml.x2006.main.CTLineProperties createSolidFillLineProperties(java.awt.Color color) {
  // create new CTLineProperties
  org.openxmlformats.schemas.drawingml.x2006.main.CTLineProperties lineProperties 
   = org.openxmlformats.schemas.drawingml.x2006.main.CTLineProperties.Factory.newInstance();
  // set line solid fill color
  lineProperties.addNewSolidFill().addNewSrgbClr().setVal(new byte[]{(byte)color.getRed(), (byte)color.getGreen(), (byte)color.getBlue()});
  return lineProperties;
 }
    
 static void setOutline(XSLFTextRun run, org.openxmlformats.schemas.drawingml.x2006.main.CTLineProperties lineProperties) {
  // get underlying CTRegularTextRun object
  org.openxmlformats.schemas.drawingml.x2006.main.CTRegularTextRun ctRegularTextRun 
   = (org.openxmlformats.schemas.drawingml.x2006.main.CTRegularTextRun)run.getXmlObject();
  // Are there run properties already? If not, add one.
  if (ctRegularTextRun.getRPr() == null) ctRegularTextRun.addNewRPr();
  // Is there outline set already? If so, unset it, because we are creating it new.
  if (ctRegularTextRun.getRPr().isSetLn()) ctRegularTextRun.getRPr().unsetLn();
  // set a new outline
  ctRegularTextRun.getRPr().setLn(lineProperties);  
 }
 
  static org.openxmlformats.schemas.drawingml.x2006.main.CTLineProperties getOutline(XSLFTextRun run) {
  // get underlying CTRegularTextRun object
  org.openxmlformats.schemas.drawingml.x2006.main.CTRegularTextRun ctRegularTextRun 
   = (org.openxmlformats.schemas.drawingml.x2006.main.CTRegularTextRun)run.getXmlObject();
  // Are there run properties already? If not, return null.
  if (ctRegularTextRun.getRPr() == null) return null;
  // get outline, may be null
  org.openxmlformats.schemas.drawingml.x2006.main.CTLineProperties lineProperties = ctRegularTextRun.getRPr().getLn();
  // make a copy to avoid orphaned exceptions or value disconnected exception when set to its own XML parent
  if (lineProperties != null) lineProperties = (org.openxmlformats.schemas.drawingml.x2006.main.CTLineProperties)lineProperties.copy();
  return lineProperties;
 }

 // your method fontStyles taken to Java code
 static void fontStyles(XSLFTextRun templateRun, XSLFTextShape textShape) {
  String fontFamily = templateRun.getFontFamily();
  PaintStyle fontColor = templateRun.getFontColor();
  Double fontSize = templateRun.getFontSize();
  boolean fontBold = templateRun.isBold();
  boolean fontItalic = templateRun.isItalic();
  TextParagraph.TextAlign textAlign = templateRun.getParagraph().getTextAlign();
  org.openxmlformats.schemas.drawingml.x2006.main.CTLineProperties lineProperties = getOutline(templateRun);
  for (XSLFTextParagraph paragraph : textShape.getTextParagraphs()) {
   for (XSLFTextRun run : paragraph.getTextRuns()) {
    run.setFontFamily(fontFamily);
    if(run != templateRun) run.setFontColor(fontColor); // set PaintStyle has the issue which I am avoiding by using a copy of the underlying XML
    run.setFontSize(fontSize);
    run.setBold(fontBold);
    run.setItalic(fontItalic);
    run.getParagraph().setTextAlign(textAlign);
       
    setOutline(run, lineProperties);
   }
  }   
 }

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

  XMLSlideShow slideShow = new XMLSlideShow(new FileInputStream("./PPTXIn.pptx"));

  XSLFSlide slide = slideShow.getSlides().get(0);
  
  //as in your code, get a template text run and set its font style to all other runs in text shape
  if (slide.getShapes().size() > 0) {
   XSLFShape shape = slide.getShapes().get(0); 
   if (shape instanceof XSLFTextShape) {
    XSLFTextShape textShape = (XSLFTextShape) shape;
    XSLFTextParagraph paragraph = null;
    if(textShape.getTextParagraphs().size() > 0) paragraph = textShape.getTextParagraphs().get(0);
    if (paragraph != null) {
     XSLFTextRun run = null;
     if(paragraph.getTextRuns().size() > 0) run = paragraph.getTextRuns().get(0);
     if (run != null) {
      fontStyles(run, textShape);  
     }
    }        
   }
  }

  //new text box having outlined text from scratch
  XSLFTextBox textbox = slide.createTextBox(); 
  textbox.setAnchor(new Rectangle(100, 300, 570, 80));
  XSLFTextParagraph paragraph = null;
  if(textbox.getTextParagraphs().size() > 0) paragraph = textbox.getTextParagraphs().get(0);
  if(paragraph == null) paragraph = textbox.addNewTextParagraph(); 
  XSLFTextRun run = paragraph.addNewTextRun();
  run.setText("Test text outline");
  run.setFontSize(60d);
  run.setFontColor(java.awt.Color.YELLOW);
  setOutline(run, createSolidFillLineProperties(java.awt.Color.BLUE));
  
  FileOutputStream out = new FileOutputStream("./PPTXOit.pptx");
  slideShow.write(out);
  out.close();
 }
}

使用当前的
ApachePOI5.0.0测试并运行

使用
Java
代码的解决方案是否有帮助?我没有使用Scala
@AxelRichter,是的,当然。我想这会给你一个如何继续下去的想法。谢谢@AxelRitcher的详细解释。