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