【问题标题】:deleting text from a Word Interop document从 Word 互操作文档中删除文本
【发布时间】:2016-03-08 01:45:50
【问题描述】:

我在尝试使用 Word Interop 从 Word 文档中删除数据/文本列表时遇到问题。到目前为止,我认为我可以通读文档以找到起始文本,然后找到结束文本,并将每个索引保存到它们自己的变量中。接下来,我将遍历从起始索引到结束索引的数据并删除其间的所有文本。

问题是它工作不正确并且没有提供预期的结果。我一定不明白Range 接口在document.Paragraphs[i+1].Range.Delete(); 中是如何工作的。它删除了一些行但不是全部,并且似乎超出了我想要删除的段落。我错过了什么?必须有更好的方法来做到这一点。 Interop 的文档似乎很少。

string text = " "; 
int StartLocation = 0;
int EndLocation = 0;
//I roughly know the starting location
//starting at I=2248 so I don't
//through entire document                             
for (int i = 2248; i < 2700; i++)
{
  text = document.Paragraphs[i + 1].Range.Text.ToString();
  if (text.Contains("firstWordImSearchingFor"))
  {
     StartLocation = i;
  }
  if (text.Contains("lastWordImSearchingFor"))
  {
     EndLocation = i;                        
  }
}
//delete everything between those paragraph locations 
//(not working correctly/ skips lines)
for(int i = StartLocation; i<EndLocation-1i++)
{
   document.Paragraphs[i+1].Range.Delete(); 
}

【问题讨论】:

  • how to remove text from a word doc C# Microsoft.Interop 上进行谷歌搜索,同时查看此内容以获取一些可能的指针stackoverflow.com/questions/10231132/…
  • 如果您使用的是.docx 文件而不是.doc 文件,我建议您停止使用互操作类并切换到the newer SDK Microsoft released 专门用于处理docx 文件。
  • 是的,我已经进行了许多谷歌搜索并查看了其他问题/答案。其他我没有找到与我的问题相关的答案,或者我遗漏了一些东西。在大多数情况下,使用 Interop 创建文档时我没有遇到太多麻烦。出于某种原因,我被困在这听起来很简单。
  • 有什么理由不使用 OpenXML 来生成/修改docx
  • 目前是有原因的,但希望在不久的将来会改变。所以 .doc 是我现在必须处理的。

标签: c# ms-word office-interop


【解决方案1】:

您尝试的方法的缺点是,开始和结束位置(文档故事开头的字符数)会根据存在的不可见/非打印字符而有所不同。内容控件、域代码和其他事物会影响这一点 - 所有这些都以不同的方式影响事物的查询方式。

更可靠的是将起点存储在一个 Range 中,然后将其扩展到终点。

我还建议使用 Range.Find 来搜索起点和终点。

简单的伪代码示例,因为我没有足够的信息继续为您提供完整的工作代码:

Word.Range rngToDelete = null;
Word.Range rngFind = document.Content;
bool wasFound = false;
object missing = System.Type.Missing;
object oEnd = Word.WdCollapseDirection.wdCollapseEnd;
wasFound = rngFind.Find.Execute("firstWordImSearchingFor", 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);
if (wasFound)
{
  rngToDelete = rngFind.Duplicate //rngFind is now where the term was found!
  //reset the range to Find so it moves forward
  rngFind.Collapse(ref oEnd);
  rngFind.End = Document.Content.End 
      wasFound = rngFind.Find.Execute("lastWordImSearchingFor", 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);
  if (wasFound)
  {
    rngToDelete.End = rngFind.End;
    rngToDelete.Delete();
  }
}

【讨论】:

  • 谢谢!这解决了我的问题。我必须忽略 Range.Find 方法,该方法效果很好。我确实需要将“rngFind.Execute”更改为“rngFind.Find.Execute”,但就是这样。
  • 糟糕,对于“懒惰的手指”感到抱歉 - 我已更正了答案中的代码。很高兴它有帮助:-)
【解决方案2】:

这是完全未经测试的,仅作为建议提供:

var docRange = document.Content;
bool inDelete = false;
foreach(var para in docRange.Paragraphs)
{
    if(para.ToString().Contains("Start flag") || inDelete)
    {
        inDelete = true;
        docRange.Delete(para);
    }
    if (para.ToString().Contains("End flag"))
    {
        // remove following line to retain this paragraph
        docRange.Delete(para);
        break;
    }
}

【讨论】:

    猜你喜欢
    • 2012-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多