NPOI XWPF如何将文本放在左侧和右侧的单行上?对了吗?

时间:2016-03-24 23:57:05

标签: npoi xwpf

我是新手使用NPOI XWPF并试图创建我的第一个文档,到目前为止它还顺利。我留下的唯一问题是尝试将文本放在左右对齐的同一行上,我希望它看起来像:

面积:1(左Jstfd)年级/课程:10年级阅读(右Jstfd)

以下是我正在使用的代码段,它只是将所有文字一起推到页面左侧...... blah

            XWPFParagraph p2 = doc.CreateParagraph();
            p2.Alignment = ParagraphAlignment.LEFT;
            XWPFRun r3 = p2.CreateRun();
            r3.SetBold(true);
            r3.FontFamily = "Times New Roman";
            r3.FontSize = 12;
            r3.SetText("Area: " + ah.schoolArea);
            XWPFRun r4 = p2.CreateRun();
            r4.SetBold(true);
            r4.FontFamily = "Times New Roman";
            r4.FontSize = 12;
            r4.SetText("Grade Level/Course: " + ah.filterParm);

1 个答案:

答案 0 :(得分:1)

在尝试完成(N)POI中的任务之前,了解如何在Microsoft Word本身中完成所述任务总是很好。你不能简单地将一个段落分成一行,你所做的就是

  1. 在该行的末尾添加制表位
  2. 将其设置为右对齐。
  3. 在左侧输入文字,点击标签,在右侧输入文字
  4. 不幸的是,XWPFParagraph似乎没有公开tabstop功能。但是,XWPFParagraph是CT_P类的包装器,它将1:1映射到基础Office XML格式。使用反射,我们可以访问此私有字段并使用它直接添加tabstop。

    示例代码:

    var paragraph = document.CreateParagraph();
    
    var memberInfo = typeof(XWPFParagraph).GetField("paragraph", BindingFlags.NonPublic | BindingFlags.Instance);
    if (memberInfo == null)
    {
      throw new Exception("Could not retrieve CT_P from XWPFParagraph");
    }
    
    var internalParagraph = (CT_P) memberInfo.GetValue(paragraph);
    
    CT_PPr pPr = internalParagraph.AddNewPPr();
    CT_Tabs tabs = pPr.AddNewTabs();
    CT_TabStop tab = tabs.AddNewTab();
    tab.pos = "9000";
    tab.val = ST_TabJc.right;
    
    var run = paragraph.CreateRun();
    run.SetText("Left aligned");
    run.AddTab();
    
    run = paragraph.CreateRun();
    run.SetText("Right aligned");
    

    结果:

    Word document with tab stop and left/right aligned text