好吧,首先我想说我几乎没有使用 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;
}