0

好吧,首先我想说我几乎没有使用 COM 引用的经验,所以只是玩弄 Microsoft.Office.Interop.Word 所以如果我的代码看起来有点夸张,请记住这一点。本质上,我想将一个字符串或对象放入数据库中进行解析,或者直接在 C# 中对对象运行逻辑,并将其中的一部分放入数据库中。

问题的本质是我不确定使用库如何迭代给定段落引用中的当前表单字段。请检查下面的代码,如果您有任何建议,请告诉我。我想我只是不知道合适的属性或方法来给我一个迭代来帮助我完成我的代码。

基本上我创建一个 Word 应用程序,创建引用打开 Word 应用程序的 Word Doc,我遍历文档中的段落,我将块分解为字符数组。在我的代码中,当出现相当于 21 的 ASCII 字符时,我知道这是我想要解析的一种表单框。但是,我无法使迭代成功递增,这很奇怪,无论我在哪里设置 int 的范围并且递增设置它永远不会改变范围。因此,我很茫然,很好奇是否有更好的方法来做我正在做的事情。可能有一种更简单的方法来做我正在做的事情。我知道要解决这个问题,我可能会创建一种方法来仅返回与段落对象分开的 Form 对象。但这对我来说似乎很奇怪,所以我想我会问。

我正在使用 .NET 4.5,并且由于某种原因,当我们升级到 Office 2013 时,我不得不手动添加 Microsoft.Office.Interop.Word 版本 15 的 DLL 作为参考,而没有直接在 VS 中更新参考。这是我相当混乱的代码:

public static string ReadTest(string loc)
        {
            Word._Application wordApp = new Word.Application();
            Word._Document Doc = wordApp.Documents.Open(loc, ReadOnly: true);

            try
            {
                sb = "";

                // This will get me JUST THE FORMS info
                //foreach (Word.FormField form in Doc.FormFields)
                //{
                //    sb += form.Result + "\n";
                //}


                int x = 1;

                foreach (Word.Paragraph objParagraph in Doc.Paragraphs)
                {
                    string st = "";

                    try
                    {
                        foreach (char c in objParagraph.Range.Text)
                        {
                            if (((int)c) != 21)
                            {
                                st += c;
                            }
                            else
                            {
                                st += Doc.FormFields.get_Item(x).Result;
                            }
                        }

                        sb += st + "\n";

                    }
                    catch (Exception ex)
                    {
                        throw ex;
                    }

                    x += 1;

                }

            }
            catch (COMException) { }
            finally
            {
                //FileInfo finfo = new FileInfo(loc);
                //finfo.IsReadOnly = false;

                if (Doc != null)
                {
                    Doc.Close();
                    Doc = null;
                }
                if (wordApp != null)
                {
                    wordApp.Quit(Word.WdSaveOptions.wdDoNotSaveChanges);
                    wordApp = null;
                }
            }

            GC.Collect();
            GC.WaitForPendingFinalizers();

            return sb;
        }
4

1 回答 1

1

确保 x 增量的正确位置是紧接在您访问表单字段之后的行:

                        else
                        {
                            st += Doc.FormFields.get_Item(x).Result;
                            x++;
                        }

我不知道您是否已经尝试将其放在那里,但是您发布的代码肯定只有在您的文档的每个段落都只有一个表单字段时才能工作。

事实上,如果有多个字段,当您找到第二个、第三个等时,21 个字符 x 还不会增加,所以您最终会读取始终相同的字段。

例如,如果第一段中只有一个字段,而第三段中只有一个字段,则您的代码将找到第一个字段,然后递增 x 并继续使用 x = 2 读取第二段而不找到任何 21 个字符。然后 x 将再次递增,当只有 2 个字段时,您将使用 x = 3 扫描第三段的字符,因此当您获得 21 个字符时,您会寻找一个不存在的字段(第三个)存在。

PS 帮助您使用示例文档会简单得多

于 2013-02-04T17:51:51.327 回答