热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

openXML获取world文件标题及所需的关键字

最近有个需求,使用c#操作world文件,并获取其中的标题及其他所需引导词后面的内容,如下图,获取文件中的标题,

最近有个需求,使用c#操作world文件,并获取其中的标题及其他所需引导词后面的内容,如下图,获取文件中的标题,引导词后面的内容
在这里插入图片描述
采用的是open xml将world文件转换成xml(open xml只支持docx文件格式,如果不是docx格式的,可以先通过world转换过来),可以获取每个段落中的所有文字喝标签样式,已知标题的字体最大,根据标签样式属性,获取最大的样式的那个段落既是标题,其他内容可以通过indexOf查询关键词进行获取
先看看完成效果
在这里插入图片描述
代码如下(初学C#一周,如果有写的不好的地方,望大佬指正):

所需插件:
在这里插入图片描述
引入

using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Collections;
using System.Xml;
using DocumentFormat.OpenXml.Packaging;

定义

public class objList{public string title;public string biaoji1;public string number;public string biaoji3;}public class textObjectAll{public int index;public string innerXml;public string innerText;public int indexof;}public class textObjectCh{public int index;public string innerXml;public string innerText;public int indexof;}public enum WordKind{Title,biaoji1,number,biaoji3,}

方法:(这是测试文件,所以定义的少,实际文件中会有很多引导词)

public static object GetContentFromWord(string docPath, string[] Kind){const string wordmlNamespace &#61; "http://schemas.openxmlformats.org/wordprocessingml/2006/main";string text &#61; null;string keyword &#61; null;string keyworda &#61; null;string abstracta &#61; null;string biaoji1 &#61; "";string number &#61; "";string biaoji3 &#61; "";int num &#61; 0;int numa &#61; 0;int numb &#61; 0;int numx &#61; 0;ArrayList list &#61; new ArrayList();ArrayList lista &#61; new ArrayList();ArrayList listb &#61; new ArrayList();objList objList &#61; new objList();StringBuilder textBuilder &#61; new StringBuilder();using (WordprocessingDocument wdDoc &#61; WordprocessingDocument.Open(docPath, false)){NameTable nt &#61; new NameTable();XmlNamespaceManager nsManager &#61; new XmlNamespaceManager(nt);nsManager.AddNamespace("w", wordmlNamespace);XmlDocument xdoc &#61; new XmlDocument(nt);xdoc.Load(wdDoc.MainDocumentPart.GetStream());XmlNodeList paragraphNodes &#61; xdoc.SelectNodes("//w:p ", nsManager);List<textObjectCh> listCh &#61; new List<textObjectCh>();List<textObjectAll> listAll &#61; new List<textObjectAll>();for (var i &#61; 0; i < paragraphNodes.Count; i&#43;&#43;){if (!string.IsNullOrEmpty(paragraphNodes[i].InnerText)){XmlNodeList textNodes &#61; paragraphNodes[i].SelectNodes(".//w:pStyle", nsManager);XmlNodeList textNodesa &#61; paragraphNodes[i].SelectNodes(".//w:sz", nsManager);textObjectCh TextObjCh &#61; new textObjectCh();textObjectAll TextObjAll &#61; new textObjectAll();TextObjAll.index &#61; i;TextObjAll.innerText &#61; paragraphNodes[i].InnerText;TextObjAll.innerXml &#61; paragraphNodes[i].InnerXml;TextObjAll.indexof &#61; numb;listAll.Add(TextObjAll);string AllinnerText &#61; null;if (paragraphNodes[i].InnerText&#61;&#61;null){}elseAllinnerText &#61; paragraphNodes[i].InnerText.ToString();for (int v &#61; 0; v < Kind.Length; v&#43;&#43;){switch (Kind[v].ToString()){case "biaoji1":if (AllinnerText.IndexOf("标记1") > -1 && AllinnerText.IndexOf("号码") > -1){biaoji1 &#61; AllinnerText.Substring(AllinnerText.IndexOf("标记1") &#43; 4, AllinnerText.IndexOf("号码")- (AllinnerText.IndexOf("标记1")&#43;4));}break;case "number":if (AllinnerText.IndexOf("号码") > -1)number &#61; AllinnerText.Substring(AllinnerText.IndexOf("号码") &#43; 3);break;case "biaoji3":if (AllinnerText.IndexOf("标记3") >-1){biaoji3 &#61; AllinnerText.Substring(AllinnerText.IndexOf("DOI") &#43; 4);}break;}}if (textNodes.Count > 0)//标题字体样式有两种可能&#xff0c;一种是直接的字体大小(w:sz)&#xff0c;这里获取最大的字体&#xff0c;还有一种是使用的标题&#xff0c;例如 标题1&#xff0c;标题2,这里是截取标题后面的数字&#xff0c;取最小的{try{text &#61; textNodes[0].OuterXml;}catch { }num &#61; text.IndexOf("w:val");numa &#61; text.IndexOf("http://");if (numa - num > 20 && numa - num < 25){keyworda &#61; text.Substring(num);keyword &#61; text.Substring(num &#43; 9, numa - num - 20);numx &#61; 1;}}else{if (textNodesa.Count > 0){try{text &#61; textNodesa[0].OuterXml;}catch { }num &#61; text.IndexOf("w:val");numa &#61; text.IndexOf("xmlns:w");if (numa - num > 9 && numa - num < 20){keyword &#61; text.Substring(num &#43; 7, numa - num - 9);numx &#61; 2;}}}try{if (int.TryParse(keyword, out numb)){TextObjCh.index &#61; i;TextObjCh.innerText &#61; paragraphNodes[i].InnerText;TextObjCh.innerXml &#61; paragraphNodes[i].InnerXml;TextObjCh.indexof &#61; numb;listCh.Add(TextObjCh);}}catch{}}//}//textBuilder.Append(Environment.NewLine);}if (numx &#61;&#61; 1){//如果标题采用的是标题1&#xff0c;标题2 这种&#xff0c;采用升序&#xff0c;取第一个List<textObjectCh> listA &#61; listCh.OrderBy(item &#61;> item.indexof).ToList();objList.title &#61; listA[0].innerText;if (biaoji1.Length > 0){objList.biaoji1 &#61; biaoji1;}if (number.Length>0){objList.number &#61; number;}if (biaoji3.Length>0){objList.biaoji3 &#61; biaoji3;}return objList;}else{List<textObjectCh> listA &#61; listCh.OrderByDescending(item &#61;> item.indexof).ToList();objList.title &#61; listA[0].innerText;if (biaoji1.Length > 0){objList.biaoji1 &#61; biaoji1;}if (number.Length > 0){objList.number &#61; number;}if (biaoji3.Length > 0){objList.biaoji3 &#61; biaoji3;}return objList;}};}

调用方法&#xff1a;

private void button1_Click(object sender, EventArgs e){OpenFileDialog openFileDialog1 &#61; new OpenFileDialog(); //显示选择文件对话框openFileDialog1.InitialDirectory &#61; "c:\\";openFileDialog1.Filter &#61; "txt files (*.docx)|*.docx|All files (*.docx)|*.docx"; //注意&#xff1a;open xml只支持docx文件格式openFileDialog1.FilterIndex &#61; 2;openFileDialog1.RestoreDirectory &#61; true;string[] strText &#61; {WordKind.Title.ToString(),WordKind.biaoji1.ToString(),WordKind.number.ToString(),WordKind.biaoji3.ToString(),};if (openFileDialog1.ShowDialog() &#61;&#61; DialogResult.OK){this.FilePath.Text &#61; openFileDialog1.FileName; //显示文件路径objList objList &#61; (objList)GetContentFromWord(openFileDialog1.FileName, strText);this.Title.Text &#61; objList.title;this.biaoji1.Text &#61; objList.biaoji1;this.number.Text &#61; objList.number;this.biaoji3.Text &#61; objList.biaoji3;}}


推荐阅读
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • 本文详细介绍了GetModuleFileName函数的用法,该函数可以用于获取当前模块所在的路径,方便进行文件操作和读取配置信息。文章通过示例代码和详细的解释,帮助读者理解和使用该函数。同时,还提供了相关的API函数声明和说明。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了使用kotlin实现动画效果的方法,包括上下移动、放大缩小、旋转等功能。通过代码示例演示了如何使用ObjectAnimator和AnimatorSet来实现动画效果,并提供了实现抖动效果的代码。同时还介绍了如何使用translationY和translationX来实现上下和左右移动的效果。最后还提供了一个anim_small.xml文件的代码示例,可以用来实现放大缩小的效果。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文介绍了C++中省略号类型和参数个数不确定函数参数的使用方法,并提供了一个范例。通过宏定义的方式,可以方便地处理不定参数的情况。文章中给出了具体的代码实现,并对代码进行了解释和说明。这对于需要处理不定参数的情况的程序员来说,是一个很有用的参考资料。 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
author-avatar
forsoz_627
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有