NPOI Word 换行 【XWPFDocument】

用NPOI创建Work文档的时候需要用到XWPFDocument对象,我们初学的时候有时候会遇到这个问题,如何在文段中加入换行符?

这里有2中方法,第一种方法就是用XWPFParagraph对象,在需要换行的地方创建新的XWPFParagraph对象。第二种方法就是用XWPFRun.AddCarriageReturn()方法,这个方法直接在文段中插入换行符。

注意:XWPFRun.AddBreak() 方法是在文中插入“分页符”

XWPFDocument m_Docx = new XWPFDocument();//创建word文档

FileStream gfs = null;
string ps = @"ProbabilityChart207_I_VDD_LS1_VDD.Bmp";
gfs = new FileStream(ps, FileMode.Open, FileAccess.Read);
CT_P m_p = m_Docx.Document.body.AddNewP();

XWPFParagraph p1 = m_Docx.CreateParagraph();
p1.Alignment = ParagraphAlignment.LEFT;

//First line of text
XWPFRun r1 = p1.CreateRun();
r1.SetText("ProbabilityChart207_I_VDD_LS1_VDD.Bmp");

//picture
r1 = p1.CreateRun();
r1.AddPicture(gfs, (int)NPOI.XWPF.UserModel.PictureType.BMP, "aa", 6000000, 5000000);
gfs.Close();

r1 = p1.CreateRun();
r1.SetText("this is first  ");
//插入4个换行符
r1.AddCarriageReturn(); 
r1.AddCarriageReturn(); 
r1.AddCarriageReturn(); 
r1.AddCarriageReturn();

//2nd line of text
r1 = p1.CreateRun();
//r1.AddBreak(); //插入换页符
r1.SetText("hallloeldla lfeoaelkf ");

//保存文件到磁盘WinForm  
string docPath = Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, "DocxWord");
if (!Directory.Exists(docPath)) { Directory.CreateDirectory(docPath); }
string fileName = "TestEmbededPicture.docx";
FileStream out1 = new FileStream(Path.Combine(docPath, fileName), FileMode.Create);
m_Docx.Write(out1);
out1.Close();

 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
是的,您是正确的,对不起给您带来了困扰。NPOI 2.4.1版本的`XWPFDocument`类没有提供`GetParagraphsOnPage`方法。以下是另一种实现方式,可以获取指定页码的段落列表: ```csharp using NPOI.XWPF.UserModel; using NPOI.OpenXmlFormats.Wordprocessing; using System.Collections.Generic; using System.IO; using System.Linq; public class WordHelper { public static List<XWPFParagraph> GetParagraphsOnPage(XWPFDocument doc, int pageNumber) { List<XWPFParagraph> result = new List<XWPFParagraph>(); // 遍历文档中的所有段落,判断它们所在页码是否等于指定页码 int pageIndex = 1; foreach (var para in doc.Paragraphs) { if (IsParagraphOnPage(para, pageIndex, pageNumber)) { result.Add(para); } // 如果当前段落是分页符,则页码加1 if (para.IsPageBreak) { pageIndex++; } } return result; } private static bool IsParagraphOnPage(XWPFParagraph para, int pageIndex, int targetPageIndex) { // 如果段落所在页码等于目标页码,则返回true if (GetParagraphPageIndex(para, pageIndex) == targetPageIndex) { return true; } // 如果段落所在页码大于目标页码,则返回false if (GetParagraphPageIndex(para, pageIndex) > targetPageIndex) { return false; } // 如果当前段落是最后一个段落,则返回false if (para == para.Document.Paragraphs.LastOrDefault()) { return false; } // 如果当前段落和下一个段落跨页,则返回false if (GetParagraphPageIndex(para, pageIndex) != GetParagraphPageIndex(para.Document.Paragraphs[para.Document.Paragraphs.IndexOf(para) + 1], pageIndex)) { return false; } // 否则递归判断下一个段落 return IsParagraphOnPage(para.Document.Paragraphs[para.Document.Paragraphs.IndexOf(para) + 1], pageIndex, targetPageIndex); } private static int GetParagraphPageIndex(XWPFParagraph para, int startPageIndex) { // 计算指定段落所在页码 int pageIndex = startPageIndex; foreach (var run in para.Runs) { if (run is XWPFRun) { CT_R ctRun = (CT_R)run.GetCTR().Clone(); if (ctRun.Items != null && ctRun.Items.Any(i => i is CT_PageNumber)) { int pageNumber = int.Parse(ctRun.Items.First(i => i is CT_PageNumber).InnerText); if (pageNumber > pageIndex) { pageIndex = pageNumber; } } } } return pageIndex; } } // 使用示例 XWPFDocument doc = new XWPFDocument(new FileStream("your_word_file.docx", FileMode.Open)); List<XWPFParagraph> pageParagraphs = WordHelper.GetParagraphsOnPage(doc, 2); List<XWPFParagraph> copiedParagraphs = new List<XWPFParagraph>(); foreach (XWPFParagraph para in pageParagraphs) { copiedParagraphs.Add(para); } XWPFParagraph lastPara = doc.GetParagraphArray(doc.Paragraphs.Count - 1); foreach (XWPFParagraph para in copiedParagraphs) { // ... } doc.Write(new FileStream("your_modified_word_file.docx", FileMode.Create)); ``` 以上代码通过遍历文档中的所有段落,并逐个判断段落所在页码是否等于指定页码,从而获取指定页码的段落列表。如果一个段落跨多页,需要对该段落进行递归判断。其中,`GetParagraphPageIndex`方法用于计算指定段落所在页码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值