【问题标题】:Apache poi XWPF Paragraph line spacingApache poi XWPF 段落行距
【发布时间】:2014-07-02 20:55:44
【问题描述】:

我正在考虑尝试在 Java/Coldfusion 中使用 Apache Poi 构建 Word 文档。到目前为止,它让我可以做很多我想要的格式,除了段落的行距。有谁知道我将如何将段落设置为单行间距?它不断构建具有多个间距段落的文档,间距为 1.15。

下面是代码示例:

document = loader.create("org.apache.poi.xwpf.usermodel.XWPFDocument");
ParagraphAlignment = loader.create("org.apache.poi.xwpf.usermodel.ParagraphAlignment" );
paragraphOne = document.createParagraph();
paragraphOne.setAlignment(ParagraphAlignment.CENTER);

paragraphOneRunOne = paragraphVar.createRun();
paragraphOneRunOne.setFontFamily('Cambria');
paragraphOneRunOne.setFontSize(12);
paragraphOneRunOne.setBold(false);
paragraphOneRunOne.setText(Here's one line of text in this paragraph);
paragraphOneRunOne.addBreak();

paragraphOneRunTwo = paragraphVar.createRun();
paragraphOneRunTwo.setFontFamily('Cambria');
paragraphOneRunTwo.setFontSize(12);
paragraphOneRunTwo.setBold(false);
paragraphOneRunTwo.setText(Here's a second line of text in this paragraph);
paragraphOneRunTwo.addBreak();

我查看了示例和 api 文档,我能找到的唯一行距设置决定了段落之前或之后的行距,而不是段落内的文本行距。

有人遇到过这种情况或有任何解决方法的例子吗?

【问题讨论】:

  • 快速浏览一下 API,您是否尝试过setSpacingLineRule(..)
  • 我对此进行了研究,但 API 不清楚如何使用它来指示文档中的单间距、双间距和多间距。它似乎是一个只有 3 个值 EXACT、AUTO 和 AT_LEAST 的枚举器。
  • 这些是基于options provided in MS Word Single, Double, At least, Exactly, Multiple, ... 看起来POI 只支持其中的一个子集。
  • 这大概就是我所害怕的,我找不到任何其他文档来说明如何创建一个样式来应用到可以做同样事情的段落
  • 所以,从技术上讲,这不是一个修复方法,只是一种解决方法。我发现如果我创建一个空白单词文档,设置段落行间距,保存它并将其用作 WXPFDocument 的起点,我可以将其恢复为单行间距。从技术上讲,这不是一个很好的解决方案,因为您无法在需要时来回切换,但出于我的目的,它可能对我有用。

标签: java apache coldfusion apache-poi


【解决方案1】:

我也遇到了同样的问题,在查看了 ooxml-schemas 源和生成的 docx 文件的内部之后找到了解决方案。这是代码

public void setSingleLineSpacing(XWPFParagraph para) {
    CTPPr ppr = para.getCTP().getPPr();
    if (ppr == null) ppr = para.getCTP().addNewPPr();
    CTSpacing spacing = ppr.isSetSpacing()? ppr.getSpacing() : ppr.addNewSpacing();
    spacing.setAfter(BigInteger.valueOf(0));
    spacing.setBefore(BigInteger.valueOf(0));
    spacing.setLineRule(STLineSpacingRule.AUTO);
    spacing.setLine(BigInteger.valueOf(240));
}

【讨论】:

  • 我怎样才能适应这个?: InputStream doc = new FileInputStream(new File("..\\entradas\\cartas\\87109.docx")); XWPFDocument 文档 = 新 XWPFDocument(doc); PdfOptions 选项 = PdfOptions.create(); OutputStream out = new FileOutputStream(new File("..\\entradas\\cartas\\87109docx.pdf")); PdfConverter.getInstance().convert(document, out, options); System.out.println("完成");
【解决方案2】:

我最近不得不使用POI的行距,我的方法是获取段落并获取ooxml-schema

XWPFParagraph paragraph;
xml = paragraph->getCTP()->ToString();

然后模式将作为字符串存储在该 xml 变量中,您必须使用一些字符串函数从中检索值

<w:spacing w:lineRule='atLeast' w:line='240' />

w:line 就是你需要的那个

希望这会有所帮助!

【讨论】:

    【解决方案3】:
    paragraph.setSpacingBetween(1);
    

    它将创建 1 的行距

    【讨论】:

      【解决方案4】:
      <w:spacing w:lineRule='atLeast' w:line='240' />
      

      修复

      XWPFParagraph p
      p.setSpacingBetween(1);
      CTP ctP = p.getCTP();
      CTPPr ctPr = ctP.isSetPPr() ? ctP.getPPr() : ctP.addNewPPr();
      CTSpacing spacing = ctPr.isSetSpacing() ? ctPr.getSpacing() :     ctPr.addNewSpacing();
      spacing.setLine(BigInteger.valueOf(200));
      spacing.setBefore(BigInteger.valueOf(0));
      spacing.setAfter(BigInteger.valueOf(0));
      spacing.setLineRule(STLineSpacingRule.EXACT);
      p.getCTP().getPPr().setSpacing(spacing);
      

      【讨论】:

      • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-24
      相关资源
      最近更新 更多