为了账号安全,请及时绑定邮箱和手机立即绑定

通过样式 ID 在 XWPFRun 上设置样式

通过样式 ID 在 XWPFRun 上设置样式

守候你守候我 2021-12-10 14:53:45
我正在尝试将命名样式应用于 XWPFDocument 中的单个运行,但我看到了奇怪的结果。XWPFRun的javadoc 描述了 setStyle 方法,但该样式似乎未应用于最终文档。我说会出现,因为在 Finder 的 QuickLook 预览中,样式确实会按预期出现在运行中。在下面的示例中,我将命名样式应用于超链接,它在右侧的预览中按预期显示,但在左侧的 Word 中没有显示。很明显 POI 实际上是在做一些事情来应用样式,但 Word 没有渲染样式。我尝试了其他几个 .docx 阅读器,所有这些都产生了类似的结果。所以我开始剥离样式并将属性单独应用到运行中,这在 Word中确实有效。这是其中一件似乎我必须错过的事情。我当然可以编写一个可以读取现有样式的例程并将其应用于这样的运行,但我宁愿不这样做。我已经搜索了答案,但这部分 POI 似乎正在进行中。那么我是否只是遗漏了一些明显的东西,或者我只是不得不接受它并以痛苦的方式做到这一点?//This does not work.run.setStyle(styleId);if(docStyles.styleExist(styleId)){    /*        In order to set the style on the run, we need to manually        determine the properties of the style, and set them on the        run individually.        This makes no sense.     */    XWPFStyle style = docStyles.getStyle(styleId);    CTStyle ctStyle = style.getCTStyle();    CTRPr ctRpr = ctStyle.getRPr();    if (ctRpr.isSetB())    {        CTOnOff onOff = ctRpr.getB();        STOnOff.Enum stOnOff = onOff.getVal();        boolean bold = (stOnOff == STOnOff.TRUE);        run.setBold(bold);    }    if(ctRpr.isSetU())    {        CTUnderline underline = ctRpr.getU();        STUnderline.Enum val = underline.getVal();        UnderlinePatterns underlinePattern = UnderlinePatterns.valueOf(val.intValue());        run.setUnderline(underlinePattern);    }    // ... //}else{    System.out.println("404: Style not found");}
查看完整描述

1 回答

?
摇曳的蔷薇

TA贡献1793条经验 获得超6个赞

如果XWPfDocument是从模板创建的,则该模板必须已经包含命名样式“超链接”。这意味着,它必须包含/word/styles.xml在潜在样式的条目中


...

<w:latentStyles...

...

 <w:lsdException w:name="Hyperlink" w:qFormat="1"/>

...

以及样式定义


...

<w:style w:type="character" w:styleId="Hyperlink">

 <w:name w:val="Hyperlink"/>

 <w:basedOn w:val="..."/>

 <w:uiPriority w:val="99"/>

 <w:unhideWhenUsed/>

 <w:qFormat/>

 <w:rsid w:val="00072FE4"/>

 <w:rPr>

  <w:color w:val="0000FF" w:themeColor="hyperlink"/>

  <w:u w:val="single"/>

 </w:rPr>

</w:style>

...

如果这是真的,那么以下代码适用于我使用apache poi 4.0.0:


import java.io.FileInputStream;

import java.io.FileOutputStream;


import org.apache.poi.xwpf.usermodel.*;


import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTHyperlink;


public class CreateWordStyledHyperlinkRunFromTemplate {


 static XWPFHyperlinkRun createHyperlinkRun(XWPFParagraph paragraph, String uri) throws Exception {

  String rId = paragraph.getPart().getPackagePart().addExternalRelationship(

    uri, 

    XWPFRelation.HYPERLINK.getRelation()

   ).getId();


  CTHyperlink cthyperLink=paragraph.getCTP().addNewHyperlink();

  cthyperLink.setId(rId);

  cthyperLink.addNewR();


  return new XWPFHyperlinkRun(

    cthyperLink,

    cthyperLink.getRArray(0),

    paragraph

   );

 }


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


  XWPFDocument document = new XWPFDocument(new FileInputStream("Template.docx"));


  XWPFParagraph paragraph = document.createParagraph();

  XWPFRun run = paragraph.createRun();

  run.setText("This is a text paragraph having a link to Google ");


  XWPFHyperlinkRun hyperlinkrun = createHyperlinkRun(paragraph, "https://www.google.de");

  hyperlinkrun.setText("https://www.google.de");

  XWPFStyles styles = document.getStyles();

  if (styles.styleExist("Hyperlink")) {

   System.out.println("Style Hyperlink exists."); //Template must contain named style "Hyperlink" already

   hyperlinkrun.setStyle("Hyperlink");

  } else {

   hyperlinkrun.setColor("0000FF");

   hyperlinkrun.setUnderline(UnderlinePatterns.SINGLE);

  }


  run = paragraph.createRun();

  run.setText(" in it.");


  FileOutputStream out = new FileOutputStream("CreateWordStyledHyperlinkRunFromTemplate.docx");

  document.write(out);

  out.close();

  document.close();


 }

}

请注意,除了使用低级类之外,不可能创建XWPFHyperlinkRunorg.openxmlformats.schemas.wordprocessingml.x2006.main.CTHyperlink。


它产生:

查看完整回答
反对 回复 2021-12-10
  • 1 回答
  • 0 关注
  • 980 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号