首页 文章

NPOI XWPF如何将文本放在左右对齐的单行上?

提问于
浏览
0

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

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

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

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

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

    • 在行尾添加制表位

    • 将其设置为右对齐 .

    • 在左侧键入文本,单击选项卡,在右侧键入文本

    不幸的是,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

相关问题