c#通过标签读取word段落表格(解析无法操作读取的真正原因)

            我是一名c#零基础的大一学生,因最近手头有一个c#操作word的企业项目开始了c#的征程,项目需要通过word标签来操作word的方法,但是网上大多数只有通过标签来插入的代码,对于通过标签读取word段落和表格的方法资源少,而且大多数描述不详细,且好多人都是小坑,在此把我研究的结果共享给大家。

           1. 首先是第一个常遇问题:

【操作WORD问题】无法将类型为“Word.ApplicationClass”的COM对象强制转换为接口类型“Word._Application”-.NET技术/C#

            此类问题一般不是网上所说的少添加了什么引用的问题,一般是你的office的问题,可能是版本的问题,也可能是office组件不全的问题,对于这种问题不要照着网上修改了,费时费力,果断卸载重装,卸载之后记得使用360或金山安全卫士删除一下无用的注册表,解决版本的问题。

          2.第二个问题

                     解决通过标签读取段落表格结果为空的问题    

       这个问题时本文章的精华所在,之所以大多数人通过标签读取word的表格内容会失败(结果总是为空),是因为在通过插入方法插入段落和表格并把它保存时,会自动删除原先的标签(标签名和位置都会删除),所以无法读取。 所以要解决此类的方法就需要在插入内容时生成一个和原先标签名和标签位置一模一样的标签,具体方法如下:

 //插入表格,bookmark书签
        public Table InsertTable(string bookmark, int rows, int columns, float width)
        {
            object miss = System.Reflection.Missing.Value;
            object oStart = bookmark;
            Range range = wordDoc.Bookmarks.get_Item(ref oStart).Range;//表格插入位置
            Table newTable = wordDoc.Tables.Add(range, rows, columns, ref miss, ref miss);

            //由于附值以后书签自动消除,为了以后便于修改,需要把书签再自动生成一个
            object oRng = range;
            wordDoc.Bookmarks.Add(oStart.ToString(), ref oRng);

            //设置表的格式
            newTable.Borders.Enable = 1;  //允许有边框,默认没有边框(为0时报错,1为实线边框,2、3为虚线边框,以后的数字没试过)
            newTable.Borders.OutsideLineWidth = WdLineWidth.wdLineWidth050pt;//边框宽度
            if (width != 0)
            {
                newTable.PreferredWidth = width;//表格宽度
            }
            newTable.AllowPageBreaks = false;
            return newTable;
        }
        
        //通过标签读取表格中的数据(路径,第几行,第几列的数据,标签名)
        public string readtable(string filePath, int row, int columns, string book)
        {
            killWinWordProcess();
            wordApp = new ApplicationClass();
            wordApp.DisplayAlerts = WdAlertLevel.wdAlertsNone;
            wordApp.Visible = false;
            object missing = System.Reflection.Missing.Value;
            object templateName = filePath;
            wordDoc = wordApp.Documents.Open(ref templateName, ref missing,
                ref missing, ref missing, ref missing, ref missing, ref missing,
                ref missing, ref missing, ref missing, ref missing, ref missing,
                ref missing, ref missing, ref missing, ref missing);
            wordDoc.Activate();
            object bq = "book";
            Bookmark mbook = wordDoc.Bookmarks.get_Item(ref bq);
            Table ta = mbook.Range.Tables[1];
            string value = ta.Cell(row, columns).Range.Text;
            MessageBox.Show(value);
            return value;
        }

        //插入一段文字,text为文字内容
        public void InsertText(string bookmark, string text)
        {
            object missingValue = System.Reflection.Missing.Value;

            if (text != null)
            {
                object oStart = bookmark;
                string TT = text;
                char[] cText = new char[TT.Length];
                cText = TT.ToCharArray();
                string tText = "";

                for (int n = 0; n < TT.Length; n++)
                {
                    //由于回车建“\n”作为标志,所以每当有回车时表示一段文字开始,确定该标签下每段的字体一致(设定字体只能按段落来设置)
                    if (cText[n] != '\n' && n < TT.Length - 1)
                        tText = tText + cText[n];
                    else
                    {



                        Word.Range bookRng = wordDoc.Bookmarks.get_Item(ref oStart).Range;
                        bookRng.Text = tText;
                        //**********************************************************************
                        bookRng.Font.Bold = 1;//设置粗细 
                        bookRng.Font.Size = 22;//字体大小
                        bookRng.InsertParagraphAfter();
                        //由于附值以后书签自动消除,为了以后便于修改,需要把书签再自动生成一个

                        object oRng = bookRng;
                        wordDoc.Bookmarks.Add(oStart.ToString(), ref oRng);
                        object bSaveChange = true;

                        tText = "";


                    }


                }

            }

        }

        //通过一个标签读取word的内容
        public string reading(string filePath, string book)
        {
            killWinWordProcess();
            wordApp = new ApplicationClass();
            wordApp.DisplayAlerts = WdAlertLevel.wdAlertsNone;///////////////////////??????????????????
            wordApp.Visible = false;
            object missing = System.Reflection.Missing.Value;
            object templateName = filePath;
            MessageBox.Show(templateName.ToString());

            wordDoc = wordApp.Documents.Open(ref templateName, ref missing,
                ref missing, ref missing, ref missing, ref missing, ref missing,
                ref missing, ref missing, ref missing, ref missing, ref missing,
                ref missing, ref missing, ref missing, ref missing);

            wordDoc.Activate();
            object bq = "book";
            Bookmark mbook = wordDoc.Bookmarks.get_Item(ref bq);
            string s = mbook.Range.Text;
            MessageBox.Show(s);
            return s;
        }

展开阅读全文

没有更多推荐了,返回首页