1

我是使用 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);
4

1 回答 1

2

在尝试在 (N)POI 中完成一项任务之前,最好了解如何在 Microsoft Word中完成上述任务。你不能简单地把一个段落分成一行,你要做的是

  1. 在行尾添加制表位
  2. 将其设置为右对齐。
  3. 在左侧输入文本,点击选项卡,在右侧输入文本

不幸的是,目前 XWPFParagraph 似乎没有公开制表符功能。但是,XWPFParagraph 是 CT_P 类的包装器,它将 1:1 映射到基础 Office XML 格式。使用反射,我们可以访问这个私有字段并使用它来直接添加制表位。

示例代码:

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 文档

于 2016-07-02T12:20:11.353 回答