2016-03-03 190 views
0

我在嘗試使用Word Interop從Word文檔中刪除數據/文本列表時遇到問題。到目前爲止,我認爲我可以通讀文檔來查找起始文本,然後找到結束文本,並將每個索引保存到自己的變量中。接下來,我將循環遍歷從起始索引到結束索引的數據,並刪除它們之間的所有文本。從Word Interop文檔中刪除文本

問題是它工作不正確,不能提供預期的結果。我不能理解接口在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(); 
} 
+0

做'如何從文本中移除谷歌搜索word文檔C#Microsoft.Interop'看看這個一些可能的指針以及http://stackoverflow.com/questions/10231132/how-to-remove-text-from-word-document-footer-using-c-sharp – MethodMan

+1

如果你使用'.docx'文件而不是'.doc'文件,我建議你停止使用interop類並切換到[微軟發佈的新SDK](https://msdn.microsoft.com/en-us /library/office/bb448854.aspx)專門用於處理'docx'文件。 –

+0

是的,我做了很多谷歌搜索,並查看了其他問題/答案。其他我沒有找到與我的問題有關的答案,或者我錯過了一些東西。在大多數情況下,使用Interop創建文檔並沒有太大麻煩。出於某種原因,我聽起來很簡單。 – Bobby

回答

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(); 
    } 
} 
+0

謝謝!這解決了我的問題。我必須忽略Range.Find方法,這非常有效。我確實需要將'rngFind.Execute'改爲'rngFind.Find.Execute',但就是這樣。 – Bobby

+0

糟糕,關於「懶惰的手指」 - 我已經更正了我的答案中的代碼。很高興幫助:-) –

0

這是完全未經測試,並提供了一個建議:

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; 
    } 
}