2015-08-20 5 views
2

Есть ли способ удалить разделы документа, где я могу указать начальную и конечную метки?Docx - Раздел снятия документа

я нужен способ, что я могу удалить раздел документа путем передачи в обоих моих начальных и конечных уловов (@@ DELETEBEGIN и @@ DELETEEND)

, например, у меня есть это в моем документе:

Здравствуйте, добро пожаловать в этот документ

@@ DELETEBEGIN {Некоторые значения для проверки в коде}

текст, который будет удален, если значение истинно

@@ DELETEEND

Final Line

+0

Я не думаю, что есть простое решение для этого или для всего этого. – Phillip

+0

Возможно, я нашел решение, проверьте мой ответ ниже – Balaal

ответ

2

Если вам нужно удалите текст с @@ DELETEBEGIN по адресу @@ DELETEEND, где @@ DELETEBEGIN не находится в начале Paragraph и @@ DELETEEND не находится в конце Paragraph, этот код должен работать.

DocX document = DocX.Load("C:\\Users\\phil\\Desktop\\text.docx"); 
bool flag = false; 
List<List<string>> list1 = new List<List<string>>(); 
List<string> list2 = new List<string>(); 
foreach (Novacode.Paragraph item in document.Paragraphs) 
{ 
    //use this if you need whole text of a paragraph 
    string paraText = item.Text; 
    var result = paraText.Split(' '); 
    int count = 0; 
    list2 = new List<string>(); 
    //use this if you need word by word 
    foreach (var data in result) 
    { 
     string word = data.ToString(); 
     if (word.Contains("@@DELETEBEGIN")) flag = true; 
     if (word.Contains("@@DELETEEND")) 
     { 
      flag = false; 
      list2.Add(word); 
     } 
     if (flag) list2.Add(word); 
     count++; 
    } 
    list1.Add(list2); 
} 
for (int i = 0; i < list1.Count(); i++) 
{ 
    string temp = ""; 
    for (int y = 0; y < list1[i].Count(); y++) 
    { 
     if (y == 0) 
     { 
      temp = list1[i][y]; 
      continue; 
     } 
     temp += " " + list1[i][y];     
    } 
    if (!temp.Equals("")) document.ReplaceText(temp, ""); 
} 
document.Save(); 

Я должен дать некоторый кредит на эту post для зацикливания через каждое слово.

+0

Довольно поздний ответ, но я должен сказать спасибо вы! У меня возникли проблемы с кодом, который я использовал ранее в некоторых документах клиента. этот метод намного более прочен и работает лучше в моей ситуации. Большое спасибо! – Balaal

+0

Нет проблем, я работал с Novacode довольно много по сравнению с прошлым летом и занимался множеством разных вещей. – Phillip

1

Я думаю, я нашел решение этой проблемы, по крайней мере, это работает для меня, пожалуйста, дайте мне знать, если есть что-то я могу сделать лучше:

DeleteCommand бы в @@ DELETEBEGIN строку и deleteEndCommand будет представление @@ DELETEEND

private void RemoveSection(DocX doc, string deleteCommand, string deleteEndCommand) 
    { 
     try 
     { 
      int deleteStart = 0; 
      int deleteEnd = 0; 

      //Get the array of the paragraphs containing the start and end catches 
      for (int i = 0; i < doc.Paragraphs.Count; i++) 
      { 
       if (doc.Paragraphs[i].Text.Contains(deleteCommand)) 
        deleteStart = i; 
       if (doc.Paragraphs[i].Text.Contains(deleteEndCommand)) 
        deleteEnd = i; 
      } 

      if (deleteStart > 0 && deleteEnd > 0) 
      { 
       //delete from the paraIndex as the arrays will shift when a paragraph is deleted 
       int paraIndex = deleteStart; 
       for (int i = deleteStart; i <= deleteEnd; i++) 
       { 
        doc.RemoveParagraphAt(paraIndex); 
       } 
      } 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.ToString()); 
     } 
    } 
+0

Да, это работает, если вы хотите удалить что-то с начала 'Paragraph [i]' до конца 'Paragraph [i]'. Если вы хотите что-то удалить в середине 'Paragraph [i]' в другое место в другом 'Paragraph [i]', это не сработает. Если ваше решение решит вашу проблему, это хорошо. – Phillip

+0

Да, это правда, потому что я думаю, что это невозможно из-за структуры документа, но этот код работает для меня, так как в моем случае строки удаления всегда будут разделяться параграфами – Balaal