NPOI 2.4.1里XWPFDocument 没有GetParagraphsOnPage方法
时间: 2024-03-20 15:43:27 浏览: 199
是的,您是正确的,对不起给您带来了困扰。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`方法用于计算指定段落所在页码。
阅读全文