使用OpenXML SDK实现按页读取内容:
以下内容采用WPF+RichTextBox+FlowDocment展示,测试文档共3页内容,图中展示的是获取第一页内容,效果图后附上代码;效果图如下:
1 /// <summary> 2 /// 按页加载Word 3 /// </summary> 4 /// <param name="flowDoc"></param> 5 /// <param name="filename"></param> 6 /// <param name="page"></param> 7 public static void loadWordML(this FlowDocument flowDoc, string filename,int page) 8 { 9 XElement wordDoc = null; 10 try 11 { 12 Package package = Package.Open(filename); 13 Uri documentUri = new Uri("/word/document.xml", UriKind.Relative); 14 PackagePart documentPart = package.GetPart(documentUri); 15 wordDoc = XElement.Load(new StreamReader(documentPart.GetStream())); 16 } 17 catch (Exception) 18 { 19 flowDoc.Blocks.Add(new System.Windows.Documents.Paragraph(new System.Windows.Documents.Run("File not found or not in correct format (Word 2007)"))); 20 return; 21 } 22 23 XNamespace w = "http://schemas.openxmlformats.org/wordprocessingml/2006/main"; 24 25 var paragraphs = from p in wordDoc.Descendants(w + "p") 26 select p; 27 int pagecount=0; 28 foreach (var p in paragraphs) 29 { 30 var PageTag = from s in p.Descendants(w + "lastRenderedPageBreak") select s; 31 if (PageTag.Count()>0) 32 { 33 pagecount++; 34 if (pagecount == page) 35 { 36 break; 37 } 38 } 39 var style = from s in p.Descendants(w + "pPr") 40 select s; 41 42 var font = (from f in style.Descendants(w + "rFonts") 43 select f.FirstAttribute).FirstOrDefault(); 44 var size = (from s in style.Descendants(w + "sz") 45 select s.FirstAttribute).FirstOrDefault(); 46 47 System.Windows.Documents.Paragraph par = new System.Windows.Documents.Paragraph(); 48 System.Windows.Documents.Run r = new System.Windows.Documents.Run(p.Value); 49 if (font != null) 50 { 51 FontFamilyConverter converter = new FontFamilyConverter(); 52 r.FontFamily = (System.Windows.Media.FontFamily)converter.ConvertFrom(font.Value); 53 } 54 if (size != null) 55 { 56 r.FontSize = double.Parse(size.Value); 57 } 58 par.Inlines.Add(r); 59 60 flowDoc.Blocks.Add(par); 61 } 62 }
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
/// <summary> /// 按页加载Word /// </summary> /// <param name="flowDoc"></param> /// <param name="filename">文件路径及名称</param> /// <param name="TopPage">单独获取第几页</param> public static void loadWordMLOnePage(this FlowDocument flowDoc, string filename, int Page) { XElement wordDoc = null; try { Package package = Package.Open(filename); Uri documentUri = new Uri("/word/document.xml", UriKind.Relative); PackagePart documentPart = package.GetPart(documentUri); wordDoc = XElement.Load(new StreamReader(documentPart.GetStream())); } catch (Exception) { flowDoc.Blocks.Add(new System.Windows.Documents.Paragraph(new System.Windows.Documents.Run("File not found or not in correct format (Word 2007)"))); return; } XNamespace w = "http://schemas.openxmlformats.org/wordprocessingml/2006/main"; var paragraphs = from p in wordDoc.Descendants(w + "p") select p; int pagecount = 0; foreach (var p in paragraphs) { var PageTag = from s in p.Descendants(w + "lastRenderedPageBreak") select s; if (PageTag.Count() > 0) { pagecount++; } var style = from s in p.Descendants(w + "pPr") select s; var font = (from f in style.Descendants(w + "rFonts") select f.FirstAttribute).FirstOrDefault(); var size = (from s in style.Descendants(w + "sz") select s.FirstAttribute).FirstOrDefault(); System.Windows.Documents.Paragraph par = new System.Windows.Documents.Paragraph(); System.Windows.Documents.Run r = new System.Windows.Documents.Run(p.Value); if (font != null) { FontFamilyConverter converter = new FontFamilyConverter(); r.FontFamily = (System.Windows.Media.FontFamily)converter.ConvertFrom(font.Value); } if (size != null) { r.FontSize = double.Parse(size.Value); } par.Inlines.Add(r); if (pagecount == Page-1) { flowDoc.Blocks.Add(par); } } }
第一个方法是用来获取N页之前的所有内容,第二个方法用来获取第N页的内容