com 互操作 - 编写一个 C# 方法来分析 Word 文本的字符串,如何迭代以获取表单
本文关键字:字符串 文本 获取 表单 迭代 Word 何迭代 互操作 一个 com 方法 | 更新日期: 2023-09-27 17:57:11
好吧,首先我会说我在使用COM引用方面几乎没有经验,所以只是玩Microsoft.Office.Interop.Word,所以如果我的代码看起来有点夸张,请记住这一点。 本质上,我想将字符串或对象放入数据库中以解析或直接在 C# 中对对象运行逻辑,并将其部分放入数据库中。
问题的本质是我不确定使用库如何迭代给定段落引用中的当前表单字段。 请检查下面的代码,如果您有任何建议,请告诉我。 我想我只是不知道给我一个迭代来帮助我完成代码的正确属性或方法。
基本上,我创建一个Word应用程序,创建引用打开Word App的Word Doc,我遍历文档中的段落,我将块分解为字符数组。在我的代码中,当 ASCII 字符等效于 21 出现时,我知道这是我想要解析的一种表单框。 但是我无法让迭代成功递增,这很奇怪,无论我在哪里设置 int 的范围和增量集,它都不会改变范围。 因此,我很茫然,很好奇是否有更好的方法来做我正在做的事情。 可能有一种更简单的方法来完成我正在做的事情。 我知道为了解决这个问题,我可能会制作一种方法来仅返回与段落对象分开的 Form 对象。 但这对我来说似乎很奇怪,所以我想我会问。
我正在使用.NET 4.5,并且由于某种原因,由于某种原因,我不得不手动添加Microsoft.Office.Interop.Word ver 15的DLL作为参考,当我们升级到Office 2013时,没有直接在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;
}
当然,x 增量的正确位置是您访问表单字段的行之后的行:
else
{
st += Doc.FormFields.get_Item(x).Result;
x++;
}
我不知道您是否已经尝试过将其放在那里,但是可以肯定的是,只有当您的文档每个段落只有一个表单字段时,您发布的代码才能正常工作。
事实上,如果有多个字段,当你找到第 2 个、第 3 个等时,21 个字符 x 不会递增,所以你最终会始终读取相同的字段。
例如,如果第一段中只有一个字段,而第三段中只有一个字段,则您的代码将找到第一个,然后递增 x 并继续阅读 x = 2 的第二段,而没有找到任何 21 个字符。然后 x 将再次递增,当只有 2 个字段时,您将扫描 x = 3 的第三段的字符,因此当您获得 21 个字符时,您会查找不存在的字段(第三个)。
PS 帮助您使用示例文档会简单得多