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 クラスのラッパーであり、基になる Office XML 形式に 1:1 でマップされます。リフレクションを使用して、このプライベート フィールドにアクセスし、それを使用してタブストップを直接追加できます。

サンプルコード:

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 に答える